diff --git a/.editorconfig b/.editorconfig
index e4ab4a9fd38..4ca23b300fd 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -11,5 +11,8 @@ trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
+[*.yml]
+indent_size = 2
+
[Makefile]
indent_style = tab
diff --git a/.github/workflows/arma.yml b/.github/workflows/arma.yml
index d0649a0adec..1af2e7e0602 100644
--- a/.github/workflows/arma.yml
+++ b/.github/workflows/arma.yml
@@ -27,15 +27,6 @@ jobs:
- 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@v4
- - name: Lint (sqflint)
- uses: arma-actions/sqflint@master
- continue-on-error: true # No failure due to many false-positives
-
build:
runs-on: ubuntu-latest
steps:
@@ -52,3 +43,4 @@ jobs:
with:
name: ace3-${{ github.sha }}-nobin
path: .hemttout/@*
+ include-hidden-files: true # Because .hemttout is a hidden directory
diff --git a/.github/workflows/extensions.yml b/.github/workflows/extensions.yml
index 9693d2df22b..ce475e5a006 100644
--- a/.github/workflows/extensions.yml
+++ b/.github/workflows/extensions.yml
@@ -1,29 +1,65 @@
name: Extensions
on:
- pull_request:
+ push:
paths:
- - 'extensions/**'
+ - 'extension/**'
+ - 'Cargo.toml'
+ - 'Cargo.lock'
+ - '.github/workflows/extensions.yml'
jobs:
+ lint:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout the source code
+ uses: actions/checkout@master
+ - name: Install dependencies
+ run: |
+ rustup toolchain update stable --no-self-update
+ rustup default stable
+ rustup component add clippy rustfmt
+ - name: Run rustfmt
+ run: cargo fmt -- --check
+ - name: Run clippy
+ run: cargo clippy --all -- -Dwarnings
+
+ test:
+ runs-on: ubuntu-latest
+ container:
+ image: xd009642/tarpaulin
+ options: --security-opt seccomp=unconfined
+ steps:
+ - name: Checkout the source code
+ uses: actions/checkout@master
+ - name: Test & Coverage
+ run: cargo tarpaulin --verbose --no-default-features --workspace --timeout 240
+
build:
- runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [windows-latest]
-
+ arrays: [
+ os: { tag: "windows-latest", target: "i686-pc-windows-msvc" },
+ os: { tag: "windows-latest", target: "x86_64-pc-windows-msvc" },
+ ]
+ runs-on: ${{ matrix.arrays.os.tag }}
steps:
- name: Checkout the source code
uses: actions/checkout@v4
+ - name: Install stable Rust
+ uses: actions-rs/toolchain@v1
+ with:
+ target: ${{ matrix.arrays.os.target }}
+ toolchain: stable
+ default: true
+ - name: Rust Cache
+ uses: Swatinem/rust-cache@v2
- name: Build
- shell: cmd
- run: |
- cd extensions
- mkdir build
- cd build
- cmake .. && cmake --build .
- - name: Upload Artifact
+ run: cargo build --verbose
+ - name: Upload
uses: actions/upload-artifact@v4
with:
- name: ace3_extensions-${{ matrix.os }}-debug
- path: extensions/build
+ name: ${{ matrix.arrays.os.target }}
+ path: target/debug/ace.dll
+ if-no-files-found: error
+ retention-days: 30
diff --git a/.github/workflows/hemtt.yml b/.github/workflows/hemtt.yml
index e606852285d..79286fc45c3 100644
--- a/.github/workflows/hemtt.yml
+++ b/.github/workflows/hemtt.yml
@@ -33,6 +33,8 @@ jobs:
xcopy /e /h /q pullrequest\addons addons\
xcopy /e /h /q pullrequest\optionals optionals\
xcopy /e /h /q pullrequest\include include\
+ xcopy /y /h /q pullrequest\ace.dll ace.dll
+ xcopy /y /h /q pullrequest\ace_x64.dll ace_x64.dll
- name: Run HEMTT build
run: hemtt build
- name: Rename build folder
@@ -42,3 +44,4 @@ jobs:
with:
name: ace3-${{ github.sha }}
path: .hemttout/@*
+ include-hidden-files: true # Because .hemttout is a hidden directory
diff --git a/.gitignore b/.gitignore
index 4ad0a5e1eb9..15cc59d0d5a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,8 +2,6 @@
*.zip
release/*
releases/*
-extensions/vcproj32/*
-extensions/vcproj64/*
.vscode/*
hemtt
hemtt.exe
@@ -20,4 +18,5 @@ CHANGELOG.md
sqfvm.exe
ArmaScriptCompiler.exe
*.sqfc
+target/
!extras/**/*.zip
diff --git a/.hemtt/launch.toml b/.hemtt/launch.toml
new file mode 100644
index 00000000000..d0726cbdded
--- /dev/null
+++ b/.hemtt/launch.toml
@@ -0,0 +1,31 @@
+[default]
+workshop = [
+ "450814997", # CBA_A3
+]
+
+[spe]
+extends = "default"
+dlc = [
+ "Spearhead 1944"
+]
+
+[vn]
+extends = "default"
+dlc = [
+ "S.O.G. Prairie Fire",
+]
+
+[ws]
+extends = "default"
+dlc = [
+ "Western Sahara",
+]
+
+[rhs]
+extends = "default"
+workshop = [
+ "843425103", # RHS AFRF Workshop ID
+ "843577117", # RHS USAF Workshop ID
+ "843593391", # RHS GREF Workshop ID
+ "843632231", # RHS SAF Workshop ID
+]
diff --git a/.hemtt/lints.toml b/.hemtt/lints.toml
new file mode 100644
index 00000000000..eac28147c00
--- /dev/null
+++ b/.hemtt/lints.toml
@@ -0,0 +1,5 @@
+[sqf.banned_commands]
+options.ignore = [
+ "addPublicVariableEventHandler", # Alt syntax is broken, we are using main syntax
+ "createSoundSource", # Greatly attenuated when in first person and in a vehicle
+]
diff --git a/.hemtt/project.toml b/.hemtt/project.toml
index f5ed361e3e1..6ab1c3a1afc 100644
--- a/.hemtt/project.toml
+++ b/.hemtt/project.toml
@@ -27,41 +27,3 @@ exclude = [
"common/functions/fnc_dummy.sqf",
"zeus/functions/fnc_zeusAttributes.sqf",
]
-
-[hemtt.launch.default]
-workshop = [
- "450814997", # CBA_A3
-]
-
-[hemtt.launch.spe]
-workshop = [
- "450814997", # CBA_A3
-]
-dlc = [
- "spe"
-]
-
-[hemtt.launch.vn]
-workshop = [
- "450814997", # CBA_A3's Workshop ID
-]
-dlc = [
- "S.O.G. Prairie Fire",
-]
-
-[hemtt.launch.ws]
-workshop = [
- "450814997", # CBA_A3's Workshop ID
-]
-dlc = [
- "Western Sahara",
-]
-
-[hemtt.launch.rhs]
-workshop = [
- "450814997", # CBA_A3's Workshop ID
- "843425103", # RHS AFRF Workshop ID
- "843577117", # RHS USAF Workshop ID
- "843593391", # RHS GREF Workshop ID
- "843632231", # RHS SAF Workshop ID
-]
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 00000000000..9ce88373eeb
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,1410 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "ace"
+version = "0.1.0"
+dependencies = [
+ "arboard",
+ "arma-rs",
+ "git2",
+ "rand",
+ "rand_chacha",
+ "rayon",
+ "uuid",
+]
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "aho-corasick"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "arboard"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9fb4009533e8ff8f1450a5bcbc30f4242a1d34442221f72314bea1f5dc9c7f89"
+dependencies = [
+ "clipboard-win",
+ "core-graphics",
+ "image",
+ "log",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
+ "parking_lot",
+ "windows-sys 0.48.0",
+ "x11rb",
+]
+
+[[package]]
+name = "arma-rs"
+version = "1.11.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e722ed20b6266ceccf4334d32a528fcef9a2dca341b8bbcceb99eb7152081239"
+dependencies = [
+ "arma-rs-proc",
+ "crossbeam-channel",
+ "libc",
+ "link_args",
+ "log",
+ "seq-macro",
+ "state",
+ "uuid",
+ "winapi",
+ "windows 0.58.0",
+]
+
+[[package]]
+name = "arma-rs-proc"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "936ed035ff4e775bd50ff94ccdb44f236d1ca012c376347b048fb6b9861833b7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitflags"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
+
+[[package]]
+name = "block2"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f"
+dependencies = [
+ "objc2",
+]
+
+[[package]]
+name = "bytemuck"
+version = "1.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fd4c6dcc3b0aea2f5c0b4b82c2b15fe39ddbc76041a310848f4706edf76bb31"
+
+[[package]]
+name = "byteorder"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+
+[[package]]
+name = "byteorder-lite"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
+
+[[package]]
+name = "cc"
+version = "1.1.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72db2f7947ecee9b03b510377e8bb9077afa27176fdbff55c51027e976fdcc48"
+dependencies = [
+ "jobserver",
+ "libc",
+ "shlex",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "clipboard-win"
+version = "5.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892"
+dependencies = [
+ "error-code",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
+[[package]]
+name = "core-graphics"
+version = "0.23.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081"
+dependencies = [
+ "bitflags 1.3.2",
+ "core-foundation",
+ "core-graphics-types",
+ "foreign-types",
+ "libc",
+]
+
+[[package]]
+name = "core-graphics-types"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf"
+dependencies = [
+ "bitflags 1.3.2",
+ "core-foundation",
+ "libc",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
+dependencies = [
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
+
+[[package]]
+name = "either"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
+
+[[package]]
+name = "errno"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
+dependencies = [
+ "libc",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "error-code"
+version = "3.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b"
+
+[[package]]
+name = "fdeflate"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645"
+dependencies = [
+ "simd-adler32",
+]
+
+[[package]]
+name = "flate2"
+version = "1.0.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "foreign-types"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
+dependencies = [
+ "foreign-types-macros",
+ "foreign-types-shared",
+]
+
+[[package]]
+name = "foreign-types-macros"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "generator"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e"
+dependencies = [
+ "cc",
+ "libc",
+ "log",
+ "rustversion",
+ "windows 0.48.0",
+]
+
+[[package]]
+name = "gethostname"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818"
+dependencies = [
+ "libc",
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "git2"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724"
+dependencies = [
+ "bitflags 2.6.0",
+ "libc",
+ "libgit2-sys",
+ "log",
+ "openssl-probe",
+ "openssl-sys",
+ "url",
+]
+
+[[package]]
+name = "idna"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "image"
+version = "0.25.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10"
+dependencies = [
+ "bytemuck",
+ "byteorder-lite",
+ "num-traits",
+ "png",
+ "tiff",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
+
+[[package]]
+name = "jobserver"
+version = "0.1.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "jpeg-decoder"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0"
+
+[[package]]
+name = "lazy_static"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+
+[[package]]
+name = "libc"
+version = "0.2.158"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
+
+[[package]]
+name = "libgit2-sys"
+version = "0.17.0+1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224"
+dependencies = [
+ "cc",
+ "libc",
+ "libssh2-sys",
+ "libz-sys",
+ "openssl-sys",
+ "pkg-config",
+]
+
+[[package]]
+name = "libssh2-sys"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee"
+dependencies = [
+ "cc",
+ "libc",
+ "libz-sys",
+ "openssl-sys",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "libz-sys"
+version = "1.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fdc53a7799a7496ebc9fd29f31f7df80e83c9bda5299768af5f9e59eeea74647"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "link_args"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c7721e472624c9aaad27a5eb6b7c9c6045c7a396f2efb6dabaec1b640d5e89b"
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.4.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
+
+[[package]]
+name = "lock_api"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
+
+[[package]]
+name = "loom"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5"
+dependencies = [
+ "cfg-if",
+ "generator",
+ "scoped-tls",
+ "serde",
+ "serde_json",
+ "tracing",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "matchers"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
+dependencies = [
+ "regex-automata 0.1.10",
+]
+
+[[package]]
+name = "memchr"
+version = "2.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08"
+dependencies = [
+ "adler",
+ "simd-adler32",
+]
+
+[[package]]
+name = "nu-ansi-term"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+dependencies = [
+ "overload",
+ "winapi",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "objc-sys"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"
+
+[[package]]
+name = "objc2"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804"
+dependencies = [
+ "objc-sys",
+ "objc2-encode",
+]
+
+[[package]]
+name = "objc2-app-kit"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff"
+dependencies = [
+ "bitflags 2.6.0",
+ "block2",
+ "libc",
+ "objc2",
+ "objc2-core-data",
+ "objc2-core-image",
+ "objc2-foundation",
+ "objc2-quartz-core",
+]
+
+[[package]]
+name = "objc2-core-data"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef"
+dependencies = [
+ "bitflags 2.6.0",
+ "block2",
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-core-image"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80"
+dependencies = [
+ "block2",
+ "objc2",
+ "objc2-foundation",
+ "objc2-metal",
+]
+
+[[package]]
+name = "objc2-encode"
+version = "4.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8"
+
+[[package]]
+name = "objc2-foundation"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8"
+dependencies = [
+ "bitflags 2.6.0",
+ "block2",
+ "libc",
+ "objc2",
+]
+
+[[package]]
+name = "objc2-metal"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6"
+dependencies = [
+ "bitflags 2.6.0",
+ "block2",
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-quartz-core"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a"
+dependencies = [
+ "bitflags 2.6.0",
+ "block2",
+ "objc2",
+ "objc2-foundation",
+ "objc2-metal",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.103"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "overload"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
+
+[[package]]
+name = "png"
+version = "0.17.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1"
+dependencies = [
+ "bitflags 1.3.2",
+ "crc32fast",
+ "fdeflate",
+ "flate2",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
+dependencies = [
+ "zerocopy",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "rayon"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
+dependencies = [
+ "crossbeam-deque",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4"
+dependencies = [
+ "bitflags 2.6.0",
+]
+
+[[package]]
+name = "regex"
+version = "1.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata 0.4.7",
+ "regex-syntax 0.8.4",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+dependencies = [
+ "regex-syntax 0.6.29",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax 0.8.4",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
+
+[[package]]
+name = "rustix"
+version = "0.38.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
+dependencies = [
+ "bitflags 2.6.0",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6"
+
+[[package]]
+name = "ryu"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
+
+[[package]]
+name = "scoped-tls"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "seq-macro"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4"
+
+[[package]]
+name = "serde"
+version = "1.0.208"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.208"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.125"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83c8e735a073ccf5be70aa8066aa984eaf2fa000db6c8d0100ae605b366d31ed"
+dependencies = [
+ "itoa",
+ "memchr",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sharded-slab"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "shlex"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+
+[[package]]
+name = "simd-adler32"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
+
+[[package]]
+name = "smallvec"
+version = "1.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
+
+[[package]]
+name = "state"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8"
+dependencies = [
+ "loom",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6af063034fc1935ede7be0122941bafa9bacb949334d090b77ca98b5817c7d9"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+]
+
+[[package]]
+name = "tiff"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e"
+dependencies = [
+ "flate2",
+ "jpeg-decoder",
+ "weezl",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
+[[package]]
+name = "tracing"
+version = "0.1.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
+dependencies = [
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+dependencies = [
+ "once_cell",
+ "valuable",
+]
+
+[[package]]
+name = "tracing-log"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
+dependencies = [
+ "log",
+ "once_cell",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
+dependencies = [
+ "matchers",
+ "nu-ansi-term",
+ "once_cell",
+ "regex",
+ "sharded-slab",
+ "smallvec",
+ "thread_local",
+ "tracing",
+ "tracing-core",
+ "tracing-log",
+]
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "url"
+version = "2.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+]
+
+[[package]]
+name = "uuid"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "valuable"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "weezl"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
+dependencies = [
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows"
+version = "0.58.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6"
+dependencies = [
+ "windows-core",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.58.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99"
+dependencies = [
+ "windows-implement",
+ "windows-interface",
+ "windows-result",
+ "windows-strings",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-implement"
+version = "0.58.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "windows-interface"
+version = "0.58.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "windows-result"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-strings"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"
+dependencies = [
+ "windows-result",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.6",
+ "windows_aarch64_msvc 0.52.6",
+ "windows_i686_gnu 0.52.6",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc 0.52.6",
+ "windows_x86_64_gnu 0.52.6",
+ "windows_x86_64_gnullvm 0.52.6",
+ "windows_x86_64_msvc 0.52.6",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
+[[package]]
+name = "x11rb"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12"
+dependencies = [
+ "gethostname",
+ "rustix",
+ "x11rb-protocol",
+]
+
+[[package]]
+name = "x11rb-protocol"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d"
+
+[[package]]
+name = "zerocopy"
+version = "0.7.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
+dependencies = [
+ "byteorder",
+ "zerocopy-derive",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.7.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 00000000000..a13ce613fd6
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,11 @@
+[workspace]
+resolver = "2"
+members = [
+ "extension"
+]
+
+[profile.release]
+opt-level = "z"
+lto = true
+codegen-units = 1
+strip = true
diff --git a/README.md b/README.md
index feb9194d65a..e5df6556e02 100644
--- a/README.md
+++ b/README.md
@@ -55,7 +55,7 @@ The mod is **built modularly**, so almost any included PBO can be easily removed
- Carrying and dragging
- Realistic names for vehicles and weapons
- A fire control system (FCS) for armored vehicles and helicopters
-- Realistic ballistics/FCS calculated in C/C++ extensions
+- Realistic ballistics/FCS calculated in Rust extensions
- Backblast area and overpressure simulation
- Disposable launchers
- Realistic G-forces
diff --git a/ace.dll b/ace.dll
new file mode 100644
index 00000000000..088ffda15ba
Binary files /dev/null and b/ace.dll differ
diff --git a/ace_advanced_ballistics.dll b/ace_advanced_ballistics.dll
deleted file mode 100644
index f5686a5a3f8..00000000000
Binary files a/ace_advanced_ballistics.dll and /dev/null differ
diff --git a/ace_advanced_ballistics_x64.dll b/ace_advanced_ballistics_x64.dll
deleted file mode 100644
index f1802ce5e88..00000000000
Binary files a/ace_advanced_ballistics_x64.dll and /dev/null differ
diff --git a/ace_artillerytables.dll b/ace_artillerytables.dll
deleted file mode 100644
index 2f5855c81a3..00000000000
Binary files a/ace_artillerytables.dll and /dev/null differ
diff --git a/ace_artillerytables_x64.dll b/ace_artillerytables_x64.dll
deleted file mode 100644
index 97a061c2570..00000000000
Binary files a/ace_artillerytables_x64.dll and /dev/null differ
diff --git a/ace_break_line.dll b/ace_break_line.dll
deleted file mode 100644
index 8fc92175fe2..00000000000
Binary files a/ace_break_line.dll and /dev/null differ
diff --git a/ace_break_line_x64.dll b/ace_break_line_x64.dll
deleted file mode 100644
index d021bf25d23..00000000000
Binary files a/ace_break_line_x64.dll and /dev/null differ
diff --git a/ace_clipboard.dll b/ace_clipboard.dll
deleted file mode 100644
index 8cf6744964f..00000000000
Binary files a/ace_clipboard.dll and /dev/null differ
diff --git a/ace_clipboard_x64.dll b/ace_clipboard_x64.dll
deleted file mode 100644
index db7730f0fed..00000000000
Binary files a/ace_clipboard_x64.dll and /dev/null differ
diff --git a/ace_fcs.dll b/ace_fcs.dll
deleted file mode 100644
index 9c2a871b3d9..00000000000
Binary files a/ace_fcs.dll and /dev/null differ
diff --git a/ace_fcs_x64.dll b/ace_fcs_x64.dll
deleted file mode 100644
index 4ee8dc1d896..00000000000
Binary files a/ace_fcs_x64.dll and /dev/null differ
diff --git a/ace_x64.dll b/ace_x64.dll
new file mode 100644
index 00000000000..98d675bde45
Binary files /dev/null and b/ace_x64.dll differ
diff --git a/addons/advanced_ballistics/XEH_postInit.sqf b/addons/advanced_ballistics/XEH_postInit.sqf
index 9d0dd0ee4b9..25545d02aa0 100644
--- a/addons/advanced_ballistics/XEH_postInit.sqf
+++ b/addons/advanced_ballistics/XEH_postInit.sqf
@@ -1,10 +1,10 @@
#include "script_component.hpp"
-GVAR(currentbulletID) = -1;
+#include "initKeybinds.inc.sqf"
GVAR(Protractor) = false;
GVAR(ProtractorStart) = CBA_missionTime;
-GVAR(allBullets) = [];
+GVAR(allBullets) = createHashMap;
GVAR(currentGrid) = 0;
if (!hasInterface) exitWith {};
@@ -24,22 +24,6 @@ if (!hasInterface) exitWith {};
// Register Perframe Handler
[LINKFUNC(handleFirePFH), GVAR(simulationInterval)] call CBA_fnc_addPerFrameHandler;
-
- //Add warnings for missing compat PBOs (only if AB is on)
- {
- _x params ["_modPBO", "_compatPBO"];
- 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 [
- ["RH_acc","ace_compat_rh_acc"],
- ["RH_de_cfg","ace_compat_rh_de"],
- ["RH_m4_cfg","ace_compat_rh_m4"],
- ["RH_PDW","ace_compat_rh_pdw"],
- ["RKSL_PMII","ace_compat_rksl_pm_ii"],
- ["iansky_opt","ace_compat_sma3_iansky"],
- ["R3F_Armes","ace_compat_r3f"]
- ];
}] call CBA_fnc_addEventHandler;
#ifdef DEBUG_MODE_FULL
diff --git a/addons/advanced_ballistics/config.cpp b/addons/advanced_ballistics/config.cpp
index 17647d0647d..e3fe6957d78 100644
--- a/addons/advanced_ballistics/config.cpp
+++ b/addons/advanced_ballistics/config.cpp
@@ -18,10 +18,3 @@ class CfgPatches {
#include "CfgVehicles.hpp"
#include "RscTitles.hpp"
#include "ACE_Settings.hpp"
-
-class ACE_Extensions {
- class ace_advanced_ballistics {
- windows = 1;
- client = 1;
- };
-};
diff --git a/addons/advanced_ballistics/functions/fnc_diagnoseWeapons.sqf b/addons/advanced_ballistics/functions/fnc_diagnoseWeapons.sqf
index a2156349f6d..b3f4053bdd9 100644
--- a/addons/advanced_ballistics/functions/fnc_diagnoseWeapons.sqf
+++ b/addons/advanced_ballistics/functions/fnc_diagnoseWeapons.sqf
@@ -80,7 +80,7 @@ for "_i" from 0 to (count _cfgWeapons)-1 do {
diag_log text format ["AB_Diagnose_barrelTwist,%1,%2,%3,%4,%5",_weapon,_magazine,_ammo,_twistDirection,_barrelTwist];
};
if (_barrelLength == 0) then {
- diag_log text format ["AB_Diagnose_barrelLength,%1,%2,%3,%4,%5",_weapon,_magazine,_ammo,_barrelLength];
+ diag_log text format ["AB_Diagnose_barrelLength,%1,%2,%3,%4",_weapon,_magazine,_ammo,_barrelLength];
};
};
} forEach _magazines;
@@ -108,16 +108,16 @@ for "_i" from 0 to (count _cfgWeapons)-1 do {
};
if (_weapons find _weapon == -1) then {
_weapons pushBack _weapon;
- _magIndex = _magazines find _magazine;
- _magSpeed = _magazineInitSpeeds select _magIndex;
+ private _magIndex = _magazines find _magazine;
+ private _magSpeed = _magazineInitSpeeds select _magIndex;
_weaponInitSpeeds pushBack (_abInitialSpeed / _magSpeed);
};
} forEach _data;
{
_x params ["_magazineIndex", "_abInitialSpeed", "_magazine", "_weapon"];
- _magIndex = _magazines find _magazine;
- _magSpeed = _magazineInitSpeeds select _magIndex;
- _wepIndex = _weapons find _weapon;
+ private _magIndex = _magazines find _magazine;
+ private _magSpeed = _magazineInitSpeeds select _magIndex;
+ private _wepIndex = _weapons find _weapon;
_wepSpeed = _weaponInitSpeeds select _wepIndex;
} forEach _data;
{
diff --git a/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf b/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf
index ceaef17badf..a426f6ba99a 100644
--- a/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf
+++ b/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf
@@ -50,7 +50,7 @@ GVAR(Protractor) = true;
__ctrl1 ctrlSetTextColor [1, 1, 1, 1];
__ctrl2 ctrlSetScale 1;
- __ctrl2 ctrlSetPosition [SafeZoneX + 0.001, SafeZoneY - 0.001 - 0.1074 * (-0.86 max ((ACE_player weaponDirection currentWeapon ACE_player) select 2) min 0.86), 0.2, 0.2 * 4/3];
+ __ctrl2 ctrlSetPosition [safeZoneX + 0.001, safeZoneY - 0.001 - 0.1074 * (-0.86 max ((ACE_player weaponDirection currentWeapon ACE_player) select 2) min 0.86), 0.2, 0.2 * 4/3];
__ctrl2 ctrlCommit 0;
__ctrl2 ctrlSetText QPATHTOF(UI\protractor_marker.paa);
__ctrl2 ctrlSetTextColor [1, 1, 1, 1];
diff --git a/addons/advanced_ballistics/functions/fnc_handleFirePFH.sqf b/addons/advanced_ballistics/functions/fnc_handleFirePFH.sqf
index e9180cb1c44..9c359bf833e 100644
--- a/addons/advanced_ballistics/functions/fnc_handleFirePFH.sqf
+++ b/addons/advanced_ballistics/functions/fnc_handleFirePFH.sqf
@@ -1,6 +1,6 @@
#include "..\script_component.hpp"
/*
- * Author: Glowbal, Ruthberg, joko // Jonas
+ * Author: Glowbal, Ruthberg, joko // Jonas, Brett Mayson
* Handle the PFH for Bullets
*
* Arguments:
@@ -17,7 +17,7 @@
private _deleted = false;
{
- _x params ["_bullet","_caliber","_bulletTraceVisible","_index"];
+ _y params ["_bullet","_caliber","_bulletTraceVisible"];
if (alive _bullet) then {
private _bulletVelocity = velocity _bullet;
@@ -27,13 +27,21 @@ private _deleted = false;
drop ["\A3\data_f\ParticleEffects\Universal\Refract","","Billboard",1,0.1,getPos _bullet,[0,0,0],0,1.275,1,0,[0.02*_caliber,0.01*_caliber],[[0,0,0,0.65],[0,0,0,0.2]],[1,0],0,0,"","",""];
};
- _bullet setVelocity (_bulletVelocity vectorAdd (parseSimpleArray ("ace_advanced_ballistics" callExtension format["simulate:%1:%2:%3:%4:%5:%6", _index, _bulletVelocity, _bulletPosition, wind, ASLToATL(_bulletPosition) select 2, CBA_missionTime toFixed 6])));
+ (
+ "ace" callExtension ["ballistics:bullet:simulate", [
+ _x,
+ _bulletVelocity,
+ _bulletPosition,
+ wind,
+ ASLToATL(_bulletPosition) select 2,
+ CBA_missionTime toFixed 6
+ ]]
+ ) params ["_data", "_code"];
+ if (_code == 0) then {
+ _bullet setVelocity (_bulletVelocity vectorAdd (parseSimpleArray (_data)));
+ };
} else {
- GVAR(allBullets) set [_forEachIndex, objNull];
- _deleted = true;
+ GVAR(allBullets) deleteAt _x;
+ "ace" callExtension ["ballistics:bullet:delete", [_x]];
};
-} forEach GVAR(allBullets);
-
-if (_deleted) then {
- GVAR(allBullets) = GVAR(allBullets) - [objNull];
-};
+} forEach GVAR(allBullets)
diff --git a/addons/advanced_ballistics/functions/fnc_handleFired.sqf b/addons/advanced_ballistics/functions/fnc_handleFired.sqf
index ff2fe85ae4f..7d00168160f 100644
--- a/addons/advanced_ballistics/functions/fnc_handleFired.sqf
+++ b/addons/advanced_ballistics/functions/fnc_handleFired.sqf
@@ -1,6 +1,6 @@
#include "..\script_component.hpp"
/*
- * Author: Glowbal, Ruthberg
+ * Author: Glowbal, Ruthberg, Brett Mayson
*
* Handles advanced ballistics for (BulletBase) projectiles. Called from the unified fired EH only for players.
*
@@ -62,11 +62,11 @@ if (_abort) exitWith {};
// Get Weapon and Ammo Configurations
private _AmmoCacheEntry = uiNamespace getVariable format[QGVAR(%1), _ammo];
if (isNil "_AmmoCacheEntry") then {
- _AmmoCacheEntry = _ammo call FUNC(readAmmoDataFromConfig);
+ _AmmoCacheEntry = _ammo call FUNC(readAmmoDataFromConfig);
};
private _WeaponCacheEntry = uiNamespace getVariable format[QGVAR(%1), _weapon];
if (isNil "_WeaponCacheEntry") then {
- _WeaponCacheEntry = _weapon call FUNC(readWeaponDataFromConfig);
+ _WeaponCacheEntry = _weapon call FUNC(readWeaponDataFromConfig);
};
_AmmoCacheEntry params ["_airFriction", "_caliber", "_bulletLength", "_bulletMass", "_transonicStabilityCoef", "_dragModel", "_ballisticCoefficients", "_velocityBoundaries", "_atmosphereModel", "_ammoTempMuzzleVelocityShifts", "_muzzleVelocityTable", "_barrelLengthTable", "_muzzleVelocityVariationSD"];
@@ -120,8 +120,26 @@ if (_caliber * _bulletLength * _bulletMass * _barrelTwist > 0) then {
_stabilityFactor = [_caliber, _bulletLength, _bulletMass, _barrelTwist, _muzzleVelocity, _temperature, _barometricPressure] call FUNC(calculateStabilityFactor);
};
-GVAR(currentbulletID) = (GVAR(currentbulletID) + 1) % 10000;
-
-"ace_advanced_ballistics" callExtension format["new:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:%17:%18", GVAR(currentbulletID), _ammoCount, _airFriction, _ballisticCoefficients, _velocityBoundaries, _atmosphereModel, _dragModel, _stabilityFactor, _twistDirection, _transonicStabilityCoef, getPosASL _projectile, _bulletVelocity, EGVAR(common,mapLatitude), EGVAR(weather,currentTemperature), EGVAR(common,mapAltitude), EGVAR(weather,currentHumidity), EGVAR(weather,currentOvercast), CBA_missionTime toFixed 6];
-
-GVAR(allBullets) pushBack [_projectile, _caliber, _bulletTraceVisible, GVAR(currentbulletID)];
+("ace" callExtension [
+ "ballistics:bullet:new", [
+ _ammoCount,
+ _airFriction,
+ _ballisticCoefficients,
+ _velocityBoundaries,
+ _atmosphereModel,
+ _dragModel,
+ _stabilityFactor,
+ _twistDirection,
+ _transonicStabilityCoef,
+ _bulletVelocity,
+ EGVAR(common,mapLatitude),
+ EGVAR(weather,currentTemperature),
+ EGVAR(common,mapAltitude),
+ EGVAR(weather,currentHumidity),
+ EGVAR(weather,currentOvercast),
+ CBA_missionTime toFixed 6
+ ]
+]) params ["_id", "_code"];
+if (_code == 0) then {
+ GVAR(allBullets) set [_id, [_projectile, _caliber, _bulletTraceVisible]];
+};
diff --git a/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf b/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf
index 89e89b9f7ea..8c908639c30 100644
--- a/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf
+++ b/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf
@@ -21,7 +21,14 @@ if (!GVAR(enabled)) exitWith {};
private _initStartTime = diag_tickTime;
private _mapSize = worldSize;
-if (("ace_advanced_ballistics" callExtension format["init:%1:%2", worldName, _mapSize]) == "Terrain already initialized") exitWith {
+(
+ "ace" callExtension ["ballistics:map:init", [worldName, _mapSize]]
+) params ["_data", "_code"];
+if (_code != 0) exitWith {
+ ERROR("Error initializing map")
+};
+
+if (_data == "true") exitWith {
INFO_1("Terrain already initialized [world: %1]",worldName);
#ifdef DEBUG_MODE_FULL
systemChat "AdvancedBallistics: Terrain already initialized";
@@ -53,8 +60,7 @@ INFO_2("Starting Terrain Extension [cells: %1] [world: %2]",_gridCells,worldName
private _gridCenter = [_x + 25, _y + 25];
private _gridHeight = round(getTerrainHeightASL _gridCenter);
private _gridNumObjects = count (_gridCenter nearObjects ["Building", 50]);
- private _gridSurfaceIsWater = parseNumber (surfaceIsWater _gridCenter);
- "ace_advanced_ballistics" callExtension format["set:%1:%2:%3", _gridHeight, _gridNumObjects, _gridSurfaceIsWater];
+ "ace" callExtension ["ballistics:map:set", [GVAR(currentGrid), _gridHeight, _gridNumObjects, surfaceIsWater _gridCenter]];
GVAR(currentGrid) = GVAR(currentGrid) + 1;
if (GVAR(currentGrid) >= _gridCells) exitWith {};
};
diff --git a/addons/advanced_ballistics/initSettings.inc.sqf b/addons/advanced_ballistics/initSettings.inc.sqf
index 957044f343a..28a1d6d8262 100644
--- a/addons/advanced_ballistics/initSettings.inc.sqf
+++ b/addons/advanced_ballistics/initSettings.inc.sqf
@@ -5,7 +5,9 @@ private _category = format ["ACE %1", localize LSTRING(DisplayName)];
[LSTRING(enabled_DisplayName), LSTRING(enabled_Description)],
_category,
false,
- 1
+ 1,
+ {[QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)},
+ true // Needs mission restart
] call CBA_fnc_addSetting;
[
@@ -45,5 +47,7 @@ private _category = format ["ACE %1", localize LSTRING(DisplayName)];
[LSTRING(simulationInterval_DisplayName), LSTRING(simulationInterval_Description)],
_category,
[0, 0.2, 0.05, 2],
- 1
+ 1,
+ {[QGVAR(simulationInterval), _this] call EFUNC(common,cbaSettings_settingChanged)},
+ true // Needs mission restart
] call CBA_fnc_addSetting;
diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml
index b077f53b6ae..67022f7deba 100644
--- a/addons/advanced_ballistics/stringtable.xml
+++ b/addons/advanced_ballistics/stringtable.xml
@@ -46,7 +46,7 @@
Fejlett ballisztika
Продвинутая баллистика
Balistica Avanzata
- アドバンスド弾道計算
+ 高度な弾道計算
고급 탄도학
先進彈道系統
进阶弹道系统
@@ -63,7 +63,7 @@
Fejlett ballisztika
Продвинутая баллистика
Balistica Avanzata
- アドバンスド弾道計算を有効化
+ 高度な弾道計算を有効化
고급 탄도학
先進彈道系統
进阶弹道系统
@@ -80,7 +80,7 @@
Engedélyezi a fejlett ballisztikát
Включает продвинутую баллистику
Abilita Balistica Avanzata
- アドバンスド弾道計算は高度な弾道計算処理を有効化します。
+ 高度な弾道計算を有効化します。
고급 탄도학을 적용합니다
啟用先進彈道系統
启用进阶弹道系统
@@ -280,7 +280,7 @@
Meghatározza a játékos körüli hatókört (méterben), ahol a lövedékek fejlett ballisztikát használnak
Определяет радиус вокруг игрока (в метрах), в котором продвинутая баллистика применяется к снарядам
Definisce il raggio attorno al giocatore (in metri) entro il quale la Balistica Avanzata è applicata ai proiettili
- アドバンスド弾道計算の適用半径範囲 (プレイヤー中心、メートル単位) を定義します。
+ 高度な弾道計算が飛翔体に適用される半径距離 (プレイヤー中心、メートル単位) を定義します。
플레이어 주위의 발사체를 고급 탄도학으로 정의하는 범위를 정합니다(미터)
以玩家的半徑距離(公尺)定義先進彈道系統啟用範圍
定义玩家周围的半径(米),在这个半径内,进阶弹道系统会被启用
@@ -297,7 +297,7 @@
Этот модуль включает симуляцию продвинутой баллистики - при этом на траекторию полета снаряда влияют различные параметры, такие как температура воздуха, атмосферное давление, влажность, гравитация, тип боеприпаса и оружия, из которого произвели выстрел.
Este módulo permite la simulación balística avanzada - es decir, la trayectoria de los proyectiles está influenciada por variables como la temperatura del aire, la presión atmosférica, la humedad, la gravedad, el tipo de municiones y el arma desde el que fue disparada.
Questo modulo abilita la simulazione della Balistica Avanzata - essa comporta che la traiettoria dei proiettili è influenzata da variabili come la temperatura dell'aria, pressione atmosferica, umidità, gravità, il tipo di munizione e l'arma da cui è sparata.
- アドバンスド弾道計算のシミュレーションを有効化します。 弾道は気温・気圧・湿度・重力・弾薬の種類・発射する武器などの変化による影響を受けるようになります。
+ 高度な弾道計算のシミュレーションを有効化します。 弾道は気温・気圧・湿度・重力・弾薬の種類・発射する武器などの変化による影響を受けるようになります。
이 모듈은 고급 탄도학을 적용시킵니다 - 이는 발사체의 궤적이 기온, 대기압, 습도, 중력, 탄환의 종류와 어느 무기에서 발사되는지에 따라 영향을 받습니다.
該模塊實現先進的彈道仿真 - 這意味著子彈的軌跡是由空氣溫度、大氣壓力、濕度、重力、彈藥類型以及射擊的武器所影響
该模块实现增强的弹道模拟—子弹的轨迹由空气温度、大气压力、湿度、重力、弹药类型和射击的武器等变量所影响
diff --git a/addons/advanced_fatigue/CfgEden.hpp b/addons/advanced_fatigue/CfgEden.hpp
index 8307c8a2a57..50147c8e8c6 100644
--- a/addons/advanced_fatigue/CfgEden.hpp
+++ b/addons/advanced_fatigue/CfgEden.hpp
@@ -2,9 +2,35 @@ class Cfg3DEN {
class Attributes {
class Slider;
class GVAR(slider): Slider {
- attributeLoad = "params [""_ctrlGroup""]; private _slider = _ctrlGroup controlsGroupCtrl 100; private _edit = _ctrlGroup controlsGroupCtrl 101; _slider sliderSetPosition _value; _edit ctrlSetText ([_value, 1, 1] call CBA_fnc_formatNumber); ";
- attributeSave = "params [""_ctrlGroup""]; sliderPosition (_ctrlGroup controlsGroupCtrl 100); ";
- onLoad = "params [""_ctrlGroup""]; private _slider = _ctrlGroup controlsGroupCtrl 100; private _edit = _ctrlGroup controlsGroupCtrl 101; _slider sliderSetRange [0, 2]; _slider ctrlAddEventHandler [""SliderPosChanged"", { params [""_slider""]; private _edit = (ctrlParentControlsGroup _slider) controlsGroupCtrl 101; private _value = sliderPosition _slider; _edit ctrlSetText ([_value, 1, 1] call CBA_fnc_formatNumber); }]; _edit ctrlAddEventHandler [""KillFocus"", { params [""_edit""]; private _slider = (ctrlParentControlsGroup _edit) controlsGroupCtrl 100; private _value = ((parseNumber ctrlText _edit) min 2) max 0; _slider sliderSetPosition _value; _edit ctrlSetText str _value; }];";
+ #pragma hemtt suppress pw3_padded_arg
+ attributeLoad = QUOTE(\
+ params ['_ctrlGroup']; \
+ private _slider = _ctrlGroup controlsGroupCtrl 100; \
+ private _edit = _ctrlGroup controlsGroupCtrl 101; \
+ _slider sliderSetPosition _value; \
+ _edit ctrlSetText ([ARR_3(_value,1,1)] call CBA_fnc_formatNumber); \
+ );
+ attributeSave = QUOTE(params ['_ctrlGroup']; sliderPosition (_ctrlGroup controlsGroupCtrl 100));
+ #pragma hemtt suppress pw3_padded_arg
+ onLoad = QUOTE(\
+ params ['_ctrlGroup']; \
+ private _slider = _ctrlGroup controlsGroupCtrl 100; \
+ private _edit = _ctrlGroup controlsGroupCtrl 101; \
+ _slider sliderSetRange [ARR_2(0,MAX_PERFORMANCE_FACTOR)]; \
+ _slider ctrlAddEventHandler [ARR_2('SliderPosChanged',{ \
+ params ['_slider']; \
+ private _edit = (ctrlParentControlsGroup _slider) controlsGroupCtrl 101; \
+ private _value = sliderPosition _slider; \
+ _edit ctrlSetText ([ARR_3(_value,1,1)] call CBA_fnc_formatNumber); \
+ })]; \
+ _edit ctrlAddEventHandler [ARR_2('KillFocus',{ \
+ params ['_edit']; \
+ private _slider = (ctrlParentControlsGroup _edit) controlsGroupCtrl 100; \
+ private _value = ((parseNumber ctrlText _edit) min MAX_PERFORMANCE_FACTOR) max 0; \
+ _slider sliderSetPosition _value; \
+ _edit ctrlSetText str _value; \
+ })]; \
+ );
};
};
class Object {
diff --git a/addons/advanced_fatigue/Dialog.hpp b/addons/advanced_fatigue/Dialog.hpp
index df019f3800c..7b57e00ced9 100644
--- a/addons/advanced_fatigue/Dialog.hpp
+++ b/addons/advanced_fatigue/Dialog.hpp
@@ -2,18 +2,18 @@ class RscControlsGroupNoScrollbars;
class RscPicture;
class GVAR(StaminaBarContainer): RscControlsGroupNoScrollbars {
- x = "(profilenamespace getvariable [""IGUI_GRID_STAMINA_X"", ((safezoneX + safezoneW) - (10 * (((safezoneW / safezoneH) min 1.2) / 40)) - 4.3 * (((safezoneW / safezoneH) min 1.2) / 40))])";
- y = "(profilenamespace getvariable [""IGUI_GRID_STAMINA_Y"", (safezoneY + 4.05 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))])";
- w = "10 * (((safezoneW / safezoneH) min 1.2) / 40)";
- h = "0.15 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
+ x = "(profilenamespace getvariable [""IGUI_GRID_STAMINA_X"", ((safeZoneX + safeZoneW) - (10 * (((safeZoneW / safeZoneH) min 1.2) / 40)) - 4.3 * (((safeZoneW / safeZoneH) min 1.2) / 40))])";
+ y = "(profilenamespace getvariable [""IGUI_GRID_STAMINA_Y"", (safeZoneY + 4.05 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25))])";
+ w = "10 * (((safeZoneW / safeZoneH) min 1.2) / 40)";
+ h = "0.15 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
class Controls {
class StaminaBar: RscPicture {
idc = 10;
x = 0;
y = 0;
- w = "10 * (((safezoneW / safezoneH) min 1.2) / 40)";
- h = "0.15 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
+ w = "10 * (((safeZoneW / safeZoneH) min 1.2) / 40)";
+ h = "0.15 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
text = "\A3\Ui_f\data\IGUI\RscIngameUI\RscUnitInfo\stamina_ca.paa";
};
};
diff --git a/addons/advanced_fatigue/XEH_PREP.hpp b/addons/advanced_fatigue/XEH_PREP.hpp
index 22bb99617a7..509c85e3755 100644
--- a/addons/advanced_fatigue/XEH_PREP.hpp
+++ b/addons/advanced_fatigue/XEH_PREP.hpp
@@ -10,3 +10,4 @@ PREP(mainLoop);
PREP(moduleSettings);
PREP(removeDutyFactor);
PREP(renderDebugLines);
+PREP(updateStaminaBar);
diff --git a/addons/advanced_fatigue/XEH_postInit.sqf b/addons/advanced_fatigue/XEH_postInit.sqf
index 519d218b8cd..e3b75a64a61 100644
--- a/addons/advanced_fatigue/XEH_postInit.sqf
+++ b/addons/advanced_fatigue/XEH_postInit.sqf
@@ -14,6 +14,8 @@ call FUNC(renderDebugLines);
["CBA_settingsInitialized", {
if (!GVAR(enabled)) exitWith {};
+ [QEGVAR(ui,hideHud), LINKFUNC(updateStaminaBar)] call CBA_fnc_addEventHandler;
+
["baseline", {
private _fatigue = ACE_player getVariable [QGVAR(aimFatigue), 0];
switch (stance ACE_player) do {
diff --git a/addons/advanced_fatigue/XEH_preInit.sqf b/addons/advanced_fatigue/XEH_preInit.sqf
index 643b7b0be00..ed1bd966229 100644
--- a/addons/advanced_fatigue/XEH_preInit.sqf
+++ b/addons/advanced_fatigue/XEH_preInit.sqf
@@ -8,7 +8,7 @@ PREP_RECOMPILE_END;
#include "initSettings.inc.sqf"
-GVAR(staminaBarWidth) = 10 * (((safezoneW / safezoneH) min 1.2) / 40);
+GVAR(staminaBarWidth) = 10 * (((safeZoneW / safeZoneH) min 1.2) / 40);
GVAR(dutyList) = createHashMap;
GVAR(setAnimExclusions) = [];
GVAR(inertia) = 0;
diff --git a/addons/advanced_fatigue/functions/fnc_mainLoop.sqf b/addons/advanced_fatigue/functions/fnc_mainLoop.sqf
index a07abae7944..e6327a3fa56 100644
--- a/addons/advanced_fatigue/functions/fnc_mainLoop.sqf
+++ b/addons/advanced_fatigue/functions/fnc_mainLoop.sqf
@@ -27,9 +27,18 @@ if (!alive ACE_player) exitWith {
private _velocity = velocity ACE_player;
private _normal = surfaceNormal (getPosWorld ACE_player);
private _movementVector = vectorNormalized _velocity;
-private _sideVector = vectorNormalized (_movementVector vectorCrossProduct _normal);
private _fwdAngle = asin (_movementVector select 2);
-private _sideAngle = asin (_sideVector select 2);
+private _sideAngle = if ((getPosATL ACE_player) select 2 > 0.01) then {
+ 0 // ignore terrain normal if not touching it
+} else {
+ private _sideVector = vectorNormalized (_movementVector vectorCrossProduct _normal);
+ asin (_sideVector select 2);
+};
+if (GVAR(isSwimming)) then { // ignore when floating
+ _fwdAngle = 0;
+ _sideAngle = 0;
+};
+
private _currentWork = REE;
private _currentSpeed = (vectorMagnitude _velocity) min 6;
@@ -62,7 +71,7 @@ if (isNull objectParent ACE_player && {_currentSpeed > 0.1} && {isTouchingGround
};
// Used to simulate the unevenness/roughness of the terrain
- if ((getPosATL ACE_player) select 2 < 0.01) then {
+ if (_sideAngle != 0) then {
private _sideGradient = abs (_sideAngle / 45) min 1;
_terrainFactor = 1 + _sideGradient ^ 4;
@@ -140,7 +149,7 @@ systemChat format ["---- velocity %1 - respiratoryRate: %2 ----", (vectorMagnitu
[ACE_player, _perceivedFatigue, GVAR(anReserve) == 0, _fwdAngle, _sideAngle] call FUNC(handleEffects);
-if (GVAR(enableStaminaBar)) then {
+if (GVAR(enableStaminaBarRealized)) then {
[GVAR(anReserve) / AN_MAXRESERVE] call FUNC(handleStaminaBar);
};
diff --git a/addons/advanced_fatigue/functions/fnc_updateStaminaBar.sqf b/addons/advanced_fatigue/functions/fnc_updateStaminaBar.sqf
new file mode 100644
index 00000000000..627430c8201
--- /dev/null
+++ b/addons/advanced_fatigue/functions/fnc_updateStaminaBar.sqf
@@ -0,0 +1,25 @@
+#include "..\script_component.hpp"
+/*
+ * Author: PabstMirror
+ * Updates the stamina bar state
+ *
+ * Arguments:
+ * None
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [] call ace_advanced_fatigue_fnc_updateStaminaBar
+ *
+ * Public: No
+ */
+
+GVAR(enableStaminaBarRealized) = GVAR(enabled) && GVAR(enableStaminaBar) && {!(missionNamespace getVariable [QEGVAR(ui,hideHud), false])};
+TRACE_1("updateStaminaBar",GVAR(enableStaminaBarRealized));
+
+private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull];
+if (isNull _staminaBarContainer) exitWith {};
+
+_staminaBarContainer ctrlSetFade ([1, 0] select GVAR(enableStaminaBarRealized));
+_staminaBarContainer ctrlCommit 0;
diff --git a/addons/advanced_fatigue/initSettings.inc.sqf b/addons/advanced_fatigue/initSettings.inc.sqf
index 01eba8652dc..bd8bd7d9281 100644
--- a/addons/advanced_fatigue/initSettings.inc.sqf
+++ b/addons/advanced_fatigue/initSettings.inc.sqf
@@ -6,12 +6,7 @@
true,
1,
{
- if (!_this) then {
- private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull];
- _staminaBarContainer ctrlSetFade 1;
- _staminaBarContainer ctrlCommit 0;
- };
-
+ call FUNC(updateStaminaBar);
[QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)
},
true // Needs mission restart
@@ -24,13 +19,7 @@
LSTRING(DisplayName),
true,
1,
- {
- if (!_this) then {
- private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull];
- _staminaBarContainer ctrlSetFade 1;
- _staminaBarContainer ctrlCommit 0;
- };
- }
+ {call FUNC(updateStaminaBar)}
] call CBA_fnc_addSetting;
[
@@ -54,7 +43,7 @@
"SLIDER",
[LSTRING(PerformanceFactor), LSTRING(PerformanceFactor_Description)],
LSTRING(DisplayName),
- [0, 10, 1, 2],
+ [0, MAX_PERFORMANCE_FACTOR, 1, 2],
1,
{
// Recalculate values if the setting is changed mid-mission
diff --git a/addons/advanced_fatigue/script_component.hpp b/addons/advanced_fatigue/script_component.hpp
index 7e3255439ff..11228ff3f25 100644
--- a/addons/advanced_fatigue/script_component.hpp
+++ b/addons/advanced_fatigue/script_component.hpp
@@ -41,3 +41,5 @@
#define AE1_MAXRESERVE 4000000 // mmol
#define AE2_MAXRESERVE 84000 // mmol
#define AN_MAXRESERVE 2300 // mmol
+
+#define MAX_PERFORMANCE_FACTOR 10
diff --git a/addons/advanced_fatigue/stringtable.xml b/addons/advanced_fatigue/stringtable.xml
index 5cd36ffce60..76e33a64e5f 100644
--- a/addons/advanced_fatigue/stringtable.xml
+++ b/addons/advanced_fatigue/stringtable.xml
@@ -7,7 +7,7 @@
ACE Erweiterte Ausdauer
ACE 進階疲勞
ACE 进阶体力
- ACE アドバンスド疲労
+ ACE 高度な疲労
ACE Fatica Avanzata
ACE 고급 피로도
ACE Fatigue avancée
@@ -173,7 +173,7 @@
Enables/disables Advanced Fatigue.
Activa/desactiva la fatiga avanzada
Aktiviert/deaktiviert Advanced Fatigue.
- アドバンスド疲労は高度な疲労管理システムを有効化します。
+ 高度な疲労を有効/無効化します。
Włącza/wyłącza zaawansowaną wytrzymałość
고급 피로도 활성화/비활성화
Active/Désactive la fatigue avancée.
diff --git a/addons/advanced_throwing/functions/fnc_throw.sqf b/addons/advanced_throwing/functions/fnc_throw.sqf
index d6b38a6a0c7..d1773373411 100644
--- a/addons/advanced_throwing/functions/fnc_throw.sqf
+++ b/addons/advanced_throwing/functions/fnc_throw.sqf
@@ -89,7 +89,7 @@ GVAR(flightPath) = [];
GVAR(flightRotation) = [];
(_unit getVariable QGVAR(activeThrowable)) spawn {
while {!isNull _this && {(getPosATL _this) select 2 > 0.05}} do {
- GVAR(flightPath) pushBack [ASLtoAGL (getPosASL _this), vectorUp _this];
+ GVAR(flightPath) pushBack [ASLToAGL (getPosASL _this), vectorUp _this];
sleep 0.05;
};
};
diff --git a/addons/advanced_throwing/stringtable.xml b/addons/advanced_throwing/stringtable.xml
index fc9cf2705a5..99fba866305 100644
--- a/addons/advanced_throwing/stringtable.xml
+++ b/addons/advanced_throwing/stringtable.xml
@@ -5,7 +5,7 @@
Advanced Throwing
Lanzamiento Avanzado
Улучшенный бросок гранат
- アドバンスド投擲
+ 高度な投擲
Zaawansowane rzucanie
Erweitertes Wurfsystem
고급 투척
@@ -21,7 +21,7 @@
Allows changing advanced throwing behaviour.
Permite modificar el comportamiento del lanzamiento avanzado
Позволяет настраивать поведение улучшенного броска гранат.
- アドバンスド投擲は投擲の高度な動作挙動を変更可能にします。
+ 高度な投擲挙動への変更を可能にします。
Zezwala na zmianę zachowania zaawansowanego trybu rzucania.
Erlaubt es, das Verhalten des erweiterten Wurfsystems zu ändern.
고급 투척 행위를 허가합니다
@@ -36,7 +36,7 @@
Enable Advanced Throwing
Activar Lanzamiento Avanzado
Вкл. улучшенный бросок
- アドバンスド投擲を有効化
+ 高度な投擲を有効化
Aktywuj zaawansowane rzucanie
Aktiviere erweitertes Wurfsystem
고급 투척 활성화
@@ -52,7 +52,7 @@
Enables advanced throwing system.
Activa el Lanzamiento Avanzado
Включает систему улучшенного броска.
- アドバンスド投擲は高度な投擲システムを有効化します。
+ 高度な投擲システムを有効化します。
Aktywuje system zaawansowanego rzucania.
Aktiviert das erweiterte Wurfsystem.
고급 투척을 활성화 합니다
diff --git a/addons/ai/functions/fnc_drawCuratorGarrisonPathing.sqf b/addons/ai/functions/fnc_drawCuratorGarrisonPathing.sqf
index 561c8748a65..8a312d95cc5 100644
--- a/addons/ai/functions/fnc_drawCuratorGarrisonPathing.sqf
+++ b/addons/ai/functions/fnc_drawCuratorGarrisonPathing.sqf
@@ -16,10 +16,11 @@
*/
if (isNull findDisplay 312) exitWith {
+ //IGNORE_PRIVATE_WARNING ["_thisEventHandler"];
removeMissionEventHandler ["Draw3D", _thisEventHandler];
};
-private _unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []];
+private _unitMoveList = missionNamespace getVariable [QGVAR(garrison_unitMoveList), []];
{
_x params ["_unit", "_pos"];
@@ -27,9 +28,9 @@ private _unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveLis
switch (true) do {
case (surfaceIsWater (getPos _unit) && {surfaceIsWater _pos}) : {
for "_i" from 0 to 3 do {
- drawLine3D [_unit modelToWorldVisualWorld [0,0,1], (AGLtoASL _pos), [1,0,0,1]];
+ drawLine3D [_unit modelToWorldVisualWorld [0,0,1], (AGLToASL _pos), [1,0,0,1]];
};
- drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], (AGLtoASL _pos), 0.75, 0.75, 0.75];
+ drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], (AGLToASL _pos), 0.75, 0.75, 0.75];
};
case (!surfaceIsWater (getPos _unit) && {!surfaceIsWater _pos}) : {
@@ -43,7 +44,7 @@ private _unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveLis
for "_i" from 0 to 3 do {
drawLine3D [_unit modelToWorldVisual [0,0,1], (AGLToASL _pos), [1,0,0,1]];
};
- drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], (AGLtoASL _pos), 0.75, 0.75, 0.75];
+ drawIcon3D ["\a3\ui_f\data\map\groupicons\waypoint.paa", [1,0,0,1], (AGLToASL _pos), 0.75, 0.75, 0.75];
};
case (surfaceIsWater (getPos _unit) && {!surfaceIsWater _pos}) : {
diff --git a/addons/ai/functions/fnc_garrison.sqf b/addons/ai/functions/fnc_garrison.sqf
index 4b8f84fce63..042c4fde3cb 100644
--- a/addons/ai/functions/fnc_garrison.sqf
+++ b/addons/ai/functions/fnc_garrison.sqf
@@ -26,7 +26,7 @@ params [["_startingPos",[0,0,0], [[]], 3], ["_buildingTypes", ["Building"], [[]]
TRACE_6("fnc_garrison: Start",_startingPos,_buldingTypes,count _unitsArray,_fillingRadius,_fillingTYpe,_topDownFilling);
_unitsArray = _unitsArray select {alive _x && {!isPlayer _x}};
-private _currentUnitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []];
+private _currentUnitMoveList = missionNamespace getVariable [QGVAR(garrison_unitMoveList), []];
if (_startingPos isEqualTo [0,0,0]) exitWith {
TRACE_1("fnc_garrison: StartingPos error",_startingPos);
@@ -57,38 +57,38 @@ if (_topDownFilling) then {
// Those reverse are necessary, as dumb as it is there's no better way to sort those subarrays in sqf
{
reverse _x;
- } foreach _buildingPos;
+ } forEach _buildingPos;
_buildingPos sort false;
{
reverse _x;
- } foreach _buildingPos;
+ } forEach _buildingPos;
_buildingsIndex pushBack _buildingPos;
- } foreach _buildings;
+ } forEach _buildings;
} else {
{
_buildingsIndex pushBack (_x buildingPos -1);
- } foreach _buildings;
+ } forEach _buildings;
};
// Remove buildings without positions
{
_buildingsIndex deleteAt (_buildingsIndex find _x);
-} foreach (_buildingsIndex select {count _x == 0});
+} forEach (_buildingsIndex select {count _x == 0});
//Remove positions units are already pathing to
_buildingsIndex = _buildingsIndex apply {
_x select {
private _testedPos = _x;
- ({(_x select 1) isEqualTo _testedPos} count (missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []])) == 0
+ ({(_x select 1) isEqualTo _testedPos} count (missionNamespace getVariable [QGVAR(garrison_unitMoveList), []])) == 0
}
};
// Warn the user that there's not enough positions to place all units
private _count = 0;
-{_count = _count + count _x} foreach _buildingsIndex;
+{_count = _count + count _x} forEach _buildingsIndex;
if ( (count _unitsArray) - _count > 0) then {
TRACE_4("fnc_garrison: Not enough spots to place all units",_unitsArray,count _unitsArray,_count,((count _unitsArray) - _count > 0));
[LSTRING(GarrisonNotEnoughPos)] call EFUNC(common,displayTextStructured);
@@ -104,7 +104,7 @@ private _fnc_comparePos = {
params ["_nearestUnits", "_pos"];
({
if (surfaceIsWater getPos _x) then {
- floor ((getPosASL _x) select 2) == floor ((AGLtoASL _pos) select 2)
+ floor ((getPosASL _x) select 2) == floor ((AGLToASL _pos) select 2)
} else {
floor ((getPosATL _x) select 2) == floor (_pos select 2)
};
@@ -141,7 +141,7 @@ switch (_fillingType) do {
if (_teleport) then {
doStop _unit;
if (_posSurface) then {
- _unit setPosASL (AGLtoASL _pos);
+ _unit setPosASL (AGLToASL _pos);
} else {
_unit setPosATL _pos;
};
@@ -190,7 +190,7 @@ switch (_fillingType) do {
if (_teleport) then {
doStop _unit;
if (_posSurface) then {
- _unit setPosASL (AGLtoASL _pos);
+ _unit setPosASL (AGLToASL _pos);
} else {
_unit setPosATL _pos;
};
@@ -237,7 +237,7 @@ switch (_fillingType) do {
if (_teleport) then {
doStop _unit;
if (_posSurface) then {
- _unit setPosASL (AGLtoASL _pos);
+ _unit setPosASL (AGLToASL _pos);
} else {
_unit setPosATL _pos;
};
@@ -261,7 +261,7 @@ switch (_fillingType) do {
TRACE_1(format [ARR_2("fnc_garrison: while loop ended | %1 units ready to be treated by PFH",count _unitMoveList)],_teleport);
// Update the unit list and remove duplicate positions and units
-private _garrison_unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []];
+private _garrison_unitMoveList = missionNamespace getVariable [QGVAR(garrison_unitMoveList), []];
_garrison_unitMoveList = _garrison_unitMoveList select {
_x params ["_testedUnit", "_testedPos"];
@@ -270,7 +270,7 @@ _garrison_unitMoveList = _garrison_unitMoveList select {
_garrison_unitMoveList append _unitMoveList;
-missionNameSpace setVariable [QGVAR(garrison_unitMoveList), _garrison_unitMoveList, true];
+missionNamespace setVariable [QGVAR(garrison_unitMoveList), _garrison_unitMoveList, true];
if (_teleport) then {
[QGVAR(AISection), [_placedUnits, ["PATH"], false], _placedUnits] call CBA_fnc_targetEvent;
diff --git a/addons/ai/functions/fnc_garrisonMove.sqf b/addons/ai/functions/fnc_garrisonMove.sqf
index 4d1c471a0ea..46313f12e38 100644
--- a/addons/ai/functions/fnc_garrisonMove.sqf
+++ b/addons/ai/functions/fnc_garrisonMove.sqf
@@ -31,21 +31,21 @@ private _unitMoveListUnits = (_unitMoveList apply {_x select 0});
{
_x setVariable [QGVAR(garrisonMove_failSafe), nil, true];
_x setVariable [QGVAR(garrisonMove_unitPosMemory), nil, true];
-} foreach _unitMoveListUnits;
+} forEach _unitMoveListUnits;
// Avoid duplicate PFHs
if (isNil QGVAR(garrison_moveUnitPFH)) then {
- missionNameSpace setVariable [QGVAR(garrison_moveUnitPFH), true, true];
+ missionNamespace setVariable [QGVAR(garrison_moveUnitPFH), true, true];
// PFH checking if the units have reached their destination
[{
params ["_args", "_pfhID"];
- private _unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []];
+ private _unitMoveList = missionNamespace getVariable [QGVAR(garrison_unitMoveList), []];
// End PFH if all units are placed / unable to reach position
if (_unitMoveList isEqualTo []) then {
- missionNameSpace setVariable [QGVAR(garrison_moveUnitPFH), nil, true];
+ missionNamespace setVariable [QGVAR(garrison_moveUnitPFH), nil, true];
LOG("garrisonMove PFH: PFH finished it's job | deleting PFH");
_pfhID call CBA_fnc_removePerFrameHandler;
@@ -91,7 +91,7 @@ if (isNil QGVAR(garrison_moveUnitPFH)) then {
} else {
private _unitPos = getPos _unit;
- if (surfaceisWater _unitPos) then {
+ if (surfaceIsWater _unitPos) then {
_unitPos = getPosASL _unit;
} else {
_unitPos = getPosATL _unit;
@@ -131,9 +131,9 @@ if (isNil QGVAR(garrison_moveUnitPFH)) then {
};
};
};
- } foreach _unitMoveList;
+ } forEach _unitMoveList;
- missionNameSpace setVariable [QGVAR(garrison_unitMoveList), _unitMoveList, true];
+ missionNamespace setVariable [QGVAR(garrison_unitMoveList), _unitMoveList, true];
};
}, 0.5, []] call CBA_fnc_addPerFrameHandler;
};
diff --git a/addons/ai/functions/fnc_unGarrison.sqf b/addons/ai/functions/fnc_unGarrison.sqf
index 09ebc3e63da..f17d9aa4ab7 100644
--- a/addons/ai/functions/fnc_unGarrison.sqf
+++ b/addons/ai/functions/fnc_unGarrison.sqf
@@ -32,7 +32,7 @@ _units = _units select {local _x};
_unit setVariable [QGVAR(garrisonned), false, true];
- private _unitMoveList = missionNameSpace getVariable [QGVAR(garrison_unitMoveList), []];
+ private _unitMoveList = missionNamespace getVariable [QGVAR(garrison_unitMoveList), []];
_unitMoveList deleteAt (_unitMoveList findIf {_x select 0 == _unit});
if (_leader != _unit) then {
@@ -43,9 +43,9 @@ _units = _units select {local _x};
_unit doMove ((nearestBuilding (getPos _unit)) buildingExit 0);
};
- if ((units _unit) findif {(_x getVariable [QGVAR(garrisonned), false]) && !isPlayer _x} == -1) then {
+ if ((units _unit) findIf {(_x getVariable [QGVAR(garrisonned), false]) && !isPlayer _x} == -1) then {
LOG("fnc_ungarrison: enableAttack true");
(group _unit) enableAttack true;
};
};
-} foreach _units;
+} forEach _units;
diff --git a/addons/aircraft/functions/fnc_droneSetWaypoint.sqf b/addons/aircraft/functions/fnc_droneSetWaypoint.sqf
index 953b99a357a..45c18c63da2 100644
--- a/addons/aircraft/functions/fnc_droneSetWaypoint.sqf
+++ b/addons/aircraft/functions/fnc_droneSetWaypoint.sqf
@@ -62,6 +62,8 @@ if (_type == "FOLLOW" && {["CAManBase", "LandVehicle", "Ship"] findIf {_target i
_waypoint setWaypointPosition [getPosASL _target, -1];
};
}, 3, [_vehicle, _group, _waypoint, _target]] call CBA_fnc_addPerFrameHandler;
+} else {
+ _waypoint setWaypointType _type;
};
TRACE_3("",_currentHeight,_currentLoiterRadius,_currentLoiterType);
diff --git a/addons/aircraft/stringtable.xml b/addons/aircraft/stringtable.xml
index 041653fe2b2..a3abe94a810 100644
--- a/addons/aircraft/stringtable.xml
+++ b/addons/aircraft/stringtable.xml
@@ -182,14 +182,18 @@
Distanza di seguimento
Folge-Entfernung
따라가는 거리
+ Distance de suivi
追跡距離
+ Расстояние отслеживания
Following unit within %1m
Seguendo unità entro %1m
Folgt Einheit bis zu %1m
%1m 이내로 유닛을 따라갑니다
+ Suivre l'unité jusqu'à %1m
%1m 間隔で 目標を追跡します
+ Отслеживание в пределах %1m
diff --git a/addons/arsenal/XEH_PREP.hpp b/addons/arsenal/XEH_PREP.hpp
index 94d4739b604..d0819056f25 100644
--- a/addons/arsenal/XEH_PREP.hpp
+++ b/addons/arsenal/XEH_PREP.hpp
@@ -78,6 +78,7 @@ PREP(removeStat);
PREP(removeVirtualItems);
PREP(renameDefaultLoadout);
PREP(replaceUniqueItemsLoadout);
+PREP(saveLoadout);
PREP(scanConfig);
PREP(showItem);
PREP(sortPanel);
diff --git a/addons/arsenal/XEH_preInit.sqf b/addons/arsenal/XEH_preInit.sqf
index 10cc3989e94..248fc16db2c 100644
--- a/addons/arsenal/XEH_preInit.sqf
+++ b/addons/arsenal/XEH_preInit.sqf
@@ -85,10 +85,10 @@ private _insigniaCondition = toString {
// Ref fnc_addListBoxItem, 0/nil = configFile, 1 = campaignConfigFile, 2 = missionConfigFile
{
- GVAR(insigniaCache) set [_x, 1];
+ GVAR(insigniaCache) set [configName _x, 1];
} forEach (_insigniaCondition configClasses (campaignConfigFile >> "CfgUnitInsignia"));
{
- GVAR(insigniaCache) set [_x, 2];
+ GVAR(insigniaCache) set [configName _x, 2];
} forEach (_insigniaCondition configClasses (missionConfigFile >> "CfgUnitInsignia"));
ADDON = true;
diff --git a/addons/arsenal/defines.hpp b/addons/arsenal/defines.hpp
index cd6d937426a..5b8a733724b 100644
--- a/addons/arsenal/defines.hpp
+++ b/addons/arsenal/defines.hpp
@@ -3,7 +3,7 @@
#define GRID_W (pixelW * pixelGridNoUIScale * pixelScale)
#define GRID_H (pixelH * pixelGridNoUIScale * pixelScale)
-#define WIDTH_TOTAL (safezoneW - 2 * (93 * GRID_W))
+#define WIDTH_TOTAL (safeZoneW - 2 * (93 * GRID_W))
#define WIDTH_GAP (WIDTH_TOTAL / 100)
#define WIDTH_SINGLE ((WIDTH_TOTAL - 7 * WIDTH_GAP) / 6)
@@ -154,6 +154,8 @@
#define IDC_statsPreviousPage 52
#define IDC_statsNextPage 53
#define IDC_statsCurrentPage 54
+#define IDC_statsBoxTitleBackground 55
+#define IDC_statsBoxBackground 56
#define IDC_actionsBox 90
#define IDC_actionsBackground1 90010
#define IDC_actionsBackground2 90011
@@ -360,10 +362,10 @@ _buttonCurrentMag2Ctrl ctrlCommit FADE_DELAY;\
{\
_x = _display displayCtrl _x;\
_x ctrlSetPosition [\
- safezoneX + safezoneW - 93 * GRID_W,\
- safezoneY + 14 * GRID_H,\
+ safeZoneX + safeZoneW - 93 * GRID_W,\
+ safeZoneY + 14 * GRID_H,\
80 * GRID_W,\
- safezoneH - 28 * GRID_H\
+ safeZoneH - 28 * GRID_H\
];\
_x ctrlCommit 0;\
} forEach [\
@@ -406,10 +408,10 @@ _buttonCurrentMag2Ctrl ctrlCommit FADE_DELAY;\
{\
_x = _display displayCtrl _x;\
_x ctrlSetPosition [\
- safezoneX + safezoneW - 93 * GRID_W,\
- safezoneY + 14 * GRID_H,\
+ safeZoneX + safeZoneW - 93 * GRID_W,\
+ safeZoneY + 14 * GRID_H,\
80 * GRID_W,\
- safezoneH - 34 * GRID_H\
+ safeZoneH - 34 * GRID_H\
];\
_x ctrlCommit 0;\
} forEach [\
@@ -426,16 +428,16 @@ if (!isNil QGVAR(customRightPanelButtons)) then {\
if (isNull (_display displayCtrl (60 + _plusId))) then {\
private _ctrl = _display ctrlCreate [QGVAR(customArsenalButton_Background), 60 + _plusId];\
_ctrl ctrlSetPosition [\
- safezoneW + safezoneX - 13 * GRID_W,\
- safezoneY + (88 + (10 * _forEachIndex)) * GRID_H\
+ safeZoneW + safeZoneX - 13 * GRID_W,\
+ safeZoneY + (88 + (10 * _forEachIndex)) * GRID_H\
];\
_ctrl ctrlCommit 0;\
};\
if (isNull (_display displayCtrl (61 + _plusId))) then {\
- _ctrl = _display ctrlCreate [QGVAR(customArsenalButton_Button), 61 + _plusId];\
+ private _ctrl = _display ctrlCreate [QGVAR(customArsenalButton_Button), 61 + _plusId];\
_ctrl ctrlSetPosition [\
- safezoneW + safezoneX - 10 * GRID_W,\
- safezoneY + (88 + (10 * _forEachIndex)) * GRID_H\
+ safeZoneW + safeZoneX - 10 * GRID_W,\
+ safeZoneY + (88 + (10 * _forEachIndex)) * GRID_H\
];\
_ctrl ctrlSetText _picture;\
_ctrl ctrlSetTooltip _tooltip;\
@@ -446,8 +448,8 @@ if (!isNil QGVAR(customRightPanelButtons)) then {\
{\
_x = _display displayCtrl _x;\
_x ctrlSetPosition [\
- safezoneW + safezoneX - (10 + (3 * _forEachIndex)) * GRID_W,\
- safezoneY + (88 + (10 * _miscOffset)) * GRID_H\
+ safeZoneW + safeZoneX - (10 + (3 * _forEachIndex)) * GRID_W,\
+ safeZoneY + (88 + (10 * _miscOffset)) * GRID_H\
];\
_x ctrlCommit 0;\
} forEach [IDC_buttonMisc, IDC_iconBackgroundMisc];\
diff --git a/addons/arsenal/functions/fnc_baseAttachment.sqf b/addons/arsenal/functions/fnc_baseAttachment.sqf
index 968fd05d9b8..1d6155c9ee2 100644
--- a/addons/arsenal/functions/fnc_baseAttachment.sqf
+++ b/addons/arsenal/functions/fnc_baseAttachment.sqf
@@ -22,7 +22,7 @@ TRACE_1("looking up base attachment",_item);
private _switchableClasses = [];
-private _cfgWeapons = configfile >> "CfgWeapons";
+private _cfgWeapons = configFile >> "CfgWeapons";
private _config = _cfgWeapons >> _item;
_item = configName _config;
diff --git a/addons/arsenal/functions/fnc_baseWeapon.sqf b/addons/arsenal/functions/fnc_baseWeapon.sqf
index abeb0e0ab9b..2b1b219e65c 100644
--- a/addons/arsenal/functions/fnc_baseWeapon.sqf
+++ b/addons/arsenal/functions/fnc_baseWeapon.sqf
@@ -20,7 +20,7 @@ params [["_weapon", "", [""]]];
// Check if item is cached
(uiNamespace getVariable QGVAR(baseWeaponNameCache)) getOrDefaultCall [toLowerANSI _weapon, {
- private _cfgWeapons = configfile >> "CfgWeapons";
+ private _cfgWeapons = configFile >> "CfgWeapons";
private _config = _cfgWeapons >> _weapon;
// If class doesn't exist, exit
diff --git a/addons/arsenal/functions/fnc_buttonExport.sqf b/addons/arsenal/functions/fnc_buttonExport.sqf
index 3e5039a5040..abf7c7d6fcb 100644
--- a/addons/arsenal/functions/fnc_buttonExport.sqf
+++ b/addons/arsenal/functions/fnc_buttonExport.sqf
@@ -26,28 +26,27 @@ if (GVAR(shiftState)) then {
switch (true) do {
// Beginning
case (_index == -1): {
- "ace_clipboard" callExtension (format ["[%1", endl]);
+ "ace" callExtension ["clipboard:append", [format ["[%1", endl]]];
};
// End
case (_index == _listLength): {
- "ace_clipboard" callExtension "];";
+ "ace" callExtension ["clipboard:append", ["];"]];
};
// Rest
default {
- "ace_clipboard" callExtension ([" ", str (GVAR(defaultLoadoutsList) select _index), [",", ""] select (_index == _listLength - 1), endl] joinString "");
+ "ace" callExtension ["clipboard:append", [[" ", str (GVAR(defaultLoadoutsList) select _index), [",", ""] select (_index == _listLength - 1), endl] joinString ""]];
};
};
};
- "ace_clipboard" callExtension "--COMPLETE--";
+ "ace" callExtension ["clipboard:complete", []];
[_display, LLSTRING(exportDefault)] call FUNC(message);
} else {
// Export singular loadout
private _export = str (GVAR(center) call CBA_fnc_getLoadout);
-
- "ace_clipboard" callExtension (_export + ";");
- "ace_clipboard" callExtension "--COMPLETE--";
+ "ace" callExtension ["clipboard:append", [_export]];
+ "ace" callExtension ["clipboard:complete", []];
[_display, LLSTRING(exportCurrent)] call FUNC(message);
};
diff --git a/addons/arsenal/functions/fnc_buttonImport.sqf b/addons/arsenal/functions/fnc_buttonImport.sqf
index 8a83fe3ff0c..494bf159daa 100644
--- a/addons/arsenal/functions/fnc_buttonImport.sqf
+++ b/addons/arsenal/functions/fnc_buttonImport.sqf
@@ -16,7 +16,13 @@
params ["_display"];
// Can be either a singular loadout or an array of loadouts
-private _extendedLoadout = call compile copyFromClipboard;
+private _extendedLoadout = if (isMultiplayer) then {
+ ("ace" callExtension ["clipboard:loadout", []]) params ["_loadout", "_code"];
+ if (_code != 0) exitWith {};
+ parseSimpleArray _loadout
+} else {
+ call compile copyFromClipboard
+};
// If error, exit
if (isNil "_extendedLoadout" || {!(_extendedLoadout isEqualType [])}) exitWith {
diff --git a/addons/arsenal/functions/fnc_handleStats.sqf b/addons/arsenal/functions/fnc_handleStats.sqf
index b5d435a101e..0511c05a25a 100644
--- a/addons/arsenal/functions/fnc_handleStats.sqf
+++ b/addons/arsenal/functions/fnc_handleStats.sqf
@@ -19,6 +19,8 @@
params ["_display", "_control", "_curSel", ["_itemCfg", configNull]];
private _statsBoxCtrl = _display displayCtrl IDC_statsBox;
+private _statsBoxTitleBackgroundCtrl = _display displayCtrl IDC_statsBoxTitleBackground;
+private _statsBoxBackgroundCtrl = _display displayCtrl IDC_statsBoxBackground;
private _statsPreviousPageCtrl = _display displayCtrl IDC_statsPreviousPage;
private _statsNextPageCtrl = _display displayCtrl IDC_statsNextPage;
private _statsCurrentPageCtrl = _display displayCtrl IDC_statsCurrentPage;
@@ -53,7 +55,7 @@ private _fnc_hideEverything = {
// Hide the stats box
_statsBoxCtrl ctrlSetPosition [
(0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP,
- safezoneY + 1.8 * GRID_H,
+ safeZoneY + 1.8 * GRID_H,
0,
0
];
@@ -62,7 +64,7 @@ private _fnc_hideEverything = {
// Move action display
private _ctrl = _display displayCtrl IDC_actionsBox;
private _pos = ctrlPosition _ctrl;
- _pos set [1, safezoneY + 1.8 * GRID_H];
+ _pos set [1, safeZoneY + 1.8 * GRID_H];
_ctrl ctrlSetPosition _pos;
_ctrl ctrlCommit 0;
@@ -111,6 +113,7 @@ private _fnc_handleStats = {
private _statsBarCtrl = controlNull;
private _statsTextCtrl = controlNull;
private _textStatementResult = "";
+ private _lastCtrl = _statsBoxTitleBackgroundCtrl;
{
_x params ["", "_configEntry", "_title", "_bools", "_statements"];
@@ -127,6 +130,17 @@ private _fnc_handleStats = {
_statsTitleCtrl ctrlSetText _title;
_statsTitleCtrl ctrlSetFade 0;
+ // Vertical Position
+ ctrlPosition _lastCtrl params ["", "_lastPosY", "", "_lastPosH"];
+ _statsTitleCtrl ctrlSetPositionY (_lastPosY + _lastPosH + GRID_H);
+ {
+ _x ctrlSetPositionY (_lastPosY + _lastPosH + GRID_H + (5 * GRID_H));
+ } forEach [
+ _statsBackgroundCtrl,
+ _statsBarCtrl,
+ _statsTextCtrl
+ ];
+
// Handle bars
if (_showBar) then {
_statsBarCtrl progressSetPosition ([_configEntry, _itemCfg] call _barStatement);
@@ -140,18 +154,39 @@ private _fnc_handleStats = {
// Handle text entries
if (_showText) then {
_textStatementResult = [_configEntry, _itemCfg] call _textStatement;
-
- if !(_textStatementResult isEqualtype "") then {
- _textStatementResult = str _textStatementResult;
+ if (_textStatementResult isEqualType []) then {
+ _textStatementResult = _textStatementResult joinString endl;
+ } else {
+ if !(_textStatementResult isEqualType "") then {
+ _textStatementResult = str _textStatementResult;
+ };
};
_statsTextCtrl ctrlSetText _textStatementResult;
_statsTextCtrl ctrlSetTextColor ([[1, 1, 1, 1], [0, 0, 0, 1]] select (_showBar));
+
+ //Height based on Text lines
+ {
+ _x ctrlSetPositionH (ctrlTextHeight _statsTextCtrl);
+ } forEach [
+ _statsBackgroundCtrl,
+ _statsBarCtrl,
+ _statsTextCtrl
+ ];
+
_statsTextCtrl ctrlSetFade 0;
} else {
_statsTextCtrl ctrlSetFade 1;
+ //Ensure default height
+ {
+ _x ctrlSetPositionH (5 * GRID_H);
+ } forEach [
+ _statsBackgroundCtrl,
+ _statsBarCtrl,
+ _statsTextCtrl
+ ];
};
-
+
{
_x ctrlCommit 0;
} forEach [
@@ -160,24 +195,29 @@ private _fnc_handleStats = {
_statsBarCtrl,
_statsTextCtrl
];
+
+ _lastCtrl = _statsTextCtrl;
+
} forEach _statsToDisplay;
// Resize the window
(5 - _statsCount) call _fnc_hideUnused;
- private _height = 10 * _statsCount + 5;
+ ctrlPosition _lastCtrl params ["", "_lastPosY", "", "_lastPosH"];
_statsBoxCtrl ctrlSetPosition [
(0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP,
- safezoneY + 1.8 * GRID_H,
+ safeZoneY + 1.8 * GRID_H,
47 * GRID_W,
- _height * GRID_H
+ _lastPosY + _lastPosH + GRID_H
];
+ _statsBoxBackgroundCtrl ctrlSetPositionH (_lastPosY + _lastPosH + GRID_H);
+ _statsBoxBackgroundCtrl ctrlCommit 0;
_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];
+ _pos set [1, safeZoneY + (_lastPosY + _lastPosH + GRID_H + (3.6 * GRID_H))];
_ctrl ctrlSetPosition _pos;
_ctrl ctrlCommit 0;
diff --git a/addons/arsenal/functions/fnc_itemInfo.sqf b/addons/arsenal/functions/fnc_itemInfo.sqf
index 676783a8b54..2662600aaee 100644
--- a/addons/arsenal/functions/fnc_itemInfo.sqf
+++ b/addons/arsenal/functions/fnc_itemInfo.sqf
@@ -32,11 +32,11 @@ if (isClass _itemCfg) then {
(_display displayCtrl IDC_infoName) ctrlSetText ([_control lbText _curSel, _control lnbText [_curSel, 1]] select (ctrlType _control == CT_LISTNBOX));
private _itemAuthor = getText (_itemCfg >> "author");
- (_display displayctrl IDC_infoAuthor) 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 _ctrlDLC = _display displayCtrl IDC_DLCIcon;
+ private _ctrlDLCBackground = _display displayCtrl IDC_DLCBackground;
private _dlc = _itemCfg call EFUNC(common,getAddon);
if (_dlc != "") then {
@@ -48,7 +48,7 @@ if (isClass _itemCfg) then {
_ctrlDLC ctrlSetFade 0;
// 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 {
+ 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 [
diff --git a/addons/arsenal/functions/fnc_message.sqf b/addons/arsenal/functions/fnc_message.sqf
index b20689f6b9c..5d2846bafc6 100644
--- a/addons/arsenal/functions/fnc_message.sqf
+++ b/addons/arsenal/functions/fnc_message.sqf
@@ -25,6 +25,7 @@ if (!isNil "_handle") then {
};
_handle = [_display, _messageBoxCtrl, time + 5, _message, FADE_DELAY] spawn {
+ //IGNORE_PRIVATE_WARNING ["_thisScript"];
disableSerialization;
params ["_display", "_control", "_timer", "_message", "_delay"];
diff --git a/addons/arsenal/functions/fnc_onArsenalOpen.sqf b/addons/arsenal/functions/fnc_onArsenalOpen.sqf
index 0f0a5817c6e..2a2d8716c84 100644
--- a/addons/arsenal/functions/fnc_onArsenalOpen.sqf
+++ b/addons/arsenal/functions/fnc_onArsenalOpen.sqf
@@ -121,7 +121,7 @@ _mouseBlockCtrl ctrlEnable false;
private _statsBoxCtrl = _display displayCtrl IDC_statsBox;
_statsBoxCtrl ctrlSetPosition [
(0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP,
- safezoneY + 1.8 * GRID_H,
+ safeZoneY + 1.8 * GRID_H,
47 * GRID_W,
11 * GRID_H
];
@@ -132,20 +132,12 @@ _statsBoxCtrl ctrlCommit 0;
private _actionsBoxCtrl = _display displayCtrl IDC_actionsBox;
_actionsBoxCtrl ctrlSetPosition [
(0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP,
- safezoneY + 58.6 * GRID_H,
+ safeZoneY + 58.6 * GRID_H,
47 * GRID_W,
11 * GRID_H
];
_actionsBoxCtrl ctrlCommit 0;
-// Disable import in MP
-if (isMultiplayer) then {
- private _importButtonCtrl = _display displayCtrl IDC_buttonImport;
- _importButtonCtrl ctrlEnable false;
- _importButtonCtrl ctrlSetFade 0.6;
- _importButtonCtrl ctrlCommit 0;
-};
-
//--------------- Camera prep
cutText ["", "PLAIN"];
showCommandingMenu "";
diff --git a/addons/arsenal/functions/fnc_onKeyDown.sqf b/addons/arsenal/functions/fnc_onKeyDown.sqf
index 4d62075f78f..fe69bb3486d 100644
--- a/addons/arsenal/functions/fnc_onKeyDown.sqf
+++ b/addons/arsenal/functions/fnc_onKeyDown.sqf
@@ -94,8 +94,8 @@ if (!isNull _loadoutsDisplay) then {
};
} params ["_className"];
- "ace_clipboard" callExtension (_className + ";");
- "ace_clipboard" callExtension "--COMPLETE--";
+ "ace" callExtension ["clipboard:append", [_className]];
+ "ace" callExtension ["clipboard:complete", []];
[_display, LLSTRING(exportedClassnameText)] call FUNC(message);
} else {
diff --git a/addons/arsenal/functions/fnc_onSelChangedLeft.sqf b/addons/arsenal/functions/fnc_onSelChangedLeft.sqf
index e25016b303d..a5a32a85188 100644
--- a/addons/arsenal/functions/fnc_onSelChangedLeft.sqf
+++ b/addons/arsenal/functions/fnc_onSelChangedLeft.sqf
@@ -17,7 +17,7 @@
params ["_control", "_curSel"];
-if (_curSel < 0) exitwith {};
+if (_curSel < 0) exitWith {};
private _display = ctrlParent _control;
private _item = [_control lbData _curSel, _control lnbData [_curSel, 0]] select (ctrlType _control == CT_LISTNBOX);
@@ -33,6 +33,7 @@ private _fnc_clearCurrentWeaponMags = {
// If nothing was selected, remove all magazines from the current weapon
if (_item != "") then {
+ //IGNORE_PRIVATE_WARNING ["_compatibleMags"];
_compatibleMagsCurrentWeapon = _compatibleMagsCurrentWeapon - _compatibleMags;
};
diff --git a/addons/arsenal/functions/fnc_onSelChangedRight.sqf b/addons/arsenal/functions/fnc_onSelChangedRight.sqf
index abec68ceeef..66315f7dc79 100644
--- a/addons/arsenal/functions/fnc_onSelChangedRight.sqf
+++ b/addons/arsenal/functions/fnc_onSelChangedRight.sqf
@@ -16,7 +16,7 @@
params ["_control", "_curSel"];
-if (_curSel < 0) exitwith {};
+if (_curSel < 0) exitWith {};
private _display = ctrlParent _control;
private _item = _control lbData _curSel;
diff --git a/addons/arsenal/functions/fnc_saveLoadout.sqf b/addons/arsenal/functions/fnc_saveLoadout.sqf
new file mode 100644
index 00000000000..05e712e45f6
--- /dev/null
+++ b/addons/arsenal/functions/fnc_saveLoadout.sqf
@@ -0,0 +1,37 @@
+#include "..\script_component.hpp"
+/*
+ * Author: DartRuffian
+ * Saves a given loadout to the client's profile.
+ *
+ * Arguments:
+ * 0: Name of loadout
+ * 1: CBA extended loadout or getUnitLoadout array
+ * 2: Replace existing loadout (default: false)
+ *
+ * Return Value:
+ * True if loadout was saved, otherwise false
+ *
+ * Example:
+ * ["Current Loadout", getUnitLoadout ACE_player] call ace_arsenal_fnc_saveLoadout
+ *
+ * Public: Yes
+ */
+
+params [["_name", "", [""]], ["_loadout", [], [[]]], ["_replaceExisting", false, [false]]];
+
+if (_name == "" || {_loadout isEqualTo []}) exitWith { false };
+
+private _loadouts = profileNamespace getVariable [QGVAR(saved_loadouts), []];
+private _loadoutIndex = _loadouts findIf {(_x#0) == _name};
+
+// If a loadout with same name already exists and no overwriting enabled, quit
+if (!_replaceExisting && {_loadoutIndex != -1}) exitWith { false };
+
+if (_loadoutIndex == -1) then {
+ _loadouts pushBack [_name, _loadout];
+} else {
+ _loadouts set [_loadoutIndex, [_name, _loadout]];
+};
+
+profileNamespace setVariable [QGVAR(saved_loadouts), _loadouts];
+true
diff --git a/addons/arsenal/functions/fnc_scanConfig.sqf b/addons/arsenal/functions/fnc_scanConfig.sqf
index fef97e8bd85..b5c6627cc7a 100644
--- a/addons/arsenal/functions/fnc_scanConfig.sqf
+++ b/addons/arsenal/functions/fnc_scanConfig.sqf
@@ -228,10 +228,10 @@ private _faceCategory = "";
_faceCache set [configName _x, [getText (_x >> "displayName"), _modPicture, _faceCategory]];
};
} forEach ("true" configClasses _x);
-} forEach ("true" configClasses (configfile >> "CfgFaces"));
+} forEach ("true" configClasses (configFile >> "CfgFaces"));
// Get all voices
-private _voiceCache = (configProperties [configFile >> "CfgVoice", "isClass _x && {getNumber (_x >> 'scope') == 2}", true]) - [configfile >> "CfgVoice" >> "NoVoice"];
+private _voiceCache = (configProperties [configFile >> "CfgVoice", "isClass _x && {getNumber (_x >> 'scope') == 2}", true]) - [configFile >> "CfgVoice" >> "NoVoice"];
_voiceCache = _voiceCache apply {configName _x};
// Get all insignia
diff --git a/addons/arsenal/functions/fnc_sortPanel.sqf b/addons/arsenal/functions/fnc_sortPanel.sqf
index f9803a429e7..e47ece9d17b 100644
--- a/addons/arsenal/functions/fnc_sortPanel.sqf
+++ b/addons/arsenal/functions/fnc_sortPanel.sqf
@@ -155,6 +155,7 @@ private _for = if (_right) then {
for "_i" from 0 to (lbSize _panel) - 1
};
+//IGNORE_PRIVATE_WARNING ["_i"];
_for do {
// Get item
_item = if (_right) then {
diff --git a/addons/arsenal/functions/fnc_sortStatement_mod.sqf b/addons/arsenal/functions/fnc_sortStatement_mod.sqf
index ab945202171..063aba0dbc4 100644
--- a/addons/arsenal/functions/fnc_sortStatement_mod.sqf
+++ b/addons/arsenal/functions/fnc_sortStatement_mod.sqf
@@ -14,4 +14,9 @@
params ["_config"];
-(modParams [_config call EFUNC(common,getAddon), ["name"]]) param [0, ""]
+private _addon = _config call EFUNC(common,getAddon);
+
+// Calling modParams with "" prints 'ModParams - Undefined or empty mod directory' in RPT
+if (_addon == "") exitWith {""};
+
+(modParams [_addon, ["name"]]) param [0, ""]
diff --git a/addons/arsenal/functions/fnc_statTextStatement_load.sqf b/addons/arsenal/functions/fnc_statTextStatement_load.sqf
index 032019f5825..a7a132b1844 100644
--- a/addons/arsenal/functions/fnc_statTextStatement_load.sqf
+++ b/addons/arsenal/functions/fnc_statTextStatement_load.sqf
@@ -17,7 +17,7 @@ params ["_stats", "_config"];
TRACE_2("statTextStatement_load",_stats,_config);
if (!isNull (_config >> "ItemInfo" >> "containerClass")) then { // Uniform/Vest
- _config = configfile >> "CfgVehicles" >> getText (_config >> "ItemInfo" >> "containerClass");
+ _config = configFile >> "CfgVehicles" >> getText (_config >> "ItemInfo" >> "containerClass");
};
private _load = getNumber (_config >> (_stats # 0));
diff --git a/addons/arsenal/ui/RscAttributes.hpp b/addons/arsenal/ui/RscAttributes.hpp
index dc70caa0c27..b487cffd617 100644
--- a/addons/arsenal/ui/RscAttributes.hpp
+++ b/addons/arsenal/ui/RscAttributes.hpp
@@ -15,14 +15,14 @@ class GVAR(display) {
class ControlsBackground {
class blackLeft: ctrlStatic {
colorBackground[] = {0,0,0,1};
- x = QUOTE(safezoneXAbs);
- y = QUOTE(safezoneY);
- w = QUOTE(safezoneXAbs - safezoneX);
- h = QUOTE(safezoneH);
+ x = QUOTE(safeZoneXAbs);
+ y = QUOTE(safeZoneY);
+ w = QUOTE(safeZoneXAbs - safeZoneX);
+ h = QUOTE(safeZoneH);
};
class blackRight: blackLeft {
- x = QUOTE(safezoneX + safezoneW);
+ x = QUOTE(safeZoneX + safeZoneW);
};
class mouseArea: ctrlStatic {
@@ -31,10 +31,10 @@ class GVAR(display) {
onMouseMoving = QUOTE([ARR_3('onMouseMoving',_this,GVAR(display))] call FUNC(handleMouse));
onMouseHolding = QUOTE([ARR_3('onMouseHolding',_this,GVAR(display))] call FUNC(handleMouse));
onMouseZChanged = QUOTE([ARR_3('onMouseZChanged',_this,GVAR(display))] call FUNC(handleScrollWheel));
- x = QUOTE(safezoneX);
- y = QUOTE(safezoneY);
- w = QUOTE(safezoneW);
- h = QUOTE(safezoneH);
+ x = QUOTE(safeZoneX);
+ y = QUOTE(safeZoneY);
+ w = QUOTE(safeZoneW);
+ h = QUOTE(safeZoneH);
};
};
class controls {
@@ -58,34 +58,34 @@ class GVAR(display) {
};
class blockLeftFrame: RscFrame {
idc = IDC_blockLeftFrame;
- x = QUOTE(safezoneX + 13 * GRID_W);
- y = QUOTE(safezoneY + 14 * GRID_H);
+ x = QUOTE(safeZoneX + 13 * GRID_W);
+ y = QUOTE(safeZoneY + 14 * GRID_H);
w = QUOTE(80 * GRID_W);
- h = QUOTE(safezoneH - 24 * GRID_H);
+ h = QUOTE(safeZoneH - 24 * GRID_H);
colorText[] = {0,0,0,1};
};
class blockLeftBackground: ctrlStaticBackground {
idc = IDC_blockLeftBackground;
- x = QUOTE(safezoneX + 13 * GRID_W);
- y = QUOTE(safezoneY + 14 * GRID_H);
+ x = QUOTE(safeZoneX + 13 * GRID_W);
+ y = QUOTE(safeZoneY + 14 * GRID_H);
w = QUOTE(80 * GRID_W);
- h = QUOTE(safezoneH - 24 * GRID_H);
+ h = QUOTE(safeZoneH - 24 * GRID_H);
colorBackground[] = {0,0,0,0.5};
};
class blockRightFrame: blockLeftFrame {
idc = IDC_blockRightFrame;
- x = QUOTE(safezoneX + safezoneW - 93 * GRID_W);
- h = QUOTE(safezoneH - 34 * GRID_H);
+ x = QUOTE(safeZoneX + safeZoneW - 93 * GRID_W);
+ h = QUOTE(safeZoneH - 34 * GRID_H);
};
class blockRighttBackground: blockLeftBackground {
idc = IDC_blockRighttBackground;
- x = QUOTE(safezoneX + safezoneW - 93 * GRID_W);
- h = QUOTE(safezoneH - 34 * GRID_H);
+ x = QUOTE(safeZoneX + safeZoneW - 93 * GRID_W);
+ h = QUOTE(safeZoneH - 34 * GRID_H);
};
class loadIndicator: RscControlsGroupNoScrollbars {
idc = IDC_loadIndicator;
- x = QUOTE(safezoneX + safezoneW - 93 * GRID_W);
- y = QUOTE(safeZoneH + safezoneY - 20 * GRID_H);
+ x = QUOTE(safeZoneX + safeZoneW - 93 * GRID_W);
+ y = QUOTE(safeZoneH + safeZoneY - 20 * GRID_H);
w = QUOTE(80 * GRID_W);
h = QUOTE(6 * GRID_H);
class controls {
@@ -112,8 +112,8 @@ class GVAR(display) {
};
class totalWeight: RscControlsGroupNoScrollbars {
idc = IDC_totalWeight;
- x = QUOTE(safezoneX + 13 * GRID_W);
- y = QUOTE(safeZoneH + safezoneY - 10 * GRID_H);
+ x = QUOTE(safeZoneX + 13 * GRID_W);
+ y = QUOTE(safeZoneH + safeZoneY - 10 * GRID_H);
w = QUOTE(80 * GRID_W);
h = QUOTE(8 * GRID_H);
class controls {
@@ -154,7 +154,7 @@ class GVAR(display) {
colorBackground[] = {0,0,0,0.69999999};
text = "";
x = QUOTE(0.5 - WIDTH_TOTAL / 2);
- y = QUOTE(safeZoneH + safezoneY - 25 * GRID_H);
+ y = QUOTE(safeZoneH + safeZoneY - 25 * GRID_H);
w = QUOTE(WIDTH_TOTAL);
h = QUOTE(10 * GRID_H);
sizeEx = QUOTE(5 * GRID_H);
@@ -162,7 +162,7 @@ class GVAR(display) {
class menuBar: RscControlsGroupNoScrollbars {
idc = IDC_menuBar;
x = QUOTE(0.5 - WIDTH_TOTAL / 2);
- y = QUOTE(safezoneH + safezoneY - 9 * GRID_H);
+ y = QUOTE(safeZoneH + safeZoneY - 9 * GRID_H);
w = QUOTE(WIDTH_TOTAL);
h = QUOTE(7 * GRID_H);
class controls {
@@ -223,8 +223,8 @@ class GVAR(display) {
class infoBox: RscControlsGroupNoScrollbars {
idc = IDC_infoBox;
fade = 1;
- x = QUOTE(safezoneX + safezoneW - 93 * GRID_W);
- y = QUOTE(safeZoneH + safezoneY - 14 * GRID_H);
+ x = QUOTE(safeZoneX + safeZoneW - 93 * GRID_W);
+ y = QUOTE(safeZoneH + safeZoneY - 14 * GRID_H);
w = QUOTE(92 * GRID_W);
h = QUOTE(12 * GRID_H);
class controls {
@@ -278,12 +278,12 @@ class GVAR(display) {
class statsBox: RscControlsGroupNoScrollbars {
idc = IDC_statsBox;
x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP);
- y = QUOTE(safezoneY + 1.8 * GRID_H);
+ y = QUOTE(safeZoneY + 1.8 * GRID_H);
w = QUOTE(47 * GRID_W);
h = QUOTE(55 * GRID_H);
class controls {
class statsStaticBackground1: ctrlStaticBackground {
- idc = -1;
+ idc = IDC_statsBoxBackground;
x = QUOTE(0);
y = QUOTE(0);
w = QUOTE(47 * GRID_W);
@@ -291,7 +291,7 @@ class GVAR(display) {
colorBackground[] = {0.1,0.1,0.1,0.5};
};
class statsStaticBackground2: ctrlStaticBackground {
- idc = -1;
+ idc = IDC_statsBoxTitleBackground;
x = QUOTE(0);
y = QUOTE(0);
w = QUOTE(47 * GRID_W);
@@ -316,7 +316,7 @@ class GVAR(display) {
x = QUOTE(1 * GRID_W);
y = QUOTE(10 * GRID_H);
w = QUOTE(45 * GRID_W);
- h = QUOTE(4 * GRID_H);
+ h = QUOTE(5 * GRID_H);
colorBackground[] = {1,1,1,0.15};
};
class statsBar1: ctrlProgress {
@@ -329,9 +329,9 @@ class GVAR(display) {
x = QUOTE(1 * GRID_W);
y = QUOTE(10 * GRID_H);
w = QUOTE(45 * GRID_W);
- h = QUOTE(4 * GRID_H);
+ h = QUOTE(5 * GRID_H);
};
- class statsText1: RscText {
+ class statsText1: RscTextMulti {
idc = IDC_statsText1;
shadow = 0;
fade = 1;
@@ -340,7 +340,7 @@ class GVAR(display) {
x = QUOTE(0 * GRID_W);
y = QUOTE(10 * GRID_H);
w = QUOTE(45 * GRID_W);
- h = QUOTE(4 * GRID_H);
+ h = QUOTE(5 * GRID_H);
sizeEx = QUOTE(5 * GRID_H);
text = "";
};
@@ -419,7 +419,7 @@ class GVAR(display) {
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);
+ y = QUOTE(safeZoneY + 1.8 * GRID_H);
w = QUOTE(5 * GRID_W);
h = QUOTE(5 * GRID_H);
sizeEx = QUOTE(5.5 * GRID_H);
@@ -434,7 +434,7 @@ class GVAR(display) {
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);
+ y = QUOTE(safeZoneY + 1.8 * GRID_H);
w = QUOTE(37 * GRID_W);
h = QUOTE(5 * GRID_H);
colorBackground[] = {0,0,0,0};
@@ -445,7 +445,7 @@ class GVAR(display) {
class actionsBox: RscControlsGroupNoScrollbars {
idc = IDC_actionsBox;
x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP);
- y = QUOTE(safezoneY + 58.6 * GRID_H);
+ y = QUOTE(safeZoneY + 58.6 * GRID_H);
w = QUOTE(47 * GRID_W);
h = QUOTE(55 * GRID_H);
class controls {
@@ -482,7 +482,7 @@ class GVAR(display) {
x = QUOTE(1 * GRID_W);
y = QUOTE(6 * GRID_H);
w = QUOTE(45 * GRID_W);
- h = QUOTE(4 * GRID_H);
+ h = QUOTE(5 * GRID_H);
};
class actionsText2: actionsText1 {
idc = IDC_actionsText2;
@@ -550,10 +550,10 @@ class GVAR(display) {
class mouseBlock: RscText {
idc = IDC_mouseBlock;
style = 16;
- x = QUOTE(safezoneX);
- y = QUOTE(safezoneY);
- w = QUOTE(safezoneW);
- h = QUOTE(safezoneH);
+ x = QUOTE(safeZoneX);
+ y = QUOTE(safeZoneY);
+ w = QUOTE(safeZoneW);
+ h = QUOTE(safeZoneH);
};
class leftTabContent: RscListBox {
idc = IDC_leftTabContent;
@@ -569,10 +569,10 @@ class GVAR(display) {
onLBDblClick = QUOTE(_this call FUNC(onPanelDblClick));
onSetFocus = QUOTE(GVAR(leftTabFocus) = true);
onKillFocus = QUOTE(GVAR(leftTabFocus) = false);
- x = QUOTE(safezoneX + 13 * GRID_W);
- y = QUOTE(safezoneY + 14 * GRID_H);
+ x = QUOTE(safeZoneX + 13 * GRID_W);
+ y = QUOTE(safeZoneY + 14 * GRID_H);
w = QUOTE(80 * GRID_W);
- h = QUOTE(safezoneH - 24.5 * GRID_H);
+ h = QUOTE(safeZoneH - 24.5 * GRID_H);
sizeEx = QUOTE(7 * GRID_H);
};
class rightTabContent: leftTabContent {
@@ -583,8 +583,8 @@ class GVAR(display) {
onLBDblClick = QUOTE(_this call FUNC(onPanelDblClick));
onSetFocus = QUOTE(GVAR(rightTabFocus) = true);
onKillFocus = QUOTE(GVAR(rightTabFocus) = false);
- x = QUOTE(safezoneX + safezoneW - 93 * GRID_W);
- h = QUOTE(safezoneH - 28 * GRID_H);
+ x = QUOTE(safeZoneX + safeZoneW - 93 * GRID_W);
+ h = QUOTE(safeZoneH - 28 * GRID_H);
};
class rightTabContentListnBox: RscListNBox {
idc = IDC_rightTabContentListnBox;
@@ -605,16 +605,16 @@ class GVAR(display) {
onLBDblClick = QUOTE(_this call FUNC(onPanelDblClick));
onSetFocus = QUOTE(GVAR(rightTabLnBFocus) = true);
onKillFocus = QUOTE(GVAR(rightTabLnBFocus) = false);
- x = QUOTE(safezoneX + safezoneW - 93 * GRID_W);
- y = QUOTE(safezoneY + 14 * GRID_H);
+ x = QUOTE(safeZoneX + safeZoneW - 93 * GRID_W);
+ y = QUOTE(safeZoneY + 14 * GRID_H);
w = QUOTE(80 * GRID_W);
- h = QUOTE(safezoneH - 34 * GRID_H);
+ h = QUOTE(safeZoneH - 34 * GRID_H);
sizeEx = QUOTE(7 * GRID_H);
};
class sortLeftTab: RscCombo {
idc = IDC_sortLeftTab;
- x = QUOTE(safezoneX + 13 * GRID_W);
- y = QUOTE(safezoneY + 8 * GRID_H);
+ x = QUOTE(safeZoneX + 13 * GRID_W);
+ y = QUOTE(safeZoneY + 8 * GRID_H);
w = QUOTE(40 * GRID_W);
h = QUOTE(6 * GRID_H);
onLBSelChanged = QUOTE(_this call FUNC(sortPanel));
@@ -622,16 +622,16 @@ class GVAR(display) {
};
class sortLeftTabDirection: sortLeftTab {
idc = IDC_sortLeftTabDirection;
- x = QUOTE(safezoneX + 53 * GRID_W);
+ x = QUOTE(safeZoneX + 53 * GRID_W);
w = QUOTE(40 * GRID_W);
};
class sortRightTab: sortLeftTab {
idc = IDC_sortRightTab;
- x = QUOTE(safezoneX + safezoneW - 93 * GRID_W);
+ x = QUOTE(safeZoneX + safeZoneW - 93 * GRID_W);
};
class sortRightTabDirection: sortLeftTabDirection {
idc = IDC_sortRightTabDirection;
- x = QUOTE(safezoneX + safezoneW - 53 * GRID_W);
+ x = QUOTE(safeZoneX + safeZoneW - 53 * GRID_W);
};
class leftSearchbar: ctrlEdit {
idc = IDC_leftSearchbar;
@@ -639,8 +639,8 @@ class GVAR(display) {
onKillFocus = QUOTE(GVAR(leftSearchbarFocus) = false);
onMouseButtonClick = QUOTE([ARR_3(ctrlParent (_this select 0),_this select 0,_this select 1)] call FUNC(clearSearchbar));
onEditChanged = QUOTE(call FUNC(handleSearchInputChanged));
- x = QUOTE(safezoneX + 13 * GRID_W);
- y = QUOTE(safezoneY + 1.8 * GRID_H);
+ x = QUOTE(safeZoneX + 13 * GRID_W);
+ y = QUOTE(safeZoneY + 1.8 * GRID_H);
w = QUOTE(74 * GRID_W);
h = QUOTE(6 * GRID_H);
sizeEx = QUOTE(6 * GRID_H);
@@ -652,8 +652,8 @@ class GVAR(display) {
colorBackground[] = {0,0,0,0.5};
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),ctrlParent (_this select 0) displayCtrl IDC_leftSearchbar)] call FUNC(handleSearchbar));
onMouseButtonDown = QUOTE(call FUNC(handleSearchModeToggle));
- x = QUOTE(safezoneX + 87 * GRID_W);
- y = QUOTE(safezoneY + 1.8 * GRID_H);
+ x = QUOTE(safeZoneX + 87 * GRID_W);
+ y = QUOTE(safeZoneY + 1.8 * GRID_H);
w = QUOTE(6 * GRID_W);
h = QUOTE(6 * GRID_H);
};
@@ -661,17 +661,17 @@ class GVAR(display) {
idc = IDC_rightSearchbar;
onSetFocus = QUOTE(GVAR(rightSearchbarFocus) = true);
onKillFocus = QUOTE(GVAR(rightSearchbarFocus) = false);
- x = QUOTE(safezoneX + safezoneW - 87 * GRID_W);
+ x = QUOTE(safeZoneX + safeZoneW - 87 * GRID_W);
};
class rightSearchbarButton: leftSearchbarButton {
idc = IDC_rightSearchbarButton;
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),ctrlParent (_this select 0) displayCtrl IDC_rightSearchbar)] call FUNC(handleSearchbar));
- x = QUOTE(safezoneX + safezoneW - 93 * GRID_W);
+ x = QUOTE(safeZoneX + safeZoneW - 93 * GRID_W);
};
class tabLeft: RscControlsGroupNoScrollbars {
idc = IDC_tabLeft;
- x = QUOTE(safezoneX + 1 * GRID_W);
- y = QUOTE(safezoneY + 8 * GRID_H);
+ x = QUOTE(safeZoneX + 1 * GRID_W);
+ y = QUOTE(safeZoneY + 8 * GRID_H);
w = QUOTE(12 * GRID_W);
h = QUOTE(200 * GRID_H);
class controls {
@@ -873,8 +873,8 @@ class GVAR(display) {
colorBackground[] = {0,0,0,1};
fade = 1;
enable = 0;
- x = QUOTE(safezoneW + safezoneX - 13 * GRID_W);
- y = QUOTE(safezoneY + 8 * GRID_H);
+ x = QUOTE(safeZoneW + safeZoneX - 13 * GRID_W);
+ y = QUOTE(safeZoneY + 8 * GRID_H);
w = QUOTE(12 * GRID_W);
h = QUOTE(9 * GRID_H);
};
@@ -884,110 +884,110 @@ class GVAR(display) {
text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\ItemOptic_ca.paa";
onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0),_this select 0)] call FUNC(fillRightPanel));
colorBackground[] = {0,0,0,0.5};
- x = QUOTE(safezoneW + safezoneX - 10 * GRID_W);
- y = QUOTE(safezoneY + 8 * GRID_H);
+ x = QUOTE(safeZoneW + safeZoneX - 10 * GRID_W);
+ y = QUOTE(safeZoneY + 8 * GRID_H);
w = QUOTE(9 * GRID_W);
h = QUOTE(9 * GRID_H);
};
class iconBackgroundItemAcc: iconBackgroundOptic {
idc = IDC_iconBackgroundItemAcc;
- y = QUOTE(safezoneY + 18 * GRID_H);
+ y = QUOTE(safeZoneY + 18 * GRID_H);
};
class buttonItemAcc: buttonOptic {
idc = IDC_buttonItemAcc;
text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\ItemAcc_ca.paa";
tooltip = "$STR_A3_RscDisplayArsenal_tab_ItemAcc";
- y = QUOTE(safezoneY + 18 * GRID_H);
+ y = QUOTE(safeZoneY + 18 * GRID_H);
};
class iconBackgroundMuzzle: iconBackgroundOptic {
idc = IDC_iconBackgroundMuzzle;
- y = QUOTE(safezoneY + 28 * GRID_H);
+ y = QUOTE(safeZoneY + 28 * GRID_H);
};
class buttonMuzzle: buttonOptic {
idc = IDC_buttonMuzzle;
text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\ItemMuzzle_ca.paa";
tooltip = "$STR_A3_RscDisplayArsenal_tab_ItemMuzzle";
- y = QUOTE(safezoneY + 28 * GRID_H);
+ y = QUOTE(safeZoneY + 28 * GRID_H);
};
class iconBackgroundBipod: iconBackgroundOptic {
idc = IDC_iconBackgroundBipod;
- y = QUOTE(safezoneY + 38 * GRID_H);
+ y = QUOTE(safeZoneY + 38 * GRID_H);
};
class buttonBipod: buttonOptic {
idc = IDC_buttonBipod;
text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\ItemBipod_ca.paa";
tooltip = "$STR_A3_RscDisplayArsenal_tab_ItemBipod";
- y = QUOTE(safezoneY + 38 * GRID_H);
+ y = QUOTE(safeZoneY + 38 * GRID_H);
};
class iconBackgroundCurrentMag: iconBackgroundOptic {
idc = IDC_iconBackgroundCurrentMag;
- y = QUOTE(safezoneY + 48 * GRID_H);
+ y = QUOTE(safeZoneY + 48 * GRID_H);
};
class buttonCurrentMag: buttonOptic {
idc = IDC_buttonCurrentMag;
text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoMag_ca.paa";
tooltip = CSTRING(buttonCurrentMagTooltip);
- y = QUOTE(safezoneY + 48 * GRID_H);
+ y = QUOTE(safeZoneY + 48 * GRID_H);
};
class iconBackgroundCurrentMag2: iconBackgroundOptic {
idc = IDC_iconBackgroundCurrentMag2;
- y = QUOTE(safezoneY + 58 * GRID_H);
+ y = QUOTE(safeZoneY + 58 * GRID_H);
};
class buttonCurrentMag2: buttonOptic {
idc = IDC_buttonCurrentMag2;
text = QPATHTOF(data\iconSecondaryMuzzle);
tooltip = CSTRING(buttonCurrentMag2Tooltip);
- y = QUOTE(safezoneY + 58 * GRID_H);
+ y = QUOTE(safeZoneY + 58 * GRID_H);
};
class iconBackgroundMag: iconBackgroundOptic {
idc = IDC_iconBackgroundMag;
- y = QUOTE(safezoneY + 48 * GRID_H);
+ y = QUOTE(safeZoneY + 48 * GRID_H);
};
class buttonMag: buttonOptic {
idc = IDC_buttonMag;
text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoMag_ca.paa";
tooltip = "$STR_A3_RscDisplayArsenal_tab_CargoMag";
- y = QUOTE(safezoneY + 48 * GRID_H);
+ y = QUOTE(safeZoneY + 48 * GRID_H);
};
class iconBackgroundMagALL: iconBackgroundOptic {
idc = IDC_iconBackgroundMagALL;
- y = QUOTE(safezoneY + 58 * GRID_H);
+ y = QUOTE(safeZoneY + 58 * GRID_H);
};
class buttonMagALL: buttonOptic {
idc = IDC_buttonMagALL;
text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoMagAll_ca.paa";
tooltip = "$STR_A3_RscDisplayArsenal_tab_CargoMagAll";
- y = QUOTE(safezoneY + 58 * GRID_H);
+ y = QUOTE(safeZoneY + 58 * GRID_H);
};
class iconBackgroundThrow: iconBackgroundOptic {
idc = IDC_iconBackgroundThrow;
- y = QUOTE(safezoneY + 68 * GRID_H);
+ y = QUOTE(safeZoneY + 68 * GRID_H);
};
class buttonThrow: buttonOptic {
idc = IDC_buttonThrow;
text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoThrow_ca.paa";
tooltip = "$STR_A3_RscDisplayArsenal_tab_CargoThrow";
- y = QUOTE(safezoneY + 68 * GRID_H);
+ y = QUOTE(safeZoneY + 68 * GRID_H);
};
class iconBackgroundPut: iconBackgroundOptic {
idc = IDC_iconBackgroundPut;
- y = QUOTE(safezoneY + 78 * GRID_H);
+ y = QUOTE(safeZoneY + 78 * GRID_H);
};
class buttonPut: buttonOptic {
idc = IDC_buttonPut;
text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoPut_ca.paa";
tooltip = "$STR_A3_RscDisplayArsenal_tab_CargoPut";
- y = QUOTE(safezoneY + 78 * GRID_H);
+ y = QUOTE(safeZoneY + 78 * GRID_H);
};
class iconBackgroundMisc: iconBackgroundOptic {
idc = IDC_iconBackgroundMisc;
- y = QUOTE(safezoneY + 88 * GRID_H);
+ y = QUOTE(safeZoneY + 88 * GRID_H);
};
class buttonMisc: buttonOptic {
idc = IDC_buttonMisc;
text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\CargoMisc_ca.paa";
tooltip = "$STR_A3_RscDisplayArsenal_tab_CargoMisc";
- y = QUOTE(safezoneY + 88 * GRID_H);
+ y = QUOTE(safeZoneY + 88 * GRID_H);
};
class buttonRemoveAll: ctrlButtonPicture {
@@ -998,8 +998,8 @@ class GVAR(display) {
onButtonClick = QUOTE(ctrlParent (_this select 0) call FUNC(buttonClearAll));
fade = 1;
enable = 0;
- x = QUOTE(safezoneW + safezoneX - 11 * GRID_W);
- y = QUOTE(safeZoneH + safezoneY - 29 * GRID_H);
+ x = QUOTE(safeZoneW + safeZoneX - 11 * GRID_W);
+ y = QUOTE(safeZoneH + safeZoneY - 29 * GRID_H);
w = QUOTE(9 * GRID_W);
h = QUOTE(9 * GRID_H);
};
@@ -1013,17 +1013,17 @@ class GVAR(loadoutsDisplay) {
class controls {
class centerBox: ctrlControlsGroupNoScrollbars {
idc = IDC_centerBox;
- x = QUOTE(safezoneW + safezoneX - (180 * GRID_W));
- y = QUOTE(safezoneY + (5 * GRID_H));
+ x = QUOTE(safeZoneW + safeZoneX - (180 * GRID_W));
+ y = QUOTE(safeZoneY + (5 * GRID_H));
w = QUOTE(160 * GRID_W);
- h = QUOTE(safezoneH - (34 * GRID_H));
+ h = QUOTE(safeZoneH - (34 * GRID_H));
class controls {
class centerFrame: RscFrame {
idc = -1;
x = QUOTE(0 * GRID_W);
y = QUOTE(0 * GRID_H);
w = QUOTE(160 * GRID_W);
- h = QUOTE(safezoneH - (45 * GRID_H));
+ h = QUOTE(safeZoneH - (45 * GRID_H));
colorText[] = {0,0,0,1};
};
class centerBackground: ctrlStaticBackground {
@@ -1031,7 +1031,7 @@ class GVAR(loadoutsDisplay) {
x = QUOTE(0);
y = QUOTE(0);
w = QUOTE(160 * GRID_W);
- h = QUOTE(safezoneH - (45 * GRID_H));
+ h = QUOTE(safeZoneH - (45 * GRID_H));
colorBackground[] = {0.13,0.13,0.13,0.9};
};
class centerTitle: ctrlStaticTitle {
@@ -1056,14 +1056,14 @@ class GVAR(loadoutsDisplay) {
x = QUOTE(0);
y = QUOTE(5 * GRID_H);
w = QUOTE(160 * GRID_W);
- h = QUOTE(safezoneH - (57 * GRID_H));
+ h = QUOTE(safeZoneH - (57 * GRID_H));
sizeEx = QUOTE(7 * GRID_H);
};
class textTitle: RscText {
idc = -1;
text = "$STR_DISP_GAME_NAME";
x = QUOTE(0 * GRID_W);
- y = QUOTE(safezoneH - (51 * GRID_H));
+ y = QUOTE(safeZoneH - (51 * GRID_H));
w = QUOTE(15 * GRID_W);
h = QUOTE(5 * GRID_H);
sizeEx = QUOTE(5 * GRID_H);
@@ -1072,7 +1072,7 @@ class GVAR(loadoutsDisplay) {
class textEditBox: ctrlEdit {
idc = IDC_textEditBox;
x = QUOTE(15 * GRID_W);
- y = QUOTE(safezoneH - (51 * GRID_H));
+ y = QUOTE(safeZoneH - (51 * GRID_H));
w = QUOTE(65 * GRID_W);
h = QUOTE(5 * GRID_H);
sizeEx = QUOTE(6 * GRID_H);
@@ -1083,7 +1083,7 @@ class GVAR(loadoutsDisplay) {
onKillFocus = QUOTE(GVAR(loadoutsSearchbarFocus) = false);
onMouseButtonClick = QUOTE([ARR_3(ctrlParent (_this select 0),_this select 0,_this select 1)] call FUNC(clearSearchbar));
x = QUOTE(83 * GRID_W);
- y = QUOTE(safezoneH - (51 * GRID_H));
+ y = QUOTE(safeZoneH - (51 * GRID_H));
w = QUOTE(72 * GRID_W);
h = QUOTE(5 * GRID_H);
sizeEx = QUOTE(6 * GRID_H);
@@ -1094,14 +1094,14 @@ class GVAR(loadoutsDisplay) {
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));
+ y = QUOTE(safeZoneH - (51 * GRID_H));
w = QUOTE(5 * GRID_W);
h = QUOTE(5 * GRID_H);
};
class buttonSave: ctrlButton {
idc = IDC_buttonSave;
x = QUOTE(0 * GRID_W);
- y = QUOTE(safezoneH - (44 * GRID_H));
+ y = QUOTE(safeZoneH - (44 * GRID_H));
w = QUOTE(30 * GRID_W);
h = QUOTE(10 * GRID_H);
text = CSTRING(buttonSaveText);
@@ -1143,8 +1143,8 @@ class GVAR(loadoutsDisplay) {
};
class buttonClose: ctrlButton {
idc = -1;
- x = QUOTE(safezoneW + safezoneX - 32 * GRID_W);
- y = QUOTE(safezoneH + safezoneY - 9 * GRID_H);
+ x = QUOTE(safeZoneW + safeZoneX - 32 * GRID_W);
+ y = QUOTE(safeZoneH + safeZoneY - 9 * GRID_H);
w = QUOTE(30 * GRID_W);
h = QUOTE(7 * GRID_H);
sizeEx = QUOTE(5 * GRID_H);
@@ -1154,8 +1154,8 @@ class GVAR(loadoutsDisplay) {
};
class buttonBar: ctrlControlsGroupNoScrollbars {
idc = -1;
- x = QUOTE((safezoneW * 0.5) + safezoneX - (80.5 * GRID_W));
- y = QUOTE(safezoneH + safezoneY - 9 * GRID_H);
+ x = QUOTE((safeZoneW * 0.5) + safeZoneX - (80.5 * GRID_W));
+ y = QUOTE(safeZoneH + safeZoneY - 9 * GRID_H);
w = QUOTE(161 * GRID_W);
h = QUOTE(7 * GRID_H);
class controls {
diff --git a/addons/arsenal/ui/RscCommon.hpp b/addons/arsenal/ui/RscCommon.hpp
index f74326bcfb7..cb36a67aed3 100644
--- a/addons/arsenal/ui/RscCommon.hpp
+++ b/addons/arsenal/ui/RscCommon.hpp
@@ -86,12 +86,12 @@
#define TR_AUTOCOLLAPSE 2
// Default grid
-#define GUI_GRID_WAbs ((safezoneW / safezoneH) min 1.2)
+#define GUI_GRID_WAbs ((safeZoneW / safeZoneH) min 1.2)
#define GUI_GRID_HAbs (GUI_GRID_WAbs / 1.2)
#define GUI_GRID_W (GUI_GRID_WAbs / 40)
#define GUI_GRID_H (GUI_GRID_HAbs / 25)
-#define GUI_GRID_X (safezoneX)
-#define GUI_GRID_Y (safezoneY + safezoneH - GUI_GRID_HAbs)
+#define GUI_GRID_X (safeZoneX)
+#define GUI_GRID_Y (safeZoneY + safeZoneH - GUI_GRID_HAbs)
// Default text sizes
#define GUI_TEXT_SIZE_SMALL (GUI_GRID_H * 0.8)
diff --git a/addons/arsenal/ui/RscCustomArsenalButton.hpp b/addons/arsenal/ui/RscCustomArsenalButton.hpp
index 0aa077f424c..e745203e7ea 100644
--- a/addons/arsenal/ui/RscCustomArsenalButton.hpp
+++ b/addons/arsenal/ui/RscCustomArsenalButton.hpp
@@ -1,6 +1,6 @@
class GVAR(customArsenalButton_Button): RscButtonArsenal {
- x = QUOTE(safezoneW + safezoneX - 10 * GRID_W);
- y = QUOTE(safezoneY + 88 * GRID_H);
+ x = QUOTE(safeZoneW + safeZoneX - 10 * GRID_W);
+ y = QUOTE(safeZoneY + 88 * GRID_H);
w = QUOTE(9 * GRID_W);
h = QUOTE(9 * GRID_H);
@@ -11,8 +11,8 @@ class GVAR(customArsenalButton_Button): RscButtonArsenal {
};
class GVAR(customArsenalButton_Background): ctrlStaticBackground {
- x = QUOTE(safezoneW + safezoneX - 13 * GRID_W);
- y = QUOTE(safezoneY + 88 * GRID_H);
+ x = QUOTE(safeZoneW + safeZoneX - 13 * GRID_W);
+ y = QUOTE(safeZoneY + 88 * GRID_H);
w = QUOTE(12 * GRID_W);
h = QUOTE(9 * GRID_H);
diff --git a/addons/artillerytables/RscRangeTable.hpp b/addons/artillerytables/RscRangeTable.hpp
index ef11d7eac82..a24aa503cb5 100644
--- a/addons/artillerytables/RscRangeTable.hpp
+++ b/addons/artillerytables/RscRangeTable.hpp
@@ -8,16 +8,16 @@ class GVAR(rangeTableDialog) {
class TableBackground: RscPicture {
idc = -1;
text = QPATHTOF(UI\RangeTable_background.paa);
- x = "18 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)";
- y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)";
+ x = "18 *(safeZoneH / 40) + (safeZoneX + (safeZoneW - safeZoneH) / 2)";
+ y = "1 * ((safeZoneH / 1.2) / 25) + (safeZoneY + (safeZoneH - (safeZoneH / 1.2)) / 2)";
w = "16.2634559672906 * (safeZoneH / 40)";
h = "23 * ((safeZoneH / 1.2) / 25)";
colorBackground[] = {1,1,1,1};
};
class LeftSideBackground: RscText {
idc = -1;
- x = "13 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)";
- y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)";
+ x = "13 *(safeZoneH / 40) + (safeZoneX + (safeZoneW - safeZoneH) / 2)";
+ y = "1 * ((safeZoneH / 1.2) / 25) + (safeZoneY + (safeZoneH - (safeZoneH / 1.2)) / 2)";
w = "5 * (safeZoneH / 40)";
h = "23 * ((safeZoneH / 1.2) / 25)";
colorBackground[] = {0,0,0,0.8};
@@ -26,8 +26,8 @@ class GVAR(rangeTableDialog) {
class controls {
class TheTable: RscListNBox {
idc = IDC_TABLE;
- x = "18 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)";
- y = "3.76 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)";
+ x = "18 *(safeZoneH / 40) + (safeZoneX + (safeZoneW - safeZoneH) / 2)";
+ y = "3.76 * ((safeZoneH / 1.2) / 25) + (safeZoneY + (safeZoneH - (safeZoneH / 1.2)) / 2)";
w = "16.2634559672906 * (safeZoneH / 40)";
h = "20.24 * ((safeZoneH / 1.2) / 25)";
columns[] = {"10/867", "86/867", "171/867", "238/867", "320/867", "405/867", "485/867", "546/867", "607/867", "668/867", "729/867", "790/867"};
@@ -48,8 +48,8 @@ class GVAR(rangeTableDialog) {
};
class ChargeListBox: RscListBox {
idc = IDC_CHARGELIST;
- x = "13 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)";
- y = "2 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)";
+ x = "13 *(safeZoneH / 40) + (safeZoneX + (safeZoneW - safeZoneH) / 2)";
+ y = "2 * ((safeZoneH / 1.2) / 25) + (safeZoneY + (safeZoneH - (safeZoneH / 1.2)) / 2)";
w = "5 * (safeZoneH / 40)";
h = "22 * ((safeZoneH / 1.2) / 25)";
onLBSelChanged = QUOTE([] call FUNC(rangeTableUpdate));
@@ -58,8 +58,8 @@ class GVAR(rangeTableDialog) {
idc = IDC_BUTTON_ELEV_HIGH;
text = "High";
onButtonClick = QUOTE([true] call FUNC(rangeTableUpdate));
- x = "13.1 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)";
- y = "1.1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)";
+ x = "13.1 *(safeZoneH / 40) + (safeZoneX + (safeZoneW - safeZoneH) / 2)";
+ y = "1.1 * ((safeZoneH / 1.2) / 25) + (safeZoneY + (safeZoneH - (safeZoneH / 1.2)) / 2)";
w = "2.3 * (safeZoneH / 40)";
h = "0.8 * ((safeZoneH / 1.2) / 25)";
};
@@ -67,12 +67,12 @@ class GVAR(rangeTableDialog) {
idc = IDC_BUTTON_ELEV_LOW;
text = "Low";
onButtonClick = QUOTE([false] call FUNC(rangeTableUpdate));
- x = "15.6 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)";
+ x = "15.6 *(safeZoneH / 40) + (safeZoneX + (safeZoneW - safeZoneH) / 2)";
};
class CloseBackground: RscText {
idc = -1;
- x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)";
- y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)";
+ x = "33.7634559672906 *(safeZoneH / 40) + (safeZoneX + (safeZoneW - safeZoneH) / 2)";
+ y = "1 * ((safeZoneH / 1.2) / 25) + (safeZoneY + (safeZoneH - (safeZoneH / 1.2)) / 2)";
w = "0.5 * (safeZoneH / 40)";
h = "0.5 * ((safeZoneH / 1.2) / 25)";
colorBackground[] = {0,0,0,0.5};
@@ -82,8 +82,8 @@ class GVAR(rangeTableDialog) {
style = 48;
color[] = {1,1,1,0.7};
text = "A3\Ui_f\data\GUI\Rsc\RscDisplayArcadeMap\icon_exit_cross_ca.paa";
- x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH) / 2)";
- y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2)) / 2)";
+ x = "33.7634559672906 *(safeZoneH / 40) + (safeZoneX + (safeZoneW - safeZoneH) / 2)";
+ y = "1 * ((safeZoneH / 1.2) / 25) + (safeZoneY + (safeZoneH - (safeZoneH / 1.2)) / 2)";
w = "0.5 * (safeZoneH / 40)";
h = "0.5 * ((safeZoneH / 1.2) / 25)";
colorText[] = {1,1,1,0.7};
diff --git a/addons/artillerytables/RscTitles.hpp b/addons/artillerytables/RscTitles.hpp
index c26f302a00f..e0c4cc34495 100644
--- a/addons/artillerytables/RscTitles.hpp
+++ b/addons/artillerytables/RscTitles.hpp
@@ -9,10 +9,10 @@ class RscTitles {
class controls {
class ModeControlGroup: RscControlsGroupNoScrollbars {
idc = IDC_MODECONTROLGROUP;
- x = "3.8 * (((safezoneW / safezoneH) min 1.2) / 40) + (profilenamespace getvariable ['IGUI_GRID_WEAPON_X',((safezoneX + safezoneW) - (10 * (((safezoneW / safezoneH) min 1.2) / 40)) - 4.3 * (((safezoneW / safezoneH) min 1.2) / 40))])";
- y = "2.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (profilenamespace getVariable ['IGUI_GRID_WEAPON_Y', (safezoneY + 0.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))])";
- w = "10 * (((safezoneW / safezoneH) min 1.2) / 40)";
- h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
+ x = "3.8 * (((safeZoneW / safeZoneH) min 1.2) / 40) + (profilenamespace getvariable ['IGUI_GRID_WEAPON_X',((safeZoneX + safeZoneW) - (10 * (((safeZoneW / safeZoneH) min 1.2) / 40)) - 4.3 * (((safeZoneW / safeZoneH) min 1.2) / 40))])";
+ y = "2.5 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25) + (profilenamespace getVariable ['IGUI_GRID_WEAPON_Y', (safeZoneY + 0.5 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25))])";
+ w = "10 * (((safeZoneW / safeZoneH) min 1.2) / 40)";
+ h = "1 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
class controls {
class Charge: RscText {
@@ -21,18 +21,18 @@ class RscTitles {
colorBackground[] = {0, 0, 0, 0};
x = "0";
y = "0";
- w = "(2) * (((safezoneW / safezoneH) min 1.2) / 40)";
- h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
- sizeEx = "0.8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
+ w = "(2) * (((safeZoneW / safeZoneH) min 1.2) / 40)";
+ h = "1 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
+ sizeEx = "0.8 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
};
class Azimuth: Charge {
idc = IDC_AZIMUTH;
- x = "(2) * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
- w = "(3) * (((safezoneW / safezoneH) min 1.2) / 40)";
+ x = "(2) * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
+ w = "(3) * (((safeZoneW / safeZoneH) min 1.2) / 40)";
};
class Elevation: Azimuth {
idc = IDC_ELEVATION;
- x = "(5) * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
+ x = "(5) * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
};
};
};
diff --git a/addons/artillerytables/XEH_PREP.hpp b/addons/artillerytables/XEH_PREP.hpp
index 7ef48b61dd8..7f977dd6b32 100644
--- a/addons/artillerytables/XEH_PREP.hpp
+++ b/addons/artillerytables/XEH_PREP.hpp
@@ -1,8 +1,14 @@
TRACE_1("prep",_this);
+PREP(adjustFire);
+PREP(calculateElevation);
+PREP(calculateMaxAngle);
+PREP(calculateMuzzleVelocity);
+PREP(calculateSolution);
PREP(firedEH);
PREP(interactMenuOpened);
PREP(rangeTableOpen);
PREP(rangeTableUpdate);
+PREP(simulateShot);
PREP(turretChanged);
PREP(turretPFEH);
diff --git a/addons/artillerytables/XEH_postInit.sqf b/addons/artillerytables/XEH_postInit.sqf
index 4f0e2032088..0696302ea9b 100644
--- a/addons/artillerytables/XEH_postInit.sqf
+++ b/addons/artillerytables/XEH_postInit.sqf
@@ -4,10 +4,13 @@
TRACE_2("CBA_settingsInitialized",GVAR(advancedCorrections),GVAR(disableArtilleryComputer));
if (hasInterface) then {
- // Add hud overlay for actuall azimuth and elevation:
+ // Add hud overlay for actual azimuth and elevation:
GVAR(pfID) = -1;
["turret", LINKFUNC(turretChanged), true] call CBA_fnc_addPlayerEventHandler;
+ // Handles being teleported from one vehicle to another
+ ["vehicle", {[_this select 0, (_this select 1) unitTurret (_this select 0)] call FUNC(turretChanged)}] call CBA_fnc_addPlayerEventHandler;
+
// Add ability to dynamically open rangetables:
["ace_interactMenuOpened", LINKFUNC(interactMenuOpened)] call CBA_fnc_addEventHandler;
};
@@ -30,6 +33,33 @@
};
}] call CBA_fnc_addEventHandler;
+addMissionEventHandler ["ExtensionCallback", {
+ params ["_name", "_function", "_data"];
+ if (_name == "ace:artillery" && {_function == "calculate_table"}) then {
+ (parseSimpleArray _data) params ["_line", "_data"];
+ if (_data isEqualType []) then {
+ GVAR(tableData) set [_line, _data];
+ };
+ GVAR(tableSizeReceived) = GVAR(tableSizeReceived) + 1;
+ if (GVAR(tableSizeReceived) == GVAR(tableSizeActual)) then {
+ private _dialog = uiNamespace getVariable [QGVAR(rangeTableDialog), displayNull];
+ private _ctrlRangeTable = _dialog displayCtrl IDC_TABLE;
+ if (isNull _dialog) exitWith {true};
+ for "_i" from 0 to GVAR(tableSizeActual) do {
+ private _row = GVAR(tableData) getOrDefault [_i, []];
+ if (count _row == 12) then {
+ _ctrlRangeTable lnbAddRow _row;
+ };
+ };
+ private _dialog = uiNamespace getVariable [QGVAR(rangeTableDialog), displayNull];
+ private _ctrlRangeTable = _dialog displayCtrl IDC_TABLE;
+ if (isNull _dialog) exitWith {TRACE_1("dialog closed",_this);};
+ _ctrlRangeTable lnbAddRow ["", "", "", "", "", "", "", "", "", "", ""];
+ TRACE_1("table filled",_ctrlRangeTable);
+ };
+ };
+}];
+
#ifdef DEBUG_MODE_FULL
#include "dev\showShotInfo.inc.sqf"
#include "dev\checkConfigs.inc.sqf"
diff --git a/addons/artillerytables/config.cpp b/addons/artillerytables/config.cpp
index 1f6fa9f74e7..5aafdfb9b2e 100644
--- a/addons/artillerytables/config.cpp
+++ b/addons/artillerytables/config.cpp
@@ -14,13 +14,6 @@ class CfgPatches {
};
};
-class ACE_Extensions {
- class ace_artillerytables {
- windows = 1;
- client = 1;
- };
-};
-
#include "CfgEventHandlers.hpp"
#include "CfgMagazines.hpp"
#include "CfgVehicles.hpp"
diff --git a/addons/artillerytables/dev/showShotInfo.inc.sqf b/addons/artillerytables/dev/showShotInfo.inc.sqf
index ac99acbdc16..6945e95ba0b 100644
--- a/addons/artillerytables/dev/showShotInfo.inc.sqf
+++ b/addons/artillerytables/dev/showShotInfo.inc.sqf
@@ -35,7 +35,7 @@ INFO("showing shot info");
private _diff = _lastPos vectorDiff _shootPos;
_mkrB setMarkerText format ["%1", _diff apply {round _x}];
- private _dist2d = _shootPos distance2d _lastPos;
+ private _dist2d = _shootPos distance2D _lastPos;
private _dir = _shootPos getDir _lastPos;
private _height = (_lastPos select 2) - (_shootPos select 2);
_mkrB setMarkerText format ["Dist: %1m Az: %2[%3] Height:%4", _dist2d toFixed 0, _dir toFixed 2, ((6400 / 360) * _dir) toFixed 0, _height toFixed 0];
diff --git a/addons/artillerytables/functions/fnc_adjustFire.sqf b/addons/artillerytables/functions/fnc_adjustFire.sqf
new file mode 100644
index 00000000000..1e07c5ca212
--- /dev/null
+++ b/addons/artillerytables/functions/fnc_adjustFire.sqf
@@ -0,0 +1,41 @@
+#include "..\script_component.hpp"
+/*
+ * Author: LorenLuke
+ * Adjusts a target point north and east, and recalculates a solution in air based on atmospheric conditions
+ *
+ * Arguments:
+ * 0: Gun Position ASL
+ * 1: Target Position ASL
+ * 2: Adjustment to the East (negative is West); meters
+ * 3: Adjustment to the North (negative is South); meters
+ * 4: Adjustment vertically (negative is Down); meters
+ * 5: Muzzle velocity; meters/second
+ * 6: Air Friction; meters^-1 (m/s^2)/(m^2/s^2)
+ * 7: High angle boolean (true is high angle)
+ * 8: Temperature; degrees Celsius
+ * 9: Atmospheric Density; kg/(meters^3)
+ * 10: Direction of wind; degrees clockwise from north
+ * 11: Speed of wind; meters/second
+ *
+ * Return Value:
+ * Array of returns
+ * 0: Angle of shot; Milliradians
+ * 1: Angle adjust left or right; Milliradians
+ * 2: Time of flight; seconds
+ *
+ * Example:
+ * [getposASL vehicle player, targetPos, 20, 50, 0, 200, -0.0001, true, 15, 1.225, 225, 5] call ace_artilleryTables_fnc_adjustFire
+ *
+ * Public: No
+ */
+
+params ["_gunPos", "_targetPos", "_adjustEast", "_adjustNorth", "_adjustUp", "_muzzleVelocity", "_airFriction", ["_highAngle", true], ["_temperature", 15], ["_airDensity", 1.225], ["_windDir", 0], ["_windSpeed", 0]];
+
+//DEFAULT_AIR_FRICTION == -0.00006
+//MK6_82mm_AIR_FRICTION == -0.0001
+
+private _resultPos = [_adjustEast + _targetPos select 0, _adjustNorth + _targetPos select 1, _adjustUp + _targetPos select 2];
+
+private _returns = [_gunPos, _resultPos, _muzzleVelocity, _highAngle, _airFriction, _temperature, _airDensity, _windDir, _windSpeed] call FUNC(calculateSolution);
+
+_returns
diff --git a/addons/artillerytables/functions/fnc_calculateElevation.sqf b/addons/artillerytables/functions/fnc_calculateElevation.sqf
new file mode 100644
index 00000000000..977253eff93
--- /dev/null
+++ b/addons/artillerytables/functions/fnc_calculateElevation.sqf
@@ -0,0 +1,71 @@
+#include "..\script_component.hpp"
+/*
+ * Author: LorenLuke
+ * Adjusts a target point north and east, and recalculates a solution in air based on atmospheric conditions
+ *
+ * Arguments:
+ * 0: Distance to Target; meters
+ * 1: Height of target; meters, relative to gun altitude (positive means target higher than gun)
+ * 2: Muzzle velocity; meters/second
+ * 3: High angle boolean (true is high angle)
+ * 4: Air Friction; meters^-1 [(m/s^2)/(m^2/s^2)]
+ * 5: Temperature; degrees Celsius
+ * 6: Atmospheric Density; kg/(meters^3)
+ * 7: Cross wind; meters/second (negative is Right to Left)
+ * 8: Tail wind; meters/second (negative is flying against the wind)
+ *
+ * Return Value:
+ * Array of returns
+ * 0: Angle of shot; Milliradians
+ * 1: Angle adjust left or right; Milliradians
+ * 2: Time of flight; seconds
+ *
+ * Example:
+ * [myPos, 0, 200, true, -0.0001, 15, 1.225, 5, -10] call ace_artilleryTables_fnc_calculateElevation
+ *
+ * Public: No
+ */
+
+params ["_targetDistance", "_targetHeight", "_muzzleVelocity", ["_highArc", true], ["_airFriction", 0], ["_temperature", 15], ["_airDensity", 1.225], ["_crossWind", 0], ["_tailWind", 0]];
+
+//DEFAULT_AIR_FRICTION == -0.00006
+//MK6_82mm_AIR_FRICTION == -0.0001
+
+if (_airFriction != 0) then {
+ _muzzleVelocity = [_muzzleVelocity, _temperature, _airDensity] call FUNC(calculateMuzzleVelocity);
+};
+private _maxResults = [_muzzleVelocity, _airFriction] call FUNC(calculateMaxAngle);
+
+private _testShot = [_maxResults select 0, _targetHeight, _muzzleVelocity, _airFriction, _crossWind, _tailWind, _temperature, _airDensity] call FUNC(simulateShot);
+if (_testShot select 1 < _targetDistance) exitWith {
+ //No way we can hit it so don't bother;
+ [-1, -1, -1]
+};
+
+private _useDistance = _targetDistance;
+private _useAngle = 0;
+private _resultDistance = 0;
+private _xDeviation = 0;
+private _tof = 0;
+
+while {abs(_resultDistance - _targetDistance) > 0.5} do {
+ TRACE_7("callExtension:artillery:simulate_find_solution",_useDistance,_targetHeight,_muzzleVelocity,_airFriction,_higharc,DEFAULT_MIN_ELEV,DEFAULT_MAX_ELEV);
+ (
+ "ace" callExtension ["artillery:simulate_find_solution", [_useDistance, _targetHeight, _muzzleVelocity, _airFriction, _higharc, DEFAULT_MIN_ELEV, DEFAULT_MAX_ELEV]]
+ ) params ["_data", "_code"];
+ TRACE_1("",_code);
+ (parseSimpleArray _data) params ["", "_useAngleRad", ""];
+ _useAngle = deg(_useAngleRad) * DEGTOMILS;
+
+ private _shotResults = [_useAngle, _targetHeight, _muzzleVelocity, _airFriction, _crossWind, _tailWind, _temperature, _airDensity] call FUNC(simulateShot);
+
+ _xDeviation = _shotResults select 0;
+ _resultDistance = _shotResults select 1;
+ _tof = _shotResults select 2;
+ _useDistance = (2 * _targetDistance) - _resultDistance;
+};
+
+private _angleOffsetDeg = _xDeviation atan2 _resultDistance;
+private _angleOffset = _angleOffsetDeg * DEGTOMILS;
+
+[_useAngle, -_angleOffset, _tof]
diff --git a/addons/artillerytables/functions/fnc_calculateMaxAngle.sqf b/addons/artillerytables/functions/fnc_calculateMaxAngle.sqf
new file mode 100644
index 00000000000..9866ec4b28e
--- /dev/null
+++ b/addons/artillerytables/functions/fnc_calculateMaxAngle.sqf
@@ -0,0 +1,28 @@
+#include "..\script_component.hpp"
+/*
+ * Author: LorenLuke
+ * Calculates the best possible angle to shoot farthest based on muzzle velocity and air friction.
+ *
+ * Arguments:
+ * 0: Initial Muzzle Velocity; meters/second
+ * 1: Air Friction; meters^-1 (m/s^2)/(m^2/s^2)
+ *
+ * Return Values:
+ * 1: Best Angle; Milliradians
+ * 2: Furthest Distance; Meters
+ *
+ * Example:
+ * [200, -0.00006] call ace_artilleryTables_fnc_calculateMaxAngle
+ *
+ * Public: No
+ */
+
+params ["_muzzleVelocity", "_airFriction"];
+
+TRACE_2("callExtension:artillery:find_max_angle",_muzzleVelocity,_airFriction);
+(
+ "ace" callExtension ["artillery:find_max_angle", [_muzzleVelocity, _airFriction]]
+) params ["_data", "_code"];
+TRACE_1("",_code);
+(parseSimpleArray _data) params ["_bestAngle", "_bestDistance"];
+[deg _bestAngle * 6400 / 360, _bestDistance] // return
diff --git a/addons/artillerytables/functions/fnc_calculateMuzzleVelocity.sqf b/addons/artillerytables/functions/fnc_calculateMuzzleVelocity.sqf
new file mode 100644
index 00000000000..6f00f74c148
--- /dev/null
+++ b/addons/artillerytables/functions/fnc_calculateMuzzleVelocity.sqf
@@ -0,0 +1,28 @@
+#include "..\script_component.hpp"
+/*
+ * Author: LorenLuke
+ * Calculates the muzzleVelocity change with advanced calculations.
+ *
+ * Arguments:
+ * 0: Initial Muzzle velocity; meters/second
+ * 1: Temperature; degrees Celsius
+ * 2: Atmospheric Density; kg/(meters^3)
+ *
+ * Return Value:
+ * Adjusted Muzzle Velocity; Meters
+ *
+ * Example:
+ * [200, 15, 1.225] call ace_artilleryTables_fnc_calculateMuzzleVelocity
+ *
+ * Public: No
+ */
+
+params ["_muzzleVelocity", "_temperature", "_airDensity"];
+
+// Calculate air density
+private _relativeDensity = _airDensity / 1.225;
+private _newMuzzleVelocityCoefficient = (((_temperature + 273.13) / 288.13 - 1) / 40 + 1);
+
+private _newMuzzleVelocity = _muzzleVelocity * _newMuzzleVelocityCoefficient;
+
+_newMuzzleVelocity
diff --git a/addons/artillerytables/functions/fnc_calculateSolution.sqf b/addons/artillerytables/functions/fnc_calculateSolution.sqf
new file mode 100644
index 00000000000..13e798568c4
--- /dev/null
+++ b/addons/artillerytables/functions/fnc_calculateSolution.sqf
@@ -0,0 +1,44 @@
+#include "..\script_component.hpp"
+/*
+ * Author: LorenLuke
+ * Provides fire angle and deflection solutions on a target of set distance and height, including accounting for drag and atmospheric wind conditions.
+ *
+ * Arguments:
+ * 0: Gun Position ASL;
+ * 1: Target Position ASL;
+ * 2: Muzzle Velocity; meters/second
+ * 3: High angle boolean (true is high angle)
+ * 4: Air Friction; meters^-1 [(m/s^2)/(m^2/s^2)]
+ * 5: Temperature; degrees Celsius
+ * 6: Atmospheric Density; kg/(meters^3)
+ * 7: Direction of wind; degrees clockwise from north
+ * 8: Speed of wind; meters/second
+ *
+ * Return Value:
+ * array of returns
+ * 0: Angle of shot; Milliradians
+ * 1: Angle adjust left or right; Milliradians
+ * 2: Time of flight; seconds
+ *
+ * Example:
+ * [myPos, targetPos, 200, true, -0.0001, 15, 1.225, 225, 5] call ace_artilleryTables_fnc_calculateSolution
+ *
+ * Public: No
+ */
+
+params ["_ownPos", "_targetPos", "_muzzleVelocity", ["_highAngle", true], ["_airFriction", 0], ["_temperature", 15], ["_airDensity", 1.225], ["_windDir", 0], ["_windSpeed", 0]];
+
+//DEFAULT_AIR_FRICTION == -0.00006
+//MK6_82mm_AIR_FRICTION == -0.0001
+
+private _relPos = _targetPos vectorDiff _ownPos;
+
+private _targetDir = (_relpos select 0) atan2 (_relPos select 1);
+private _targetDist = sqrt( (_relPos select 0)^2 + (_relpos select 1)^2 );
+private _heightDif = _relPos select 2;
+private _crossWind = sin(_targetDir - _windDir) * _windSpeed;
+private _tailWind = -cos(_targetDir - _windDir) * _windSpeed;
+
+private _solutionReturns = [_targetDist, _heightDif, _muzzleVelocity, _highAngle, _airFriction, _crossWind, _tailWind, _temperature, _airDensity] call FUNC(calculateElevation);
+
+_solutionReturns
diff --git a/addons/artillerytables/functions/fnc_rangeTableOpen.sqf b/addons/artillerytables/functions/fnc_rangeTableOpen.sqf
index 508b8c894ce..3984e4dacb9 100644
--- a/addons/artillerytables/functions/fnc_rangeTableOpen.sqf
+++ b/addons/artillerytables/functions/fnc_rangeTableOpen.sqf
@@ -34,7 +34,7 @@ TRACE_2("created dialog",_dialog,_ctrlChargeList);
// Get Mags:
private _mags = [_weaponName] call CBA_fnc_compatibleMagazines;
-if (_mags isEqualTo []) exitWith {WARNING_1("No Mags",_weaponName);};
+if (_mags isEqualTo []) exitWith {WARNING_1("No Mags %1",_weaponName);};
private _magCfg = configFile >> "CfgMagazines";
private _magParamsArray = [];
_mags = _mags apply {
diff --git a/addons/artillerytables/functions/fnc_rangeTableUpdate.sqf b/addons/artillerytables/functions/fnc_rangeTableUpdate.sqf
index 3e50f9d7ad2..4cce2499cf4 100644
--- a/addons/artillerytables/functions/fnc_rangeTableUpdate.sqf
+++ b/addons/artillerytables/functions/fnc_rangeTableUpdate.sqf
@@ -34,31 +34,12 @@ _ctrlElevationLow ctrlSetTextColor ([[1,1,1,1],[0.25,0.25,0.25,1]] select GVAR(l
lnbClear _ctrlRangeTable;
// Call extension with current data and start workers
-TRACE_5("callExtension:start",_muzzleVelocity,_airFriction,_elevMin,_elevMax,GVAR(lastElevationMode));
-private _ret = "ace_artillerytables" callExtension ["start", [_muzzleVelocity,_airFriction,_elevMin,_elevMax,GVAR(lastElevationMode)]];
-TRACE_1("",_ret);
-
-// Non-blocking read data out of extension as it becomes availiable
-[{
- private _dialog = uiNamespace getVariable [QGVAR(rangeTableDialog), displayNull];
- private _ctrlRangeTable = _dialog displayCtrl IDC_TABLE;
- if (isNull _dialog) exitWith {true};
-
- private _status = 1; // 1 = data on line, 2 - data not ready, 3 - done
- while {_status == 1} do {
- private _ret = ("ace_artillerytables" callExtension ["getline", []]);
- // TRACE_1("callExtension:getline",_ret);
- _status = _ret select 1;
- if (_status == 1) then { _ctrlRangeTable lnbAddRow parseSimpleArray (_ret select 0) };
- };
-
- (_status == 3) // exit loop when all data read
-}, {
- // put dummy line at end because scrolling is problematic and can't see last line
- private _dialog = uiNamespace getVariable [QGVAR(rangeTableDialog), displayNull];
- private _ctrlRangeTable = _dialog displayCtrl IDC_TABLE;
- if (isNull _dialog) exitWith {TRACE_1("dialog closed",_this);};
-
- _ctrlRangeTable lnbAddRow ["", "", "", "", "", "", "", "", "", "", ""];
- TRACE_1("table filled",_ctrlRangeTable);
-}, []] call CBA_fnc_waitUntilAndExecute;
+TRACE_5("callExtension:artillery:calculate_table",_muzzleVelocity,_airFriction,_elevMin,_elevMax,GVAR(lastElevationMode));
+(
+ "ace" callExtension ["artillery:calculate_table", [_muzzleVelocity, _airFriction, _elevMin, _elevMax, GVAR(lastElevationMode)]]
+) params ["_data", "_code"];
+TRACE_1("",_code);
+
+GVAR(tableData) = createHashMap;
+GVAR(tableSizeActual) = (parseSimpleArray _data) select 1;
+GVAR(tableSizeReceived) = 0;
diff --git a/addons/artillerytables/functions/fnc_simulateShot.sqf b/addons/artillerytables/functions/fnc_simulateShot.sqf
new file mode 100644
index 00000000000..be747e862ae
--- /dev/null
+++ b/addons/artillerytables/functions/fnc_simulateShot.sqf
@@ -0,0 +1,47 @@
+#include "..\script_component.hpp"
+/*
+ * Author: LorenLuke
+ * Simulates an indirect shot on a target of known height with given drag, wind, and atmospheric conditions
+ *
+ * Arguments:
+ * 0: Gun Elevation Angle; milliradians
+ * 1: Relative Target Height; meters, relative to gun altitude (positive means target higher than gun)
+ * 2: Muzzle Velocity; meters/second
+ * 3: Air Friction; meters^-1 [(m/s^2)/(m^2/s^2)]
+ * 4: Cross wind; meters/second (negative is Right to Left)
+ * 5: Tail wind; meters/second (negative is flying against the wind)
+ * 6: Temperature; degrees Celsius
+ * 7: Atmospheric Density; kg/(meters^3)
+ *
+ * Return Value:
+ * array of returns
+ * 0: Deflection Adjustment To Hit; Milliradians (negative is Left)
+ * 1: Distance of Shot; meters
+ * 2: Time of Flight; seconds
+ *
+ * Example:
+ * [900, 10, 200, -0.0001, 4, 0, 15, 1.225] call ace_artilleryTables_fnc_simulateShot
+ *
+ * Public: No
+ */
+
+params ["_angle", "_targetHeight", "_muzzleVelocity", ["_airFriction", 0], ["_crossWind", 0], ["_tailWind", 0], ["_temperature", 15], ["_atmosphericDensity", 1.225]];
+
+//DEFAULT_AIR_FRICTION == -0.00006
+//MK6_82mm_AIR_FRICTION == -0.0001
+
+if (_airFriction != 0) then {
+ _muzzleVelocity = [_muzzleVelocity, _temperature, _atmosphericDensity] call FUNC(calculateMuzzleVelocity);
+};
+
+private _atmosphericDensityRatio = _atmosphericDensity / 1.225;
+private _radAngle = rad(_angle / DEGTOMILS);
+
+TRACE_8("callExtension:artillery:simulate_shot",_radAngle,_targetHeight,_muzzleVelocity,_airFriction,_crossWind,_tailWind,_temperature,_atmosphericDensityRatio);
+(
+ "ace" callExtension ["artillery:simulate_shot", [_radAngle, _targetHeight, _muzzleVelocity, _airFriction, _crossWind, _tailWind, _temperature, _atmosphericDensityRatio]]
+) params ["_data", "_code"];
+TRACE_1("",_code);
+
+//[xDeviation, yDistance, timeOfFlight]
+parseSimpleArray _data
diff --git a/addons/artillerytables/functions/fnc_turretPFEH.sqf b/addons/artillerytables/functions/fnc_turretPFEH.sqf
index 9ad10de1aa8..5e4e6c94657 100644
--- a/addons/artillerytables/functions/fnc_turretPFEH.sqf
+++ b/addons/artillerytables/functions/fnc_turretPFEH.sqf
@@ -30,7 +30,10 @@ if (isNull (uiNamespace getVariable [QGVAR(display), displayNull])) then {
};
private _ctrlGroup = (uiNamespace getVariable [QGVAR(display), displayNull]) displayCtrl 1000;
-if (cameraView != "GUNNER") exitWith { // need to be in gunner mode, so we can check where the optics are aiming at
+
+// Need to be in gunner mode, so we can check where the optics are aiming at
+// However, if there are no optics, ignore the above
+if (!_invalidGunnerMem && {cameraView != "GUNNER"}) exitWith {
_ctrlGroup ctrlShow false;
};
_ctrlGroup ctrlShow true;
@@ -40,7 +43,7 @@ BEGIN_COUNTER(pfeh);
private _currentFireMode = (weaponState [_vehicle, _turret]) select 2;
private _currentChargeMode = _fireModes find _currentFireMode;
-private _lookVector = (AGLtoASL (positionCameraToWorld [0,0,0])) vectorFromTo (AGLtoASL (positionCameraToWorld [0,0,1]));
+private _lookVector = (AGLToASL (positionCameraToWorld [0,0,0])) vectorFromTo (AGLToASL (positionCameraToWorld [0,0,1]));
private _weaponDir = _vehicle weaponDirection (currentWeapon _vehicle);
// Calc real azimuth/elevation
@@ -48,7 +51,7 @@ private _weaponDir = _vehicle weaponDirection (currentWeapon _vehicle);
private _display = uiNamespace getVariable ["ACE_dlgArtillery", displayNull];
private _useRealWeaponDir = if ((isNull (_display displayCtrl 173)) || {(_vehicle ammo (currentWeapon _vehicle)) == 0}) then {
// With no ammo, distance display will be empty, but gun will still fire at wonky angle if aimed at ground
- private _testSeekerPosASL = AGLtoASL (positionCameraToWorld [0,0,0]);
+ private _testSeekerPosASL = AGLToASL (positionCameraToWorld [0,0,0]);
private _testPoint = _testSeekerPosASL vectorAdd (_lookVector vectorMultiply viewDistance);
!((terrainIntersectASL [_testSeekerPosASL, _testPoint]) || {lineIntersects [_testSeekerPosASL, _testPoint, _vehicle]});
} else {
@@ -81,8 +84,8 @@ private _ctrlCharge = (uiNamespace getVariable [QGVAR(display), displayNull]) di
private _ctrlAzimuth = (uiNamespace getVariable [QGVAR(display), displayNull]) displayCtrl IDC_AZIMUTH;
private _ctrlElevation = (uiNamespace getVariable [QGVAR(display), displayNull]) displayCtrl IDC_ELEVATION;
-_ctrlAzimuth ctrlSetText Format ["AZ: %1", [DEGTOMILS * _realAzimuth, 4, 0] call CBA_fnc_formatNumber];
-_ctrlElevation ctrlSetText Format ["EL: %1", [DEGTOMILS * _realElevation, 4, 0] call CBA_fnc_formatNumber];
+_ctrlAzimuth ctrlSetText format ["AZ: %1", [DEGTOMILS * _realAzimuth, 4, 0] call CBA_fnc_formatNumber];
+_ctrlElevation ctrlSetText format ["EL: %1", [DEGTOMILS * _realElevation, 4, 0] call CBA_fnc_formatNumber];
_ctrlCharge ctrlSetText format ["CH: %1", _currentChargeMode];
// avalible for other addons (mk6)
diff --git a/addons/artillerytables/script_component.hpp b/addons/artillerytables/script_component.hpp
index 128c3c17ff1..a2303b2a762 100644
--- a/addons/artillerytables/script_component.hpp
+++ b/addons/artillerytables/script_component.hpp
@@ -12,6 +12,10 @@
// This is a good fit for most large artillery, but a little low for lighter mortars
#define DEFAULT_AIR_FRICTION -0.00006
+#define DEFAULT_MIN_ELEV 0
+// 90 degrees in radians
+#define DEFAULT_MAX_ELEV 1.5708
+
#define DEGTOMILS 17.7777778
#define IDC_MODECONTROLGROUP 1000
diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp
index 6196346c575..33b8c8036a0 100644
--- a/addons/atragmx/RscTitles.hpp
+++ b/addons/atragmx/RscTitles.hpp
@@ -157,8 +157,8 @@ class ATragMX_Display {
SizeEX="0.025";
idc=720000;
style=48;
- x="0.55*safezoneW+safezoneX-0.256";
- y="0.265*safezoneH+safezoneY-0.1";
+ 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};
@@ -167,8 +167,8 @@ class ATragMX_Display {
};
class POWER: ATragMX_RscButton {
idc=-1;
- x="0.55*safezoneW+safezoneX+0.145";
- y="0.265*safezoneH+safezoneY+0.94";
+ 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};
@@ -177,26 +177,26 @@ class ATragMX_Display {
class BACK: POWER {
idc=-1;
w="0.06";
- x="0.55*safezoneW+safezoneX+0.3122";
+ 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";
+ 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";
+ 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};
@@ -204,13 +204,13 @@ class ATragMX_Display {
};
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";
+ 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};
@@ -218,50 +218,50 @@ class ATragMX_Display {
};
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";
+ 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";
+ 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";
+ 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";
+ x="0.550*safeZoneW+safeZoneX+0.11";
+ y="0.265*safeZoneH+safeZoneY+0.20";
w="0.18";
h="0.03";
style=ST_LEFT;
@@ -271,8 +271,8 @@ class ATragMX_Display {
class TEXT_D: ATragMX_RscButton {
idc=600;
w="0.0231";
- x="0.550*safezoneW+safezoneX+0.29";
- y="0.265*safezoneH+safezoneY+0.20";
+ 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";
+ 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";
@@ -305,8 +305,8 @@ 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";
+ 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";
+ 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";
+ 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";
+ 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";
+ 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,103 +429,103 @@ 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";
+ 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";
+ 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";
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 {
@@ -534,67 +534,67 @@ class ATragMX_Display {
sizeEx="0.025";
w="0.065";
h="0.032";
- x="0.550*safezoneW+safezoneX+0.17";
- y="0.265*safezoneH+safezoneY+0.50";
+ 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";
+ 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";
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));
};
@@ -602,7 +602,7 @@ class ATragMX_Display {
idc=2000;
style=ST_CENTER;
w="0.06";
- x="0.550*safezoneW+safezoneX+0.205";
+ x="0.550*safeZoneW+safeZoneX+0.205";
colorBackground[]={0,0,0,0};
text="TMOA";
action=QUOTE(call FUNC(cycle_scope_unit));
@@ -611,14 +611,14 @@ class ATragMX_Display {
idc=2001;
style=ST_CENTER;
w="0.025";
- x="0.550*safezoneW+safezoneX+0.27";
+ 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,8 +627,8 @@ 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";
+ x="0.550*safeZoneW+safeZoneX+0.105";
+ y="0.265*safeZoneH+safeZoneY+0.17";
w="0.3";
h="0.535";
offsetPressedX="0.0";
@@ -640,8 +640,8 @@ class ATragMX_Display {
style=0;
w="0.17";
h="0.28";
- x="0.550*safezoneW+safezoneX+0.225";
- y="0.265*safezoneH+safezoneY+0.355";
+ 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));
};
@@ -653,8 +653,8 @@ 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";
+ 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,7 +662,7 @@ 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));
};
@@ -670,24 +670,24 @@ class ATragMX_Display {
idc=5003;
style=ST_LEFT;
w="0.07";
- x="0.550*safezoneW+safezoneX+0.11";
- y="0.265*safezoneH+safezoneY+0.24";
+ 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));
};
@@ -698,8 +698,8 @@ class ATragMX_Display {
idcRight=50062;
w="0.285";
h="0.42";
- x="0.550*safezoneW+safezoneX+0.11";
- y="0.265*safezoneH+safezoneY+0.27";
+ x="0.550*safeZoneW+safeZoneX+0.11";
+ y="0.265*safeZoneH+safeZoneY+0.27";
};
class TEXT_GUN_LIST_OUTPUT: ATragMX_RscListNBox {
@@ -707,8 +707,8 @@ class ATragMX_Display {
columns[]={-0.05};
w="0.16";
h="0.45";
- x="0.550*safezoneW+safezoneX+0.11";
- y="0.265*safezoneH+safezoneY+0.24";
+ 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};
@@ -724,8 +724,8 @@ class ATragMX_Display {
idc=6002;
style=ST_RIGHT;
w="0.115";
- x="0.550*safezoneW+safezoneX+0.28";
- y="0.265*safezoneH+safezoneY+0.20";
+ 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";
@@ -734,30 +734,30 @@ class ATragMX_Display {
};
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));
};
@@ -766,8 +766,8 @@ class ATragMX_Display {
idc=7000;
style="16+0x200";
lineSpacing=1.0;
- x="0.550*safezoneW+safezoneX+0.11";
- y="0.265*safezoneH+safezoneY+0.24";
+ x="0.550*safeZoneW+safeZoneX+0.11";
+ y="0.265*safeZoneH+safeZoneY+0.24";
w="0.29";
h="0.10";
sizeEx="0.022";
@@ -776,8 +776,8 @@ class ATragMX_Display {
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";
+ x="0.550*safeZoneW+safeZoneX+0.115";
+ y="0.265*safeZoneH+safeZoneY+0.35";
w="0.12";
h="0.03";
sizeEx="0.027";
@@ -786,8 +786,8 @@ class ATragMX_Display {
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";
+ 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,73 +795,73 @@ 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";
+ 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";
+ 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";
+ 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";
+ 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));
};
@@ -869,15 +869,15 @@ class ATragMX_Display {
idc=7016;
style=ST_LEFT;
w="0.07";
- x="0.550*safezoneW+safezoneX+0.32";
+ 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";
+ 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 {
@@ -937,14 +937,14 @@ 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";
+ 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));
};
@@ -981,16 +981,16 @@ class ATragMX_Display {
idc=9000;
w="0.285";
h="0.49";
- x="0.550*safezoneW+safezoneX+0.11";
- y="0.265*safezoneH+safezoneY+0.2";
+ 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";
+ x="0.550*safeZoneW+safeZoneX+0.22";
+ y="0.265*safeZoneH+safeZoneY+0.51";
w="0.08";
h="0.09";
style=ST_CENTER;
@@ -1002,8 +1002,8 @@ class ATragMX_Display {
style=ST_CENTER;
w="0.07";
h="0.04";
- x="0.550*safezoneW+safezoneX+0.225";
- y="0.265*safezoneH+safezoneY+0.60";
+ 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 {
@@ -1057,8 +1057,8 @@ class ATragMX_Display {
style=ST_LEFT;
w="0.25";
h="0.04";
- x="0.550*safezoneW+safezoneX+0.12";
- y="0.265*safezoneH+safezoneY+0.24";
+ x="0.550*safeZoneW+safeZoneX+0.12";
+ y="0.265*safeZoneH+safeZoneY+0.24";
sizeEx="0.025";
text="New Gun Name";
};
@@ -1067,8 +1067,8 @@ class ATragMX_Display {
style=ST_LEFT;
w="0.225";
h="0.04";
- x="0.550*safezoneW+safezoneX+0.12";
- y="0.265*safezoneH+safezoneY+0.28";
+ 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));
@@ -1078,8 +1078,8 @@ class ATragMX_Display {
style=ST_CENTER;
w="0.1";
h="0.04";
- x="0.550*safezoneW+safezoneX+0.12";
- y="0.265*safezoneH+safezoneY+0.33";
+ 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,7 +1087,7 @@ 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));
};
@@ -1095,74 +1095,74 @@ class ATragMX_Display {
class TEXT_GUN_AMMO_DATA_BORE_HEIGHT: TEXT_BORE_HEIGHT {
idc=12000;
w="0.22";
- y="0.265*safezoneH+safezoneY+0.28";
+ 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";
+ 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";
+ 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 {
@@ -1183,62 +1183,62 @@ 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";
+ 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";
+ 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;
@@ -1259,36 +1259,36 @@ class ATragMX_Display {
style=64;
w="0.14";
h="0.07";
- x="0.550*safezoneW+safezoneX+0.235";
- y="0.265*safezoneH+safezoneY+0.29";
+ 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";
+ 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";
+ 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";
+ y="0.265*safeZoneH+safeZoneY+0.360";
text="Wind Speed (m/s)";
};
class TEXT_TARGET_DATA_WIND_SPEED_1: TEXT_TARGET_DATA_LATITUDE {
@@ -1297,40 +1297,40 @@ class ATragMX_Display {
w="0.05";
h="0.03";
sizeEx="0.025";
- x="0.550*safezoneW+safezoneX+0.270";
- y="0.265*safezoneH+safezoneY+0.357";
+ 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";
+ 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";
+ 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";
+ y="0.265*safeZoneH+safeZoneY+0.440";
text="Inclination Angle";
};
class TEXT_TARGET_DATA_INCLINATION_ANGLE_COSINE: TEXT_TARGET_DATA_LATITUDE {
@@ -1339,62 +1339,62 @@ class ATragMX_Display {
w="0.05";
h="0.03";
sizeEx="0.025";
- x="0.550*safezoneW+safezoneX+0.270";
- y="0.265*safezoneH+safezoneY+0.437";
+ 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";
+ 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";
+ 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";
+ 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";
+ 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 {
@@ -1417,45 +1417,45 @@ class ATragMX_Display {
style=64;
w="0.25";
h="0.07";
- x="0.550*safezoneW+safezoneX+0.13";
- y="0.265*safezoneH+safezoneY+0.32";
+ 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";
+ 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));
};
@@ -1464,53 +1464,53 @@ class ATragMX_Display {
style=64;
w="0.25";
h="0.07";
- x="0.550*safezoneW+safezoneX+0.13";
- y="0.265*safezoneH+safezoneY+0.42";
+ 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";
+ 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";
+ 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";
+ x="0.550*safeZoneW+safeZoneX+0.215";
sizeEx="0.022";
text="Muzzle velocity";
};
@@ -1518,73 +1518,73 @@ class ATragMX_Display {
idc=160021;
w="0.082";
h="0.035";
- x="0.550*safezoneW+safezoneX+0.128";
- y="0.265*safezoneH+safezoneY+0.29";
+ 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";
+ 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="";
};
@@ -1606,14 +1606,14 @@ 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";
+ 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";
+ x="0.550*safeZoneW+safeZoneX+0.235";
sizeEx="0.022";
text="BC-Coef";
};
@@ -1621,75 +1621,75 @@ class ATragMX_Display {
idc=170021;
w="0.082";
h="0.035";
- x="0.550*safezoneW+safezoneX+0.128";
- y="0.265*safezoneH+safezoneY+0.29";
+ 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";
+ 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";
+ y="0.265*safeZoneH+safeZoneY+0.4175";
text="Clear";
action=QUOTE(call FUNC(clear_c1_ballistic_coefficient_data));
};
@@ -1711,8 +1711,8 @@ 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";
+ x="0.550*safeZoneW+safeZoneX+0.115";
+ y="0.265*safeZoneH+safeZoneY+0.220";
w="0.135";
h="0.03";
sizeEx="0.025";
@@ -1721,29 +1721,29 @@ class ATragMX_Display {
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";
+ 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";
+ 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 {
@@ -1752,31 +1752,31 @@ class ATragMX_Display {
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";
+ 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";
+ 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));
};
@@ -1785,56 +1785,56 @@ class ATragMX_Display {
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";
+ 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";
+ 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";
+ 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/config.cpp b/addons/atragmx/config.cpp
index 125d4a488e0..9b02aba4919 100644
--- a/addons/atragmx/config.cpp
+++ b/addons/atragmx/config.cpp
@@ -6,7 +6,7 @@ class CfgPatches {
units[] = {"ACE_Item_ATragMX"};
weapons[] = {"ACE_ATragMX"};
requiredVersion = REQUIRED_VERSION;
- requiredAddons[] = {"ACE_Advanced_Ballistics", "ACE_common", "ACE_weather"};
+ requiredAddons[] = {"ace_advanced_ballistics", "ace_common", "ace_weather"};
author = ECSTRING(common,ACETeam);
authors[] = {"Ruthberg"};
url = ECSTRING(main,URL);
diff --git a/addons/atragmx/functions/fnc_calculate_distance_at_velocity.sqf b/addons/atragmx/functions/fnc_calculate_distance_at_velocity.sqf
index 9fe18a258d6..e667d22e75e 100644
--- a/addons/atragmx/functions/fnc_calculate_distance_at_velocity.sqf
+++ b/addons/atragmx/functions/fnc_calculate_distance_at_velocity.sqf
@@ -30,9 +30,16 @@ while {_velocity > _thresholdVelocity} do {
private _bc = GVAR(targetSolutionInput) select 14;
private _dragModel = GVAR(targetSolutionInput) select 15;
private _temperature = GVAR(targetSolutionInput) select 5;
- private _drag = parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3:%4", _dragModel, _bc, _velocity, _temperature]));
_distance = _distance + _velocity * __DELTA_T;
- _velocity = _velocity - (_drag * __DELTA_T);
+ private _data = (
+ "ace" callExtension ["ballistics:retard", [
+ _dragModel,
+ _bc,
+ _velocity,
+ _temperature
+ ]]
+ ) select 0;
+ _velocity = _velocity - ((parseNumber _data) * __DELTA_T);
};
_distance
diff --git a/addons/atragmx/functions/fnc_calculate_solution.sqf b/addons/atragmx/functions/fnc_calculate_solution.sqf
index 7efc25ebbf4..e910017f2fc 100644
--- a/addons/atragmx/functions/fnc_calculate_solution.sqf
+++ b/addons/atragmx/functions/fnc_calculate_solution.sqf
@@ -90,7 +90,14 @@ private _wind1 = [cos(270 - _windDirection * 30) * _windSpeed1, sin(270 - _windD
private _wind2 = [cos(270 - _windDirection * 30) * _windSpeed2, sin(270 - _windDirection * 30) * _windSpeed2, 0];
private _windDrift = 0;
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
- _bc = parseNumber(("ace_advanced_ballistics" callExtension format["atmosphericCorrection:%1:%2:%3:%4:%5", _bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel]));
+ _bc = parseNumber (("ace" callExtension ["ballistics:atmospheric_correction", [
+ _bc,
+ _temperature,
+ _barometricPressure,
+ _relativeHumidity,
+ _atmosphereModel
+ ]]
+ ) select 0);
};
private _eoetvoesMultiplier = 0;
@@ -103,8 +110,8 @@ _bulletPos set [1, 0];
_bulletPos set [2, -(_boreHeight / 100)];
_bulletVelocity set [0, 0];
-_bulletVelocity set [1, Cos(_scopeBaseAngle) * _muzzleVelocity];
-_bulletVelocity set [2, Sin(_scopeBaseAngle) * _muzzleVelocity];
+_bulletVelocity set [1, cos(_scopeBaseAngle) * _muzzleVelocity];
+_bulletVelocity set [2, sin(_scopeBaseAngle) * _muzzleVelocity];
while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do {
_bulletSpeed = vectorMagnitude _bulletVelocity;
@@ -113,8 +120,15 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do {
_trueSpeed = vectorMagnitude _trueVelocity;
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
- private _drag = parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3:%4", _dragModel, _bc, _trueSpeed, _temperature]));
- _bulletAccel = (vectorNormalized _trueVelocity) vectorMultiply (-1 * _drag);
+ private _data = (
+ "ace" callExtension ["ballistics:retard", [
+ _dragModel,
+ _bc,
+ _trueSpeed,
+ _temperature
+ ]]
+ ) select 0;
+ _bulletAccel = (vectorNormalized _trueVelocity) vectorMultiply (-1 * (parseNumber _data));
} else {
_bulletAccel = _trueVelocity vectorMultiply (_trueSpeed * _airFriction);
};
@@ -139,9 +153,9 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do {
_windage1 = - atan(_tx / _trueRange);
_windDrift = (_wind2 select 0) * (_TOF - _trueRange / _muzzleVelocity);
_windage2 = - atan(_windDrift / _trueRange);
- _lead = (_targetSpeed * _TOF) / (Tan(MRAD_TO_DEG(1)) * _trueRange);
+ _lead = (_targetSpeed * _TOF) / (tan(MRAD_TO_DEG(1)) * _trueRange);
};
- _kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2));
+ private _kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2));
_kineticEnergy = _kineticEnergy * 0.737562149;
if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (_bulletPos select 1) > 0) then {
@@ -174,10 +188,10 @@ if (_targetRange != 0) then {
_windage1 = - atan(_tx / _targetRange);
_windDrift = (_wind2 select 0) * (_TOF - _targetRange / _muzzleVelocity);
_windage2 = - atan(_windDrift / _targetRange);
- _lead = (_targetSpeed * _TOF) / (Tan(MRAD_TO_DEG(1)) * _targetRange);
+ _lead = (_targetSpeed * _TOF) / (tan(MRAD_TO_DEG(1)) * _targetRange);
};
-_kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2));
+private _kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2));
_kineticEnergy = _kineticEnergy * 0.737562149;
if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (_bulletPos select 1) > 0) then {
diff --git a/addons/atragmx/functions/fnc_calculate_target_range_assist.sqf b/addons/atragmx/functions/fnc_calculate_target_range_assist.sqf
index dc9c62c3fc5..5ad543ccc94 100644
--- a/addons/atragmx/functions/fnc_calculate_target_range_assist.sqf
+++ b/addons/atragmx/functions/fnc_calculate_target_range_assist.sqf
@@ -68,7 +68,7 @@ switch (_this) do {
};
};
- ctrlSetText [7010, Str(Round(_targetSize * 100) / 100)];
+ ctrlSetText [7010, str(round(_targetSize * 100) / 100)];
};
case 1: {
if (_estRange > 0) then {
@@ -87,13 +87,13 @@ switch (_this) do {
};
};
- ctrlSetText [7011, Str(Round(_imageSize * 100) / 100)];
+ ctrlSetText [7011, str(round(_imageSize * 100) / 100)];
};
case 2: {
if (tan(_imageSize) != 0) then {
_estRange = _targetSize / tan(_imageSize);
};
- ctrlSetText [7013, Str(Round(_estRange))];
+ ctrlSetText [7013, str(round(_estRange))];
};
};
diff --git a/addons/atragmx/functions/fnc_calculate_target_speed_assist.sqf b/addons/atragmx/functions/fnc_calculate_target_speed_assist.sqf
index 69af9eba165..25106c794e9 100644
--- a/addons/atragmx/functions/fnc_calculate_target_speed_assist.sqf
+++ b/addons/atragmx/functions/fnc_calculate_target_speed_assist.sqf
@@ -44,4 +44,4 @@ if (GVAR(currentUnit) != 2) then {
_estSpeed = _estSpeed * 2.23693629;
};
-ctrlSetText [8007, Str(Round(_estSpeed * 10) / 10)];
+ctrlSetText [8007, str(round(_estSpeed * 10) / 10)];
diff --git a/addons/atragmx/functions/fnc_calculate_truing_drop.sqf b/addons/atragmx/functions/fnc_calculate_truing_drop.sqf
index 5191848d050..5f7adee2838 100644
--- a/addons/atragmx/functions/fnc_calculate_truing_drop.sqf
+++ b/addons/atragmx/functions/fnc_calculate_truing_drop.sqf
@@ -29,8 +29,8 @@ if (_parseInput) then {
_transonicRange = _transonicRange * 0.9144;
_subsonicRange = _subsonicRange * 0.9144;
};
- _transonicRange = Round(_transonicRange);
- _subsonicRange = Round(_subsonicRange);
+ _transonicRange = round(_transonicRange);
+ _subsonicRange = round(_subsonicRange);
_subsonicRange = _transonicRange max _subsonicRange;
@@ -54,8 +54,8 @@ if (_parseInput) then {
_subsonicDrop = _subsonicDrop / 1.047;
};
};
- _transonicDrop = Round(_transonicDrop * 100) / 100;
- _subsonicDrop = Round(_subsonicDrop * 100) / 100;
+ _transonicDrop = round(_transonicDrop * 100) / 100;
+ _subsonicDrop = round(_subsonicDrop * 100) / 100;
_subsonicDrop = _transonicDrop max _subsonicDrop;
};
@@ -67,11 +67,11 @@ if ((GVAR(truingDropDropData) select 0) == 0 || {[_transonicRange, _subsonicRang
private _solutionInput = +GVAR(targetSolutionInput);
if (_transonicRange == 0) then {
- _transonicRange = Round(403 call FUNC(calculate_distance_at_velocity));
+ _transonicRange = round(403 call FUNC(calculate_distance_at_velocity));
};
_solutionInput set [13, _transonicRange];
private _result1 = _solutionInput call FUNC(calculate_solution);
- _transonicDrop = Round((_result1 select 0) * 100) / 100;
+ _transonicDrop = round((_result1 select 0) * 100) / 100;
GVAR(truingDropRangeData) set [0, _transonicRange];
GVAR(truingDropDropData) set [1, _transonicDrop];
GVAR(truingDropReferenceDropData) set [0, _transonicDrop];
@@ -84,11 +84,11 @@ if ((GVAR(truingDropDropData) select 0) == 0 || {[_transonicRange, _subsonicRang
} else {
_subsonicRange = _subsonicRange + 200 * 1.0936133;
};
- _subsonicRange = Round(_subsonicRange);
+ _subsonicRange = round(_subsonicRange);
};
_solutionInput set [13, _subsonicRange];
private _result2 = _solutionInput call FUNC(calculate_solution);
- _subsonicDrop = Round((_result2 select 0) * 100) / 100;
+ _subsonicDrop = round((_result2 select 0) * 100) / 100;
GVAR(truingDropRangeData) set [1, _subsonicRange];
GVAR(truingDropDropData) set [2, _subsonicDrop];
GVAR(truingDropReferenceDropData) set [1, _subsonicDrop];
diff --git a/addons/atragmx/functions/fnc_parse_input.sqf b/addons/atragmx/functions/fnc_parse_input.sqf
index 1c3ea3398a5..4f62f301160 100644
--- a/addons/atragmx/functions/fnc_parse_input.sqf
+++ b/addons/atragmx/functions/fnc_parse_input.sqf
@@ -100,11 +100,11 @@ if (GVAR(currentUnit) == 1) then {
_targetRange = 25 max _targetRange min 3700;
};
GVAR(targetRangeDirtyFlag) = GVAR(targetRangeDirtyFlag) || {_targetRange != GVAR(targetRange) select GVAR(currentTarget)};
-GVAR(latitude) set [GVAR(currentTarget), -90 max Round(parseNumber(ctrlText 140000)) min 90];
-GVAR(directionOfFire) set [GVAR(currentTarget), 0 max abs(Round(parseNumber(ctrlText 140010))) min 359];
+GVAR(latitude) set [GVAR(currentTarget), -90 max round(parseNumber(ctrlText 140000)) min 90];
+GVAR(directionOfFire) set [GVAR(currentTarget), 0 max abs(round(parseNumber(ctrlText 140010))) min 359];
GVAR(windSpeed1) set [GVAR(currentTarget), _windSpeed1];
GVAR(windSpeed2) set [GVAR(currentTarget), _windSpeed2];
-GVAR(windDirection) set [GVAR(currentTarget), 1 max Round(parseNumber(ctrlText 140030)) min 12];
+GVAR(windDirection) set [GVAR(currentTarget), 1 max round(parseNumber(ctrlText 140030)) min 12];
GVAR(targetSpeed) set [GVAR(currentTarget), _targetSpeed];
GVAR(targetRange) set [GVAR(currentTarget), _targetRange];
private _inclinationAngleCosine = 0.5 max parseNumber(ctrlText 140041) min 1;
@@ -112,7 +112,7 @@ private _inclinationAngleDegree = -60 max round(parseNumber(ctrlText 140040)) mi
if (_inclinationAngleDegree != GVAR(inclinationAngle) select GVAR(currentTarget)) then {
GVAR(inclinationAngle) set [GVAR(currentTarget), _inclinationAngleDegree];
} else {
- if (_inclinationAngleCosine != Round(cos(GVAR(inclinationAngle) select GVAR(currentTarget)) * 100) / 100) then {
+ if (_inclinationAngleCosine != round(cos(GVAR(inclinationAngle) select GVAR(currentTarget)) * 100) / 100) then {
GVAR(inclinationAngle) set [GVAR(currentTarget), round(acos(_inclinationAngleCosine))];
};
};
diff --git a/addons/atragmx/functions/fnc_recalculate_muzzle_velocity.sqf b/addons/atragmx/functions/fnc_recalculate_muzzle_velocity.sqf
index f7e4709cc11..0d5c83ae01c 100644
--- a/addons/atragmx/functions/fnc_recalculate_muzzle_velocity.sqf
+++ b/addons/atragmx/functions/fnc_recalculate_muzzle_velocity.sqf
@@ -45,7 +45,7 @@ for "_index" from 1 to (_lookupTableSize - 1) do {
(_lookupTable select _lowerIndex) params ["_lowerDistance", "_lowerMuzzleVelocity"];
(_lookupTable select _upperIndex) params ["_upperDistance", "_upperMuzzleVelocity"];
-_muzzleVelocity = 100 max (linearConversion [_lowerDistance, _upperDistance, GVAR(temperature), _lowerMuzzleVelocity, _upperMuzzleVelocity]) min 1400;
+private _muzzleVelocity = 100 max (linearConversion [_lowerDistance, _upperDistance, GVAR(temperature), _lowerMuzzleVelocity, _upperMuzzleVelocity]) min 1400;
if (_muzzleVelocity != GVAR(workingMemory) select 1) then {
GVAR(workingMemory) set [1, _muzzleVelocity];
diff --git a/addons/atragmx/functions/fnc_show_range_card_setup.sqf b/addons/atragmx/functions/fnc_show_range_card_setup.sqf
index 15558ceb983..a4301f5b761 100644
--- a/addons/atragmx/functions/fnc_show_range_card_setup.sqf
+++ b/addons/atragmx/functions/fnc_show_range_card_setup.sqf
@@ -22,7 +22,7 @@ GVAR(showRangeCardSetup) = _this;
if (_this) then {
ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 10006);
- ctrlSetText [10003, Str(Round(GVAR(rangeCardStartRange)))];
- ctrlSetText [10004, Str(Round(GVAR(rangeCardEndRange)))];
- ctrlSetText [10005, Str(Round(GVAR(rangeCardIncrement)))];
+ ctrlSetText [10003, str(round(GVAR(rangeCardStartRange)))];
+ ctrlSetText [10004, str(round(GVAR(rangeCardEndRange)))];
+ ctrlSetText [10005, str(round(GVAR(rangeCardIncrement)))];
};
diff --git a/addons/atragmx/functions/fnc_show_target_range_assist.sqf b/addons/atragmx/functions/fnc_show_target_range_assist.sqf
index 83516ef5c6a..b13352d22f9 100644
--- a/addons/atragmx/functions/fnc_show_target_range_assist.sqf
+++ b/addons/atragmx/functions/fnc_show_target_range_assist.sqf
@@ -21,8 +21,8 @@ GVAR(showTargetRangeAssist) = _this;
if (_this) then {
ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 7018);
- ctrlSetText [7012, Str(parseNumber(ctrlText 320))];
- ctrlSetText [7013, Str(parseNumber(ctrlText 340))];
+ ctrlSetText [7012, str(parseNumber(ctrlText 320))];
+ ctrlSetText [7013, str(parseNumber(ctrlText 340))];
if (GVAR(currentUnit) == 1) then {
ctrlSetText [7016, "Yards"];
diff --git a/addons/atragmx/functions/fnc_show_target_speed_assist.sqf b/addons/atragmx/functions/fnc_show_target_speed_assist.sqf
index 3efa6ed6d43..c2b34bd9081 100644
--- a/addons/atragmx/functions/fnc_show_target_speed_assist.sqf
+++ b/addons/atragmx/functions/fnc_show_target_speed_assist.sqf
@@ -22,7 +22,7 @@ GVAR(showTargetSpeedAssist) = _this;
if (_this) then {
ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 8012);
- ctrlSetText [8004, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))];
+ ctrlSetText [8004, str(round((GVAR(targetRange) select GVAR(currentTarget))))];
if (GVAR(currentUnit) == 1) then {
ctrlSetText [8008, "Yards"];
diff --git a/addons/atragmx/functions/fnc_show_truing_drop.sqf b/addons/atragmx/functions/fnc_show_truing_drop.sqf
index 5e7f60f4d4e..f75d3f7758c 100644
--- a/addons/atragmx/functions/fnc_show_truing_drop.sqf
+++ b/addons/atragmx/functions/fnc_show_truing_drop.sqf
@@ -21,9 +21,9 @@ GVAR(showTruingDrop) = _this;
if (_this) then {
if (GVAR(currentUnit) == 2) then {
- ctrlSetText [18000, format["ZR=%1meters", Round(GVAR(workingMemory) select 2)]];
+ ctrlSetText [18000, format["ZR=%1meters", round(GVAR(workingMemory) select 2)]];
} else {
- ctrlSetText [18000, format["ZR=%1yards", Round((GVAR(workingMemory) select 2) * 1.0936133)]];
+ ctrlSetText [18000, format["ZR=%1yards", round((GVAR(workingMemory) select 2) * 1.0936133)]];
};
private _dropUnit = GVAR(currentScopeUnit);
if (_dropUnit == 3) then {
diff --git a/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf b/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf
index 5408edee3af..40c0ac7cd8f 100644
--- a/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf
+++ b/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf
@@ -29,7 +29,7 @@ if !(ctrlVisible 9000) then {
if !(GVAR(speedAssistTimer)) exitWith {
GVAR(speedAssistTimer) = true;
- ctrlSetText [8006, Str(Round((CBA_missionTime - _startTime) * 10) / 10)];
+ ctrlSetText [8006, str(round((CBA_missionTime - _startTime) * 10) / 10)];
[] call FUNC(calculate_target_speed_assist);
@@ -39,7 +39,7 @@ if !(ctrlVisible 9000) then {
[_this select 1] call CBA_fnc_removePerFrameHandler;
};
- ctrlSetText [9001, Str(Round((CBA_missionTime - _startTime) * 10) / 10)];
+ ctrlSetText [9001, str(round((CBA_missionTime - _startTime) * 10) / 10)];
}, 0.1, [CBA_missionTime]] call CBA_fnc_addPerFrameHandler;
};
diff --git a/addons/atragmx/functions/fnc_toggle_range_card_setup.sqf b/addons/atragmx/functions/fnc_toggle_range_card_setup.sqf
index 5c499b8b826..29c856013b4 100644
--- a/addons/atragmx/functions/fnc_toggle_range_card_setup.sqf
+++ b/addons/atragmx/functions/fnc_toggle_range_card_setup.sqf
@@ -20,9 +20,9 @@ if (ctrlVisible 10000) then {
true call FUNC(show_range_card);
if (_this == 1) then {
- GVAR(rangeCardStartRange) = 0 max Round(parseNumber(ctrlText 10003)) min 3000;
- GVAR(rangeCardEndRange) = 0 max Round(parseNumber(ctrlText 10004)) min 3000;
- GVAR(rangeCardIncrement) = 1 max Round(parseNumber(ctrlText 10005)) min 3000;
+ GVAR(rangeCardStartRange) = 0 max round(parseNumber(ctrlText 10003)) min 3000;
+ GVAR(rangeCardEndRange) = 0 max round(parseNumber(ctrlText 10004)) min 3000;
+ GVAR(rangeCardIncrement) = 1 max round(parseNumber(ctrlText 10005)) min 3000;
[] call FUNC(calculate_range_card);
[] call FUNC(update_range_card);
diff --git a/addons/atragmx/functions/fnc_toggle_target_range_assist.sqf b/addons/atragmx/functions/fnc_toggle_target_range_assist.sqf
index 1e6c485e995..dd14f2ddcd0 100644
--- a/addons/atragmx/functions/fnc_toggle_target_range_assist.sqf
+++ b/addons/atragmx/functions/fnc_toggle_target_range_assist.sqf
@@ -20,10 +20,10 @@ if (ctrlVisible 7000) then {
true call FUNC(show_main_page);
if (_this == 1) then {
- ctrlSetText [320, Str(parseNumber(ctrlText 7012))];
- ctrlSetText [140040, Str(parseNumber(ctrlText 7012))];
- ctrlSetText [340, Str(parseNumber(ctrlText 7013))];
- ctrlSetText [140060, Str(parseNumber(ctrlText 7013))];
+ ctrlSetText [320, str(parseNumber(ctrlText 7012))];
+ ctrlSetText [140040, str(parseNumber(ctrlText 7012))];
+ ctrlSetText [340, str(parseNumber(ctrlText 7013))];
+ ctrlSetText [140060, str(parseNumber(ctrlText 7013))];
[] call FUNC(calculate_target_solution);
};
} else {
diff --git a/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf b/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf
index 009074105e8..fec9e528e57 100644
--- a/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf
+++ b/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf
@@ -23,8 +23,8 @@ if (ctrlVisible 8000) then {
[] call FUNC(calculate_target_speed_assist);
private _targetSpeed = parseNumber(ctrlText 8007);
if (_targetSpeed != 0) then {
- ctrlSetText [330, Str(_targetSpeed)];
- ctrlSetText [140050, Str(_targetSpeed)];
+ ctrlSetText [330, str(_targetSpeed)];
+ ctrlSetText [140050, str(_targetSpeed)];
[] call FUNC(calculate_target_solution);
};
};
diff --git a/addons/atragmx/functions/fnc_true_c1_ballistic_coefficient.sqf b/addons/atragmx/functions/fnc_true_c1_ballistic_coefficient.sqf
index 84371ca8527..06824cc7a20 100644
--- a/addons/atragmx/functions/fnc_true_c1_ballistic_coefficient.sqf
+++ b/addons/atragmx/functions/fnc_true_c1_ballistic_coefficient.sqf
@@ -18,7 +18,7 @@
private _referenceDrop = GVAR(truingDropDropData) select 0;
private _actualDrop = GVAR(truingDropDropData) select 2;
-if (Round(_actualDrop * 10) / 10 == Round(_referenceDrop * 10) / 10) exitWith {};
+if (round(_actualDrop * 10) / 10 == round(_referenceDrop * 10) / 10) exitWith {};
private _step = 0.01;
if (_actualDrop > _referenceDrop) then {
diff --git a/addons/atragmx/functions/fnc_true_muzzle_velocity.sqf b/addons/atragmx/functions/fnc_true_muzzle_velocity.sqf
index f8fb9e621c4..75e1fbdc78d 100644
--- a/addons/atragmx/functions/fnc_true_muzzle_velocity.sqf
+++ b/addons/atragmx/functions/fnc_true_muzzle_velocity.sqf
@@ -18,7 +18,7 @@
private _referenceDrop = GVAR(truingDropDropData) select 0;
private _actualDrop = GVAR(truingDropDropData) select 1;
-if (Round(_actualDrop * 10) / 10 == Round(_referenceDrop * 10) / 10) exitWith {};
+if (round(_actualDrop * 10) / 10 == round(_referenceDrop * 10) / 10) exitWith {};
private _step = 10;
if (_actualDrop > _referenceDrop) then {
diff --git a/addons/atragmx/functions/fnc_update_atmo_env_data.sqf b/addons/atragmx/functions/fnc_update_atmo_env_data.sqf
index 340924b5aa7..3118bee2233 100644
--- a/addons/atragmx/functions/fnc_update_atmo_env_data.sqf
+++ b/addons/atragmx/functions/fnc_update_atmo_env_data.sqf
@@ -18,20 +18,20 @@
ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 13007);
if (GVAR(currentUnit) == 2) then {
- ctrlSetText [130040, Str(Round(GVAR(temperature) * 10) / 10)];
+ ctrlSetText [130040, str(round(GVAR(temperature) * 10) / 10)];
} else {
- ctrlSetText [130040, Str(Round((GVAR(temperature) * 1.8 + 32) * 10) / 10)];
+ ctrlSetText [130040, str(round((GVAR(temperature) * 1.8 + 32) * 10) / 10)];
};
if (GVAR(currentUnit) == 2) then {
- ctrlSetText [130050, Str(Round(GVAR(barometricPressure)))];
+ ctrlSetText [130050, str(round(GVAR(barometricPressure)))];
} else {
- ctrlSetText [130050, Str(Round(GVAR(barometricPressure) / 33.8638866667 * 100) / 100)];
+ ctrlSetText [130050, str(round(GVAR(barometricPressure) / 33.8638866667 * 100) / 100)];
};
-ctrlSetText [130060, Str(Round(GVAR(relativeHumidity) * 100 * 10) / 10)];
+ctrlSetText [130060, str(round(GVAR(relativeHumidity) * 100 * 10) / 10)];
if (GVAR(currentUnit) == 2) then {
- ctrlSetText [130030, Str(Round(GVAR(altitude)))];
+ ctrlSetText [130030, str(round(GVAR(altitude)))];
} else {
- ctrlSetText [130030, Str(Round(GVAR(altitude) * 3.2808399))];
+ ctrlSetText [130030, str(round(GVAR(altitude) * 3.2808399))];
};
if (GVAR(currentUnit) == 2) then {
diff --git a/addons/atragmx/functions/fnc_update_atmosphere.sqf b/addons/atragmx/functions/fnc_update_atmosphere.sqf
index 7d523158925..ac04d19ba9a 100644
--- a/addons/atragmx/functions/fnc_update_atmosphere.sqf
+++ b/addons/atragmx/functions/fnc_update_atmosphere.sqf
@@ -16,18 +16,18 @@
*/
if (GVAR(currentUnit) == 2) then {
- ctrlSetText [200, Str(Round(GVAR(temperature) * 10) / 10)];
+ ctrlSetText [200, str(round(GVAR(temperature) * 10) / 10)];
} else {
- ctrlSetText [200, Str(Round((GVAR(temperature) * 1.8 + 32) * 10) / 10)];
+ ctrlSetText [200, str(round((GVAR(temperature) * 1.8 + 32) * 10) / 10)];
};
if (GVAR(currentUnit) == 2) then {
- ctrlSetText [210, Str(Round(GVAR(barometricPressure)))];
+ ctrlSetText [210, str(round(GVAR(barometricPressure)))];
} else {
- ctrlSetText [210, Str(Round(GVAR(barometricPressure) / 33.8638866667 * 100) / 100)];
+ ctrlSetText [210, str(round(GVAR(barometricPressure) / 33.8638866667 * 100) / 100)];
};
-ctrlSetText [220, Str(Round(GVAR(relativeHumidity) * 100 * 10) / 10)];
+ctrlSetText [220, str(round(GVAR(relativeHumidity) * 100 * 10) / 10)];
if (GVAR(currentUnit) == 2) then {
- ctrlSetText [230, Str(Round(GVAR(altitude)))];
+ ctrlSetText [230, str(round(GVAR(altitude)))];
} else {
- ctrlSetText [230, Str(Round(GVAR(altitude) * 3.2808399))];
+ ctrlSetText [230, str(round(GVAR(altitude) * 3.2808399))];
};
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 4c0c6d7175b..886ad33ba97 100644
--- a/addons/atragmx/functions/fnc_update_c1_ballistic_coefficient_data.sqf
+++ b/addons/atragmx/functions/fnc_update_c1_ballistic_coefficient_data.sqf
@@ -17,9 +17,9 @@
// Distances
if (GVAR(currentUnit) != 1) then {
- {ctrlSetText [_x, Str(Round(((GVAR(workingMemory) select 19) select _forEachIndex) select 0))]} forEach [170021, 170022, 170023, 170024, 170025, 170026, 170027];
+ {ctrlSetText [_x, str(round(((GVAR(workingMemory) select 19) select _forEachIndex) select 0))]} forEach [170021, 170022, 170023, 170024, 170025, 170026, 170027];
} else {
- {ctrlSetText [_x, Str(Round((((GVAR(workingMemory) select 19) select _forEachIndex) select 0) * 1.0936133))]} forEach [170021, 170022, 170023, 170024, 170025, 170026, 170027];
+ {ctrlSetText [_x, str(round((((GVAR(workingMemory) select 19) select _forEachIndex) select 0) * 1.0936133))]} forEach [170021, 170022, 170023, 170024, 170025, 170026, 170027];
};
// Ballistic coefficients
-{ctrlSetText [_x, Str(Round((((GVAR(workingMemory) select 19) select _forEachIndex) select 1) * 1000) / 1000)]} forEach [170031, 170032, 170033, 170034, 170035, 170036, 170037];
+{ctrlSetText [_x, str(round((((GVAR(workingMemory) select 19) select _forEachIndex) select 1) * 1000) / 1000)]} forEach [170031, 170032, 170033, 170034, 170035, 170036, 170037];
diff --git a/addons/atragmx/functions/fnc_update_gun.sqf b/addons/atragmx/functions/fnc_update_gun.sqf
index 5a5dab00fa8..67f726e92e6 100644
--- a/addons/atragmx/functions/fnc_update_gun.sqf
+++ b/addons/atragmx/functions/fnc_update_gun.sqf
@@ -17,34 +17,34 @@
ctrlSetText [1000, GVAR(workingMemory) select 0];
if (GVAR(currentUnit) != 2) then {
- ctrlSetText [100, Str(Round((GVAR(workingMemory) select 5) / 2.54 * 100) / 100)];
+ ctrlSetText [100, str(round((GVAR(workingMemory) select 5) / 2.54 * 100) / 100)];
} else {
- ctrlSetText [100, Str(Round((GVAR(workingMemory) select 5) * 100) / 100)];
+ ctrlSetText [100, str(round((GVAR(workingMemory) select 5) * 100) / 100)];
};
if (GVAR(currentUnit) != 2) then {
- ctrlSetText [110, Str(Round((GVAR(workingMemory) select 12) * 15.4323584))];
+ ctrlSetText [110, str(round((GVAR(workingMemory) select 12) * 15.4323584))];
} else {
- ctrlSetText [110, Str(Round((GVAR(workingMemory) select 12) * 10) / 10)];
+ ctrlSetText [110, str(round((GVAR(workingMemory) select 12) * 10) / 10)];
};
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
- ctrlSetText [120, Str(Round((GVAR(workingMemory) select 15) * 1000) / 1000)];
+ ctrlSetText [120, str(round((GVAR(workingMemory) select 15) * 1000) / 1000)];
} else {
- ctrlSetText [120, Str(Round((GVAR(workingMemory) select 4) * -1000 * 1000) / 1000)];
+ ctrlSetText [120, str(round((GVAR(workingMemory) select 4) * -1000 * 1000) / 1000)];
};
if (GVAR(currentUnit) != 2) then {
- ctrlSetText [130, Str(Round((GVAR(workingMemory) select 1) * 3.2808399))];
+ ctrlSetText [130, str(round((GVAR(workingMemory) select 1) * 3.2808399))];
} else {
- ctrlSetText [130, Str(Round(GVAR(workingMemory) select 1))];
+ ctrlSetText [130, str(round(GVAR(workingMemory) select 1))];
};
switch (GVAR(currentUnit)) do {
case 0: {
- ctrlSetText [140, format["*%1", Round(GVAR(workingMemory) select 2)]];
+ ctrlSetText [140, format["*%1", round(GVAR(workingMemory) select 2)]];
};
case 1: {
- ctrlSetText [140, Str(Round((GVAR(workingMemory) select 2) * 1.0936133))];
+ ctrlSetText [140, str(round((GVAR(workingMemory) select 2) * 1.0936133))];
};
case 2: {
- ctrlSetText [140, Str(Round(GVAR(workingMemory) select 2))];
+ ctrlSetText [140, str(round(GVAR(workingMemory) select 2))];
};
};
[] call FUNC(update_scope_unit);
diff --git a/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf b/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf
index 59bd0149733..56347ac6db6 100644
--- a/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf
+++ b/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf
@@ -18,39 +18,39 @@
ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 12008);
if (GVAR(currentUnit) != 2) then {
- ctrlSetText [120000, Str(Round((GVAR(workingMemory) select 5) / 2.54 * 100) / 100)];
+ ctrlSetText [120000, str(round((GVAR(workingMemory) select 5) / 2.54 * 100) / 100)];
} else {
- ctrlSetText [120000, Str(Round((GVAR(workingMemory) select 5) * 100) / 100)];
+ ctrlSetText [120000, str(round((GVAR(workingMemory) select 5) * 100) / 100)];
};
if (GVAR(currentUnit) != 2) then {
- ctrlSetText [120010, Str(Round((GVAR(workingMemory) select 12) * 15.4323584))];
+ ctrlSetText [120010, str(round((GVAR(workingMemory) select 12) * 15.4323584))];
} else {
- ctrlSetText [120010, Str(Round((GVAR(workingMemory) select 12) * 10) / 10)];
+ ctrlSetText [120010, str(round((GVAR(workingMemory) select 12) * 10) / 10)];
};
if (GVAR(currentUnit) != 2) then {
- ctrlSetText [120020, Str(Round((GVAR(workingMemory) select 13) / 10 / 2.54 * 1000) / 1000)];
+ ctrlSetText [120020, str(round((GVAR(workingMemory) select 13) / 10 / 2.54 * 1000) / 1000)];
} else {
- ctrlSetText [120020, Str(Round((GVAR(workingMemory) select 13) / 10 * 1000) / 1000)];
+ ctrlSetText [120020, str(round((GVAR(workingMemory) select 13) / 10 * 1000) / 1000)];
};
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
- ctrlSetText [120030, Str(Round((GVAR(workingMemory) select 15) * 1000) / 1000)];
+ ctrlSetText [120030, str(round((GVAR(workingMemory) select 15) * 1000) / 1000)];
} else {
- ctrlSetText [120030, Str(Round((GVAR(workingMemory) select 4) * -1000 * 1000) / 1000)];
+ ctrlSetText [120030, str(round((GVAR(workingMemory) select 4) * -1000 * 1000) / 1000)];
};
if (GVAR(currentUnit) != 2) then {
- ctrlSetText [120040, Str(Round((GVAR(workingMemory) select 14) / 2.54 * 10) / 10)];
+ ctrlSetText [120040, str(round((GVAR(workingMemory) select 14) / 2.54 * 10) / 10)];
} else {
- ctrlSetText [120040, Str(Round((GVAR(workingMemory) select 14) * 100) / 100)];
+ ctrlSetText [120040, str(round((GVAR(workingMemory) select 14) * 100) / 100)];
};
if (GVAR(currentUnit) != 2) then {
- ctrlSetText [120050, Str(Round((GVAR(workingMemory) select 1) * 3.2808399))];
+ ctrlSetText [120050, str(round((GVAR(workingMemory) select 1) * 3.2808399))];
} else {
- ctrlSetText [120050, Str(Round(GVAR(workingMemory) select 1))];
+ ctrlSetText [120050, str(round(GVAR(workingMemory) select 1))];
};
if (GVAR(currentUnit) == 1) then {
- ctrlSetText [120060, Str(Round((GVAR(workingMemory) select 2) * 1.0936133))];
+ ctrlSetText [120060, str(round((GVAR(workingMemory) select 2) * 1.0936133))];
} else {
- ctrlSetText [120060, Str(Round(GVAR(workingMemory) select 2))];
+ ctrlSetText [120060, str(round(GVAR(workingMemory) select 2))];
};
if (GVAR(currentUnit) == 0) then {
ctrlSetText [120061, "*"];
diff --git a/addons/atragmx/functions/fnc_update_inclination_angle.sqf b/addons/atragmx/functions/fnc_update_inclination_angle.sqf
index 532b3d94e8f..b7ae40160c6 100644
--- a/addons/atragmx/functions/fnc_update_inclination_angle.sqf
+++ b/addons/atragmx/functions/fnc_update_inclination_angle.sqf
@@ -19,7 +19,7 @@ private _inclinationAngleCosine = 0.5 max parseNumber(ctrlText 140041) min 1;
private _inclinationAngleDegree = -60 max parseNumber(ctrlText 140040) min 60;
if (_this == 0) then {
- ctrlSetText [140040, Str(round(acos(_inclinationAngleCosine)))];
+ ctrlSetText [140040, str(round(acos(_inclinationAngleCosine)))];
} else {
- ctrlSetText [140041, Str(round(cos(_inclinationAngleDegree) * 100) / 100)];
+ ctrlSetText [140041, str(round(cos(_inclinationAngleDegree) * 100) / 100)];
};
diff --git a/addons/atragmx/functions/fnc_update_muzzle_velocity_data.sqf b/addons/atragmx/functions/fnc_update_muzzle_velocity_data.sqf
index 23193aa9036..36af09d6427 100644
--- a/addons/atragmx/functions/fnc_update_muzzle_velocity_data.sqf
+++ b/addons/atragmx/functions/fnc_update_muzzle_velocity_data.sqf
@@ -17,12 +17,12 @@
if (GVAR(currentUnit) == 2) then {
// Temperatures
- {ctrlSetText [_x, Str(Round((((GVAR(workingMemory) select 18) select _forEachIndex) select 0) * 10) / 10)]} forEach [160021, 160022, 160023, 160024, 160025, 160026, 160027];
+ {ctrlSetText [_x, str(round((((GVAR(workingMemory) select 18) select _forEachIndex) select 0) * 10) / 10)]} forEach [160021, 160022, 160023, 160024, 160025, 160026, 160027];
// Muzzle velocities
- {ctrlSetText [_x, Str(Round(((GVAR(workingMemory) select 18) select _forEachIndex) select 1))]} forEach [160031, 160032, 160033, 160034, 160035, 160036, 160037];
+ {ctrlSetText [_x, str(round(((GVAR(workingMemory) select 18) select _forEachIndex) select 1))]} forEach [160031, 160032, 160033, 160034, 160035, 160036, 160037];
} else {
// Temperatures
- {ctrlSetText [_x, Str(Round(((((GVAR(workingMemory) select 18) select _forEachIndex) select 0) * 1.8 + 32) * 10) / 10)]} forEach [160021, 160022, 160023, 160024, 160025, 160026, 160027];
+ {ctrlSetText [_x, str(round(((((GVAR(workingMemory) select 18) select _forEachIndex) select 0) * 1.8 + 32) * 10) / 10)]} forEach [160021, 160022, 160023, 160024, 160025, 160026, 160027];
// Muzzle velocities
- {ctrlSetText [_x, Str(Round((((GVAR(workingMemory) select 18) select _forEachIndex) select 1) * 3.2808399))]} forEach [160031, 160032, 160033, 160034, 160035, 160036, 160037];
+ {ctrlSetText [_x, str(round((((GVAR(workingMemory) select 18) select _forEachIndex) select 1) * 3.2808399))]} forEach [160031, 160032, 160033, 160034, 160035, 160036, 160037];
};
diff --git a/addons/atragmx/functions/fnc_update_range_card.sqf b/addons/atragmx/functions/fnc_update_range_card.sqf
index 066bd651746..e280c7d137a 100644
--- a/addons/atragmx/functions/fnc_update_range_card.sqf
+++ b/addons/atragmx/functions/fnc_update_range_card.sqf
@@ -59,16 +59,16 @@ private _speedOfSound = GVAR(temperature) call EFUNC(weather,calculateSpeedOfSou
private _clickNumber = GVAR(workingMemory) select 8;
private _clickInterval = _clickSize / _clickNumber;
- _elevation = Round(_elevation / _clickInterval);
- _windage1 = Round(_windage1 / _clickInterval);
- _windage2 = Round(_windage2 / _clickInterval);
+ _elevation = round(_elevation / _clickInterval);
+ _windage1 = round(_windage1 / _clickInterval);
+ _windage2 = round(_windage2 / _clickInterval);
};
};
- private _elevationOutput = Str(Round(_elevation * 100) / 100);
- private _windageOutput = Str(Round(_windage1 * 100) / 100);
+ private _elevationOutput = str(round(_elevation * 100) / 100);
+ private _windageOutput = str(round(_windage1 * 100) / 100);
- private _rangeOutput = Str(_range);
+ private _rangeOutput = str(_range);
if (_velocity < _speedOfSound) then {
_rangeOutput = _rangeOutput + "*";
};
@@ -80,19 +80,19 @@ private _speedOfSound = GVAR(temperature) call EFUNC(weather,calculateSpeedOfSou
switch (GVAR(rangeCardCurrentColumn)) do {
case 0: {
if (GVAR(showWind2)) then {
- _lastColumnOutput = Str(Round(_windage2 * 100) / 100);
+ _lastColumnOutput = str(round(_windage2 * 100) / 100);
} else {
- _lastColumnOutput = Str(Round(_lead * 100) / 100);
+ _lastColumnOutput = str(round(_lead * 100) / 100);
};
};
case 1: {
- _lastColumnOutput = Str(Round(_velocity));
+ _lastColumnOutput = str(round(_velocity));
};
case 2: {
- _lastColumnOutput = Str(Round(_kineticEnergy));
+ _lastColumnOutput = str(round(_kineticEnergy));
};
case 3: {
- _lastColumnOutput = Str(Round(_TOF * 100) / 100);
+ _lastColumnOutput = str(round(_TOF * 100) / 100);
}
};
diff --git a/addons/atragmx/functions/fnc_update_result.sqf b/addons/atragmx/functions/fnc_update_result.sqf
index cfd8f460a93..3e8d4ef9bd3 100644
--- a/addons/atragmx/functions/fnc_update_result.sqf
+++ b/addons/atragmx/functions/fnc_update_result.sqf
@@ -69,16 +69,16 @@ switch (GVAR(currentScopeUnit)) do {
private _clickNumber = GVAR(workingMemory) select 8;
private _clickInterval = _clickSize / _clickNumber;
- _elevationAbs = Round(_elevationAbs / _clickInterval);
- _windageAbs = Round(_windageAbs / _clickInterval);
+ _elevationAbs = round(_elevationAbs / _clickInterval);
+ _windageAbs = round(_windageAbs / _clickInterval);
- _wind2 = Round(_wind2 / _clickInterval);
+ _wind2 = round(_wind2 / _clickInterval);
- _elevationRel = Round(_elevationRel / _clickInterval);
- _windageRel = Round(_windageRel / _clickInterval);
+ _elevationRel = round(_elevationRel / _clickInterval);
+ _windageRel = round(_windageRel / _clickInterval);
- _elevationCur = Round(_elevationCur / _clickInterval);
- _windageCur = Round(_windageCur / _clickInterval);
+ _elevationCur = round(_elevationCur / _clickInterval);
+ _windageCur = round(_windageCur / _clickInterval);
};
};
@@ -88,7 +88,7 @@ if (GVAR(showWind2)) then {
ctrlSetText [42, "Lead"];
};
-_elevationAbs = Round(_elevationAbs * 100) / 100;
+_elevationAbs = round(_elevationAbs * 100) / 100;
if (_elevationAbs > 0) then {
ctrlSetText [400, str abs _elevationAbs];
} else {
@@ -98,7 +98,7 @@ if (_elevationAbs > 0) then {
ctrlSetText [400, "0.0"];
};
};
-_elevationRel = Round(_elevationRel * 100) / 100;
+_elevationRel = round(_elevationRel * 100) / 100;
if (_elevationRel > 0) then {
ctrlSetText [401, str abs _elevationRel];
} else {
@@ -108,7 +108,7 @@ if (_elevationRel > 0) then {
ctrlSetText [401, "0.0"];
};
};
-_elevationCur = Round(_elevationCur * 100) / 100;
+_elevationCur = round(_elevationCur * 100) / 100;
if (_elevationCur > 0) then {
ctrlSetText [402, str abs _elevationCur];
} else {
@@ -119,7 +119,7 @@ if (_elevationCur > 0) then {
};
};
-_windageAbs = Round(_windageAbs * 100) / 100;
+_windageAbs = round(_windageAbs * 100) / 100;
if (_windageAbs > 0) then {
ctrlSetText [410, format["%1R", abs(_windageAbs)]];
} else {
@@ -129,7 +129,7 @@ if (_windageAbs > 0) then {
ctrlSetText [410, "0.0"];
};
};
-_windageRel = Round(_windageRel * 100) / 100;
+_windageRel = round(_windageRel * 100) / 100;
if (_windageRel > 0) then {
ctrlSetText [411, format["%1R", abs(_windageRel)]];
} else {
@@ -139,7 +139,7 @@ if (_windageRel > 0) then {
ctrlSetText [411, "0.0"];
};
};
-_windageCur = Round(_windageCur * 100) / 100;
+_windageCur = round(_windageCur * 100) / 100;
if (_windageCur > 0) then {
ctrlSetText [412, format["%1R", abs(_windageCur)]];
} else {
@@ -151,7 +151,7 @@ if (_windageCur > 0) then {
};
if (GVAR(showWind2)) then {
- _wind2 = Round(_wind2 * 100) / 100;
+ _wind2 = round(_wind2 * 100) / 100;
if (_wind2 > 0) then {
ctrlSetText [420, format["%1R", abs(_wind2)]];
} else {
@@ -162,7 +162,7 @@ if (GVAR(showWind2)) then {
};
};
} else {
- _lead = Round(_lead * 100) / 100;
+ _lead = round(_lead * 100) / 100;
if (_lead > 0) then {
if ((GVAR(targetSpeedDirection) select GVAR(currentTarget)) == 1) then {
ctrlSetText [420, format["%1R", abs(_lead)]];
diff --git a/addons/atragmx/functions/fnc_update_scope_unit.sqf b/addons/atragmx/functions/fnc_update_scope_unit.sqf
index d1f0e9cf170..e72b490ef03 100644
--- a/addons/atragmx/functions/fnc_update_scope_unit.sqf
+++ b/addons/atragmx/functions/fnc_update_scope_unit.sqf
@@ -16,7 +16,7 @@
*/
ctrlSetText [2000, GVAR(scopeUnits) select GVAR(currentScopeUnit)];
-ctrlSetText [2001, Str(GVAR(currentScopeClickNumber))];
+ctrlSetText [2001, str(GVAR(currentScopeClickNumber))];
if (GVAR(currentScopeUnit) == 3) then {
ctrlSetText [5000, format["Clicks=%1", GVAR(currentScopeClickNumber)]];
diff --git a/addons/atragmx/functions/fnc_update_target.sqf b/addons/atragmx/functions/fnc_update_target.sqf
index a87ba9ba54f..df37e7848e4 100644
--- a/addons/atragmx/functions/fnc_update_target.sqf
+++ b/addons/atragmx/functions/fnc_update_target.sqf
@@ -17,32 +17,32 @@
if (GVAR(showWind2)) then {
if (GVAR(currentUnit) != 2) then {
- ctrlSetText [300, format["%1/%2", Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 2.23693629), Round((GVAR(windSpeed2) select GVAR(currentTarget)) * 2.23693629)]];
+ ctrlSetText [300, format["%1/%2", round((GVAR(windSpeed1) select GVAR(currentTarget)) * 2.23693629), round((GVAR(windSpeed2) select GVAR(currentTarget)) * 2.23693629)]];
} else {
- ctrlSetText [300, format["%1/%2", Round(GVAR(windSpeed1) select GVAR(currentTarget)), Round(GVAR(windSpeed2) select GVAR(currentTarget))]];
+ ctrlSetText [300, format["%1/%2", round(GVAR(windSpeed1) select GVAR(currentTarget)), round(GVAR(windSpeed2) select GVAR(currentTarget))]];
};
} else {
if (GVAR(currentUnit) != 2) then {
- ctrlSetText [300, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)];
+ ctrlSetText [300, str(round((GVAR(windSpeed1) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)];
} else {
- ctrlSetText [300, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)];
+ ctrlSetText [300, str(round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)];
};
};
-ctrlSetText [310, Str(Round((GVAR(windDirection) select GVAR(currentTarget))))];
-ctrlSetText [320, Str(Round((GVAR(inclinationAngle) select GVAR(currentTarget))))];
+ctrlSetText [310, str(round((GVAR(windDirection) select GVAR(currentTarget))))];
+ctrlSetText [320, str(round((GVAR(inclinationAngle) select GVAR(currentTarget))))];
if (GVAR(currentUnit) != 2) then {
- ctrlSetText [330, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)];
+ ctrlSetText [330, str(round((GVAR(targetSpeed) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)];
} else {
- ctrlSetText [330, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)];
+ ctrlSetText [330, str(round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)];
};
switch (GVAR(currentUnit)) do {
case 0: {
- ctrlSetText [340, format["*%1", Round((GVAR(targetRange) select GVAR(currentTarget)))]];
+ ctrlSetText [340, format["*%1", round((GVAR(targetRange) select GVAR(currentTarget)))]];
};
case 1: {
- ctrlSetText [340, Str(Round((GVAR(targetRange) select GVAR(currentTarget)) * 1.0936133))];
+ ctrlSetText [340, str(round((GVAR(targetRange) select GVAR(currentTarget)) * 1.0936133))];
};
case 2: {
- ctrlSetText [340, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))];
+ ctrlSetText [340, str(round((GVAR(targetRange) select GVAR(currentTarget))))];
};
};
diff --git a/addons/atragmx/functions/fnc_update_target_data.sqf b/addons/atragmx/functions/fnc_update_target_data.sqf
index 92b5df50a06..f47d0401ddb 100644
--- a/addons/atragmx/functions/fnc_update_target_data.sqf
+++ b/addons/atragmx/functions/fnc_update_target_data.sqf
@@ -15,22 +15,22 @@
* Public: No
*/
-ctrlSetText [140000, Str(Round((GVAR(latitude) select GVAR(currentTarget)) * 100) / 100)];
-ctrlSetText [140010, Str(Round((GVAR(directionOfFire) select GVAR(currentTarget)) * 100) / 100)];
+ctrlSetText [140000, str(round((GVAR(latitude) select GVAR(currentTarget)) * 100) / 100)];
+ctrlSetText [140010, str(round((GVAR(directionOfFire) select GVAR(currentTarget)) * 100) / 100)];
if (GVAR(currentUnit) != 2) then {
- ctrlSetText [140020, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)];
- ctrlSetText [140021, Str(Round((GVAR(windSpeed2) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)];
+ ctrlSetText [140020, str(round((GVAR(windSpeed1) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)];
+ ctrlSetText [140021, str(round((GVAR(windSpeed2) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)];
} else {
- ctrlSetText [140020, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)];
- ctrlSetText [140021, Str(Round((GVAR(windSpeed2) select GVAR(currentTarget)) * 100) / 100)];
+ ctrlSetText [140020, str(round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)];
+ ctrlSetText [140021, str(round((GVAR(windSpeed2) select GVAR(currentTarget)) * 100) / 100)];
};
-ctrlSetText [140030, Str(Round((GVAR(windDirection) select GVAR(currentTarget))))];
-ctrlSetText [140040, Str(Round((GVAR(inclinationAngle) select GVAR(currentTarget))))];
-ctrlSetText [140041, Str(Round(cos(GVAR(inclinationAngle) select GVAR(currentTarget)) * 100) / 100)];
+ctrlSetText [140030, str(round((GVAR(windDirection) select GVAR(currentTarget))))];
+ctrlSetText [140040, str(round((GVAR(inclinationAngle) select GVAR(currentTarget))))];
+ctrlSetText [140041, str(round(cos(GVAR(inclinationAngle) select GVAR(currentTarget)) * 100) / 100)];
if (GVAR(currentUnit) != 2) then {
- ctrlSetText [140050, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)];
+ ctrlSetText [140050, str(round((GVAR(targetSpeed) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)];
} else {
- ctrlSetText [140050, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)];
+ ctrlSetText [140050, str(round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)];
};
if ((GVAR(targetSpeedDirection) select GVAR(currentTarget)) == 1) then {
ctrlSetText [140051, ">"];
@@ -38,9 +38,9 @@ if ((GVAR(targetSpeedDirection) select GVAR(currentTarget)) == 1) then {
ctrlSetText [140051, "<"];
};
if (GVAR(currentUnit) == 1) then {
- ctrlSetText [140060, Str(Round((GVAR(targetRange) select GVAR(currentTarget)) * 1.0936133))];
+ ctrlSetText [140060, str(round((GVAR(targetRange) select GVAR(currentTarget)) * 1.0936133))];
} else {
- ctrlSetText [140060, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))];
+ ctrlSetText [140060, str(round((GVAR(targetRange) select GVAR(currentTarget))))];
};
if (GVAR(currentUnit) == 0) then {
ctrlSetText [140061, "*"];
diff --git a/addons/atragmx/functions/fnc_update_truing_drop_data.sqf b/addons/atragmx/functions/fnc_update_truing_drop_data.sqf
index ad0f0dda0e8..1180b689cd0 100644
--- a/addons/atragmx/functions/fnc_update_truing_drop_data.sqf
+++ b/addons/atragmx/functions/fnc_update_truing_drop_data.sqf
@@ -16,11 +16,11 @@
*/
if (GVAR(currentUnit) == 2) then {
- ctrlSetText [18011, Str(Round(GVAR(truingDropRangeData) select 0))];
- ctrlSetText [18012, Str(Round(GVAR(truingDropRangeData) select 1))];
+ ctrlSetText [18011, str(round(GVAR(truingDropRangeData) select 0))];
+ ctrlSetText [18012, str(round(GVAR(truingDropRangeData) select 1))];
} else {
- ctrlSetText [18011, Str(Round((GVAR(truingDropRangeData) select 0) * 1.0936133))];
- ctrlSetText [18012, Str(Round((GVAR(truingDropRangeData) select 1) * 1.0936133))];
+ ctrlSetText [18011, str(round((GVAR(truingDropRangeData) select 0) * 1.0936133))];
+ ctrlSetText [18012, str(round((GVAR(truingDropRangeData) select 1) * 1.0936133))];
};
if (GVAR(truingDropMode) == 0) then {
@@ -53,25 +53,25 @@ switch (_dropUnit) do {
};
};
-ctrlSetText [18006, Str(Round((_dropData select 0) * 100) / 100)];
-ctrlSetText [18013, Str(Round((_dropData select 1) * 100) / 100)];
-ctrlSetText [18014, Str(Round((_dropData select 2) * 100) / 100)];
+ctrlSetText [18006, str(round((_dropData select 0) * 100) / 100)];
+ctrlSetText [18013, str(round((_dropData select 1) * 100) / 100)];
+ctrlSetText [18014, str(round((_dropData select 2) * 100) / 100)];
if (GVAR(currentUnit) != 2) then {
- ctrlSetText [18007, Str(Round((GVAR(workingMemory) select 1) * 3.2808399))];
- ctrlSetText [18016, Str(Round((GVAR(workingMemory) select 1) * 3.2808399))];
+ ctrlSetText [18007, str(round((GVAR(workingMemory) select 1) * 3.2808399))];
+ ctrlSetText [18016, str(round((GVAR(workingMemory) select 1) * 3.2808399))];
if (GVAR(truingDropMuzzleVelocity) > 0) then {
- ctrlSetText [18016, Str(Round(GVAR(truingDropMuzzleVelocity) * 3.2808399))];
+ ctrlSetText [18016, str(round(GVAR(truingDropMuzzleVelocity) * 3.2808399))];
};
} else {
- ctrlSetText [18007, Str(Round(GVAR(workingMemory) select 1))];
- ctrlSetText [18016, Str(Round(GVAR(workingMemory) select 1))];
+ ctrlSetText [18007, str(round(GVAR(workingMemory) select 1))];
+ ctrlSetText [18016, str(round(GVAR(workingMemory) select 1))];
if (GVAR(truingDropMuzzleVelocity) > 0) then {
- ctrlSetText [18016, Str(Round(GVAR(truingDropMuzzleVelocity)))];
+ ctrlSetText [18016, str(round(GVAR(truingDropMuzzleVelocity)))];
};
};
-ctrlSetText [18008, Str(Round((GVAR(workingMemory) select 15) * 1000) / 1000)];
-ctrlSetText [18017, Str(Round((GVAR(workingMemory) select 15) * 1000) / 1000)];
+ctrlSetText [18008, str(round((GVAR(workingMemory) select 15) * 1000) / 1000)];
+ctrlSetText [18017, str(round((GVAR(workingMemory) select 15) * 1000) / 1000)];
if (GVAR(truingDropC1) > 0) then {
- ctrlSetText [18017, Str(Round(GVAR(truingDropC1) * 1000) / 1000)];
+ ctrlSetText [18017, str(round(GVAR(truingDropC1) * 1000) / 1000)];
};
diff --git a/addons/atragmx/functions/fnc_update_zero_range.sqf b/addons/atragmx/functions/fnc_update_zero_range.sqf
index 8a3eca13448..d29ad18b688 100644
--- a/addons/atragmx/functions/fnc_update_zero_range.sqf
+++ b/addons/atragmx/functions/fnc_update_zero_range.sqf
@@ -36,11 +36,25 @@ if (!GVAR(atmosphereModeTBH)) then {
};
private _scopeBaseAngle = if !(missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
- private _zeroAngle = "ace_advanced_ballistics" callExtension format ["calcZero:%1:%2:%3:%4", _zeroRange, _muzzleVelocity, _airFriction, _boreHeight];
- (parseNumber _zeroAngle)
+ parseNumber (("ace" callExtension ["ballistics:zero_vanilla", [
+ _zeroRange,
+ _muzzleVelocity,
+ _airFriction,
+ _boreHeight
+ ]]) select 0)
} else {
- private _zeroAngle = "ace_advanced_ballistics" callExtension format ["calcZeroAB:%1:%2:%3:%4:%5:%6:%7:%8:%9", _zeroRange, _muzzleVelocity, _boreHeight, _temperature, _barometricPressure, _relativeHumidity, _bc, _dragModel, _atmosphereModel];
- (parseNumber _zeroAngle)
+ parseNumber (("ace" callExtension ["ballistics:zero_advanced", [
+ _zeroRange,
+ _muzzleVelocity,
+ _airFriction,
+ _boreHeight,
+ _temperature,
+ _barometricPressure,
+ _relativeHumidity,
+ _bc,
+ _dragModel,
+ _atmosphereModel
+ ]]) select 0)
};
GVAR(workingMemory) set [2, _zeroRange];
diff --git a/addons/attach/functions/fnc_attach.sqf b/addons/attach/functions/fnc_attach.sqf
index 6a0c4082711..d1e9f129875 100644
--- a/addons/attach/functions/fnc_attach.sqf
+++ b/addons/attach/functions/fnc_attach.sqf
@@ -50,8 +50,8 @@ if (_unit == _attachToVehicle) then { //Self Attachment
} else {
GVAR(placeAction) = PLACE_WAITING;
- [_unit, "forceWalk", "ACE_Attach", true] call EFUNC(common,statusEffect_set);
- [_unit, "blockThrow", "ACE_Attach", true] call EFUNC(common,statusEffect_set);
+ [_unit, "forceWalk", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
+ [_unit, "blockThrow", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
[{[localize LSTRING(PlaceAction), ""] call EFUNC(interaction,showMouseHint)}, []] call CBA_fnc_execNextFrame;
_unit setVariable [QGVAR(placeActionEH), [_unit, "DefaultAction", {true}, {GVAR(placeAction) = PLACE_APPROVE;}] call EFUNC(common,AddActionEventHandler)];
@@ -88,8 +88,8 @@ if (_unit == _attachToVehicle) then { //Self Attachment
{!([_attachToVehicle, _unit, _itemClassname] call FUNC(canAttach))}) then {
[_idPFH] call CBA_fnc_removePerFrameHandler;
- [_unit, "forceWalk", "ACE_Attach", false] call EFUNC(common,statusEffect_set);
- [_unit, "blockThrow", "ACE_Attach", false] call EFUNC(common,statusEffect_set);
+ [_unit, "forceWalk", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
+ [_unit, "blockThrow", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
[] call EFUNC(interaction,hideMouseHint);
[_unit, "DefaultAction", (_unit getVariable [QGVAR(placeActionEH), -1])] call EFUNC(common,removeActionEventHandler);
_unit removeAction _actionID;
diff --git a/addons/attach/functions/fnc_canDetach.sqf b/addons/attach/functions/fnc_canDetach.sqf
index 7202ba410fc..9b70d35ff4e 100644
--- a/addons/attach/functions/fnc_canDetach.sqf
+++ b/addons/attach/functions/fnc_canDetach.sqf
@@ -32,7 +32,7 @@ private _inRange = false;
_attachedList deleteAt _forEachIndex;
_attachToVehicle setVariable [QGVAR(attached), _attachedList, true];
};
- if (((getPos _unit) distance2d (getPos _xObject)) < 4) exitWith {_inRange = true};
+ if (((getPos _unit) distance2D (getPos _xObject)) < 4) exitWith {_inRange = true};
} forEach _attachedList;
_inRange &&
diff --git a/addons/attach/functions/fnc_detach.sqf b/addons/attach/functions/fnc_detach.sqf
index d953b02bd16..8eab98e0720 100644
--- a/addons/attach/functions/fnc_detach.sqf
+++ b/addons/attach/functions/fnc_detach.sqf
@@ -31,8 +31,8 @@ private _minDistance = 1000;
{
_x params ["_xObject", "_xItemName"];
- if (((getPos _unit) distance2d (getPos _xObject)) < _minDistance) then {
- _minDistance = ((getPos _unit) distance2d (getPos _xObject));
+ if (((getPos _unit) distance2D (getPos _xObject)) < _minDistance) then {
+ _minDistance = ((getPos _unit) distance2D (getPos _xObject));
_attachedObject = _xObject;
_itemName = _xItemName;
_attachedIndex = _forEachIndex;
diff --git a/addons/attach/functions/fnc_placeApprove.sqf b/addons/attach/functions/fnc_placeApprove.sqf
index 2f0c4d6b751..9e9f8effba4 100644
--- a/addons/attach/functions/fnc_placeApprove.sqf
+++ b/addons/attach/functions/fnc_placeApprove.sqf
@@ -48,10 +48,10 @@ while {(_closeInMax - _closeInMin) > 0.01} do {
{
if (_doesIntersect) exitWith {};
private _startingPosShifted = _startingPosition vectorAdd _x;
- private _startASL = if (surfaceIsWater _startingPosShifted) then {_startingPosShifted} else {ATLtoASL _startingPosShifted};
+ private _startASL = if (surfaceIsWater _startingPosShifted) then {_startingPosShifted} else {ATLToASL _startingPosShifted};
{
private _endPosShifted = _endPosTest vectorAdd _x;
- private _endASL = if (surfaceIsWater _startingPosShifted) then {_endPosShifted} else {ATLtoASL _endPosShifted};
+ private _endASL = if (surfaceIsWater _startingPosShifted) then {_endPosShifted} else {ATLToASL _endPosShifted};
#ifdef DRAW_ATTACH_SCAN
[{
diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml
index 71377352338..58d46f0d4f9 100644
--- a/addons/ballistics/stringtable.xml
+++ b/addons/ballistics/stringtable.xml
@@ -256,7 +256,7 @@
Chumbo Grosso #0 Calibre Doze 2 Tiros
12 Калибр 2 патр. #0 Картечь
12 kalibre 2 mermi #0 İrisaçma
- 12 게이지 2발 #00 벅샷
+ 12 게이지 2발 #0 벅샷
12 Gauge 2Rnd #1 Buckshot
@@ -479,7 +479,7 @@
Carregador 6.5x47 mm com 20 cartuchos (HPBT Scenar)
6,5x47 mm 20-lövedékes tár (HPBT Scenar)
6.5x47 mm 20Rnd マガジン (HPBT Scenar)
- 20발 들이 6.5x47mm (HPBT Scenar)
+ 6.5x47mm 20발 들이 탄창 (Scenar제 HPBT)
6.5x47毫米 20發 彈匣 (拉普 空尖艇尾狙擊專用彈)
6.5x47 mm 20发 弹匣(HPBT Scenar)
6.5x47 mm 20Rnd Mag (HPBT Scenar)
@@ -513,7 +513,7 @@
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.5x47mm (HPBT Scenar)<br/>장탄수: 20<br/>사용처: QBU-88
+ 구경: 6.5x47mm (Scenar제 보트 테일 할로우 포인트)<br/>장탄수: 20<br/>사용처: QBU-88
口徑: 6.5x47毫米 (拉普 空尖艇尾狙擊專用彈)<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
@@ -530,7 +530,7 @@
Carregador 6.5 mm com 20 cartuchos Creedmor
6,5 mm Creedmor 20-lövedékes tár
6.5 mm クリードモア 20Rnd マガジン
- 20발 들이 6.5mm 크리드무어 탄창
+ 6.5mm 크리드무어 20발 들이 탄창
6.5毫米 20發 彈匣 (克里德莫爾(CM) 狙擊專用彈)
6.5 mm 20发 弹匣(Creedmor)
6.5 mm Creedmor 20Rnd Mag
@@ -581,7 +581,7 @@
Carregador 5.8 mm com 10 cartuchos DBP88
5,8 mm DBP88 10-lövedékes tár
5.8 mm DBP88 10Rnd マガジン
- 10발 들이 5.8mm DBP88 탄창
+ 5.8mm 10발 들이 탄창 (DBP88)
5.8毫米 10發 彈匣 (DBP88)
5.8 mm 10发 弹匣(DBP88)
5.8 mm DBP88 10Rnd Mag
@@ -633,7 +633,7 @@
Caricatore 6.5 mm 30cp Traccianti IR-DIM
Магазин из 30-ти 6,5 мм ИК-трассирующих
6.5 mm 30Rnd IR-DIM トレーサー ケースレスマガジン
- 30발 들이 6.5mm IR-DIM 예광탄 탄창
+ 6.5mm 30발 들이 탄창 (IR-DIM 예광탄)
6.5毫米 30發 低視度紅外線曳光彈 彈匣
6.5 mm 30发 弹匣(红外曳光)
6.5 mm 30Rnd Tracer IR-DIM Mag
@@ -667,7 +667,7 @@
Calibro: 6.5x39 mm Tracciante 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.5x39mm 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
Kalibre: 6.5x39 mm Tracer IR-DIM<br />Mermi: 30<br />Kullanıyor: MX/C/M/SW/3GL
@@ -684,7 +684,7 @@
Caricatore 6.5 mm 30cp Sil.
Магазин из 30-ти 6,5 мм дозвуковых
6.5 mm 30Rnd 亜音速弾 マガジン
- 30발 들이 6.5mm 아음속탄 탄창
+ 6.5mm 30발 들이 탄창 (아음속탄)
6.5毫米 30發 消音彈 彈匣
6.5 mm 30发 弹匣(亚音速)
6.5 mm 30Rnd SD Mag
@@ -735,7 +735,7 @@
Caricatore 6.5 mm 30cp AP
Магазин из 30-ти 6,5 мм бронебойных
6.5 mm 30Rnd 徹甲弾 マガジン
- 30발 들이 6.5mm 철갑탄 탄창
+ 6.5mm 30발 들이 탄창 (철갑탄)
6.5毫米30發 穿甲彈 彈匣
6.5 mm 30发 弹匣(穿甲)
6.5 mm 30Rnd AP Mag
@@ -787,7 +787,7 @@
Caricatore 6.5 mm 30cp Traccianti IR-DIM
Магазин из 30-ти 6,5 мм ИК-трассирующих
6.5 mm 30Rnd IR-DIM トレーサー マガジン
- 30발 들이 6.5mm IR-DIM 예광탄 탄창
+ 6.5mm 30발 들이 탄창 (IR-DIM 예광탄)
6.5毫米 30發 低視度紅外線曳光彈 彈匣
6.5 mm 30发 弹匣(红外曳光)
6.5 mm 30Rnd Tracer IR-DIM Mag
@@ -821,7 +821,7 @@
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.5x39mm IR-DIM 예광탄<br/>장탄수: 30<br/>사용처: KH-2002
+ 구경: 6.5x39mm IR-DIM 적외선 예광탄<br/>장탄수: 30<br/>사용처: KH-2002
口徑: 6.5x39毫米 低視度紅外線曳光彈<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
@@ -838,7 +838,7 @@
Caricatore 6.5 mm 30cp Sil.
Магазин из 30-ти 6,5 мм дозвуковых
6.5 mm 30Rnd 亜音速弾 マガジン
- 30발 들이 6.5mm 아음속탄 탄창
+ 6.5mm 30발 들이 탄창 (아음속탄)
6.5毫米 30發 消音彈 彈匣
6.5 mm 30发 弹匣(亚音速)
6.5 mm 30Rnd SD Mag
@@ -889,7 +889,7 @@
Caricatore 6.5 mm 30cp AP
Магазин из 30-ти 6,5 мм бронебойных
6.5 mm 30Rnd 徹甲弾 マガジン
- 30발 들이 6.5mm 철갑탄 탄창
+ 6.5mm 30발 들이 탄창 (철갑탄)
6.5毫米 30發 穿甲彈 彈匣
6.5 mm 30发 弹匣(穿甲)
6.5 mm 30Rnd AP Mag
@@ -941,7 +941,7 @@
Caricatore 5.56 mm 30cp Traccianti IR-DIM
Магазин из 30-ти 5,56 мм ИК-трассирующих
5.56mm 30Rnd IR-DIM トレーサー マガジン
- 30발 들이 5.56mm IR-DIM 예광탄 탄창
+ 5.56mm 30발 들이 탄창 (IR-DIM 예광탄)
5.56毫米 30發 低視度紅外線曳光彈 彈匣
5.56 mm 30发 弹匣(红外曳光)
5.56 mm 30rnd Tracer IR-DIM Mag
@@ -975,7 +975,7 @@
Calibro: 5.56x45 mm Tracciante 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/>사용처: CTAR-21, TAR-21/GTAR-21 EGLM, F2000/택티컬/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
Kalibre: 5.56x45 mm Tracer IR-DIM<br />Mermi: 30<br />Kullanıyor: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR
@@ -993,7 +993,7 @@
Caricatore 7.62 mm 20cp Traccianti
Магазин из 20-ти 7,62 мм трассирующих
7.62mm 20Rnd マガジン (トレーサー)
- 20발 들이 7.62mm 예광탄 탄창
+ 7.62mm 20발 들이 탄창 (예광탄)
7.62毫米 20發 曳光彈 彈匣
7.62 mm 20发 弹匣(曳光)
7.62 mm 20Rnd Mag (Tracer)
@@ -1044,7 +1044,7 @@
Caricatore 7.62 mm 20cp Traccianti IR-DIM
Магазин из 20-ти 7,62 мм ИК-трассирующих
7.62mm 20Rnd マガジン (IR-DIM)
- 20발 들이 7.62mm IR-DIM 예광탄 탄창
+ 7.62mm 20발 들이 탄창 (IR-DIM 예광탄)
7.62毫米 20發 低視度紅外線曳光彈 彈匣
7.62 mm 20发 弹匣(红外曳光)
7.62 mm 20Rnd Mag (IR-DIM)
@@ -1095,7 +1095,7 @@
Caricatore 7.62 mm 20cp Sil.
Магазин из 20-ти 7,62 мм дозвуковых
7.62mm 20Rnd マガジン (亜音速弾)
- 20발 들이 7.62mm 아음속탄 탄창
+ 7.62mm 20발 들이 탄창 (아음속탄)
7.62毫米 20發 消音彈 彈匣
7.62 mm 20发 弹匣(亚音速)
7.62 mm 20Rnd Mag (SD)
@@ -1146,7 +1146,7 @@
Caricatore 7.62 mm 10cp Traccianti
Магазин из 10-ти 7,62 мм трассирующих
7.62mm 10Rnd マガジン (トレーサー)
- 10발 들이 7.62mm 예광탄 탄창
+ 7.62mm 10발 들이 탄창 (예광탄)
7.62毫米 10發 曳光彈 彈匣
7.62 mm 10发 弹匣(曳光)
7.62 mm 10Rnd Mag (Tracer)
@@ -1197,7 +1197,7 @@
Caricatore 7.62 mm 10cp Traccianti IR-DIM
Магазин из 10-ти 7,62 мм ИК-трассирующих
7.62mm 10Rnd マガジン (IR-DIM)
- 10발 들이 7.62mm IR-DIM 예광탄 탄창
+ 7.62mm 10발 들이 탄창 (IR-DIM 예광탄)
7.62毫米 10發 低視度紅外線曳光彈 彈匣
7.62 mm 10发 弹匣(红外曳光)
7.62 mm 10Rnd Mag (IR-DIM)
@@ -1231,7 +1231,7 @@
Calibro: 7.62x51 mm Tracciante 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.62x51mm IR-DIM 예광탄<br/>장탄수: 10<br/>사용처: Mk.14 Mod 1 EBR
+ 구경: 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
Kalibre: 7.62x51 mm Tracer IR-DIM<br />Mermi: 10<br />Kullanıyor: Mk18 ABR
@@ -1248,7 +1248,7 @@
Caricatore 7.62 mm 10cp Sil.
Магазин из 10-ти 7,62 мм дозвуковых
7.62mm 10Rnd マガジン (亜音速弾)
- 10발 들이 7.62mm 아음속탄 탄창
+ 7.62mm 10발 들이 탄창 (아음속탄)
7.62毫米 10發 消音彈 彈匣
7.62 mm 10发 弹匣(亚音速)
7.62 mm 10Rnd Mag (SD)
@@ -1300,7 +1300,7 @@
Cinto de munição .338 NM com 130 cartuchos
.338 NM 130-lövedékes nyomkövető heveder
.338 NM 130Rnd トレーサー ベルト
- 130발 들이 .338구경 노르마 매그넘 예광탄 벨트
+ .338구경 노르마 매그넘 130발 들이 벨트 (예광탄)
.338 拉普麥格農(NM) 130發 曳光彈 彈鏈
.338 NM 130发 弹链(曳光)
.338 NM 130Rnd Tracer Belt
@@ -1351,7 +1351,7 @@
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 130Rnd IR-DIM ベルト
- 130발 들이 .338rnrud 노르마 매그넘 IR-DIM 예광탄 벨트
+ .338구경 노르마 매그넘 130발 들이 벨트 (IR-DIM 예광탄)
.338 拉普麥格農(NM) 130發 低視度紅外線曳光彈 彈鏈
.338 NM 130发 弹链(红外曳光)
.338 NM 130Rnd IR-DIM Belt
@@ -1385,7 +1385,7 @@
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구경 노르마 매그넘 IR-DIM 예광탄<br/>장탄수: 130<br/>사용처: LWMMG
+ 구경: .338구경 노르마 매그넘 IR-DIM 적외선 예광탄<br/>장탄수: 130<br/>사용처: LWMMG
口徑: .338 拉普麥格農 低視度紅外線曳光彈<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
@@ -1402,7 +1402,7 @@
Cinto de munição .338 NM com 130 cartuchos AP
.338 NM 130-lövedékes páncéltörő heveder
.338 NM 130Rnd 徹甲弾 ベルト
- 130발 들이 .338구경 노르마 매그넘 철갑탄 벨트
+ .338구경 노르마 매그넘 130발 들이 벨트 (철갑탄)
.338 拉普麥格農(NM) 130發 穿甲彈 彈鏈
.338 NM 130发 弹链(穿甲)
.338 NM 130Rnd AP Belt
@@ -1454,7 +1454,7 @@
Carregador de 10 cartuchos 9.3 mm traçantes
9,3 mm 10-lövedékes nyomkövető tár
9.3mm 10Rnd トレーサー マガジン
- 10발 들이 9.3 mm 예광탄 탄창
+ 9.3mm 10발 들이 탄창 (예광탄)
9.3毫米 10發 曳光彈 彈匣
9.3 mm 10发 弹匣(曳光)
9.3 mm 10Rnd Tracer Mag
@@ -1505,7 +1505,7 @@
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.3mm 10Rnd IR-DIM トレーサー マガジン
- 10발 들이 9.3mm IR-DIM 예광탄 탄창
+ 9.3mm 10발 들이 탄창 (IR-DIM 예광탄)
9.3毫米 10發 低視度紅外線曳光彈 彈匣
9.3 mm 10发 弹匣(红外曳光)
9.3 mm 10Rnd Tracer IR-DIM Mag
@@ -1539,7 +1539,7 @@
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.3x64mm IR-DIM 예광탄<br/>장탄수: 10<br/>사용처: 사이러스
+ 구경: 9.3x64mm IR-DIM 적외선 예광탄<br/>장탄수: 10<br/>사용처: 사이러스
口徑: 9.3x64毫米 低視度紅外線曳光彈<br />發數: 10<br />使用於: Cyrus
口径:9.3x64 mm 红外曳光<br />发数:10<br />使用于:"居鲁士"
Kalibre: 9.3x64 mm Tracer IR-DIM<br />Mermi: 10<br />Kullanıyor: Cyrus
@@ -1557,7 +1557,7 @@
Cinto de munição traçante 9.3 mm com 150 cartuchos
9,3 mm 150-lövedékes nyomkövető heveder
9.3mm 150Rnd トレーサー ベルト
- 150발 들이 9.3mm 예광탄 벨트
+ 9.3mm 150발 들이 벨트 (예광탄)
9.3毫米 150發 曳光彈 彈鏈
9.3 mm 150发 弹链(曳光)
9.3 mm 150Rnd Tracer Belt
@@ -1608,7 +1608,7 @@
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.3mm 150Rnd IR-DIM トレーサー ベルト
- 150발 들이 9.3mm IR-DIM 예광탄 벨트
+ 9.3mm 150발 들이 벨트 (IR-DIM 예광탄)
9.3毫米 150發 低視度紅外線曳光彈 彈鏈
9.3 mm 150发 弹链(红外曳光)
9.3 mm 150Rnd Tracer IR-DIM Belt
@@ -1642,7 +1642,7 @@
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.3x64mm IR-DIM 예광탄<br/>장탄수: 150<br/>사용처: HK121
+ 구경: 9.3x64mm IR-DIM 적외선 예광탄<br/>장탄수: 150<br/>사용처: HK121
口徑: 9.3x64毫米 低視度紅外線曳光彈<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
@@ -1659,7 +1659,7 @@
Cinto de munição 9.3 mm AP com 150 cartuchos
9,3 mm 150-lövedékes páncéltörő heveder
9.3mm 150Rnd 徹甲弾 ベルト
- 150발 들이 9.3mm 철갑탄 벨트
+ 9.3mm 150발 들이 벨트 (철갑탄)
9.3毫米 150發 穿甲彈 彈鏈
9.3 mm 150发 弹链(穿甲)
9.3 mm 150Rnd AP Belt
@@ -1710,7 +1710,7 @@
Carregador de 16 cartuchos 9x19 mm
9x19 mm 16-lövedékes tár
9x19 mm 16Rnd マガジン
- 16발 들이 9x19mm 탄창
+ 9x19mm 16발 들이 탄창
9x19毫米 16發 彈匣
9x19 mm 16发 弹匣
9x19 mm 16Rnd Mag
@@ -1744,7 +1744,7 @@
Carregador de 16 cartuchos 9x19 mm
9x19 mm 16-lövedékes tár
9x19 mm 30Rnd マガジン
- 30발 들이 9x19mm 탄창
+ 9x19mm 30발 들이 탄창
9x19毫米 30發 彈匣
9x19 mm 30发 弹匣
9x19 mm 30Rnd Mag
@@ -1761,7 +1761,7 @@
Carregador de 30 cartuchos 9x19 mm
9x19 mm 30-lövedékes tár
9x19 mm 30Rnd マガジン
- 30발 들이 9x19mm 탄창
+ 9x19mm 30발 들이 탄창
9x19毫米 30發 彈匣
9x19 mm 30发 弹匣
9x19 mm 30Rnd Mag
@@ -1795,7 +1795,7 @@
Carregador de 30 cartuchos 9x19 mm
9x19 mm 30-lövedékes tár
9x19 mm 30Rnd マガジン
- 30발 들이 9x19mm 탄창
+ 9x19mm 30발 들이 탄창
9x19毫米 30發 彈匣
9x19 mm 30发 弹匣
9x19 mm 30Rnd Mag
@@ -1812,7 +1812,7 @@
Carregador com 10 cartuchos 7.62x54 mm Traçante
7,62x54 mm 10-lövedékes nyomkövető tár
7.62mm 10Rnd マガジン (トレーサー)
- 10발 들이 7.62x54mm 예광탄 탄창
+ 7.62x54mmR 10발 들이 탄창 (예광탄)
7.62x54毫米 10發 曳光彈 彈匣
7.62x54 mm 10发 弹匣(曳光)
7.62x54 mm 10Rnd Tracer Mag
@@ -1846,7 +1846,7 @@
Carregador com 10 cartuchos 7.62x54 mm Traçante
7,62x54 mm 10-lövedékes nyomkövető tár
口径: 7.62x54 mm トレーサー<br />弾薬: 10<br />使用: ラヒム
- 10발 들이 7.62x54mm 예광탄 탄창
+ 7.62x54mmR 10발 들이 탄창 (예광탄)
7.62x54毫米 10發 曳光彈 彈匣
7.62x54 mm 10发 弹匣(曳光)
7.62x54 mm 10Rnd Tracer Mag
@@ -1863,7 +1863,7 @@
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.5mm 100Rnd IR-DIM トレーサー マガジン
- 100발 들이 6.5mm IR-DIM 예광탄 탄창
+ 6.5mm 100발 들이 탄창 (IR-DIM 예광탄)
6.5毫米 100發 低視度紅外線曳光彈 彈匣
6.5 mm 100发 弹匣(红外曳光)
6.5 mm 100Rnd Tracer IR-DIM Mag
@@ -1897,7 +1897,7 @@
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 100Rnd IR-DIM トレーサー マガジン<br />装填数: 100<br />次で使用: MX LSW
- 6.5mm 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 100Rnd Tracer IR-DIM Mag<br />Mermi: 100<br />Kullanıyor: MX LSW
@@ -1914,7 +1914,7 @@
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.5mm 200Rnd ベルト トレーサー(IR-DIM)
- 200발 들이 6.5mm IR-DIM 예광탄 탄창
+ 6.5mm 200발 들이 탄창 (IR-DIM 예광탄)
6.5毫米 200發 低視度紅外線曳光彈 彈鏈
6.5 mm 200发 弹链(红外曳光)
6.5 mm 200Rnd Belt Tracer (IR-DIM)
@@ -1948,7 +1948,7 @@
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 200Rnd ベルト トレーサー (IR-DIM)<br />装填数: 200<br />次で使用: Stoner 99 LMG
- 200발 들이 6.5mm IR-DIM 예광탄 벨트<br/>장탄수: 200<br/>사용처: 스토너 99 LMG
+ 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 200Rnd Belt Tracer (IR-DIM)<br />Mermi: 200<br />Kullanıyor: Stoner 99 LMG
@@ -1965,7 +1965,7 @@
Carregador 5.56 mm com 30 cartuchos (Mk262)
5,56 mm 30-lövedékes tár (Mk262)
5.56mm 30Rnd マガジン (Mk262)
- 30발 들이 5.56mm 탄창 (Mk.262)
+ 5.56mm 30발 들이 탄창 (Mk.262)
5.56毫米 30發 彈匣 (Mk262 狙擊專用彈)
5.56 mm 30发 弹匣(Mk262)
5.56 mm 30Rnd Mag (Mk262)
@@ -1999,7 +1999,7 @@
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.56x45mm NATO (Mk.262)<br/>장탄수: 30
+ 구경: 5.56x45mm NATO (Mk.262 매치그레이드)<br/>장탄수: 30
口徑: 5.56x45毫米 NATO標準 (Mk262 狙擊專用彈)<br />發數: 30
口径:5.56x45 mm 北约(Mk262 狙击专用弹)<br />发数:30
Kalibre: 5.56x45 mm NATO (Mk262)<br />Mermi: 30
@@ -2016,7 +2016,7 @@
Carregador 5.56 mm com 30 cartuchos (Mk318)
5,56 mm 30-lövedékes tár (Mk318)
5.56mm 30Rnd マガジン (Mk318)
- 30발 들이 5.56mm 탄창 (Mk.318)
+ 5.56mm 30발 들이 탄창 (Mk.318)
5.56毫米 30發 彈匣 (Mk318 特戰專用彈)
5.56 mm 30发 弹匣(Mk318)
5.56 mm 30Rnd Mag (Mk318)
@@ -2067,7 +2067,7 @@
Carregador 5.56 mm com 30 cartuchos (M995 AP)
5,56 mm 30-lövedékes tár (M995 páncéltörő)
5.56mm 30Rnd マガジン (M995 徹甲弾)
- 30발 들이 5.56mm 탄창 (M995 철갑탄)
+ 5.56mm 30발 들이 탄창 (M995)
5.56毫米 30發 彈匣 (M995 穿甲彈)
5.56 mm 30发 弹匣(M995 穿甲)
5.56 mm 30Rnd Mag (M995 AP)
@@ -2118,7 +2118,7 @@
Carregador 7.62 mm com 10 cartuchos (M118LR)
7,62 mm 10-lövedékes tár (M118LR)
7.62mm 10Rnd マガジン (M118LR)
- 10발 들이 7.62mm 탄창 (M118LR)
+ 7.62mm 10발 들이 탄창 (M118LR)
7.62毫米 10發 彈匣 (M118LR 狙擊專用彈)
7.62 mm 10发 弹匣(M118LR)
7.62 mm 10Rnd Mag (M118LR)
@@ -2152,7 +2152,7 @@
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.62x51mm NATO (M118LR)<br/>장탄수: 10
+ 구경: 7.62x51mm NATO (M118LR 할로우 포인트 매치그레이드)<br/>장탄수: 10
口徑: 7.62x51毫米 NATO標準 (M118LR 狙擊專用彈)<br />發數: 10
口径:7.62x51 mm 北约(M118LR 狙击专用弹)<br />发数:10
Kalibre: 7.62x51 mm NATO (M118LR)<br />Mermi: 10
@@ -2169,7 +2169,7 @@
Carregador 7.62 mm com 20 cartuchos (M118LR)
7,62 mm 20-lövedékes tár (M118LR)
7.62mm 20Rnd マガジン (M118LR)
- 20발 들이 7.62mm 탄창 (M118LR)
+ 7.62mm 20발 들이 탄창 (M118LR)
7.62毫米 20發 彈匣 (M118LR 狙擊專用彈)
7.62 mm 20发 弹匣(M118LR)
7.62 mm 20Rnd Mag (M118LR)
@@ -2203,7 +2203,7 @@
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.62x51mm NATO (M118LR)<br/>장탄수: 20
+ 구경: 7.62x51mm NATO (M118LR 할로우 포인트 매치그레이드)<br/>장탄수: 20
口徑: 7.62x51毫米 NATO標準 (M118LR 狙擊專用彈)<br />發數: 20
口径:7.62x51 mm 北约(M118LR 狙击专用弹)<br />发数:20
Kalibre: 7.62x51 mm NATO (M118LR)<br />Mermi: 20
@@ -2220,7 +2220,7 @@
Carregador 7.62 mm com 10 cartuchos (Mk316 Mod 0)
7,62 mm 10-lövedékes tár (Mk316 Mod 0)
7.62mm 10Rnd マガジン (Mk316 Mod 0)
- 10발 들이 7.62mm 탄창 (Mk.316 Mod 0)
+ 7.62mm 10발 들이 탄창 (Mk.316 Mod 0)
7.62毫米 10發 彈匣 (Mk316 Mod 0 狙擊專用彈)
7.62 mm 10发 弹匣(Mk316 Mod 0)
7.62 mm 10Rnd Mag (Mk316 Mod 0)
@@ -2271,7 +2271,7 @@
Carregador 7.62 mm com 20 cartuchos (Mk316 Mod 0)
7,62 mm 20-lövedékes tár (Mk316 Mod 0)
7.62mm 20Rnd マガジン (Mk316 Mod 0)
- 20발 들이 7.62mm 탄창 (Mk.316 Mod 0)
+ 7.62mm 20발 들이 탄창 (Mk.316 Mod 0)
7.62毫米 20發 彈匣 (Mk316 Mod 0 狙擊專用彈)
7.62 mm 20发 弹匣(Mk316 Mod 0)
7.62 mm 20Rnd Mag (Mk316 Mod 0)
@@ -2305,7 +2305,7 @@
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.62x51mm NATO (Mk.316 Mod 0)<br/>장탄수: 20
+ 구경: 7.62x51mm NATO (Mk.316 Mod 0 특수작전용 장거리 저격 탄환)<br/>장탄수: 20
口徑: 7.62x51毫米 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
@@ -2322,7 +2322,7 @@
Carregador 7.62 mm com 10 cartuchos (Mk319 Mod 0)
7,62 mm 10-lövedékes tár (Mk319 Mod 0)
7.62mm 10Rnd マガジン (Mk319 Mod 0)
- 10발 들이 7.62mm 탄창 (Mk.319 Mod 0)
+ 7.62mm 10발 들이 탄창 (Mk.319 Mod 0)
7.62毫米 10發 彈匣 (Mk319 Mod 0 特戰專用彈)
7.62 mm 10发 弹匣(Mk319 Mod 0)
7.62 mm 10Rnd Mag (Mk319 Mod 0)
@@ -2356,7 +2356,7 @@
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.62x51mm NATO (Mk.319 Mod 0)<br/>장탄수: 10
+ 구경: 7.62x51mm NATO (Mk.319 Mod 0 단총신 카빈 성능향상 탄환)<br/>장탄수: 10
口徑: 7.62x51毫米 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
@@ -2373,7 +2373,7 @@
Carregador 7.62 mm com 20 cartuchos (Mk319 Mod 0)
7,62 mm 20-lövedékes tár (Mk319 Mod 0)
7.62mm 20Rnd マガジン (Mk319 Mod 0)
- 20들이 7.62mm 탄창 (Mk.319 Mod 0)
+ 7.62mm 20발 들이 탄창 (Mk.319 Mod 0)
7.62毫米 20發 彈匣 (Mk319 Mod 0 特戰專用彈)
7.62 mm 20发 弹匣(Mk319 Mod 0)
7.62 mm 20Rnd Mag (Mk319 Mod 0)
@@ -2407,7 +2407,7 @@
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.62x51mm NATO (Mk.319 Mod 0)<br/>장탄수: 20
+ 구경: 7.62x51mm NATO (Mk.319 Mod 0 단총신 카빈 성능향상 탄환)<br/>장탄수: 20
口徑: 7.62x51毫米 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
@@ -2424,7 +2424,7 @@
Carregador 7.62 mm com 10 cartuchos (M993 AP)
7,62 mm 10-lövedékes tár (M993 páncéltörő)
7.62mm 10Rnd マガジン (M993 徹甲弾)
- 10발 들이 7.62mm 탄창 (M993 철갑탄)
+ 7.62mm 10발 들이 탄창 (M993)
7.62毫米 10發 彈匣 (M993 穿甲專用彈)
7.62 mm 10发 弹匣(M993 穿甲)
7.62 mm 10Rnd Mag (M993 AP)
@@ -2475,7 +2475,7 @@
Carregador 7.62 mm com 20 cartuchos (M993 AP)
7,62 mm 20-lövedékes tár (M993 páncéltörő)
7.62mm 20Rnd マガジン (M993 徹甲弾)
- 20발 들이 7.62mm 탄창 (M993 철갑탄)
+ 7.62mm 20발 들이 탄창 (M993)
7.62毫米 20發 彈匣 (M993 穿甲專用彈)
7.62 mm 20发 弹匣(M993 穿甲)
7.62 mm 20Rnd Mag (M993 AP)
@@ -2526,7 +2526,7 @@
Carregador .300 WM com 20 cartuchos (Mk248 Mod 0)
.300 WM 20-lövedékes tár (Mk248 Mod 0)
.300 WM 20Rnd マガジン (Mk248 Mod 0)
- 20발 들이 .300구경 윈체스터 매그넘 탄창 (Mk.248 Mod 0)
+ .300구경 윈체스터 매그넘 20발 들이 탄창 (Mk.248 Mod 0)
.300 萬能(WM) 20發 彈匣 (Mk248 Mod 0 狙擊專用彈)
.300 WM 20发 弹匣(Mk248 Mod 0)
.300 WM 20Rnd Mag (Mk248 Mod 0)
@@ -2560,7 +2560,7 @@
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 윈체스터 매그넘 (Mk.248 Mod 0)<br/>장탄수: 20
+ 구경: .300 윈체스터 매그넘 (Mk.248 Mod 0 장거리 저격용 탄환)<br/>장탄수: 20
口徑: .300 西米 NATO標準 (Mk248 Mod 0 狙擊專用彈)<br />發數: 20
口径:.300 WM 北约(Mk248 Mod 0 狙击专用弹)<br />发数:20
Kalibre: .300 WM NATO (Mk248 Mod 0)<br />Mermi: 20
@@ -2577,7 +2577,7 @@
Carregador .300 WM com 20 cartuchos (Mk248 Mod 1)
.300 WM 20-lövedékes tár (Mk248 Mod 1)
.300 WM 20Rnd マガジン (Mk248 Mod 1)
- 20발 들이 .300구경 윈체스터 매그넘 탄창 (Mk.248 Mod 1)
+ .300구경 윈체스터 매그넘 20발 들이 탄창 (Mk.248 Mod 1)
.300 西米 20發 彈匣 (Mk248 Mod 1 狙擊專用彈)
.300 WM 20发 弹匣(Mk248 Mod 1)
.300 WM 20Rnd Mag (Mk248 Mod 1)
@@ -2611,7 +2611,7 @@
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구경 윈체스터 매그넘 (Mk.248 Mod 1)<br/>장탄수: 20
+ 구경: .300구경 윈체스터 매그넘 (Mk.248 Mod 1 개선판 장거리 저격용 탄환)<br/>장탄수: 20
口徑: .300 西米 NATO標準 (Mk248 Mod 1 狙擊專用彈)<br />發數: 20
口径:.300 WM 北约(Mk248 Mod 1 狙击专用弹)<br />发数:20
Kalibre: .300 WM NATO (Mk248 Mod 1)<br />Mermi: 20
@@ -2628,7 +2628,7 @@
Carregador .300 WM com 20 cartuchos (Berger Hybrid OTM)
.300 WM 20-lövedékes tár (Berger Hybrid OTM)
.300 WM 20Rnd マガジン (Berger Hybrid OTM)
- 20발 들이 .300구경 윈체스터 매그넘 탄창 (Berger Hybrid OTM)
+ .300구경 윈체스터 매그넘 20발 들이 탄창 (Berger제 하이브리드 OTM)
.300 西米 20發 彈匣 (Berger Hybrid 空尖比賽專用彈)
.300 WM 20发 弹匣(Berger Hybrid 空尖)
.300 WM 20Rnd Mag (Berger Hybrid OTM)
@@ -2662,7 +2662,7 @@
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구경 윈체스터 매그넘 (Berger Hybrid OTM)<br/>장탄수: 20
+ 구경: .300구경 윈체스터 매그넘 (Berger제 하이브리드 오픈 팁 매치탄)<br/>장탄수: 20
口徑: .300 西米 NATO標準 (Berger Hybrid 空尖比賽專用彈)<br />發數: 20
口径:.300 WM 北约(Berger Hybrid 空尖)<br />发数:20
Kalibre: .300 WM NATO (Berger Hybrid OTM)<br />Mermi: 20
@@ -2679,7 +2679,7 @@
Carregador .300 WM com 10 cartuchos (Mk248 Mod 0)
.300 WM 10-lövedékes tár (Mk248 Mod 0)
.300 WM 10Rnd マガジン (Mk248 Mod 0)
- 10발 들이 .300구경 윈체스터 매그넘 탄창 (Mk.248 Mod 0)
+ .300구경 윈체스터 매그넘 10발 들이 탄창 (Mk.248 Mod 0)
.300 萬能(WM) 10發 彈匣 (Mk248 Mod 0 狙擊專用彈)
.300 WM 10发 弹匣(Mk248 Mod 0)
.300 WM 10Rnd Mag (Mk248 Mod 0)
@@ -2713,7 +2713,7 @@
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구경 윈체스터 매그넘 (Mk.248 Mod 0)<br/>장탄수: 10
+ 구경: .300 윈체스터 매그넘 (Mk.248 Mod 0 장거리 저격용 탄환)<br/>장탄수: 10
口徑: .300 西米 NATO標準 (Mk248 Mod 0 狙擊專用彈)<br />發數: 10
口径:.300 WM 北约(Mk248 Mod 0 狙击专用弹)<br />发数:10
Kalibre: .300 WM NATO (Mk248 Mod 0)<br />Mermi: 10
@@ -2730,7 +2730,7 @@
Carregador .300 WM com 10 cartuchos (Mk248 Mod 1)
.300 WM 10-lövedékes tár (Mk248 Mod 1)
.300 WM 10Rnd マガジン (Mk248 Mod 1)
- 10발 들이 .300구경 윈체스터 매그넘 탄창 (Mk.248 Mod 1)
+ .300구경 윈체스터 매그넘 10발 들이 탄창 (Mk.248 Mod 1)
.300 西米 10發 彈匣 (Mk248 Mod 1 狙擊專用彈)
.300 WM 10发 弹匣(Mk248 Mod 1)
.300 WM 10Rnd Mag (Mk248 Mod 1)
@@ -2764,7 +2764,7 @@
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구경 윈체스터 매그넘 (Mk.248 Mod 1)<br/>장탄수: 10
+ 구경: .300구경 윈체스터 매그넘 (Mk.248 Mod 1 개선판 장거리 저격용 탄환)<br/>장탄수: 10
口徑: .300 西米 NATO標準 (Mk248 Mod 1 狙擊專用彈)<br />發數: 10
口径:.300 WM 北约(Mk248 Mod 1 狙击专用弹)<br />发数:10
Kalibre: .300 WM NATO (Mk248 Mod 1)<br />Mermi: 10
@@ -2781,7 +2781,7 @@
Carregador .300 WM com 10 cartuchos (Berger Hybrid OTM)
.300 WM 10-lövedékes tár (Berger Hybrid OTM)
.300 WM 10Rnd マガジン (Berger Hybrid OTM)
- 10발 들이 .300구경 윈체스터 매그넘 탄창 (Berger Hybrid OTM)
+ .300구경 윈체스터 매그넘 10발 들이 탄창 (Berger제 하이브리드 OTM)
.300 西米 10發 彈匣 (Berger Hybrid 空尖比賽專用彈)
.300 WM 10发 弹匣(Berger Hybrid 空尖)
.300 WM 10Rnd Mag (Berger Hybrid OTM)
@@ -2815,7 +2815,7 @@
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구경 윈체스터 매그넘 (Berger Hybrid OTM)<br/>장탄수: 10
+ 구경: .300구경 윈체스터 매그넘 (Berger제 하이브리드 오픈 팁 매치탄)<br/>장탄수: 10
口徑: .300 西米 NATO標準 (Berger Hybrid 空尖比賽專用彈)<br />發數: 10
口径:.300 WM 北约(Berger Hybrid 空尖)<br />发数:10
Kalibre: .300 WM NATO (Berger Hybrid OTM)<br />Mermi: 10
@@ -2828,7 +2828,7 @@
6.5x47 mm 30cp Sabbia (HPBT Scenar)
Magazynek 6.5x47 mm 30rd Piaskowy (HPBT Scenar)
6.5x47 mm 30发 沙色弹匣(HPBT Scenar)
- 6.5x47mm 30발 사막 탄창 (HPBT Scenar)
+ 6.5x47mm 30발 들이 탄창/모래 (HPBT Scenar)
Магазин из 30-ти 6.5x47 мм Песочный (HPBT Scenar)
Cargador de 30 balas de 6.5x47mm Arena (HPBT Scenar)
Carregador 6.5x47 mm com 30 cartuchos Areia (HPBT Scenar)
@@ -2841,7 +2841,7 @@
6.5x47 mm 30cp Car Promet (HPBT Scenar)
Magazynek 6.5x47 mm 30rd Promet (HPBT Scenar)
6.5x47 mm 30发 Promet 弹匣(HPBT Scenar)
- 6.5x47mm 30발 그롯 탄창 (HPBT Scenar)
+ 6.5x47mm 30발 들이 탄창/프로멧용 (Scenar제 HPBT)
Магазин из 30-ти 6.5x47 мм Promet (HPBT Scenar)
Cargador de 30 balas de 6.5x47mm Promet (HPBT Scenar)
Carregador 6.5x47 mm com 30 cartuchos Promet (HPBT Scenar)
@@ -2854,7 +2854,7 @@
6.5x47 mm 30cp Car Nero (HPBT Scenar)
Magazynek 6.5x47 mm 30rd Czarny (HPBT Scenar)
6.5x47 mm 30发 黑色弹匣(HPBT Scenar)
- 6.5x47mm 30발 검정 탄창 (HPBT Scenar)
+ 6.5x47mm 30발 들이 탄창/검정 (Scenar제 HPBT)
Магазин из 30-ти 6.5x47 мм Чёрный (HPBT Scenar)
Cargador de 30 balas de 6.5x47mm Negro (HPBT Scenar)
Carregador 6.5x47 mm com 30 cartuchos Preto (HPBT Scenar)
@@ -2867,7 +2867,7 @@
6.5x47 mm 30cp Car Cachi (HPBT Scenar)
Magazynek 6.5x47 mm 30rd Khaki (HPBT Scenar)
6.5x47 mm 30发 卡其色弹匣(HPBT Scenar)
- 6.5x47mm 30발 카키 탄창 (HPBT Scenar)
+ 6.5x47mm 30발 들이 탄창/카키 (Scenar제 HPBT)
Магазин из 30-ти 6.5x47 мм Хаки (HPBT Scenar)
Cargador de 30 balas de 6.5x47mm Caqui (HPBT Scenar)
Carregador 6.5x47 mm com 30 cartuchos Caqui (HPBT Scenar)
@@ -2901,7 +2901,7 @@
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.5x47mm (HPBT Scenar)<br/>장탄수: 30<br/>사용처: MXM
+ 구경: 6.5x47mm (Scenar제 보트 테일 할로우 포인트)<br/>장탄수: 30<br/>사용처: MXM
口徑: 6.5x47毫米 (拉普 空尖艇尾狙擊專用彈)<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
@@ -2918,7 +2918,7 @@
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.5x47mm (HPBT Scenar)<br/>장탄수: 30<br/>사용처: MSBS 그롯/GL/MR/SG
+ 구경: 6.5x47mm (Scenar제 보트 테일 할로우 포인트)<br/>장탄수: 30<br/>사용처: MSBS 그롯/GL/MR/SG
口徑: 6.5x47毫米 (拉普 空尖艇尾狙擊專用彈)<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
@@ -2931,7 +2931,7 @@
6.5 mm Creedmor 30cp Car Sabbia
Magazynek 6.5 mm Creedmor 30Rnd Piaskowy
6.5 mm 30发 沙色弹匣(Creedmor)
- 6.5mm 크리드무어 30발 사막 탄창
+ 6.5mm 크리드무어 30발 들이 탄창/사막
Магазин из 30-ти 6.5 мм Creedmor Песочный
Cargador de 30 balas de 6.5mm Creedmor Arena
Carregador 6.5 mm com 30 cartuchos Creedmor Areia
@@ -2944,7 +2944,7 @@
6.5 mm Creedmor 30cp Car Promet
Magazynek 6.5 mm Creedmor 30Rnd Promet
6.5 mm 30发 Promet 弹匣(Creedmor)
- 6.5mm 크리드무어 30발 프로멧 탄창
+ 6.5mm 크리드무어 30발 들이 탄창/프로멧용
Магазин из 30-ти 6.5 мм Creedmor Promet
Cargador de 30 balas de 6.5mm Creedmor Promet
Carregador 6.5 mm com 30 cartuchos Creedmor Promet
@@ -2957,7 +2957,7 @@
6.5 mm Creedmor 30cp Car Nero
Magazynek 6.5 mm Creedmor 30Rnd Czarny
6.5 mm 30发 黑色弹匣(Creedmor)
- 6.5mm 크리드무어 30발 검정 탄창
+ 6.5mm 크리드무어 30발 들이 탄창/검정
Магазин из 30-ти 6.5 мм Creedmor Чёрный
Cargador de 30 balas de 6.5mm Creedmor Negro
Carregador 6.5 mm com 30 cartuchos Creedmor Preto
@@ -2970,7 +2970,7 @@
6.5 mm Creedmor 30cp Car Cachi
Magazynek 6.5 mm Creedmor 30Rnd Khaki
6.5 mm 30发 卡其色弹匣(Creedmor)
- 6.5mm 크리드무어 30발 카키 탄창
+ 6.5mm 크리드무어 30발 들이 탄창/카키
Магазин из 30-ти 6.5 мм Creedmor Хаки
Cargador de 30 balas de 6.5mm Creedmor Caqui
Carregador 6.5 mm com 30 cartuchos Creedmor Caqui
@@ -3038,7 +3038,7 @@
Carregador .338 LM (300gr Lapua Scenar) com 10 cartuchos
.338 LM 10-lövedékes tár (300gr Lapua Scenar)
.338 LM 10Rnd マガジン (300gr Lapua Scenar)
- 10발 들이 .338구경 라푸아 매그넘 탄창 (300그레인 Scenar)
+ .338구경 라푸아 매그넘 10발 들이 탄창 (Scenar제 300그레인)
.338 10發 彈匣 (300公克 Lapua Scenar)
.338 LM 10发 弹匣(300gr Lapua Scenar)
.338 LM 10Rnd Mag (300gr Lapua Scenar)
@@ -3072,7 +3072,7 @@
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 라푸아 매그넘 (300그레인 Scenar)<br/>장탄수: 10
+ 구경: 8.6x70mm 라푸아 매그넘 (Scenar제 300그레인)<br/>장탄수: 10
口徑: 8.6x70毫米 (300公克 Lapua Scenar)<br />發數: 10
口径:8.6x70 mm(300gr Lapua Scenar)<br />发数:10
Kalibre: 8.6x70mm (300gr Lapua Scenar)<br />Mermi: 10
@@ -3089,7 +3089,7 @@
Carregador .338 LM (API526) com 10 cartuchos
.338 LM 10-lövedékes tár (API526)
.338 LM 10Rnd マガジン (API526)
- 10발 들이 .338구경 라푸아 매그넘 탄창 (API526)
+ .338구경 라푸아 매그넘 10발 들이 탄창 (API526)
.338 10發 彈匣 (API526 穿甲燃燒彈)
.338 LM 10发 弹匣(API526 穿燃)
.338 LM 10Rnd Mag (API526)
@@ -3106,7 +3106,7 @@
.338 AP
.338 páncéltörő
.338 AP
- .338구경 라푸아 매그넘 철갑탄
+ .338구경 라푸아 매그넘 철갑소이탄
.338 API526 穿甲燃燒彈
.338 穿燃
.338 AP
@@ -3123,7 +3123,7 @@
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.6x70 mm(API526 穿燃)<br />发数:10
Kalibre: 8.6x70mm (API526)<br />Mermi: 10
@@ -3140,7 +3140,7 @@
Carregador .408 (305gr) com 7 cartuchos
.408 7-lövedékes tár (305gr)
.408 7Rnd マガジン (305gr)
- 7발 들이 .408구경 샤이택 탄창 (305그레인)
+ .408구경 샤이택 7발 들이 탄창 (305그레인)
.408 7發 彈匣 (305公克)
.408 7发 弹匣(305gr)
.408 7Rnd Mag (305gr)
@@ -3191,7 +3191,7 @@
Carregador 12.7x99 mm com 5 cartuchos
12,7x99 mm 5-lövedékes tár
12.7x99mm 5Rnd マガジン
- 5발 들이 12.7x99mm 탄창
+ 12.7x99mm 5발 들이 탄창
12.7x99毫米 5發 彈匣
12.7x99 mm 5发 弹匣
12.7x99 mm 5Rnd Mag
@@ -3225,7 +3225,7 @@
Carregador 12.7x99 mm com 10 cartuchos
12,7x99 mm 10-lövedékes tár
12.7x99mm 10Rnd マガジン
- 10발 들이 12.7x99mm 탄창
+ 12.7x99mm 10발 들이 탄창
12.7x99毫米 10發 彈匣
12.7x99 mm 10发 弹匣
12.7x99 mm 10Rnd Mag
@@ -3276,7 +3276,7 @@
Carregador 12.7x99 mm API com 5 cartuchos
12,7x99 mm 5-lövedékes tár (páncéltörő-gyújtó)
12.7x99mm 5Rnd 焼夷徹甲弾 マガジン
- 5발 들이 12.7x99mm 철갑소이탄 탄창
+ 12.7x99mm 5발 들이 탄창 (철갑소이탄)
12.7x99毫米 穿甲燃燒彈 5發 彈匣
12.7x99 mm 穿燃 5发 弹匣
12.7x99 mm API 5Rnd Mag
@@ -3310,7 +3310,7 @@
Carregador 12.7x99 mm API com 10 cartuchos
12,7x99 mm 10-lövedékes tár (páncéltörő-gyújtó)
12.7x99mm 10Rnd 焼夷徹甲弾 マガジン
- 10발 들이 12.7x99mm 철갑소이탄 탄창
+ 12.7x99mm 10발 들이 탄창 (철갑소이탄)
12.7x99毫米 穿甲燃燒彈 10發 彈匣
12.7x99 mm 穿燃 10发 弹匣
12.7x99 mm API 10Rnd Mag
@@ -3344,7 +3344,7 @@
Carregador 12.7x99 mm (AMAX) com 5 cartuchos
12,7x99 mm 5-lövedékes tár (AMAX)
12.7x99mm 5Rnd マガジン (AMAX)
- 5발 들이 12.7x99mm 탄창 (AMAX)
+ 12.7x99mm 5발 들이 탄창 (A-MAX)
12.7x99毫米 5發 彈匣 (AMAX 比賽專用彈)
12.7x99 mm 5发 弹匣(AMAX)
12.7x99 mm 5Rnd Şarjör (AMAX)
@@ -3361,7 +3361,7 @@
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.7x99mm (AMAX)<br/>장탄수: 5
+ 구경: 12.7x99mm (A-MAX 매치그레이드)<br/>장탄수: 5
口徑: 12.7x99毫米 (AMAX 比賽專用彈)<br />發數: 5
口径:12.7x99 mm(AMAX)<br />发数:5
Kalibre: 12.7x99 mm (AMAX)<br />Mermi: 5
@@ -3378,7 +3378,7 @@
Carregador 12.7x99 mm (AMAX) com 10 cartuchos
12,7x99 mm 10-lövedékes tár (AMAX)
12.7x99mm 10Rnd マガジン (AMAX)
- 10발 들이 12.7x99mm 탄창 (AMAX)
+ 12.7x99mm 10발 들이 탄창 (A-MAX)
12.7x99毫米 10發 彈匣 (AMAX 比賽專用彈)
12.7x99 mm 10发 弹匣(AMAX)
12.7x99 mm 10Rnd Şarjör (AMAX)
@@ -3395,7 +3395,7 @@
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.7x99mm (AMAX)<br/>장탄수: 10
+ 구경: 12.7x99mm (A-MAX 매치그레이드)<br/>장탄수: 10
口徑: 12.7x99毫米 (AMAX 比賽專用彈)<br />發數: 10
口径:12.7x99 mm(AMAX)<br />发数:10
Kalibre: 12.7x99 mm (AMAX)<br />Mermi: 10
@@ -3412,7 +3412,7 @@
12.7 mm AMAX
12,7 mm AMAX
12.7 mm AMAX
- 12.7mm AMAX
+ 12.7mm A-MAX
12.7毫米 AMAX 比賽專用彈
12.7 mm AMAX
12.7 mm AMAX
diff --git a/addons/captives/functions/fnc_handleRespawn.sqf b/addons/captives/functions/fnc_handleRespawn.sqf
index 1dc6ca7bfa3..f3c728d0538 100644
--- a/addons/captives/functions/fnc_handleRespawn.sqf
+++ b/addons/captives/functions/fnc_handleRespawn.sqf
@@ -40,12 +40,12 @@ if (_respawn > 3) then {
if (_unit getVariable [QGVAR(isHandcuffed), false]) then {
[_unit, false] call FUNC(setHandcuffed);
};
- [_unit, "setCaptive", QGVAR(Handcuffed), false] call EFUNC(common,statusEffect_set);
+ [_unit, "setCaptive", QGVAR(handcuffed), false] call EFUNC(common,statusEffect_set);
if (_unit getVariable [QGVAR(isSurrendering), false]) then {
[_unit, false] call FUNC(setSurrendered);
};
- [_unit, "setCaptive", QGVAR(Surrendered), false] call EFUNC(common,statusEffect_set);
+ [_unit, "setCaptive", QGVAR(surrendered), false] call EFUNC(common,statusEffect_set);
if (_unit getVariable [QGVAR(isEscorting), false]) then {
_unit setVariable [QGVAR(isEscorting), false, true];
diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf
index d3d9fa4e6b6..2ccd36493c8 100644
--- a/addons/captives/functions/fnc_setHandcuffed.sqf
+++ b/addons/captives/functions/fnc_setHandcuffed.sqf
@@ -41,8 +41,8 @@ if ((_unit getVariable [QGVAR(isHandcuffed), false]) isEqualTo _state) exitWith
if (_state) then {
_unit setVariable [QGVAR(isHandcuffed), true, true];
- [_unit, "setCaptive", QGVAR(Handcuffed), true] call EFUNC(common,statusEffect_set);
- [_unit, "blockRadio", QGVAR(Handcuffed), true] call EFUNC(common,statusEffect_set);
+ [_unit, "setCaptive", QGVAR(handcuffed), true] call EFUNC(common,statusEffect_set);
+ [_unit, "blockRadio", QGVAR(handcuffed), true] call EFUNC(common,statusEffect_set);
if (_unit getVariable [QGVAR(isSurrendering), false]) then { //If surrendering, stop
[_unit, false] call FUNC(setSurrendered);
@@ -82,8 +82,8 @@ if (_state) then {
}, [_unit], 0.01] call CBA_fnc_waitAndExecute;
} else {
_unit setVariable [QGVAR(isHandcuffed), false, true];
- [_unit, "setCaptive", QGVAR(Handcuffed), false] call EFUNC(common,statusEffect_set);
- [_unit, "blockRadio", QGVAR(Handcuffed), false] call EFUNC(common,statusEffect_set);
+ [_unit, "setCaptive", QGVAR(handcuffed), false] call EFUNC(common,statusEffect_set);
+ [_unit, "blockRadio", QGVAR(handcuffed), false] call EFUNC(common,statusEffect_set);
//remove AnimChanged EH
private _animChangedEHID = _unit getVariable [QGVAR(handcuffAnimEHID), -1];
diff --git a/addons/captives/functions/fnc_setSurrendered.sqf b/addons/captives/functions/fnc_setSurrendered.sqf
index 887bfb26808..3a3724c94d2 100644
--- a/addons/captives/functions/fnc_setSurrendered.sqf
+++ b/addons/captives/functions/fnc_setSurrendered.sqf
@@ -44,8 +44,8 @@ if (_state) then {
_unit setVariable [QGVAR(isSurrendering), true, true];
- [_unit, "setCaptive", QGVAR(Surrendered), true] call EFUNC(common,statusEffect_set);
- [_unit, "blockRadio", QGVAR(Surrendered), true] call EFUNC(common,statusEffect_set);
+ [_unit, "setCaptive", QGVAR(surrendered), true] call EFUNC(common,statusEffect_set);
+ [_unit, "blockRadio", QGVAR(surrendered), true] call EFUNC(common,statusEffect_set);
if (_unit == ACE_player) then {
["captive", [false, false, false, false, false, false, false, false, false, true]] call EFUNC(common,showHud);
@@ -71,8 +71,8 @@ if (_state) then {
}, [_unit], 0.01] call CBA_fnc_waitAndExecute;
} else {
_unit setVariable [QGVAR(isSurrendering), false, true];
- [_unit, "setCaptive", QGVAR(Surrendered), false] call EFUNC(common,statusEffect_set);
- [_unit, "blockRadio", QGVAR(Surrendered), false] call EFUNC(common,statusEffect_set);
+ [_unit, "setCaptive", QGVAR(surrendered), false] call EFUNC(common,statusEffect_set);
+ [_unit, "blockRadio", QGVAR(surrendered), false] call EFUNC(common,statusEffect_set);
//remove AnimChanged EH
private _animChangedEHID = _unit getVariable [QGVAR(surrenderAnimEHID), -1];
diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml
index 4fc86ec58fe..dfc293028dc 100644
--- a/addons/captives/stringtable.xml
+++ b/addons/captives/stringtable.xml
@@ -158,6 +158,7 @@
目隠しを外す
Снять повязку с глаз
Quitar vendas de los ojos
+ Remover a venda
Cable Tie
diff --git a/addons/cargo/CfgVehicles.hpp b/addons/cargo/CfgVehicles.hpp
index 66fa98159e3..9b4e316a19a 100644
--- a/addons/cargo/CfgVehicles.hpp
+++ b/addons/cargo/CfgVehicles.hpp
@@ -1,4 +1,3 @@
-
class CBA_Extended_EventHandlers;
class CfgVehicles {
@@ -55,7 +54,7 @@ class CfgVehicles {
GVAR(space) = 4;
GVAR(hasCargo) = 1;
};
- class Tank_F: Tank {};
+ class Tank_F;
class UGV_02_Base_F: Tank_F {
GVAR(space) = 0;
GVAR(hasCargo) = 0;
@@ -237,8 +236,6 @@ class CfgVehicles {
GVAR(hasCargo) = 1;
};
- class O_Heli_Transport_04_fuel_F: Heli_Transport_04_base_F {};
-
class O_Heli_Transport_04_medevac_F: Heli_Transport_04_base_F {
GVAR(space) = 10;
GVAR(hasCargo) = 1;
@@ -259,7 +256,7 @@ class CfgVehicles {
GVAR(hasCargo) = 0;
};
- class Plane_Base_F: Plane {};
+ class Plane_Base_F;
class Plane_Civil_01_base_F: Plane_Base_F { // Tanoa Civilian Prop Plane
GVAR(space) = 2;
GVAR(hasCargo) = 1;
@@ -300,7 +297,7 @@ class CfgVehicles {
GVAR(hasCargo) = 1;
};
- class Boat_F: Ship_F {};
+ class Boat_F;
class Rubber_duck_base_F: Boat_F {
GVAR(space) = 0;
GVAR(hasCargo) = 0;
@@ -356,7 +353,7 @@ class CfgVehicles {
};
// Slingload pallets
- class Slingload_base_F: ReammoBox_F {};
+ class Slingload_base_F;
class CargoNet_01_base_F: Slingload_base_F {
GVAR(size) = 6;
};
@@ -512,10 +509,6 @@ class CfgVehicles {
transportMaxWeapons = 12;
};
class Land_WoodenCrate_01_F: ThingX {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 3;
GVAR(hasCargo) = 1;
GVAR(size) = 3;
@@ -545,240 +538,141 @@ class CfgVehicles {
};
};
class Cargo10_base_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 14;
GVAR(size) = 15;
};
- class Land_Cargo20_blue_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
+ class Land_Cargo10_IDAP_F: ThingX {
+ GVAR(space) = 14;
+ GVAR(size) = 15;
+ };
+ class Land_Cargo20_blue_F: Cargo_base_F {
GVAR(space) = 49;
GVAR(size) = 50;
};
class Land_Cargo20_brick_red_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 49;
GVAR(size) = 50;
};
class Land_Cargo20_cyan_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 49;
GVAR(size) = 50;
};
class Land_Cargo20_grey_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 49;
GVAR(size) = 50;
};
class Land_Cargo20_light_blue_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 49;
GVAR(size) = 50;
};
class Land_Cargo20_light_green_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 49;
GVAR(size) = 50;
};
class Land_Cargo20_military_green_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 49;
GVAR(size) = 50;
};
class Land_Cargo20_orange_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 49;
GVAR(size) = 50;
};
class Land_Cargo20_red_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 49;
GVAR(size) = 50;
};
class Land_Cargo20_sand_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 49;
GVAR(size) = 50;
};
class Land_Cargo20_vr_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 49;
GVAR(size) = 50;
};
class Land_Cargo20_white_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 49;
GVAR(size) = 50;
};
class Land_Cargo20_yellow_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 49;
GVAR(size) = 50;
};
- class Cargo_IDAP_base_F: Cargo_base_F {};
+
+ class Cargo_IDAP_base_F;
class Land_Cargo20_IDAP_F: Cargo_IDAP_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
+ GVAR(space) = 49;
+ GVAR(size) = 50;
+ };
+ class Cargo_EMP_base_F;
+ class Land_Cargo20_EMP_F: Cargo_EMP_base_F {
+ GVAR(space) = 49;
+ GVAR(size) = 50;
+ };
+ class Land_Cargo20_EMP_Training_F: Cargo_EMP_base_F {
GVAR(space) = 49;
GVAR(size) = 50;
};
class Land_Cargo40_blue_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 99;
GVAR(size) = 100;
};
class Land_Cargo40_brick_red_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 99;
GVAR(size) = 100;
};
class Land_Cargo40_cyan_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 99;
GVAR(size) = 100;
};
class Land_Cargo40_grey_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 99;
GVAR(size) = 100;
};
class Land_Cargo40_light_blue_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 99;
GVAR(size) = 100;
};
class Land_Cargo40_light_green_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 99;
GVAR(size) = 100;
};
class Land_Cargo40_military_green_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 99;
GVAR(size) = 100;
};
class Land_Cargo40_orange_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 99;
GVAR(size) = 100;
};
class Land_Cargo40_red_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 99;
GVAR(size) = 100;
};
class Land_Cargo40_sand_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 99;
GVAR(size) = 100;
};
- class Land_Cargo40_vr_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
+ class Land_Cargo40_white_F: Cargo_base_F {
GVAR(space) = 99;
GVAR(size) = 100;
};
- class Land_Cargo40_white_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
+ class Land_Cargo40_yellow_F: Cargo_base_F {
GVAR(space) = 99;
GVAR(size) = 100;
};
- class Land_Cargo40_yellow_F: Cargo_base_F {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
+ class Land_Cargo40_IDAP_F: Cargo_IDAP_base_F {
GVAR(space) = 99;
GVAR(size) = 100;
};
// Small
class Land_CargoBox_V1_F: ThingX {
- class EventHandlers {
- class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
- };
-
GVAR(space) = 7;
GVAR(hasCargo) = 1;
GVAR(size) = 7;
diff --git a/addons/cargo/XEH_PREP.hpp b/addons/cargo/XEH_PREP.hpp
index 10281e29674..4632a401f17 100644
--- a/addons/cargo/XEH_PREP.hpp
+++ b/addons/cargo/XEH_PREP.hpp
@@ -5,6 +5,7 @@ PREP(canUnloadItem);
PREP(deployCancel);
PREP(deployConfirm);
PREP(getCargoSpaceLeft);
+PREP(getDelayItem);
PREP(getNameItem);
PREP(getSelectedItem);
PREP(getSizeItem);
diff --git a/addons/cargo/XEH_postInit.sqf b/addons/cargo/XEH_postInit.sqf
index f48849b50bc..45c1b9601a6 100644
--- a/addons/cargo/XEH_postInit.sqf
+++ b/addons/cargo/XEH_postInit.sqf
@@ -51,7 +51,7 @@
params ["_item", "_emptyPosAGL"];
_item hideObjectGlobal false;
- _item setPosASL (AGLtoASL _emptyPosAGL);
+ _item setPosASL (AGLToASL _emptyPosAGL);
// Let objects remain invulernable for a short while after placement
[EFUNC(common,statusEffect_set), [_item, "blockDamage", QUOTE(ADDON), false], 2] call CBA_fnc_waitAndExecute;
diff --git a/addons/cargo/functions/fnc_deployConfirm.sqf b/addons/cargo/functions/fnc_deployConfirm.sqf
index 27674b0515b..e4c87342f04 100644
--- a/addons/cargo/functions/fnc_deployConfirm.sqf
+++ b/addons/cargo/functions/fnc_deployConfirm.sqf
@@ -24,7 +24,7 @@ if (!isNull GVAR(itemPreviewObject) && {[GVAR(selectedItem), GVAR(interactionVeh
// Position is AGL for unloading event
private _position = ASLToAGL getPosASL GVAR(itemPreviewObject);
private _direction = getDir GVAR(itemPreviewObject);
- private _duration = GVAR(loadTimeCoefficient) * (GVAR(selectedItem) call FUNC(getSizeItem));
+ private _duration = [GVAR(selectedItem), false] call FUNC(getDelayItem);
// If unload time is 0, don't show a progress bar
if (_duration <= 0) exitWith {
diff --git a/addons/cargo/functions/fnc_getDelayItem.sqf b/addons/cargo/functions/fnc_getDelayItem.sqf
new file mode 100644
index 00000000000..7f1d6b4d401
--- /dev/null
+++ b/addons/cargo/functions/fnc_getDelayItem.sqf
@@ -0,0 +1,26 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Gets the delay duration an item should take to load/unload.
+ *
+ * Arguments:
+ * 0: Item
@@ -1932,5 +1932,22 @@
Влияет на величину колебания прицела оружия при его развертывании.
Afecta la cantidad de oscilación del arma cuando se está desplegado.
+
+ Release
+ Отпустить
+ Soltar
+ Puść
+ Položit
+ Lâcher
+ Loslassen
+ Soltar
+ Lascia
+ Elengedés
+ 離す
+ 놓기
+ 放開
+ 放开
+ Bırak
+
diff --git a/addons/compat_aegis/$PBOPREFIX$ b/addons/compat_aegis/$PBOPREFIX$
new file mode 100644
index 00000000000..1fc86838473
--- /dev/null
+++ b/addons/compat_aegis/$PBOPREFIX$
@@ -0,0 +1 @@
+z\ace\addons\compat_aegis
diff --git a/addons/compat_aegis/compat_aegis_realisticnames/CfgVehicles.hpp b/addons/compat_aegis/compat_aegis_realisticnames/CfgVehicles.hpp
new file mode 100644
index 00000000000..19a1bef5104
--- /dev/null
+++ b/addons/compat_aegis/compat_aegis_realisticnames/CfgVehicles.hpp
@@ -0,0 +1,21 @@
+class CfgVehicles {
+ class APC_Wheeled_01_base_v2_F;
+ class B_APC_Wheeled_01_cannon_v2_F: APC_Wheeled_01_base_v2_F {
+ displayName = ECSTRING(realisticnames,APC_Wheeled_01_cannon_Name);
+ };
+
+ class B_APC_Wheeled_01_base_F;
+ class B_APC_Wheeled_01_medical_F: B_APC_Wheeled_01_base_F {
+ displayName = SUBCSTRING(APC_Wheeled_01_medical_Name);
+ };
+
+ class APC_Tracked_02_medical_base_F;
+ class O_R_APC_Tracked_02_medical_F: APC_Tracked_02_medical_base_F {
+ displayName = SUBCSTRING(APC_Tracked_02_medical_Name);
+ };
+
+ class APC_Tracked_03_base_v2_F;
+ class B_A_APC_tracked_03_cannon_v2_F: APC_Tracked_03_base_v2_F {
+ displayName = ECSTRING(realisticnames,APC_tracked_03_cannon_Name);
+ };
+};
diff --git a/addons/compat_aegis/compat_aegis_realisticnames/config.cpp b/addons/compat_aegis/compat_aegis_realisticnames/config.cpp
new file mode 100644
index 00000000000..add9f50a3a4
--- /dev/null
+++ b/addons/compat_aegis/compat_aegis_realisticnames/config.cpp
@@ -0,0 +1,26 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {
+ "A3_Aegis_Armor_F_Aegis_APC_Wheeled_01",
+ "A3_Aegis_Armor_F_Aegis_APC_Tracked_02",
+ "A3_Aegis_Armor_F_Aegis_APC_Tracked_03",
+ "ace_realisticnames"
+ };
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"johnb43"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ // this prevents any patched class from requiring this addon
+ addonRootClass = "A3_Characters_F";
+ };
+};
+
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_aegis/compat_aegis_realisticnames/script_component.hpp b/addons/compat_aegis/compat_aegis_realisticnames/script_component.hpp
new file mode 100644
index 00000000000..b8d0682fa4f
--- /dev/null
+++ b/addons/compat_aegis/compat_aegis_realisticnames/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT realisticnames
+#define SUBCOMPONENT_BEAUTIFIED Realistic Names
+#include "..\script_component.hpp"
diff --git a/addons/compat_aegis/compat_aegis_realisticnames/stringtable.xml b/addons/compat_aegis/compat_aegis_realisticnames/stringtable.xml
new file mode 100644
index 00000000000..6d7dfa47a12
--- /dev/null
+++ b/addons/compat_aegis/compat_aegis_realisticnames/stringtable.xml
@@ -0,0 +1,37 @@
+
+
+
+
+ Badger IFV (Medical)
+ SPz Badger (Medizin)
+ Badger IFV (médico)
+ Badger IFV (sprzęt medyczny)
+ Badger IFV (zdravotnický)
+ Badger IFV (médical)
+ БМП Badger (медицинский)
+ Badger IFV (médico)
+ Badger IFV (medico)
+ バジャー IFV(医療)
+ 뱃져 보병전투차 (의료)
+ "蜜獾"步兵戰車(醫療用)
+ "蜜獾"(医疗)
+ Badger IFV (Sıhhiye)
+
+
+ BM-2T Stalker (Medical)
+ BM-2T Stalker (Medizin)
+ BM-2T Stalker (médico)
+ BM-2T Stalker (sprzęt medyczny)
+ BM-2T Stalker (zdravotnický)
+ BM-2T Stalker (médical)
+ БМ-2Т Сталкер (медицинский)
+ BM-2T Stalker (médico)
+ BM-2T Stalker (medico)
+ BM-2T ストーカー(医療)
+ BM-2T 스토커 (의료)
+ BM-2T"潛行者"步兵戰車(醫療用)
+ BM-2T "潜行者"(医疗)
+ BM-2T Stalker (Sıhhiye)
+
+
+
diff --git a/addons/compat_aegis/compat_aegis_vehicles/CfgVehicles.hpp b/addons/compat_aegis/compat_aegis_vehicles/CfgVehicles.hpp
new file mode 100644
index 00000000000..5d0e86faafd
--- /dev/null
+++ b/addons/compat_aegis/compat_aegis_vehicles/CfgVehicles.hpp
@@ -0,0 +1,95 @@
+class CfgVehicles {
+ class Tank;
+ class Tank_F: Tank {
+ class Turrets {
+ class MainTurret;
+ };
+ };
+
+ class APC_Tracked_03_base_F: Tank_F {
+ class Turrets: Turrets {
+ class MainTurret: MainTurret {};
+ };
+ };
+ class APC_Tracked_03_base_v2_F: APC_Tracked_03_base_F {
+ class Turrets: Turrets {
+ class MainTurret: MainTurret {
+ weapons[] = {"autocannon_40mm_CTWS", "ACE_LMG_coax_L94A1_mem3"}; // Aegis upgrades to a 40mm cannon, but we want realistic MG name
+ };
+ };
+ };
+
+ class MBT_01_base_F: Tank_F {
+ class Turrets: Turrets {
+ class MainTurret: MainTurret {
+ // Overwrite the changes Aegis makes for the .338 coax MG on the Slammer/Merkava
+ // The idea is:
+ // 1) keep it as realistic as possible
+ // 2) easier to overwrite something with skipWhenMissingDependencies than to not overwrite something if another mod is loaded
+ weapons[] = {"cannon_120mm", "ACE_LMG_coax_MAG58_mem3"}; // Base 1.82: "cannon_120mm","LMG_coax"
+ magazines[] = {
+ "24Rnd_120mm_APFSDS_shells_Tracer_Red",
+ "12Rnd_120mm_HE_shells_Tracer_Red",
+ "12Rnd_120mm_HEAT_MP_T_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "4Rnd_120mm_LG_cannon_missiles" // Aegis adds laser-guided munitions
+ };
+ };
+ };
+ };
+
+ class B_MBT_01_base_F: MBT_01_base_F {};
+ class B_MBT_01_cannon_F: B_MBT_01_base_F {};
+ class B_MBT_01_TUSK_F: B_MBT_01_cannon_F {
+ class Turrets: Turrets {
+ class MainTurret: MainTurret {
+ weapons[] = {"cannon_120mm", "ACE_LMG_coax_MAG58_mem3"}; // Base 1.82: "cannon_120mm","LMG_coax"
+ magazines[] = {
+ "24Rnd_120mm_APFSDS_shells_Tracer_Red",
+ "12Rnd_120mm_HE_shells_Tracer_Red",
+ "12Rnd_120mm_HEAT_MP_T_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "200Rnd_762x51_Belt_Red",
+ "4Rnd_120mm_LG_cannon_missiles" // Aegis adds laser-guided munitions
+ };
+ };
+ };
+ };
+};
diff --git a/addons/compat_aegis/compat_aegis_vehicles/config.cpp b/addons/compat_aegis/compat_aegis_vehicles/config.cpp
new file mode 100644
index 00000000000..fd16fa86865
--- /dev/null
+++ b/addons/compat_aegis/compat_aegis_vehicles/config.cpp
@@ -0,0 +1,25 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {
+ "A3_Aegis_Armor_F_Aegis_MBT_01",
+ "A3_Aegis_Armor_F_Aegis_APC_Tracked_03",
+ "ace_vehicles"
+ };
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"johnb43"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ // this prevents any patched class from requiring this addon
+ addonRootClass = "A3_Characters_F";
+ };
+};
+
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_aegis/compat_aegis_vehicles/script_component.hpp b/addons/compat_aegis/compat_aegis_vehicles/script_component.hpp
new file mode 100644
index 00000000000..17370c415fd
--- /dev/null
+++ b/addons/compat_aegis/compat_aegis_vehicles/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT vehicles
+#define SUBCOMPONENT_BEAUTIFIED Vehicles
+#include "..\script_component.hpp"
diff --git a/addons/compat_aegis/config.cpp b/addons/compat_aegis/config.cpp
new file mode 100644
index 00000000000..2de723b9a48
--- /dev/null
+++ b/addons/compat_aegis/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"};
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"johnb43"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ // this prevents any patched class from requiring this addon
+ addonRootClass = "A3_Characters_F";
+ };
+};
diff --git a/addons/compat_aegis/script_component.hpp b/addons/compat_aegis/script_component.hpp
new file mode 100644
index 00000000000..d6fb73bd462
--- /dev/null
+++ b/addons/compat_aegis/script_component.hpp
@@ -0,0 +1,5 @@
+#define COMPONENT compat_aegis
+#define COMPONENT_BEAUTIFIED Aegis Compatibility
+
+#include "\z\ace\addons\main\script_mod.hpp"
+#include "\z\ace\addons\main\script_macros.hpp"
diff --git a/addons/compat_csla/compat_csla_explosives/CfgMagazines.hpp b/addons/compat_csla/compat_csla_explosives/CfgMagazines.hpp
index b29f7e717dc..0c8a8aa6fd8 100644
--- a/addons/compat_csla/compat_csla_explosives/CfgMagazines.hpp
+++ b/addons/compat_csla/compat_csla_explosives/CfgMagazines.hpp
@@ -1,15 +1,15 @@
class CfgMagazines {
class US85_Magazine;
class US85_ATMine_mag: US85_Magazine {
- EGVAR(explosives,SetupObject) = "ACE_Explosives_Place_US85_ATMine_mag";
+ 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";
+ 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";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_US85_SatchelCharge_Mag";
useAction = 0;
};
};
diff --git a/addons/compat_cup_vehicles/CfgVehicles.hpp b/addons/compat_cup_vehicles/CfgVehicles.hpp
index 5334987fff6..ce502abad53 100644
--- a/addons/compat_cup_vehicles/CfgVehicles.hpp
+++ b/addons/compat_cup_vehicles/CfgVehicles.hpp
@@ -1,4 +1,31 @@
class CfgVehicles {
+ class CUP_nHMMWV_Base;
+ class CUP_nM1025_SOV_Base: CUP_nHMMWV_Base {
+ class EGVAR(interaction,anims) {
+ class hide_backpacks {
+ positions[] = {
+ "(_target selectionPosition ['vhc_backpacks', 'ViewGeometry', 'AveragePoint']) vectorAdd [-1, 0, 0]",
+ "(_target selectionPosition ['vhc_backpacks', 'ViewGeometry', 'AveragePoint']) vectorAdd [1.3, 0, 0]"
+ };
+ items[] = {"CUP_B_USPack_Coyote", "CUP_B_USPack_Coyote", "CUP_B_AssaultPack_ACU", "CUP_B_AssaultPack_ACU", "CUP_B_AssaultPack_Coyote"};
+ name = "$STR_a3_cfgvehicleclasses_backpacks0";
+ text = "$STR_a3_cfgvehicleclasses_backpacks0";
+ };
+ };
+ };
+
+ class Car_F;
+ class CUP_ECVHMMWV_Base: Car_F {
+ class EGVAR(interaction,anims) {
+ class hide_deploy2 {
+ positions[] = {"(_target selectionPosition ['vhc_rear_trunk_door', 'FireGeometry', 'AveragePoint']) vectorAdd [-0.7, 0, 0]"};
+ items[] = {"CUP_B_USPack_Coyote", "CUP_B_AssaultPack_ACU"};
+ name = "$STR_a3_cfgvehicleclasses_backpacks0";
+ text = "$STR_a3_cfgvehicleclasses_backpacks0";
+ };
+ };
+ };
+
class CUP_MTVR_Base;
class CUP_MTVR_Reammo_Base: CUP_MTVR_Base {
EGVAR(rearm,defaultSupply) = 1200;
@@ -106,6 +133,17 @@ class CfgVehicles {
class CUP_BTR90_HQ_Base: CUP_BTR90_Base { delete ace_viewports; }; // no cargo seats
class Tank_F;
+ class CUP_AAV_Base: Tank_F {
+ class EGVAR(interaction,anims) {
+ class Hide_Bags_Deployment {
+ positions[] = {{1.7, -0.7, -0.3}, {1.7, -2.55, -0.3}};
+ items[] = {"CUP_B_USPack_Coyote", "CUP_B_USPack_Coyote"};
+ name = "$STR_CUP_dn_USpack_coyote";
+ text = "$STR_CUP_dn_USpack_coyote";
+ };
+ };
+ };
+
class CUP_M2Bradley_Base: Tank_F {
ace_hunterkiller = 1;
class ace_viewports {
diff --git a/addons/compat_cup_vehicles/compat_cup_repair/CfgVehicles.hpp b/addons/compat_cup_vehicles/compat_cup_repair/CfgVehicles.hpp
new file mode 100644
index 00000000000..29a471f4516
--- /dev/null
+++ b/addons/compat_cup_vehicles/compat_cup_repair/CfgVehicles.hpp
@@ -0,0 +1,196 @@
+class CfgVehicles {
+ class Car_F;
+ class CUP_Datsun_Base: Car_F {
+ class EGVAR(interaction,anims) {
+ class hideSpareTire {
+ positions[] = {{-0.23, -0.25, -0.8}};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+ class CUP_Datsun_AA_Base: CUP_Datsun_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hideSpareTire: hideSpareTire {
+ enabled = 0;
+ };
+ };
+ };
+
+ class CUP_Tigr_Base: Car_F {
+ class EGVAR(interaction,anims) {
+ class hide_ReserveWheel {
+ positions[] = {{0.57, -2.3, -0.55}};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+ class CUP_Tigr_STS_PK_Base: CUP_Tigr_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_ReserveWheel: hide_ReserveWheel {};
+ };
+ };
+ class CUP_Tigr_233014_PK_Base: CUP_Tigr_STS_PK_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_ReserveWheel: hide_ReserveWheel {
+ positions[] = {{0.57, -2.3, -0.85}};
+ };
+ };
+ };
+ class CUP_Tigr_M_PK_Base: CUP_Tigr_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_ReserveWheel: hide_ReserveWheel {};
+ };
+ };
+ class CUP_Tigr_233114_PK_Base: CUP_Tigr_M_PK_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_ReserveWheel: hide_ReserveWheel {
+ positions[] = {{0.57, -2.3, -0.85}};
+ };
+ };
+ };
+
+ class CUP_LR_Base: Car_F {
+ class EGVAR(interaction,anims) {
+ class selection_wheelfront {
+ positions[] = {"_target selectionPosition ['selection_wheelfront', 'ViewGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ class selection_wheels {
+ positions[] = {
+ "(_target selectionPosition ['selection_wheels', 'ViewGeometry', 'AveragePoint']) vectorAdd [-1.1, 0, 0]",
+ "(_target selectionPosition ['selection_wheels', 'ViewGeometry', 'AveragePoint']) vectorAdd [1.1, 0, 0]"
+ };
+ items[] = {"ACE_Wheel", "ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ class CUP_nHMMWV_Base: Car_F {
+ class EGVAR(interaction,anims) {
+ class hide_spare_wheel {
+ positions[] = {"_target selectionPosition ['vhc_spare_wheel', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+ // Don't inherit, as it's easier for the main compat
+ class CUP_nM1025_SOV_Base: CUP_nHMMWV_Base {
+ class EGVAR(interaction,anims) {
+ class hide_spare_wheel {
+ positions[] = {"_target selectionPosition ['vhc_spare_wheel', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ class CUP_RG31_BASE: Car_F {
+ class EGVAR(interaction,anims) {
+ class left_spare {
+ positions[] = {"_target selectionPosition ['left_spare', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ class right_spare {
+ positions[] = {"_target selectionPosition ['right_spare', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ class CUP_UAZ_Base: Car_F {
+ class EGVAR(interaction,anims) {
+ class hide_spare_wheel {
+ positions[] = {"_target selectionPosition ['spare_wheel', 'ViewGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+ class CUP_UAZ_Armed_Base: CUP_UAZ_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_spare_wheel: hide_spare_wheel {};
+ };
+ };
+ class CUP_UAZ_AA_Base: CUP_UAZ_Armed_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_spare_wheel: hide_spare_wheel {
+ positions[] = {{0.18, -1.8, 0.75}};
+ };
+ };
+ };
+ class CUP_UAZ_AGS30_Base: CUP_UAZ_Armed_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_spare_wheel: hide_spare_wheel {
+ positions[] = {{0.18, -1.9, 0.75}};
+ };
+ };
+ };
+ class CUP_UAZ_MG_Base: CUP_UAZ_Armed_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_spare_wheel: hide_spare_wheel {
+ positions[] = {{0.18, -1.9, 0.2}};
+ };
+ };
+ };
+ // Visual is bugged, but it works
+ class CUP_UAZ_METIS_Base: CUP_UAZ_Armed_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_spare_wheel: hide_spare_wheel {
+ positions[] = {{0.18, -1.9, 0.65}};
+ };
+ };
+ };
+ class CUP_UAZ_SPG9_Base: CUP_UAZ_Armed_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_spare_wheel: hide_spare_wheel {
+ positions[] = {{0.18, -1.9, 1.05}};
+ };
+ };
+ };
+
+ class CUP_UAZ_Unarmed_Base: CUP_UAZ_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_spare_wheel: hide_spare_wheel {};
+ };
+ };
+ class CUP_UAZ_Open_Base: CUP_UAZ_Unarmed_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_spare_wheel: hide_spare_wheel {
+ positions[] = {{0.135, -1.3, 0.7}};
+ };
+ };
+ };
+
+ class CUP_ECVHMMWV_Base: Car_F {
+ class EGVAR(interaction,anims) {
+ class hide_spare_tire {
+ positions[] = {"(_target selectionPosition ['vhc_rear_trunk_door', 'FireGeometry', 'AveragePoint']) vectorAdd [0.05, -0.4, 0.2]"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ class hide_deploy1 {
+ positions[] = {"(_target selectionPosition ['vhc_rear_trunk_door', 'FireGeometry', 'AveragePoint']) vectorAdd [0.05, 0.5, 0.7]"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+};
diff --git a/addons/compat_cup_vehicles/compat_cup_repair/config.cpp b/addons/compat_cup_vehicles/compat_cup_repair/config.cpp
new file mode 100644
index 00000000000..9a2785e7ef2
--- /dev/null
+++ b/addons/compat_cup_vehicles/compat_cup_repair/config.cpp
@@ -0,0 +1,23 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {
+ "CUP_Vehicles_LoadOrder",
+ "ace_repair"
+ };
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"johnb43"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ addonRootClass = QUOTE(ADDON);
+ };
+};
+
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_cup_vehicles/compat_cup_repair/script_component.hpp b/addons/compat_cup_vehicles/compat_cup_repair/script_component.hpp
new file mode 100644
index 00000000000..1af928486c3
--- /dev/null
+++ b/addons/compat_cup_vehicles/compat_cup_repair/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT repair
+#define SUBCOMPONENT_BEAUTIFIED Repair
+#include "..\script_component.hpp"
diff --git a/addons/compat_cup_vehicles/compat_cup_trenches/CfgVehicles.hpp b/addons/compat_cup_vehicles/compat_cup_trenches/CfgVehicles.hpp
new file mode 100644
index 00000000000..9d9bc2d62ee
--- /dev/null
+++ b/addons/compat_cup_vehicles/compat_cup_trenches/CfgVehicles.hpp
@@ -0,0 +1,111 @@
+class CfgVehicles {
+ class Car_F;
+ class CUP_Tigr_Base: Car_F {
+ class EGVAR(interaction,anims) {
+ class hide_tools {
+ positions[] = {{1.15, -1.5, -0.68}};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+ class CUP_Tigr_STS_PK_Base: CUP_Tigr_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_tools: hide_tools {};
+ };
+ };
+ class CUP_Tigr_233014_PK_Base: CUP_Tigr_STS_PK_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_tools: hide_tools {
+ positions[] = {{1.15, -1.5, -1}};
+ };
+ };
+ };
+ class CUP_Tigr_M_PK_Base: CUP_Tigr_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_tools: hide_tools {};
+ };
+ };
+ class CUP_Tigr_233114_PK_Base: CUP_Tigr_M_PK_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_tools: hide_tools {
+ positions[] = {{1.15, -1.5, -1}};
+ };
+ };
+ };
+
+ // Interaction added to both sides, as the whole vehicle is mirrored if in left/right side
+ class CUP_LR_Base: Car_F {
+ class EGVAR(interaction,anims) {
+ class selection_tool {
+ positions[] = {{-0.53, 1.65, -0.2}, {0.53, 1.65, -0.2}};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+ class CUP_LR_MG_Base: CUP_LR_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class selection_tool: selection_tool {
+ positions[] = {{-0.6, 1.4, 1.4}, {0.45, 1.4, 1.4}};
+ };
+ };
+ };
+ class CUP_LR_SPG9_Base: CUP_LR_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class selection_tool: selection_tool {};
+ };
+ };
+ class CUP_LR_AA_Base: CUP_LR_SPG9_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class selection_tool: selection_tool {
+ positions[] = {{-0.55, 1.77, -0.75}, {0.55, 1.77, -0.75}};
+ };
+ };
+ };
+ class CUP_LR_Ambulance_Base: CUP_LR_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class selection_tool: selection_tool {
+ positions[] = {{-0.55, 2.1, -0.2}, {0.55, 2.1, -0.2}};
+ };
+ };
+ };
+ class CUP_LR_Special_Base: CUP_LR_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class selection_tool: selection_tool {
+ positions[] = {{-0.6, 1.4, 1.4}, {0.45, 1.4, 1.4}};
+ };
+ };
+ };
+
+ class CUP_ECVHMMWV_Base: Car_F {
+ class EGVAR(interaction,anims) {
+ class hide_front_tool_rack {
+ positions[] = {"(_target selectionPosition ['vhc_rear_trunk_door', 'FireGeometry', 'AveragePoint']) vectorAdd [0.37, 4, 0.2]"};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+
+ class Tank_F;
+ class CUP_leopard_1A3_base: Tank_F {
+ class EGVAR(interaction,anims) {
+ class hide_Tools_L {
+ positions[] = {{-2.2, 0, 0.2}, {-2.2, -1.8, 0.2}};
+ items[] = {"ACE_EntrenchingTool", "ACE_wirecutter"};
+ name = "$STR_a3_cfgeditorsubcategories_edsubcat_tools0";
+ text = "$STR_a3_cfgeditorsubcategories_edsubcat_tools0";
+ };
+ class hide_Tools_R {
+ positions[] = {{0.9, -1.5, 0.23}};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+};
diff --git a/addons/compat_cup_vehicles/compat_cup_trenches/config.cpp b/addons/compat_cup_vehicles/compat_cup_trenches/config.cpp
new file mode 100644
index 00000000000..8f05885bd6f
--- /dev/null
+++ b/addons/compat_cup_vehicles/compat_cup_trenches/config.cpp
@@ -0,0 +1,23 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {
+ "CUP_Vehicles_LoadOrder",
+ "ace_trenches"
+ };
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"johnb43"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ addonRootClass = QUOTE(ADDON);
+ };
+};
+
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_cup_vehicles/compat_cup_trenches/script_component.hpp b/addons/compat_cup_vehicles/compat_cup_trenches/script_component.hpp
new file mode 100644
index 00000000000..10b90eb71e5
--- /dev/null
+++ b/addons/compat_cup_vehicles/compat_cup_trenches/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT trenches
+#define SUBCOMPONENT_BEAUTIFIED Trenches
+#include "..\script_component.hpp"
diff --git a/addons/compat_cup_vehicles/compat_cup_vehicles_fastroping/config.cpp b/addons/compat_cup_vehicles/compat_cup_vehicles_fastroping/config.cpp
index 1abe0de6ea6..10eb5da69f0 100644
--- a/addons/compat_cup_vehicles/compat_cup_vehicles_fastroping/config.cpp
+++ b/addons/compat_cup_vehicles/compat_cup_vehicles_fastroping/config.cpp
@@ -15,6 +15,8 @@ class CfgPatches {
authors[] = {"Community Upgrade Project", "Mike"};
url = ECSTRING(main,URL);
VERSION_CONFIG;
+
+ addonRootClass = QUOTE(ADDON);
};
};
diff --git a/addons/compat_cup_vehicles/compat_cup_vehicles_refuel/CfgVehicles.hpp b/addons/compat_cup_vehicles/compat_cup_vehicles_refuel/CfgVehicles.hpp
index 1042c0eacf3..60a83030df2 100644
--- a/addons/compat_cup_vehicles/compat_cup_vehicles_refuel/CfgVehicles.hpp
+++ b/addons/compat_cup_vehicles/compat_cup_vehicles_refuel/CfgVehicles.hpp
@@ -28,4 +28,90 @@ class CfgVehicles {
EGVAR(refuel,hooks)[] = {{-1.09, -0.01, -0.5},{1, -0.01, -0.5}};
EGVAR(refuel,fuelCargo) = 10000;
};
+
+ class Car_F;
+ class CUP_LR_Base: Car_F {
+ class EGVAR(interaction,anims) {
+ class selection_jerry {
+ positions[] = {{-0.65, 2.7, -0.55}, {0.65, 2.7, -0.55}, {-1, -0.25, -0.75}, {1, -0.25, -0.75}};
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+ class CUP_LR_MG_Base: CUP_LR_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class selection_jerry: selection_jerry {
+ positions[] = {{-0.55, 2.45, 1.05}, {0.55, 2.45, 1.05}, {-1, -0.53, 0.9}, {1, -0.53, 0.9}};
+ };
+ };
+ };
+ class CUP_LR_SPG9_Base: CUP_LR_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class selection_jerry: selection_jerry {};
+ };
+ };
+ class CUP_LR_AA_Base: CUP_LR_SPG9_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class selection_jerry: selection_jerry {
+ positions[] = {{-0.65, 2.8, -1.1}, {0.65, 2.8, -1.1}, {-1, -0.15, -1.3}, {1, -0.15, -1.3}};
+ };
+ };
+ };
+ class CUP_LR_Ambulance_Base: CUP_LR_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class selection_jerry: selection_jerry {
+ positions[] = {{-0.65, 3.1, -0.55}, {0.65, 3.1, -0.55}};
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ };
+ };
+ };
+ class CUP_LR_Special_Base: CUP_LR_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class selection_jerry: selection_jerry {
+ positions[] = {{-0.7, 2.45, 1.05}, {0.55, 2.45, 1.05}};
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ };
+ };
+ };
+
+ class CUP_nHMMWV_Base: Car_F {
+ class EGVAR(interaction,anims) {
+ class hide_jerrycans {
+ positions[] = {"(_target selectionPosition 'vhc_jerrycans') vectorAdd [0, 0, 0.15]"};
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+ // Don't inherit, as it's easier for the main compat
+ class CUP_nM1025_SOV_Base: CUP_nHMMWV_Base {
+ class EGVAR(interaction,anims) {
+ class hide_jerrycans {
+ positions[] = {"(_target selectionPosition 'vhc_jerrycans') vectorAdd [0, 0, 0.15]"};
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ class hide_rear_rack_content {
+ positions[] = {"_target selectionPosition ['vhc_rear_rack_content', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+
+ class CUP_ECVHMMWV_Base: Car_F {
+ class EGVAR(interaction,anims) {
+ class hide_jerrycans {
+ positions[] = {"(_target selectionPosition ['vhc_rear_trunk_door', 'FireGeometry', 'AveragePoint']) vectorAdd [-0.85, -0.22, -0.1]"};
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
};
diff --git a/addons/compat_cup_weapons/compat_cup_weapons_csw/CfgVehicles.hpp b/addons/compat_cup_weapons/compat_cup_weapons_csw/CfgVehicles.hpp
index 3924ae03861..c96253ec51c 100644
--- a/addons/compat_cup_weapons/compat_cup_weapons_csw/CfgVehicles.hpp
+++ b/addons/compat_cup_weapons/compat_cup_weapons_csw/CfgVehicles.hpp
@@ -19,7 +19,7 @@ class CfgVehicles {
magazineLocation = "_target selectionPosition 'otochlaven'";
proxyWeapon = "CUP_proxy_mortar_82mm";
disassembleWeapon = "CUP_2b14_carry";
- disassembleTurret = "ace_csw_mortarBaseplate";
+ disassembleTurret = QEGVAR(csw,mortarBaseplate);
desiredAmmo = 1;
ammoLoadTime = 3;
ammoUnloadTime = 3;
@@ -29,14 +29,14 @@ class CfgVehicles {
class CUP_M252_base: CUP_2b14_82mm_Base {
class ace_csw: ace_csw {
disassembleWeapon = "CUP_m252_carry";
- disassembleTurret = "ace_csw_mortarBaseplate";
+ disassembleTurret = QEGVAR(csw,mortarBaseplate);
};
};
class CUP_L16A2_base: CUP_M252_base {
class ace_csw: ace_csw {
disassembleWeapon = "CUP_l16a2_carry";
- disassembleTurret = "ace_csw_mortarBaseplate";
+ disassembleTurret = QEGVAR(csw,mortarBaseplate);
};
};
@@ -47,7 +47,7 @@ class CfgVehicles {
proxyWeapon = "CUP_proxy_m2";
magazineLocation = "_target selectionPosition 'magazine'";
disassembleWeapon = "CUP_m2_carry";
- disassembleTurret = "ace_csw_m3Tripod";
+ disassembleTurret = QEGVAR(csw,m3Tripod);
desiredAmmo = 100;
ammoLoadTime = 10;
ammoUnloadTime = 8;
@@ -57,7 +57,7 @@ class CfgVehicles {
class CUP_M2StaticMG_MiniTripod_base: CUP_M2StaticMG_base {
class ace_csw: ace_csw {
enabled = 1;
- disassembleTurret = "ace_csw_m3TripodLow";
+ disassembleTurret = QEGVAR(csw,m3TripodLow);
};
};
@@ -65,9 +65,9 @@ class CfgVehicles {
class ace_csw {
enabled = 1;
proxyWeapon = "CUP_proxy_DSHKM";
- magazineLocation = "_target selectionPosition 'magazine'";
+ magazineLocation = "_target selectionPosition 'otocvez'";
disassembleWeapon = "CUP_DSHKM_carry";
- disassembleTurret = "ace_csw_kordTripod";
+ disassembleTurret = QEGVAR(csw,kordTripod);
desiredAmmo = 100;
ammoLoadTime = 10;
ammoUnloadTime = 8;
@@ -87,7 +87,7 @@ class CfgVehicles {
proxyWeapon = "CUP_proxy_KORD";
magazineLocation = "_target selectionPosition 'magazine'";
disassembleWeapon = "CUP_KORD_carry";
- disassembleTurret = "ace_csw_kordTripod";
+ disassembleTurret = QEGVAR(csw,kordTripod);
desiredAmmo = 100;
ammoLoadTime = 10;
ammoUnloadTime = 8;
@@ -97,7 +97,7 @@ class CfgVehicles {
class CUP_KORD_MiniTripod_Base: CUP_KORD_Base {
class ace_csw: ace_csw {
enabled = 1;
- disassembleTurret = "ace_csw_kordTripodLow";
+ disassembleTurret = QEGVAR(csw,kordTripodLow);
};
};
@@ -108,7 +108,7 @@ class CfgVehicles {
proxyWeapon = "CUP_proxy_AGS30";
magazineLocation = "_target selectionPosition 'otochlaven'";
disassembleWeapon = "CUP_AGS30_carry";
- disassembleTurret = "ace_csw_sag30Tripod";
+ disassembleTurret = QEGVAR(csw,sag30Tripod);
desiredAmmo = 29;
ammoLoadTime = 10;
ammoUnloadTime = 8;
@@ -119,9 +119,9 @@ class CfgVehicles {
class ace_csw {
enabled = 1;
proxyWeapon = "CUP_proxy_MK19";
- magazineLocation = "_target selectionPosition 'magazine'";
+ magazineLocation = "_target selectionPosition 'otochlaven'";
disassembleWeapon = "CUP_MK19_carry";
- disassembleTurret = "ace_csw_m3TripodLow";
+ disassembleTurret = QEGVAR(csw,m3TripodLow);
desiredAmmo = 48;
ammoLoadTime = 10;
ammoUnloadTime = 8;
@@ -148,7 +148,7 @@ class CfgVehicles {
proxyWeapon = "CUP_proxy_TOW";
magazineLocation = "_target selectionPosition 'otochlaven'";
disassembleWeapon = "CUP_TOW_carry";
- disassembleTurret = "ace_csw_m220Tripod";
+ disassembleTurret = QEGVAR(csw,m220Tripod);
desiredAmmo = 1;
ammoLoadTime = 8;
ammoUnloadTime = 5;
@@ -165,9 +165,9 @@ class CfgVehicles {
class ace_csw {
enabled = 1;
proxyWeapon = "CUP_proxy_SPG9";
- magazineLocation = "_target selectionPosition 'otochlaven'";
+ magazineLocation = "_target selectionPosition 'handle'";
disassembleWeapon = "CUP_SPG9_carry";
- disassembleTurret = "ace_csw_spg9Tripod";
+ disassembleTurret = QEGVAR(csw,spg9Tripod);
desiredAmmo = 1;
ammoLoadTime = 5;
ammoUnloadTime = 3;
diff --git a/addons/compat_cup_weapons/compat_cup_weapons_csw/CfgWeapons.hpp b/addons/compat_cup_weapons/compat_cup_weapons_csw/CfgWeapons.hpp
index 9ff8519ce11..56213219040 100644
--- a/addons/compat_cup_weapons/compat_cup_weapons_csw/CfgWeapons.hpp
+++ b/addons/compat_cup_weapons/compat_cup_weapons_csw/CfgWeapons.hpp
@@ -60,6 +60,7 @@ class CfgWeapons {
class assembleTo {
ace_csw_m3Tripod = "CUP_I_M2StaticMG_AAF";
ace_csw_m3TripodLow = "CUP_I_M2StaticMG_MiniTripod_AAF";
+ EGVAR(compat_spe,m3Tripod) = "CUP_I_M2StaticMG_MiniTripod_AAF";
};
};
class WeaponSlotsInfo: WeaponSlotsInfo {
diff --git a/addons/compat_cup_weapons/compat_cup_weapons_csw/stringtable.xml b/addons/compat_cup_weapons/compat_cup_weapons_csw/stringtable.xml
index ea16be2905a..86e56ee3d90 100644
--- a/addons/compat_cup_weapons/compat_cup_weapons_csw/stringtable.xml
+++ b/addons/compat_cup_weapons/compat_cup_weapons_csw/stringtable.xml
@@ -9,6 +9,8 @@
[CSW] AGS30 Gurt
[CSW] Cinta de AGS30
[CSW] Nastro AGS30
+ [CSW] Cinto de AGS30
+ [CSW] Ceinture AGS30
[CSW] MK19 Belt
@@ -18,6 +20,8 @@
[CSW] MK19 Gurt
[CSW] Cinta de MK19
[CSW] Nastro MK19
+ [CSW] Cinto de MK19
+ [CSW] Ceinture MK19
[CSW] TOW Tube
@@ -27,6 +31,8 @@
[CSW] TOW Rohr
[CSW] Tubo de TOW
[CSW] Tubo TOW
+ [CSW] Tubo de TOW
+ [CSW] Tube TOW
[CSW] TOW2 Tube
@@ -36,6 +42,8 @@
[CSW] TOW2 Rohr
[CSW] Tubo de TOW2
[CSW] Tubo TOW2
+ [CSW] Tubo de TOW2
+ [CSW] Tube TOW2
[CSW] PG-9 Round
@@ -45,6 +53,8 @@
[CSW] PG-9 Rakete
[CSW] Carga de PG-9
[CSW] Razzo PG-9
+ [CSW] Cartucho PG-9
+ [CSW] Projectile PG-9
[CSW] OG-9 Round
@@ -54,6 +64,8 @@
[CSW] OG-9 Rakete
[CSW] Carga de OG-9
[CSW] Razzo OG-9
+ [CSW] Cartucho OG-9
+ [CSW] Projectile OG-9.
[CSW] M1 HE
@@ -74,6 +86,7 @@
[CSW] M84 Rauch
[CSW] Humo M84
[CSW] M84 Fumogeno
+ [CSW] M84 Fumígeno
[CSW] M60A2 WP
diff --git a/addons/compat_cup_weapons/compat_cup_weapons_explosives/CfgAmmo.hpp b/addons/compat_cup_weapons/compat_cup_weapons_explosives/CfgAmmo.hpp
index 1658715ddbd..eeb7e6037f2 100644
--- a/addons/compat_cup_weapons/compat_cup_weapons_explosives/CfgAmmo.hpp
+++ b/addons/compat_cup_weapons/compat_cup_weapons_explosives/CfgAmmo.hpp
@@ -4,18 +4,18 @@ class CfgAmmo {
hit = 3000;
indirectHit = 3000;
indirectHitRange = 5;
- ace_explosives_explodeOnDefuse = 0.02;
+ EGVAR(explosives,explodeOnDefuse) = 0.02;
};
class CUP_PipeBomb_Ammo: PipeBombBase {
hit = 3000;
indirectHit = 3000;
indirectHitRange = 5;
- ace_explosives_explodeOnDefuse = 0.02;
+ EGVAR(explosives,explodeOnDefuse) = 0.02;
};
class CUP_Mine_Ammo;
class CUP_IED_V1_Ammo: CUP_Mine_Ammo {
- ace_explosives_explodeOnDefuse = 0.06;
+ EGVAR(explosives,explodeOnDefuse) = 0.06;
triggerWhenDestroyed = 1;
};
};
diff --git a/addons/compat_cup_weapons/compat_cup_weapons_explosives/CfgMagazines.hpp b/addons/compat_cup_weapons/compat_cup_weapons_explosives/CfgMagazines.hpp
index 15df2f73335..51dc9d0d781 100644
--- a/addons/compat_cup_weapons/compat_cup_weapons_explosives/CfgMagazines.hpp
+++ b/addons/compat_cup_weapons/compat_cup_weapons_explosives/CfgMagazines.hpp
@@ -2,9 +2,9 @@ class CfgMagazines {
class CA_Magazine;
class CUP_TimeBomb_M: CA_Magazine {
scope = 1;
- ace_explosives_placeable = 1;
+ EGVAR(explosives,placeable) = 1;
useAction = 0;
- ace_explosives_setupObject = "ACE_PipeBomb_place_CUP";
+ EGVAR(explosives,setupObject) = "ACE_PipeBomb_place_CUP";
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch", "Cellphone"};
class Timer {
@@ -16,9 +16,9 @@ class CfgMagazines {
};
};
class CUP_Mine_M: CUP_TimeBomb_M {
- ace_explosives_placeable = 1;
+ EGVAR(explosives,placeable) = 1;
useAction = 0;
- ace_explosives_setupObject = "ACE_Mine_place_CUP";
+ EGVAR(explosives,setupObject) = "ACE_Mine_place_CUP";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -27,9 +27,9 @@ class CfgMagazines {
};
};
class CUP_MineE_M: CUP_TimeBomb_M {
- ace_explosives_placeable = 1;
+ EGVAR(explosives,placeable) = 1;
useAction = 0;
- ace_explosives_setupObject = "ACE_MineE_place_CUP";
+ EGVAR(explosives,setupObject) = "ACE_MineE_place_CUP";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -39,20 +39,20 @@ class CfgMagazines {
};
class CUP_IED_V1_M: CUP_Mine_M {
- ace_explosives_placeable = 1;
+ EGVAR(explosives,placeable) = 1;
useAction = 0;
- ace_explosives_setupObject = "ACE_IED_V1_place_CUP";
+ EGVAR(explosives,setupObject) = "ACE_IED_V1_place_CUP";
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch", "Cellphone", "PressurePlate"};
};
};
class CUP_IED_V2_M: CUP_IED_V1_M {
useAction = 0;
- ace_explosives_setupObject = "ACE_IED_V2_place_CUP";
+ EGVAR(explosives,setupObject) = "ACE_IED_V2_place_CUP";
};
class CUP_IED_V3_M: CUP_IED_V1_M {
useAction = 0;
- ace_explosives_setupObject = "ACE_IED_V3_place_CUP";
+ EGVAR(explosives,setupObject) = "ACE_IED_V3_place_CUP";
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch", "Cellphone", "PressurePlate"};
class Timer {
@@ -77,7 +77,7 @@ class CfgMagazines {
};
class CUP_IED_V4_M: CUP_IED_V1_M {
useAction = 0;
- ace_explosives_setupObject = "ACE_IED_V4_place_CUP";
+ EGVAR(explosives,setupObject) = "ACE_IED_V4_place_CUP";
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch", "Cellphone", "PressurePlate"};
class Timer {
diff --git a/addons/compat_cup_weapons/compat_cup_weapons_explosives/CfgVehicles.hpp b/addons/compat_cup_weapons/compat_cup_weapons_explosives/CfgVehicles.hpp
index d10c315c3d7..17a7c59848e 100644
--- a/addons/compat_cup_weapons/compat_cup_weapons_explosives/CfgVehicles.hpp
+++ b/addons/compat_cup_weapons/compat_cup_weapons_explosives/CfgVehicles.hpp
@@ -1,32 +1,31 @@
class CfgVehicles {
class ACE_Explosives_Place;
class ACE_PipeBomb_place_CUP: ACE_Explosives_Place {
- displayName = "Satchel Charge";
+ displayName = "$STR_CUP_dn_PipeBomb";
model = "\CUP\Weapons\CUP_Weapons_Put\CUP_Satchel.p3d";
- ace_explosives_offset[] = {0, 0, 0};
};
class ACE_Mine_place_CUP: ACE_Explosives_Place {
- displayName = "AT-15 Anti-Tank Mine";
+ displayName = "$STR_CUP_dn_Mine";
model = "\CUP\Weapons\CUP_Weapons_Put\CUP_AT15.p3d";
- ace_explosives_offset[] = {0, 0, 0};
};
class ACE_MineE_place_CUP: ACE_Explosives_Place {
- displayName = "TM46 Anti-Tank Mine";
+ displayName = "$STR_CUP_dn_MineE";
model = "\CUP\Weapons\CUP_Weapons_Put\CUP_TM46.p3d";
- ace_explosives_offset[] = {0, 0, 0};
};
class ACE_IED_V1_place_CUP: ACE_Explosives_Place {
- displayName = "IED";
+ displayName = "$STR_A3_CfgVehicles_IEDUrbanSmall_F";
model = "\CUP\Weapons\CUP_Weapons_Put\CUP_IED_V1.p3d";
- ace_explosives_offset[] = {0, 0, 0};
};
class ACE_IED_V2_place_CUP: ACE_IED_V1_place_CUP {
+ displayName = "$STR_A3_CfgVehicles_IEDUrbanBig_F";
model = "\CUP\Weapons\CUP_Weapons_Put\CUP_IED_V2.p3d";
};
class ACE_IED_V3_place_CUP: ACE_IED_V1_place_CUP {
+ displayName = "$STR_A3_CfgVehicles_IEDLandSmall_F";
model = "\CUP\Weapons\CUP_Weapons_Put\CUP_IED_V3.p3d";
};
class ACE_IED_V4_place_CUP: ACE_IED_V1_place_CUP {
+ displayName = "$STR_A3_CfgVehicles_IEDLandBig_F";
model = "\CUP\Weapons\CUP_Weapons_Put\CUP_IED_V4.p3d";
};
};
diff --git a/addons/compat_cup_weapons/compat_cup_weapons_javelin/CfgAmmo.hpp b/addons/compat_cup_weapons/compat_cup_weapons_javelin/CfgAmmo.hpp
index 2632a43e61e..220af016575 100644
--- a/addons/compat_cup_weapons/compat_cup_weapons_javelin/CfgAmmo.hpp
+++ b/addons/compat_cup_weapons/compat_cup_weapons_javelin/CfgAmmo.hpp
@@ -7,20 +7,51 @@ class CfgAmmo {
class ace_missileguidance {
enabled = 1;
- minDeflection = 0.00005;
- maxDeflection = 0.025;
- incDeflection = 0.00005;
+
+ pitchRate = 120; // degrees per second
+ yawRate = 120;
+ stabilityCoefficient = 0.2;
+ bangBangGuidance = 0;
+
canVanillaLock = 0;
+
+ // Guidance type for munitions
defaultSeekerType = "Optic";
- seekerTypes[] = {"Optic"};
+ seekerTypes[] = { "Optic" };
+
defaultSeekerLockMode = "LOBL";
- seekerLockModes[] = {"LOBL"};
- seekerAngle = 180;
- seekerAccuracy = 1;
+ seekerLockModes[] = { "LOBL" };
+
+ defaultNavigationType = "Direct";
+ navigationTypes[] = { "Direct", "ZeroEffortMiss" };
+
+ navigationGain = 3;
+
+ seekerAngle = 180; // Angle in front of the missile which can be searched
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
seekerMinRange = 0;
- seekerMaxRange = 2500;
+ 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"};
+ attackProfiles[] = { "JAV_TOP", "JAV_DIR" };
+ useModeForAttackProfile = 1;
+
+ class navigationStates {
+ class initial {
+ transitionCondition = QEFUNC(missileguidance,javelin_midCourseTransition);
+ navigationType = "Direct";
+ };
+ class terminal {
+ transitionCondition = "";
+ navigationType = "ZeroEffortMiss";
+ };
+ // transitions from initial -> termimal
+ states[] = {"initial", "terminal"};
+ };
};
};
};
diff --git a/addons/compat_cup_weapons/compat_cup_weapons_nightvision/CfgWeapons.hpp b/addons/compat_cup_weapons/compat_cup_weapons_nightvision/CfgWeapons.hpp
index 04d26b8ead8..5a8e1ca4e33 100644
--- a/addons/compat_cup_weapons/compat_cup_weapons_nightvision/CfgWeapons.hpp
+++ b/addons/compat_cup_weapons/compat_cup_weapons_nightvision/CfgWeapons.hpp
@@ -34,7 +34,7 @@ class CfgWeapons {
// Binocular
class CUP_NVG_PVS14: NVGoggles {
- NVG_BINO_PRESET;
+ NVG_MONO_PRESET(3);
NVG_GREEN_PRESET;
};
class CUP_NVG_PVS15_black: NVGoggles {
diff --git a/addons/compat_gm/CfgVehicles.hpp b/addons/compat_gm/CfgVehicles.hpp
index 6d03465cd7f..d470e8a615d 100644
--- a/addons/compat_gm/CfgVehicles.hpp
+++ b/addons/compat_gm/CfgVehicles.hpp
@@ -81,15 +81,242 @@ class CfgVehicles {
class gm_brdm2_base: gm_wheeled_APC_base {
EGVAR(refuel,fuelCapacity) = 290;
+
+ class EGVAR(interaction,anims) {
+ class AmmoBox_01_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['ammobox_01', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"gm_AmmoBox_wood_04_empty"};
+ name = "$STR_DN_gm_AmmoBox_wood_04_base";
+ text = "$STR_DN_gm_AmmoBox_wood_04_base";
+ };
+ class AmmoBox_02_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['ammobox_02', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"gm_AmmoBox_wood_04_empty"};
+ name = "$STR_DN_gm_AmmoBox_wood_04_base";
+ text = "$STR_DN_gm_AmmoBox_wood_04_base";
+ };
+ class AmmoBox_03_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['ammobox_03', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"gm_AmmoBox_wood_04_empty"};
+ name = "$STR_DN_gm_AmmoBox_wood_04_base";
+ text = "$STR_DN_gm_AmmoBox_wood_04_base";
+ };
+ };
+ };
+ class gm_brdm2um_base: gm_brdm2_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class AmmoBox_01_unhide: AmmoBox_01_unhide {
+ positions[] = {{-0.1, -1.9, -0.5}};
+ };
+ class AmmoBox_02_unhide: AmmoBox_02_unhide {
+ positions[] = {{-0.55, -0.35, -0.35}};
+ };
+ class AmmoBox_03_unhide: AmmoBox_03_unhide {
+ positions[] = {{0.3, -1.85, -0.5}};
+ };
+ };
};
class gm_btr60_base: gm_wheeled_APC_base {
EGVAR(refuel,fuelCapacity) = 290;
EGVAR(cookoff,cookoffSelections)[] = {"commanderturret_hatch"};
+
+ class EGVAR(interaction,anims) {
+ class AmmoBox_01_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['ammobox_01', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ };
+ class AmmoBox_02_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['ammobox_02', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ };
+ class AmmoBox_03_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['ammobox_03', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ };
+ class AmmoBox_04_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['ammobox_04', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ };
+ class AmmoBox_05_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['ammobox_05', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ };
+ class AmmoBox_06_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['ammobox_06', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ };
+ class AmmoBox_07_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['ammobox_07', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"gm_AmmoBox_wood_04_empty"};
+ name = "$STR_DN_gm_AmmoBox_wood_04_base";
+ text = "$STR_DN_gm_AmmoBox_wood_04_base";
+ };
+ };
+ };
+
+ class gm_ural375d_base: gm_wheeled_truck_base {
+ EGVAR(refuel,fuelCapacity) = 360;
+
+ class EGVAR(interaction,anims) {
+ class AmmoBox_01_unhide {
+ phase = 0;
+ positions[] = {{-0.55, 1.83, 0.7}};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ distance = 2.5;
+ };
+ class AmmoBox_02_unhide {
+ phase = 0;
+ positions[] = {{0, 1.83, 0.7}};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ distance = 3;
+ };
+ class AmmoBox_03_unhide {
+ phase = 0;
+ positions[] = {{0.55, 1.83, 0.7}};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ distance = 2.5;
+ };
+ class AmmoBox_04_unhide {
+ phase = 0;
+ positions[] = {{-0.45, 1.83, 0.7}};
+ items[] = {"gm_AmmoBox_wood_04_empty"};
+ name = "$STR_DN_gm_AmmoBox_wood_04_base";
+ text = "$STR_DN_gm_AmmoBox_wood_04_base";
+ distance = 2.5;
+ };
+ };
+ };
+ class gm_ural375d_mlrs_base: gm_ural375d_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class AmmoBox_01_unhide: AmmoBox_01_unhide {
+ positions[] = {{-0.55, 2, 0.5}};
+ };
+ class AmmoBox_02_unhide: AmmoBox_02_unhide {
+ positions[] = {{0, 2, 0.5}};
+ };
+ class AmmoBox_03_unhide: AmmoBox_03_unhide {
+ positions[] = {{0.55, 2, 0.5}};
+ };
+ class AmmoBox_04_unhide: AmmoBox_04_unhide {
+ positions[] = {{-0.45, 2, 0.5}};
+ };
+ };
+ };
+ class gm_ural375d_medic_base: gm_ural375d_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class AmmoBox_01_unhide: AmmoBox_01_unhide {
+ positions[] = {{-0.55, 2, 0.7}};
+ };
+ class AmmoBox_02_unhide: AmmoBox_02_unhide {
+ positions[] = {{0, 2, 0.7}};
+ };
+ class AmmoBox_03_unhide: AmmoBox_03_unhide {
+ positions[] = {{0.55, 2, 0.7}};
+ };
+ class AmmoBox_04_unhide: AmmoBox_04_unhide {
+ positions[] = {{-0.45, 2, 0.7}};
+ };
+ };
};
class gm_ural4320_base: gm_wheeled_truck_base {
EGVAR(refuel,fuelCapacity) = 360;
+
+ class EGVAR(interaction,anims) {
+ class AmmoBox_01_unhide {
+ phase = 0;
+ positions[] = {{-0.55, 1.47, 0.7}};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ distance = 2.5;
+ };
+ class AmmoBox_02_unhide {
+ phase = 0;
+ positions[] = {{0, 1.47, 0.7}};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ distance = 3;
+ };
+ class AmmoBox_03_unhide {
+ phase = 0;
+ positions[] = {{0.55, 1.47, 0.7}};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ distance = 2.5;
+ };
+ class AmmoBox_04_unhide {
+ phase = 0;
+ positions[] = {{-0.45, 1.47, 0.7}};
+ items[] = {"gm_AmmoBox_wood_04_empty"};
+ name = "$STR_DN_gm_AmmoBox_wood_04_base";
+ text = "$STR_DN_gm_AmmoBox_wood_04_base";
+ distance = 2.5;
+ };
+ };
+ };
+ class gm_ural4320_repair_base: gm_ural4320_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class AmmoBox_01_unhide: AmmoBox_01_unhide {
+ positions[] = {{-0.55, 1.62, 0.7}};
+ };
+ class AmmoBox_02_unhide: AmmoBox_02_unhide {
+ positions[] = {{0, 1.62, 0.7}};
+ };
+ class AmmoBox_03_unhide: AmmoBox_03_unhide {
+ positions[] = {{0.55, 1.62, 0.7}};
+ };
+ class AmmoBox_04_unhide: AmmoBox_04_unhide {
+ positions[] = {{-0.45, 1.62, 0.7}};
+ };
+ };
+ };
+ class gm_ural44202_base: gm_ural4320_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class AmmoBox_01_unhide: AmmoBox_01_unhide {
+ positions[] = {{-0.55, 1.37, 0.7}};
+ };
+ class AmmoBox_02_unhide: AmmoBox_02_unhide {
+ positions[] = {{0, 1.37, 0.7}};
+ };
+ class AmmoBox_03_unhide: AmmoBox_03_unhide {
+ positions[] = {{0.55, 1.37, 0.7}};
+ };
+ class AmmoBox_04_unhide: AmmoBox_04_unhide {
+ positions[] = {{-0.45, 1.37, 0.7}};
+ };
+ };
};
class gm_ural4320_reammo_base: gm_ural4320_base {
@@ -190,9 +417,103 @@ class CfgVehicles {
EGVAR(refuel,fuelCapacity) = 460;
EGVAR(cookoff,cookoffSelections)[] = {"mainturret_hatch","commanderturret_hatch"};
};
+ class gm_bmp1sp2_base: gm_bmp1_base {
+ class EGVAR(interaction,anims) {
+ class AmmoBox_01_unhide {
+ phase = 0;
+ positions[] = {{-1.2, -2.52, -1.2}};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ };
+ class AmmoBox_02_unhide {
+ phase = 0;
+ positions[] = {{-1.3, -2, -1.2}};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ };
+ class AmmoBox_03_unhide {
+ phase = 0;
+ positions[] = {{-1.35, -1.43, -1.2}};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ };
+ class AmmoBox_04_unhide {
+ phase = 0;
+ positions[] = {{1.2, -2.52, -1.2}};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ };
+ class AmmoBox_05_unhide {
+ phase = 0;
+ positions[] = {{1.3, -2, -1.2}};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ };
+ class AmmoBox_06_unhide {
+ phase = 0;
+ positions[] = {{1.35, -1.43, -1.2}};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ };
+ class AmmoBox_07_unhide {
+ phase = 0;
+ positions[] = {{-1.45, 0.1, -1.3}};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ };
+ class AmmoBox_08_unhide {
+ phase = 0;
+ positions[] = {{-1.45, 2, -1.3}};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ };
+ class AmmoBox_09_unhide {
+ phase = 0;
+ positions[] = {{1.45, 2, -1.3}};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ };
+ };
+ };
class gm_pt76_base: gm_tracked_Tank_base {
EGVAR(refuel,fuelCapacity) = 250;
+
+ class EGVAR(interaction,anims) {
+ class AmmoBox_01_unhide {
+ phase = 0;
+ positions[] = {{0.08, -1.75, -1}};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ distance = 2.5;
+ };
+ class AmmoBox_02_unhide {
+ phase = 0;
+ positions[] = {{0.08, -1.38, -1}};
+ items[] = {"gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47"};
+ name = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ text = "$STR_DN_gm_AmmoBox_880Rnd_762x39mm_b_M43_ak47";
+ distance = 2.5;
+ };
+ class AmmoBox_03_unhide {
+ phase = 0;
+ positions[] = {{0.08, -2.15, -1}};
+ items[] = {"gm_AmmoBox_wood_04_empty"};
+ name = "$STR_DN_gm_AmmoBox_wood_04_base";
+ text = "$STR_DN_gm_AmmoBox_wood_04_base";
+ distance = 2.5;
+ };
+ };
};
class gm_t55_base: gm_tracked_Tank_base {
@@ -204,6 +525,21 @@ class CfgVehicles {
EGVAR(refuel,fuelCapacity) = 812;
};
+ class gm_tracked_Artillery_base;
+ class gm_2s1_base: gm_tracked_Artillery_base {
+ class EGVAR(interaction,anims) {
+ class AmmoBox_01_unhide {
+ phase = 0;
+ // Rotate interactions with turret rotation
+ positions[] = {"[0, -1.3, 0] vectorAdd ([[0, -1.1, -0.35], [0, 0, 1], deg (_target animationPhase 'mainturret_trav_anim')] call CBA_fnc_vectRotate3D)"};
+ items[] = {"gm_AmmoBox_wood_04_empty"};
+ name = "$STR_DN_gm_AmmoBox_wood_04_base";
+ text = "$STR_DN_gm_AmmoBox_wood_04_base";
+ distance = 2.5;
+ };
+ };
+ };
+
// WEST
class gm_Leopard1_base;
class gm_Leopard1a0_base: gm_Leopard1_base {
@@ -211,6 +547,27 @@ class CfgVehicles {
EGVAR(cookoff,cookoffSelections)[] = {"mainturret_hatch_1","commanderturret_hatch"};
};
+ class gm_Leopard1a1_base: gm_Leopard1a0_base {
+ class EGVAR(interaction,anims) {
+ class AmmoBox_01_unhide {
+ phase = 0;
+ // Rotate interactions with turret rotation
+ positions[] = {"[0, -0.6, 0] vectorAdd ([[0.7, -2, -0.6], [0, 0, 1], deg (_target animationPhase 'mainturret_trav_anim')] call CBA_fnc_vectRotate3D)"};
+ items[] = {"gm_AmmoBox_wood_04_empty"};
+ name = "$STR_DN_gm_AmmoBox_wood_04_base";
+ text = "$STR_DN_gm_AmmoBox_wood_04_base";
+ };
+ class AmmoBox_02_unhide {
+ phase = 0;
+ // Rotate interactions with turret rotation
+ positions[] = {"[0, -0.6, 0] vectorAdd ([[-0.3, -1.95, -0.6], [0, 0, 1], deg (_target animationPhase 'mainturret_trav_anim')] call CBA_fnc_vectRotate3D)"};
+ items[] = {"gm_AmmoBox_wood_04_empty"};
+ name = "$STR_DN_gm_AmmoBox_wood_04_base";
+ text = "$STR_DN_gm_AmmoBox_wood_04_base";
+ };
+ };
+ };
+
class gm_Gepard_base: gm_Leopard1_base {
EGVAR(refuel,fuelCapacity) = 985;
};
@@ -257,42 +614,39 @@ class CfgVehicles {
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 openDoor_L {
+ displayNameDefault = "$STR_a3_cfgvehicles_useractions_openldoor0";
+ displayName = "$STR_a3_cfgvehicles_useractions_openldoor0";
+ 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(QQEGVAR(fastroping,doorsLocked),false)])});
+ statement = "this animateDoor ['door_2_1_source',1]";
+ };
+ class openDoor_R: openDoor_L {
+ displayNameDefault = "$STR_a3_cfgvehicles_useractions_openrdoor0";
+ displayName = "$STR_a3_cfgvehicles_useractions_openrdoor0";
+ condition = QUOTE((this animationSourcePhase 'door_2_2_unhide' > 0.5) && (this doorPhase 'door_2_2_source' < 0.5) && {alive this} && {!(this getVariable [ARR_2(QQEGVAR(fastroping,doorsLocked),false)])});
+ statement = "this animateDoor ['door_2_2_source',1]";
+ };
+
+ class closeDoor_L {
+ displayNameDefault = "$STR_a3_cfgvehicles_useractions_closeldoor0";
+ displayName = "$STR_a3_cfgvehicles_useractions_closeldoor0";
+ 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(QQEGVAR(fastroping,doorsLocked),false)])});
+ statement = "this animateDoor ['door_2_1_source',0]";
+ };
+ class closeDoor_R: closeDoor_L {
+ displayNameDefault = "$STR_a3_cfgvehicles_useractions_closerdoor0";
+ displayName = "$STR_a3_cfgvehicles_useractions_closerdoor0";
+ condition = QUOTE((this animationSourcePhase 'door_2_2_unhide' > 0.5) && (this doorPhase 'door_2_2_source' > 0.5) && {alive this} && {!(this getVariable [ARR_2(QQEGVAR(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 {
diff --git a/addons/compat_gm/compat_gm_explosives/CfgAmmo.hpp b/addons/compat_gm/compat_gm_explosives/CfgAmmo.hpp
index 3da49f45abe..a8f9ca632e5 100644
--- a/addons/compat_gm/compat_gm_explosives/CfgAmmo.hpp
+++ b/addons/compat_gm/compat_gm_explosives/CfgAmmo.hpp
@@ -1,9 +1,10 @@
class CfgAmmo {
- class PipeBombBase;
- class gm_explosive_petn_charge: PipeBombBase {
+ class gm_explosive_petn_base;
+ class gm_explosive_charge_petn: gm_explosive_petn_base {
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
- class gm_explosive_plnp_charge: PipeBombBase {
+ class gm_explosive_plnp_base;
+ class gm_explosive_charge_plnp: gm_explosive_plnp_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
index 17d51d3b457..f0afb3b90cd 100644
--- a/addons/compat_gm/compat_gm_explosives/CfgMagazines.hpp
+++ b/addons/compat_gm/compat_gm_explosives/CfgMagazines.hpp
@@ -2,9 +2,8 @@ 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);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_gm_explosive_petn);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"};
@@ -21,9 +20,8 @@ class CfgMagazines {
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);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_gm_explosive_plnp);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"};
@@ -40,8 +38,8 @@ class CfgMagazines {
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);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_gm_mine_tm46);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -51,8 +49,8 @@ class CfgMagazines {
};
};
class gm_mine_at_dm21: gm_mine_at_base {
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_dm21);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_gm_explosive_dm21);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -62,8 +60,8 @@ class CfgMagazines {
};
};
class gm_mine_at_mn111: gm_mine_at_base {
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_m111);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_gm_explosive_m111);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -74,8 +72,8 @@ class CfgMagazines {
};
class gm_mine_ap_dm31: gm_mine_at_base {
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_dm31);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_gm_explosive_dm31);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
diff --git a/addons/compat_gm/compat_gm_explosives/CfgVehicles.hpp b/addons/compat_gm/compat_gm_explosives/CfgVehicles.hpp
index bb279c82b94..ea201aa579a 100644
--- a/addons/compat_gm/compat_gm_explosives/CfgVehicles.hpp
+++ b/addons/compat_gm/compat_gm_explosives/CfgVehicles.hpp
@@ -9,7 +9,7 @@ class CfgVehicles {
// CHARGE
class EGVAR(explosives,Place_gm_explosive_petn): EGVAR(explosives,Place) {
- displayName = "PETN Charge";
+ displayName = "$STR_DN_GM_EXPLOSIVE_PETN_CHARGE";
model = "gm\gm_weapons\gm_put\gm_explosive_charge_petn";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -18,7 +18,7 @@ class CfgVehicles {
};
};
class EGVAR(explosives,Place_gm_explosive_plnp): EGVAR(explosives,Place) {
- displayName = "PLNP Charge";
+ displayName = "$STR_DN_GM_EXPLOSIVE_PLNP_CHARGE";
model = "gm\gm_weapons\gm_put\gm_explosive_charge_plnp";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -28,7 +28,7 @@ class CfgVehicles {
};
// AT MINE
class EGVAR(explosives,Place_gm_mine_tm46): EGVAR(explosives,Place) {
- displayName = "AT Mine TM46";
+ displayName = "$STR_DN_GM_MINE_AT_TM46";
model = "gm\gm_weapons\gm_put\gm_mine_at_tm46";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -37,7 +37,7 @@ class CfgVehicles {
};
};
class EGVAR(explosives,Place_gm_explosive_dm21): EGVAR(explosives,Place) {
- displayName = "AT Mine DM21";
+ displayName = "$STR_DN_GM_MINE_AT_DM21";
model = "gm\gm_weapons\gm_put\gm_mine_at_dm21";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -46,7 +46,7 @@ class CfgVehicles {
};
};
class EGVAR(explosives,Place_gm_explosive_m111): EGVAR(explosives,Place) {
- displayName = "MN 111";
+ displayName = "$STR_DN_GM_MINE_AT_MN111";
model = "gm\gm_weapons\gm_launchers\gm_platan\gm_mine_at_mn111_disarmed";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -56,7 +56,7 @@ class CfgVehicles {
};
// AP
class EGVAR(explosives,Place_gm_explosive_dm31): EGVAR(explosives,Place) {
- displayName = "AP Mine DM31";
+ displayName = "$STR_DN_GM_MINE_AP_DM31";
model = "gm\gm_weapons\gm_put\gm_mine_ap_dm31";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
diff --git a/addons/compat_gm/compat_gm_explosives/config.cpp b/addons/compat_gm/compat_gm_explosives/config.cpp
index e240c283896..9b4d16a1e6c 100644
--- a/addons/compat_gm/compat_gm_explosives/config.cpp
+++ b/addons/compat_gm/compat_gm_explosives/config.cpp
@@ -8,6 +8,7 @@ class CfgPatches {
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {
"gm_core",
+ "gm_weapons_put",
"ace_explosives"
};
skipWhenMissingDependencies = 1;
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 00000000000..aa51d469799
--- /dev/null
+++ b/addons/compat_gm/compat_gm_refuel/CfgVehicles.hpp
@@ -0,0 +1,336 @@
+class CfgVehicles {
+ class gm_typ2_base;
+ class gm_typ251_base: gm_typ2_base {
+ class EGVAR(interaction,anims) {
+ class canister_01_unhide {
+ phase = 0;
+ positions[] = {{-0.55, -0.17, 0.4}};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ class canister_02_unhide {
+ phase = 0;
+ positions[] = {{-0.55, -0.65, 0.4}};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+ class gm_typ253_base: gm_typ2_base {
+ class EGVAR(interaction,anims) {
+ class canister_01_unhide {
+ phase = 0;
+ positions[] = {{-0.55, -0.19, 0.4}};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ class canister_02_unhide {
+ phase = 0;
+ positions[] = {{-0.55, -0.68, 0.4}};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+
+ class gm_wheeled_truck_base;
+ class gm_ural375d_base: gm_wheeled_truck_base {
+ class EGVAR(interaction,anims) {
+ class fuelcan_1_1_unhide {
+ phase = 0;
+ positions[] = {{-0.95, 3.15, -0.45}};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ class fuelcan_1_2_unhide {
+ phase = 0;
+ positions[] = {{0.9, 3.15, -0.45}};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+ class gm_ural375d_mlrs_base: gm_ural375d_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class fuelcan_1_1_unhide: fuelcan_1_1_unhide {
+ positions[] = {{-0.95, 3.35, -0.55}};
+ };
+ class fuelcan_1_2_unhide: fuelcan_1_2_unhide {
+ positions[] = {{0.9, 3.35, -0.55}};
+ };
+ };
+ };
+ class gm_ural375d_medic_base: gm_ural375d_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class fuelcan_1_1_unhide: fuelcan_1_1_unhide {
+ positions[] = {{-0.95, 3.35, -0.45}};
+ };
+ class fuelcan_1_2_unhide: fuelcan_1_2_unhide {
+ positions[] = {{0.9, 3.35, -0.45}};
+ };
+ };
+ };
+
+ class gm_ural4320_base: gm_wheeled_truck_base {
+ class EGVAR(interaction,anims) {
+ class fuelcan_1_1_unhide {
+ phase = 0;
+ positions[] = {{-0.9, 3.1, -0.4}};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ class fuelcan_1_2_unhide {
+ phase = 0;
+ positions[] = {{0.9, 3.1, -0.4}};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+ class gm_ural4320_repair_base: gm_ural4320_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class fuelcan_1_1_unhide: fuelcan_1_1_unhide {
+ positions[] = {{-0.9, 3.25, -0.4}};
+ };
+ class fuelcan_1_2_unhide: fuelcan_1_2_unhide {
+ positions[] = {{0.9, 3.25, -0.4}};
+ };
+ };
+ };
+ class gm_ural44202_base: gm_ural4320_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class fuelcan_1_1_unhide: fuelcan_1_1_unhide {
+ positions[] = {{-0.9, 3, -0.4}};
+ };
+ class fuelcan_1_2_unhide: fuelcan_1_2_unhide {
+ positions[] = {{0.9, 3, -0.4}};
+ };
+ };
+ };
+
+ class gm_wheeled_APC_base;
+ class gm_brdm2_base: gm_wheeled_APC_base {
+ class EGVAR(interaction,anims) {
+ class FuelCanister_01_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['fuelcanister_01', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ class FuelCanister_02_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['fuelcanister_02', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ class FuelCanister_03_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['fuelcanister_03', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+ class gm_brdm2um_base: gm_brdm2_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class FuelCanister_01_unhide: FuelCanister_01_unhide {
+ positions[] = {{0.87, -3, -1.2}};
+ };
+ class FuelCanister_02_unhide: FuelCanister_02_unhide {
+ positions[] = {{-0.87, -3, -1.2}};
+ };
+ class FuelCanister_03_unhide: FuelCanister_03_unhide {
+ positions[] = {{-0.4, -1.85, -0.5}};
+ };
+ };
+ };
+
+ class gm_btr60_base: gm_wheeled_APC_base {
+ class EGVAR(interaction,anims) {
+ class FuelCanister_01_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['fuelcanister_01', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ class FuelCanister_02_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['fuelcanister_02', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ class FuelCanister_03_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['fuelcanister_03', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ class FuelCanister_04_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['fuelcanister_04', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ class FuelCanister_05_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['fuelcanister_05', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ class FuelCanister_06_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['fuelcanister_06', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+ class gm_btr60pa_base: gm_btr60_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class FuelCanister_05_unhide: FuelCanister_05_unhide {
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ };
+ class FuelCanister_06_unhide: FuelCanister_06_unhide {
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ };
+ };
+ };
+ class gm_btr60pb_base: gm_btr60_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class FuelCanister_03_unhide: FuelCanister_03_unhide {
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ };
+ class FuelCanister_04_unhide: FuelCanister_04_unhide {
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ };
+ };
+ };
+ class gm_btr60pu12_base: gm_btr60_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class FuelCanister_03_unhide: FuelCanister_03_unhide {
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ };
+ class FuelCanister_04_unhide: FuelCanister_04_unhide {
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ };
+ };
+ };
+
+ class gm_bmp1_base;
+ class gm_bmp1sp2_base: gm_bmp1_base {
+ class EGVAR(interaction,anims) {
+ class FuelCanister_01_unhide {
+ phase = 0;
+ positions[] = {{-1.2, -2.52, -1.2}};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ class FuelCanister_02_unhide {
+ phase = 0;
+ positions[] = {{1.2, -2.52, -1.2}};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+
+ class gm_zsu234_base;
+ class gm_zsu234v1_base: gm_zsu234_base {
+ class EGVAR(interaction,anims) {
+ class FuelCanister_01_unhide {
+ phase = 0;
+ // Rotate interactions with turret rotation
+ positions[] = {"[0, 0.2, 0] vectorAdd ([[-0.85, -2.2, -0.9], [0, 0, 1], deg (_target animationPhase 'mainturret_trav_anim')] call CBA_fnc_vectRotate3D)"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ class FuelCanister_02_unhide {
+ phase = 0;
+ // Rotate interactions with turret rotation
+ positions[] = {"[0, 0.2, 0] vectorAdd ([[0.7, -2.25, -0.85], [0, 0, 1], deg (_target animationPhase 'mainturret_trav_anim')] call CBA_fnc_vectRotate3D)"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ class FuelCanister_03_unhide {
+ phase = 0;
+ // Rotate interactions with turret rotation
+ positions[] = {"[0, 0.2, 0] vectorAdd ([[0.92, -2.25, -0.85], [0, 0, 1], deg (_target animationPhase 'mainturret_trav_anim')] call CBA_fnc_vectRotate3D)"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+
+ class gm_tracked_Tank_base;
+ class gm_pt76_base: gm_tracked_Tank_base {
+ class EGVAR(interaction,anims) {
+ class FuelTank_01_unhide {
+ phase = 0;
+ positions[] = {{-1, -2.85, -1}};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ class FuelTank_02_unhide {
+ phase = 0;
+ positions[] = {{1, -2.85, -1}};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+
+ class gm_Leopard1a0_base;
+ class gm_Leopard1a1_base: gm_Leopard1a0_base {
+ class EGVAR(interaction,anims) {
+ class FuelCanister_01_unhide {
+ phase = 0;
+ // Rotate interactions with turret rotation
+ positions[] = {"[0, -0.6, 0] vectorAdd ([[0.25, -1.9, -0.55], [0, 0, 1], deg (_target animationPhase 'mainturret_trav_anim')] call CBA_fnc_vectRotate3D)"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ distance = 2.5;
+ };
+ class FuelCanister_02_unhide {
+ phase = 0;
+ // Rotate interactions with turret rotation
+ positions[] = {"[0, -0.6, 0] vectorAdd ([[-0.8, -1.65, -0.55], [0, 0, 1], deg (_target animationPhase 'mainturret_trav_anim')] call CBA_fnc_vectRotate3D)"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ class FuelCanister_03_unhide {
+ phase = 0;
+ // Rotate interactions with turret rotation
+ positions[] = {"[0, -0.6, 0] vectorAdd ([[0.8, -1.8, -0.55], [0, 0, 1], deg (_target animationPhase 'mainturret_trav_anim')] call CBA_fnc_vectRotate3D)"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+};
diff --git a/addons/compat_gm/compat_gm_refuel/config.cpp b/addons/compat_gm/compat_gm_refuel/config.cpp
index 05688eff702..6becabe70a9 100644
--- a/addons/compat_gm/compat_gm_refuel/config.cpp
+++ b/addons/compat_gm/compat_gm_refuel/config.cpp
@@ -21,3 +21,4 @@ class CfgPatches {
};
#include "CfgEventHandlers.hpp"
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_gm/compat_gm_repair/CfgVehicles.hpp b/addons/compat_gm/compat_gm_repair/CfgVehicles.hpp
new file mode 100644
index 00000000000..12f9253bba6
--- /dev/null
+++ b/addons/compat_gm/compat_gm_repair/CfgVehicles.hpp
@@ -0,0 +1,100 @@
+class CfgVehicles {
+ class gm_wheeled_car_base;
+ class gm_uaz469_base: gm_wheeled_car_base {
+ class EGVAR(interaction,anims) {
+ class spare_wheel_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['spare_wheel', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ class gm_wheeled_APC_base;
+ class gm_brdm2_base: gm_wheeled_APC_base {
+ class EGVAR(interaction,anims) {
+ class SpareWheel_01_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['sparewheel_01', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ distance = 2.5;
+ };
+ class SpareWheel_02_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['sparewheel_02', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+ class gm_brdm2um_base: gm_brdm2_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class SpareWheel_01_unhide: SpareWheel_01_unhide {
+ positions[] = {{0.2, -0.7, -0.25}};
+ distance = 2;
+ };
+ class SpareWheel_02_unhide: SpareWheel_02_unhide {
+ positions[] = {{0, -1.6, -0.4}};
+ };
+ };
+ };
+
+ class gm_btr60_base: gm_wheeled_APC_base {
+ class EGVAR(interaction,anims) {
+ class SpareWheel_01_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['sparewheel_01', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ distance = 3;
+ };
+ class SpareWheel_02_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['sparewheel_02', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ class SpareWheel_03_unhide {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['sparewheel_03', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ class gm_bmp1_base;
+ class gm_bmp1sp2_base: gm_bmp1_base {
+ class EGVAR(interaction,anims) {
+ class spareTracks_1_1_unhide {
+ phase = 0;
+ positions[] = {"(_target selectionPosition ['door_1_1', 'FireGeometry', 'AveragePoint']) vectorAdd [0, 0, -0.15]"};
+ items[] = {"ACE_Track"};
+ name = ECSTRING(repair,RemoveTrack);
+ text = ECSTRING(repair,RemovingTrack);
+ };
+ class spareTracks_1_2_unhide {
+ phase = 0;
+ positions[] = {"(_target selectionPosition ['door_1_2', 'FireGeometry', 'AveragePoint']) vectorAdd [0, 0, -0.15]"};
+ items[] = {"ACE_Track"};
+ name = ECSTRING(repair,RemoveTrack);
+ text = ECSTRING(repair,RemovingTrack);
+ };
+ class spareTracks_2_1_unhide {
+ phase = 0;
+ positions[] = {{-1.1, -2.7, -1.3}, {1.1, -2.7, -1.3}};
+ items[] = {"ACE_Track", "ACE_Track"};
+ name = ECSTRING(repair,RemoveTrack);
+ text = ECSTRING(repair,RemovingTrack);
+ };
+ };
+ };
+};
diff --git a/addons/compat_gm/compat_gm_repair/config.cpp b/addons/compat_gm/compat_gm_repair/config.cpp
new file mode 100644
index 00000000000..6fae9858b4b
--- /dev/null
+++ b/addons/compat_gm/compat_gm_repair/config.cpp
@@ -0,0 +1,23 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {
+ "gm_core",
+ "ace_repair"
+ };
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"johnb43"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ addonRootClass = QUOTE(ADDON);
+ };
+};
+
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_gm/compat_gm_repair/script_component.hpp b/addons/compat_gm/compat_gm_repair/script_component.hpp
new file mode 100644
index 00000000000..1af928486c3
--- /dev/null
+++ b/addons/compat_gm/compat_gm_repair/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT repair
+#define SUBCOMPONENT_BEAUTIFIED Repair
+#include "..\script_component.hpp"
diff --git a/addons/compat_gm/compat_gm_trenches/CfgVehicles.hpp b/addons/compat_gm/compat_gm_trenches/CfgVehicles.hpp
new file mode 100644
index 00000000000..b5c32d8be1e
--- /dev/null
+++ b/addons/compat_gm/compat_gm_trenches/CfgVehicles.hpp
@@ -0,0 +1,47 @@
+class CfgVehicles {
+ class gm_wheeled_truck_base;
+ class gm_ural375d_base: gm_wheeled_truck_base {
+ class EGVAR(interaction,anims) {
+ class tools_unhide {
+ phase = 0;
+ positions[] = {{0.9, 3.15, -0.5}};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+ class gm_ural375d_mlrs_base: gm_ural375d_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class tools_unhide: tools_unhide {
+ positions[] = {{0.9, 3.35, -0.65}};
+ };
+ };
+ };
+ class gm_ural375d_medic_base: gm_ural375d_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class tools_unhide: tools_unhide {
+ positions[] = {{0.9, 3.35, -0.5}};
+ };
+ };
+ };
+
+ class gm_ural4320_base: gm_wheeled_truck_base {
+ class EGVAR(interaction,anims) {
+ class tools_unhide {
+ phase = 0;
+ positions[] = {{0.93, 2.7, -0.5}};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+ class gm_ural44202_base: gm_ural4320_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class tools_unhide: tools_unhide {
+ positions[] = {{0.9, 2.6, -0.5}};
+ };
+ };
+ };
+};
diff --git a/addons/compat_gm/compat_gm_trenches/config.cpp b/addons/compat_gm/compat_gm_trenches/config.cpp
new file mode 100644
index 00000000000..13c4dd0816d
--- /dev/null
+++ b/addons/compat_gm/compat_gm_trenches/config.cpp
@@ -0,0 +1,23 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {
+ "gm_core",
+ "ace_trenches"
+ };
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"johnb43"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ addonRootClass = QUOTE(ADDON);
+ };
+};
+
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_gm/compat_gm_trenches/script_component.hpp b/addons/compat_gm/compat_gm_trenches/script_component.hpp
new file mode 100644
index 00000000000..10b90eb71e5
--- /dev/null
+++ b/addons/compat_gm/compat_gm_trenches/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT trenches
+#define SUBCOMPONENT_BEAUTIFIED Trenches
+#include "..\script_component.hpp"
diff --git a/addons/compat_rf/CfgVehicles.hpp b/addons/compat_rf/CfgVehicles.hpp
new file mode 100644
index 00000000000..fa0343908a9
--- /dev/null
+++ b/addons/compat_rf/CfgVehicles.hpp
@@ -0,0 +1,25 @@
+class CfgVehicles {
+ // Applies the offset to all RF Offroads which can have the optional tank in the back
+ class Offroad_01_unarmed_base_F;
+ class Pickup_01_base_rf: Offroad_01_unarmed_base_F {
+ EXGVAR(field_rations,offset)[] = {-0.04, -2.45, -0.9};
+ };
+
+ // Enable Water Source by Default
+ class C_IDAP_Pickup_rf;
+ class C_IDAP_Pickup_water_rf: C_IDAP_Pickup_rf {
+ EXGVAR(field_rations,waterSupply) = 500;
+ };
+
+ class O_Truck_03_fuel_F;
+ class C_Truck_03_water_rf: O_Truck_03_fuel_F {
+ EXGVAR(field_rations,waterSupply) = 10000;
+ EXGVAR(field_rations,offset)[] = {0, -5.05, -0.3};
+ };
+
+ class B_Truck_01_fuel_F;
+ class C_Truck_01_water_rf: B_Truck_01_fuel_F {
+ EXGVAR(field_rations,waterSupply) = 10000;
+ EXGVAR(field_rations,offset)[] = {-0.41, -5.15, -0.3};
+ };
+};
diff --git a/addons/compat_rf/compat_rf_realisticnames/stringtable.xml b/addons/compat_rf/compat_rf_realisticnames/stringtable.xml
index 03d5003a620..16a6e927897 100644
--- a/addons/compat_rf/compat_rf_realisticnames/stringtable.xml
+++ b/addons/compat_rf/compat_rf_realisticnames/stringtable.xml
@@ -7,6 +7,7 @@
이오텍 MRDS (카키)
EOTech MRDS (Khaki)
EOTech MRDS (Cachi)
+ EOTech MRDS (Khaki)
EOTech MRDS (Tan)
@@ -14,6 +15,7 @@
이오텍 MRDS (황갈)
EOTech MRDS (Hellbraun)
EOTech MRDS (Marroncino)
+ EOTech MRDS (Marron)
C-More Railway (Green, Desert)
@@ -21,6 +23,7 @@
씨모어 레일웨이 (녹색, 사막)
C-More Railway (Grün, Wüste)
C-More Railway (Verde, Deserto)
+ C-More Railway (Vert, Désert)
C-More Railway (Green, Woodland)
@@ -28,6 +31,7 @@
씨모어 레일웨이 (녹색, 수풀 위장)
C-More Railway (Grün, Grünes Tarnmuster)
C-More Railway (Verde, Boschivo)
+ C-More Railway (Vert, Woodland)
C-More Railway (Red, Desert)
@@ -35,6 +39,7 @@
씨모어 레일웨이 (빨강, 사막)
C-More Railway (Rot, Wüste)
C-More Railway (Rosso, Desert)
+ C-More Railway (Rouge, Désert)
C-More Railway (Red, Woodland)
@@ -42,6 +47,7 @@
씨모어 레일웨이 (빨강, 수풀)
C-More Railway (Rot, Grünes Tarnmuster)
C-More Railway (Rosso, Boschivo)
+ C-More Railway (Rouge, Woodland)
Aimpoint Micro R-1
@@ -49,6 +55,7 @@
에임포인트 마이크로 R-1
Aimpoint Micro R-1
Aimpoint Micro R-1
+ Aimpoint Micro R-1
Vortex Spitfire Prism
@@ -56,6 +63,7 @@
버텍스 스핏파이어 프리즘
Vortex Spitfire Prism
Vortex Spitfire Prism
+ Vortex Spitfire Prism
Vortex Spitfire Prism (Tan)
@@ -63,6 +71,7 @@
버텍스 스핏파이어 프리즘 (황갈)
Vortex Spitfire Prism (Hellbraun)
Vortex Spitfire Prism (Marroncino)
+ Vortex Spitfire Prism (Marron)
Vortex Spitfire Prism (Khaki)
@@ -70,6 +79,7 @@
버텍스 스핏파이어 프리즘 (카키)
Vortex Spitfire Prism (Khaki)
Vortex Spitfire Prism (Cachi)
+ Vortex Spitfire Prism (Khaki)
Vortex Spitfire Prism (Pistol)
@@ -77,6 +87,7 @@
버텍스 스핏파이어 프리즘 (권총용)
Vortex Spitfire Prism (Pistole)
Vortex Spitfire Prism (Pistola)
+ Vortex Spitfire Prism (Pistol)
Glock 19X
@@ -84,6 +95,7 @@
글록 19X
Glock 19X
Glock 19X
+ Glock 19X
Glock 19X (Khaki)
@@ -91,6 +103,7 @@
글록 19X (카키)
Glock 19X (Khaki)
Glock 19X (Cachi)
+ Glock 19X (Khaki)
Glock 19X (Tan)
@@ -98,6 +111,7 @@
글록 19X (황갈)
Glock 19X (Hellbraun)
Glock 19X (Marroncino)
+ Glock 19X (Marron)
Glock 19X Auto
@@ -105,6 +119,7 @@
글록 19X 기관권총
Glock 19X Auto
Glock 19X Auto
+ Glock 19X Auto
Glock 19X Auto (Khaki)
@@ -112,6 +127,7 @@
글록 19X 기관권총 (카키)
Glock 19X Auto (Khaki)
Glock 19X Auto (Cachi)
+ Glock 19X Auto (Khaki)
Glock 19X Auto (Tan)
@@ -119,6 +135,7 @@
글록 19X 기관권총 (황갈)
Glock 19X Auto (Hellbraun)
Glock 19X Auto (Marroncino)
+ Glock 19X Auto (Marron)
Desert Eagle Mark XIX L5
@@ -126,6 +143,7 @@
데저트 이글 마크 XIX L5
Desert Eagle Mark XIX L5
Desert Eagle Mark XIX L5
+ Desert Eagle Mark XIX L5
Desert Eagle Mark XIX L5 (Classic)
@@ -133,6 +151,7 @@
데저트 이글 마크 XIX L5 (클래식)
Desert Eagle Mark XIX L5 (Klassisch)
Desert Eagle Mark XIX L5 (Classico)
+ Desert Eagle Mark XIX L5 (Classique)
Desert Eagle Mark XIX L5 (Bronze)
@@ -140,6 +159,7 @@
데저트 이글 마크 XIX L5 (브론즈)
Desert Eagle Mark XIX L5 (Bronze)
Desert Eagle Mark XIX L5 (Bronzo)
+ Desert Eagle Mark XIX L5 (Bronze)
Desert Eagle Mark XIX L5 (Copper)
@@ -147,6 +167,7 @@
데저트 이글 마크 XIX L5 (구리)
Desert Eagle Mark XIX L5 (Kupfer)
Desert Eagle Mark XIX L5 (Rame)
+ Desert Eagle Mark XIX L5 (Cuivre)
Desert Eagle Mark XIX L5 (Gold)
@@ -154,6 +175,7 @@
데저트 이글 마크 XIX L5 (금색)
Desert Eagle Mark XIX L5 (Gold)
Desert Eagle Mark XIX L5 (Oro)
+ Desert Eagle Mark XIX L5 (Or)
HERA H6 (Tan)
@@ -161,6 +183,7 @@
헤라 H6 (황갈)
HERA H6 (Hellbraun)
HERA H6 (Marroncino)
+ HERA H6 (Marron)
HERA H6 (Olive)
@@ -168,6 +191,7 @@
헤라 H6 (올리브)
HERA H6 (Olivgrün)
HERA H6 (Oliva)
+ HERA H6 (Olive)
HERA H6 (Black)
@@ -175,6 +199,7 @@
헤라 H6 (검정)
HERA H6 (Schwarz)
HERA H6 (Nero)
+ HERA H6 (Noir)
HERA H6 (Digital)
@@ -182,6 +207,7 @@
헤라 H6 (AAF 디지털)
HERA H6 (Digital)
HERA H6 (Digitale)
+ HERA H6 (Digital)
HERA H6 (Gold)
@@ -189,6 +215,7 @@
헤라 H6 (금색)
HERA H6 (Gold)
HERA H6 (Oro)
+ HERA H6 (Or)
VS-121 (Black)
@@ -196,6 +223,7 @@
VS-121 (검정)
VS-121 (Schwarz)
VS-121 (Nero)
+ VS-121 (Noir)
VS-121 (Tan)
@@ -203,6 +231,7 @@
VS-121 (황갈)
VS-121 (Hellbraun)
VS-121 (Marroncino)
+ VS-121 (Marron)
Vector SMG (Black)
@@ -210,6 +239,7 @@
벡터 SMG (검정)
Vector SMG (Schwarz)
Vector SMG (Nero)
+ Vector SMG (Noir)
ASh-12 (Black)
@@ -217,6 +247,7 @@
ASh-12 (검정)
ASh-12 (Schwarz)
ASh-12 (Nero)
+ ASh-12 (Noir)
ASh-12 (Desert)
@@ -224,6 +255,7 @@
ASh-12 (사막)
ASh-12 (Wüste)
ASh-12 (Deserto)
+ ASh-12 (Désert )
ASh-12 (Urban)
@@ -231,6 +263,7 @@
ASh-12 (도심)
ASh-12 (Urban)
ASh-12 (Urbano)
+ ASh-12 (Urbain)
ASh-12 (Woodland)
@@ -238,6 +271,7 @@
ASh-12 (수풀)
ASh-12 (Grünes Tarnmuster)
ASh-12 (Boschivo)
+ ASh-12 (Woodland)
ASh-12 GL (Black)
@@ -245,6 +279,7 @@
ASh-12 GL (검정)
ASh-12 GL (Schwarz)
ASh-12 GL (Nero)
+ ASh-12 GL (Noir)
ASh-12 GL (Desert)
@@ -252,6 +287,7 @@
ASh-12 GL (사막)
ASh-12 GL (Wüste)
ASh-12 GL (Deserto)
+ ASh-12 GL (Désert)
ASh-12 GL (Urban)
@@ -259,6 +295,7 @@
ASh-12 GL (도심)
ASh-12 GL (Urban)
ASh-12 GL (Urbano)
+ ASh-12 GL (Urbain)
ASh-12 GL (Woodland)
@@ -266,6 +303,7 @@
ASh-12 GL (수풀)
ASh-12 GL (Grünes Tarnmuster)
ASh-12 GL (Boschivo)
+ ASh-12 GL (Woodland)
ASh-12 LR (Black)
@@ -273,6 +311,7 @@
ASh-12 LR (검정)
ASh-12 LR (Schwarz)
ASh-12 LR (Nero)
+ ASh-12 LR (Noir)
ASh-12 LR (Desert)
@@ -280,6 +319,7 @@
ASh-12 LR (사막)
ASh-12 LR (Wüste)
ASh-12 LR (Deserto)
+ ASh-12 LR (Désert)
ASh-12 LR (Urban)
@@ -287,6 +327,7 @@
ASh-12 LR (도심)
ASh-12 LR (Urban)
ASh-12 LR (Urbano)
+ ASh-12 LR (Urbain)
ASh-12 LR (Woodland)
@@ -294,6 +335,7 @@
ASh-12 LR (수풀)
ASh-12 LR (Grünes Tarnmuster)
ASh-12 LR (Boschivo)
+ ASh-12 LR (Woodland)
AW159 Wildcat ASW
@@ -301,6 +343,7 @@
AW159 와일드캣 ASW
AW159 Wildcat ASW
AW159 Wildcat ASW
+ AW159 Wildcat ASW
AW159 Wildcat ASW (Unarmed)
@@ -308,6 +351,7 @@
AW159 와일드캣 ASW (비무장)
AW159 Wildcat ASW (Unbewaffnet)
AW159 Wildcat ASW (Disarmato)
+ AW159 Wildcat ASW (non armé)
H225 Super Puma (Transport)
@@ -315,6 +359,7 @@
H225 슈퍼 퓨마 (비무장)
H225 Super Puma (Transport)
H225 Super Puma (Trasporto)
+ H225 Super Puma (Transport )
H225 Super Puma (Civilian)
@@ -322,6 +367,7 @@
H225 슈퍼 퓨마 (비무장)
H225 Super Puma (Zivil)
H225 Super Puma (Civile)
+ H225 Super Puma (Civil)
H215 Super Puma (Transport)
@@ -329,6 +375,7 @@
H215 슈퍼 퓨마 (비무장)
H215 Super Puma (Transport)
H215 Super Puma (Trasporto)
+ H215 Super Puma (Transport)
H215 Super Puma (Civilian)
@@ -336,6 +383,7 @@
H215 슈퍼 퓨마 (비무장)
H215 Super Puma (Zivil)
H215 Super Puma (Civile)
+ H215 Super Puma (Civil)
H215 Super Puma (Unarmed)
@@ -343,6 +391,7 @@
H215 슈퍼 퓨마 (비무장)
H215 Super Puma (Unbewaffnet)
H215 Super Puma (Disarmato)
+ H215 Super Puma (non armé)
H225M Super Cougar SOCAT
@@ -350,6 +399,7 @@
H225M 슈퍼 쿠거 SOCAT
H225M Super Cougar SOCAT
H225M Super Cougar SOCAT
+ H225M Super Cougar SOCAT
H225M Super Cougar SOCAT
@@ -357,6 +407,7 @@
H225M 슈퍼 쿠거 SOCAT
H225M Super Cougar SOCAT
H225M Super Cougar SOCAT
+ H225M Super Cougar SOCAT
H225M Super Cougar
@@ -364,6 +415,7 @@
H225M 슈퍼 쿠거
H225M Super Cougar
H225M Super Cougar
+ H225M Super Cougar
H225 Super Puma SAR
@@ -371,6 +423,7 @@
H225 슈퍼 퓨마 SAR
H225 Super Puma SAR
H225 Super Puma SAR
+ H225 Super Puma SAR
H225M Super Cougar (Unarmed)
@@ -378,6 +431,7 @@
H225M Super Cougar (Unbewaffnet)
H225M Super Cougar (Disarmato)
H225M 슈퍼 쿠거 (비무장)
+ H225M Super Cougar (Non armé)
HEMTT Fire Truck
@@ -398,6 +452,7 @@
타이푼 급수
Typhoon Water
Typhoon Acqua
+ Typhoon Water
Ram 1500
@@ -405,6 +460,7 @@
램 1500
Ram 1500
Ram 1500
+ Ram 1500
Ram 1500 (Fuel)
@@ -412,6 +468,7 @@
램 1500 (연료)
Ram 1500 (Treibstoff)
Ram 1500 (Carburante)
+ Ram 1500 (Carburant)
Ram 1500 (Services)
@@ -419,6 +476,7 @@
램 1500 (서비스)
Ram 1500 (Pannenhilfe)
Ram 1500 (Servizi)
+ Ram 1500 (Dépannage)
Ram 1500 (Repair)
@@ -426,6 +484,7 @@
램 1500 (정비)
Ram 1500 (Instandsetzung)
Ram 1500 (Riparazioni)
+ Ram 1500 (Réparation)
Ram 1500 (Comms)
@@ -433,6 +492,7 @@
램 1500 (통신)
Ram 1500 (Kommunikation)
Ram 1500 (Comunicazioni)
+ Ram 1500 (Communication)
Ram 1500 (HMG)
@@ -440,6 +500,7 @@
램 1500 (중기관총)
Ram 1500 (HMG)
Ram 1500 (HMG)
+ Ram 1500 (HMG)
Ram 1500 (MMG)
@@ -447,6 +508,7 @@
램 1500 (중형기관총)
Ram 1500 (MMG)
Ram 1500 (MMG)
+ Ram 1500 (MMG)
Ram 1500 (MRL)
@@ -454,6 +516,7 @@
램 1500 (다연장로켓)
Ram 1500 (MRL)
Ram 1500 (MRL)
+ Ram 1500 (MRL)
Ram 1500 (AA)
@@ -461,6 +524,7 @@
램 1500 (대공)
Ram 1500 (AA)
Ram 1500 (AA)
+ Ram 1500 (AA)
Ram 1500 (Covered)
@@ -468,6 +532,7 @@
램 1500 (커버)
Ram 1500 (Abgedeckt)
Ram 1500 (Coperto)
+ Ram 1500 (couvert)
Ram 1500 (Water)
@@ -475,6 +540,7 @@
램 1500 (급수)
Ram 1500 (Wasser)
Ram 1500 (Acqua)
+ Ram 1500 (eau)
RSG60
@@ -482,6 +548,7 @@
RSG60
RSG60
RSG60
+ RSG60
AMOS Container
@@ -489,6 +556,7 @@
AMOS 컨테이너
AMOS Container
AMOS Container
+ AMOS Container
Drone40
@@ -496,6 +564,7 @@
드론40
Drone40
Drone40
+ Drone40
Drone40 Scout
@@ -503,6 +572,7 @@
드론40 정찰
Drone40 Scout
Drone40 Scout
+ Drone40 Scout
Drone40 HE
@@ -510,6 +580,7 @@
드론40 고폭
Drone40 HE
Drone40 HE
+ Drone40 HE
Drone40 Smoke (White)
@@ -517,6 +588,7 @@
드론40 연막 (백색)
Drone40 Smoke (Weiß)
Drone40 Smoke (Bianco)
+ Drone40 Fumée (Blanc)
Drone40 Smoke (Blue)
@@ -524,6 +596,7 @@
드론40 연막 (청색)
Drone40 Smoke (Blau)
Drone40 Smoke (Blu)
+ Drone40 Fumée (Bleu)
Drone40 Smoke (Red)
@@ -531,6 +604,7 @@
드론40 연막 (적색)
Drone40 Smoke (Rot)
Drone40 Smoke (Rosso)
+ Drone40 Fumée (Rouge)
Drone40 Smoke (Green)
@@ -538,6 +612,7 @@
드론40 연막 (녹색)
Drone40 Smoke (Grün)
Drone40 Smoke (Verde)
+ Drone40 Fumée (Vert)
Drone40 Smoke (Orange)
@@ -545,6 +620,7 @@
드론40 연막 (주황색)
Drone40 Smoke (Orange)
Drone40 Smoke (Arancione)
+ Drone40 Fumée (Orange)
diff --git a/addons/compat_rf/config.cpp b/addons/compat_rf/config.cpp
index ab6fb942751..52ef83c1b74 100644
--- a/addons/compat_rf/config.cpp
+++ b/addons/compat_rf/config.cpp
@@ -9,10 +9,11 @@ class CfgPatches {
requiredAddons[] = {"RF_Data_Loadorder"};
skipWhenMissingDependencies = 1;
author = ECSTRING(common,ACETeam);
- authors[] = {"Mike"};
+ authors[] = {"Mike", "OverlordZorn[CVO]"};
url = ECSTRING(main,URL);
VERSION_CONFIG;
};
};
#include "CfgWeapons.hpp"
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_rhs_afrf3/CfgVehicles.hpp b/addons/compat_rhs_afrf3/CfgVehicles.hpp
index 1cf5029bc34..2ba6caf56f9 100644
--- a/addons/compat_rhs_afrf3/CfgVehicles.hpp
+++ b/addons/compat_rhs_afrf3/CfgVehicles.hpp
@@ -60,6 +60,8 @@ class CfgVehicles {
EGVAR(vehicle_damage,turretFireProb) = 0.7;
EGVAR(vehicle_damage,engineFireProb) = 0.7;
EGVAR(vehicle_damage,detonationDuringFireProb) = 0.5;
+
+ class EGVAR(interaction,anims);
};
class rhs_infantry_msv_base;
@@ -156,68 +158,186 @@ class CfgVehicles {
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 EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class crate_l1_unhide {
+ positions[] = {{-1.1, 2, -0.3}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_l2_unhide {
+ positions[] = {{-1.1, 1.05, -0.3}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_l3_unhide {
+ positions[] = {{-1.1, -1.1, -0.3}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_r1_unhide {
+ positions[] = {{1.1, 1.93, -0.3}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_r2_unhide {
+ positions[] = {{1.1, 0.25, -0.3}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_r3_unhide {
+ positions[] = {{1.1, -1.1, -0.3}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ };
};
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"};
+ compartments[] = {"Compartment1"};
+ roles[] = {"cargo"};
};
class view_1 {
camLocation[] = {-1.38184, -0.575, -0.145};
camAttach = -90;
- compartments[]={"Compartment1"};
- roles[]={"cargo"};
+ compartments[] = {"Compartment1"};
+ roles[] = {"cargo"};
};
};
- };
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class crate_l1_unhide {
+ positions[] = {{-1.7, 0.55, -0.4}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_l2_unhide {
+ positions[] = {{-1.7, -0.95, -0.4}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_l3_unhide {
+ positions[] = {{-1.7, -1.45, -0.4}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_l4_unhide {
+ positions[] = {{-1.7, -2.7, -0.4}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_r1_unhide {
+ positions[] = {{0.8, 1, -0.4}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_r2_unhide {
+ positions[] = {{0.8, 0.12, -0.4}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_r3_unhide {
+ positions[] = {{0.8, -0.7, -0.4}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_r4_unhide {
+ positions[] = {{0.8, -1.85, -0.4}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ };
+ };
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"};
+ compartments[] = {"Compartment1"};
+ roles[] = {"cargo"};
};
class view_1 {
camLocation[] = {0.760254, -0.459473, 0.526328};
camAttach = 90;
- compartments[]={"Compartment1"};
- roles[]={"cargo"};
+ compartments[] = {"Compartment1"};
+ roles[] = {"cargo"};
};
class view_2 {
camLocation[] = {0.770508, -1.21924, 0.526954};
camAttach = 90;
- compartments[]={"Compartment1"};
- roles[]={"cargo"};
+ compartments[] = {"Compartment1"};
+ roles[] = {"cargo"};
};
class view_3 {
camLocation[] = {-1.13, -1.2085, 0.490339};
camAttach = -90;
- compartments[]={"Compartment1"};
- roles[]={"cargo"};
+ compartments[] = {"Compartment1"};
+ roles[] = {"cargo"};
};
class view_4 {
camLocation[] = {-1.14124, -0.416992, 0.460611};
camAttach = -90;
- compartments[]={"Compartment1"};
- roles[]={"cargo"};
+ compartments[] = {"Compartment1"};
+ roles[] = {"cargo"};
};
class view_5 {
camLocation[] = {-0.932983, -0.326172, 0.647666};
camAttach = -45;
- compartments[]={"Compartment1"};
- roles[]={"cargo"};
+ compartments[] = {"Compartment1"};
+ roles[] = {"cargo"};
+ };
+ };
+
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class crate_l1_unhide: crate_l1_unhide {
+ positions[] = {{-1.45, 0, 0.25}};
+ };
+ class crate_l2_unhide: crate_l2_unhide {
+ positions[] = {{-1.45, -1.68, 0.15}};
+ };
+ class crate_l3_unhide: crate_l3_unhide {
+ positions[] = {{-1.45, -2.87, 0.15}};
+ };
+ class crate_l4_unhide: crate_l4_unhide {
+ enabled = 0;
+ };
+ class crate_r1_unhide: crate_r1_unhide {
+ positions[] = {{1.1, 0.97, 0.15}};
+ };
+ class crate_r2_unhide: crate_r2_unhide {
+ positions[] = {{1.1, -1.5, 0.15}};
+ };
+ class crate_r3_unhide: crate_r3_unhide {
+ enabled = 0;
+ };
+ class crate_r4_unhide: crate_r4_unhide {
+ enabled = 0;
};
};
};
@@ -226,38 +346,56 @@ class CfgVehicles {
class view_0 {
camLocation[] = {0.589844, -0.314941, 0.449678};
camAttach = 45;
- compartments[]={"Compartment1"};
- roles[]={"cargo"};
+ compartments[] = {"Compartment1"};
+ roles[] = {"cargo"};
};
class view_1 {
camLocation[] = {0.809082, -0.442871, 0.276865};
camAttach = 90;
- compartments[]={"Compartment1"};
- roles[]={"cargo"};
+ compartments[] = {"Compartment1"};
+ roles[] = {"cargo"};
};
class view_2 {
camLocation[] = {0.819092, -1.24414, 0.27857};
camAttach = 90;
- compartments[]={"Compartment1"};
- roles[]={"cargo"};
+ compartments[] = {"Compartment1"};
+ roles[] = {"cargo"};
};
class view_3 {
camLocation[] = {-1.1012, -1.22461, 0.341089};
camAttach = -90;
- compartments[]={"Compartment1"};
- roles[]={"cargo"};
+ compartments[] = {"Compartment1"};
+ roles[] = {"cargo"};
};
class view_4 {
camLocation[] = {-1.11597, -0.458984, 0.307256};
camAttach = -90;
- compartments[]={"Compartment1"};
- roles[]={"cargo"};
+ compartments[] = {"Compartment1"};
+ roles[] = {"cargo"};
};
class view_5 {
camLocation[] = {-0.869995, -0.304688, 0.461181};
camAttach = -45;
- compartments[]={"Compartment1"};
- roles[]={"cargo"};
+ compartments[] = {"Compartment1"};
+ roles[] = {"cargo"};
+ };
+ };
+
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class crate_l1_unhide: crate_l1_unhide {
+ positions[] = {{-1.45, 0, 0}};
+ };
+ class crate_l2_unhide: crate_l2_unhide {
+ positions[] = {{-1.45, -1.68, 0}};
+ };
+ class crate_l3_unhide: crate_l3_unhide {
+ positions[] = {{-1.45, -2.87, 0}};
+ };
+ class crate_r1_unhide: crate_l3_unhide {
+ positions[] = {{1.1, 0.97, 0}};
+ };
+ class crate_r2_unhide: crate_r2_unhide {
+ positions[] = {{1.1, -1.5, 0}};
};
};
};
@@ -279,11 +417,289 @@ class CfgVehicles {
EGVAR(vehicle_damage,turretFireProb) = 0.5;
EGVAR(vehicle_damage,engineFireProb) = 0.8;
EGVAR(vehicle_damage,detonationDuringFireProb) = 0.5;
+
+ class EGVAR(interaction,anims) {
+ class crate_l1_unhide {
+ positions[] = {{-1.45, 0.5, -0.65}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_l2_unhide {
+ positions[] = {{-1.45, -0.2, -0.65}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_l3_unhide {
+ positions[] = {{-1.45, -1.2, -0.65}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_r1_unhide {
+ positions[] = {{1.45, 0.6, -0.65}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_r2_unhide {
+ positions[] = {{1.45, -0.4, -0.65}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_r3_unhide {
+ positions[] = {{1.45, -1.2, -0.65}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ };
+ };
+ class rhs_bmd1_base: rhs_bmd_base {};
+ class rhs_bmd1p: rhs_bmd1_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class crate_l1_unhide: crate_l1_unhide {
+ positions[] = {{-1.45, 0.5, -0.8}};
+ };
+ class crate_l2_unhide: crate_l2_unhide {
+ positions[] = {{-1.45, -0.2, -0.8}};
+ };
+ class crate_l3_unhide: crate_l3_unhide {
+ positions[] = {{-1.45, -1.2, -0.8}};
+ };
+ class crate_r1_unhide: crate_l3_unhide {
+ positions[] = {{1.45, 0.6, -0.8}};
+ };
+ class crate_r2_unhide: crate_r2_unhide {
+ positions[] = {{1.45, -0.4, -0.8}};
+ };
+ class crate_r3_unhide: crate_r3_unhide {
+ positions[] = {{1.45, -1.2, -0.8}};
+ };
+ };
};
+ class rhs_bmd2_base: rhs_bmd_base {};
+ class rhs_bmd2: rhs_bmd2_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class crate_l1_unhide: crate_l1_unhide {
+ positions[] = {{-1.45, 0.5, -0.8}};
+ };
+ class crate_l2_unhide: crate_l2_unhide {
+ positions[] = {{-1.45, -0.2, -0.8}};
+ };
+ class crate_l3_unhide: crate_l3_unhide {
+ positions[] = {{-1.45, -1.2, -0.8}};
+ };
+ class crate_r1_unhide: crate_l3_unhide {
+ positions[] = {{1.45, 0.6, -0.8}};
+ };
+ class crate_r2_unhide: crate_r2_unhide {
+ positions[] = {{1.45, -0.4, -0.8}};
+ };
+ class crate_r3_unhide: crate_r3_unhide {
+ positions[] = {{1.45, -1.2, -0.8}};
+ };
+ };
+ };
+ class rhs_bmd2m: rhs_bmd2 {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class crate_l1_unhide: crate_l1_unhide {
+ positions[] = {{-1.45, 0.5, -0.7}};
+ };
+ class crate_l2_unhide: crate_l2_unhide {
+ positions[] = {{-1.45, -0.2, -0.7}};
+ };
+ class crate_l3_unhide: crate_l3_unhide {
+ positions[] = {{-1.45, -1.2, -0.7}};
+ };
+ class crate_r1_unhide: crate_l3_unhide {
+ positions[] = {{1.45, 0.6, -0.7}};
+ };
+ class crate_r2_unhide: crate_r2_unhide {
+ positions[] = {{1.45, -0.4, -0.7}};
+ };
+ class crate_r3_unhide: crate_r3_unhide {
+ positions[] = {{1.45, -1.2, -0.7}};
+ };
+ };
+ };
+
class rhs_bmp1tank_base: Tank_F {
EGVAR(map,vehicleLightColor)[] = {0,1,0,0.1};
EGVAR(refuel,fuelCapacity) = 460;
};
+ 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 EGVAR(interaction,anims) {
+ class crate_l1_unhide {
+ positions[] = {{-1.55, 1.1, -0.55}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_l2_unhide {
+ positions[] = {{-1.55, 0.35, -0.55}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_l3_unhide {
+ positions[] = {{-1.55, -0.6, -0.55}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_r1_unhide {
+ positions[] = {{1.55, 1.75, -0.55}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_r2_unhide {
+ positions[] = {{1.55, -0.25, -0.55}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ class crate_r3_unhide {
+ positions[] = {{1.55, -1, -0.55}};
+ items[] = {"rhs_3Ya40_1_single"};
+ name = "3Ya40-1 Crate";
+ text = "3Ya40-1 Crate";
+ };
+ };
+ };
+ class rhs_bmp1_vdv: rhs_bmp_base {};
+ class rhs_bmp1d_vdv: rhs_bmp1_vdv {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class crate_r3_unhide: crate_r3_unhide {
+ positions[] = {{1.5, -1.2, -0.55}};
+ };
+ };
+ };
+ class rhs_prp3_vdv: rhs_bmp1_vdv {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class crate_l1_unhide: crate_l1_unhide {
+ enabled = 0;
+ };
+ class crate_l2_unhide: crate_l2_unhide {
+ enabled = 0;
+ };
+ class crate_l3_unhide: crate_l3_unhide {
+ enabled = 0;
+ };
+ class crate_r1_unhide: crate_l3_unhide {
+ enabled = 0;
+ };
+ class crate_r2_unhide: crate_r2_unhide {
+ enabled = 0;
+ };
+ class crate_r3_unhide: crate_r3_unhide {
+ enabled = 0;
+ };
+ };
+ };
+
+ class rhs_bmp2e_vdv: rhs_bmp1_vdv {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class crate_l1_unhide: crate_l1_unhide {
+ positions[] = {{-1.8, 1.05, -0.55}};
+ };
+ class crate_l2_unhide: crate_l2_unhide {
+ positions[] = {{-1.8, 0.35, -0.55}};
+ };
+ class crate_l3_unhide: crate_l3_unhide {
+ positions[] = {{-1.8, -0.65, -0.55}};
+ };
+ class crate_r1_unhide: crate_l3_unhide {
+ positions[] = {{1.4, 1.7, -0.55}};
+ };
+ class crate_r2_unhide: crate_r2_unhide {
+ positions[] = {{1.4, -0.25, -0.55}};
+ };
+ class crate_r3_unhide: crate_r3_unhide {
+ positions[] = {{1.4, -1.05, -0.55}};
+ };
+ };
+ };
+ class rhs_bmp2_vdv: rhs_bmp2e_vdv {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class crate_l1_unhide: crate_l1_unhide {
+ positions[] = {{-1.8, 1.2, -0.55}};
+ };
+ class crate_l2_unhide: crate_l2_unhide {
+ positions[] = {{-1.8, 0.5, -0.55}};
+ };
+ class crate_l3_unhide: crate_l3_unhide {
+ positions[] = {{-1.8, -0.5, -0.55}};
+ };
+ class crate_r1_unhide: crate_l3_unhide {
+ positions[] = {{1.4, 1.85, -0.55}};
+ };
+ class crate_r2_unhide: crate_r2_unhide {
+ positions[] = {{1.4, -0.1, -0.55}};
+ };
+ class crate_r3_unhide: crate_r3_unhide {
+ positions[] = {{1.4, -0.9, -0.55}};
+ };
+ };
+ };
+ class rhs_bmp2e_msv: rhs_bmp2e_vdv {};
+ class rhs_Ob_681_2: rhs_bmp2e_msv {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class crate_l1_unhide: crate_l1_unhide {
+ positions[] = {{-1.8, 1.2, -0.55}};
+ };
+ class crate_l2_unhide: crate_l2_unhide {
+ positions[] = {{-1.8, 0.5, -0.55}};
+ };
+ class crate_l3_unhide: crate_l3_unhide {
+ positions[] = {{-1.8, -0.5, -0.55}};
+ };
+ class crate_r1_unhide: crate_l3_unhide {
+ positions[] = {{1.4, 1.85, -0.55}};
+ };
+ class crate_r2_unhide: crate_r2_unhide {
+ positions[] = {{1.4, -0.1, -0.55}};
+ };
+ class crate_r3_unhide: crate_r3_unhide {
+ positions[] = {{1.4, -0.9, -0.55}};
+ };
+ };
+ };
+
+ class rhs_brm1k_base: rhs_bmp2e_vdv {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class crate_l1_unhide: crate_l1_unhide {
+ enabled = 0;
+ };
+ class crate_l2_unhide: crate_l2_unhide {
+ enabled = 0;
+ };
+ class crate_l3_unhide: crate_l3_unhide {
+ enabled = 0;
+ };
+ class crate_r1_unhide: crate_l3_unhide {
+ enabled = 0;
+ };
+ class crate_r2_unhide: crate_r2_unhide {
+ enabled = 0;
+ };
+ class crate_r3_unhide: crate_r3_unhide {
+ enabled = 0;
+ };
+ };
+ };
+
class rhs_bmp3tank_base: Tank_F {
EGVAR(refuel,fuelCapacity) = 460;
EGVAR(vehicle_damage,hullDetonationProb) = 0.2;
@@ -293,37 +709,39 @@ class CfgVehicles {
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"};
+ 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"};
+ 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"};
+ 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"};
+ roles[] = {"cargo"};
};
};
};
+
class rhs_a3spruttank_base: Tank_F {
EGVAR(refuel,fuelCapacity) = 400;
EGVAR(vehicle_damage,hullDetonationProb) = 0.2;
@@ -334,6 +752,7 @@ class CfgVehicles {
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;
@@ -344,15 +763,6 @@ class CfgVehicles {
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",
diff --git a/addons/compat_rhs_afrf3/XEH_postInit.sqf b/addons/compat_rhs_afrf3/XEH_postInit.sqf
index be180179a55..e740d0d8a66 100644
--- a/addons/compat_rhs_afrf3/XEH_postInit.sqf
+++ b/addons/compat_rhs_afrf3/XEH_postInit.sqf
@@ -1,5 +1,7 @@
#include "script_component.hpp"
+if !(["ace_nametags"] call EFUNC(common,isModLoaded)) exitWith {};
+
private _russianRankIcons = [
QPATHTOEF(nametags,UI\icons_russia\private_gs.paa),
QPATHTOEF(nametags,UI\icons_russia\corporal_gs.paa),
diff --git a/addons/compat_rhs_afrf3/XEH_preInit.sqf b/addons/compat_rhs_afrf3/XEH_preInit.sqf
index b47cf6628db..2ca4338e90c 100644
--- a/addons/compat_rhs_afrf3/XEH_preInit.sqf
+++ b/addons/compat_rhs_afrf3/XEH_preInit.sqf
@@ -6,4 +6,12 @@ PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;
+// Disable RHS' wheel replacement mechanic
+if (["ace_repair"] call EFUNC(common,isModLoaded)) then {
+ RHS_Retread_Enabled = false;
+ rhs_btr70_EnableRetread = false;
+ rhs_TypeTirePressure = 1;
+ RHS_BTR_Effects_Init = true;
+};
+
ADDON = true;
diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgVehicles.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgVehicles.hpp
index 6a3bb0a083e..fb52cc6373c 100644
--- a/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgVehicles.hpp
+++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgVehicles.hpp
@@ -5,7 +5,7 @@ class CfgVehicles {
class StaticGrenadeLauncher;
class rhs_SPG9_base: AT_01_base_F {
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
proxyWeapon = QGVAR(rhs_weap_SPG9);
magazineLocation = "_target selectionPosition 'breach'";
@@ -18,14 +18,14 @@ class CfgVehicles {
};
class rhs_SPG9M_base: rhs_SPG9_base {
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
enabled = 1;
disassembleWeapon = QGVAR(spg9m_carry);
};
};
class rhs_Kornet_Base: AT_01_base_F {
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
proxyWeapon = QGVAR(rhs_weap_9K133_launcher);
magazineLocation = "_target selectionPosition 'gun'";
@@ -38,7 +38,7 @@ class CfgVehicles {
};
class rhs_Metis_Base: AT_01_base_F {
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
proxyWeapon = QGVAR(rhs_weap_9K115_2_launcher);
magazineLocation = "_target selectionPosition 'gun'";
@@ -51,7 +51,7 @@ class CfgVehicles {
};
class rhs_2b14_82mm_Base: StaticMortar {
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
magazineLocation = "";
proxyWeapon = QGVAR(rhs_weap_2b14);
@@ -64,7 +64,7 @@ class CfgVehicles {
};
class rhs_nsv_tripod_base: StaticMGWeapon {
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
proxyWeapon = QGVAR(rhs_weap_nsvt_effects);
magazineLocation = "_target selectionPosition 'magazine'";
@@ -77,7 +77,7 @@ class CfgVehicles {
};
class RHS_KORD_Base: rhs_nsv_tripod_base {
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
enabled = 1;
proxyWeapon = QGVAR(rhs_weap_KORD);
disassembleWeapon = QGVAR(kord_carry);
@@ -86,7 +86,7 @@ class CfgVehicles {
};
class RHS_KORD_high_base: RHS_KORD_Base {
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
enabled = 1;
proxyWeapon = QGVAR(rhs_weap_KORD);
disassembleWeapon = QGVAR(kord_carry);
@@ -95,7 +95,7 @@ class CfgVehicles {
};
class RHS_AGS30_TriPod_base: StaticGrenadeLauncher {
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
proxyWeapon = QGVAR(rhs_weap_AGS30);
magazineLocation = "_target selectionPosition 'magazine'";
diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgWeapons.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgWeapons.hpp
index 1e8f4dbdfd1..e444a2aa32f 100644
--- a/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgWeapons.hpp
+++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgWeapons.hpp
@@ -14,7 +14,7 @@ class CfgWeapons {
class GVAR(2b14_carry): Launcher_Base_F {
dlc = "ace";
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 20;
pickupTime = 25;
@@ -40,7 +40,7 @@ class CfgWeapons {
class GVAR(nsv_carry): Launcher_Base_F {
dlc = "ace";
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
@@ -64,7 +64,7 @@ class CfgWeapons {
class GVAR(kord_carry): Launcher_Base_F {
dlc = "ace";
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
@@ -89,7 +89,7 @@ class CfgWeapons {
class GVAR(ags30_carry): Launcher_Base_F {
dlc = "ace";
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
@@ -113,7 +113,7 @@ class CfgWeapons {
class GVAR(spg9_carry): Launcher_Base_F {
dlc = "ace";
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
@@ -136,7 +136,7 @@ class CfgWeapons {
};
class GVAR(spg9m_carry): GVAR(spg9_carry) {
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
class assembleTo {
EGVAR(csw,spg9Tripod) = "rhs_SPG9M_MSV";
};
@@ -147,7 +147,7 @@ class CfgWeapons {
class GVAR(metis_carry): Launcher_Base_F {
dlc = "ace";
- class ACE_CSW {
+ class ace_csw {
type = "mount";
deployTime = 4;
pickupTime = 4;
@@ -169,7 +169,7 @@ class CfgWeapons {
class GVAR(kornet_carry): Launcher_Base_F {
dlc = "ace";
- class ACE_CSW {
+ class ace_csw {
type = "mount";
deployTime = 4;
pickupTime = 4;
diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgMagazines.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgMagazines.hpp
index 4f8e808bd59..4ad71e5e24c 100644
--- a/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgMagazines.hpp
+++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgMagazines.hpp
@@ -2,7 +2,7 @@ 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);
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_tm62m);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -12,7 +12,7 @@ class CfgMagazines {
};
class rhs_mine_pmn2_mag: ATMine_Range_Mag {
- EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_pmn2);
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_pmn2);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -22,7 +22,7 @@ class CfgMagazines {
};
class rhs_mag_mine_ptm1: ATMine_Range_Mag {
- EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_ptm1);
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_ptm1);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -32,7 +32,7 @@ class CfgMagazines {
};
class rhs_mag_mine_pfm1: ATMine_Range_Mag {
- EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_pfm1);
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_pfm1);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -42,8 +42,7 @@ class CfgMagazines {
};
class rhs_ec75_mag: ATMine_Range_Mag {
- EGVAR(explosives,DelayTime) = 1;
- EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec75);
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_ec75);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"};
@@ -59,27 +58,27 @@ class CfgMagazines {
};
class rhs_ec75_sand_mag: rhs_ec75_mag {
- EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec75_sand);
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_ec75_sand);
};
class rhs_ec200_mag: rhs_ec75_mag {
- EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec200);
+ 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);
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_ec200_sand);
};
class rhs_ec400_mag: rhs_ec75_mag {
- EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec400);
+ 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);
+ 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);
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_msk40p_white);
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@@ -89,19 +88,19 @@ class CfgMagazines {
};
class rhs_mine_msk40p_red_mag: rhs_mine_msk40p_white_mag {
- EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_msk40p_red);
+ 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);
+ 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);
+ 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);
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_sm320_white);
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@@ -111,15 +110,15 @@ class CfgMagazines {
};
class rhs_mine_sm320_red_mag: rhs_mine_sm320_white_mag {
- EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_sm320_red);
+ 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);
+ 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);
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_ozm72_a);
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@@ -129,12 +128,11 @@ class CfgMagazines {
};
class rhs_mine_ozm72_b_mag: rhs_mine_ozm72_a_mag {
- EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_ozm72_b);
+ 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);
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_ozm72_c);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Command", "MK16_Transmitter"};
diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_repair/CfgVehicles.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_repair/CfgVehicles.hpp
new file mode 100644
index 00000000000..48da0552b85
--- /dev/null
+++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_repair/CfgVehicles.hpp
@@ -0,0 +1,145 @@
+class CfgVehicles {
+ class Wheeled_APC_F;
+ class rhs_btr_base: Wheeled_APC_F {
+ class EGVAR(interaction,anims) {
+ class wheel_1_unhide {
+ positions[] = {{-0.8, -1.7, 0}};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ class wheel_2_unhide {
+ positions[] = {{0.35, -2.9, -0.1}};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+ class rhs_btr70_vmf: rhs_btr_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class wheel_1_unhide: wheel_1_unhide {
+ positions[] = {{-1.2, -2.6, 0.2}};
+ };
+ class wheel_2_unhide: wheel_2_unhide {
+ positions[] = {{-0.3, -3.8, 0}};
+ };
+ };
+ };
+
+ class rhs_btr70_msv: rhs_btr70_vmf {};
+ class rhs_btr80_msv: rhs_btr70_msv {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class wheel_1_unhide: wheel_1_unhide {
+ positions[] = {{-1, -2.5, 0.6}};
+ };
+ class wheel_2_unhide: wheel_2_unhide {
+ enabled = 0;
+ };
+ };
+ };
+
+ class Truck_F;
+ class rhs_truck: Truck_F {
+ class EGVAR(interaction,anims) {
+ class spare_hide {
+ positions[] = {"_target selectionPosition ['spare', 'ViewGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+ class rhs_gaz66_vmf: rhs_truck {};
+ class rhs_gaz66_ammo_base: rhs_gaz66_vmf {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class spare_hide: spare_hide {
+ positions[] = {"_target selectionPosition ['spare', 'FireGeometry', 'AveragePoint']"};
+ };
+ };
+ };
+ class rhs_gaz66_repair_base: rhs_gaz66_vmf {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class spare_hide: spare_hide {
+ positions[] = {"_target selectionPosition ['spare', 'FireGeometry', 'AveragePoint']"};
+ };
+ };
+ };
+ class rhs_gaz66_ap2_base: rhs_gaz66_vmf {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class spare_hide: spare_hide {
+ positions[] = {"_target selectionPosition ['spare', 'FireGeometry', 'AveragePoint']"};
+ };
+ };
+ };
+
+ class RHS_Ural_BaseTurret: Truck_F {
+ class EGVAR(interaction,anims) {
+ class spare_hide {
+ positions[] = {"_target selectionPosition ['spare', 'ViewGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ class rhs_zil131_base: Truck_F {
+ class EGVAR(interaction,anims) {
+ class spare_hide {
+ positions[] = {"_target selectionPosition ['spare', 'ViewGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ class rhs_kraz255_base;
+ class rhs_kraz255b1_base: rhs_kraz255_base {
+ class EGVAR(interaction,anims) {
+ class spare_hide {
+ positions[] = {"_target selectionPosition ['spare', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ class O_Truck_02_covered_F;
+ class rhs_kamaz5350: O_Truck_02_covered_F {
+ class EGVAR(interaction,anims) {
+ class spare_hide {
+ positions[] = {"_target selectionPosition ['spare', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ class MRAP_02_base_F;
+ class rhs_tigr_base: MRAP_02_base_F {
+ class EGVAR(interaction,anims) {
+ class spare_hide {
+ positions[] = {"_target selectionPosition ['spare', 'ViewGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ class Offroad_01_base_f;
+ class RHS_UAZ_Base: Offroad_01_base_f {
+ class EGVAR(interaction,anims) {
+ class spare_hide {
+ positions[] = {"_target selectionPosition ['spare', 'ViewGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+};
diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_repair/config.cpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_repair/config.cpp
new file mode 100644
index 00000000000..d6d4fab1077
--- /dev/null
+++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_repair/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_repair"
+ };
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"Dystopian", "johnb43"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+ };
+};
+
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_repair/script_component.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_repair/script_component.hpp
new file mode 100644
index 00000000000..1af928486c3
--- /dev/null
+++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_repair/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT repair
+#define SUBCOMPONENT_BEAUTIFIED Repair
+#include "..\script_component.hpp"
diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgVehicles.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgVehicles.hpp
index 7e58387dabc..1a15fc03f40 100644
--- a/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgVehicles.hpp
+++ b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgVehicles.hpp
@@ -1,7 +1,7 @@
class CfgVehicles {
class StaticMGWeapon;
class rhs_DSHKM_base: StaticMGWeapon {
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
proxyWeapon = QGVAR(rhs_weap_DSHKM);
magazineLocation = "_target selectionPosition 'otocvez'";
@@ -13,7 +13,7 @@ class CfgVehicles {
};
};
class rhs_DSHkM_Mini_TriPod_base: rhs_DSHKM_base {
- class ACE_CSW: ACE_CSW {
+ 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
index 15ff9488cad..279ec98eaa4 100644
--- a/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgWeapons.hpp
+++ b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgWeapons.hpp
@@ -7,7 +7,7 @@ class CfgWeapons {
};
class GVAR(dshkm_carry): Launcher_Base_F {
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgAmmo.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgAmmo.hpp
index 0808c7ff1d2..458969b7c0b 100644
--- a/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgAmmo.hpp
+++ b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgAmmo.hpp
@@ -1,83 +1,83 @@
class CfgAmmo {
class APERSMine_Range_Ammo;
class rhs_mine_a200_bz_ammo: APERSMine_Range_Ammo {
- ace_explosives_defuseObjectPosition[] = {0, 0, 0.035};
+ EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.035};
};
class rhs_mine_a200_dz35_ammo: rhs_mine_a200_bz_ammo {
- ace_explosives_defuseObjectPosition[] = {0, 0, 0.02};
+ EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
class rhs_mine_glasmine43_hz_ammo: APERSMine_Range_Ammo {
- ace_explosives_defuseObjectPosition[] = {0, 0, 0.015};
+ EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.015};
};
class rhs_mine_glasmine43_bz_ammo: rhs_mine_glasmine43_hz_ammo {
- ace_minedetector_detectable = 0;
+ EGVAR(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};
+ EGVAR(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};
+ EGVAR(explosives,defuseObjectPosition)[] = {0, 0.046, 0.055};
};
class rhs_mine_M3_pressure_ammo: APERSMine_Range_Ammo {
- ace_explosives_defuseObjectPosition[] = {0, 0, 0.015};
+ EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.015};
};
class rhs_mine_M3_tripwire_ammo: rhs_mine_M3_pressure_ammo {
- ace_explosives_defuseObjectPosition[] = {0, 0, 0.055};
+ EGVAR(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};
+ EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.072};
};
class rhs_mine_M7A2_ammo: APERSMine_Range_Ammo {
- ace_explosives_defuseObjectPosition[] = {0, 0, 0.067};
+ EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.067};
};
class rhs_mine_Mk2_pressure_ammo: APERSMine_Range_Ammo {
- ace_explosives_defuseObjectPosition[] = {0, 0, 0.02};
+ EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
class rhs_mine_Mk2_tripwire_ammo: rhs_mine_Mk2_pressure_ammo {
- ace_explosives_defuseObjectPosition[] = {0, 0, 0.055};
+ EGVAR(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};
+ EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.03};
};
class rhs_mine_smine35_trip_ammo: rhs_mine_bounding_trigger_base {
- ace_explosives_defuseObjectPosition[] = {0, 0, 0.04};
+ EGVAR(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};
+ EGVAR(explosives,defuseObjectPosition)[] = {-0.03, 0, 0.015};
};
class rhs_mine_smine44_press_ammo: APERSBoundingMine_Range_Ammo {
- ace_explosives_defuseObjectPosition[] = {-0.02, 0, 0.02};
+ EGVAR(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};
+ EGVAR(explosives,defuseObjectPosition)[] = {-1, 0, 0.25};
};
class rhs_mine_stockmine43_4m_ammo: rhs_mine_stockmine43_2m_ammo {
- ace_explosives_defuseObjectPosition[] = {-2, 0, 0.25};
+ EGVAR(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};
+ EGVAR(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
index ce882e18258..d25a27bebd8 100644
--- a/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgMagazines.hpp
+++ b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgMagazines.hpp
@@ -1,7 +1,7 @@
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";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_a200_bz";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -11,7 +11,7 @@ class CfgMagazines {
};
class rhs_mine_a200_dz35_mag: rhs_mine_a200_bz_mag {
- ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_a200_dz35";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_a200_dz35";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -21,7 +21,7 @@ class CfgMagazines {
};
class rhs_mine_glasmine43_hz_mag: APERSMine_Range_Mag {
- ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_glasmine43_hz";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_glasmine43_hz";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -31,12 +31,12 @@ class CfgMagazines {
};
class rhs_mine_glasmine43_bz_mag: rhs_mine_glasmine43_hz_mag {
- ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_glasmine43_bz";
+ EGVAR(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";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_m2a3b_press";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -46,7 +46,7 @@ class CfgMagazines {
};
class rhs_mine_m2a3b_trip_mag: rhs_mine_m2a3b_press_mag {
- ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_m2a3b_trip";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_m2a3b_trip";
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@@ -56,7 +56,7 @@ class CfgMagazines {
};
class rhs_mine_m3_pressure_mag: APERSMine_Range_Mag {
- ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_m3_pressure";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_m3_pressure";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -67,7 +67,7 @@ class CfgMagazines {
class APERSTripMine_Wire_Mag;
class rhs_mine_M3_tripwire_mag: APERSTripMine_Wire_Mag {
- ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_M3_tripwire";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_M3_tripwire";
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@@ -78,7 +78,7 @@ class CfgMagazines {
class ATMine_Range_Mag;
class rhs_mine_TM43_mag: ATMine_Range_Mag {
- ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_TM43";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_TM43";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -88,7 +88,7 @@ class CfgMagazines {
};
class rhs_mine_M7A2_mag: APERSMine_Range_Mag {
- ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_M7A2";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_M7A2";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -98,7 +98,7 @@ class CfgMagazines {
};
class rhs_mine_mk2_pressure_mag: APERSMine_Range_Mag {
- ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_mk2_pressure";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_mk2_pressure";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -108,7 +108,7 @@ class CfgMagazines {
};
class rhs_mine_Mk2_tripwire_mag: APERSTripMine_Wire_Mag {
- ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_Mk2_tripwire";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_Mk2_tripwire";
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@@ -118,7 +118,7 @@ class CfgMagazines {
};
class rhs_mine_smine35_press_mag: APERSBoundingMine_Range_Mag {
- ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_smine35_press";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_smine35_press";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -128,7 +128,7 @@ class CfgMagazines {
};
class rhs_mine_smine35_trip_mag: rhs_mine_smine35_press_mag {
- ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_smine35_trip";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_smine35_trip";
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@@ -138,7 +138,7 @@ class CfgMagazines {
};
class rhs_mine_smine44_trip_mag: APERSBoundingMine_Range_Mag {
- ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_smine44_trip";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_smine44_trip";
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@@ -148,7 +148,7 @@ class CfgMagazines {
};
class rhs_mine_smine44_press_mag: rhs_mine_smine44_trip_mag {
- ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_smine44_press";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_smine44_press";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -158,7 +158,7 @@ class CfgMagazines {
};
class rhs_mine_stockmine43_2m_mag: APERSTripMine_Wire_Mag {
- ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_stockmine43_2m";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_stockmine43_2m";
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@@ -168,7 +168,7 @@ class CfgMagazines {
};
class rhs_mine_stockmine43_4m_mag: rhs_mine_stockmine43_2m_mag {
- ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_stockmine43_4m";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_stockmine43_4m";
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@@ -179,7 +179,7 @@ class CfgMagazines {
class DemoCharge_Remote_Mag;
class rhs_charge_M2tet_x2_mag: DemoCharge_Remote_Mag {
- ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_charge_M2tet_x2";
+ EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_charge_M2tet_x2";
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"};
class Timer {
diff --git a/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgMagazines.hpp b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgMagazines.hpp
index c004f584467..e7c00c95d2b 100644
--- a/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgMagazines.hpp
+++ b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgMagazines.hpp
@@ -3,22 +3,22 @@ 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);
+ 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);
+ 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);
+ 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);
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhssaf_mine_mrud_d);
class ACE_Triggers {
SupportedTriggers[] = {"Command", "MK16_Transmitter"};
class Command {
@@ -29,7 +29,7 @@ class CfgMagazines {
};
class rhssaf_mine_pma3_mag: ATMine_Range_Mag {
- EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_pma3);
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhssaf_mine_pma3);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -39,7 +39,7 @@ class CfgMagazines {
};
class rhssaf_mine_tma4_mag: ATMine_Range_Mag {
- EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_tma4);
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhssaf_mine_tma4);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -51,9 +51,8 @@ class CfgMagazines {
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);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhssaf_tm100);
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter"};
class Timer {
@@ -67,10 +66,10 @@ class CfgMagazines {
};
class rhssaf_tm200_mag: rhssaf_tm100_mag {
- EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_tm200);
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhssaf_tm200);
};
class rhssaf_tm500_mag: rhssaf_tm100_mag {
- EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_tm500);
+ EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhssaf_tm500);
};
};
diff --git a/addons/compat_rhs_usf3/CfgVehicles.hpp b/addons/compat_rhs_usf3/CfgVehicles.hpp
index 0593c5a868a..3933e543ecf 100644
--- a/addons/compat_rhs_usf3/CfgVehicles.hpp
+++ b/addons/compat_rhs_usf3/CfgVehicles.hpp
@@ -43,8 +43,7 @@ class CfgVehicles {
EGVAR(refuel,fuelCapacity) = 302;
};
- class Truck_F;
- class Truck_01_base_F: Truck_F {};
+ class Truck_01_base_F;
class rhsusf_fmtv_base: Truck_01_base_F {
EGVAR(refuel,fuelCapacity) = 219;
};
@@ -55,8 +54,7 @@ class CfgVehicles {
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_usarmy_wd;
class rhsusf_M977A4_AMMO_usarmy_wd: rhsusf_M977A4_usarmy_wd {
EGVAR(rearm,defaultSupply) = 1200;
};
diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgVehicles.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgVehicles.hpp
index cbca20cce76..bfe157c6099 100644
--- a/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgVehicles.hpp
+++ b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgVehicles.hpp
@@ -14,7 +14,7 @@ class CfgVehicles {
};
};
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
magazineLocation = "";
proxyWeapon = QGVAR(rhs_mortar_81mm);
@@ -28,7 +28,7 @@ class CfgVehicles {
class StaticMGWeapon;
class rhs_m2staticmg_base: StaticMGWeapon {
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
proxyWeapon = QGVAR(rhs_M2);
magazineLocation = "_target selectionPosition 'magazine'";
@@ -41,7 +41,7 @@ class CfgVehicles {
};
class RHS_M2StaticMG_MiniTripod_base: rhs_m2staticmg_base {
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
enabled = 1;
disassembleTurret = QEGVAR(csw,m3TripodLow);
};
@@ -49,7 +49,7 @@ class CfgVehicles {
class StaticGrenadeLauncher;
class RHS_MK19_TriPod_base: StaticGrenadeLauncher {
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
proxyWeapon = QGVAR(rhs_MK19);
magazineLocation = "_target selectionPosition 'magazine'";
@@ -63,7 +63,7 @@ class CfgVehicles {
class StaticATWeapon;
class RHS_TOW_TriPod_base: StaticATWeapon {
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
proxyWeapon = QGVAR(rhs_weap_TOW_Launcher_static);
magazineLocation = "_target selectionPosition 'tube'";
diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgWeapons.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgWeapons.hpp
index d373e7fe673..b1a8bd88593 100644
--- a/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgWeapons.hpp
+++ b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgWeapons.hpp
@@ -11,7 +11,7 @@ class CfgWeapons {
class GVAR(m252_carry): Launcher_Base_F {
dlc = "ace";
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 20;
pickupTime = 25;
@@ -37,13 +37,14 @@ class CfgWeapons {
class GVAR(m2_carry): Launcher_Base_F {
dlc = "ace";
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
class assembleTo {
EGVAR(csw,m3Tripod) = "RHS_M2StaticMG_WD";
EGVAR(csw,m3TripodLow) = "RHS_M2StaticMG_MiniTripod_WD";
+ EGVAR(compat_spe,m3Tripod) = "RHS_M2StaticMG_MiniTripod_WD";
};
};
class WeaponSlotsInfo: WeaponSlotsInfo {
@@ -62,7 +63,7 @@ class CfgWeapons {
class GVAR(mk19_carry): Launcher_Base_F {
dlc = "ace";
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
@@ -86,7 +87,7 @@ class CfgWeapons {
class GVAR(tow_carry): Launcher_Base_F {
dlc = "ace";
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgMagazines.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgMagazines.hpp
index 332c2bf1f25..aa2485dcdc2 100644
--- a/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgMagazines.hpp
+++ b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgMagazines.hpp
@@ -1,7 +1,6 @@
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;
diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/CfgAmmo.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/CfgAmmo.hpp
index 65ca880587f..b0df767e3a0 100644
--- a/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/CfgAmmo.hpp
+++ b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/CfgAmmo.hpp
@@ -9,9 +9,10 @@ class CfgAmmo {
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.
+ pitchRate = 120; // degrees per second
+ yawRate = 120;
+ stabilityCoefficient = 0.2;
+ bangBangGuidance = 0;
canVanillaLock = 0;
@@ -22,6 +23,11 @@ class CfgAmmo {
defaultSeekerLockMode = "LOBL";
seekerLockModes[] = { "LOBL" };
+ defaultNavigationType = "Direct";
+ navigationTypes[] = { "Direct", "ZeroEffortMiss" };
+
+ navigationGain = 3;
+
seekerAngle = 180; // Angle in front of the missile which can be searched
seekerAccuracy = 1; // seeker accuracy multiplier
@@ -34,6 +40,19 @@ class CfgAmmo {
defaultAttackProfile = "JAV_TOP";
attackProfiles[] = { "JAV_TOP", "JAV_DIR" };
useModeForAttackProfile = 1;
+
+ class navigationStates {
+ class initial {
+ transitionCondition = QEFUNC(missileguidance,javelin_midCourseTransition);
+ navigationType = "Direct";
+ };
+ class terminal {
+ transitionCondition = "";
+ navigationType = "ZeroEffortMiss";
+ };
+ // transitions from initial -> termimal
+ states[] = {"initial", "terminal"};
+ };
};
};
};
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 00000000000..10607ab6b5a
--- /dev/null
+++ b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/CfgVehicles.hpp
@@ -0,0 +1,52 @@
+class CfgVehicles {
+ class rhsusf_stryker_base;
+ class rhsusf_stryker_m1126_base: rhsusf_stryker_base {
+ class EGVAR(interaction,anims) {
+ class Hide_FCans {
+ positions[] = {{-0.7, -3, -0.4}};
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+ class rhsusf_stryker_m1127_base: rhsusf_stryker_m1126_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class Hide_FCans: Hide_FCans {
+ positions[] = {{-0.5, -3, -0.4}};
+ };
+ };
+ };
+
+ class rhsusf_stryker_m1126_m2_base: rhsusf_stryker_m1126_base {};
+ class rhsusf_stryker_m1132_m2_base: rhsusf_stryker_m1126_m2_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class Hide_FCans: Hide_FCans {
+ positions[] = {{-1, -4, -0.4}};
+ };
+ };
+ };
+ class rhsusf_stryker_m1134_base: rhsusf_stryker_m1126_m2_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class Hide_FCans: Hide_FCans {
+ positions[] = {{-0.7, -3, -0.7}};
+ };
+ };
+ };
+
+ class rhsusf_m1a2tank_base;
+ class rhsusf_m1a2sep2_base: rhsusf_m1a2tank_base {
+ class EGVAR(interaction,anims) {
+ class fuelcans_hide {
+ // Rotate interactions with turret rotation
+ positions[] = {
+ "[0.23, -0.6, 0] vectorAdd ([[1.1, -3.6, 0.6], [0, 0, 1], deg (_target animationPhase 'MainTurret')] call CBA_fnc_vectRotate3D)",
+ "[0.23, -0.6, 0] vectorAdd ([[-1.1, -3.6, 0.6], [0, 0, 1], deg (_target animationPhase 'MainTurret')] call CBA_fnc_vectRotate3D)"
+ };
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+};
diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/config.cpp b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/config.cpp
index bf600d5d5ae..391e22d95e8 100644
--- a/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/config.cpp
+++ b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/config.cpp
@@ -21,3 +21,4 @@ class CfgPatches {
};
#include "CfgEventHandlers.hpp"
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_repair/CfgVehicles.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_repair/CfgVehicles.hpp
new file mode 100644
index 00000000000..91bed1dc5a1
--- /dev/null
+++ b/addons/compat_rhs_usf3/compat_rhs_usf3_repair/CfgVehicles.hpp
@@ -0,0 +1,127 @@
+class CfgVehicles {
+ class Truck_01_base_F;
+ class rhsusf_fmtv_base: Truck_01_base_F {
+ class EGVAR(interaction,anims) {
+ class hide_spare {
+ positions[] = {{1, 1.4, 0}};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+ class rhsusf_M1078A1P2_fmtv_usarmy: rhsusf_fmtv_base {};
+ class rhsusf_M1078A1P2_B_fmtv_usarmy: rhsusf_M1078A1P2_fmtv_usarmy {};
+ class rhsusf_M1078A1P2_B_M2_fmtv_usarmy: rhsusf_M1078A1P2_B_fmtv_usarmy {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_spare: hide_spare {
+ positions[] = {{1, 1.4, -0.5}};
+ };
+ };
+ };
+ class rhsusf_M1078A1R_SOV_M2_D_fmtv_socom: rhsusf_M1078A1P2_B_M2_fmtv_usarmy {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_spare: hide_spare {
+ positions[] = {{1, 1, -0.5}};
+ };
+ };
+ };
+ class rhsusf_M1083A1P2_fmtv_usarmy: rhsusf_M1078A1P2_fmtv_usarmy {};
+ class rhsusf_M1083A1P2_B_fmtv_usarmy: rhsusf_M1083A1P2_fmtv_usarmy {};
+ class rhsusf_M1083A1P2_B_M2_fmtv_usarmy: rhsusf_M1083A1P2_B_fmtv_usarmy {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_spare: hide_spare {
+ positions[] = {{1, 1.4, -0.5}};
+ };
+ };
+ };
+ class rhsusf_M1084A1P2_fmtv_usarmy: rhsusf_M1083A1P2_fmtv_usarmy {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_spare: hide_spare {
+ positions[] = {{1, 1.8, 0}};
+ };
+ };
+ };
+ class rhsusf_M1084A1P2_B_M2_fmtv_usarmy: rhsusf_M1083A1P2_B_M2_fmtv_usarmy {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_spare: hide_spare {
+ positions[] = {{1, 1.8, -0.5}};
+ };
+ };
+ };
+ class rhsusf_M1085A1P2_B_Medical_fmtv_usarmy: rhsusf_M1083A1P2_B_fmtv_usarmy {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_spare: hide_spare {
+ positions[] = {{1, 6.1, 0}};
+ };
+ };
+ };
+
+ class rhsusf_HEMTT_A4_base: Truck_01_base_F {
+ class EGVAR(interaction,anims) {
+ class hide_spare {
+ positions[] = {"_target selectionPosition ['sparewheel', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ distance = 2.5;
+ };
+ };
+ };
+
+ class MRAP_01_base_F;
+ class rhsusf_m1151_base: MRAP_01_base_F {
+ class EGVAR(interaction,anims) {
+ class hide_spare {
+ positions[] = {"_target selectionPosition ['sparewheel', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+ // Don't inherit, as it's easier for the trenches compat
+ class rhsusf_M1165A1_GMV_SAG2_base: rhsusf_m1151_base {
+ class EGVAR(interaction,anims) {
+ class hide_spare {
+ positions[] = {"_target selectionPosition ['sparewheel_gmv', 'Geometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ class rhsusf_rg33_base: MRAP_01_base_F {
+ class EGVAR(interaction,anims) {
+ class hide_spare {
+ positions[] = {"_target selectionPosition ['sparewheel', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ class rhsusf_M1239_base: MRAP_01_base_F {
+ class EGVAR(interaction,anims) {
+ class hide_spare {
+ positions[] = {"_target selectionPosition ['sparewheel', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ class rhsusf_MATV_base: MRAP_01_base_F {
+ class EGVAR(interaction,anims) {
+ class hide_spare {
+ positions[] = {"_target selectionPosition ['sparewheel', 'Geometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+};
diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_repair/config.cpp b/addons/compat_rhs_usf3/compat_rhs_usf3_repair/config.cpp
new file mode 100644
index 00000000000..b204f64166a
--- /dev/null
+++ b/addons/compat_rhs_usf3/compat_rhs_usf3_repair/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_repair"
+ };
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"johnb43"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ addonRootClass = QUOTE(ADDON);
+ };
+};
+
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_repair/script_component.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_repair/script_component.hpp
new file mode 100644
index 00000000000..1af928486c3
--- /dev/null
+++ b/addons/compat_rhs_usf3/compat_rhs_usf3_repair/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT repair
+#define SUBCOMPONENT_BEAUTIFIED Repair
+#include "..\script_component.hpp"
diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_trenches/CfgVehicles.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_trenches/CfgVehicles.hpp
new file mode 100644
index 00000000000..e914b24d600
--- /dev/null
+++ b/addons/compat_rhs_usf3/compat_rhs_usf3_trenches/CfgVehicles.hpp
@@ -0,0 +1,48 @@
+class CfgVehicles {
+ class rhsusf_stryker_base;
+ class rhsusf_stryker_m1126_base: rhsusf_stryker_base {
+ class EGVAR(interaction,anims) {
+ class Hide_PioKit {
+ positions[] = {{-1, -2.2, -0.5}};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+ class rhsusf_stryker_m1127_base: rhsusf_stryker_m1126_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class Hide_PioKit: Hide_PioKit {
+ positions[] = {{-0.8, -2.2, -0.5}};
+ };
+ };
+ };
+
+ class rhsusf_stryker_m1126_m2_base: rhsusf_stryker_m1126_base {};
+ class rhsusf_stryker_m1132_m2_base: rhsusf_stryker_m1126_m2_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class Hide_PioKit: Hide_PioKit {
+ positions[] = {{-1.3, -3.3, -0.5}};
+ };
+ };
+ };
+ class rhsusf_stryker_m1134_base: rhsusf_stryker_m1126_m2_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class Hide_PioKit: Hide_PioKit {
+ positions[] = {{-1, -2.2, -0.8}};
+ };
+ };
+ };
+
+ class rhsusf_m1151_base;
+ class rhsusf_M1165A1_GMV_SAG2_base: rhsusf_m1151_base {
+ class EGVAR(interaction,anims) {
+ class tools_hide {
+ positions[] = {{0.365, 1.5, -0.4}};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+};
diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_trenches/config.cpp b/addons/compat_rhs_usf3/compat_rhs_usf3_trenches/config.cpp
new file mode 100644
index 00000000000..aea4c9daeb0
--- /dev/null
+++ b/addons/compat_rhs_usf3/compat_rhs_usf3_trenches/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_trenches"
+ };
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"johnb43"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ addonRootClass = QUOTE(ADDON);
+ };
+};
+
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_trenches/script_component.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_trenches/script_component.hpp
new file mode 100644
index 00000000000..10b90eb71e5
--- /dev/null
+++ b/addons/compat_rhs_usf3/compat_rhs_usf3_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/ACE_CSW_Groups.hpp b/addons/compat_sog/ACE_CSW_Groups.hpp
index 2bc81dbb65b..a8914204398 100644
--- a/addons/compat_sog/ACE_CSW_Groups.hpp
+++ b/addons/compat_sog/ACE_CSW_Groups.hpp
@@ -2,7 +2,7 @@ class ACE_CSW_Groups {
// --- Gun Turrets -------------------------------------------------------------
- class ace_csw_100Rnd_127x99_mag {
+ class EGVAR(csw,100Rnd_127x99_mag) {
vn_m2_v_100_mag = 1;
};
diff --git a/addons/compat_sog/CfgAmmo/explosives.hpp b/addons/compat_sog/CfgAmmo/explosives.hpp
index 849f7e69480..6922962fb3e 100644
--- a/addons/compat_sog/CfgAmmo/explosives.hpp
+++ b/addons/compat_sog/CfgAmmo/explosives.hpp
@@ -2,16 +2,10 @@ 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_m18_wp_ammo: vn_mine_m18_ammo {
- EGVAR(explosives,explosive) = "vn_mine_m18_wp_ammo_scripted";
};
class vn_mine_m16_base;
@@ -99,13 +93,7 @@ class vn_mine_punji_05_ammo: vn_mine_punji_04_ammo {
};
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'));
@@ -116,50 +104,8 @@ class vn_mine_cartridge_ammo: APERSMine_Range_Ammo {
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/CfgMagazines/explosives.hpp b/addons/compat_sog/CfgMagazines/explosives.hpp
index 7e25609fc8a..a8d6ca76bd3 100644
--- a/addons/compat_sog/CfgMagazines/explosives.hpp
+++ b/addons/compat_sog/CfgMagazines/explosives.hpp
@@ -6,8 +6,8 @@ class vn_mine_m18_mag: vn_magazine {
displayNameShort = ""; // Every explosive inherits this and it breaks naming in the placing menu
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(m18);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(m18);
class ACE_Triggers {
SupportedTriggers[] = {"Command", "MK16_Transmitter"};
@@ -42,7 +42,7 @@ class vn_mine_m18_fuze10_mag: vn_mine_m18_mag {
// Claymore x3 (Remote)
class vn_mine_m18_x3_mag: vn_mine_m18_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(m18_x3);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(m18_x3);
class ACE_Triggers {
SupportedTriggers[] = {"Command", "MK16_Transmitter"};
@@ -65,7 +65,7 @@ class vn_mine_m18_x3_range_mag: vn_mine_m18_x3_mag {
// WP Claymore (Remote)
class vn_mine_m18_wp_mag: vn_mine_m18_fuze10_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(m18_wp);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(m18_wp);
class ACE_Triggers {
SupportedTriggers[] = {"Command", "MK16_Transmitter"};
@@ -101,7 +101,7 @@ class vn_mine_m18_wp_fuze10_mag: vn_mine_m18_wp_mag {
// Toe-Popper
class vn_mine_m14_mag: vn_mine_m18_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(m14);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(m14);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -113,7 +113,7 @@ class vn_mine_m14_mag: vn_mine_m18_mag {
// Bounding Mine
class vn_mine_m16_mag: vn_mine_m18_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(m16);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(m16);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -125,7 +125,7 @@ class vn_mine_m16_mag: vn_mine_m18_mag {
// Bounding Mine (Trip Wire 2m)
class vn_mine_tripwire_m16_02_mag: vn_mine_m16_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(m16_tripwire_2m);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(m16_tripwire_2m);
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
@@ -136,7 +136,7 @@ class vn_mine_tripwire_m16_02_mag: vn_mine_m16_mag {
};
// 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);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(m16_tripwire_4m);
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
@@ -148,22 +148,22 @@ class vn_mine_tripwire_m16_04_mag: vn_mine_tripwire_m16_02_mag {
// 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);
+ 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);
+ 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);
+ 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);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(satchel_remote_02);
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"};
@@ -180,7 +180,7 @@ class vn_mine_satchel_remote_02_mag: vn_mine_m18_mag {
// TM57 Anti-Tank Mine
class vn_mine_tm57_mag: vn_mine_m18_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(tm57);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(tm57);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -190,7 +190,7 @@ class vn_mine_tm57_mag: vn_mine_m18_mag {
// M15 Anti-Tank Mine
class vn_mine_m15_mag: vn_mine_tm57_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(m15);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(m15);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -202,7 +202,7 @@ class vn_mine_m15_mag: vn_mine_tm57_mag {
// M112 Breaching charge
class vn_mine_m112_remote_mag: vn_mine_m18_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(m112);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(m112);
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"};
@@ -221,7 +221,7 @@ class vn_mine_m112_remote_mag: vn_mine_m18_mag {
// Spiked ammo box
class vn_mine_ammobox_range_mag: vn_mine_m18_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(ammobox_range);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(ammobox_range);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -234,7 +234,7 @@ class vn_mine_ammobox_range_mag: vn_mine_m18_mag {
// Punji large
class vn_mine_punji_01_mag: vn_mine_m18_mag {
useAction = 0;
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(punji_01);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(punji_01);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -246,18 +246,18 @@ class vn_mine_punji_01_mag: vn_mine_m18_mag {
// Punji small
class vn_mine_punji_02_mag: vn_mine_punji_01_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(punji_02);
+ 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);
+ 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);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(punji_04);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -270,7 +270,7 @@ class vn_mine_punji_04_mag: vn_mine_m18_mag {
// Punji side whip
class vn_mine_punji_05_mag: vn_mine_punji_04_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(punji_05);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(punji_05);
class ACE_Triggers: ACE_Triggers {
class PressurePlate: PressurePlate {
@@ -281,7 +281,7 @@ class vn_mine_punji_05_mag: vn_mine_punji_04_mag {
// Bike mine (Remote)
class vn_mine_bike_mag: vn_mine_m18_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(bike);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(bike);
class ACE_Triggers {
SupportedTriggers[] = {QGVAR(Command), QGVAR(MK16_Transmitter)};
@@ -304,7 +304,7 @@ class vn_mine_bike_range_mag: vn_mine_bike_mag {
// Cartridge mine
class vn_mine_cartridge_mag: vn_mine_m18_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(cartridge);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(cartridge);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -316,7 +316,7 @@ class vn_mine_cartridge_mag: vn_mine_m18_mag {
// Lighter mine (Proximity)
class vn_mine_lighter_mag: vn_mine_m18_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(lighter);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(lighter);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -328,7 +328,7 @@ class vn_mine_lighter_mag: vn_mine_m18_mag {
// Pot mine (Remote)
class vn_mine_pot_mag: vn_mine_m18_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(pot);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(pot);
class ACE_Triggers {
SupportedTriggers[] = {"Command", "MK16_Transmitter"};
@@ -351,7 +351,7 @@ class vn_mine_pot_range_mag: vn_mine_pot_mag {
// Jerrycan mine (Remote)
class vn_mine_jerrycan_mag: vn_mine_m18_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(jerrycan);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(jerrycan);
class ACE_Triggers {
SupportedTriggers[] = {"Command", "MK16_Transmitter"};
@@ -374,7 +374,7 @@ class vn_mine_jerrycan_range_mag: vn_mine_jerrycan_mag {
// Mortar shell on a stick (Proximity)
class vn_mine_mortar_range_mag: vn_mine_m18_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(mortar_range);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(mortar_range);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -386,17 +386,17 @@ class vn_mine_mortar_range_mag: vn_mine_m18_mag {
// Limpet mine USA (Remote)
class vn_mine_limpet_01_mag: vn_mine_m18_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(limpet_01);
+ 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);
+ 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);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(chicom_no8);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -408,7 +408,7 @@ class vn_mine_chicom_no8_mag: vn_mine_m18_mag {
// DH10 mine (Remote)
class vn_mine_dh10_mag: vn_mine_m18_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(dh10);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(dh10);
};
// DH10 mine (Proximity)
class vn_mine_dh10_range_mag: vn_mine_dh10_mag {
@@ -422,7 +422,7 @@ class vn_mine_dh10_range_mag: vn_mine_dh10_mag {
// Grenade board mine (Tripwire 4m)
class vn_mine_gboard_range_mag: vn_mine_m18_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(gboard);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(gboard);
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
@@ -434,10 +434,10 @@ class vn_mine_gboard_range_mag: vn_mine_m18_mag {
// Satchel charge
class vn_mine_satchelcharge_02_mag: vn_mine_satchel_remote_02_mag {
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(satchelcharge_02);
+ 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);
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(bangalore);
};
diff --git a/addons/compat_sog/CfgVehicles/tracked.hpp b/addons/compat_sog/CfgVehicles/tracked.hpp
index e2832796a97..7adc0193c63 100644
--- a/addons/compat_sog/CfgVehicles/tracked.hpp
+++ b/addons/compat_sog/CfgVehicles/tracked.hpp
@@ -1,18 +1,55 @@
+// M113A1 https://man.fas.org/dod-101/sys/land/m113.htm
+class Tank_F;
+class APC_Tracked_01_base_F: Tank_F {
+ class ACE_Actions;
+};
+class vn_armor_m113_base: APC_Tracked_01_base_F {
+ EGVAR(refuel,fuelCapacity) = 360;
+ class ACE_Actions: ACE_Actions {
+ class ACE_MainActions;
+ };
+};
+class vn_armor_m577_base: vn_armor_m113_base {
+ class ACE_Actions: ACE_Actions {
+ class ACE_MainActions: ACE_MainActions {
+ position = "[0, 3.5, -1]";
+ };
+ };
+};
+
// 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;
+// M48
+class vn_armor_m48_base: vn_armor_tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_mainturret_backpacks {
+ // Rotate interactions with turret rotation
+ positions[] = {
+ "[[-1.3, -0.7, -0.4], [0, 0, 1], deg (_target animationPhase 'MainTurret')] call CBA_fnc_vectRotate3D",
+ "[[0.1, -2, -0.2], [0, 0, 1], deg (_target animationPhase 'MainTurret')] call CBA_fnc_vectRotate3D"
+ };
+ items[] = {"vn_b_pack_02_02", "vn_b_pack_04_02"};
+ name = "$STR_a3_cfgvehicleclasses_backpacks0";
+ text = "$STR_a3_cfgvehicleclasses_backpacks0";
+ };
+ };
};
-// 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;
+// T-54
+class vn_armor_t54_base: vn_armor_tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_mainturret_backpacks {
+ // Rotate interactions with turret rotation
+ positions[] = {"[0, -0.2, 0] vectorAdd ([[-1.1, -0.85, -1.3], [0, 0, 1], deg (_target animationPhase 'MainTurret')] call CBA_fnc_vectRotate3D)"};
+ items[] = {"vn_o_pack_01", "vn_o_pack_02"};
+ name = "$STR_a3_cfgvehicleclasses_backpacks0";
+ text = "$STR_a3_cfgvehicleclasses_backpacks0";
+ };
+ };
};
// PT-76A https://en.wikipedia.org/wiki/PT-76
@@ -24,3 +61,8 @@ class vn_armor_pt76_base: vn_armor_tank_base {
class vn_armor_pt76b_base: vn_armor_pt76_base {
EGVAR(refuel,fuelCapacity) = 400;
};
+
+// Type 63
+class vn_armor_type63_base: vn_armor_tank_base {
+ EGVAR(refuel,fuelCapacity) = 545;
+};
diff --git a/addons/compat_sog/CfgVehicles/turrets.hpp b/addons/compat_sog/CfgVehicles/turrets.hpp
index 6142a018e81..928b80716a4 100644
--- a/addons/compat_sog/CfgVehicles/turrets.hpp
+++ b/addons/compat_sog/CfgVehicles/turrets.hpp
@@ -17,7 +17,7 @@ class vn_static_m2_high_base: StaticMGWeapon {
};
};
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
proxyWeapon = "vn_m2_v_01";
magazineLocation = "_target selectionPosition 'mg1_magazine'";
@@ -31,7 +31,7 @@ class vn_static_m2_high_base: StaticMGWeapon {
// M2 Browning - Low
class vn_static_m2_low_base: vn_static_m2_high_base {
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
disassembleTurret = QEGVAR(csw,m3TripodLow);
};
};
@@ -45,7 +45,7 @@ class vn_static_m1919a6_base: vn_static_m2_low_base {
};
};
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
enabled = 1;
proxyWeapon = "vn_m1919_v_01";
magazineLocation = "_target selectionPosition 'mg1_magazine' vectorAdd [-0.3, 0, 0]";
@@ -66,7 +66,7 @@ class vn_static_m1919a4_high_base: vn_static_m1919a6_base {
};
};
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
enabled = 1;
proxyWeapon = "vn_m1919_v_01";
magazineLocation = "_target selectionPosition 'mg1_magazine'";
@@ -80,7 +80,7 @@ class vn_static_m1919a4_high_base: vn_static_m1919a6_base {
// M1919A4 - Low
class vn_static_m1919a4_low_base: vn_static_m1919a4_high_base {
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
disassembleTurret = QEGVAR(csw,m3TripodLow);
};
};
@@ -93,7 +93,7 @@ class vn_static_m60_high_base: vn_static_m2_low_base {
};
};
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
enabled = 1;
proxyWeapon = "vn_m60_v_01";
magazineLocation = "_target selectionPosition 'mg1_trigger'";
@@ -113,7 +113,7 @@ class vn_static_m60_low_base: vn_static_m60_high_base {
};
};
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
magazineLocation = "_target selectionPosition 'mg1_otochlaven_recoil'";
disassembleTurret = QEGVAR(csw,m3TripodLow);
};
@@ -131,7 +131,7 @@ class vn_static_tow_base: vn_static_at3_base {
};
};
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
proxyWeapon = "vn_missile_tow_launcher";
magazineLocation = "_target selectionPosition 'magazine'";
@@ -145,7 +145,7 @@ class vn_static_tow_base: vn_static_at3_base {
// DShKM - High
class vn_static_dp28_high_base: vn_static_m2_high_base {
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
enabled = 0;
};
};
@@ -156,7 +156,7 @@ class vn_static_dshkm_high_01_base: vn_static_dp28_high_base {
};
};
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
enabled = 1;
proxyWeapon = "vn_dshkm_v_01";
magazineLocation = "_target selectionPosition 'mg1_boxmag'";
@@ -170,7 +170,7 @@ class vn_static_dshkm_high_01_base: vn_static_dp28_high_base {
// DShKM - High, with AA sight
class vn_static_dshkm_high_02_base: vn_static_dshkm_high_01_base {
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
disassembleWeapon = QGVAR(dshkm_AA_carry);
};
};
@@ -185,7 +185,7 @@ class vn_static_dshkm_low_01_base: vn_static_dshkm_high_01_base {
};
};
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
disassembleWeapon = QGVAR(dshkm_shield_carry);
disassembleTurret = QEGVAR(csw,kordTripodLow);
};
@@ -193,7 +193,7 @@ class vn_static_dshkm_low_01_base: vn_static_dshkm_high_01_base {
// DShKM - Low
class vn_static_dshkm_low_02_base: vn_static_dshkm_low_01_base {
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
disassembleWeapon = QGVAR(dshkm_carry);
};
};
@@ -206,7 +206,7 @@ class vn_static_rpd_high_base: vn_static_dp28_high_base {
};
};
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
enabled = 1;
proxyWeapon = "vn_rpd_v_01";
magazineLocation = "_target selectionPosition 'mg1_otochlaven_recoil'";
@@ -226,7 +226,7 @@ class vn_static_pk_high_base: vn_static_rpd_high_base {
};
};
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
enabled = 1;
proxyWeapon = "vn_pk_v_01";
magazineLocation = "_target selectionPosition 'mg1_otochlaven_recoil'";
@@ -246,7 +246,7 @@ class vn_static_pk_low_base: vn_static_pk_high_base {
};
};
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
disassembleTurret = QEGVAR(csw,kordTripodLow);
};
};
@@ -259,7 +259,7 @@ class vn_static_mg42_high_base: vn_static_rpd_high_base {
};
};
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
proxyWeapon = "vn_mg42_v_01";
magazineLocation = "_target selectionPosition 'mg1_otochlaven_recoil'";
@@ -278,7 +278,7 @@ class vn_static_mg42_low_base: vn_static_mg42_high_base {
};
};
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
disassembleTurret = "";
};
};
@@ -294,7 +294,7 @@ class vn_static_sgm_high_base: vn_static_sgm_base {
};
};
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
proxyWeapon = "vn_sgm_v_01";
magazineLocation = "_target selectionPosition 'mg1_otochlaven_recoil'";
@@ -308,7 +308,7 @@ class vn_static_sgm_high_base: vn_static_sgm_base {
// SGM - Low
class vn_static_sgm_low_base: vn_static_sgm_high_base {
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
disassembleWeapon = QGVAR(sgm_carry);
disassembleTurret = QEGVAR(csw,kordTripodLow);
};
@@ -316,25 +316,25 @@ class vn_static_sgm_low_base: vn_static_sgm_high_base {
// SGM - Shield
class vn_o_pl_static_sgm_low_01: vn_static_sgm_low_base {
- class ACE_CSW: ACE_CSW {
+ 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 {
+ 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 {
+ 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 {
+ class ace_csw: ace_csw {
disassembleWeapon = QGVAR(sgm_shield_carry);
disassembleTurret = QEGVAR(csw,kordTripodLow);
};
@@ -351,7 +351,7 @@ class vn_static_mk18_base: StaticCannon {
};
};
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
proxyWeapon = "vn_mk18_v_01";
magazineLocation = "_target selectionPosition 'mg1_magazine'";
@@ -378,7 +378,7 @@ class vn_static_mortar_m29_base: Mortar_01_base_F {
};
};
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
proxyWeapon = QGVAR(vn_mortar_m29);
magazineLocation = "_target selectionPosition 'pohon'";
@@ -392,7 +392,7 @@ class vn_static_mortar_m29_base: Mortar_01_base_F {
// M2 / Type 63 Mortar
class vn_static_mortar_m2_base: vn_static_mortar_m29_base {
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
enabled = 1;
proxyWeapon = QGVAR(vn_mortar_m2);
magazineLocation = "_target selectionPosition 'pohon'";
@@ -406,7 +406,7 @@ class vn_static_mortar_m2_base: vn_static_mortar_m29_base {
// Type 53 Mortar
class vn_static_mortar_type53_base: vn_static_mortar_m29_base {
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
enabled = 1;
proxyWeapon = QGVAR(vn_mortar_type53);
magazineLocation = "_target selectionPosition 'pohon'";
@@ -430,7 +430,7 @@ class vn_static_h12_base: Mortar_01_base_F {
};
};
- class ACE_CSW {
+ class ace_csw {
enabled = 0;
};
};
@@ -441,7 +441,7 @@ class vn_static_m45_base: vn_static_m2_high_base {
EGVAR(dragging,canCarry) = 0;
EGVAR(dragging,canDrag) = 0;
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
enabled = 0;
};
};
@@ -450,7 +450,7 @@ class vn_static_zpu4_base: vn_static_m2_high_base {
EGVAR(dragging,canCarry) = 0;
EGVAR(dragging,canDrag) = 0;
- class ACE_CSW: ACE_CSW {
+ class ace_csw: ace_csw {
enabled = 0;
};
};
@@ -466,7 +466,7 @@ class vn_o_static_rsna75: StaticMGWeapon {
};
};
- class ACE_CSW {
+ class ace_csw {
enabled = 0;
};
};
diff --git a/addons/compat_sog/CfgWeapons/csw.hpp b/addons/compat_sog/CfgWeapons/csw.hpp
index 87b1b16c5ec..b5ca942f6e8 100644
--- a/addons/compat_sog/CfgWeapons/csw.hpp
+++ b/addons/compat_sog/CfgWeapons/csw.hpp
@@ -20,7 +20,7 @@ class GVAR(m2_carry): Launcher_Base_F {
modes[] = {};
picture = QPATHTOF(UI\csw_m2b_ca.paa);
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
@@ -48,7 +48,7 @@ class GVAR(m1919a4_carry): Launcher_Base_F {
modes[] = {};
picture = QPATHTOF(UI\csw_m1919a4_ca.paa);
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
@@ -76,7 +76,7 @@ class GVAR(m1919a6_carry): Launcher_Base_F {
modes[] = {};
picture = QPATHTOF(UI\csw_m1919a6_ca.paa);
- class ACE_CSW {
+ class ace_csw {
type = "mount";
deployTime = 2;
pickupTime = 2;
@@ -100,7 +100,7 @@ class GVAR(m60_carry): Launcher_Base_F {
modes[] = {};
picture = QPATHTOF(UI\csw_m60_ca.paa);
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
@@ -128,7 +128,7 @@ class GVAR(tow_carry): Launcher_Base_F {
modes[] = {};
picture = QPATHTOF(UI\csw_tow_ca.paa);
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
@@ -155,7 +155,7 @@ class GVAR(dshkm_carry): Launcher_Base_F {
modes[] = {};
picture = QPATHTOF(UI\csw_dshkm_ca.paa);
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
@@ -183,7 +183,7 @@ class GVAR(dshkm_shield_carry): Launcher_Base_F {
modes[] = {};
picture = QPATHTOF(UI\csw_dshkm_shield_ca.paa);
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
@@ -210,7 +210,7 @@ class GVAR(dshkm_AA_carry): Launcher_Base_F {
modes[] = {};
picture = QPATHTOF(UI\csw_dshkm_aa_ca.paa);
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
@@ -237,7 +237,7 @@ class GVAR(rpd_carry): Launcher_Base_F {
modes[] = {};
picture = QPATHTOF(UI\csw_rpd_ca.paa);
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
@@ -264,7 +264,7 @@ class GVAR(pk_carry): Launcher_Base_F {
modes[] = {};
picture = QPATHTOF(UI\csw_pk_ca.paa);
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
@@ -292,7 +292,7 @@ class GVAR(mortar_m29_carry): Launcher_Base_F {
modes[] = {};
picture = QPATHTOF(UI\csw_m29_ca.paa);
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 20;
pickupTime = 25;
@@ -319,7 +319,7 @@ class GVAR(mg42_carry): Launcher_Base_F {
modes[] = {};
picture = QPATHTOF(UI\csw_mg42_ca.paa);
- class ACE_CSW {
+ class ace_csw {
type = "mount";
deployTime = 4;
pickupTime = 4;
@@ -347,7 +347,7 @@ class GVAR(sgm_carry): Launcher_Base_F {
modes[] = {};
picture = QPATHTOF(UI\csw_sgm_ca.paa);
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
@@ -374,7 +374,7 @@ class GVAR(sgm_shield_carry): Launcher_Base_F {
modes[] = {};
picture = QPATHTOF(UI\csw_sgm_shield_ca.paa);
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
@@ -401,7 +401,7 @@ class GVAR(mk18_carry): Launcher_Base_F {
modes[] = {};
picture = QPATHTOF(UI\csw_mk18_ca.paa);
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 4;
pickupTime = 4;
@@ -430,7 +430,7 @@ class GVAR(mortar_m2_carry): Launcher_Base_F {
modes[] = {};
picture = QPATHTOF(UI\csw_m2_ca.paa);
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 20;
pickupTime = 25;
@@ -457,7 +457,7 @@ class GVAR(mortar_type53_carry): Launcher_Base_F {
modes[] = {};
picture = QPATHTOF(UI\csw_type53_ca.paa);
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 20;
pickupTime = 25;
diff --git a/addons/compat_sog/compat_sog_refuel/CfgVehicles.hpp b/addons/compat_sog/compat_sog_refuel/CfgVehicles.hpp
new file mode 100644
index 00000000000..c3dcfb719e5
--- /dev/null
+++ b/addons/compat_sog/compat_sog_refuel/CfgVehicles.hpp
@@ -0,0 +1,163 @@
+class CfgVehicles {
+ // Vehicle animation interactions
+ // BTR-40
+ class vn_wheeled_car_base;
+ class vn_wheeled_btr40_base: vn_wheeled_car_base {
+ class EGVAR(interaction,anims) {
+ class refuel_can_hide {
+ positions[] = {{0.7, -2.35, -0.9}};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+ class vn_wheeled_btr40_01_base: vn_wheeled_btr40_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class refuel_can_hide: refuel_can_hide {
+ positions[] = {{0.72, -2.35, -0.45}};
+ };
+ };
+ };
+ class vn_wheeled_btr40_ambulance_base: vn_wheeled_btr40_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class refuel_can_hide: refuel_can_hide {
+ positions[] = {{0.72, -2.35, -0.45}};
+ };
+ };
+ };
+ class vn_wheeled_btr40_mg_01_base: vn_wheeled_btr40_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class refuel_can_hide: refuel_can_hide {
+ positions[] = {{0.72, -2.35, -0.9}};
+ };
+ };
+ };
+ class vn_wheeled_btr40_mg_03_base: vn_wheeled_btr40_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class refuel_can_hide: refuel_can_hide {
+ positions[] = {{0.82, -2.35, -1.25}};
+ };
+ };
+ };
+ class vn_wheeled_btr40_mg_04_base: vn_wheeled_btr40_mg_01_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class refuel_can_hide: refuel_can_hide {
+ positions[] = {{0.72, -2.35, -1}};
+ };
+ };
+ };
+ class vn_wheeled_btr40_mg_05_base: vn_wheeled_btr40_mg_04_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class refuel_can_hide: refuel_can_hide {
+ positions[] = {{0.65, -2.25, -1}};
+ };
+ };
+ };
+
+ // M151
+ class vn_wheeled_m151_base: vn_wheeled_car_base {
+ class EGVAR(interaction,anims) {
+ class user_refuel_can_hide {
+ positions[] = {{-0.48, -1.5, -1.1}};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+ class vn_wheeled_m151_mg_03_base: vn_wheeled_m151_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class user_refuel_can_hide: user_refuel_can_hide {
+ positions[] = {{-0.75, -1.5, -1}};
+ };
+ };
+ };
+ class vn_wheeled_m151_mg_05_base: vn_wheeled_m151_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class user_refuel_can_hide: user_refuel_can_hide {
+ positions[] = {{0.9, -0.1, -1.1}};
+ };
+ };
+ };
+ class vn_wheeled_m151_mg_06_base: vn_wheeled_m151_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class user_refuel_can_hide: user_refuel_can_hide {
+ positions[] = {{0.3, 0.1, -1.1}};
+ };
+ };
+ };
+ class vn_wheeled_m151_01_base: vn_wheeled_m151_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class user_refuel_can_hide: user_refuel_can_hide {
+ positions[] = {{-0.4, -1.5, -0.7}};
+ };
+ };
+ };
+
+ // M577
+ class vn_armor_m113_base;
+ class vn_armor_m577_base: vn_armor_m113_base {
+ class EGVAR(interaction,anims) {
+ class hide_fuel_cans {
+ selections[] = {"hide_fuel_cans"};
+ positions[] = {{1.07, 1.05, -1}};
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+
+ // M48
+ class vn_armor_tank_base;
+ class vn_armor_m48_base: vn_armor_tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_mainturret_jerrycan {
+ positions[] = {"_target selectionPosition ['hide_jerrycan', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+
+ // BTR-50PK
+ class vn_armor_btr50pk_base: vn_armor_tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_barrels {
+ selections[] = {"hide_barrels"};
+ positions[] = {"private _pos = _target selectionPosition 'hide_barrels'; _pos set [0, -(_pos select 0)]; _pos"}; // Mirror position to other side of vehicle
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+
+ // PT-76
+ class vn_armor_pt76_base: vn_armor_tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_barrels {
+ selections[] = {"hide_barrels"};
+ positions[] = {"private _pos = _target selectionPosition 'hide_barrels'; _pos set [0, -(_pos select 0)]; _pos"}; // Mirror position to other side of vehicle
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+
+ // Type 63
+ class vn_armor_type63_base: vn_armor_tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_barrels {
+ selections[] = {"hide_barrels"};
+ positions[] = {"private _pos = _target selectionPosition 'hide_barrels'; _pos set [0, -(_pos select 0)]; _pos"}; // Mirror position to other side of vehicle
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+};
diff --git a/addons/compat_sog/compat_sog_refuel/config.cpp b/addons/compat_sog/compat_sog_refuel/config.cpp
new file mode 100644
index 00000000000..793cf90fc4e
--- /dev/null
+++ b/addons/compat_sog/compat_sog_refuel/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_refuel"};
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"johnb43"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+ };
+};
+
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_sog/compat_sog_refuel/script_component.hpp b/addons/compat_sog/compat_sog_refuel/script_component.hpp
new file mode 100644
index 00000000000..af997fb8d4d
--- /dev/null
+++ b/addons/compat_sog/compat_sog_refuel/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT refuel
+#define SUBCOMPONENT_BEAUTIFIED refuel
+#include "..\script_component.hpp"
diff --git a/addons/compat_sog/compat_sog_repair/CfgVehicles.hpp b/addons/compat_sog/compat_sog_repair/CfgVehicles.hpp
new file mode 100644
index 00000000000..de93243251e
--- /dev/null
+++ b/addons/compat_sog/compat_sog_repair/CfgVehicles.hpp
@@ -0,0 +1,141 @@
+class CfgVehicles {
+ // Vehicle animation interactions
+ // M39 / M54 / M49
+ class vn_wheeled_truck_base;
+ class vn_wheeled_m54_base: vn_wheeled_truck_base {
+ class EGVAR(interaction,anims) {
+ class user_sparewheel_hide {
+ positions[] = {"_target selectionPosition ['hide_spare_wheel', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+ class vn_wheeled_m54_mg_01_base: vn_wheeled_m54_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class user_sparewheel_hide: user_sparewheel_hide {
+ items[] = {"ACE_Wheel", "ACE_Wheel", "ACE_Wheel", "ACE_Wheel"};
+ };
+ };
+ };
+
+ // M151
+ class vn_wheeled_car_base;
+ class vn_wheeled_m151_base: vn_wheeled_car_base {
+ class EGVAR(interaction,anims) {
+ class user_sparewheel_hide {
+ positions[] = {"_target selectionPosition ['hide_sparewheel', 'ViewGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ // Dirt Ranger
+ class vn_wheeled_lr2a_base: vn_wheeled_car_base {
+ class EGVAR(interaction,anims) {
+ class hide_sparewheel {
+ positions[] = {"_target selectionPosition ['hide_sparewheel', 'ViewGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ // BTR-40
+ class vn_wheeled_btr40_base: vn_wheeled_car_base {
+ class EGVAR(interaction,anims) {
+ class sparewheel_hide {
+ positions[] = {"_target selectionPosition ['hide_sparewheel', 'ViewGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ // M48
+ class vn_armor_tank_base;
+ class vn_armor_m48_base: vn_armor_tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_mainturret_tracks {
+ // Rotate interactions with turret rotation
+ positions[] = {
+ "[[1.3, 0.2, -0.5], [0, 0, 1], deg (_target animationPhase 'MainTurret')] call CBA_fnc_vectRotate3D",
+ "[[-1.3, 0.2, -0.5], [0, 0, 1], deg (_target animationPhase 'MainTurret')] call CBA_fnc_vectRotate3D"
+ };
+ items[] = {"ACE_Track", "ACE_Track", "ACE_Track", "ACE_Track", "ACE_Track"};
+ name = ECSTRING(repair,RemoveTrack);
+ text = ECSTRING(repair,RemovingTrack);
+ };
+ };
+ };
+
+ // BTR-50PK
+ class vn_armor_btr50pk_base: vn_armor_tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_tracks {
+ positions[] = {{1.35, 2.5, -0.5}};
+ items[] = {"ACE_Track"};
+ name = ECSTRING(repair,RemoveTrack);
+ text = ECSTRING(repair,RemovingTrack);
+ };
+ };
+ };
+ class vn_armor_btr50pk_01_base: vn_armor_btr50pk_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_tracks: hide_tracks {
+ positions[] = {{1.35, 2.5, -0.8}};
+ };
+ };
+ };
+
+ class vn_armor_btr50pk_02_base: vn_armor_btr50pk_01_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_tracks: hide_tracks {
+ positions[] = {{1.35, 2.9, -0.8}};
+ };
+ };
+ };
+
+ // T-54
+ class vn_armor_t54_base: vn_armor_tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_tracks {
+ positions[] = {{1.4, 2.1, -1.7}};
+ items[] = {"ACE_Track"};
+ name = ECSTRING(repair,RemoveTrack);
+ text = ECSTRING(repair,RemovingTrack);
+ };
+ };
+ };
+
+ // PT-76
+ class vn_armor_pt76_base: vn_armor_tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_tracks {
+ // Rotate interactions with turret rotation
+ positions[] = {"[0, 0.9, 0] vectorAdd ([[-0.6, -0.9, -0.3], [0, 0, 1], deg (_target animationPhase 'MainTurret')] call CBA_fnc_vectRotate3D)"};
+ items[] = {"ACE_Track"};
+ name = ECSTRING(repair,RemoveTrack);
+ text = ECSTRING(repair,RemovingTrack);
+ };
+ };
+ };
+
+ // Type 63
+ class vn_armor_type63_base: vn_armor_tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_tracks {
+ // Rotate interactions with turret rotation
+ positions[] = {"[0, 0.7, 0] vectorAdd ([[0.4, -1.1, -0.4], [0, 0, 1], deg (_target animationPhase 'MainTurret')] call CBA_fnc_vectRotate3D)"};
+ items[] = {"ACE_Track"};
+ name = ECSTRING(repair,RemoveTrack);
+ text = ECSTRING(repair,RemovingTrack);
+ };
+ };
+ };
+};
diff --git a/addons/compat_sog/compat_sog_repair/config.cpp b/addons/compat_sog/compat_sog_repair/config.cpp
new file mode 100644
index 00000000000..b2cffd8a364
--- /dev/null
+++ b/addons/compat_sog/compat_sog_repair/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_repair"};
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"johnb43"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+ };
+};
+
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_sog/compat_sog_repair/script_component.hpp b/addons/compat_sog/compat_sog_repair/script_component.hpp
new file mode 100644
index 00000000000..1af928486c3
--- /dev/null
+++ b/addons/compat_sog/compat_sog_repair/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT repair
+#define SUBCOMPONENT_BEAUTIFIED Repair
+#include "..\script_component.hpp"
diff --git a/addons/compat_sog/compat_sog_trenches/CfgVehicles.hpp b/addons/compat_sog/compat_sog_trenches/CfgVehicles.hpp
index bb222eaed16..bc67a39f784 100644
--- a/addons/compat_sog/compat_sog_trenches/CfgVehicles.hpp
+++ b/addons/compat_sog/compat_sog_trenches/CfgVehicles.hpp
@@ -60,4 +60,199 @@ class CfgVehicles {
class EGVAR(compat_sog,spiderhole_03_nogeo): vn_o_vc_spiderhole_03 {
scope = 1;
};
+
+ // Vehicle animation interactions
+ // BTR-40
+ class vn_wheeled_car_base;
+ class vn_wheeled_btr40_base: vn_wheeled_car_base {
+ class EGVAR(interaction,anims) {
+ class shovel_hide {
+ positions[] = {{0.95, -1.5, -0.75}};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+ class vn_wheeled_btr40_01_base: vn_wheeled_btr40_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class shovel_hide: shovel_hide {
+ positions[] = {{0.95, -1.5, -0.3}};
+ };
+ };
+ };
+ class vn_wheeled_btr40_ambulance_base: vn_wheeled_btr40_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class shovel_hide: shovel_hide {
+ positions[] = {{0.95, -1.5, -0.3}};
+ };
+ };
+ };
+ class vn_wheeled_btr40_mg_01_base: vn_wheeled_btr40_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class shovel_hide: shovel_hide {
+ positions[] = {{0.95, -1.5, -0.8}};
+ };
+ };
+ };
+ class vn_wheeled_btr40_mg_03_base: vn_wheeled_btr40_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class shovel_hide: shovel_hide {
+ positions[] = {{1.05, -1.55, -1.1}};
+ };
+ };
+ };
+ class vn_wheeled_btr40_mg_04_base: vn_wheeled_btr40_mg_01_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class shovel_hide: shovel_hide {
+ positions[] = {{0.95, -1.5, -0.85}};
+ };
+ };
+ };
+ class vn_wheeled_btr40_mg_05_base: vn_wheeled_btr40_mg_04_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class shovel_hide: shovel_hide {
+ positions[] = {{0.9, -1.4, -0.85}};
+ };
+ };
+ };
+
+ // Dirt Ranger
+ class vn_wheeled_lr2a_base: vn_wheeled_car_base {
+ class EGVAR(interaction,anims) {
+ class hide_shovel {
+ positions[] = {"_target selectionPosition ['hide_shovel', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+
+ // M151
+ class vn_wheeled_m151_base: vn_wheeled_car_base {
+ class EGVAR(interaction,anims) {
+ class user_shovel_hide {
+ positions[] = {{0.65, 0.2, -1.4}};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+ class vn_wheeled_m151_mg_03_base: vn_wheeled_m151_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class user_shovel_hide: user_shovel_hide {
+ positions[] = {{0.35, 0.2, -1.27}};
+ };
+ };
+ };
+ class vn_wheeled_m151_mg_05_base: vn_wheeled_m151_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class user_shovel_hide: user_shovel_hide {
+ enabled = 0;
+ };
+ };
+ };
+ class vn_wheeled_m151_mg_06_base: vn_wheeled_m151_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class user_shovel_hide: user_shovel_hide {
+ enabled = 0;
+ };
+ };
+ };
+ class vn_wheeled_m151_01_base: vn_wheeled_m151_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class user_shovel_hide: user_shovel_hide {
+ positions[] = {{0.72, 0.2, -0.92}};
+ };
+ };
+ };
+
+ // M113
+ class APC_Tracked_01_base_F;
+ class vn_armor_m113_base: APC_Tracked_01_base_F {
+ class EGVAR(interaction,anims) {
+ class hide_shovel {
+ positions[] = {{0.2, 2.2, -0.5}};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+ class vn_armor_m113_01_base: vn_armor_m113_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_shovel: hide_shovel {};
+ };
+ };
+ class vn_armor_m132_base: vn_armor_m113_01_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_shovel: hide_shovel {
+ positions[] = {{0.2, 2.2, -0.35}};
+ };
+ };
+ };
+
+ // Don't inherit, as it's easier for the refuel compat
+ // M577
+ class vn_armor_m577_base: vn_armor_m113_base {
+ class EGVAR(interaction,anims) {
+ class hide_shovel {
+ positions[] = {{0.2, 5.05, -0.57}};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+
+ // M48
+ class vn_armor_tank_base;
+ class vn_armor_m48_base: vn_armor_tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_mainturret_tools {
+ positions[] = {"_target selectionPosition ['hide_tools', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+
+ // BTR-50PK
+ class vn_armor_btr50pk_base: vn_armor_tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_shovel {
+ positions[] = {"_target selectionPosition ['hide_shovel', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_EntrenchingTool", "ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+
+ // PT-76
+ class vn_armor_pt76_base: vn_armor_tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_shovel {
+ positions[] = {"_target selectionPosition ['hide_shovel', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+
+ // Type 63
+ class vn_armor_type63_base: vn_armor_tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_shovel {
+ positions[] = {"_target selectionPosition ['hide_shovel', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
};
diff --git a/addons/compat_spe/CfgMagazines/csw.hpp b/addons/compat_spe/CfgMagazines/csw.hpp
index 404156bd8f8..6b4c385a42a 100644
--- a/addons/compat_spe/CfgMagazines/csw.hpp
+++ b/addons/compat_spe/CfgMagazines/csw.hpp
@@ -2,43 +2,16 @@ class CA_Magazine;
// M1919A4/A6
class SPE_50Rnd_762x63: CA_Magazine {
- ACE_isBelt = 0;
-};
-
-class SPE_100Rnd_762x63: SPE_50Rnd_762x63 {
- ACE_isBelt = 1;
-};
-
-class SPE_100Rnd_762x63_M1: SPE_100Rnd_762x63 {
ACE_isBelt = 1;
};
-class SPE_100Rnd_762x63_M2_AP: SPE_100Rnd_762x63 {
+// M2
+class VehicleMagazine;
+class SPE_100Rnd_127x99_M2: VehicleMagazine {
ACE_isBelt = 1;
};
-//MG34/42
-
+// MG34/42
class SPE_50Rnd_792x57: CA_Magazine {
- ACE_isBelt = 0;
-};
-
-class SPE_50Rnd_792x57_sS: SPE_50Rnd_792x57 {
- ACE_isBelt = 0;
-};
-
-class SPE_50Rnd_792x57_SMK: SPE_50Rnd_792x57_sS {
- ACE_isBelt = 0;
-};
-
-class SPE_100Rnd_792x57: SPE_50Rnd_792x57 {
- ACE_isBelt = 1;
-};
-
-class SPE_100Rnd_792x57_sS: SPE_50Rnd_792x57_sS {
- ACE_isBelt = 1;
-};
-
-class SPE_100Rnd_792x57_SMK: SPE_50Rnd_792x57_SMK {
ACE_isBelt = 1;
};
diff --git a/addons/compat_spe/CfgVehicles/wheeled.hpp b/addons/compat_spe/CfgVehicles/wheeled.hpp
index 6ed68dfbdfb..f645db29e64 100644
--- a/addons/compat_spe/CfgVehicles/wheeled.hpp
+++ b/addons/compat_spe/CfgVehicles/wheeled.hpp
@@ -56,8 +56,12 @@ class SPE_OpelBlitz_Ammo: SPE_OpelBlitz_base {
EGVAR(rearm,defaultSupply) = 1200;
};
-// WHEELED - ALLIED FORCES
+class SPE_OpelBlitz_Fuel: SPE_OpelBlitz_base {
+ EGVAR(refuel,hooks)[] = {{-0.23, -2.58, -0.59}};
+ EGVAR(refuel,fuelCargo) = 2000;
+};
+// WHEELED - ALLIED FORCES
class SPE_US_M3_Halftrack_Ambulance: SPE_Halftrack_base {
EGVAR(medical,medicClass) = 1;
};
@@ -69,3 +73,69 @@ class SPE_US_M3_Halftrack_Repair: SPE_Halftrack_base {
class SPE_US_M3_Halftrack_Ammo: SPE_Halftrack_base {
EGVAR(rearm,defaultSupply) = 1200;
};
+
+class SPE_US_M3_Halftrack_Fuel: SPE_Halftrack_base {
+ EGVAR(refuel,hooks)[] = {{-0.23, -2.58, -0.59}};
+ EGVAR(refuel,fuelCargo) = 2000;
+};
+
+class SPE_Car_base;
+class SPE_G503_MB_base: SPE_Car_base {
+ class EGVAR(interaction,anims) {
+ class hide_musette_source {
+ positions[] = {{0.8, -0.97, -0.6}, {-0.8, -0.92, -0.6}};
+ items[] = {"B_SPE_US_M36", "B_SPE_US_M36"};
+ name = "$STR_CTH_B_SPE_US_M36";
+ text = "$STR_CTH_B_SPE_US_M36";
+ };
+ };
+};
+class SPE_US_G503_MB_M1919_base: SPE_G503_MB_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_musette_source: hide_musette_source {
+ positions[] = {{0.8, -0.5, -0.6}, {-0.8, -0.45, -0.6}};
+ };
+ };
+};
+class SPE_US_G503_MB_M1919_Armoured_base: SPE_G503_MB_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_musette_source: hide_musette_source {
+ positions[] = {{0.8, -0.5, -0.6}, {-0.8, -0.45, -0.6}};
+ };
+ };
+};
+class SPE_US_G503_MB_M1919_PATROL_base: SPE_G503_MB_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_musette_source: hide_musette_source {
+ positions[] = {{0.8, -0.5, -0.6}, {-0.8, -0.45, -0.6}};
+ };
+ };
+};
+class SPE_US_G503_MB_M2_base: SPE_G503_MB_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_musette_source: hide_musette_source {
+ positions[] = {{0.8, -0.5, -0.6}, {-0.8, -0.45, -0.6}};
+ };
+ };
+};
+class SPE_US_G503_MB_M2_Armoured_base: SPE_G503_MB_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_musette_source: hide_musette_source {
+ positions[] = {{0.8, -0.5, -0.6}, {-0.8, -0.45, -0.6}};
+ };
+ };
+};
+class SPE_US_G503_MB_M2_PATROL_base: SPE_G503_MB_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_musette_source: hide_musette_source {
+ positions[] = {{0.8, -0.5, -0.6}, {-0.8, -0.45, -0.6}};
+ };
+ };
+};
+class SPE_G503_MB_Ambulance_base: SPE_G503_MB_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_musette_source: hide_musette_source {
+ positions[] = {{0.8, -0.5, -0.6}, {-0.8, -0.45, -0.6}};
+ };
+ };
+};
diff --git a/addons/compat_spe/compat_spe_csw/ACE_CSW_Groups.hpp b/addons/compat_spe/compat_spe_csw/ACE_CSW_Groups.hpp
deleted file mode 100644
index 35758ed5333..00000000000
--- a/addons/compat_spe/compat_spe_csw/ACE_CSW_Groups.hpp
+++ /dev/null
@@ -1,50 +0,0 @@
-class ACE_CSW_Groups {
-
- // --- Gun Turrets -------------------------------------------------------------
-
- class SPE_100Rnd_762x63 {
- SPE_100Rnd_762x63 = 1;
- };
-
- class SPE_100Rnd_762x63_M1 {
- SPE_100Rnd_762x63_M1 = 1;
- };
-
- class SPE_100Rnd_762x63_M2_AP {
- SPE_100Rnd_762x63_M2_AP = 1;
- };
-
- class SPE_100Rnd_792x57 {
- SPE_100Rnd_792x57 = 1;
- };
-
- class SPE_100Rnd_792x57_sS {
- SPE_100Rnd_792x57_sS = 1;
- };
-
- class SPE_100Rnd_792x57_SMK {
- SPE_100Rnd_792x57_SMK = 1;
- };
-
- // --- Mortars -------------------------------------------------------------
-
- class SPE_1Rnd_81mmHE_M1_M43A1 {
- SPE_1Rnd_81mmHE_M1_M43A1 = 1;
- };
- class SPE_1Rnd_81mmWP_M1_M57 {
- SPE_1Rnd_81mmWP_M1_M57 = 1;
- };
- class SPE_81mm_M1_M57_SmokeShell {
- SPE_81mm_M1_M57_SmokeShell = 1;
- };
-
- class SPE_1Rnd_81mm_FA_Mle_1932_HE {
- SPE_1Rnd_81mm_FA_Mle_1932_HE = 1;
- };
- class SPE_81mm_FA_Mle_1932_Smoke {
- SPE_81mm_FA_Mle_1932_Smoke = 1;
- };
- class SPE_81mm_FA_Mle_1932_Illu {
- SPE_81mm_FA_Mle_1932_Illu = 1;
- };
-};
diff --git a/addons/compat_spe/compat_spe_csw/CfgMagazineGroups.hpp b/addons/compat_spe/compat_spe_csw/CfgMagazineGroups.hpp
new file mode 100644
index 00000000000..78f6d0629dd
--- /dev/null
+++ b/addons/compat_spe/compat_spe_csw/CfgMagazineGroups.hpp
@@ -0,0 +1,94 @@
+class EGVAR(csw,groups) {
+ // --- Gun Turrets -------------------------------------------------------------
+ class SPE_50Rnd_762x63 {
+ SPE_50Rnd_762x63 = 1;
+ };
+ class SPE_100Rnd_762x63 {
+ SPE_100Rnd_762x63 = 1;
+ };
+
+ class SPE_50Rnd_762x63_M1 {
+ SPE_50Rnd_762x63_M1 = 1;
+ };
+ class SPE_100Rnd_762x63_M1 {
+ SPE_100Rnd_762x63_M1 = 1;
+ };
+
+ class SPE_50Rnd_762x63_M2_AP {
+ SPE_50Rnd_762x63_M2_AP = 1;
+ };
+ class SPE_100Rnd_762x63_M2_AP {
+ SPE_100Rnd_762x63_M2_AP = 1;
+ };
+
+ class SPE_50Rnd_762x63_Tracer {
+ SPE_50Rnd_762x63_Tracer = 1;
+ };
+ class SPE_100Rnd_762x63_Tracer {
+ SPE_100Rnd_762x63_Tracer = 1;
+ };
+
+ class SPE_50Rnd_792x57 {
+ SPE_50Rnd_792x57 = 1;
+ };
+ class SPE_100Rnd_792x57 {
+ SPE_100Rnd_792x57 = 1;
+ SPE_250Rnd_792x57 = 1;
+ };
+
+ class SPE_50Rnd_792x57_sS {
+ SPE_50Rnd_792x57_sS = 1;
+ };
+ class SPE_100Rnd_792x57_sS {
+ SPE_100Rnd_792x57_sS = 1;
+ SPE_250Rnd_792x57_sS = 1;
+ };
+
+ class SPE_50Rnd_792x57_SMK {
+ SPE_50Rnd_792x57_SMK = 1;
+ };
+ class SPE_100Rnd_792x57_SMK {
+ SPE_100Rnd_792x57_SMK = 1;
+ SPE_250Rnd_792x57_SMK = 1;
+ };
+
+ class SPE_50Rnd_792x57_Tracer {
+ SPE_50Rnd_792x57_Tracer = 1;
+ };
+ class SPE_100Rnd_792x57_Tracer {
+ SPE_100Rnd_792x57_Tracer = 1;
+ };
+
+ // Makes it compatible with other mods' .50 BMG
+ class EGVAR(csw,100Rnd_127x99_mag) {
+ SPE_100Rnd_127x99_M2 = 1;
+ };
+ class SPE_100Rnd_127x99_M2: EGVAR(csw,100Rnd_127x99_mag) {};
+
+ // --- Mortars -------------------------------------------------------------
+ class SPE_1Rnd_81mmHE_M1_M43A1 {
+ SPE_8Rnd_81mmHE_M1_M43A1 = 1;
+ SPE_1Rnd_81mmHE_M1_M43A1 = 1;
+ };
+ class SPE_1Rnd_81mmWP_M1_M57 {
+ SPE_8Rnd_81mmWP_M1_M57 = 1;
+ SPE_1Rnd_81mmWP_M1_M57 = 1;
+ };
+ class SPE_81mm_M1_M57_SmokeShell {
+ SPE_8rnd_81mm_M1_M57_SmokeShell = 1;
+ SPE_81mm_M1_M57_SmokeShell = 1;
+ };
+
+ class SPE_1Rnd_81mm_FA_Mle_1932_HE {
+ SPE_8Rnd_81mm_FA_Mle_1932_HE = 1;
+ SPE_1Rnd_81mm_FA_Mle_1932_HE = 1;
+ };
+ class SPE_81mm_FA_Mle_1932_Smoke {
+ SPE_8Rnd_81mm_FA_Mle_1932_Smoke = 1;
+ SPE_81mm_FA_Mle_1932_Smoke = 1;
+ };
+ class SPE_81mm_FA_Mle_1932_Illu {
+ SPE_8Rnd_81mm_FA_Mle_1932_Illu = 1;
+ SPE_81mm_FA_Mle_1932_Illu = 1;
+ };
+};
diff --git a/addons/compat_spe/compat_spe_csw/CfgMagazines.hpp b/addons/compat_spe/compat_spe_csw/CfgMagazines.hpp
new file mode 100644
index 00000000000..9c255c28008
--- /dev/null
+++ b/addons/compat_spe/compat_spe_csw/CfgMagazines.hpp
@@ -0,0 +1,26 @@
+// In SPE 1.1.1, the tracer magazines don't have proper names
+class CfgMagazines {
+ class SPE_50Rnd_762x63;
+ class SPE_50Rnd_762x63_Tracer: SPE_50Rnd_762x63 {
+ displayName = SUBCSTRING(50Rnd_762x63_Tracer);
+ displayNameShort = "$STR_A3_tracer_dns";
+ };
+
+ class SPE_100Rnd_762x63;
+ class SPE_100Rnd_762x63_Tracer: SPE_100Rnd_762x63 {
+ displayName = SUBCSTRING(100Rnd_762x63_Tracer);
+ displayNameShort = "$STR_A3_tracer_dns";
+ };
+
+ class SPE_50Rnd_792x57;
+ class SPE_50Rnd_792x57_Tracer: SPE_50Rnd_792x57 {
+ displayName = SUBCSTRING(50Rnd_792x57_Tracer);
+ displayNameShort = "$STR_A3_tracer_dns";
+ };
+
+ class SPE_100Rnd_792x57;
+ class SPE_100Rnd_792x57_Tracer: SPE_100Rnd_792x57 {
+ displayName = SUBCSTRING(100Rnd_792x57_Tracer);
+ displayNameShort = "$STR_A3_tracer_dns";
+ };
+};
diff --git a/addons/compat_spe/compat_spe_csw/CfgVehicles.hpp b/addons/compat_spe/compat_spe_csw/CfgVehicles.hpp
index e0a38aa341c..30d39301f38 100644
--- a/addons/compat_spe/compat_spe_csw/CfgVehicles.hpp
+++ b/addons/compat_spe/compat_spe_csw/CfgVehicles.hpp
@@ -9,90 +9,267 @@ class CfgVehicles {
class ACE_Actions {
class ACE_MainActions;
};
- class Turrets {
- class MainTurret;
+ };
+
+ // --- Gun Turrets -------------------------------------------------------------
+ class StaticMGWeapon: StaticWeapon {};
+ class SPE_StaticMGWeapon_base: StaticMGWeapon {};
+ class SPE_M2_M3: SPE_StaticMGWeapon_base {
+ class ACE_Actions: ACE_Actions {
+ class ACE_MainActions: ACE_MainActions {
+ position = "";
+ selection = "zamerny";
+ };
+ };
+ class ace_csw {
+ enabled = 1;
+ proxyWeapon = QGVAR(M2_proxy);
+ magazineLocation = "";
+ disassembleWeapon = "SPE_M2_50";
+ disassembleTurret = QGVAR(m3Tripod);
+ ammoLoadTime = 10;
+ ammoUnloadTime = 8;
+ desiredAmmo = 100;
+ };
+ };
+ class SPE_M2_M3_Trench: SPE_M2_M3 {
+ class ace_csw: ace_csw {
+ disassembleWeapon = "";
+ disassembleTurret = "";
};
- class UserActions;
};
- // --- Mortars -----------------------------------------------------------------
- class StaticMortar: StaticWeapon {
- class Turrets: Turrets {
- class MainTurret: MainTurret {};
+
+ class SPE_M1919_M2: SPE_StaticMGWeapon_base {
+ class ace_csw {
+ enabled = 1;
+ proxyWeapon = QGVAR(M1919A4_proxy);
+ magazineLocation = "_target selectionPosition ['magazine', 'FireGeometry', 'AveragePoint']";
+ disassembleWeapon = "SPE_M1919A4";
+ disassembleTurret = QGVAR(m2Tripod);
+ ammoLoadTime = 8;
+ ammoUnloadTime = 6;
+ desiredAmmo = 100;
};
};
- class SPE_StaticMortar_base: StaticMortar {
- class Turrets: Turrets {
- class MainTurret: MainTurret {};
+ class SPE_M1919_M2_Trench_Deployed: SPE_M1919_M2 {
+ class ace_csw: ace_csw {
+ disassembleWeapon = "";
+ disassembleTurret = "";
};
- class EventHandlers: EventHandlers {
- class SPE_StaticWeaponsHandler {
- init = "";
+ };
+
+
+ class SPE_MG42_Lafette: SPE_StaticMGWeapon_base {
+ class ACE_Actions: ACE_Actions {
+ class ACE_MainActions: ACE_MainActions {
+ class GVAR(alterHeight) {
+ condition = "getText (configOf _target >> 'SPE_AltHeight_Tripod_Name') != '' && {[_target, true] call SPE_WEAPONS_STATIC_fnc_can_alter_height}";
+ displayName = "$STR_SPE_DN_ASSETS_VEHICLES_ADJUST_TRIPOD_HEIGHT";
+ statement = "[_target, getText (configOf _target >> 'SPE_AltHeight_Tripod_Name'), true] call SPE_Weapons_Static_fnc_alter_height";
+ icon = "\A3\Ui_f\data\IGUI\Cfg\Actions\repair_ca.paa";
+ modifierFunction = "(_this select 3) set [1, format [localize 'STR_SPE_DN_ASSETS_VEHICLES_ADJUST_TRIPOD_HEIGHT', getText (configOf _target >> 'displayName')]]";
+ };
};
};
};
+ class SPE_MG42_Lafette_Deployed: SPE_MG42_Lafette {
+ class ace_csw {
+ enabled = 1;
+ proxyWeapon = QGVAR(MG42_proxy);
+ magazineLocation = "";
+ disassembleWeapon = "SPE_MG42";
+ disassembleTurret = QGVAR(LafetteTripod);
+ ammoLoadTime = 7;
+ ammoUnloadTime = 5;
+ desiredAmmo = 100;
+ };
+ };
+ class SPE_MG34_Lafette_Deployed: SPE_MG42_Lafette {
+ class ace_csw {
+ enabled = 1;
+ proxyWeapon = QGVAR(MG34_proxy);
+ magazineLocation = "";
+ disassembleWeapon = "SPE_MG34";
+ disassembleTurret = QGVAR(LafetteTripod);
+ ammoLoadTime = 7;
+ ammoUnloadTime = 5;
+ desiredAmmo = 100;
+ };
+ };
- class SPE_US_Mortar_base: SPE_StaticMortar_base {};
- class SPE_M1_81: SPE_US_Mortar_base {
- class Turrets: Turrets {
- class MainTurret: MainTurret {
- magazines[] = {};
+ class SPE_MG42_Lafette_low;
+ class SPE_MG42_Lafette_low_Deployed: SPE_MG42_Lafette_low {
+ class ace_csw {
+ enabled = 1;
+ proxyWeapon = QGVAR(MG42_proxy);
+ magazineLocation = "";
+ disassembleWeapon = "SPE_MG42";
+ disassembleTurret = QGVAR(LafetteTripodLow);
+ ammoLoadTime = 7;
+ ammoUnloadTime = 5;
+ desiredAmmo = 100;
+ };
+ };
+ class SPE_MG42_Lafette_trench_Deployed: SPE_MG42_Lafette_low_Deployed {
+ class ace_csw: ace_csw {
+ disassembleWeapon = "";
+ disassembleTurret = "";
+ };
+ };
+
+ class SPE_MG34_Lafette_low_Deployed: SPE_MG42_Lafette_low {
+ class ace_csw {
+ enabled = 1;
+ proxyWeapon = QGVAR(MG34_proxy);
+ magazineLocation = "";
+ disassembleWeapon = "SPE_MG34";
+ disassembleTurret = QGVAR(LafetteTripodLow);
+ ammoLoadTime = 7;
+ ammoUnloadTime = 5;
+ desiredAmmo = 100;
+ };
+ };
+ class SPE_MG34_Lafette_Trench_Deployed: SPE_MG34_Lafette_low_Deployed {
+ class ace_csw: ace_csw {
+ disassembleWeapon = "";
+ disassembleTurret = "";
+ };
+ };
+
+
+ class SPE_MG_Bipod_base;
+ class SPE_M1919A6_Bipod: SPE_MG_Bipod_base {
+ class ace_csw {
+ enabled = 1;
+ proxyWeapon = QGVAR(M1919A6_proxy);
+ magazineLocation = "";
+ disassembleWeapon = "";
+ disassembleTurret = "";
+ ammoLoadTime = 8;
+ ammoUnloadTime = 6;
+ desiredAmmo = 100;
+ };
+ };
+
+
+ class SPE_MG42_Bipod: SPE_MG_Bipod_base {
+ class ace_csw {
+ enabled = 1;
+ proxyWeapon = QGVAR(MG42_proxy);
+ magazineLocation = "";
+ disassembleWeapon = "";
+ disassembleTurret = "";
+ ammoLoadTime = 7;
+ ammoUnloadTime = 5;
+ desiredAmmo = 100;
+ };
+ };
+ class SPE_MG34_Bipod: SPE_MG_Bipod_base {
+ class ace_csw {
+ enabled = 1;
+ proxyWeapon = QGVAR(MG34_proxy);
+ magazineLocation = "";
+ disassembleWeapon = "";
+ disassembleTurret = "";
+ ammoLoadTime = 7;
+ ammoUnloadTime = 5;
+ desiredAmmo = 100;
+ };
+ };
+
+
+ class ThingX;
+ class EGVAR(csw,baseTripod): ThingX {
+ class ACE_Actions {
+ class ACE_MainActions;
+ };
+ };
+ class GVAR(m3Tripod): EGVAR(csw,baseTripod) {
+ scope = 2;
+ displayName = "$STR_DN_SPE_M3_Tripod";
+ model = "\WW2\SPE_Assets_m\Vehicles\StaticWeapons_U1_m\SPE_M3_Tripod.p3d";
+ picture = "\WW2\SPE_Assets_t\Weapons\Equipment_U1_t\Weapons\Launchers\Gear_M3_Tripod_X_ca.paa";
+ class ace_csw {
+ disassembleTo = "SPE_M3_Tripod";
+ };
+ };
+
+ class GVAR(m2Tripod): EGVAR(csw,baseTripod) {
+ scope = 2;
+ displayName = "$STR_DN_SPE_M2_Tripod";
+ model = "\WW2\SPE_Assets_m\Vehicles\StaticWeapons_m\SPE_M2_Tripod_Low.p3d";
+ picture = "\WW2\SPE_Assets_t\Weapons\Equipment_t\Weapons\Launchers\Gear_M2_Tripod_X_ca.paa";
+ class ace_csw {
+ disassembleTo = "SPE_M2_Tripod";
+ };
+ };
+
+ class GVAR(LafetteTripodLow): EGVAR(csw,baseTripod) {
+ class ACE_Actions: ACE_Actions {
+ class ACE_MainActions: ACE_MainActions {
+ class GVAR(alterHeight) {
+ condition = "getText (configOf _target >> 'SPE_AltHeight_Tripod_Name') != '' && {[_target, true] call SPE_WEAPONS_STATIC_fnc_can_alter_height}";
+ displayName = "$STR_SPE_DN_ASSETS_VEHICLES_ADJUST_TRIPOD_HEIGHT";
+ statement = "[_target, getText (configOf _target >> 'SPE_AltHeight_Tripod_Name'), true] call SPE_Weapons_Static_fnc_alter_height";
+ icon = "\A3\Ui_f\data\IGUI\Cfg\Actions\repair_ca.paa";
+ modifierFunction = "(_this select 3) set [1, format [localize 'STR_SPE_DN_ASSETS_VEHICLES_ADJUST_TRIPOD_HEIGHT', getText (configOf _target >> 'displayName')]]";
+ };
};
};
+ scope = 2;
+ displayName = "$STR_DN_SPE_Lafette_Tripod";
+ model = "\WW2\SPE_Assets_m\Vehicles\StaticWeapons_m\SPE_Lafette_Tripod_Low.p3d";
+ picture = "\WW2\SPE_Assets_t\Weapons\Equipment_t\Weapons\Launchers\Gear_Lafette_Tripod_X_ca.paa";
+ SPE_AltHeight_Tripod_Name = QGVAR(LafetteTripod);
+ class ace_csw {
+ disassembleTo = "SPE_Lafette_Tripod";
+ };
+ };
+
+ class GVAR(LafetteTripod): GVAR(LafetteTripodLow) {
+ model = "\WW2\SPE_Assets_m\Vehicles\StaticWeapons_m\SPE_Lafette_Tripod_High.p3d";
+ SPE_AltHeight_Tripod_Name = QGVAR(LafetteTripodLow);
+ class ace_csw {
+ disassembleTo = "SPE_Lafette_Tripod";
+ };
+ };
+
+ // --- Mortars -----------------------------------------------------------------
+ class StaticMortar: StaticWeapon {};
+ class SPE_StaticMortar_base: StaticMortar {};
+ class SPE_US_Mortar_base: SPE_StaticMortar_base {};
+ class SPE_M1_81: SPE_US_Mortar_base {
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
position = "";
selection = "zamerny";
};
};
- class UserActions {
- delete Prepare_WP_Selected;
- delete Prepare_WP;
- delete Prepare_Smoke_Selected;
- delete Prepare_Smoke;
- delete Prepare_HE_Selected;
- delete Prepare_HE;
- delete Reload;
- delete Unload;
- };
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
- proxyWeapon = "SPE_M1_81_proxy";
+ proxyWeapon = QGVAR(M1_proxy);
magazineLocation = "_target selectionPosition 'usti hlavne'";
disassembleWeapon = "SPE_M1_81_Barrel";
- disassembleTurret = QGVAR(M1_81_baseplate);
+ disassembleTurret = QGVAR(m1Baseplate);
ammoLoadTime = 3;
ammoUnloadTime = 3;
desiredAmmo = 1;
};
};
+
class SPE_FR_Mortar_base: SPE_StaticMortar_base {};
class SPE_MLE_27_31: SPE_FR_Mortar_base {
- class Turrets: Turrets {
- class MainTurret: MainTurret {
- magazines[] = {};
- };
- };
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
position = "";
selection = "zamerny";
};
};
- class UserActions {
- delete Prepare_Illu_Selected;
- delete Prepare_Illu;
- delete Prepare_Smoke_Selected;
- delete Prepare_Smoke;
- delete Prepare_HE_Selected;
- delete Prepare_HE;
- delete Reload;
- delete Unload;
- };
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
- proxyWeapon = "SPE_MLE_27_31_proxy";
+ proxyWeapon = QGVAR(MLE_27_31_proxy);
magazineLocation = "_target selectionPosition 'usti hlavne'";
disassembleWeapon = "SPE_MLE_27_31_Barrel";
disassembleTurret = QGVAR(MLE_27_31_baseplate);
@@ -103,30 +280,9 @@ class CfgVehicles {
};
class SPE_GrW278_1: SPE_MLE_27_31 {
- class Turrets: Turrets {
- class MainTurret: MainTurret {
- magazines[] = {};
- };
- };
- class ACE_Actions: ACE_Actions {
- class ACE_MainActions: ACE_MainActions {
- position = "";
- selection = "zamerny";
- };
- };
- class UserActions {
- delete Prepare_Illu_Selected;
- delete Prepare_Illu;
- delete Prepare_Smoke_Selected;
- delete Prepare_Smoke;
- delete Prepare_HE_Selected;
- delete Prepare_HE;
- delete Reload;
- delete Unload;
- };
- class ACE_CSW {
+ class ace_csw {
enabled = 1;
- proxyWeapon = "SPE_GrW278_1_proxy";
+ proxyWeapon = QGVAR(GrW278_1_proxy);
magazineLocation = "_target selectionPosition 'usti hlavne'";
disassembleWeapon = "SPE_GrW278_1_Barrel";
disassembleTurret = QGVAR(GrW278_baseplate);
@@ -137,7 +293,15 @@ class CfgVehicles {
};
- class EGVAR(csw,baseTripod);
+ class GVAR(m1Baseplate): EGVAR(csw,baseTripod) {
+ scope = 2;
+ displayName = "$STR_DN_SPE_M1_81_STAND";
+ model = "\WW2\SPE_Assets_m\Weapons\Mortars_m\SPE_M1_Mortar_Stand_Deployed.p3d";
+ picture = "\WW2\SPE_Assets_t\Weapons\Equipment_t\Weapons\Launchers\Gear_M1_81_Stand_X_ca.paa";
+ class ace_csw {
+ disassembleTo = "SPE_M1_81_Stand";
+ };
+ };
class GVAR(MLE_27_31_baseplate): EGVAR(csw,baseTripod) {
scope = 2;
@@ -146,7 +310,7 @@ class CfgVehicles {
picture = "\WW2\SPE_Assets_t\Weapons\Equipment_t\Weapons\Launchers\Gear_MLE_27_31_Stand_X_ca.paa";
hiddenSelections[] = {"camo_0","camo_1"};
hiddenSelectionsTextures[] = {"ww2\spe_assets_t\weapons\mortars_t\m1_mortar\Brandt_81mm_Mortar_French_co.paa","WW2\SPE_Assets_t\Weapons\Mortars_t\M1_Mortar\Brandt_81mm_Sight_French_co.paa"};
- class ACE_CSW {
+ class ace_csw {
disassembleTo = "SPE_MLE_27_31_Stand";
};
};
@@ -158,83 +322,8 @@ class CfgVehicles {
picture = "\WW2\SPE_Assets_t\Weapons\Equipment_t\Weapons\Launchers\Gear_GrW278_1_Stand_X_ca.paa";
hiddenSelections[] = {"camo_0"};
hiddenSelectionsTextures[] = {"ww2\spe_assets_t\weapons\mortars_t\m1_mortar\Brandt_81mm_Mortar_Gelb_co.paa"};
- class ACE_CSW {
+ class ace_csw {
disassembleTo = "SPE_GrW278_1_Stand";
};
};
-
- class GVAR(M1_81_baseplate): EGVAR(csw,baseTripod) {
- scope = 2;
- displayName = "$STR_DN_SPE_M1_81_STAND";
- model = "\WW2\SPE_Assets_m\Weapons\Mortars_m\SPE_M1_Mortar_Stand_Deployed.p3d";
- picture = "\WW2\SPE_Assets_t\Weapons\Equipment_t\Weapons\Launchers\Gear_M1_81_Stand_X_ca.paa";
- class ACE_CSW {
- disassembleTo = "SPE_M1_81_Stand";
- };
- };
-
-
- class ACE_SPE_M1_81_Stand_Deployed: EGVAR(csw,baseTripod) {
- author = "SPE";
- scope = 2;
- displayName = "$STR_DN_SPE_M1_81_STAND";
- model = "\WW2\SPE_Assets_m\Weapons\Mortars_m\SPE_M1_Mortar_Stand_Deployed.p3d";
- picture = "\WW2\SPE_Assets_t\Weapons\Equipment_t\Weapons\Launchers\Gear_M1_81_Stand_X_ca.paa";
- class assembleInfo {
- base = "";
- primary = 0;
- displayName = "";
- assembleTo = "";
- class SPE_M1_81_Barrel {
- deployTime = 0;
- assembleTo = "";
- };
- };
- class ACE_CSW {
- disassembleTo = "SPE_M1_81_Stand";
- };
- };
- class ACE_SPE_GrW278_1_Stand_Deployed: EGVAR(csw,baseTripod) {
- author = "SPE";
- scope = 2;
- displayName = "$STR_DN_SPE_GrW278_1_STAND";
- model = "\WW2\SPE_Assets_m\Weapons\Mortars_m\SPE_M1_Mortar_Stand_Deployed.p3d";
- picture = "\WW2\SPE_Assets_t\Weapons\Equipment_t\Weapons\Launchers\Gear_GrW278_1_Stand_X_ca.paa";
- hiddenSelectionsTextures[] = {"ww2\spe_assets_t\weapons\mortars_t\m1_mortar\Brandt_81mm_Mortar_Gelb_co.paa","WW2\SPE_Assets_t\Weapons\Mortars_t\M1_Mortar\Brandt_81mm_Sight_Gelb_co.paa"};
- class assembleInfo {
- base = "";
- primary = 0;
- displayName = "";
- assembleTo = "";
- class SPE_GrW278_1_Barrel {
- deployTime = 0;
- assembleTo = "";
- };
- };
- class ACE_CSW {
- disassembleTo = "SPE_GrW278_1_Stand";
- };
- };
- class ACE_SPE_MLE_27_31_Stand_Deployed: EGVAR(csw,baseTripod) {
- author = "SPE";
- scope = 2;
- displayName = "$STR_DN_SPE_MLE_27_31_STAND";
- model = "\WW2\SPE_Assets_m\Weapons\Mortars_m\SPE_M1_Mortar_Stand_Deployed.p3d";
- picture = "\WW2\SPE_Assets_t\Weapons\Equipment_t\Weapons\Launchers\Gear_MLE_27_31_Stand_X_ca.paa";
- hiddenSelections[] = {"camo_0","camo_1"};
- hiddenSelectionsTextures[] = {"ww2\spe_assets_t\weapons\mortars_t\m1_mortar\Brandt_81mm_Mortar_French_co.paa","WW2\SPE_Assets_t\Weapons\Mortars_t\M1_Mortar\Brandt_81mm_Sight_French_co.paa"};
- class assembleInfo {
- base = "";
- primary = 0;
- displayName = "";
- assembleTo = "";
- class SPE_MLE_27_31_Barrel {
- deployTime = 0;
- assembleTo = "";
- };
- };
- class ACE_CSW {
- disassembleTo = "SPE_MLE_27_31_Stand";
- };
- };
};
diff --git a/addons/compat_spe/compat_spe_csw/CfgWeapons.hpp b/addons/compat_spe/compat_spe_csw/CfgWeapons.hpp
index db090c77080..b6e71dcb6a9 100644
--- a/addons/compat_spe/compat_spe_csw/CfgWeapons.hpp
+++ b/addons/compat_spe/compat_spe_csw/CfgWeapons.hpp
@@ -1,43 +1,162 @@
class CfgWeapons {
- class Launcher;
- class Launcher_Base_F: Launcher {
- class WeaponSlotsInfo;
+ class Launcher_Base_F;
+ class SPE_Slung_Static_Weapon_Base: Launcher_Base_F {};
+
+ // --- Vanilla Compat -------------------------------------------------------------
+ class EGVAR(csw,staticHMGCarry): Launcher_Base_F {
+ class ace_csw {
+ class assembleTo {
+ GVAR(m3Tripod) = "B_HMG_01_F";
+ };
+ };
+ };
+ class EGVAR(csw,staticM2ShieldCarry): EGVAR(csw,staticHMGCarry) {
+ class ace_csw: ace_csw {
+ class assembleTo {
+ GVAR(m3Tripod) = "B_HMG_02_F";
+ };
+ };
};
- class SPE_Slung_Static_Weapon_Base: Launcher_Base_F {};
+ class EGVAR(csw,staticGMGCarry): Launcher_Base_F {
+ class ace_csw {
+ class assembleTo {
+ GVAR(m3Tripod) = "B_GMG_01_F";
+ };
+ };
+ };
+
+ // --- Gun Turrets -------------------------------------------------------------
+ class SPE_M2_M3_Tripod;
+ class GVAR(M2_proxy): SPE_M2_M3_Tripod {
+ magazineReloadTime = 0.5;
+ };
+ class SPE_M3_Tripod: SPE_Slung_Static_Weapon_Base {
+ class ace_csw {
+ type = "mount";
+ deployTime = 4;
+ pickupTime = 4;
+ deploy = QGVAR(m3Tripod);
+ };
+ };
+ class SPE_M2_50: SPE_Slung_Static_Weapon_Base {
+ class ace_csw {
+ type = "weapon";
+ deployTime = 4;
+ pickupTime = 4;
+ class assembleTo {
+ GVAR(m3Tripod) = "SPE_M2_M3";
+ EGVAR(csw,m3TripodLow) = "SPE_M2_M3";
+ };
+ };
+ };
+
+ class SPE_M1919A4_tripod;
+ class GVAR(M1919A4_proxy): SPE_M1919A4_tripod {
+ magazineReloadTime = 0.5;
+ };
+
+ class SPE_M2_Tripod: SPE_Slung_Static_Weapon_Base {
+ class ace_csw {
+ type = "mount";
+ deployTime = 4;
+ pickupTime = 4;
+ deploy = QGVAR(m2Tripod);
+ };
+ };
+
+ class SPE_LMG;
+ class SPE_M1919A4: SPE_LMG {
+ class ace_csw {
+ type = "weapon";
+ deployTime = 4;
+ pickupTime = 4;
+ class assembleTo {
+ GVAR(m2Tripod) = "SPE_M1919_M2";
+ };
+ };
+ };
+
+ class SPE_M1919A6_StaticBipod;
+ class GVAR(M1919A6_proxy): SPE_M1919A6_StaticBipod {
+ magazineReloadTime = 0.5;
+ };
+
+ class SPE_MG42_Tripod;
+ class GVAR(MG42_proxy): SPE_MG42_Tripod {
+ magazineReloadTime = 0.5;
+ };
+
+ class SPE_MG34_Tripod;
+ class GVAR(MG34_proxy): SPE_MG34_Tripod {
+ magazineReloadTime = 0.5;
+ };
+
+ class SPE_Lafette_Tripod: SPE_Slung_Static_Weapon_Base {
+ class ace_csw {
+ type = "mount";
+ deployTime = 4;
+ pickupTime = 4;
+ deploy = QGVAR(LafetteTripodLow);
+ };
+ };
+ class SPE_MG42: SPE_LMG {
+ class ace_csw {
+ type = "weapon";
+ deployTime = 4;
+ pickupTime = 4;
+ class assembleTo {
+ GVAR(LafetteTripodLow) = "SPE_MG42_Lafette_low_Deployed";
+ GVAR(LafetteTripod) = "SPE_MG42_Lafette_Deployed";
+ };
+ };
+ };
+ class SPE_MG34: SPE_LMG {
+ class ace_csw {
+ type = "weapon";
+ deployTime = 4;
+ pickupTime = 4;
+ class assembleTo {
+ GVAR(LafetteTripodLow) = "SPE_MG34_Lafette_low_Deployed";
+ GVAR(LafetteTripod) = "SPE_MG34_Lafette_Deployed";
+ };
+ };
+ };
+
+ // --- Mortars -----------------------------------------------------------------
class SPE_M1_81;
- class SPE_M1_81_proxy: SPE_M1_81 {
+ class GVAR(M1_proxy): SPE_M1_81 {
magazineReloadTime = 0.5;
};
class SPE_M1_81_Stand: SPE_Slung_Static_Weapon_Base {
- class ACE_CSW {
+ class ace_csw {
type = "mount";
deployTime = 4;
pickupTime = 4;
- deploy = QGVAR(M1_81_baseplate);
+ deploy = QGVAR(m1Baseplate);
};
};
class SPE_M1_81_Barrel: SPE_Slung_Static_Weapon_Base {
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
- deployTime = 4;
- pickupTime = 4;
+ deployTime = 20;
+ pickupTime = 25;
class assembleTo {
- GVAR(M1_81_baseplate) = "SPE_M1_81";
+ GVAR(m1Baseplate) = "SPE_M1_81";
EGVAR(csw,mortarBaseplate) = "SPE_M1_81";
};
};
};
class SPE_MLE_27_31;
- class SPE_MLE_27_31_proxy: SPE_MLE_27_31 {
+ class GVAR(MLE_27_31_proxy): SPE_MLE_27_31 {
magazineReloadTime = 0.5;
};
class SPE_MLE_27_31_Stand: SPE_Slung_Static_Weapon_Base {
- class ACE_CSW {
+ class ace_csw {
type = "mount";
deployTime = 4;
pickupTime = 4;
@@ -45,7 +164,7 @@ class CfgWeapons {
};
};
class SPE_MLE_27_31_Barrel: SPE_Slung_Static_Weapon_Base {
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 20;
pickupTime = 25;
@@ -57,21 +176,20 @@ class CfgWeapons {
};
class SPE_GrW278_1;
- class SPE_GrW278_1_proxy: SPE_GrW278_1 {
+ class GVAR(GrW278_1_proxy): SPE_GrW278_1 {
magazineReloadTime = 0.5;
};
class SPE_GrW278_1_Stand: SPE_MLE_27_31_Stand {
- class ACE_CSW {
+ class ace_csw {
type = "mount";
deployTime = 4;
pickupTime = 4;
deploy = QGVAR(GrW278_baseplate);
};
};
-
class SPE_GrW278_1_Barrel: SPE_MLE_27_31_Barrel {
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 20;
pickupTime = 25;
diff --git a/addons/compat_spe/compat_spe_csw/config.cpp b/addons/compat_spe/compat_spe_csw/config.cpp
index 6ff669629bf..05627a8f6db 100644
--- a/addons/compat_spe/compat_spe_csw/config.cpp
+++ b/addons/compat_spe/compat_spe_csw/config.cpp
@@ -23,7 +23,22 @@ class CfgPatches {
};
};
-#include "ACE_CSW_Groups.hpp"
-// Todo: https://github.com/acemod/ACE3/pull/9292#discussion_r1327738181
-// #include "CfgVehicles.hpp"
-// #include "CfgWeapons.hpp"
+#include "CfgMagazines.hpp"
+#include "CfgMagazineGroups.hpp"
+#include "CfgVehicles.hpp"
+#include "CfgWeapons.hpp"
+
+class CfgFunctions {
+ class SPE_WEAPONS_STATIC {
+ class SPE_Weapons_Static {
+ OVERWRITE_FUNC(alter_height);
+ OVERWRITE_FUNC(can_alter_height);
+ OVERWRITE_FUNC(can_assemble_weapon);
+ OVERWRITE_FUNC(can_disassemble_weapon);
+ OVERWRITE_FUNC(can_prepare_ammo);
+ OVERWRITE_FUNC(can_Reload);
+ OVERWRITE_FUNC(can_resupply_ammo);
+ OVERWRITE_FUNC(can_unload_ammo);
+ };
+ };
+};
diff --git a/addons/compat_spe/compat_spe_csw/functions/fnc_alter_height.sqf b/addons/compat_spe/compat_spe_csw/functions/fnc_alter_height.sqf
new file mode 100644
index 00000000000..0179c881537
--- /dev/null
+++ b/addons/compat_spe/compat_spe_csw/functions/fnc_alter_height.sqf
@@ -0,0 +1,107 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Kerc (SPE), original by www.3commandobrigade.com, edited by johnb43 to be made CSW compatible
+ * Alters the static weapon's height.
+ *
+ * Arguments:
+ * 0: Static Weapon
+ * 1: New static weapon (i.e. the weapon to replace the current weapon)
+ * 2: Use ACE's progress bar (default: false)
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * cursorObject call SPE_Weapons_Static_fnc_can_alter_height
+ *
+ * Public: No
+ */
+
+private _unit = call SPE_fnc_findPlayer;
+
+if !(alive _unit) exitWith {};
+
+params ["_weaponPlatform", "_newStaticWeapon", ["_playProgressBar", false, [false]]];
+
+if (_playProgressBar) exitWith {
+ [10 * EGVAR(csw,progressBarTimeCoefficent), [_weaponPlatform, _newStaticWeapon], {
+ (_this select 0) params ["_weaponPlatform", "_newStaticWeapon"];
+
+ [_weaponPlatform, _newStaticWeapon] call SPE_Weapons_Static_fnc_alter_height;
+ }, {}, LSUBLSTRING(alteringHeight), {
+ //IGNORE_PRIVATE_WARNING ["_player"];
+ (_this select 0) params ["_weaponPlatform"];
+
+ _player distance _weaponPlatform <= 4 && {[_weaponPlatform, true] call SPE_Weapons_Static_fnc_can_alter_height}
+ }] call EFUNC(common,progressBar);
+};
+
+private _dir = vectorDir _weaponPlatform;
+private _pos = (getPosATL _weaponPlatform) vectorAdd [0, 0, 0.1]; // 10 cm above terrain surface
+
+// Save state
+private _magazines = magazinesAmmoFull _weaponPlatform;
+private _assemblyModeIndex = _weaponPlatform getVariable QEGVAR(csw,assemblyMode);
+
+// Delete weapon and create new one
+deleteVehicle _weaponPlatform;
+
+[{
+ params ["_unit", "_newStaticWeapon", "_magazines", "_pos", "_dir", "_assemblyModeIndex"];
+
+ private _weaponPlatform = createVehicle [_newStaticWeapon, _pos, [], 0, "CAN_COLLIDE"];
+
+ if (!isNil "_assemblyModeIndex") then {
+ // Don't empty the weapon of its existing mags
+ _weaponPlatform setVariable [QEGVAR(csw,assemblyMode), 0, true];
+
+ if (_assemblyModeIndex == 0) exitWith {};
+
+ // Reset variable to original after initVehicle has run
+ [{
+ (_this select 0) setVariable [QEGVAR(csw,assemblyMode), _this select 1, true];
+ }, [_weaponPlatform, _assemblyModeIndex], 1.5] call CBA_fnc_waitAndExecute;
+ };
+
+ _weaponPlatform disableCollisionWith _unit;
+ _weaponPlatform setVectorDir _dir;
+
+ [{
+ _this remoteExecCall ["enableCollisionWith", _this];
+ }, [_weaponPlatform, _unit], 0.5] call CBA_fnc_waitAndExecute;
+
+ // Restore state
+ // First remove magazines that were spawned in with new weapon
+ {
+ _weaponPlatform removeMagazineTurret [_x, [0]];
+ } forEach (_weaponPlatform magazinesTurret [0]);
+
+ // Remove weapon temporarily and readd it to instantly load previous magazine
+ private _weapon = (_weaponPlatform weaponsTurret [0]) param [0, ""];
+
+ if (_weapon != "") then {
+ _weaponPlatform removeWeaponTurret [_weapon, [0]];
+ };
+
+ if (_magazines isEqualTo []) exitWith {};
+
+ // Find loaded magazine
+ private _loadedIndex = _magazines findIf {_x select 2};
+
+ // If there was a loaded magazine, add that one first
+ if (_loadedIndex != -1) then {
+ (_magazines deleteAt _loadedIndex) params ["_magClass", "_ammoCount"];
+ _weaponPlatform addMagazineTurret [_magClass, [0], _ammoCount];
+ };
+
+ _weaponPlatform addWeaponTurret [_weapon, [0]];
+
+ {
+ _x params ["_magClass", "_ammoCount", "_loaded"];
+
+ // In some instances the loaded magazine is listed twice, so we skip it.
+ if (!_loaded) then {
+ _weaponPlatform addMagazineTurret [_magClass, [0], _ammoCount];
+ };
+ } forEach _magazines;
+}, [_unit, _newStaticWeapon, _magazines, _pos, _dir, _assemblyModeIndex]] call CBA_fnc_execNextFrame;
diff --git a/addons/compat_spe/compat_spe_csw/functions/fnc_can_Reload.sqf b/addons/compat_spe/compat_spe_csw/functions/fnc_can_Reload.sqf
new file mode 100644
index 00000000000..c8a666753a1
--- /dev/null
+++ b/addons/compat_spe/compat_spe_csw/functions/fnc_can_Reload.sqf
@@ -0,0 +1,42 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Kerc (SPE), edited by johnb43 to be made CSW compatible
+ * Checks if the prepped magazine for the static weapon can be loaded.
+ *
+ * Arguments:
+ * 0: Static Weapon
+ * 1: Default magazine to load (unused) (default: "")
+ *
+ * Return Value:
+ * If the player can load the selected ammo for the static weapon's
+ *
+ * Example:
+ * cursorObject call SPE_Weapons_Static_fnc_can_Reload
+ *
+ * Public: No
+ */
+
+params ["_weaponPlatform"];
+
+private _unit = call SPE_fnc_findPlayer;
+
+alive _unit &&
+{alive _weaponPlatform} &&
+{vehicle _unit in [_unit, _weaponPlatform]} &&
+{(magazines _weaponPlatform) isEqualTo []} &&
+{
+ private _selectedMagazine = _unit getVariable ["SPE_Static_Weapon_Magazine", ""];
+
+ if (_selectedMagazine == "") exitWith {
+ false
+ };
+
+ _selectedMagazine = _selectedMagazine call EFUNC(common,getConfigName);
+
+ if (_selectedMagazine == "") exitWith {
+ false
+ };
+
+ _selectedMagazine in compatibleMagazines ((_weaponPlatform weaponsTurret [0]) select 0)
+} &&
+{CONDITION_NO_CSW(_weaponPlatform)} // CSW check
diff --git a/addons/compat_spe/compat_spe_csw/functions/fnc_can_alter_height.sqf b/addons/compat_spe/compat_spe_csw/functions/fnc_can_alter_height.sqf
new file mode 100644
index 00000000000..7c3f8c1f84b
--- /dev/null
+++ b/addons/compat_spe/compat_spe_csw/functions/fnc_can_alter_height.sqf
@@ -0,0 +1,31 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Kerc (SPE), original by www.3commandobrigade.com, edited by johnb43 to be made CSW compatible
+ * Checks if the static weapon's height can be adjusted.
+ *
+ * Arguments:
+ * 0: Static Weapon
+ * 1: Check for ACE CSW (default: false)
+ *
+ * Return Value:
+ * If the player can alter the static weapon's height
+ *
+ * Example:
+ * cursorObject call SPE_Weapons_Static_fnc_can_alter_height
+ *
+ * Public: No
+ */
+
+params ["_weaponPlatform", ["_checkForCSW", false, [false]]];
+
+private _unit = call SPE_fnc_findPlayer;
+
+alive _unit &&
+{alive _weaponPlatform} &&
+{isNull objectParent _unit} &&
+{crew _weaponPlatform isEqualTo []} &&
+{!(_weaponPlatform lockedTurret [0])} && {
+ // CSW check
+ (!_checkForCSW && {CONDITION_NO_CSW(_weaponPlatform)}) ||
+ {_checkForCSW && {!(CONDITION_NO_CSW(_weaponPlatform))}}
+}
diff --git a/addons/compat_spe/compat_spe_csw/functions/fnc_can_assemble_weapon.sqf b/addons/compat_spe/compat_spe_csw/functions/fnc_can_assemble_weapon.sqf
new file mode 100644
index 00000000000..60911d49fe1
--- /dev/null
+++ b/addons/compat_spe/compat_spe_csw/functions/fnc_can_assemble_weapon.sqf
@@ -0,0 +1,27 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Kerc (SPE), original by www.3commandobrigade.com, edited by johnb43 to be made CSW compatible
+ * Determines whether the player can assemble the static weapon.
+ *
+ * Arguments:
+ * 0: Tripod
+ * 1: Weapon
+ *
+ * Return Value:
+ * If the player can assemble the static weapon
+ *
+ * Example:
+ * cursorObject call SPE_Weapons_Static_fnc_can_assemble_weapon
+ *
+ * Public: No
+ */
+
+params ["_tripod", "_weaponComponent"];
+
+private _unit = call SPE_fnc_findPlayer;
+
+alive _unit &&
+{alive _tripod} &&
+{isNull objectParent _unit} &&
+{_weaponComponent in (weapons _unit)} &&
+{CONDITION_NO_CSW(_tripod)} // CSW check
diff --git a/addons/compat_spe/compat_spe_csw/functions/fnc_can_disassemble_weapon.sqf b/addons/compat_spe/compat_spe_csw/functions/fnc_can_disassemble_weapon.sqf
new file mode 100644
index 00000000000..66a54829537
--- /dev/null
+++ b/addons/compat_spe/compat_spe_csw/functions/fnc_can_disassemble_weapon.sqf
@@ -0,0 +1,29 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Kerc (SPE), original by www.3commandobrigade.com, edited by johnb43 to be made CSW compatible
+ * Checks if the static weapon can be disassembled.
+ *
+ * Arguments:
+ * 0: Static Weapon
+ *
+ * Return Value:
+ * If the player can disassemble the static weapon
+ *
+ * Example:
+ * cursorObject call SPE_Weapons_Static_fnc_can_Reload
+ *
+ * Public: No
+ */
+
+params ["_weaponPlatform"];
+
+private _unit = call SPE_fnc_findPlayer;
+
+alive _unit &&
+{alive _weaponPlatform} &&
+{isNull objectParent _unit} &&
+{crew _weaponPlatform isEqualTo []} &&
+{weaponDisassemblyEnabled _unit} &&
+{weaponDisassemblyEnabled _weaponPlatform} &&
+{!(_weaponPlatform lockedTurret [0])} &&
+{CONDITION_NO_CSW(_weaponPlatform)} // CSW check
diff --git a/addons/compat_spe/compat_spe_csw/functions/fnc_can_prepare_ammo.sqf b/addons/compat_spe/compat_spe_csw/functions/fnc_can_prepare_ammo.sqf
new file mode 100644
index 00000000000..e310b2a63cb
--- /dev/null
+++ b/addons/compat_spe/compat_spe_csw/functions/fnc_can_prepare_ammo.sqf
@@ -0,0 +1,38 @@
+#include "..\script_component.hpp"
+/*
+ * Author: ? (SPE), edited by johnb43 to be made CSW compatible
+ * Checks if the player can prepare the static weapon's ammo.
+ *
+ * Arguments:
+ * 0: Static Weapon
+ * 1: Magazine to load
+ * 2: If the magazine has been selected to be prepped for loading (default: false)
+ *
+ * Return Value:
+ * If the player can prepare the static weapon's ammo
+ *
+ * Example:
+ * cursorObject call SPE_Weapons_Static_fnc_can_prepare_ammo
+ *
+ * Public: No
+ */
+
+params ["_weaponPlatform", "_ammo", ["_isSelected", false]];
+
+private _unit = call SPE_fnc_findPlayer;
+
+alive _unit &&
+{alive _weaponPlatform} &&
+{vehicle _unit in [_unit, _weaponPlatform]} &&
+{
+ private _defaultMags = getArray (configOf _weaponPlatform >> "Turrets" >> "MainTurret" >> "magazines");
+
+ if (({_x in _defaultMags} count (magazines _weaponPlatform)) > 1) exitWith {
+ false
+ };
+
+ private _selectedMagazine = _unit getVariable ["SPE_Static_Weapon_Magazine", ""];
+
+ _isSelected == (_selectedMagazine == _ammo)
+} &&
+{CONDITION_NO_CSW(_weaponPlatform)} // CSW check
diff --git a/addons/compat_spe/compat_spe_csw/functions/fnc_can_resupply_ammo.sqf b/addons/compat_spe/compat_spe_csw/functions/fnc_can_resupply_ammo.sqf
new file mode 100644
index 00000000000..283c11d98d9
--- /dev/null
+++ b/addons/compat_spe/compat_spe_csw/functions/fnc_can_resupply_ammo.sqf
@@ -0,0 +1,27 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Kerc (SPE), original by www.3commandobrigade.com, edited by johnb43 to be made CSW compatible
+ * Checks if resupply of ammo to a static weapon is available.
+ *
+ * Arguments:
+ * 0: Static Weapon
+ * 1: Default magazine to load (unused) (default: "")
+ *
+ * Return Value:
+ * If the player can load the static weapon's ammo
+ *
+ * Example:
+ * cursorObject call SPE_Weapons_Static_fnc_can_resupply_ammo
+ *
+ * Public: No
+ */
+
+params ["_weaponPlatform"];
+
+private _unit = call SPE_fnc_findPlayer;
+
+alive _unit &&
+{alive _weaponPlatform} &&
+{vehicle _unit in [_unit, _weaponPlatform]} &&
+{(_weaponPlatform magazinesTurret [[0], false]) isEqualTo []} && // Limit the reload capacity of a static weapon to 1 magazines
+{CONDITION_NO_CSW(_weaponPlatform)} // CSW check
diff --git a/addons/compat_spe/compat_spe_csw/functions/fnc_can_unload_ammo.sqf b/addons/compat_spe/compat_spe_csw/functions/fnc_can_unload_ammo.sqf
new file mode 100644
index 00000000000..23384d29733
--- /dev/null
+++ b/addons/compat_spe/compat_spe_csw/functions/fnc_can_unload_ammo.sqf
@@ -0,0 +1,27 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Kerc (SPE), original by www.3commandobrigade.com, edited by johnb43 to be made CSW compatible
+ * Checks if the player can unload a static weapon's magazines.
+ *
+ * Arguments:
+ * 0: Static Weapon
+ *
+ * Return Value:
+ * If the player can unload the static weapon's ammo
+ *
+ * Example:
+ * cursorObject call SPE_Weapons_Static_fnc_can_unload_ammo
+ *
+ * Public: No
+ */
+
+params ["_weaponPlatform"];
+
+private _unit = call SPE_fnc_findPlayer;
+
+alive _unit &&
+{alive _weaponPlatform} &&
+{_unit in _weaponPlatform || {isNull objectParent _unit && {(crew _weaponPlatform) isEqualTo []}}} &&
+{!(_weaponPlatform lockedTurret [0])} &&
+{(_weaponPlatform magazinesTurret [[0], false]) isNotEqualTo []} &&
+{CONDITION_NO_CSW(_weaponPlatform)} // CSW check
diff --git a/addons/compat_spe/compat_spe_csw/script_component.hpp b/addons/compat_spe/compat_spe_csw/script_component.hpp
index 1f7ace46a9e..8803d6fd261 100644
--- a/addons/compat_spe/compat_spe_csw/script_component.hpp
+++ b/addons/compat_spe/compat_spe_csw/script_component.hpp
@@ -1,3 +1,10 @@
#define SUBCOMPONENT csw
#define SUBCOMPONENT_BEAUTIFIED Crew-Served Weapons
#include "..\script_component.hpp"
+
+#define CONDITION_NO_CSW(var) (EGVAR(csw,ammoHandling) == 0) && {!([false, true, true, EGVAR(csw,defaultAssemblyMode)] select (var getVariable [ARR_2('EGVAR(csw,assemblyMode)',3)]))}
+
+#define OVERWRITE_FUNC(funcName)\
+class funcName {\
+ file = QPATHTOF(DOUBLES(COMPONENT,SUBCOMPONENT)\functions\DOUBLES(fnc,funcName).sqf);\
+}
diff --git a/addons/compat_spe/compat_spe_csw/stringtable.xml b/addons/compat_spe/compat_spe_csw/stringtable.xml
new file mode 100644
index 00000000000..aa1476d330e
--- /dev/null
+++ b/addons/compat_spe/compat_spe_csw/stringtable.xml
@@ -0,0 +1,30 @@
+
+
+
+
+ Altering Height...
+ 높이 변경 중...
+ 高さを変更・・・
+
+
+ .30-06 50Rnd Belt (M2/Tracer)
+ .30-06구경 스프링필드 50발 들이 벨트 (M2 훈련용/예광탄)
+ .30-06 50Rnd Belt (M2/Tracer)
+
+
+ .30-06 100Rnd Belt (M2/Tracer)
+ .30-06구경 스프링필드 100발 들이 벨트 (M2 훈련용/예광탄)
+ .30-06 100Rnd Belt (M2/Tracer)
+
+
+ 7.92x57 50Rnd Gurttrommel (L.S./Tracer)
+ 7.92x57mm 50발 들이 벨트 (L.S. 훈련용/예광탄)
+ 7.92x57 50Rnd Gurttrommel (L.S./Tracer)
+
+
+ 7.92x57 100Rnd Belt (L.S./Tracer)
+ 7.92x57mm 100발 들이 벨트 (L.S. 훈련용/예광탄)
+ 7.92x57 100Rnd Belt (L.S./Tracer)
+
+
+
diff --git a/addons/compat_spe/compat_spe_explosives/CfgMagazines.hpp b/addons/compat_spe/compat_spe_explosives/CfgMagazines.hpp
index 7c1945fcb8f..810a5bc5bf1 100644
--- a/addons/compat_spe/compat_spe_explosives/CfgMagazines.hpp
+++ b/addons/compat_spe/compat_spe_explosives/CfgMagazines.hpp
@@ -1,9 +1,8 @@
class CfgMagazines {
class SPE_Mine_Magazine;
class SPE_US_TNT_4pound_mag: SPE_Mine_Magazine {
- EGVAR(explosives,DelayTime) = 1;
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(4LBTNT);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(4LBTNT);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "FireCord", "LIB_LadungPM"};
@@ -19,9 +18,8 @@ class CfgMagazines {
};
class SPE_US_TNT_half_pound_mag: SPE_Mine_Magazine {
- EGVAR(explosives,DelayTime) = 1;
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(halfLBTNT);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(halfLBTNT);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "FireCord", "LIB_LadungPM"};
@@ -37,9 +35,8 @@ class CfgMagazines {
};
class SPE_US_Bangalore_mag: SPE_Mine_Magazine {
- EGVAR(explosives,DelayTime) = 1;
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(bangalore);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(bangalore);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "FireCord", "LIB_LadungPM"};
@@ -55,9 +52,8 @@ class CfgMagazines {
};
class SPE_Ladung_Small_MINE_mag: SPE_Mine_Magazine {
- EGVAR(explosives,DelayTime) = 1;
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(smallLadung);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(smallLadung);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "FireCord", "LIB_LadungPM"};
@@ -73,9 +69,8 @@ class CfgMagazines {
};
class SPE_Ladung_Big_MINE_mag: SPE_Mine_Magazine {
- EGVAR(explosives,DelayTime) = 1;
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(bigLadung);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(bigLadung);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "FireCord", "LIB_LadungPM"};
@@ -91,8 +86,8 @@ class CfgMagazines {
};
class SPE_US_M1A1_ATMINE_mag: SPE_Mine_Magazine {
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(M1A1at);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(M1A1at);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -102,8 +97,8 @@ class CfgMagazines {
};
};
class SPE_US_M3_MINE_mag: SPE_Mine_Magazine {
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(M3ap);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(M3ap);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
@@ -113,8 +108,8 @@ class CfgMagazines {
};
};
class SPE_US_M3_Pressure_MINE_mag: SPE_Mine_Magazine {
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(M3Pressure);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(M3Pressure);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -125,8 +120,8 @@ class CfgMagazines {
};
class SPE_Shg24x7_Improvised_Mine_mag: SPE_Mine_Magazine {
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(Shg24x7);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(Shg24x7);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -137,8 +132,8 @@ class CfgMagazines {
};
class SPE_TMI_42_MINE_mag: SPE_Mine_Magazine {
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(TMI42);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(TMI42);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -149,8 +144,8 @@ class CfgMagazines {
};
class SPE_SMI_35_1_MINE_mag: SPE_Mine_Magazine {
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(SMI35_1);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(SMI35_1);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
@@ -161,8 +156,8 @@ class CfgMagazines {
};
class SPE_SMI_35_MINE_mag: SPE_Mine_Magazine {
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(SMI35);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(SMI35);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
@@ -173,8 +168,8 @@ class CfgMagazines {
};
class SPE_SMI_35_Pressure_MINE_mag: SPE_Mine_Magazine {
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(SMI35Pressure);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(SMI35Pressure);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@@ -185,8 +180,8 @@ class CfgMagazines {
};
class SPE_STMI_MINE_mag: SPE_Mine_Magazine {
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(STMI);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(STMI);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
@@ -197,8 +192,8 @@ class CfgMagazines {
};
class SPE_shumine_42_MINE_mag: SPE_Mine_Magazine {
- EGVAR(explosives,Placeable) = 1;
- EGVAR(explosives,SetupObject) = QEXPLOSIVES_PLACE(shumine42);
+ EGVAR(explosives,placeable) = 1;
+ EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(shumine42);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
diff --git a/addons/compat_spe/compat_spe_explosives/CfgVehicles.hpp b/addons/compat_spe/compat_spe_explosives/CfgVehicles.hpp
index d4d5737bb23..9137a9b802b 100644
--- a/addons/compat_spe/compat_spe_explosives/CfgVehicles.hpp
+++ b/addons/compat_spe/compat_spe_explosives/CfgVehicles.hpp
@@ -8,7 +8,7 @@ class CfgVehicles {
// 4 Pound TNT Charge
class EXPLOSIVES_PLACE(4LBTNT): EGVAR(explosives,Place) {
- displayName = "4 Pound TNT Charge";
+ displayName = "$STR_DN_SPE_US_TNT_4POUND";
model = "\WW2\SPE_Assets_m\Weapons\Mines_m\SPE_TNT_4pound";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -19,7 +19,7 @@ class CfgVehicles {
// Half Pound TNT Charge
class EXPLOSIVES_PLACE(halfLBTNT): EGVAR(explosives,Place) {
- displayName = "Half Pound TNT Charge";
+ displayName = "$STR_DN_SPE_US_TNT_HALF_POUND";
model = "\WW2\SPE_Assets_m\Weapons\Mines_m\SPE_TNT_Half_Pound";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -30,7 +30,7 @@ class CfgVehicles {
// M1A1 Bangalore Torpedo
class EXPLOSIVES_PLACE(bangalore): EGVAR(explosives,Place) {
- displayName = "M1A1 Bangalore Torpedo";
+ displayName = "$STR_DN_SPE_US_BANGALORE";
model = "\WW2\SPE_Assets_m\Weapons\Mines_m\SPE_Bangalore";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -41,7 +41,7 @@ class CfgVehicles {
// 1 Kg Charge
class EXPLOSIVES_PLACE(smallLadung): EGVAR(explosives,Place) {
- displayName = "1 Kg Charge";
+ displayName = "$STR_SPE_Ladung_Small";
model = "\WW2\SPE_Assets_m\Weapons\Mines_m\SPE_Ladung";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -52,7 +52,7 @@ class CfgVehicles {
// 3 Kg Charge
class EXPLOSIVES_PLACE(bigLadung): EGVAR(explosives,Place) {
- displayName = "3 Kg Charge";
+ displayName = "$STR_SPE_Ladung_Big";
model = "\WW2\SPE_Assets_m\Weapons\Mines_m\SPE_Ladung_Big";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -63,7 +63,7 @@ class CfgVehicles {
// M1A1 AT Mine
class EXPLOSIVES_PLACE(M1A1at): EGVAR(explosives,Place) {
- displayName = "M1A1 AT Mine";
+ displayName = "$STR_DN_SPE_US_M1A1_ATMINE";
model = "\WW2\SPE_Assets_m\Weapons\Mines_m\SPE_M1A1_AT";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -72,9 +72,9 @@ class CfgVehicles {
};
};
- // M1A1 AT Mine
+ // Shg24x7 Improvised AT Mine
class EXPLOSIVES_PLACE(Shg24x7): EGVAR(explosives,Place) {
- displayName = "M1A1 AT Mine";
+ displayName = "$STR_SPE_Shg24x7_Improvised_Mine";
model = "\WW2\SPE_Assets_m\Weapons\Mines_m\SPE_GER_Improvised_Mine";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -83,9 +83,9 @@ class CfgVehicles {
};
};
- // M1A1 AT Mine
+ // TMI-42 AT Mine
class EXPLOSIVES_PLACE(TMI42): EGVAR(explosives,Place) {
- displayName = "M1A1 AT Mine";
+ displayName = "$STR_SPE_TMI_42";
model = "\WW2\SPE_Assets_m\Weapons\Mines_m\SPE_Tmi42";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -96,7 +96,7 @@ class CfgVehicles {
// M3 AP Tripwire Mine
class EXPLOSIVES_PLACE(M3ap): EGVAR(explosives,Place) {
- displayName = "M3 AP Tripwire Mine";
+ displayName = "$STR_DN_SPE_US_M3";
model = "\WW2\SPE_Assets_m\Weapons\Mines_m\SPE_M3_AP";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -107,7 +107,7 @@ class CfgVehicles {
// M3 AP Mine
class EXPLOSIVES_PLACE(M3Pressure): EGVAR(explosives,Place) {
- displayName = "M3 AP Mine";
+ displayName = "$STR_DN_SPE_US_M3_Pressure";
model = "\WW2\SPE_Assets_m\Weapons\Mines_m\SPE_M3_AP_Pressure";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -118,7 +118,7 @@ class CfgVehicles {
// SMi-35 AP Mine
class EXPLOSIVES_PLACE(SMI35Pressure): EGVAR(explosives,Place) {
- displayName = "SMi-35 AP Mine";
+ displayName = "$STR_SPE_SMI_35_Pressure";
model = "\WW2\SPE_Assets_m\Weapons\Mines_m\SPE_Smi35";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -129,7 +129,7 @@ class CfgVehicles {
// SMi-35 Tripwire Mine
class EXPLOSIVES_PLACE(SMI35): EGVAR(explosives,Place) {
- displayName = "SMi-35 Tripwire Mine";
+ displayName = "$STR_SPE_SMI_35";
model = "\WW2\SPE_Assets_m\Weapons\Mines_m\SPE_Smi35_1";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -140,7 +140,7 @@ class CfgVehicles {
// SMi-35 Tripwire (x2) Mine
class EXPLOSIVES_PLACE(SMI35_1): EGVAR(explosives,Place) {
- displayName = "SMi-35 Tripwire (x2) Mine";
+ displayName = "$STR_SPE_SMI_35_1";
model = "\WW2\SPE_Assets_m\Weapons\Mines_m\SPE_Smi35_2";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -151,7 +151,7 @@ class CfgVehicles {
// StMi Mine
class EXPLOSIVES_PLACE(STMI): EGVAR(explosives,Place) {
- displayName = "StMi Mine";
+ displayName = "$STR_SPE_STMI";
model = "\WW2\SPE_Assets_m\Weapons\Mines_m\SPE_Stmi";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -162,7 +162,7 @@ class CfgVehicles {
// Schuetzenmine 42
class EXPLOSIVES_PLACE(shumine42): EGVAR(explosives,Place) {
- displayName = "Schuetzenmine 42";
+ displayName = "$STR_SPE_shumine42";
model = "\WW2\SPE_Assets_m\Weapons\Mines_m\SPE_Shumine42";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
diff --git a/addons/compat_spe/compat_spe_refuel/CfgVehicles.hpp b/addons/compat_spe/compat_spe_refuel/CfgVehicles.hpp
index fc1ebc9b4e0..8819f205590 100644
--- a/addons/compat_spe/compat_spe_refuel/CfgVehicles.hpp
+++ b/addons/compat_spe/compat_spe_refuel/CfgVehicles.hpp
@@ -1,12 +1,57 @@
class CfgVehicles {
- class SPE_Halftrack_base;
- class SPE_US_M3_Halftrack_Fuel: SPE_Halftrack_base {
- EGVAR(refuel,hooks)[] = {{-0.23,-2.58,-0.59}};
- EGVAR(refuel,fuelCargo) = 2000;
- };
- class SPE_OpelBlitz_base;
- class SPE_OpelBlitz_Fuel: SPE_OpelBlitz_base {
- EGVAR(refuel,hooks)[] = {{-0.23,-2.58,-0.59}};
- EGVAR(refuel,fuelCargo) = 2000;
+ // Vehicle animation interactions
+ class SPE_Car_base;
+ class SPE_G503_MB_base: SPE_Car_base {
+ class EGVAR(interaction,anims) {
+ class hide_jerry_can_source {
+ positions[] = {"_target selectionPosition ['hide_jerry_can', 'ViewGeometry', 'AveragePoint']"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+
+ class SPE_Truck_base;
+ class SPE_CCKW_353_Base: SPE_Truck_base {
+ class EGVAR(interaction,anims) {
+ class spare_fuel_hide_source {
+ positions[] = {{0.8, 1.8, -1}, {-0.8, 1.8, -1}, {0.8, 3.5, -1}, {-0.8, 3.5, -1}};
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ name = ECSTRING(refuel,TakeFuelCanister);
+ text = ECSTRING(refuel,TakeFuelCanisterAction);
+ };
+ };
+ };
+ class SPE_CCKW_353_Ammo: SPE_CCKW_353_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class spare_fuel_hide_source: spare_fuel_hide_source {
+ positions[] = {{0.8, 1.8, -0.85}, {-0.8, 1.8, -0.85}, {0.8, 3.5, -0.85}, {-0.8, 3.5, -0.85}};
+ };
+ };
+ };
+ class SPE_CCKW_353_Repair: SPE_CCKW_353_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class spare_fuel_hide_source: spare_fuel_hide_source {
+ positions[] = {{0.8, 1.9, -0.85}, {-0.8, 1.9, -0.85}, {0.8, 3.6, -0.85}, {-0.8, 3.6, -0.85}};
+ };
+ };
+ };
+ class SPE_CCKW_353_Fuel: SPE_CCKW_353_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class spare_fuel_hide_source: spare_fuel_hide_source {
+ positions[] = {{0.8, 1.25, -0.8}, {-0.8, 1.25, -0.8}, {0.8, 2.95, -0.8}, {-0.8, 2.95, -0.8}, {0.8, -1, -0.3}, {-0.8, -1, -0.3}};
+ items[] = { // 32x
+ "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F",
+ "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F",
+ "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F",
+ "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F",
+ "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F",
+ "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F",
+ "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F",
+ "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F"
+ };
+ };
+ };
};
};
diff --git a/addons/compat_spe/compat_spe_repair/CfgVehicles.hpp b/addons/compat_spe/compat_spe_repair/CfgVehicles.hpp
new file mode 100644
index 00000000000..2f20e427d83
--- /dev/null
+++ b/addons/compat_spe/compat_spe_repair/CfgVehicles.hpp
@@ -0,0 +1,120 @@
+class CfgVehicles {
+ // Vehicle animation interactions
+ class SPE_Car_base;
+ class SPE_G503_MB_base: SPE_Car_base {
+ class EGVAR(interaction,anims) {
+ class hide_spare_wheel_source {
+ positions[] = {"_target selectionPosition ['hide_spare_wheel', 'ViewGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ class SPE_Truck_base;
+ class SPE_CCKW_353_Base: SPE_Truck_base {
+ class EGVAR(interaction,anims) {
+ class spare_wheel_hide_source {
+ positions[] = {{-0.9, 0.35, -0.95}};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+ class SPE_CCKW_353_Ammo: SPE_CCKW_353_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class spare_wheel_hide_source: spare_wheel_hide_source {
+ positions[] = {{-0.9, 0.35, -0.8}};
+ };
+ };
+ };
+ class SPE_CCKW_353_Repair: SPE_CCKW_353_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class spare_wheel_hide_source: spare_wheel_hide_source {
+ positions[] = {{-0.9, 0.43, -0.75}};
+ };
+ };
+ };
+ class SPE_CCKW_353_Fuel: SPE_CCKW_353_Base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class spare_wheel_hide_source: spare_wheel_hide_source {
+ positions[] = {{-0.9, -0.2, -0.7}};
+ };
+ };
+ };
+
+ class SPE_R200_base: SPE_Car_base {
+ class EGVAR(interaction,anims) {
+ class hide_spare_wheel_source {
+ positions[] = {"_target selectionPosition ['hide_sparetire', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+
+ class SPE_Tank_base;
+ class SPE_M18_Hellcat_Base: SPE_Tank_base {
+ class EGVAR(interaction,anims) {
+ class hull_armour_hide_source {
+ positions[] = {"_target selectionPosition ['spare_track_hull', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Track", "ACE_Track", "ACE_Track"};
+ name = ECSTRING(repair,RemoveTrack);
+ text = ECSTRING(repair,RemovingTrack);
+ };
+ };
+ };
+
+ class SPE_PzKpfwV_base: SPE_Tank_base {
+ class EGVAR(interaction,anims) {
+ class spare_tracks_hide_source {
+ selections[] = {"spare_tracks"};
+ positions[] = {"private _pos = _target selectionPosition 'spare_tracks'; _pos set [0, -(_pos select 0)]; _pos"}; // Mirror position to other side of vehicle
+ items[] = {"ACE_Track", "ACE_Track", "ACE_Track"};
+ name = ECSTRING(repair,RemoveTrack);
+ text = ECSTRING(repair,RemovingTrack);
+ };
+ };
+ };
+
+ class SPE_PzKpfwVI_H1_base: SPE_Tank_base {
+ class EGVAR(interaction,anims) {
+ class hull_armour_hide_source {
+ positions[] = {{-1.3, 1.7, -0.75}, {1.1, 1.7, -0.75}, {-0.05, 2.35, -1.5}};
+ items[] = {"ACE_Track", "ACE_Track", "ACE_Track", "ACE_Track", "ACE_Track"};
+ name = ECSTRING(repair,RemoveTrack);
+ text = ECSTRING(repair,RemovingTrack);
+ };
+ class turret_armour_hide_source {
+ // Rotate interactions with turret rotation
+ positions[] = {
+ "[0, -0.6, 0] vectorAdd ([[1.2, 0, -0.2], [0, 0, 1], deg (_target animationPhase 'MainTurret')] call CBA_fnc_vectRotate3D)",
+ "[0, -0.6, 0] vectorAdd ([[-1.3, -0.3, -0.2], [0, 0, 1], deg (_target animationPhase 'MainTurret')] call CBA_fnc_vectRotate3D)"
+ };
+ items[] = {"ACE_Track", "ACE_Track"};
+ name = ECSTRING(repair,RemoveTrack);
+ text = ECSTRING(repair,RemovingTrack);
+ };
+ };
+ };
+
+ class SPE_Jagdpanther_G1_base: SPE_Tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_spare_tracks_left_source {
+ positions[] = {"private _pos = _target selectionPosition ['hide_spare_tracks_right', 'FireGeometry', 'AveragePoint']; _pos set [0, -(_pos select 0)]; _pos vectorAdd [0, 0.335, 0]"};
+ items[] = {"ACE_Track"};
+ name = ECSTRING(repair,RemoveTrack);
+ text = ECSTRING(repair,RemovingTrack);
+ };
+ class hide_spare_tracks_right_source {
+ positions[] = {"_target selectionPosition ['hide_spare_tracks_right', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Track", "ACE_Track"};
+ name = ECSTRING(repair,RemoveTrack);
+ text = ECSTRING(repair,RemovingTrack);
+ };
+ };
+ };
+};
diff --git a/addons/compat_spe/compat_spe_repair/config.cpp b/addons/compat_spe/compat_spe_repair/config.cpp
new file mode 100644
index 00000000000..356ef6a6be9
--- /dev/null
+++ b/addons/compat_spe/compat_spe_repair/config.cpp
@@ -0,0 +1,27 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {
+ "ww2_spe_assets_c_weapons_infantryweapons_c",
+ "ww2_spe_assets_c_vehicles_staticweapons_c",
+ "ww2_spe_assets_c_vehicles_weapons_c",
+ "ww2_spe_core_f_system_staticweapons_f",
+ "ww2_spe_core_c_core_c_eventhandlers",
+ "ace_repair"
+ };
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"johnb43"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ addonRootClass = QUOTE(ADDON);
+ };
+};
+
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_spe/compat_spe_repair/script_component.hpp b/addons/compat_spe/compat_spe_repair/script_component.hpp
new file mode 100644
index 00000000000..1af928486c3
--- /dev/null
+++ b/addons/compat_spe/compat_spe_repair/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT repair
+#define SUBCOMPONENT_BEAUTIFIED Repair
+#include "..\script_component.hpp"
diff --git a/addons/compat_spe/compat_spe_trenches/CfgVehicles.hpp b/addons/compat_spe/compat_spe_trenches/CfgVehicles.hpp
new file mode 100644
index 00000000000..bb4b78721df
--- /dev/null
+++ b/addons/compat_spe/compat_spe_trenches/CfgVehicles.hpp
@@ -0,0 +1,119 @@
+class CfgVehicles {
+ // Vehicle animation interactions
+ class SPE_Car_base;
+ class SPE_G503_MB_base: SPE_Car_base {
+ class EGVAR(interaction,anims) {
+ class hide_tools_source {
+ positions[] = {{-0.7, 0, -0.9}};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+ class SPE_US_G503_MB_M1919_base: SPE_G503_MB_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_tools_source: hide_tools_source {
+ positions[] = {{-0.7, 0.45, -0.9}};
+ };
+ };
+ };
+ class SPE_US_G503_MB_M1919_Armoured_base: SPE_G503_MB_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_tools_source: hide_tools_source {
+ positions[] = {{-0.7, 0.45, -0.9}};
+ };
+ };
+ };
+ class SPE_US_G503_MB_M1919_PATROL_base: SPE_G503_MB_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_tools_source: hide_tools_source {
+ positions[] = {{-0.7, 0.45, -0.9}};
+ };
+ };
+ };
+ class SPE_US_G503_MB_M2_base: SPE_G503_MB_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_tools_source: hide_tools_source {
+ positions[] = {{-0.7, 0.45, -0.9}};
+ };
+ };
+ };
+ class SPE_US_G503_MB_M2_Armoured_base: SPE_G503_MB_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_tools_source: hide_tools_source {
+ positions[] = {{-0.7, 0.45, -0.9}};
+ };
+ };
+ };
+ class SPE_US_G503_MB_M2_PATROL_base: SPE_G503_MB_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_tools_source: hide_tools_source {
+ positions[] = {{-0.7, 0.45, -0.9}};
+ };
+ };
+ };
+ class SPE_G503_MB_Ambulance_base: SPE_G503_MB_base {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class hide_tools_source: hide_tools_source {
+ positions[] = {{-0.7, 0.45, -0.9}};
+ };
+ };
+ };
+
+ class SPE_R200_base: SPE_Car_base {
+ class EGVAR(interaction,anims) {
+ class hide_shovel_source {
+ positions[] = {{0.5, 1.2, -1.05}};
+ items[] = {"ACE_EntrenchingTool"};
+ name = ECSTRING(trenches,EntrenchingToolName);
+ text = ECSTRING(trenches,EntrenchingToolName);
+ };
+ };
+ };
+
+ class SPE_Tank_base;
+ class SPE_PzKpfwV_base: SPE_Tank_base {
+ class EGVAR(interaction,anims) {
+ class tools_hide_source {
+ positions[] = {{-1.45, 0.7, -0.4}};
+ items[] = {"ACE_EntrenchingTool", "ACE_wirecutter"};
+ name = "$STR_a3_cfgeditorsubcategories_edsubcat_tools0";
+ text = "$STR_a3_cfgeditorsubcategories_edsubcat_tools0";
+ };
+ };
+ };
+
+ class SPE_PzKpfwVI_H1_base: SPE_Tank_base {
+ class EGVAR(interaction,anims) {
+ class tools_hide_source {
+ positions[] = {{0, 1, -0.6}, {1.1, 0.1, -0.6}};
+ items[] = {"ACE_EntrenchingTool", "ACE_wirecutter"};
+ name = "$STR_a3_cfgeditorsubcategories_edsubcat_tools0";
+ text = "$STR_a3_cfgeditorsubcategories_edsubcat_tools0";
+ };
+ };
+ };
+
+ class SPE_StuG_III_base: SPE_Tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_tools_left_source {
+ positions[] = {{-1.4, -1.4, -0.7}, {-1, -2.2, -0.65}};
+ items[] = {"ACE_EntrenchingTool", "ACE_wirecutter"};
+ name = "$STR_a3_cfgeditorsubcategories_edsubcat_tools0";
+ text = "$STR_a3_cfgeditorsubcategories_edsubcat_tools0";
+ };
+ };
+ };
+
+ class SPE_Jagdpanther_G1_base: SPE_Tank_base {
+ class EGVAR(interaction,anims) {
+ class hide_tools_left_source {
+ positions[] = {{-1.4, 0.5, -0.7}};
+ items[] = {"ACE_EntrenchingTool", "ACE_wirecutter"};
+ name = "$STR_a3_cfgeditorsubcategories_edsubcat_tools0";
+ text = "$STR_a3_cfgeditorsubcategories_edsubcat_tools0";
+ };
+ };
+ };
+};
diff --git a/addons/compat_spe/compat_spe_trenches/config.cpp b/addons/compat_spe/compat_spe_trenches/config.cpp
new file mode 100644
index 00000000000..1b742b57825
--- /dev/null
+++ b/addons/compat_spe/compat_spe_trenches/config.cpp
@@ -0,0 +1,27 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {
+ "ww2_spe_assets_c_weapons_infantryweapons_c",
+ "ww2_spe_assets_c_vehicles_staticweapons_c",
+ "ww2_spe_assets_c_vehicles_weapons_c",
+ "ww2_spe_core_f_system_staticweapons_f",
+ "ww2_spe_core_c_core_c_eventhandlers",
+ "ace_trenches"
+ };
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"johnb43"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ addonRootClass = QUOTE(ADDON);
+ };
+};
+
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_spe/compat_spe_trenches/script_component.hpp b/addons/compat_spe/compat_spe_trenches/script_component.hpp
new file mode 100644
index 00000000000..10b90eb71e5
--- /dev/null
+++ b/addons/compat_spe/compat_spe_trenches/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT trenches
+#define SUBCOMPONENT_BEAUTIFIED Trenches
+#include "..\script_component.hpp"
diff --git a/addons/compat_ws/CfgVehicles.hpp b/addons/compat_ws/CfgVehicles.hpp
new file mode 100644
index 00000000000..98dc922d982
--- /dev/null
+++ b/addons/compat_ws/CfgVehicles.hpp
@@ -0,0 +1,27 @@
+class CfgVehicles {
+ // Vehicle animation interactions
+ // Easier to not inherit
+ class Offroad_01_base_lxWS;
+ class Offroad_01_armor_base_lxWS: Offroad_01_base_lxWS {
+ class EGVAR(interaction,anims) {
+ class HideBackpacks {
+ positions[] = {{-1.15, -1.17, -0.66}, {1.05, -1.17, -0.66}, {1.05, -2.52, -0.66}};
+ items[] = {"B_TacticalPack_blk", "B_TacticalPack_blk", "B_Carryall_khk", "B_Carryall_khk"};
+ name = "$STR_a3_cfgvehicleclasses_backpacks0";
+ text = "$STR_a3_cfgvehicleclasses_backpacks0";
+ };
+ };
+ };
+
+ class Offroad_01_AT_lxWS;
+ class Offroad_01_armor_AT_lxWS: Offroad_01_AT_lxWS {
+ class EGVAR(interaction,anims) {
+ class HideBackpacks {
+ positions[] = {{-1.15, -1.27, -0.66}, {1.05, -1.27, -0.66}, {1.05, -2.62, -0.66}};
+ items[] = {"B_TacticalPack_blk", "B_TacticalPack_blk", "B_Carryall_khk", "B_Carryall_khk"};
+ name = "$STR_a3_cfgvehicleclasses_backpacks0";
+ text = "$STR_a3_cfgvehicleclasses_backpacks0";
+ };
+ };
+ };
+};
diff --git a/addons/compat_ws/compat_ws_realisticnames/CfgVehicles.hpp b/addons/compat_ws/compat_ws_realisticnames/CfgVehicles.hpp
index fe1aed7e17d..5396b8f186c 100644
--- a/addons/compat_ws/compat_ws_realisticnames/CfgVehicles.hpp
+++ b/addons/compat_ws/compat_ws_realisticnames/CfgVehicles.hpp
@@ -57,4 +57,173 @@ class CfgVehicles {
class B_ION_Heli_Light_02_unarmed_lxWS: O_Heli_Light_02_unarmed_F {
displayName = SUBCSTRING(heli_light_02_unarmed_Name);
};
+
+ #include "CfgVehiclesAttachments.hpp"
+
+ // AA12
+ class Weapon_Base_F;
+ class Weapon_sgun_aa40_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(AA40_Name);
+ };
+ class Weapon_sgun_aa40_tan_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(AA40_Tan_Name);
+ };
+ class Weapon_sgun_aa40_snake_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(AA40_Snake_Name);
+ };
+
+ // Galil ARM
+ class Weapon_arifle_Galat_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(Galat_Name);
+ };
+ class Weapon_arifle_Galat_worn_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(Galat_Old_Name);
+ };
+
+ // GLX 160
+ class Weapon_glaunch_GLX_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(GLX_Name);
+ };
+ class Weapon_glaunch_GLX_snake_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(GLX_Snake_Name);
+ };
+ class Weapon_glaunch_GLX_hex_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(GLX_Hex_Name);
+ };
+ class Weapon_glaunch_GLX_ghex_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(GLX_GreenHex_Name);
+ };
+ class Weapon_glaunch_GLX_camo_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(GLX_Camo_Name);
+ };
+ class Weapon_glaunch_GLX_tan_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(GLX_Tan_Name);
+ };
+
+ // Mk14 Mod 1 EBR
+ class Weapon_srifle_EBR_blk_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(EBR_Black_Name);
+ };
+ class Weapon_srifle_EBR_snake_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(EBR_Snake_Name);
+ };
+
+ // Vektor SS-77
+ class Weapon_LMG_S77_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(S77_Name);
+ };
+ class Weapon_LMG_S77_AAF_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(S77_AAF_Name);
+ };
+ class Weapon_LMG_S77_Hex_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(S77_Hex_Name);
+ };
+ class Weapon_LMG_S77_GHex_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(S77_GreenHex_Name);
+ };
+ class Weapon_LMG_S77_Desert_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(S77_Desert_Name);
+ };
+
+ // Vektor SS-77 (Compact)
+ class Weapon_LMG_S77_Compact_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(S77_Compact_Name);
+ };
+ class Weapon_LMG_S77_Compact_Snakeskin_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(S77_Compact_Snake_Name);
+ };
+
+ // FN FAL (Wood) - Closest match is the 50.00
+ class Weapon_arifle_SLR_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(SLR_Wood_Name);
+ };
+ class Weapon_arifle_SLR_GL_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(SLR_GL_Wood_Name);
+ };
+
+ // FN FAL
+ class Weapon_arifle_SLR_V_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(SLR_Name);
+ };
+ class Weapon_arifle_SLR_V_GL_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(SLR_GL_Name);
+ };
+ class Weapon_arifle_SLR_D_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(SLR_Desert_Name);
+ };
+ class Weapon_arifle_SLR_V_camo_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(SLR_Camo_Name);
+ };
+ class Weapon_arifle_SLR_Para_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(SLR_Para_Name);
+ };
+ class Weapon_arifle_SLR_Para_snake_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(SLR_Para_Snake_Name);
+ };
+
+ // Vektor R4/R5
+ class Weapon_arifle_Velko_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(Velko_R4_Name);
+ };
+ class Weapon_arifle_VelkoR5_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(Velko_R5_Name);
+ };
+ class Weapon_arifle_VelkoR5_GL_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(Velko_R5_GL_Name);
+ };
+ class Weapon_arifle_VelkoR5_snake_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(Velko_R5_Snake_Name);
+ };
+ class Weapon_arifle_VelkoR5_GL_snake_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(Velko_R5_GL_Snake_Name);
+ };
+
+ // XMS has no realistic name as it's a make believe hybrid of the XM8/VHS-K2: XM8+VHS = XMS, this just removes the 5.56 mm from the name.
+ class Weapon_arifle_XMS_Base_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(XMS_Name);
+ };
+ class Weapon_arifle_XMS_Base_khk_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(XMS_Khaki_Name);
+ };
+ class Weapon_arifle_XMS_Base_Sand_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(XMS_Sand_Name);
+ };
+ class Weapon_arifle_XMS_GL_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(XMS_GL_Name);
+ };
+ class Weapon_arifle_XMS_GL_khk_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(XMS_GL_Khaki_Name);
+ };
+ class Weapon_arifle_XMS_GL_Sand_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(XMS_GL_Sand_Name);
+ };
+ class Weapon_arifle_XMS_Shot_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(XMS_SG_Name);
+ };
+ class Weapon_arifle_XMS_Shot_khk_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(XMS_SG_Khaki_Name);
+ };
+ class Weapon_arifle_XMS_Shot_Sand_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(XMS_SG_Sand_Name);
+ };
+ class Weapon_arifle_XMS_M_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(XMS_SW_Name);
+ };
+ class arifle_XMS_M_khk_lxWS: Weapon_Base_F {
+ diWeapon_splayName = SUBCSTRING(XMS_SW_Khaki_Name);
+ };
+ class Weapon_arifle_XMS_M_Sand_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(XMS_SW_Sand_Name);
+ };
+
+ // GM6 Lynx
+ class Weapon_srifle_GM6_snake_lxWS: Weapon_Base_F {
+ displayName = SUBCSTRING(gm6_snake_Name);
+ };
+
+ // RPG-32
+ class Launcher_Base_F;
+ class Weapon_launch_RPG32_tan_lxWS: Launcher_Base_F {
+ displayName = SUBCSTRING(rpg32_tan_Name);
+ };
};
diff --git a/addons/compat_ws/compat_ws_realisticnames/CfgVehiclesAttachments.hpp b/addons/compat_ws/compat_ws_realisticnames/CfgVehiclesAttachments.hpp
new file mode 100644
index 00000000000..5dbeab9bc48
--- /dev/null
+++ b/addons/compat_ws/compat_ws_realisticnames/CfgVehiclesAttachments.hpp
@@ -0,0 +1,71 @@
+// Attachments
+class Item_Base_F;
+class Item_optic_arco_hex_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(arco_hex_Name);
+};
+
+class Item_optic_Holosight_snake_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(holosight_snake_Name);
+};
+
+class Item_optic_Holosight_smg_snake_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(holosight_snake_smg_Name);
+};
+
+class Item_optic_Hamr_arid_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(hamr_arid_Name);
+};
+class Item_optic_Hamr_lush_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(hamr_lush_Name);
+};
+class Item_optic_Hamr_sand_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(hamr_sand_Name);
+};
+class Item_optic_Hamr_snake_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(hamr_snake_Name);
+};
+
+class Item_optic_r1_high_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(r1_high_black_Name);
+};
+class Item_optic_r1_high_khaki_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(r1_high_khaki_Name);
+};
+class Item_optic_r1_high_sand_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(r1_high_sand_Name);
+};
+class Item_optic_r1_high_snake_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(r1_high_snake_Name);
+};
+class Item_optic_r1_high_arid_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(r1_high_arid_Name);
+};
+class Item_optic_r1_high_lush_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(r1_high_lush_Name);
+};
+class Item_optic_r1_high_black_sand_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(r1_high_black_sand_Name);
+};
+
+class Item_optic_r1_low_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(r1_low_black_Name);
+};
+class Item_optic_r1_low_khaki_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(r1_low_khaki_Name);
+};
+class Item_optic_r1_low_sand_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(r1_low_sand_Name);
+};
+class Item_optic_r1_low_snake_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(r1_low_snake_Name);
+};
+class Item_optic_r1_low_arid_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(r1_low_arid_Name);
+};
+class Item_optic_r1_low_lush_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(r1_low_lush_Name);
+};
+
+class Item_optic_DMS_snake_lxWS: Item_Base_F {
+ displayName = SUBCSTRING(dms_snake_Name);
+};
diff --git a/addons/compat_ws/compat_ws_realisticnames/CfgWeapons.hpp b/addons/compat_ws/compat_ws_realisticnames/CfgWeapons.hpp
index e9cf3c6934d..b1929a49043 100644
--- a/addons/compat_ws/compat_ws_realisticnames/CfgWeapons.hpp
+++ b/addons/compat_ws/compat_ws_realisticnames/CfgWeapons.hpp
@@ -1,5 +1,5 @@
class CfgWeapons {
- #include "Attachments.hpp"
+ #include "CfgWeaponsAttachments.hpp"
// AA12
class sgun_aa40_base_lxWS;
diff --git a/addons/compat_ws/compat_ws_realisticnames/Attachments.hpp b/addons/compat_ws/compat_ws_realisticnames/CfgWeaponsAttachments.hpp
similarity index 99%
rename from addons/compat_ws/compat_ws_realisticnames/Attachments.hpp
rename to addons/compat_ws/compat_ws_realisticnames/CfgWeaponsAttachments.hpp
index 95801e04e92..a805e82edcf 100644
--- a/addons/compat_ws/compat_ws_realisticnames/Attachments.hpp
+++ b/addons/compat_ws/compat_ws_realisticnames/CfgWeaponsAttachments.hpp
@@ -1,3 +1,4 @@
+// Attachments
class optic_Arco;
class optic_arco_hex_lxWS: optic_Arco {
displayName = SUBCSTRING(arco_hex_Name);
diff --git a/addons/compat_ws/compat_ws_realisticnames/config.cpp b/addons/compat_ws/compat_ws_realisticnames/config.cpp
index 0eb75926a82..167e83fa356 100644
--- a/addons/compat_ws/compat_ws_realisticnames/config.cpp
+++ b/addons/compat_ws/compat_ws_realisticnames/config.cpp
@@ -15,6 +15,8 @@ class CfgPatches {
authors[] = {"Mike"};
url = ECSTRING(main,URL);
VERSION_CONFIG;
+
+ addonRootClass = QUOTE(ADDON);
};
};
diff --git a/addons/compat_ws/compat_ws_realisticnames/stringtable.xml b/addons/compat_ws/compat_ws_realisticnames/stringtable.xml
index 606bbb79326..9da3af7b05f 100644
--- a/addons/compat_ws/compat_ws_realisticnames/stringtable.xml
+++ b/addons/compat_ws/compat_ws_realisticnames/stringtable.xml
@@ -29,6 +29,7 @@
AA12 (ヘビ柄迷彩)
AA12 (Змея)
AA12 (Serpiente)
+ AA12 (Sable)
Galil ARM
@@ -68,6 +69,7 @@
GLX 160 (ヘビ柄迷彩)
GLX 160 (Змея)
GLX 160 (Serpiente)
+ GLX 160
GLX 160 (Hex)
@@ -127,6 +129,7 @@
Mk14 Mod 1 EBR (ヘビ柄迷彩)
Mk14 Mod 1 EBR (Змея)
Mk14 Mod 1 EBR (Serpiente)
+ Mk14 Mod 1 EBR (Serpent)
Vektor SS-77
@@ -195,6 +198,7 @@
ヴェクター SS-77 コンパクト (ヘビ柄迷彩)
Vektor SS-77 Compact (змея)
Vektor SS-77 Compacta (Serpiente)
+ Vektor SS-77 Compacte (Serpent)
FN FAL 50.00 (Wood)
@@ -262,6 +266,7 @@
FN FAL OSW 파라
FN FAL OSW Fallschirmjäger
FN FAL OSW Para
+ FN FAL OSW Para
FN FAL OSW Para (Snake)
@@ -269,6 +274,7 @@
FN FAL OSW 파라 (뱀 위장)
FN FAL OSW Fallschirmjäger (Schlange)
FN FAL OSW Para (Serpe)
+ FN FAL OSW Para (Serpent)
Vektor R4
@@ -308,6 +314,7 @@
ヴェクター R5 カービン (ヘビ柄迷彩)
Vektor R5 Carbine (Змея)
Vektor R5 Carabina (Serpiente)
+ Vektor R5 Carbine (Serpent)
Vektor R5 Carbine GL (Snake)
@@ -317,6 +324,7 @@
ヴェクター R5 カービン GL (ヘビ柄迷彩)
Vektor R5 Carbine GL (Змея)
Vektor R5 Carabina GL (Serpiente)
+ Vektor R5 Carbine GL (Serpent)
XMS
@@ -468,6 +476,7 @@
GM6 링스 (뱀 위장)
GM6 Lynx (Schlange)
GM6 Lynx (Serpe)
+ GM6 Lynx (Serpent)
RPG-32 (Sand)
@@ -475,6 +484,7 @@
RPG-32 (모래)
RPG-32 (Sand)
RPG-32 (Sabbia)
+ RPG-32 (Sable)
ELCAN SpecterOS (Hex)
@@ -482,6 +492,7 @@
엘칸 스펙터OS (육각)
ELCAN SpecterOS (Hex)
ELCAN SpecterOS (Hex)
+ ELCAN SpecterOS (Hex)
EOTech XPS3 (Snake)
@@ -489,6 +500,7 @@
이오텍 XPS3 (뱀 위장)
EOTech XPS3 (Schlange)
EOTech XPS3 (Serpe)
+ EOTech XPS3 (Serpent)
EOTech XPS3 SMG (Snake)
@@ -496,6 +508,7 @@
이오텍 XPS3 SMG (뱀 위장)
EOTech XPS3 SMG (Schlange)
EOTech XPS3 SMG (Serpe)
+ EOTech XPS3 SMG (Serpent)
Leupold Mark 4 HAMR (Arid)
@@ -503,6 +516,7 @@
류폴드 마크 4 HAMR (건조)
Leupold Mark 4 HAMR (Trocken)
Leupold Mark 4 HAMR (Arido)
+ Leupold Mark 4 HAMR (Aride)
Leupold Mark 4 HAMR (Lush)
@@ -510,6 +524,7 @@
류폴드 마크 4 HAMR (초목)
Leupold Mark 4 HAMR (Grün)
Leupold Mark 4 HAMR (Verdeggiante)
+ Leupold Mark 4 HAMR (Vert)
Leupold Mark 4 HAMR (Sand)
@@ -517,6 +532,7 @@
류폴드 마크 4 HAMR (모래)
Leupold Mark 4 HAMR (Sand)
Leupold Mark 4 HAMR (Sabbia)
+ Leupold Mark 4 HAMR (Sable)
Leupold Mark 4 HAMR (Snake)
@@ -524,6 +540,7 @@
류폴드 마크 4 HAMR (뱀 위장)
Leupold Mark 4 HAMR (Schlange)
Leupold Mark 4 HAMR (Serpe)
+ Leupold Mark 4 HAMR (Serpent)
Aimpoint Micro R-1 (High, Black)
@@ -531,6 +548,7 @@
에임포인트 마이크로 R-1 (높음, 검정)
Aimpoint Micro R-1 (Hoch, Schwarz)
Aimpoint Micro R-1 (Alto, Nero)
+ Aimpoint Micro R-1 (Haut, Noir)
Aimpoint Micro R-1 (High, Khaki)
@@ -538,6 +556,7 @@
에임포인트 마이크로 R-1 (높음, 카키)
Aimpoint Micro R-1 (Hoch, Khaki)
Aimpoint Micro R-1 (Alto, Cachi)
+ Aimpoint Micro R-1 (Haut, Kaki)
Aimpoint Micro R-1 (High, Sand)
@@ -545,6 +564,7 @@
에임포인트 마이크로 R-1 (높음, 모래)
Aimpoint Micro R-1 (Hoch, Sand)
Aimpoint Micro R-1 (Alto, Sabbia)
+ Aimpoint Micro R-1 (Haut, Sable)
Aimpoint Micro R-1 (High, Snake)
@@ -552,6 +572,7 @@
에임포인트 마이크로 R-1 (높음, 뱀 위장)
Aimpoint Micro R-1 (Hoch, Schlange)
Aimpoint Micro R-1 (Alto, Serpe)
+ Aimpoint Micro R-1 (Haut, Serpent)
Aimpoint Micro R-1 (High, Arid)
@@ -559,6 +580,7 @@
에임포인트 마이크로 R-1 (높음, 건조)
Aimpoint Micro R-1 (Hoch, Trocken)
Aimpoint Micro R-1 (Alto, Arido)
+ Aimpoint Micro R-1 (Hoch, Arid
Aimpoint Micro R-1 (High, Lush)
@@ -566,6 +588,7 @@
에임포인트 마이크로 R-1 (높음, 초목)
Aimpoint Micro R-1 (Hoch, Grün)
Aimpoint Micro R-1 (Alto, Verdeggiante)
+ Aimpoint Micro R-1 (Haute, Vert)
Aimpoint Micro R-1 (High, Black/Sand)
@@ -573,6 +596,7 @@
에임포인트 마이크로 R-1 (높음, 검정/모래)
Aimpoint Micro R-1 (Hoch, Schwarz/Sand)
Aimpoint Micro R-1 (Alto, Nero/Sabbia)
+ Aimpoint Micro R-1 (Haut, Noir/Sable)
Aimpoint Micro R-1 (Low, Black)
@@ -580,6 +604,7 @@
에임포인트 마이크로 R-1 (낮음, 검정)
Aimpoint Micro R-1 (Tief, Schwarz)
Aimpoint Micro R-1 (Basso, Nero)
+ Aimpoint Micro R-1 (Bas, Noir)
Aimpoint Micro R-1 (Low, Khaki)
@@ -587,6 +612,7 @@
에임포인트 마이크로 R-1 (낮음, 카키)
Aimpoint Micro R-1 (Tief, Khaki)
Aimpoint Micro R-1 (Basso, Cachi)
+ Aimpoint Micro R-1 (Bas, Kaki)
Aimpoint Micro R-1 (Low, Sand)
@@ -594,6 +620,7 @@
에임포인트 마이크로 R-1 (낮음, 모래)
Aimpoint Micro R-1 (Tief, Sand)
Aimpoint Micro R-1 (Basso, Sabbia)
+ Aimpoint Micro R-1 ( Bas, Sable )
Aimpoint Micro R-1 (Low, Snake)
@@ -601,6 +628,7 @@
에임포인트 마이크로 R-1 (낮음, 뱀 위장)
Aimpoint Micro R-1 (Tief, Schlange)
Aimpoint Micro R-1 (Basso, Serpe)
+ Aimpoint Micro R-1 (Bas, Serpent)
Aimpoint Micro R-1 (Low, Arid)
@@ -608,6 +636,7 @@
에임포인트 마이크로 R-1 (낮음, 건조)
Aimpoint Micro R-1 (Tief, Trocken)
Aimpoint Micro R-1 (Basso, Arido)
+ Aimpoint Micro R-1 (Bas, Arid)
Aimpoint Micro R-1 (Low, Lush)
@@ -615,6 +644,7 @@
에임포인트 마이크로 R-1 (낮음, 초목)
Aimpoint Micro R-1 (Tief, Grün)
Aimpoint Micro R-1 (Basso, Verdeggiante)
+ Aimpoint Micro R-1 (Bas, Vert)
Burris XTR II (Snake)
@@ -622,6 +652,7 @@
버리스 XTR II (뱀 위장)
Burris XTR II (Schlange)
Burris XTR II (Serpe)
+ Burris XTR II (Serpent)
Badger IFV (ATGM)
@@ -629,6 +660,7 @@
뱃져 보병전투차 (대전차미사일)
Badger IFV (PzAbw)
Badger IFV (ATGM)
+ Badger IFV (ATGM)
Badger IFV (Command)
@@ -636,6 +668,7 @@
뱃져 보병전투차 (지휘)
Badger IFV (Kommando)
Badger IFV (Comando)
+ Badger IFV (Commandement)
Badger IFV (Mortar)
@@ -643,6 +676,7 @@
뱃져 보병전투차 (자주박격포)
Badger IFV (Mörser)
Badger IFV (Mortaio)
+ Badger IFV (mortier)
KamAZ (Zu-23-2)
@@ -650,6 +684,7 @@
카마즈 (ZU-23-2)
KamAZ (Zu-23-2)
KamAZ (Zu-23-2)
+ KamAZ (Zu-23-2)
KamAZ Cargo
@@ -657,6 +692,7 @@
카마즈 화물
KamAZ Fracht
KamAZ Carico
+ KamAZ Cargo
KamAZ Repair
@@ -664,6 +700,7 @@
카마즈 정비
KamAZ Instandsetzung
KamAZ Riparazione
+ KamAZ Réparation
KamAZ Racing
@@ -671,6 +708,7 @@
카마즈 경주용
KamAZ Rennlaster
KamAZ da corsa
+ KamAZ de course
KamAZ Ammo
@@ -678,6 +716,7 @@
카마즈 탄약
KamAZ Munition
KamAZ Munizioni
+ KamAZ Munitions
KamAZ Flatbed
@@ -685,6 +724,7 @@
카마즈 플랫베드
KamAZ Flachbett
KamAZ Pianale
+ KamAZ Flatbed
AW101 Merlin
@@ -692,6 +732,7 @@
AW101 멀린
AW101 Merlin
AW101 Merlin
+ AW101 Merlin
BM-2T Stalker (Bumerang-BM)
@@ -699,20 +740,23 @@
BM-2T 스토커 (부메랑-BM)
BM-2T Stalker (Bumerang-BM)
BM-2T Stalker (Bumerang-BM)
+ BM-2T Stalker (Boomerang-BM)
Otokar ARMA (HMG)
オトカ アルマ (HMG)
- 오토카르 아르마 APC (중기관총)
+ 오토카 아르마 APC (중기관총)
Otokar ARMA (HMG)
Otokar ARMA (HMG)
+ Otokar ARMA (HMG)
Otokar ARMA (Unarmed)
オトカ アルマ (非武装)
- 오토카르 아르마 APC (비무장)
+ 오토카 아르마 APC (비무장)
Otokar ARMA (Unbewaffnet)
Otokar ARMA (Disarmato)
+ Otokar ARMA (non armé)
Ka-60 Kasatka (UP)
@@ -720,6 +764,7 @@
Ka-60 카사트카 (UP)
Ka-60 Kasatka (UP)
Ka-60 Kasatka (UP)
+ Ka-60 Kasatka (UP)
Ka-60 Kasatka (UP, Unarmed)
@@ -727,6 +772,7 @@
Ka-60 카사트카 (UP, 비무장))
Ka-60 Kasatka (UP, Unbewaffnet)
Ka-60 Kasatka (UP, Disarmato)
+ Ka-60 Kasatka (UP, non armé)
diff --git a/addons/compat_ws/compat_ws_repair/CfgVehicles.hpp b/addons/compat_ws/compat_ws_repair/CfgVehicles.hpp
new file mode 100644
index 00000000000..d7fcbc7cd97
--- /dev/null
+++ b/addons/compat_ws/compat_ws_repair/CfgVehicles.hpp
@@ -0,0 +1,34 @@
+class CfgVehicles {
+ // Vehicle animation interactions
+ class Truck_02_base_F;
+ class Truck_02_aa_base_lxWS: Truck_02_base_F {
+ class EGVAR(interaction,anims) {
+ class hideSpareWheel {
+ positions[] = {{1, 1.93, -0.85}};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+ class Truck_02_cargo_base_lxWS: Truck_02_base_F {
+ class EGVAR(interaction,anims) {
+ class hideSpareWheel {
+ positions[] = {{1, 1.93, -0.35}};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+ class Truck_02_box_base_lxWS: Truck_02_base_F {
+ class EGVAR(interaction,anims) {
+ class hideSpareWheel {
+ positions[] = {{1, 1.7, -0.35}};
+ items[] = {"ACE_Wheel"};
+ name = ECSTRING(repair,RemoveWheel);
+ text = ECSTRING(repair,RemovingWheel);
+ };
+ };
+ };
+};
diff --git a/addons/compat_ws/compat_ws_repair/config.cpp b/addons/compat_ws/compat_ws_repair/config.cpp
new file mode 100644
index 00000000000..4f37c831cb6
--- /dev/null
+++ b/addons/compat_ws/compat_ws_repair/config.cpp
@@ -0,0 +1,20 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {"data_f_lxWS_Loadorder", "ace_repair"};
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"johnb43"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ addonRootClass = QUOTE(ADDON);
+ };
+};
+
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_ws/compat_ws_repair/script_component.hpp b/addons/compat_ws/compat_ws_repair/script_component.hpp
new file mode 100644
index 00000000000..1af928486c3
--- /dev/null
+++ b/addons/compat_ws/compat_ws_repair/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT repair
+#define SUBCOMPONENT_BEAUTIFIED Repair
+#include "..\script_component.hpp"
diff --git a/addons/compat_ws/compat_ws_vehicles/CfgVehicles.hpp b/addons/compat_ws/compat_ws_vehicles/CfgVehicles.hpp
new file mode 100644
index 00000000000..ffc69d60758
--- /dev/null
+++ b/addons/compat_ws/compat_ws_vehicles/CfgVehicles.hpp
@@ -0,0 +1,27 @@
+class CfgVehicles {
+ class Car_F;
+ class Wheeled_APC_F: Car_F {
+ class Turrets {
+ class MainTurret;
+ };
+ };
+ class APC_Wheeled_01_base_F: Wheeled_APC_F {
+ class Turrets: Turrets {
+ class MainTurret: MainTurret {};
+ };
+ };
+ class APC_Wheeled_01_atgm_base_lxWS: APC_Wheeled_01_base_F {
+ class Turrets: Turrets {
+ class MainTurret: MainTurret {
+ weapons[] = {"autocannon_40mm_CTWS", "ACE_LMG_coax_MAG58_mem3", "missiles_titan"}; // For realistic MG name
+ };
+ };
+ };
+ class APC_Wheeled_01_command_base_lxWS: APC_Wheeled_01_base_F {
+ class Turrets: Turrets {
+ class MainTurret: MainTurret {
+ weapons[] = {"HMG_127_lxWS", "ACE_LMG_coax_MAG58_mem3"}; // For realistic MG name
+ };
+ };
+ };
+};
diff --git a/addons/compat_ws/compat_ws_vehicles/config.cpp b/addons/compat_ws/compat_ws_vehicles/config.cpp
new file mode 100644
index 00000000000..07d6c1f608c
--- /dev/null
+++ b/addons/compat_ws/compat_ws_vehicles/config.cpp
@@ -0,0 +1,23 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {
+ "data_f_lxWS_Loadorder",
+ "ace_vehicles"
+ };
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"johnb43"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ addonRootClass = QUOTE(ADDON);
+ };
+};
+
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_ws/compat_ws_vehicles/script_component.hpp b/addons/compat_ws/compat_ws_vehicles/script_component.hpp
new file mode 100644
index 00000000000..17370c415fd
--- /dev/null
+++ b/addons/compat_ws/compat_ws_vehicles/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT vehicles
+#define SUBCOMPONENT_BEAUTIFIED Vehicles
+#include "..\script_component.hpp"
diff --git a/addons/compat_ws/config.cpp b/addons/compat_ws/config.cpp
index 32a3f6f73cb..54a6df99eec 100644
--- a/addons/compat_ws/config.cpp
+++ b/addons/compat_ws/config.cpp
@@ -6,7 +6,7 @@ class CfgPatches {
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
- requiredAddons[] = {"data_f_lxWS_Loadorder"};
+ requiredAddons[] = {"data_f_lxWS_Loadorder", "ace_common"};
skipWhenMissingDependencies = 1;
author = ECSTRING(common,ACETeam);
authors[] = {"Mike"};
@@ -15,4 +15,5 @@ class CfgPatches {
};
};
+#include "CfgVehicles.hpp"
#include "CfgWeapons.hpp"
diff --git a/addons/concertina_wire/functions/fnc_deploy.sqf b/addons/concertina_wire/functions/fnc_deploy.sqf
index c915109e1b0..b1699ffc857 100644
--- a/addons/concertina_wire/functions/fnc_deploy.sqf
+++ b/addons/concertina_wire/functions/fnc_deploy.sqf
@@ -48,7 +48,7 @@ GVAR(deployPFH) = [{
private _anim = 0 max (1 - (_range / 12));
if (!(alive _unit) || _range >= 12 || (_unit getVariable [QGVAR(wireDeployed), false])) exitWith {
- private _wire = "ACE_ConcertinaWire" createvehicle [0, 0, 0];
+ private _wire = "ACE_ConcertinaWire" createVehicle [0, 0, 0];
{
_wire animate [_x, _anim];
} forEach WIRE_FAST;
diff --git a/addons/concertina_wire/functions/fnc_dismountSuccess.sqf b/addons/concertina_wire/functions/fnc_dismountSuccess.sqf
index 86aac9e8bf5..d90d3931dab 100644
--- a/addons/concertina_wire/functions/fnc_dismountSuccess.sqf
+++ b/addons/concertina_wire/functions/fnc_dismountSuccess.sqf
@@ -31,7 +31,7 @@ params ["_wire"];
private _dir = getDir _wire;
private _pos = getPosASL _wire;
- private _wirecoil = "ACE_ConcertinaWireCoil" createvehicle [0, 0, 0];
+ private _wirecoil = "ACE_ConcertinaWireCoil" createVehicle [0, 0, 0];
deleteVehicle _wire;
diff --git a/addons/cookoff/functions/fnc_cookOffLocal.sqf b/addons/cookoff/functions/fnc_cookOffLocal.sqf
index cbd160bba1d..4c61a4e5a63 100644
--- a/addons/cookoff/functions/fnc_cookOffLocal.sqf
+++ b/addons/cookoff/functions/fnc_cookOffLocal.sqf
@@ -7,7 +7,7 @@
* 0: Vehicle
* 1: Spawn fire jet
* 2: Spawn fire ring
- * 3: What selection fire will originate from
+ * 3: What selection fire will originate from
* 4: Cookoff intensity value
* 5: Start time
* 6: Duration of effect (max 20 seconds)
@@ -127,12 +127,13 @@ if (isServer) then {
if (_ring) then {
private _ringOrigin = (_vehicle selectionPosition _fireSelection) vectorAdd [-0.1 + random 0.2, -0.1 + random 0.2, -1];
+ private _dir = 20 * (_factor / 2);
drop [
- ["\A3\data_f\ParticleEffects\Universal\Universal",16,2,32],
+ ["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + random 0.2) * _factor,
_ringOrigin,
- [0, 20 * (_factor / 2), 0],
+ [0, _dir, 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, FLAME_SIZE * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
@@ -142,7 +143,7 @@ if (isServer) then {
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + random 0.2) * _factor,
_ringOrigin,
- [0, -20 * (_factor / 2), 0],
+ [0, -_dir, 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, FLAME_SIZE * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
@@ -152,7 +153,7 @@ if (isServer) then {
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + random 0.2) * _factor,
_ringOrigin,
- [20 * (_factor / 2), 0, 0],
+ [_dir, 0, 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, FLAME_SIZE * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
@@ -161,15 +162,14 @@ if (isServer) then {
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + random 0.2) * _factor,
- [-0.1 + random 0.2, -0.1 + random 0.2, -1],
- [-20 * (_factor / 2), 0, 0],
+ _ringOrigin,
+ [-_dir, 0, 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, FLAME_SIZE * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _vehicle
];
- private _dir = 20 * (_factor / 2);
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + random 0.2) * _factor,
@@ -181,21 +181,19 @@ if (isServer) then {
[2 + random 1], 1, 0, "", "", _vehicle
];
- _dir = -20 * (_factor / 2);
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + (random 0.2)) * _factor,
_ringOrigin,
- [_dir, _dir, 0],
+ [-_dir, -_dir, 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, FLAME_SIZE * _factor],
[[1, 1, 1, -2],[1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _vehicle
];
- _dir = 20 * (_factor / 2);
drop [
- ["\A3\data_f\ParticleEffects\Universal\Universal",16,2,32],
+ ["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + (random 0.2)) * _factor,
_ringOrigin,
[_dir, -_dir, 0],
@@ -205,7 +203,6 @@ if (isServer) then {
[2 + random 1], 1, 0, "", "", _vehicle
];
- _dir = 20 * (_factor / 2);
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + random 0.2) * _factor,
diff --git a/addons/cookoff/functions/fnc_cookOffServer.sqf b/addons/cookoff/functions/fnc_cookOffServer.sqf
index 05111d7e694..d1e5347be5e 100644
--- a/addons/cookoff/functions/fnc_cookOffServer.sqf
+++ b/addons/cookoff/functions/fnc_cookOffServer.sqf
@@ -12,7 +12,7 @@
* 4: Delay between smoke and fire enabled (default: true)
* 5: Ammo detonation chance (default: 0)
* 6: Detonate after cook-off (default: false)
- * 7: Selection for fire source (default: "")
+ * 7: Selection for fire source (default: "")
* 8: Can spawn fire ring (default: true)
* 9: Can spawn fire jet (default: true)
* 10: Maximum intensity (default: MAX_COOKOFF_INTENSITY)
@@ -199,4 +199,4 @@ if (_delayBetweenSmokeAndFire) then {
}, [_vehicle, _selections, _ammoDetonationChance, _detonateAfterCookoff, _source, _instigator, _fireSelection, _canRing, _canJet, _smokeJipID, _fireJipID], _delay] call CBA_fnc_waitAndExecute;
// API
-[QGVAR(cookoff), [_vehicle, _intensity, _instigator, _smokeDelayEnabled, _ammoDetonationChance, _detonateAfterCookoff, _fireSelection, _canRing, _maxIntensity, _canJet]] call CBA_fnc_globalEvent;
+[QGVAR(cookoff), [_vehicle, _intensity, _instigator, _delayBetweenSmokeAndFire, _ammoDetonationChance, _detonateAfterCookoff, _fireSelection, _canRing, _maxIntensity, _canJet]] call CBA_fnc_globalEvent;
diff --git a/addons/cookoff/functions/fnc_detonateAmmunitionServerLoop.sqf b/addons/cookoff/functions/fnc_detonateAmmunitionServerLoop.sqf
index 7fdcedda51d..946cb4f7d8f 100644
--- a/addons/cookoff/functions/fnc_detonateAmmunitionServerLoop.sqf
+++ b/addons/cookoff/functions/fnc_detonateAmmunitionServerLoop.sqf
@@ -91,7 +91,7 @@ private _configMagazine = configFile >> "CfgMagazines" >> _magazineClassname;
private _ammo = getText (_configMagazine >> "ammo");
private _configAmmo = configFile >> "CfgAmmo" >> _ammo;
-private _simType = toLower getText (_configAmmo >> "simulation");
+private _simType = toLowerANSI getText (_configAmmo >> "simulation");
private _speed = linearConversion [0, 1, random 1, 1, 20, true];
private _effect2pos = _object selectionPosition "destructionEffect2";
@@ -100,7 +100,7 @@ private _fnc_spawnProjectile = {
// If the magazines are inside of the cargo (inventory), don't let their projectiles escape the interior of the vehicle
if (!_spawnProjectile) exitWith {};
- params ["_object", "_ammo", "_speed", "_flyAway"];
+ params ["_flyAway"];
private _spawnPos = _object modelToWorld [-0.2 + random 0.4, -0.2 + random 0.4, random 3];
@@ -117,7 +117,7 @@ private _fnc_spawnProjectile = {
_projectile setVectorDir _vectorVelocity;
_projectile setVelocity _vectorVelocity;
} else {
- _projectile setDamage 1;
+ triggerAmmo _projectile;
};
};
@@ -126,14 +126,14 @@ switch (_simType) do {
[QGVAR(playCookoffSound), [_object, _simType]] call CBA_fnc_globalEvent;
if (random 1 < 0.6) then {
- [_object, _ammo, _speed, true] call _fnc_spawnProjectile;
+ true call _fnc_spawnProjectile;
};
};
case "shotshell": {
[QGVAR(playCookoffSound), [_object, _simType]] call CBA_fnc_globalEvent;
if (random 1 < 0.15) then {
- [_object, _ammo, _speed, true] call _fnc_spawnProjectile;
+ true call _fnc_spawnProjectile;
};
};
case "shotgrenade": {
@@ -141,7 +141,7 @@ switch (_simType) do {
_speed = 0;
};
- [_object, _ammo, _speed, random 1 < 0.5] call _fnc_spawnProjectile;
+ (random 1 < 0.5) call _fnc_spawnProjectile;
};
case "shotrocket";
case "shotmissile";
@@ -149,7 +149,7 @@ switch (_simType) do {
if (random 1 < 0.1) then {
[QGVAR(playCookoffSound), [_object, _simType]] call CBA_fnc_globalEvent;
- [_object, _ammo, _speed, random 1 < 0.3] call _fnc_spawnProjectile;
+ (random 1 < 0.3) call _fnc_spawnProjectile;
} else {
createVehicle ["ACE_ammoExplosionLarge", _object modelToWorld _effect2pos, [], 0 , "CAN_COLLIDE"];
};
@@ -157,22 +157,13 @@ switch (_simType) do {
case "shotdirectionalbomb";
case "shotmine": {
if (random 1 < 0.5) then {
- // Not all explosives detonate on destruction, some have scripted alternatives
- if (getNumber (_configAmmo >> "triggerWhenDestroyed") != 1) then {
- _ammo = getText (_configAmmo >> QEGVAR(explosives,explosive));
- };
-
- // If a scripted alternative doesn't exist use generic explosion
- if (_ammo != "") then {
- [_object, _ammo, 0, false] call _fnc_spawnProjectile;
- } else {
- createVehicle ["SmallSecondary", _object modelToWorld _effect2pos, [], 0 , "CAN_COLLIDE"];
- };
+ // _speed should be 0, but as it doesn't fly away, no need to set _speed
+ false call _fnc_spawnProjectile;
};
};
case "shotilluminating": {
if (random 1 < 0.15) then {
- [_object, _ammo, _speed, random 1 < 0.3] call _fnc_spawnProjectile;
+ (random 1 < 0.3) call _fnc_spawnProjectile;
};
};
};
diff --git a/addons/cookoff/functions/fnc_engineFireLocal.sqf b/addons/cookoff/functions/fnc_engineFireLocal.sqf
index afd6827d6b1..5960a518ce7 100644
--- a/addons/cookoff/functions/fnc_engineFireLocal.sqf
+++ b/addons/cookoff/functions/fnc_engineFireLocal.sqf
@@ -27,7 +27,11 @@ if (hasInterface) then {
private _hitPoints = getAllHitPointsDamage _vehicle;
// Get hitpoint for engine
- private _index = (_hitPoints select 0) findIf {_x == "hitengine"};
+ private _index = if (_hitPoints isNotEqualTo []) then {
+ (_hitPoints select 0) findIf {_x == "hitengine"}
+ } else {
+ -1
+ };
// Get corresponding selection
private _position = if (_index != -1) then {
diff --git a/addons/cookoff/functions/fnc_getVehicleAmmo.sqf b/addons/cookoff/functions/fnc_getVehicleAmmo.sqf
index df4385d30da..35ca6fae263 100644
--- a/addons/cookoff/functions/fnc_getVehicleAmmo.sqf
+++ b/addons/cookoff/functions/fnc_getVehicleAmmo.sqf
@@ -52,7 +52,7 @@ private _ammo = "";
_x params ["_magazine", "_count"];
if (_count > 0 && {!(_magazine call FUNC(isMagazineFlare))}) then {
- _ammoToDetonate pushBack [_magazine, _count, false];
+ _ammoToDetonate pushBack [_magazine, _count, random 1 < 0.5];
_totalAmmo = _totalAmmo + _count;
};
} forEach (magazinesAmmoCargo _object);
diff --git a/addons/cookoff/stringtable.xml b/addons/cookoff/stringtable.xml
index 15d2d2adec0..838b3490bba 100644
--- a/addons/cookoff/stringtable.xml
+++ b/addons/cookoff/stringtable.xml
@@ -23,6 +23,7 @@
차량 유폭 화재를 활성화합니다
Abilita incendio dei veicoli
Aktiviert Fahrzeug Munitionsbrand
+ Permettre l'incendie du véhicule
Enables vehicle cook-off fire effects.\nThis doesn't include ammunition detonations.
@@ -31,6 +32,7 @@
차량 유폭 효과를 활성화합니다.\n여기엔 탄약 유폭이 포함되지 않습니다.
Abilita effetti di incendio del veicolo dovuto all'esplosione delle munizioni.\nQuesto non include gli effetti di esplosione.
Aktiviert Fahrzeug Brandeffekte durch Durchzündung.\nExplosionseffekte sind nicht mit einbegriffen.
+ Permet d'obtenir des effets de feu de véhicule à partir de munitions qui explosent.\nCela n'inclut pas les effets d'explosion.
Vehicle cook-off fire duration multiplier
@@ -39,6 +41,7 @@
차량 유폭 화재 지속 시간 계수
Coefficiente di durata incendio dei veicoli
Fahrzeugbrand Dauer-Multiplikator
+ Coefficient de durée d'incendie du véhicule
Multiplier for how long vehicle cook-off fire lasts.\nSetting to 0 will disable vehicle cook-off fire.
@@ -47,6 +50,7 @@
차량 유폭 화재가 지속되는 시간에 대한 계수입니다.\n0으로 설정하면 차량 쿸오프 화재가 비활성화됩니다.
Coefficiente di durata degli incendi dei veicoli.\nImpostarlo su 0 disabilita incendi dei veicoli.
Multiplikator der Fahrzeugbrand Dauer.\nIhn auf 0 zu setzen wird Munitionsbrände deaktivieren.
+ Coefficient de durée des feux de véhicules.\nLa valeur 0 désactive les feux de véhicules.
Vehicle cook-off fire probability multiplier
@@ -55,6 +59,7 @@
차량 유폭 화재 확률 계수
Probabilità di incendio dei veicoli
Fahrzeug Munitionsbrand Wahrscheinlichkeit-Multiplikator
+ Probabilité d'incendies de véhicules
Multiplier for vehicle cook-off fire probability. Higher value results in higher cook-off probability.\nSetting to 0 will disable vehicle cook-off fire.
@@ -63,6 +68,7 @@
차량 유폭 화재 확률에 대한 계수입니다. 값이 높을 수록 유폭 확률이 높아집니다.\n0으로 설정하면 차량 유폭 화재가 비활성화됩니다.
Coefficiente di probabilità degli incendi dei veicoli.\nValori maggiori aumentano la probabilità di incendi.\nImpostarlo su 0 disabilita incendi dei veicoli.
Multiplikator der Fahrzeugbrand Wahrscheinlichkeit.\nHöhere Werte erhöhen die Wahrscheinlichkeit.\nEin Null-Wert wird Munitionsbrände deaktivieren.
+ Coefficient de probabilité des incendies de véhicules.\nLes valeurs élevées augmentent la probabilité des incendies.\nLa valeur 0 désactive les incendies de véhicules.
Destroy vehicles after cook-off
@@ -96,6 +102,7 @@
차량 내 탄약 유폭 활성화
Abilita esplosioni delle munizioni dei veicoli
Aktiviert Fahrzeug Munitionsdurchzündung
+ Permet l'explosion des munitions des véhicules
Enables cooking off of vehicle ammunition. Fires ammunition projectiles while vehicle has ammunition remaining.\nThis doesn't include fire effects.
@@ -104,6 +111,7 @@
차량 내 탄약 유폭을 활성화합니다. 차량에 탄약이 남아 있는 동안 탄약 발사체를 발사합니다.\n여기엔 화재 효과가 포함되지 않습니다.
Abilita l'esplosione delle munizioni dei veicoli. Spara via pezzi di munizioni se il veicolo ha ancora munizioni rimanenti.\nNon include gli effetti di fuoco.
Aktiviert Durchzündung von Fahrzeugmunition. Schleudert Munitionsfragmente umher wenn das Fahrzeug noch Munition an Bord hat.\nBrandeffekte sind nicht mit einbegriffen.
+ Permet l'explosion des munitions du véhicule. Tire des morceaux de munitions si le véhicule a encore des munitions restantes.\nIl n'y a pas d'effets de feu.
Enable ammo box cook-off
@@ -127,6 +135,7 @@
탄약 상자 유폭을 활성화합니다.\n여기엔 화재 효과가 포함되지 않습니다.
Abilita esplosioni delle casse di munizioni.\nNon include effetti di fuoco.
Aktiviert Munitionskisten Durchzündung.\nBrandeffekte sind nicht mit einbegriffen.
+ Permet l'explosion des caisses de munitions.\nN'inclut pas les effets de feu.
Ammo cook-off duration multiplier
@@ -135,6 +144,7 @@
탄약 유폭 시간 계수
Coefficiente di durata esplisioni di munizioni
Fahrzeug Munitionsdurchzündung Dauer-Multiplikator
+ Coefficient de durée d'explosion des munitions
Multiplier for how long ammunition cook-off lasts, for both vehicles and ammo boxes.\nSetting to 0 will disable ammo cook-off for both vehicles and ammo boxes.
@@ -143,6 +153,7 @@
차량과 탄약 상자 모두에 대해 탄약 유폭이 지속되는 시간에 대한 계수입니다.\n0으로 설정하면 차량과 탄약 상자 모두에 대해 탄약 유폭이 비활성화됩니다.
Coefficiente della durata di esplosioni delle munizioni, sia per veicoli che casse.\nImpostarlo su 0 disabilita esplosioni di veicoli e casse.
Multiplikator der Munitionsdurchzündungs-Dauer, gilt für Fahrzeuge und Munitionskisten.\nIhn auf 0 zu setzen wird Durchzünden deaktivieren.
+ Coefficient de durée d'explosion des munitions pour les véhicules et les caisses.\nLa valeur 0 désactive les explosions des véhicules et des caisses.
Enable ammo removal during cook-off
diff --git a/addons/csw/CfgMagazines.hpp b/addons/csw/CfgMagazines.hpp
index 86ad73c58fc..2466bbe6967 100644
--- a/addons/csw/CfgMagazines.hpp
+++ b/addons/csw/CfgMagazines.hpp
@@ -58,6 +58,7 @@ class CfgMagazines {
class GVAR(20Rnd_20mm_G_belt): 40Rnd_20mm_G_belt {
author = ECSTRING(common,ACETeam);
displayName = CSTRING(GMGBelt_displayName);
+ descriptionShort = CSTRING(GMGBelt_descriptionShort);
model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d";
picture = QPATHTOF(UI\ammoBox_50bmg_ca.paa);
type = 256;
diff --git a/addons/csw/XEH_postInit.sqf b/addons/csw/XEH_postInit.sqf
index 87196f33772..419e7013809 100644
--- a/addons/csw/XEH_postInit.sqf
+++ b/addons/csw/XEH_postInit.sqf
@@ -8,18 +8,32 @@ GVAR(vehicleMagCache) = createHashMap;
// needs a small delay for network syncing, or we end up with duplicate mags with ammo handling
[LINKFUNC(initVehicle), _this, 1] call CBA_fnc_waitAndExecute;
}, true, [], true] call CBA_fnc_addClassEventHandler;
-
- GVAR(quickmountEnabled) = (
- missionNamespace getVariable [QEGVAR(quickmount,enabled), false] &&
- {(missionNamespace getVariable [QEGVAR(quickmount,enableMenu), -1]) in [1,3]}
- );
}] call CBA_fnc_addEventHandler;
+// Also triggered at mission start
["CBA_SettingChanged", {
GVAR(quickmountEnabled) = (
missionNamespace getVariable [QEGVAR(quickmount,enabled), false] &&
{(missionNamespace getVariable [QEGVAR(quickmount,enableMenu), -1]) in [1,3]}
);
+
+ // Do not allow no ammo handling when advanced assembly is enabled
+ // Reason: When using advanced assembly, the amount of ammo is not stored anywhere, so when you reassemble a static, it will spawn full ammo
+ if (GVAR(defaultAssemblyMode) && GVAR(ammoHandling) == 0) then {
+ if (isServer) then {
+ [QGVAR(ammoHandling), 2, 2, "server"] call CBA_settings_fnc_set;
+ };
+
+ // Notify everyone about change
+ [QEGVAR(common,displayTextStructured), [composeText [
+ lineBreak,
+ parseText format [
+ "%1", format ["%1 requires %2 to be set higher than 0.", QGVAR(defaultAssemblyMode), QGVAR(ammoHandling)]
+ ],
+ lineBreak,
+ parseText format ["%1", "No mission restart is required."]
+ ], 4]] call CBA_fnc_localEvent;
+ };
}] call CBA_fnc_addEventHandler;
// Event handlers:
diff --git a/addons/csw/dev/checkStaticWeapons.sqf b/addons/csw/dev/checkStaticWeapons.sqf
index 7d9917daa71..137dc953341 100644
--- a/addons/csw/dev/checkStaticWeapons.sqf
+++ b/addons/csw/dev/checkStaticWeapons.sqf
@@ -16,7 +16,7 @@ private _inherited = [];
private _config = _x;
private _configEnabled = (getNumber (_config >> QUOTE(ADDON) >> "enabled")) == 1;
if (_configEnabled) then {
- private _configExplicit = (count configProperties [_config, "configName _x == 'ace_csw'", false]) == 1;
+ private _configExplicit = (count configProperties [_config, toString {configName _x == QUOTE(ADDON)}, false]) == 1;
if (_configExplicit) then {
_explicitBases pushBack (configName _config);
_inherited pushBack [];
@@ -43,8 +43,8 @@ private _inherited = [];
INFO("------ Logging static magazines with no carry version -------");
private _hash = createHashMap;
-// private _logAll = true; // logs all possible weapon magazines (even if not used in a static weapon)
-private _logAll = false;
+private _logAll = false; // logs all possible weapon magazines (even if not used in a static weapon) when set to true
+
{
private _vehicleType = configName _x;
private _turretConfig = [_vehicleType, [0]] call CBA_fnc_getTurret;
diff --git a/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf b/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf
index 5230fccf521..f3a6bbde5f9 100644
--- a/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf
+++ b/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf
@@ -1,11 +1,11 @@
#include "..\script_component.hpp"
/*
* Author: PabstMirror
- * Helper function for ace_rearm; Gets magazines that should be loaded by csw
+ * Helper function for ace_rearm; Gets magazines that should be loaded by csw.
*
* Arguments:
- * 0: Vehicle
- * 1: Specific Turret or pass bool to check all turrets (default: true)
+ * 0: CSW
+ * 1: Specific Turret or pass bool to check all turrets (default: true)
*
* Return Value:
* [0: compatible veh mags, 1: carry mags]
diff --git a/addons/csw/functions/fnc_ai_handleFired.sqf b/addons/csw/functions/fnc_ai_handleFired.sqf
index d92e517091b..4a6615f4043 100644
--- a/addons/csw/functions/fnc_ai_handleFired.sqf
+++ b/addons/csw/functions/fnc_ai_handleFired.sqf
@@ -1,7 +1,7 @@
#include "..\script_component.hpp"
/*
* Author: PabstMirror
- * Handles AI Fired EH
+ * Handles AI Fired EH.
*
* Arguments:
* Fired EH
@@ -12,6 +12,8 @@
* Public: No
*/
+if (GVAR(ammoHandling) != 2) exitWith {};
+
params ["_vehicle", "_weapon", "", "", "", "_magazine", "", "_gunner"];
TRACE_4("firedEH:",_vehicle,_weapon,_magazine,_gunner);
diff --git a/addons/csw/functions/fnc_ai_handleGetIn.sqf b/addons/csw/functions/fnc_ai_handleGetIn.sqf
index f14a4ccbc7a..bbbddaf537f 100644
--- a/addons/csw/functions/fnc_ai_handleGetIn.sqf
+++ b/addons/csw/functions/fnc_ai_handleGetIn.sqf
@@ -1,7 +1,7 @@
#include "..\script_component.hpp"
/*
- * Author: Grim
- * Handles AI GetIn on an empty weapon
+ * Author: LinkIsGrim
+ * Handles AI GetIn on an empty CSW.
*
* Arguments:
* GetIn EH
@@ -12,6 +12,8 @@
* Public: No
*/
+if (GVAR(ammoHandling) != 2) exitWith {};
+
params ["_vehicle", "", "_gunner"];
TRACE_2("getInEH:",_vehicle,_gunner);
diff --git a/addons/csw/functions/fnc_ai_reload.sqf b/addons/csw/functions/fnc_ai_reload.sqf
index 4d6234f94a9..288d718a2f7 100644
--- a/addons/csw/functions/fnc_ai_reload.sqf
+++ b/addons/csw/functions/fnc_ai_reload.sqf
@@ -1,10 +1,10 @@
#include "..\script_component.hpp"
/*
- * Author: PabstMirror, modified by Grim
- * Handles AI reloading
+ * Author: PabstMirror, LinkIsGrim
+ * Handles AI reloading.
*
* Arguments:
- * 0: Static Weapon
+ * 0: CSW
* 1: Gunner
* 2: Weapon
* 3: Magazine (default: "")
@@ -15,7 +15,7 @@
* Public: No
*/
-params ["_staticWeapon", "_gunner", "_weapon", ["_magazine", ""]];
+params ["_vehicle", "_gunner", "_weapon", ["_magazine", ""]];
private _turretPath = [_gunner] call EFUNC(common,getTurretIndex);
private _reloadSource = objNull;
@@ -24,7 +24,7 @@ private _reloadNeededAmmo = -1;
private _cfgMagGroups = configFile >> QGVAR(groups);
-private _nearSupplies = [_gunner] + ((_staticWeapon nearSupplies 10) select {
+private _nearSupplies = [_gunner] + ((_vehicle nearSupplies 10) select {
isNull (group _x) ||
{!([_x] call EFUNC(common,isPlayer)) && {[side group _gunner, side group _x] call BIS_fnc_sideIsFriendly}}
});
@@ -49,7 +49,7 @@ private _nearSupplies = [_gunner] + ((_staticWeapon nearSupplies 10) select {
private _xWeaponMag = _x;
{
if ((getNumber (_cfgMagGroups >> _x >> _xWeaponMag)) == 1) then {
- private _loadInfo = [_staticWeapon, _turretPath, _x, _xSource] call FUNC(reload_canLoadMagazine);
+ private _loadInfo = [_vehicle, _turretPath, _x, _xSource] call FUNC(reload_canLoadMagazine);
if (_loadInfo select 0) then {
_reloadMag = _x;
_reloadSource = _xSource;
@@ -81,16 +81,16 @@ if (_bestAmmoToSend == -1) exitWith {ERROR("No ammo");};
[_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");
+if (!isNull(configOf _vehicle >> QUOTE(ADDON) >> "ammoLoadTime")) then {
+ _timeToLoad = getNumber(configOf _vehicle >> 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);};
+ params ["_vehicle", "_turretPath", "_gunner", "_reloadMag", "_bestAmmoToSend"];
+ if ((!alive _vehicle) || {!alive _gunner} || {(_vehicle distance _gunner) > 10}) exitWith {TRACE_1("invalid state",_this);};
// Reload the static weapon
- TRACE_5("calling addTurretMag event",_staticWeapon,_turretPath,_gunner,_reloadMag,_bestAmmoToSend);
+ TRACE_5("calling addTurretMag event",_vehicle,_turretPath,_gunner,_reloadMag,_bestAmmoToSend);
[QGVAR(addTurretMag), _this] call CBA_fnc_globalEvent;
-}, [_staticWeapon, _turretPath, _gunner, _reloadMag, _bestAmmoToSend], _timeToLoad] call CBA_fnc_waitAndExecute;
+}, [_vehicle, _turretPath, _gunner, _reloadMag, _bestAmmoToSend], _timeToLoad] call CBA_fnc_waitAndExecute;
diff --git a/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf b/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf
index 65dd81cc417..12d00ca44e9 100644
--- a/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf
+++ b/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf
@@ -1,14 +1,14 @@
#include "..\script_component.hpp"
/*
* Author: tcvm
- * Checks if you can deploy a weapon on the tripod
+ * Checks if you can deploy a weapon on the tripod.
*
* Arguments:
- * 0: Target Tripod
+ * 0: Target
* 1: Player
*
* Return Value:
- * Wether or not you can deploy the weapon
+ * Whether or not you can deploy the weapon
*
* Example:
* [cursorObject, player] call ace_csw_fnc_assemble_canDeployWeapon
@@ -20,4 +20,7 @@ params ["_target", "_player"];
// If the current launcher has a config-value that defines the tripod, it is a CSW
(alive _target) &&
-{(getText (configFile >> "CfgWeapons" >> secondaryWeapon _player >> QUOTE(ADDON) >> "assembleTo" >> typeOf _target)) != ""}
+{
+ (getText (configFile >> "CfgWeapons" >> secondaryWeapon _player >> QUOTE(ADDON) >> "assembleTo" >> typeOf _target)) != "" ||
+ {(getText (configFile >> "CfgWeapons" >> primaryWeapon _player >> QUOTE(ADDON) >> "assembleTo" >> typeOf _target)) != ""}
+}
diff --git a/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf b/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf
index 0d508bfa896..3228373b401 100644
--- a/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf
+++ b/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf
@@ -1,23 +1,23 @@
#include "..\script_component.hpp"
/*
* Author: tcvm
- * If the CSW is mounted or in use this will not allow you to dismount the weapon
+ * If the CSW is mounted or in use this will not allow you to dismount the weapon.
*
* Arguments:
- * 0: Static Weapon
+ * 0: CSW
*
* Return Value:
- * Can Dismount
+ * Can dismount weapon
*
* Example:
- * [cursorObject] call ace_csw_fnc_assemble_canPickupWeapon
+ * cursorObject call ace_csw_fnc_assemble_canPickupWeapon
*
* Public: No
*/
-params ["_staticWeapon"];
+params ["_vehicle"];
// Assembly mode: [0=disabled, 1=enabled, 2=enabled&unload, 3=default]
-private _assemblyMode = [false, true, true, GVAR(defaultAssemblyMode)] select (_staticWeapon getVariable [QGVAR(assemblyMode), 3]);
+private _assemblyMode = [false, true, true, GVAR(defaultAssemblyMode)] select (_vehicle getVariable [QGVAR(assemblyMode), 3]);
-_assemblyMode && {alive _staticWeapon} && {((crew _staticWeapon) findIf {alive _x && {!unitIsUAV _x}}) == -1} // return
+_assemblyMode && {alive _vehicle} && {((crew _vehicle) findIf {alive _x && {!unitIsUAV _x}}) == -1} // return
diff --git a/addons/csw/functions/fnc_assemble_deployTripod.sqf b/addons/csw/functions/fnc_assemble_deployTripod.sqf
index 29cc4b58763..e0a058a1af0 100644
--- a/addons/csw/functions/fnc_assemble_deployTripod.sqf
+++ b/addons/csw/functions/fnc_assemble_deployTripod.sqf
@@ -1,7 +1,7 @@
#include "..\script_component.hpp"
/*
* Author: tcvm
- * Deploys the tripod
+ * Deploys the tripod.
*
* Arguments:
* 0: Unit
@@ -10,7 +10,7 @@
* None
*
* Example:
- * [player] call ace_csw_fnc_assemble_deployTripod
+ * player call ace_csw_fnc_assemble_deployTripod
*
* Public: No
*/
@@ -34,7 +34,7 @@
_args params ["_player", "_secondaryWeaponClassname", "_secondaryWeaponInfo"];
TRACE_3("deployTripod finish",_player,_secondaryWeaponClassname,_secondaryWeaponInfo);
- private _tripodClassname = getText(configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deploy");
+ private _tripodClassname = getText (configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deploy");
// Create a tripod
private _cswTripod = createVehicle [_tripodClassname, [0, 0, 0], [], 0, "NONE"];
@@ -58,9 +58,8 @@
_cswTripod setVariable [QGVAR(secondaryWeaponMagazines), _secondaryWeaponMagazines, true];
};
- if (!GVAR(defaultAssemblyMode)) then {
- [_cswTripod, "disableWeaponAssembly", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
- };
+ // Disable vanilla assembly until FUNC(initVehicle) runs and sets the definite value
+ [_cswTripod, "disableWeaponAssembly", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
private _posATL = _player getRelPos [2, 0];
_posATL set [2, ((getPosATL _player) select 2) + 0.5];
@@ -96,6 +95,6 @@
} forEach _secondaryWeaponInfo;
};
- private _deployTime = getNumber(configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deployTime");
+ private _deployTime = getNumber (configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deployTime");
[TIME_PROGRESSBAR(_deployTime), [_player, _secondaryWeaponClassname, _secondaryWeaponInfo], _onFinish, _onFailure, LLSTRING(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 974bf034319..a0cdc102ca8 100644
--- a/addons/csw/functions/fnc_assemble_deployWeapon.sqf
+++ b/addons/csw/functions/fnc_assemble_deployWeapon.sqf
@@ -1,11 +1,11 @@
#include "..\script_component.hpp"
/*
* Author: tcvm
- * Deploys the current CSW
+ * Deploys the current CSW.
*
* Arguments:
* 0: Target
- * 1: Unit
+ * 1: Player
* 2: Args
* 3: Action Data
*
@@ -21,8 +21,19 @@
[{
params ["_tripod", "_player"];
+ private _tripodClassname = typeOf _tripod;
+ private _assembledClassname = getText (configFile >> "CfgWeapons" >> secondaryWeapon _player >> QUOTE(ADDON) >> "assembleTo" >> _tripodClassname);
+ private _index = 1;
+
+ if (_assembledClassname == "") then {
+ _assembledClassname = getText (configFile >> "CfgWeapons" >> primaryWeapon _player >> QUOTE(ADDON) >> "assembleTo" >> _tripodClassname);
+ _index = 0;
+ };
+
+ if (!isClass (configFile >> "CfgVehicles" >> _assembledClassname)) exitWith {ERROR_1("bad static classname [%1]",_assembledClassname);};
+
// Save magazines and attachments (handle loaded launchers which can become csw like CUP Metis)
- private _carryWeaponInfo = (getUnitLoadout _player) select 1;
+ private _carryWeaponInfo = (getUnitLoadout _player) select _index;
private _carryWeaponClassname = _carryWeaponInfo deleteAt 0;
// Remove empty entries
@@ -30,21 +41,15 @@
TRACE_3("assemble_deployWeapon_carryWeaponClassname",_tripod,_player,_carryWeaponClassname);
- private _tripodClassname = typeOf _tripod;
- private _weaponConfig = configfile >> "CfgWeapons" >> _carryWeaponClassname >> QUOTE(ADDON);
- private _assembledClassname = getText (_weaponConfig >> "assembleTo" >> _tripodClassname);
-
- if (!isClass (configFile >> "CfgVehicles" >> _assembledClassname)) exitWith {ERROR_1("bad static classname [%1]",_assembledClassname);};
-
_player removeWeaponGlobal _carryWeaponClassname;
- private _deployTime = getNumber (_weaponConfig >> "deployTime");
+ private _deployTime = getNumber (configFile >> "CfgWeapons" >> _carryWeaponClassname >> QUOTE(ADDON) >> "deployTime");
TRACE_4("",_carryWeaponClassname,_tripodClassname,_assembledClassname,_deployTime);
private _onFinish = {
params ["_args"];
- _args params ["_tripod", "_player", "_assembledClassname", "", "_carryWeaponInfo"];
+ _args params ["_tripod", "_player", "_assembledClassname", "_tripodClassname", "_carryWeaponClassname", "_carryWeaponInfo"];
TRACE_3("deployWeapon finish",_tripod,_player,_assembledClassname);
private _secondaryWeaponMagazines = _tripod getVariable [QGVAR(secondaryWeaponMagazines), []];
@@ -56,10 +61,11 @@
_tripodPos set [2, (_tripodPos select 2) + 0.1];
// Delay a frame so tripod has a chance to be deleted
[{
- params ["_assembledClassname", "_tripodDir", "_tripodPos", "_player", "_carryWeaponInfo", "_secondaryWeaponMagazines"];
+ params ["_assembledClassname", "_componentClasses", "_tripodDir", "_tripodPos", "_player", "_carryWeaponInfo", "_secondaryWeaponMagazines"];
private _csw = createVehicle [_assembledClassname, [0, 0, 0], [], 0, "NONE"];
// Assembly mode: [0=disabled, 1=enabled, 2=enabled&unload, 3=default]
_csw setVariable [QGVAR(assemblyMode), 2, true]; // Explicitly set advanced assembly mode + unload, and broadcast
+ _csw setVariable [QGVAR(componentClasses), _componentClasses, true];
{
// Magazines
@@ -76,9 +82,9 @@
_csw setVariable [QGVAR(secondaryWeaponMagazines), _secondaryWeaponMagazines, true];
};
- if (!GVAR(defaultAssemblyMode)) then {
- [_csw, "disableWeaponAssembly", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
- };
+ // Disable vanilla assembly until FUNC(initVehicle) runs and sets the definite value
+ [_csw, "disableWeaponAssembly", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
+
_csw setDir _tripodDir;
_csw setPosATL _tripodPos;
if ((_tripodPos select 2) < 0.5) then {
@@ -86,12 +92,12 @@
};
[QGVAR(deployWeaponSucceeded), [_csw]] call CBA_fnc_localEvent;
TRACE_2("csw placed",_csw,_assembledClassname);
- }, [_assembledClassname, _tripodDir, _tripodPos, _player, _carryWeaponInfo, _secondaryWeaponMagazines]] call CBA_fnc_execNextFrame;
+ }, [_assembledClassname, [_tripodClassname, _carryWeaponClassname], _tripodDir, _tripodPos, _player, _carryWeaponInfo, _secondaryWeaponMagazines]] call CBA_fnc_execNextFrame;
};
private _onFailure = {
params ["_args"];
- _args params ["", "_player", "", "_carryWeaponClassname", "_carryWeaponInfo"];
+ _args params ["", "_player", "", "", "_carryWeaponClassname", "_carryWeaponInfo"];
TRACE_2("deployWeapon failure",_player,_carryWeaponClassname);
// Add weapon back
@@ -110,5 +116,5 @@
alive _tripod
};
- [TIME_PROGRESSBAR(_deployTime), [_tripod, _player, _assembledClassname, _carryWeaponClassname, _carryWeaponInfo], _onFinish, _onFailure, LLSTRING(AssembleCSW_progressBar), _condition] call EFUNC(common,progressBar);
+ [TIME_PROGRESSBAR(_deployTime), [_tripod, _player, _assembledClassname, _tripodClassname, _carryWeaponClassname, _carryWeaponInfo], _onFinish, _onFailure, LLSTRING(AssembleCSW_progressBar), _condition] call EFUNC(common,progressBar);
}, _this] call CBA_fnc_execNextFrame;
diff --git a/addons/csw/functions/fnc_assemble_deployWeaponModifier.sqf b/addons/csw/functions/fnc_assemble_deployWeaponModifier.sqf
index 85b13464156..f3f1fd7bfcb 100644
--- a/addons/csw/functions/fnc_assemble_deployWeaponModifier.sqf
+++ b/addons/csw/functions/fnc_assemble_deployWeaponModifier.sqf
@@ -1,7 +1,7 @@
#include "..\script_component.hpp"
/*
* Author: PabstMirror
- * Modifies interaction for deploying weapon
+ * Modifies interaction for deploying weapon.
*
* Arguments:
* 0: Target
@@ -20,9 +20,14 @@
params ["_target", "_player", "", "_actionData"];
-private _carryWeaponClassname = secondaryWeapon _player;
-private _assembleTo = (getText(configFile >> "CfgWeapons" >> _carryWeaponClassname >> QUOTE(ADDON) >> "assembleTo" >> (typeOf _target)));
-private _icon = getText (configFile >> "CfgVehicles" >> _assembleTo >> "picture");
-TRACE_2("",_assembleTo,_icon);
+private _tripodClassname = typeOf _target;
+private _assembledClassname = getText (configFile >> "CfgWeapons" >> secondaryWeapon _player >> QUOTE(ADDON) >> "assembleTo" >> _tripodClassname);
+
+if (_assembledClassname == "") then {
+ _assembledClassname = getText (configFile >> "CfgWeapons" >> primaryWeapon _player >> QUOTE(ADDON) >> "assembleTo" >> _tripodClassname);
+};
+
+private _icon = getText (configFile >> "CfgVehicles" >> _assembledClassname >> "picture");
+TRACE_2("",_assembledClassname,_icon);
_actionData set [2, _icon];
diff --git a/addons/csw/functions/fnc_assemble_pickupTripod.sqf b/addons/csw/functions/fnc_assemble_pickupTripod.sqf
index 0996c0f3d3b..c09400a87f6 100644
--- a/addons/csw/functions/fnc_assemble_pickupTripod.sqf
+++ b/addons/csw/functions/fnc_assemble_pickupTripod.sqf
@@ -1,11 +1,11 @@
#include "..\script_component.hpp"
/*
* Author: tcvm
- * Picks up the tripod and adds it to the player launcher slot
+ * Picks up the tripod and adds it to the player launcher slot.
*
* Arguments:
* 0: Tripod
- * 1: Unit
+ * 1: Player
*
* Return Value:
* None
@@ -56,7 +56,7 @@
if (isNull _weaponHolder || {_tripodPos distance _weaponHolder > 2}) then {
_weaponHolder = createVehicle ["GroundWeaponHolder", [0, 0, 0], [], 0, "CAN_COLLIDE"];
_weaponHolder setDir random [0, 180, 360];
- _weaponHolder setVehiclePosition [_tripodPos, [], 0, "CAN_COLLIDE"]; // places object on surface below
+ _weaponHolder setVehiclePosition [_tripodPos, [], 0, "CAN_COLLIDE"]; // Places object on surface below
};
_weaponHolder addWeaponCargoGlobal [_tripodClassname, 1];
diff --git a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf
index 468f385efaf..023143710b6 100644
--- a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf
+++ b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf
@@ -1,11 +1,11 @@
#include "..\script_component.hpp"
/*
* Author: tcvm
- * Dismounts the weapon from the tripod and drops its backpack beside
+ * Dismounts the weapon from the tripod and drops its backpack beside.
*
* Arguments:
- * 0: Static Weapon
- * 1: Unit
+ * 0: CSW
+ * 1: Player
*
* Return Value:
* None
@@ -17,18 +17,22 @@
*/
[{
- params ["_staticWeapon", "_player"];
- TRACE_2("assemble_pickupWeapon",_staticWeapon,_player);
+ params ["_vehicle", "_player"];
+ TRACE_2("assemble_pickupWeapon",_vehicle,_player);
- private _weaponConfig = configOf _staticWeapon >> QUOTE(ADDON);
- private _carryWeaponClassname = getText (_weaponConfig >> "disassembleWeapon");
+ private _weaponConfig = configOf _vehicle >> QUOTE(ADDON);
+ private _componentClasses = _vehicle getVariable QGVAR(componentClasses);
+
+ (if (!isNil "_componentClasses") then {
+ _componentClasses
+ } else {
+ [getText (_weaponConfig >> "disassembleTurret"), getText (_weaponConfig >> "disassembleWeapon")]
+ }) params ["_turretClassname", "_carryWeaponClassname"];
if (!isClass (configFile >> "CfgWeapons" >> _carryWeaponClassname)) exitWith {
ERROR_1("bad weapon classname [%1]",_carryWeaponClassname);
};
- private _turretClassname = getText (_weaponConfig >> "disassembleTurret");
-
// Turret classname can equal nothing if the deploy bag is the "whole" weapon. e.g Kornet, Metis, other ATGMs
if ((_turretClassname != "") && {!isClass (configFile >> "CfgVehicles" >> _turretClassname)}) exitWith {
ERROR_1("bad turret classname [%1]",_turretClassname);
@@ -37,15 +41,15 @@
private _onDisassembleFunc = getText (_weaponConfig >> "disassembleFunc");
private _pickupTime = getNumber (configFile >> "CfgWeapons" >> _carryWeaponClassname >> QUOTE(ADDON) >> "pickupTime");
- TRACE_4("",typeOf _staticWeapon,_carryWeaponClassname,_turretClassname,_pickupTime);
+ TRACE_4("",typeOf _vehicle,_carryWeaponClassname,_turretClassname,_pickupTime);
private _onFinish = {
params ["_args"];
- _args params ["_staticWeapon", "_player", "_carryWeaponClassname", "_turretClassname", "_onDisassembleFunc"];
- TRACE_4("disassemble finish",_staticWeapon,_player,_carryWeaponClassname,_turretClassname);
+ _args params ["_vehicle", "_player", "_carryWeaponClassname", "_turretClassname", "_onDisassembleFunc"];
+ TRACE_4("disassemble finish",_vehicle,_player,_carryWeaponClassname,_turretClassname);
- private _weaponPos = (getPosATL _staticWeapon) vectorAdd [0, 0, 0.1];
- private _weaponDir = getDir _staticWeapon;
+ private _weaponPos = (getPosATL _vehicle) vectorAdd [0, 0, 0.1];
+ private _weaponDir = getDir _vehicle;
private _carryWeaponMag = [];
private _carryWeaponMags = compatibleMagazines _carryWeaponClassname;
@@ -58,13 +62,15 @@
if (_carryWeaponMag isEqualTo [] && {_carryMag in _carryWeaponMags}) then {
TRACE_3("Adding mag to secondary weapon",_xMag,_xAmmo,_carryMag);
_carryWeaponMag = [_carryMag, _xAmmo];
- DEC(_xAmmo);
+
+ // Do not return this magazine, as it will be put into the weapon
+ continue;
};
if ((_xAmmo > 0) && {_carryMag != ""}) then {
TRACE_2("Removing ammo",_xMag,_carryMag);
[_player, _carryMag, _xAmmo] call FUNC(reload_handleReturnAmmo);
};
- } forEach (magazinesAllTurrets _staticWeapon);
+ } forEach (magazinesAllTurrets _vehicle);
if (_turretClassname isNotEqualTo "") then {
private _cswTripod = createVehicle [_turretClassname, [0, 0, 0], [], 0, "NONE"];
@@ -76,14 +82,25 @@
_cswTripod setVelocity [0, 0, -0.05];
_cswTripod setVectorUp (surfaceNormal _weaponPos);
}, [_cswTripod, _weaponDir, _weaponPos]] call CBA_fnc_execNextFrame;
- [_cswTripod, _staticWeapon] call (missionNamespace getVariable _onDisassembleFunc);
+ [_cswTripod, _vehicle] call (missionNamespace getVariable _onDisassembleFunc);
};
[{
params ["_player", "_weaponPos", "_carryWeaponClassname", "_carryWeaponMag", "_turretClassname"];
+ private _carryWeaponType = _carryWeaponClassname call EFUNC(common,getWeaponType);
+
+ if !(_carryWeaponType in [1, 2]) exitWith {
+ ERROR_1("bad carry weapon type [%1]",_carryWeaponClassname);
+
+ if (_carryWeaponMag isEqualTo []) exitWith {};
+
+ // Return the ammo, so it doesn't vanish
+ [_player, _carryWeaponMag select 0, _carryWeaponMag select 1] call FUNC(reload_handleReturnAmmo);
+ };
+
// Give the weapon to the player if possible
- if ((alive _player) && {(secondaryWeapon _player) == ""}) exitWith {
+ if ((alive _player) && {([primaryWeapon _player, secondaryWeapon _player] select (_carryWeaponType - 1)) == ""}) exitWith {
[_player, _carryWeaponClassname] call CBA_fnc_addWeaponWithoutItems;
if (_carryWeaponMag isNotEqualTo []) then {
@@ -99,7 +116,7 @@
// Create a new weapon holder (don't try to get an existing one, as no guarantee where it could be)
private _weaponHolder = createVehicle ["GroundWeaponHolder", [0, 0, 0], [], 0, "CAN_COLLIDE"];
_weaponHolder setDir random [0, 180, 360];
- _weaponHolder setVehiclePosition [_weaponPos, [], 0, "CAN_COLLIDE"]; // places object on surface below
+ _weaponHolder setVehiclePosition [_weaponPos, [], 0, "CAN_COLLIDE"]; // Places object on surface below
_weaponHolder addWeaponWithAttachmentsCargoGlobal [[_carryWeaponClassname, "", "", "", _carryWeaponMag, [], ""], 1];
}, [_player, _weaponPos, _carryWeaponClassname, _carryWeaponMag, _turretClassname]] call CBA_fnc_execNextFrame;
@@ -108,23 +125,23 @@
// Eject dead units (all crew are dead or UAV at this point, otherwise condition would have failed), but ignore UAV units
{
if (unitIsUAV _x) then {
- _staticWeapon deleteVehicleCrew _x;
+ _vehicle deleteVehicleCrew _x;
} else {
moveOut _x;
};
- } forEach (crew _staticWeapon);
+ } forEach (crew _vehicle);
- deleteVehicle _staticWeapon;
+ deleteVehicle _vehicle;
LOG("end");
};
private _condition = {
params ["_args"];
- _args params ["_staticWeapon"];
+ _args params ["_vehicle"];
- _staticWeapon call FUNC(assemble_canPickupWeapon)
+ _vehicle call FUNC(assemble_canPickupWeapon)
};
- [TIME_PROGRESSBAR(_pickupTime), [_staticWeapon, _player, _carryWeaponClassname, _turretClassname, _onDisassembleFunc], _onFinish, {}, LLSTRING(DisassembleCSW_progressBar), _condition] call EFUNC(common,progressBar);
+ [TIME_PROGRESSBAR(_pickupTime), [_vehicle, _player, _carryWeaponClassname, _turretClassname, _onDisassembleFunc], _onFinish, {}, LLSTRING(DisassembleCSW_progressBar), _condition] call EFUNC(common,progressBar);
}, _this] call CBA_fnc_execNextFrame;
diff --git a/addons/csw/functions/fnc_canDeployTripod.sqf b/addons/csw/functions/fnc_canDeployTripod.sqf
index 8969758e4d4..9eb7f0a133a 100644
--- a/addons/csw/functions/fnc_canDeployTripod.sqf
+++ b/addons/csw/functions/fnc_canDeployTripod.sqf
@@ -1,10 +1,10 @@
#include "..\script_component.hpp"
/*
* Author: tcvm
- * Checks if the unit can deploy a tripod
+ * Checks if the player can deploy the tripod.
*
* Arguments:
- * 0: Unit
+ * 0: Player
*
* Return Value:
* Can deploy
@@ -15,8 +15,8 @@
* Public: No
*/
-params ["_unit"];
+params ["_player"];
-private _secondaryWeapon = secondaryWeapon _unit;
+private _secondaryWeapon = secondaryWeapon _player;
_secondaryWeapon != "" && {getText (configFile >> "CfgWeapons" >> _secondaryWeapon >> QUOTE(ADDON) >> "type") == "mount"} // return
diff --git a/addons/csw/functions/fnc_canGetIn.sqf b/addons/csw/functions/fnc_canGetIn.sqf
index 16446c4fb23..9e017c16ef0 100644
--- a/addons/csw/functions/fnc_canGetIn.sqf
+++ b/addons/csw/functions/fnc_canGetIn.sqf
@@ -1,10 +1,10 @@
#include "..\script_component.hpp"
/*
* Author: tcvm
- * Checks if it's possible to get in the CSW
+ * Checks if it's possible to get in the CSW.
*
* Arguments:
- * 0: Vehicle
+ * 0: CSW
*
* Return Value:
* None
diff --git a/addons/csw/functions/fnc_canPickupTripod.sqf b/addons/csw/functions/fnc_canPickupTripod.sqf
index 2ec3b065da0..bf25b5a9e87 100644
--- a/addons/csw/functions/fnc_canPickupTripod.sqf
+++ b/addons/csw/functions/fnc_canPickupTripod.sqf
@@ -1,17 +1,16 @@
#include "..\script_component.hpp"
/*
* Author: tcvm
- * Checks if the unit can pickup the tripod
+ * Checks if the player can pickup the tripod.
*
* Arguments:
* 0: Tripod
- * 1: Unit (not used)
*
* Return Value:
* Can pickup
*
* Example:
- * [cursorObject, player] call ace_csw_fnc_canPickupTripod
+ * cursorObject call ace_csw_fnc_canPickupTripod
*
* Public: No
*/
diff --git a/addons/csw/functions/fnc_getCarryMagazine.sqf b/addons/csw/functions/fnc_getCarryMagazine.sqf
index 81e07c6f103..3d94ca2fe1c 100644
--- a/addons/csw/functions/fnc_getCarryMagazine.sqf
+++ b/addons/csw/functions/fnc_getCarryMagazine.sqf
@@ -1,7 +1,7 @@
#include "..\script_component.hpp"
/*
* Author: PabstMirror, Dystopian
- * Gets magazine that the player can carry, suitable to vehicle magazine
+ * Gets magazine that the player can carry, suitable to vehicle magazine.
*
* Arguments:
* 0: Vehicle Magazine
diff --git a/addons/csw/functions/fnc_getLoadActions.sqf b/addons/csw/functions/fnc_getLoadActions.sqf
index e505c7f50fb..59b368b3686 100644
--- a/addons/csw/functions/fnc_getLoadActions.sqf
+++ b/addons/csw/functions/fnc_getLoadActions.sqf
@@ -1,10 +1,10 @@
#include "..\script_component.hpp"
/*
* Author: PabstMirror
- * Gets sub actions for what the unit can load into the CSW
+ * Gets sub actions for what the player can load into the CSW.
*
* Arguments:
- * 0: Vehicle
+ * 0: CSW
* 1: Unit
*
* Return Value:
@@ -32,10 +32,11 @@ private _condition = {
params ["_target", "_player", "_args"];
_args params ["_carryMag", "_turretPath", "", "_magSource"];
- ([_target, _turretPath, _carryMag, _magSource] call FUNC(reload_canLoadMagazine)) select 0
+ [_player, _target] call EFUNC(interaction,canInteractWithVehicleCrew) &&
+ {([_target, _turretPath, _carryMag, _magSource] call FUNC(reload_canLoadMagazine)) select 0}
};
-private _cfgMagazines = configFile >> "CfgMagazines"; // micro-optimization
+private _cfgMagazines = configFile >> "CfgMagazines"; // Micro-optimization
private _actions = [];
{
_x params ["_carryMag", "", "_loadInfo"];
diff --git a/addons/csw/functions/fnc_getUnloadActions.sqf b/addons/csw/functions/fnc_getUnloadActions.sqf
index dd119b06226..1c7b629ebcc 100644
--- a/addons/csw/functions/fnc_getUnloadActions.sqf
+++ b/addons/csw/functions/fnc_getUnloadActions.sqf
@@ -32,6 +32,7 @@ private _statement = {
TIME_PROGRESSBAR(_timeToUnload),
[_target, _turretPath, _player, _carryMag, _vehMag],
{
+ //IGNORE_PRIVATE_WARNING ["_player"];
(_this select 0) params ["_target", "_turretPath", "", "_carryMag", "_vehMag"];
TRACE_5("unload progressBar finish",_target,_turretPath,_carryMag,_vehMag,_player);
[QGVAR(removeTurretMag), [_target, _turretPath, _carryMag, _vehMag, _player]] call CBA_fnc_globalEvent;
@@ -46,7 +47,9 @@ private _statement = {
private _condition = {
params ["_target", "_player", "_args"];
_args params ["_vehMag", "_turretPath", "_carryMag"];
- [_target, _turretPath, _player, _carryMag, _vehMag] call FUNC(reload_canUnloadMagazine)
+
+ [_player, _target] call EFUNC(interaction,canInteractWithVehicleCrew) &&
+ {[_target, _turretPath, _player, _carryMag, _vehMag] call FUNC(reload_canUnloadMagazine)}
};
private _actions = [];
diff --git a/addons/csw/functions/fnc_initVehicle.sqf b/addons/csw/functions/fnc_initVehicle.sqf
index 2d7241029f8..1c4660260fd 100644
--- a/addons/csw/functions/fnc_initVehicle.sqf
+++ b/addons/csw/functions/fnc_initVehicle.sqf
@@ -1,7 +1,7 @@
#include "..\script_component.hpp"
/*
* Author: tcvm
- * Initializes CSW systems on vehicle
+ * Initializes CSW systems on vehicle.
*
* Arguments:
* 0: Vehicle
@@ -34,30 +34,33 @@ if (_configEnabled && {GVAR(ammoHandling) == 2}) then {
};
TRACE_2("",local _vehicle,_vehicle turretLocal [0]);
-if (_configEnabled && {_vehicle turretLocal [0]}) then { // if turret is local to us, then handle mags/weapon
- [{
- params ["_vehicle"];
- if (!alive _vehicle) exitWith { TRACE_1("dead/deleted",_vehicle); };
- // Assembly mode: [0=disabled, 1=enabled, 2=enabled&unload, 3=default]
- private _assemblyModeIndex = _vehicle getVariable [QGVAR(assemblyMode), 3];
+
+if (_vehicle turretLocal [0]) then {
+ // Assembly mode: [0=disabled, 1=enabled, 2=enabled&unload, 3=default]
+ private _assemblyModeIndex = _vehicle getVariable [QGVAR(assemblyMode), 3];
+ private _assemblyMode = [false, true, true, GVAR(defaultAssemblyMode)] select _assemblyModeIndex;
+
+ TRACE_2("turretLocal",_vehicle,_assemblyMode);
+
+ // If turret is local, handle unloading mags and proxy weapons
+ if (_configEnabled) then {
+ TRACE_2("config enabled",_vehicle,_assemblyMode);
+
private _emptyWeapon = _assemblyModeIndex isEqualTo 2;
- private _assemblyMode = [false, true, true, GVAR(defaultAssemblyMode)] select _assemblyModeIndex;
- TRACE_2("turretLocal",_vehicle,_assemblyMode);
+
[_vehicle, [0], _assemblyMode, _emptyWeapon] call FUNC(proxyWeapon);
- [_vehicle, _assemblyMode, _emptyWeapon] call FUNC(staticWeaponInit_unloadExtraMags);
- }, [_vehicle]] call CBA_fnc_execNextFrame; // need to wait a frame to allow setting object vars during assembly
-};
-if (_assemblyConfig) then {
- [{
- params ["_vehicle"];
- if (!alive _vehicle) exitWith { TRACE_1("dead/deleted",_vehicle); };
- private _assemblyMode = [false, true, true, GVAR(defaultAssemblyMode)] select (_vehicle getVariable [QGVAR(assemblyMode), 3]);
+ if (!_assemblyMode) exitWith {};
+
+ [_vehicle, _emptyWeapon] call FUNC(staticWeaponInit_unloadExtraMags);
+ };
+
+ if (_assemblyConfig) then {
TRACE_2("assemblyConfig present",_vehicle,_assemblyMode);
- if (_assemblyMode) then { // Disable vanilla assembly if assemblyMode enabled
- [_vehicle, "disableWeaponAssembly", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
- };
- }, [_vehicle]] call CBA_fnc_execNextFrame; // need to wait a frame to allow setting object vars during assembly
+ // Disable vanilla assembly if assemblyMode enabled
+ // Need to wait to allow setting object vars during assembly, but since this function runs 1 second after vehicle init, it can run immediately
+ [_vehicle, "disableWeaponAssembly", QUOTE(ADDON), _assemblyMode] call EFUNC(common,statusEffect_set);
+ };
};
// Add interactions for players
@@ -78,7 +81,7 @@ if (hasInterface && {!(_typeOf in GVAR(initializedStaticTypes))}) then {
if ((GVAR(ammoHandling) == 0) && {!([false, true, true, GVAR(defaultAssemblyMode)] select (_target getVariable [QGVAR(assemblyMode), 3]))}) exitWith { false };
[_player, _target, ["isNotSwimming", "isNotSitting"]] call EFUNC(common,canInteractWith)
};
- private _childenCode = {
+ private _childrenCode = {
BEGIN_COUNTER(getActions); // can remove for final release
private _ret = (call FUNC(getLoadActions)) + (call FUNC(getUnloadActions));
END_COUNTER(getActions);
@@ -86,17 +89,25 @@ if (hasInterface && {!(_typeOf in GVAR(initializedStaticTypes))}) then {
};
if (_configEnabled && {_magazineLocation != ""}) then {
private _positionCode = compile _magazineLocation;
- private _ammoAction = [QGVAR(magazine), LLSTRING(AmmoHandling_displayName), "", {}, _condition, _childenCode, [], _positionCode, 4] call EFUNC(interact_menu,createAction);
+ private _ammoAction = [QGVAR(magazine), LLSTRING(AmmoHandling_displayName), "", {}, _condition, _childrenCode, [], _positionCode, 4] call EFUNC(interact_menu,createAction);
_ammoActionPath = [_typeOf, 0, [], _ammoAction] call EFUNC(interact_menu,addActionToClass);
} else {
- private _ammoAction = [QGVAR(magazine), LLSTRING(AmmoHandling_displayName), "", {}, _condition, _childenCode] call EFUNC(interact_menu,createAction);
+ private _ammoAction = [QGVAR(magazine), LLSTRING(AmmoHandling_displayName), "", {}, _condition, _childrenCode] call EFUNC(interact_menu,createAction);
_ammoActionPath = [_typeOf, 0, ["ACE_MainActions"], _ammoAction] call EFUNC(interact_menu,addActionToClass);
};
if (["ace_reload"] call EFUNC(common,isModLoaded)) then {
- // move reload's check ammo action to the ammo handling point (remove and re-add)
[_typeOf, 0, ["ACE_MainActions", QEGVAR(reload,CheckAmmo)]] call EFUNC(interact_menu,removeActionFromClass);
- private _checkAmmoAction = [QGVAR(checkAmmo), LELSTRING(reload,checkAmmo), "", EFUNC(reload,checkAmmo), EFUNC(reload,canCheckAmmo)] call EFUNC(interact_menu,createAction);
+
+ // Replace existing check ammo interaction with one that takes into account if the magazine actions are available
+ private _checkAmmoAction = [QEGVAR(reload,CheckAmmo), LELSTRING(reload,checkAmmo), "", EFUNC(reload,checkAmmo), {
+ if !((GVAR(ammoHandling) == 0) && {!([false, true, true, GVAR(defaultAssemblyMode)] select (_target getVariable [QGVAR(assemblyMode), 3]))}) exitWith { false };
+ _this call EFUNC(reload,canCheckAmmo)
+ }] call EFUNC(interact_menu,createAction);
+ [_typeOf, 0, ["ACE_MainActions"], _checkAmmoAction] call EFUNC(interact_menu,addActionToClass);
+
+ // Add another check ammo action to the ammo handling point
+ _checkAmmoAction = [QGVAR(checkAmmo), LELSTRING(reload,checkAmmo), "", EFUNC(reload,checkAmmo), EFUNC(reload,canCheckAmmo)] call EFUNC(interact_menu,createAction);
[_typeOf, 0, _ammoActionPath, _checkAmmoAction] call EFUNC(interact_menu,addActionToClass);
};
};
diff --git a/addons/csw/functions/fnc_proxyWeapon.sqf b/addons/csw/functions/fnc_proxyWeapon.sqf
index fedd1d412b3..47897c43c22 100644
--- a/addons/csw/functions/fnc_proxyWeapon.sqf
+++ b/addons/csw/functions/fnc_proxyWeapon.sqf
@@ -1,10 +1,10 @@
#include "..\script_component.hpp"
/*
* Author: tcvm, PabstMirror
- * Handles the use of proxy weapons to bypass engine reload times
+ * Handles the use of proxy weapons to fix engine-reload times.
*
* Arguments:
- * 0: Vehicle
+ * 0: CSW
* 1: Turret
* 2: Proxy weapon needed
* 2: Weapon should be emptied
@@ -21,6 +21,11 @@
params ["_vehicle", "_turret", "_needed", "_emptyWeapon"];
TRACE_4("proxyWeapon",_vehicle,_turret,_needed,_emptyWeapon);
+// addWeaponTurret/removeWeaponTurret need to be executed where turret is local
+if !(_vehicle turretLocal _turret) exitWith {
+ WARNING_2("[%1]'s turret [%2] isn't local, skipping proxy weapon change",_vehicle,_turret);
+};
+
if (_vehicle getVariable [format [QGVAR(proxyHandled_%1), _turret], false]) exitWith { TRACE_1("already handled",typeOf _vehicle); };
private _proxyWeapon = getText (configOf _vehicle >> QUOTE(ADDON) >> "proxyWeapon");
diff --git a/addons/csw/functions/fnc_reload_canLoadMagazine.sqf b/addons/csw/functions/fnc_reload_canLoadMagazine.sqf
index 70c673299af..d4049706bdb 100644
--- a/addons/csw/functions/fnc_reload_canLoadMagazine.sqf
+++ b/addons/csw/functions/fnc_reload_canLoadMagazine.sqf
@@ -1,16 +1,16 @@
#include "..\script_component.hpp"
/*
- * Author: PabstMirror &tcvm
- * Tests if unit can load a magazine into a static weapon.
+ * Author: PabstMirror, tcvm
+ * Tests if unit can load a magazine into a CSW.
*
* Arguments:
- * 0: Static Weapon
+ * 0: CSW
* 1: Turret Path
* 2: Carryable Magazine
- * 3: Supplier
+ * 3: Supplier (default: objNull)
*
* Return Value:
- * [CanLoad, LoadedMag, AmmoNeeded, IsBeltLinking]
+ * [Can Load , Loaded Mag , Ammo Needed , Is Belt Linking ]
*
* Example:
* [cursorObject, [0], "ACE_csw_100Rnd_127x99_mag_red", player] call ace_csw_fnc_reload_canLoadMagazine
@@ -28,7 +28,7 @@ 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
+ {!((_magSource isKindOf "Bag_Base") || {_magSource isKindOf "ContainerSupply"})} && // Hacky workaround for magazines within dropped backpacks
{
((_vehicle distance _magSource) > 10) ||
{((magazineCargo _magSource) findIf {_x == _carryMag}) == -1}
@@ -42,7 +42,7 @@ 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 (_cfgMagazinesCarryMag >> "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;
@@ -62,7 +62,7 @@ scopeName "main";
};
private _maxMagazineAmmo = _desiredAmmo min getNumber (_cfgMagazines >> _xMag >> "count");
if (_xAmmo >= _maxMagazineAmmo) exitWith {
- [false, _loadedMag, -6, false] breakOut "main"; // Already at capicity
+ [false, _loadedMag, -6, false] breakOut "main"; // Already at capacity
};
_ammoNeeded = _maxMagazineAmmo - _xAmmo;
_isBeltLinking = true;
diff --git a/addons/csw/functions/fnc_reload_canUnloadMagazine.sqf b/addons/csw/functions/fnc_reload_canUnloadMagazine.sqf
index 4e03625a294..d7899e655a6 100644
--- a/addons/csw/functions/fnc_reload_canUnloadMagazine.sqf
+++ b/addons/csw/functions/fnc_reload_canUnloadMagazine.sqf
@@ -1,10 +1,10 @@
#include "..\script_component.hpp"
/*
* Author: PabstMirror
- * Tests if unit can unload a magazine from a static weapon.
+ * Tests if unit can unload a magazine from a CSW.
*
* Arguments:
- * 0: Static Weapon
+ * 0: CSW
* 1: Turret Path
* 2: Player
* 3: Carryable Magazine
diff --git a/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf b/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf
index 724ee4d09cc..861f70350d1 100644
--- a/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf
+++ b/addons/csw/functions/fnc_reload_getLoadableMagazines.sqf
@@ -1,15 +1,15 @@
#include "..\script_component.hpp"
/*
* Author: PabstMirror
- * Gets magazines that the player is carrying that can be loaded into the static weapon
+ * Gets nearby magazines that can be loaded into the CSW.
*
* Arguments:
- * 0: Vehicle
- * 1: Player
+ * 0: CSW
+ * 1: Unit
*
* Return Value:
* Mags
- * [Carry Magazine , Turret Path , Load Info , Magazine Source ]
+ * [Carry Magazine , Turret Path , Load Info , Magazine Source ]
*
* Example:
* [cursorObject, player] call ace_csw_fnc_reload_getLoadableMagazines
diff --git a/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf b/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf
index 6b5b77efeec..24d21534ee2 100644
--- a/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf
+++ b/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf
@@ -4,7 +4,7 @@
* Finds the best vehicle magazines to create from a carryable magazine for a given weapon.
*
* Arguments:
- * 0: Vehicle
+ * 0: CSW
* 1: Turret
* 2: Magazine that is carryable
*
@@ -37,7 +37,7 @@ private _bestMagCount = -1;
_bestMagCount = _xAmmo;
};
};
- } forEach (getArray (configFile >> "CfgWeapons" >> _weapon >> "magazines"));
+ } forEach (compatibleMagazines _weapon);
} forEach (_vehicle weaponsTurret _turret);
TRACE_3("best fit",_desiredAmmo,_bestMag,_bestMagCount);
diff --git a/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf b/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf
index d7af22d319a..389ae699a4a 100644
--- a/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf
+++ b/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf
@@ -1,16 +1,16 @@
#include "..\script_component.hpp"
/*
* Author: tcvm, PabstMirror
- * Handles adding ammo to a turret
- * Called from a global event but only runs where turret is local
+ * Handles adding ammo to a turret.
+ * Called from a global event but only runs where turret is local.
*
* Arguments:
- * 0: Static Weapon
+ * 0: CSW
* 1: Turret Path
* 2: Source of magazine
* 3: Vehicle Magazine
* 4: Ammo in magazine
- * 5: Unit or object to return ammo to
+ * 5: Unit or object to return ammo to (default: Source of magazine)
*
* Return Value:
* None
@@ -21,7 +21,8 @@
* Public: No
*/
-params ["_vehicle", "_turret", "_magSource", "_carryMag", "_ammoReceived", ["_returnTo", _magSource]];
+params ["_vehicle", "_turret", "_magSource", "_carryMag", "_ammoReceived"];
+private _returnTo = param [5, _magSource];
TRACE_6("reload_handleAddTurretMag",_vehicle,_turret,_magSource,_carryMag,_ammoReceived,_returnTo);
TRACE_2("",local _vehicle,_vehicle turretLocal _turret);
diff --git a/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf b/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf
index 51036b525a3..dccc9b16d4c 100644
--- a/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf
+++ b/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf
@@ -1,13 +1,13 @@
#include "..\script_component.hpp"
/*
* Author: tcvm
- * Handles removing ammo from a turret
- * Called from a global event but only runs where turret is local
+ * Handles removing ammo from a turret.
+ * Called from a global event but only runs where turret is local.
*
* Arguments:
- * 0: Static Weapon
+ * 0: CSW
* 1: Turret Path
- * 2: Magainze Unit Can Carry
+ * 2: Magazine Unit Can Carry
* 3: Magazine To Remove From Static
* 4: Unit or container to unload to
*
diff --git a/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf b/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf
index ca445400b02..009a39c0d10 100644
--- a/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf
+++ b/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf
@@ -1,7 +1,7 @@
#include "..\script_component.hpp"
/*
- * Author: tcvm and PabstMirror
- * Handles returned ammo (either from unloading or leftovers from linking)
+ * Author: tcvm, PabstMirror
+ * Handles returned ammo (either from unloading or leftovers from linking).
*
* Arguments:
* 0: Man or Vehicle
@@ -18,13 +18,15 @@
*/
params ["_unloadTo", "_carryMag", "_ammo"];
-TRACE_3("reload_handleReturnAmmo",_unloadTo,_carryMag,_ammo);
+TRACE_4("reload_handleReturnAmmo",_unloadTo,typeOf _unloadTo,_carryMag,_ammo);
private _carryMaxAmmo = getNumber (configFile >> "CfgMagazines" >> _carryMag >> "count");
private _fullMagazines = floor (_ammo / _carryMaxAmmo);
private _bulletsRemaining = _ammo % _carryMaxAmmo;
-if (_unloadTo isKindOf "CaManBase") then {
+private _unloadToUnit = _unloadTo isKindOf "CAManBase";
+
+if (_unloadToUnit) then {
while {(_fullMagazines > 0) && {[_unloadTo, _carryMag] call CBA_fnc_canAddItem}} do {
_unloadTo addMagazine [_carryMag, _carryMaxAmmo];
_fullMagazines = _fullMagazines - 1;
@@ -37,19 +39,21 @@ if (_unloadTo isKindOf "CaManBase") then {
if ((_fullMagazines == 0) && {_bulletsRemaining == 0}) exitWith {};
-// Try to use existing container
-private _container = _unloadTo getVariable [QGVAR(container), objNull];
-if ((_container distance _unloadTo) > 10) then { _container = objNull; };
-if (isNull _container) then {
- _container = (nearestObjects [_unloadTo, [["GroundWeaponHolder"], [QGVAR(ammo_holder)]] select GVAR(handleExtraMagazinesType), 10]) param [0, objNull];
+// Try to use object inventory or existing container
+private _container = [_unloadTo, objNull] select _unloadToUnit;
+if ((maxLoad _container) isEqualTo 0) then {
+ _container = _unloadTo getVariable [QGVAR(container), objNull];
+ if ((_container distance _unloadTo) > 10) then { _container = objNull; };
+ if (isNull _container) then {
+ _container = (nearestObjects [_unloadTo, [["GroundWeaponHolder"], [QGVAR(ammo_holder)]] select GVAR(handleExtraMagazinesType), 10]) param [0, objNull];
+ };
};
-
if (isNull _container) then {
// Create ammo storage container
private _weaponRelPos = _unloadTo getRelPos RELATIVE_DIRECTION(270);
_weaponRelPos set [2, ((getPosATL _unloadTo) select 2) + 0.05];
- _container = createVehicle [["GroundWeaponHolder", QGVAR(ammo_holder)] select GVAR(handleExtraMagazinesType), [0, 0, 0], [], 0, "NONE"];
+ _container = createVehicle [["GroundWeaponHolder", QGVAR(ammo_holder)] select GVAR(handleExtraMagazinesType), [0, 0, 0], [], 0, "CAN_COLLIDE"];
_unloadTo setVariable [QGVAR(container), _container, true];
_container setDir random [0, 180, 360];
_container setPosATL _weaponRelPos;
@@ -59,7 +63,7 @@ if (isNull _container) then {
TRACE_2("Creating NEW Container",_container,_weaponRelPos);
};
-TRACE_3("adding to container",_container,_fullMagazines,_bulletsRemaining);
+TRACE_4("adding to container",_container,typeOf _container,_fullMagazines,_bulletsRemaining);
if (_fullMagazines > 0) then {
_container addMagazineAmmoCargo [_carryMag, _fullMagazines, _carryMaxAmmo];
diff --git a/addons/csw/functions/fnc_reload_loadMagazine.sqf b/addons/csw/functions/fnc_reload_loadMagazine.sqf
index 50081a87a5c..a5a3e07c06e 100644
--- a/addons/csw/functions/fnc_reload_loadMagazine.sqf
+++ b/addons/csw/functions/fnc_reload_loadMagazine.sqf
@@ -1,10 +1,10 @@
#include "..\script_component.hpp"
/*
* Author: PabstMirror
- * Loads a magazine into a static weapon from a magazine carried by or next to the player.
+ * Loads a magazine into a CSW from a magazine carried by or next to the player.
*
* Arguments:
- * 0: Vehicle
+ * 0: CSW
* 1: Turret
* 2: Unit Carried Magazine
* 3: Magazine source
@@ -48,12 +48,23 @@ private _onFinish = {
};
} forEach (if (_magSource isKindOf "CAManBase") then {magazinesAmmo _magSource} else {magazinesAmmoCargo _magSource});
- if (_bestAmmoToSend == -1) exitWith {ERROR_2("No ammo [%1 - %2]?",_xMag,_bestAmmoToSend);};
+ if (_bestAmmoToSend == -1) exitWith {ERROR_2("No ammo [%1 - %2]?",_carryMag,_bestAmmoToSend);};
[_magSource, _carryMag, _bestAmmoToSend] call EFUNC(common,removeSpecificMagazine);
if (_bestAmmoToSend == 0) exitWith {};
- TRACE_6("calling addTurretMag event",_vehicle,_turret,_magSource,_carryMag,_bestAmmoToSend,_unit);
- [QGVAR(addTurretMag), [_vehicle, _turret, _magSource, _carryMag, _bestAmmoToSend, _unit]] call CBA_fnc_globalEvent;
+ // Workaround for removeSpecificMagazine and WeaponHolders being deleted when empty, give back to the unit if the weapon holder was deleted
+ // TODO: Pass type and position of deleted object to create a new one
+ // TODO: Use '_magSource getEntityInfo 14' in 2.18 and the isSetForDeletion flag to execute in same frame
+ [{
+ params ["_magSource", "_unit", "_args"];
+
+ if (isNull _magSource) then {
+ _args pushBack _unit;
+ };
+
+ TRACE_1("calling addTurretMag event",_args);
+ [QGVAR(addTurretMag), _args] call CBA_fnc_globalEvent;
+ }, [_magSource, _unit, [_vehicle, _turret, _magSource, _carryMag, _bestAmmoToSend]]] call CBA_fnc_execNextFrame;
};
diff --git a/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf b/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf
index 98200840a35..975d5dbb9c2 100644
--- a/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf
+++ b/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf
@@ -1,11 +1,11 @@
#include "..\script_component.hpp"
/*
* Author: tcvm, PabstMirror
- * Dumps ammo to container
+ * Dumps ammo to container.
*
* Arguments:
- * 0: Weapon
- * 1: Using advanced assembly
+ * 0: CSW
+ * 1: Empty weapon
*
* Return Value:
* None
@@ -16,11 +16,10 @@
* Public: No
*/
-params ["_staticWeapon", "_assemblyMode", "_emptyWeapon"];
-TRACE_3("staticWeaponInit_unloadExtraMags",_staticWeapon,_assemblyMode,_emptyWeapon);
-if (!_assemblyMode) exitWith {};
+params ["_vehicle", "_emptyWeapon"];
+TRACE_2("staticWeaponInit_unloadExtraMags",_vehicle,_emptyWeapon);
-private _desiredAmmo = getNumber (configOf _staticWeapon >> QUOTE(ADDON) >> "desiredAmmo");
+private _desiredAmmo = getNumber (configOf _vehicle >> QUOTE(ADDON) >> "desiredAmmo");
private _storeExtraMagazines = GVAR(handleExtraMagazines);
if (_emptyWeapon) then {
_desiredAmmo = 0;
@@ -56,41 +55,43 @@ private _containerMagazineCount = [];
} else {
if ((_xMag select [0,4]) != "fake") then { WARNING_1("Unable to unload [%1] - No matching carry mag",_xMag); };
};
-} forEach (magazinesAllTurrets _staticWeapon);
+} forEach (magazinesAllTurrets _vehicle);
TRACE_1("Remove all loaded magazines",_magsToRemove);
{
- _staticWeapon removeMagazinesTurret _x;
+ [QEGVAR(common,removeMagazinesTurret), [_vehicle, _x select 0, _x select 1], _vehicle, _x select 1] call CBA_fnc_turretEvent;
+
if ((_loadedMagazineInfo select [0,2]) isEqualTo _x) then {
TRACE_1("Re-add the starting mag",_loadedMagazineInfo);
- _staticWeapon addMagazineTurret _loadedMagazineInfo;
+
+ [QEGVAR(common,addMagazineTurret), [_vehicle, _loadedMagazineInfo], _vehicle, _x select 1] call CBA_fnc_turretEvent;
};
} forEach _magsToRemove;
-private _secondaryWeaponMagazines = _staticWeapon getVariable [QGVAR(secondaryWeaponMagazines), []];
+private _secondaryWeaponMagazines = _vehicle getVariable [QGVAR(secondaryWeaponMagazines), []];
if (_secondaryWeaponMagazines isNotEqualTo []) then {
// Check if the static weapon can take magazines
- private _turret = (allTurrets _staticWeapon) param [0, []];
- private _compatibleMagazinesTurret = flatten ((_staticWeapon weaponsTurret _turret) apply {compatibleMagazines _x});
+ private _turret = (allTurrets _vehicle) param [0, []];
+ private _compatibleMagazinesTurret = flatten ((_vehicle weaponsTurret _turret) apply {compatibleMagazines _x});
private _container = objNull;
{
- private _vehicleMag = [_staticWeapon, _turret, _x select 0] call FUNC(reload_getVehicleMagazine);
+ private _vehicleMag = [_vehicle, _turret, _x select 0] call FUNC(reload_getVehicleMagazine);
TRACE_3("Re-add previous mag",_x select 0,_turret,_vehicleMag);
// If the magazine can be added to the static weapon, do it now
if (_vehicleMag in _compatibleMagazinesTurret) then {
- _staticWeapon addMagazineTurret [_vehicleMag, _turret, _x select 1];
+ [QEGVAR(common,addMagazineTurret), [_vehicle, [_vehicleMag, _turret, _x select 1]], _vehicle, _turret] call CBA_fnc_turretEvent;
} else {
// Find a suitable container to place items in if necessary
if (isNull _container) then {
- _container = (nearestObjects [_staticWeapon, ["GroundWeaponHolder"], 10]) param [0, objNull];
+ _container = (nearestObjects [_vehicle, ["GroundWeaponHolder"], 10]) param [0, objNull];
// Create ammo storage container
if (isNull _container) then {
- _container = createVehicle ["GroundWeaponHolder", getPosATL _staticWeapon, [], 0, "NONE"];
+ _container = createVehicle ["GroundWeaponHolder", getPosATL _vehicle, [], 0, "NONE"];
};
};
@@ -99,12 +100,12 @@ if (_secondaryWeaponMagazines isNotEqualTo []) then {
};
} forEach _secondaryWeaponMagazines;
- _staticWeapon setVariable [QGVAR(secondaryWeaponMagazines), nil, true];
+ _vehicle setVariable [QGVAR(secondaryWeaponMagazines), nil, true];
};
if (_storeExtraMagazines) then {
TRACE_1("saving extra mags to container",_containerMagazineCount);
{
- [_staticWeapon, _x, _containerMagazineCount select _forEachIndex] call FUNC(reload_handleReturnAmmo);
+ [_vehicle, _x, _containerMagazineCount select _forEachIndex] call FUNC(reload_handleReturnAmmo);
} forEach _containerMagazineClassnames;
};
diff --git a/addons/csw/initSettings.inc.sqf b/addons/csw/initSettings.inc.sqf
index bc157e1164b..4a58ed80b03 100644
--- a/addons/csw/initSettings.inc.sqf
+++ b/addons/csw/initSettings.inc.sqf
@@ -1,56 +1,53 @@
-private _categoryArray = [format ["ACE %1", localize LSTRING(DisplayName)]];
+private _categoryArray = [format ["ACE %1", LLSTRING(DisplayName)]];
[
- QGVAR(defaultAssemblyMode), "CHECKBOX",
+ QGVAR(defaultAssemblyMode),
+ "CHECKBOX",
[LSTRING(defaultAssemblyMode_displayName), LSTRING(defaultAssemblyMode_description)],
_categoryArray,
false, // default value
- true, // isGlobal
- {[QGVAR(defaultAssemblyMode), _this] call EFUNC(common,cbaSettings_settingChanged)},
- true // Needs mission restart
+ 1 // isGlobal
] call CBA_fnc_addSetting;
[
- QGVAR(handleExtraMagazines), "CHECKBOX",
+ QGVAR(handleExtraMagazines),
+ "CHECKBOX",
[LSTRING(handleExtraMagazines_displayName), LSTRING(handleExtraMagazines_description)],
_categoryArray,
true, // default value
- true, // isGlobal
- {[QGVAR(handleExtraMagazines), _this] call EFUNC(common,cbaSettings_settingChanged)},
- true // Needs mission restart
+ 1 // isGlobal
] call CBA_fnc_addSetting;
[
- QGVAR(handleExtraMagazinesType), "LIST",
+ 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
+ 1 // isGlobal
] call CBA_fnc_addSetting;
[
- QGVAR(ammoHandling), "LIST",
+ QGVAR(ammoHandling),
+ "LIST",
[LSTRING(ammoHandling_displayName), LSTRING(ammoHandling_description)],
_categoryArray,
[[0, 1, 2], [LELSTRING(common,Disabled), LELSTRING(common,playerOnly), LELSTRING(common,playersAndAI)], 2], // [_values, _valueTitles, _defaultIndex]
- true, // isGlobal
- {[QGVAR(ammoHandling), _this] call EFUNC(common,cbaSettings_settingChanged)},
- true // Needs mission restart
+ 1 // isGlobal
] call CBA_fnc_addSetting;
[
- QGVAR(progressBarTimeCoefficent), "SLIDER",
+ QGVAR(progressBarTimeCoefficent),
+ "SLIDER",
[LSTRING(progressBarTimeCoefficent_displayName), LSTRING(progressBarTimeCoefficent_description)],
_categoryArray,
- [0,2,1,2], // [min, max, default value, trailing decimals (-1 for whole numbers only)]
- true // isGlobal
+ [0, 2, 1, 2], // [min, max, default value, trailing decimals (-1 for whole numbers only)]
+ 1 // isGlobal
] call CBA_fnc_addSetting;
[
- QGVAR(dragAfterDeploy), "CHECKBOX",
+ QGVAR(dragAfterDeploy),
+ "CHECKBOX",
[LSTRING(dragAfterDeploy_displayName), LSTRING(dragAfterDeploy_description)],
- _categoryArray,
- false // default value
+ _categoryArray
] call CBA_fnc_addSetting;
diff --git a/addons/csw/stringtable.xml b/addons/csw/stringtable.xml
index da794376ab9..5d11773490b 100644
--- a/addons/csw/stringtable.xml
+++ b/addons/csw/stringtable.xml
@@ -672,6 +672,22 @@
[CSW] Лента 20-мм гранат для ст. гранатомёта
[CSW] 20mm 고속유탄발사기 탄띠
+
+ Caliber: 20 mm<br/>Rounds: 20<br />Used in: Grenade Launcher
+ 口徑:20 mm<br/>個數:20<br />用於:榴彈發射器
+ Calibre : 20 mm<br/>Munitions : 20<br />Application : lance-grenades
+ Calibre: 20 mm<br/>Cargas: 20<br />Se usa en: lanzagranadas
+ Calibro: 20 mm<br/>Munizioni: 20<br />Si usa in: lanciagranate
+ Kaliber: 20 mm<br/>Naboje: 20<br />Używane w: granatniku
+ Калибр: 20 мм<br/>Кол-во: 20<br />Применение: гранатомет
+ Kaliber: 20 mm<br/>Patronen: 20<br />Eingesetzt von: Granatenwerfer
+ Ráže: 20 mm<br/>Munice: 20<br />Použití: Granátomet
+ Calibre: 20 mm<br/>Balas: 20<br />Uso em: Lança-granadas
+ 구경: 20mm<br />탄 수: 20<br />사용 가능: 유탄발사기
+ 口径:20 毫米<br/>容弹量:20<br />用于:枪榴弹发射器
+ 口径:20 mm <br/>弾薬:20<br />使用:グレネードランチャー
+ Kalibre: 20 mm<br/>Mermi: 20<br />Kullanıldığı Yer: Bombaatar
+
M3 Tripod
Trípode M3
diff --git a/addons/dagr/functions/fnc_menuInit.sqf b/addons/dagr/functions/fnc_menuInit.sqf
index fc05185638f..b7433b92aae 100644
--- a/addons/dagr/functions/fnc_menuInit.sqf
+++ b/addons/dagr/functions/fnc_menuInit.sqf
@@ -584,7 +584,7 @@ GVAR(menuRun) = true;
};
GVAR(tmpUpdateRate) = 0.1 max GVAR(tmpUpdateRate) min 2.0;
if (!GVAR(busy)) then {
- (__dsp displayCtrl __mainText) ctrlSetText (Str(GVAR(tmpUpdateRate) * 1000) + "ms");
+ (__dsp displayCtrl __mainText) ctrlSetText (str(GVAR(tmpUpdateRate) * 1000) + "ms");
(__dsp displayCtrl __F1) ctrlSetText "Save";
(__dsp displayCtrl __F3) ctrlSetText "Cancel";
};
diff --git a/addons/dagr/functions/fnc_outputData.sqf b/addons/dagr/functions/fnc_outputData.sqf
index b7064ce248a..646f56d1c88 100644
--- a/addons/dagr/functions/fnc_outputData.sqf
+++ b/addons/dagr/functions/fnc_outputData.sqf
@@ -17,7 +17,7 @@
135471 cutRsc ["DAGR_DISPLAY", "plain down"];
-#define __display (uiNameSpace getVariable "DAGR_DISPLAY")
+#define __display (uiNamespace getVariable "DAGR_DISPLAY")
#define __gridControl (__display displayCtrl 266851)
#define __speedControl (__display displayCtrl 266852)
@@ -62,7 +62,7 @@ GVAR(outputPFH) = [{
};
// Time
- private _dagrTime = [daytime, "HH:MM"] call bis_fnc_timeToString;
+ private _dagrTime = [dayTime, "HH:MM"] call bis_fnc_timeToString;
// Output
__gridControl ctrlSetText _dagrGrid;
diff --git a/addons/dagr/functions/fnc_outputVector.sqf b/addons/dagr/functions/fnc_outputVector.sqf
index e9bd0ea6c38..816ed2e4b23 100644
--- a/addons/dagr/functions/fnc_outputVector.sqf
+++ b/addons/dagr/functions/fnc_outputVector.sqf
@@ -17,7 +17,7 @@
135471 cutRsc ["DAGR_DISPLAY", "plain down"];
-#define __display (uiNameSpace getVariable "DAGR_DISPLAY")
+#define __display (uiNamespace getVariable "DAGR_DISPLAY")
#define __gridControl (__display displayCtrl 266851)
#define __speedControl (__display displayCtrl 266858)
@@ -36,7 +36,7 @@ if (_lazPosX < 0) then { _lazPosX = _lazPosX + 99999;};
if (_lazPosY < 0) then {_lazPosY = _lazPosY + 99999;};
// Find laser position
-private _xGrid = toArray Str(round _lazPosX);
+private _xGrid = toArray str(round _lazPosX);
while {count _xGrid < 5} do {
_xGrid = [48] + _xGrid;
@@ -45,7 +45,7 @@ _xGrid resize 4;
_xGrid = toString _xGrid;
_xGrid = parseNumber _xGrid;
-private _yGrid = toArray Str(round _lazPosY);
+private _yGrid = toArray str(round _lazPosY);
while {count _yGrid < 5} do {
_yGrid = [48] + _yGrid;
};
@@ -54,17 +54,17 @@ _yGrid = toString _yGrid;
_yGrid = parseNumber _yGrid;
private _xCoord = switch true do {
- case (_xGrid >= 1000): { "" + Str(_xGrid) };
- case (_xGrid >= 100): { "0" + Str(_xGrid) };
- case (_xGrid >= 10): { "00" + Str(_xGrid) };
- default { "000" + Str(_xGrid) };
+ case (_xGrid >= 1000): { "" + str(_xGrid) };
+ case (_xGrid >= 100): { "0" + str(_xGrid) };
+ case (_xGrid >= 10): { "00" + str(_xGrid) };
+ default { "000" + str(_xGrid) };
};
private _yCoord = switch true do {
- case (_yGrid >= 1000): { "" + Str(_yGrid) };
- case (_yGrid >= 100): { "0" + Str(_yGrid) };
- case (_yGrid >= 10): { "00" + Str(_yGrid) };
- default { "000" + Str(_yGrid) };
+ case (_yGrid >= 1000): { "" + str(_yGrid) };
+ case (_yGrid >= 100): { "0" + str(_yGrid) };
+ case (_yGrid >= 10): { "00" + str(_yGrid) };
+ default { "000" + str(_yGrid) };
};
private _dagrGrid = _xCoord + " " + _yCoord;
@@ -74,7 +74,7 @@ private _elevation = floor ((_lazPosZ) + EGVAR(common,mapAltitude));
private _dagrElevation = str _elevation + "m";
// Time
-private _dagrTime = [daytime, "HH:MM"] call bis_fnc_timeToString;
+private _dagrTime = [dayTime, "HH:MM"] call bis_fnc_timeToString;
// Bearing
private _bearing = GVAR(LAZHEADING);
diff --git a/addons/dagr/functions/fnc_outputWP.sqf b/addons/dagr/functions/fnc_outputWP.sqf
index 27944f0bb91..bf25118c9ea 100644
--- a/addons/dagr/functions/fnc_outputWP.sqf
+++ b/addons/dagr/functions/fnc_outputWP.sqf
@@ -17,7 +17,7 @@
135471 cutRsc ["DAGR_DISPLAY", "plain down"];
-#define __display (uiNameSpace getVariable "DAGR_DISPLAY")
+#define __display (uiNamespace getVariable "DAGR_DISPLAY")
#define __gridControl (__display displayCtrl 266851)
#define __speedControl (__display displayCtrl 266858)
@@ -47,18 +47,18 @@ GVAR(outputPFH) = [{
private _xGrid2 = floor (DAGR_WP_INFO / 10000);
private _yGrid2 = DAGR_WP_INFO - _xGrid2 * 10000;
- _xCoord2 = switch true do {
- case (_xGrid2 >= 1000): { "" + Str(_xGrid2) };
- case (_xGrid2 >= 100): { "0" + Str(_xGrid2) };
- case (_xGrid2 >= 10): { "00" + Str(_xGrid2) };
- default { "000" + Str(_xGrid2) };
+ private _xCoord2 = switch true do {
+ case (_xGrid2 >= 1000): { "" + str(_xGrid2) };
+ case (_xGrid2 >= 100): { "0" + str(_xGrid2) };
+ case (_xGrid2 >= 10): { "00" + str(_xGrid2) };
+ default { "000" + str(_xGrid2) };
};
- _yCoord2 = switch true do {
- case (_yGrid2 >= 1000): { "" + Str(_yGrid2) };
- case (_yGrid2 >= 100): { "0" + Str(_yGrid2) };
- case (_yGrid2 >= 10): { "00" + Str(_yGrid2) };
- default { "000" + Str(_yGrid2) };
+ private _yCoord2 = switch true do {
+ case (_yGrid2 >= 1000): { "" + str(_yGrid2) };
+ case (_yGrid2 >= 100): { "0" + str(_yGrid2) };
+ case (_yGrid2 >= 10): { "00" + str(_yGrid2) };
+ default { "000" + str(_yGrid2) };
};
_dagrGrid2 = _xCoord2 + " " + _yCoord2;
diff --git a/addons/dagr/stringtable.xml b/addons/dagr/stringtable.xml
index 32510520021..621440ffbac 100644
--- a/addons/dagr/stringtable.xml
+++ b/addons/dagr/stringtable.xml
@@ -59,7 +59,7 @@
Defense Advanced GPS Receiver
Defense Advanced GPS Receiver
Defense Advanced GPS Receiver
- 国防のための高度なGPS受信機 (Defense Advanced GPS Receiver)
+ 国防のための高機能なGPS受信機 (Defense Advanced GPS Receiver)
국방 고급위성항법시스템 수신기
軍用高級防禦GPS接收器
军用高级防御 GPS 接收器
diff --git a/addons/disarming/functions/fnc_disarmDropItems.sqf b/addons/disarming/functions/fnc_disarmDropItems.sqf
index 6e842e739a4..c95647b82ab 100644
--- a/addons/disarming/functions/fnc_disarmDropItems.sqf
+++ b/addons/disarming/functions/fnc_disarmDropItems.sqf
@@ -50,7 +50,7 @@ if (!_doNotDropAmmo) then {
if ((_x getVariable [QGVAR(disarmUnit), objNull]) == _target) exitWith {
_holder = _x;
};
- } forEach ((getpos _target) nearObjects [DISARM_CONTAINER, 3]);
+ } forEach ((getPos _target) nearObjects [DISARM_CONTAINER, 3]);
};
//Create a new weapon holder
@@ -101,7 +101,7 @@ if !([_targetMagazinesStart, _targetMagazinesEnd, _holderMagazinesStart, _holder
};
//Remove Items, Assigned Items and NVG
-private _holderItemsStart = getitemCargo _holder;
+private _holderItemsStart = getItemCargo _holder;
private _targetItemsStart = (assignedItems _target) + (items _target) - (weapons _target);
if ((headgear _target) != "") then {_targetItemsStart pushBack (headgear _target);};
if ((goggles _target) != "") then {_targetItemsStart pushBack (goggles _target);};
@@ -131,7 +131,7 @@ private _addToCrateCount = [];
_holder addItemCargoGlobal [(_addToCrateClassnames select _forEachIndex), (_addToCrateCount select _forEachIndex)];
} forEach _addToCrateClassnames;
-private _holderItemsEnd = getitemCargo _holder;
+private _holderItemsEnd = getItemCargo _holder;
private _targetItemsEnd = (assignedItems _target) + (items _target) - (weapons _target);
if ((headgear _target) != "") then {_targetItemsEnd pushBack (headgear _target);};
if ((goggles _target) != "") then {_targetItemsEnd pushBack (goggles _target);};
@@ -172,7 +172,7 @@ if (_holderIsEmpty) then {
private _needToRemoveWeapon = ({_x in _listOfItemsToRemove} count (weapons _target)) > 0;
private _needToRemoveMagazines = ({_x in _listOfItemsToRemove} count (magazines _target)) > 0;
- private _needToRemoveBackpack = ((backPack _target) != "") && {(backPack _target) in _listOfItemsToRemove};
+ private _needToRemoveBackpack = ((backpack _target) != "") && {(backpack _target) in _listOfItemsToRemove};
private _needToRemoveVest = ((vest _target) != "") && {(vest _target) in _listOfItemsToRemove};
private _needToRemoveUniform = ((uniform _target) != "") && {(uniform _target) in _listOfItemsToRemove};
@@ -192,7 +192,7 @@ if (_holderIsEmpty) then {
} forEach (magazines _target);
//Drop backpack (Keeps variables for ACRE/TFR)
- if (_needToRemoveBackpack) then {_target action ["DropBag", _holder, (backPack _target)];};
+ if (_needToRemoveBackpack) then {_target action ["DropBag", _holder, (backpack _target)];};
} else {
[_pfID] call CBA_fnc_removePerFrameHandler;
diff --git a/addons/disarming/functions/fnc_openDisarmDialog.sqf b/addons/disarming/functions/fnc_openDisarmDialog.sqf
index 6cf15f4cad1..0054cc09fde 100644
--- a/addons/disarming/functions/fnc_openDisarmDialog.sqf
+++ b/addons/disarming/functions/fnc_openDisarmDialog.sqf
@@ -23,7 +23,7 @@ params ["_caller", "_target"];
//Sanity Checks
if (_caller != ACE_player) exitWith {ERROR("Player isn't caller?");};
-if !([_player, _target] call FUNC(canPlayerDisarmUnit)) exitWith {ERROR("Can't Disarm Unit");};
+if !([_caller, _target] call FUNC(canPlayerDisarmUnit)) exitWith {ERROR("Can't Disarm Unit");};
if (dialog) then {ERROR("Dialog open when trying to open disarm dialog"); closeDialog 0;};
disableSerialization;
@@ -96,7 +96,7 @@ GVAR(disarmTarget) = _target;
if ((_x getVariable [QGVAR(disarmUnit), objNull]) == _target) exitWith {
_holder = _x;
};
- } forEach ((getpos _target) nearObjects [DISARM_CONTAINER, 3]);
+ } forEach ((getPos _target) nearObjects [DISARM_CONTAINER, 3]);
//If a holder exists, show it's inventory
if (!isNull _holder) then {
diff --git a/addons/disarming/gui_disarm.hpp b/addons/disarming/gui_disarm.hpp
index 4c8ce53e6c0..b6afa26551d 100644
--- a/addons/disarming/gui_disarm.hpp
+++ b/addons/disarming/gui_disarm.hpp
@@ -7,13 +7,13 @@ class RscActiveText;
class RscListBox;
//Use the definese from
-#define X_BIS(num) (num * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2))
-#define Y_BIS(num) (num * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2))
-#define W_BIS(num) (num * (((safezoneW / safezoneH) min 1.2) / 40))
-#define H_BIS(num) (num * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))
+#define X_BIS(num) (num * (((safeZoneW / safeZoneH) min 1.2) / 40) + (safeZoneX + (safeZoneW - ((safeZoneW / safeZoneH) min 1.2))/2))
+#define Y_BIS(num) (num * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25) + (safeZoneY + (safeZoneH - (((safeZoneW / safeZoneH) min 1.2) / 1.2))/2))
+#define W_BIS(num) (num * (((safeZoneW / safeZoneH) min 1.2) / 40))
+#define H_BIS(num) (num * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25))
-#define X_MAKEITBIGGA(num) (num * (safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2))
-#define Y_MAKEITBIGGA(num) (num * (safeZoneH / 30) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2))
+#define X_MAKEITBIGGA(num) (num * (safeZoneH / 40) + (safeZoneX + (safeZoneW - safeZoneH)/2))
+#define Y_MAKEITBIGGA(num) (num * (safeZoneH / 30) + (safeZoneY + (safeZoneH - (safeZoneH / 1.2))/2))
#define W_MAKEITBIGGA(num) (num * (safeZoneH / 40))
#define H_MAKEITBIGGA(num) (num * (safeZoneH / 30))
@@ -140,9 +140,9 @@ class GVAR(remoteInventory) {
};
class GroundContainer: RscListBox {
idc = 632;
- sizeEx = "0.8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
- sizeEx2 = "0.8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
- rowHeight = "1.75 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
+ sizeEx = "0.8 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
+ sizeEx2 = "0.8 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
+ rowHeight = "1.75 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
canDrag = 0;
colorText[] = {1,1,1,1};
colorBackground[] = {0,0,0,0};
diff --git a/addons/dogtags/XEH_postInit.sqf b/addons/dogtags/XEH_postInit.sqf
index 3ced843f479..ab4daf6e29e 100644
--- a/addons/dogtags/XEH_postInit.sqf
+++ b/addons/dogtags/XEH_postInit.sqf
@@ -3,6 +3,18 @@
if (hasInterface || isServer) then {
[QGVAR(broadcastDogtagInfo), {
GVAR(dogtagsData) set _this;
+
+ if (isNil "CBA_fnc_renameInventoryItem") exitWith {}; // requires https://github.com/CBATeam/CBA_A3/pull/1329
+ params ["_item", "_dogTagData"];
+ private _name = _dogtagData param [0, ""];
+
+ // If data doesn't exist or body has no name, set name as "unknown"
+ if (_name == "") then {
+ _name = LELSTRING(common,unknown);
+ };
+
+ _name = [LLSTRING(itemName), ": ", _name] joinString "";
+ [_item, _name] call CBA_fnc_renameInventoryItem;
}] call CBA_fnc_addEventHandler;
if (isServer) then {
@@ -77,6 +89,7 @@ if (hasInterface) then {
if !(GETEGVAR(medical,enabled,false)) exitWith {};
if (hasInterface) then {
+ //IGNORE_PRIVATE_WARNING ["_target", "_player"];
private _checkTagAction = [
"ACE_CheckDogtag",
format ["%1: %2", LLSTRING(itemName), LLSTRING(checkDogtag)],
diff --git a/addons/dogtags/functions/fnc_addDogtagActions.sqf b/addons/dogtags/functions/fnc_addDogtagActions.sqf
index 9b2f3147b56..310cbc3f340 100644
--- a/addons/dogtags/functions/fnc_addDogtagActions.sqf
+++ b/addons/dogtags/functions/fnc_addDogtagActions.sqf
@@ -18,6 +18,7 @@
params ["_player"];
private _fnc_getActions = {
+ //IGNORE_PRIVATE_WARNING ["_player"];
private _actions = [];
private _cfgWeapons = configFile >> "CfgWeapons";
diff --git a/addons/dogtags/stringtable.xml b/addons/dogtags/stringtable.xml
index 73d2d07e56b..ff0af0db4e9 100644
--- a/addons/dogtags/stringtable.xml
+++ b/addons/dogtags/stringtable.xml
@@ -13,7 +13,7 @@
Piastrina
兵籍牌
兵籍牌
- Dog Tag
+ Chapa de Identificação
Placa de identidad
Künye
@@ -29,7 +29,7 @@
Controlla Piastrina
檢查兵籍牌
检查兵籍牌
- Verificar Dog Tag
+ Verificar chapa de identificação
Verificar placa de identidad
Künyeyi Kontrol Et
@@ -77,7 +77,7 @@
Piastrina presa da %1...
從%1身上拿取兵籍牌...
从%1身上拿取兵籍牌...
- Dogtag pego de %1...
+ Chapa de identificação pega de %1...
Tomada placa de identidad de %1...
Künye %1 kişisinden alındı
@@ -93,7 +93,7 @@
Qualcun altro ha già preso la piastrina...
已經有人把他的兵籍牌拿走了...
已经有人把他的兵籍牌拿走了...
- Alguém já pegou essa dogtag...
+ Alguém já pegou essa chapa de identificação...
Alguien más ha tomado la placa de identidad
Başka biri zaten künyeyi almış
@@ -106,7 +106,7 @@
Indicatore su schermo per il controllo delle piastrine
Wyświetlacz ekranowy dla sprawdzania nieśmiertelników
Экран для проверки жетонов
- Tela de Exibição para verificar dogtags
+ Tela de exibição para verificar chapas de identificação
Visualización en pantalla de placa de identidad
Affichage à l'écran pour le contrôle des plaques.
Okno na obrazovce pro kontrolu známek
diff --git a/addons/dragging/CfgVehicles.hpp b/addons/dragging/CfgVehicles.hpp
index 395133e9464..bd9758447bf 100644
--- a/addons/dragging/CfgVehicles.hpp
+++ b/addons/dragging/CfgVehicles.hpp
@@ -3,6 +3,9 @@
class CBA_Extended_EventHandlers;
class CfgVehicles {
+ class C_man_1;
+ class GVAR(clone): C_man_1 {};
+
// Static weapons
class LandVehicle;
class StaticWeapon: LandVehicle {
diff --git a/addons/dragging/XEH_PREP.hpp b/addons/dragging/XEH_PREP.hpp
index 0861c9533d2..aeba3135ab5 100644
--- a/addons/dragging/XEH_PREP.hpp
+++ b/addons/dragging/XEH_PREP.hpp
@@ -5,6 +5,8 @@ PREP(canDrop_carry);
PREP(canRun_carry);
PREP(carryObject);
PREP(carryObjectPFH);
+PREP(createClone);
+PREP(deleteClone);
PREP(dragObject);
PREP(dragObjectPFH);
PREP(dropObject);
diff --git a/addons/dragging/XEH_postInit.sqf b/addons/dragging/XEH_postInit.sqf
index ae277bf4d24..48655c5833a 100644
--- a/addons/dragging/XEH_postInit.sqf
+++ b/addons/dragging/XEH_postInit.sqf
@@ -1,9 +1,62 @@
// by PabstMirror, commy2
#include "script_component.hpp"
+[QGVAR(moveCorpse), {
+ params ["_corpse", "_dir", "_posATL"];
+
+ if (isNull _corpse) exitWith {};
+
+ // Check if the corpse is already close to the target
+ // If so, don't teleport
+ if ((getPosATL _corpse) distance _posATL > 0.25) then {
+ // Set direction before position
+ _corpse setDir _dir;
+
+ // Bring corpse back to clone's position
+ _corpse setPosATL _posATL;
+ };
+
+ // Sync the corpse with its position
+ [{
+ _this awake true;
+
+ [{
+ _this awake false;
+ }, _this] call CBA_fnc_execNextFrame;
+ }, _corpse] call CBA_fnc_execNextFrame;
+
+ // Allow the corpse to be synced for JIP players
+ if (isServer) exitWith {
+ GVAR(movedCorpses) pushBackUnique _corpse;
+ };
+}] call CBA_fnc_addEventHandler;
+
if (isServer) then {
// Release object on disconnection. Function is identical to killed
addMissionEventHandler ["HandleDisconnect", LINKFUNC(handleKilled)];
+
+ GVAR(movedCorpses) = [];
+
+ ["CAManBase", "Deleted", {
+ GVAR(movedCorpses) deleteAt (GVAR(movedCorpses) find (_this select 0));
+ }, true, [], true] call CBA_fnc_addClassEventHandler;
+
+ [QGVAR(disableSyncMovedCorpseOnJIP), {
+ params ["_corpse"];
+
+ GVAR(movedCorpses) deleteAt (GVAR(movedCorpses) find _corpse);
+ }] call CBA_fnc_addEventHandler;
+
+ // Sync position of dead corpse for JIP unit (prevents weird invisible hitboxes on corpses)
+ [QGVAR(requestSyncMovedCorpsesJIP), {
+ params ["_clientOwner"];
+
+ {
+ [QGVAR(moveCorpse), [_x, getDir _x, getPosATL _x], _clientOwner] call CBA_fnc_ownerEvent;
+ } forEach GVAR(movedCorpses);
+ }] call CBA_fnc_addEventHandler;
+} else {
+ [QGVAR(requestSyncMovedCorpsesJIP), clientOwner] call CBA_fnc_serverEvent;
};
if (!hasInterface) exitWith {};
@@ -20,6 +73,11 @@ if (isNil QGVAR(maxWeightCarryRun)) then {
GVAR(maxWeightCarryRun) = 50;
};
+// Extended EH doesn't fire for dead units, so add interactions manually
+{
+ _x call FUNC(initPerson);
+} forEach allDeadMen;
+
["isNotDragging", {!((_this select 0) getVariable [QGVAR(isDragging), false])}] call EFUNC(common,addCanInteractWithCondition);
["isNotCarrying", {!((_this select 0) getVariable [QGVAR(isCarrying), false])}] call EFUNC(common,addCanInteractWithCondition);
@@ -57,6 +115,14 @@ if (isNil QGVAR(maxWeightCarryRun)) then {
// Display event handler
["MouseZChanged", {(_this select 1) call FUNC(handleScrollWheel)}] call CBA_fnc_addDisplayHandler;
+// Handle local effect commands for clones
+[QGVAR(setCloneFace), {
+ params ["_clone", "_corpse"];
+
+ _clone setFace face _corpse;
+ _clone setMimic "unconscious";
+}] call CBA_fnc_addEventHandler;
+
// Handle surrendering and handcuffing
["ace_captiveStatusChanged", {
params ["_unit", "_state"];
@@ -70,6 +136,9 @@ if (isNil QGVAR(maxWeightCarryRun)) then {
[QGVAR(startCarry), LINKFUNC(startCarryLocal)] call CBA_fnc_addEventHandler;
[QGVAR(startDrag), LINKFUNC(startDragLocal)] call CBA_fnc_addEventHandler;
+[QGVAR(setCarryable), LINKFUNC(setCarryable)] call CBA_fnc_addEventHandler;
+[QGVAR(setDraggable), LINKFUNC(setDraggable)] call CBA_fnc_addEventHandler;
+
[QGVAR(carryingContainerClosed), {
params ["_container", "_owner"];
TRACE_2("carryingContainerClosed EH",_container,_owner);
diff --git a/addons/dragging/functions/fnc_canCarry.sqf b/addons/dragging/functions/fnc_canCarry.sqf
index be3015868b5..a38f37a02ee 100644
--- a/addons/dragging/functions/fnc_canCarry.sqf
+++ b/addons/dragging/functions/fnc_canCarry.sqf
@@ -18,7 +18,10 @@
params ["_unit", "_target"];
-if !(alive _target && {_target getVariable [QGVAR(canCarry), false]} && {isNull objectParent _target}) exitWith {false};
+private _alive = alive _target;
+private _isPerson = _target isKindOf "CAManBase";
+
+if !((_alive || _isPerson) && {_target getVariable [QGVAR(canCarry), false]} && {isNull objectParent _target}) exitWith {false};
if !([_unit, _target, []] call EFUNC(common,canInteractWith)) exitWith {false};
@@ -26,18 +29,19 @@ if !([_unit, _target, []] call EFUNC(common,canInteractWith)) exitWith {false};
// 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};
+// Units need to be unconscious or limping; Units also need to not be in ragdoll if alive, as that causes desync issues
+if (_isPerson) exitWith {
+ ((!_alive) && {missionNamespace getVariable [QGVAR(canMoveDead), true]}) ||
+ {(isAwake _target) && // not ragdolled if alive
+ {!(_target call EFUNC(common,isAwake)) ||
+ {_target getHitPointDamage "HitLegs" >= 0.5}}}
+};
+
// Static weapons need to be empty for carrying (ignore UAV AI)
if (_target isKindOf "StaticWeapon") exitWith {
(crew _target) findIf {!unitIsUAV _x} == -1
};
-// 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 {
- isAwake _target && // not ragdolled
- {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
diff --git a/addons/dragging/functions/fnc_canDrag.sqf b/addons/dragging/functions/fnc_canDrag.sqf
index 586e23feaf8..2616d6d1447 100644
--- a/addons/dragging/functions/fnc_canDrag.sqf
+++ b/addons/dragging/functions/fnc_canDrag.sqf
@@ -18,22 +18,26 @@
params ["_unit", "_target"];
-if !(alive _target && {_target getVariable [QGVAR(canDrag), false]} && {isNull objectParent _target}) exitWith {false};
+private _alive = alive _target;
+private _isPerson = _target isKindOf "CAManBase";
+
+if !((_alive || _isPerson) && {_target getVariable [QGVAR(canDrag), false]} && {isNull objectParent _target}) exitWith {false};
if !([_unit, _target, ["isNotSwimming"]] call EFUNC(common,canInteractWith)) exitWith {false};
+// Units need to be unconscious or limping; Units also need to not be in ragdoll if alive, as that causes desync issues
+if (_isPerson) exitWith {
+ ((!_alive) && {missionNamespace getVariable [QGVAR(canMoveDead), true]}) ||
+ {(isAwake _target) && // not ragdolled if alive
+ {!(_target call EFUNC(common,isAwake)) ||
+ {_target getHitPointDamage "HitLegs" >= 0.5}}}
+};
+
// Static weapons need to be empty for dragging (ignore UAV AI)
if (_target isKindOf "StaticWeapon") exitWith {
(crew _target) findIf {!unitIsUAV _x} == -1
};
-// 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 {
- isAwake _target && // not ragdolled
- {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
diff --git a/addons/dragging/functions/fnc_carryObject.sqf b/addons/dragging/functions/fnc_carryObject.sqf
index a6b38c4ea54..d765020f96e 100644
--- a/addons/dragging/functions/fnc_carryObject.sqf
+++ b/addons/dragging/functions/fnc_carryObject.sqf
@@ -48,9 +48,6 @@ if (_target isKindOf "CAManBase") then {
[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), [
_unit, "DefaultAction",
@@ -66,11 +63,14 @@ private _UAVCrew = _target call EFUNC(common,getVehicleUAVCrew);
if (_UAVCrew isNotEqualTo []) then {
{
- _target deleteVehicleCrew _x;
+ [_x, true] call EFUNC(common,disableAiUAV);
} forEach _UAVCrew;
- _target setVariable [QGVAR(isUAV), true, true];
+ _target setVariable [QGVAR(isUAV), _UAVCrew, true];
};
// Check everything
[LINKFUNC(carryObjectPFH), 0.5, [_unit, _target, CBA_missionTime]] call CBA_fnc_addPerFrameHandler;
+
+// API
+[QGVAR(startedCarry), [_unit, _target]] call CBA_fnc_localEvent;
diff --git a/addons/dragging/functions/fnc_carryObjectPFH.sqf b/addons/dragging/functions/fnc_carryObjectPFH.sqf
index fcd0f053768..a615d282521 100644
--- a/addons/dragging/functions/fnc_carryObjectPFH.sqf
+++ b/addons/dragging/functions/fnc_carryObjectPFH.sqf
@@ -73,8 +73,8 @@ if (_unit getHitPointDamage "HitLegs" >= 0.5) exitWith {
_idPFH call CBA_fnc_removePerFrameHandler;
};
-// Drop static if crew is in it (UAV crew deletion may take a few frames)
-if (_target isKindOf "StaticWeapon" && {!(_target getVariable [QGVAR(isUAV), false])} && {(crew _target) isNotEqualTo []}) exitWith {
+// Drop static if either non-UAV crew or new UAV crew is in it (ignore saved UAV crew)
+if (_target isKindOf "StaticWeapon" && {((crew _target) - (_target getVariable [QGVAR(isUAV), []])) isNotEqualTo []}) exitWith {
TRACE_2("static weapon crewed",_unit,_target);
[_unit, _target] call FUNC(dropObject_carry);
@@ -91,7 +91,7 @@ private _previousHint = _unit getVariable [QGVAR(hint), []];
if (_previousHint isEqualType "") exitWith {};
// Mouse hint
-private _hintLMB = LLSTRING(Drop);
+private _hintLMB = LELSTRING(common,Drop);
private _cursorObject = cursorObject;
if (
diff --git a/addons/dragging/functions/fnc_createClone.sqf b/addons/dragging/functions/fnc_createClone.sqf
new file mode 100644
index 00000000000..6cb4aa0ec69
--- /dev/null
+++ b/addons/dragging/functions/fnc_createClone.sqf
@@ -0,0 +1,101 @@
+#include "..\script_component.hpp"
+/*
+ * Author: BaerMitUmlaut, johnb43
+ * Creates a draggable / carryable clone of a dead unit.
+ *
+ * Arguments:
+ * 0: Unit dragging/carrying
+ * 1: Dead unit
+ *
+ * Return Value:
+ * Cloned unit
+ *
+ * Example:
+ * [player, cursorObject] call ace_dragging_fnc_createClone;
+ *
+ * Public: No
+ */
+
+params ["_unit", "_target"];
+
+// Don't sync corpse when a player joins in progress until the corpse is in its proper position
+[QGVAR(disableSyncMovedCorpseOnJIP), _target] call CBA_fnc_serverEvent;
+
+private _posATL = getPosATL _target;
+
+// Create clone
+private _clone = createVehicle [[configOf _target >> QGVAR(cloneClass), "TEXT", QGVAR(clone)] call CBA_fnc_getConfigEntry, _posATL, [], 0, "CAN_COLLIDE"];
+
+// Claim the clone
+[_unit, _clone] call EFUNC(common,claim);
+
+// Move unit -10 m below terrain in order to hide it and remove its inventory access
+_posATL set [2, -10];
+
+// Corpse is desynced, but it doesn't matter here
+_target setPosATL _posATL;
+
+// Hide unit until it can be moved below terrain
+private _isObjectHidden = isObjectHidden _target;
+
+if (!_isObjectHidden) then {
+ [QEGVAR(common,hideObjectGlobal), [_target, true]] call CBA_fnc_serverEvent;
+};
+
+// Prevents unit from falling when below terrain
+private _simulationEnabled = simulationEnabled _target;
+
+if (_simulationEnabled) then {
+ [QEGVAR(common,enableSimulationGlobal), [_target, false]] call CBA_fnc_serverEvent;
+};
+
+private _isInRemainsCollector = isInRemainsCollector _target;
+
+// Make sure corpse isn't deleted by engine's garbage collector
+if (_isInRemainsCollector) then {
+ removeFromRemainsCollector [_target];
+};
+
+// Make sure clone has the same wound textures as the corpse
+_clone setDamage ((damage _target) min 0.99); // Don't kill the clone
+
+{
+ _clone setHitPointDamage [_x, (_target getHitPointDamage _x) min 0.99];
+} forEach ["HitHead", "HitBody", "HitHands", "HitLegs"]; // Relevant hitpoints
+
+// Disable all damage
+_clone allowDamage false;
+_clone setVariable [QGVAR(original), [_target, _isInRemainsCollector, _isObjectHidden, _simulationEnabled], true];
+
+[_clone, _target call CBA_fnc_getLoadout] call CBA_fnc_setLoadout;
+
+// Sets the facial expression
+[[QGVAR(setCloneFace), [_clone, _target]] call CBA_fnc_globalEventJIP, _clone] call CBA_fnc_removeGlobalEventJIP;
+
+// API
+[QGVAR(cloneCreated), [_clone, _target]] call CBA_fnc_localEvent;
+
+[{
+ params ["_clone", "_target"];
+
+ // Remove clone from all zeuses
+ if (["ace_zeus"] call EFUNC(common,isModLoaded)) then {
+ [QEGVAR(zeus,removeObjects), [[_clone]]] call CBA_fnc_serverEvent;
+ };
+
+ // Release claim on corpse
+ [objNull, _target] call EFUNC(common,claim);
+}, [_clone, _target], 0.25] call CBA_fnc_waitAndExecute;
+
+// Save which curators had this object as editable
+if (["ace_zeus"] call EFUNC(common,isModLoaded)) then {
+ private _objectCurators = objectCurators _target;
+
+ _target setVariable [QGVAR(objectCurators), _objectCurators, true];
+
+ if (_objectCurators isEqualTo []) exitWith {};
+
+ [QEGVAR(zeus,removeObjects), [[_target], _objectCurators]] call CBA_fnc_serverEvent;
+};
+
+_clone
diff --git a/addons/dragging/functions/fnc_deleteClone.sqf b/addons/dragging/functions/fnc_deleteClone.sqf
new file mode 100644
index 00000000000..148b88a3a31
--- /dev/null
+++ b/addons/dragging/functions/fnc_deleteClone.sqf
@@ -0,0 +1,80 @@
+#include "..\script_component.hpp"
+/*
+ * Author: BaerMitUmlaut, johnb43
+ * Drops a draggable / carryable clone of a dead unit.
+ *
+ * Arguments:
+ * 0: Unit dragging / carrying
+ * 1: Clone
+ * 2: If unit is in building
+ *
+ * Return Value:
+ * Original unit
+ *
+ * Example:
+ * [player, cursorObject, false] call ace_dragging_fnc_deleteClone;
+ *
+ * Public: No
+ */
+
+params ["_unit", "_clone", "_inBuilding"];
+
+(_clone getVariable [QGVAR(original), []]) params [
+ ["_target", objNull],
+ ["_isInRemainsCollector", true],
+ ["_isObjectHidden", false],
+ ["_simulationEnabled", true]
+];
+
+// API
+[QGVAR(cloneDeleted), [_clone, _target]] call CBA_fnc_localEvent;
+
+// Check if unit was deleted
+if (!isNull _target) then {
+ private _posATL = getPosATL _clone;
+
+ if (_inBuilding) then {
+ _posATL = _posATL vectorAdd [0, 0, 0.05];
+ };
+
+ // Make sure position isn't underground
+ if (_posATL select 2 < 0.05) then {
+ _posATL set [2, 0.05];
+ };
+
+ // Move the unit globally (important, as it desyncs the corpse position otherwise)
+ [QGVAR(moveCorpse), [_target, getDir _unit + 180, _posATL]] call CBA_fnc_globalEvent;
+
+ // Unhide unit
+ if (!_isObjectHidden) then {
+ [QEGVAR(common,hideObjectGlobal), [_target, false]] call CBA_fnc_serverEvent;
+ };
+
+ // Enable simulation again
+ if (_simulationEnabled) then {
+ [QEGVAR(common,enableSimulationGlobal), [_target, true]] call CBA_fnc_serverEvent;
+ };
+
+ // Detach first to prevent objNull in attachedObjects
+ detach _clone;
+ deleteVehicle _clone;
+
+ // Get which curators had this object as editable
+ if (["ace_zeus"] call EFUNC(common,isModLoaded)) then {
+ private _objectCurators = _target getVariable [QGVAR(objectCurators), []];
+
+ if (_objectCurators isEqualTo []) exitWith {};
+
+ [QEGVAR(zeus,addObjects), [[_target], _objectCurators]] call CBA_fnc_serverEvent;
+ };
+
+ if (_isInRemainsCollector) then {
+ addToRemainsCollector [_target];
+ };
+} else {
+ // Detach first to prevent objNull in attachedObjects
+ detach _clone;
+ deleteVehicle _clone;
+};
+
+_target
diff --git a/addons/dragging/functions/fnc_dragObject.sqf b/addons/dragging/functions/fnc_dragObject.sqf
index 6420ff56df0..3169db26795 100644
--- a/addons/dragging/functions/fnc_dragObject.sqf
+++ b/addons/dragging/functions/fnc_dragObject.sqf
@@ -49,9 +49,6 @@ if (_target isKindOf "CAManBase") then {
[_target, "AinjPpneMrunSnonWnonDb_still", 0] call EFUNC(common,doAnimation);
};
-_unit setVariable [QGVAR(isDragging), true, true];
-_unit setVariable [QGVAR(draggedObject), _target, true];
-
// Add drop action
GVAR(unit) = _unit;
@@ -60,7 +57,7 @@ GVAR(releaseActionID) = [0xF1, [false, false, false], {
}, "keydown", "", false, 0] call CBA_fnc_addKeyHandler;
// Show mouse hint
-["", LLSTRING(Drop)] call EFUNC(interaction,showMouseHint);
+["", LELSTRING(common,Drop)] call EFUNC(interaction,showMouseHint);
// Block firing
if (!GVAR(dragAndFire)) then {
@@ -79,10 +76,10 @@ private _UAVCrew = _target call EFUNC(common,getVehicleUAVCrew);
if (_UAVCrew isNotEqualTo []) then {
{
- _target deleteVehicleCrew _x;
+ [_x, true] call EFUNC(common,disableAiUAV);
} forEach _UAVCrew;
- _target setVariable [QGVAR(isUAV), true, true];
+ _target setVariable [QGVAR(isUAV), _UAVCrew, true];
};
// Check everything
@@ -90,3 +87,6 @@ if (_UAVCrew isNotEqualTo []) then {
// Fixes not being able to move when in combat pace
[_unit, "forceWalk", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
+
+// API
+[QGVAR(startedDrag), [_unit, _target]] call CBA_fnc_localEvent;
diff --git a/addons/dragging/functions/fnc_dragObjectPFH.sqf b/addons/dragging/functions/fnc_dragObjectPFH.sqf
index 7c3a6be3074..13400aa349f 100644
--- a/addons/dragging/functions/fnc_dragObjectPFH.sqf
+++ b/addons/dragging/functions/fnc_dragObjectPFH.sqf
@@ -51,8 +51,8 @@ if (_unit distance _target > 10 && {(CBA_missionTime - _startTime) >= 1}) exitWi
_idPFH call CBA_fnc_removePerFrameHandler;
};
-// Drop static if crew is in it (UAV crew deletion may take a few frames)
-if (_target isKindOf "StaticWeapon" && {!(_target getVariable [QGVAR(isUAV), false])} && {(crew _target) isNotEqualTo []}) exitWith {
+// Drop static if either non-UAV crew or new UAV crew is in it (ignore saved UAV crew)
+if (_target isKindOf "StaticWeapon" && {((crew _target) - (_target getVariable [QGVAR(isUAV), []])) isNotEqualTo []}) exitWith {
TRACE_2("static weapon crewed",_unit,_target);
[_unit, _target] call FUNC(dropObject);
@@ -62,3 +62,8 @@ if (_target isKindOf "StaticWeapon" && {!(_target getVariable [QGVAR(isUAV), fal
_idPFH call CBA_fnc_removePerFrameHandler;
};
+
+// Clones can die of drowning if oxygen is under 0.5, so refill their oxygen from time to time
+if (_target isKindOf QGVAR(clone) && {getOxygenRemaining _target < 0.8}) then {
+ _target setOxygenRemaining 1;
+};
diff --git a/addons/dragging/functions/fnc_dropObject.sqf b/addons/dragging/functions/fnc_dropObject.sqf
index 4115f288204..049f8228168 100644
--- a/addons/dragging/functions/fnc_dropObject.sqf
+++ b/addons/dragging/functions/fnc_dropObject.sqf
@@ -31,6 +31,12 @@ if (!GVAR(dragAndFire)) then {
};
private _inBuilding = _unit call FUNC(isObjectOnObject);
+private _isClone = _target isKindOf QGVAR(clone);
+
+// Drop cloned dead units
+if (_isClone) then {
+ _target = [_unit, _target, _inBuilding] call FUNC(deleteClone);
+};
// Play release animation
if (_unit call EFUNC(common,isAwake)) then {
@@ -57,7 +63,7 @@ _unit removeWeapon "ACE_FakePrimaryWeapon";
[_unit, "blockThrow", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
// Prevent object from flipping inside buildings
-if (_inBuilding) then {
+if (_inBuilding && {!_isClone}) then {
_target setPosASL (getPosASL _target vectorAdd [0, 0, 0.05]);
TRACE_2("setPos",getPosASL _unit,getPosASL _target);
};
@@ -80,16 +86,16 @@ if (_unit getVariable ["ACE_isUnconscious", false]) then {
[_unit, "unconscious", 2] call EFUNC(common,doAnimation);
};
-// Recreate UAV crew (add a frame delay or this may cause the vehicle to be moved to [0,0,0])
-if (_target getVariable [QGVAR(isUAV), false]) then {
- _target setVariable [QGVAR(isUAV), nil, true];
+// Reenable UAV crew
+private _UAVCrew = _target getVariable [QGVAR(isUAV), []];
- [{
- params ["_target"];
- if (!alive _target) exitWith {};
- TRACE_2("restoring uav crew",_target,getPosASL _target);
- createVehicleCrew _target;
- }, [_target]] call CBA_fnc_execNextFrame;
+if (_UAVCrew isNotEqualTo []) then {
+ // Reenable AI
+ {
+ [_x, false] call EFUNC(common,disableAiUAV);
+ } forEach _UAVCrew;
+
+ _target setVariable [QGVAR(isUAV), nil, true];
};
// Fixes not being able to move when in combat pace
@@ -101,3 +107,6 @@ private _mass = _target getVariable [QGVAR(originalMass), 0];
if (_mass != 0) then {
[QEGVAR(common,setMass), [_target, _mass]] call CBA_fnc_globalEvent; // Force global sync
};
+
+// API
+[QGVAR(stoppedDrag), [_unit, _target]] call CBA_fnc_localEvent;
diff --git a/addons/dragging/functions/fnc_dropObject_carry.sqf b/addons/dragging/functions/fnc_dropObject_carry.sqf
index 32e8adcbe63..525a150bcff 100644
--- a/addons/dragging/functions/fnc_dropObject_carry.sqf
+++ b/addons/dragging/functions/fnc_dropObject_carry.sqf
@@ -25,6 +25,12 @@ TRACE_1("params",_this);
_unit setVariable [QGVAR(releaseActionID), nil];
private _inBuilding = _unit call FUNC(isObjectOnObject);
+private _isClone = _target isKindOf QGVAR(clone);
+
+// Drop cloned dead units
+if (_isClone) then {
+ _target = [_unit, _target, _inBuilding] call FUNC(deleteClone);
+};
// Prevent collision damage
[QEGVAR(common,fixCollision), _unit] call CBA_fnc_localEvent;
@@ -72,8 +78,9 @@ if (!isNil "_previousWeaponState") then {
[_unit, "blockThrow", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
// Prevent object from flipping inside buildings
-if (_inBuilding) then {
+if (_inBuilding && {!_isClone}) then {
_target setPosASL (getPosASL _target vectorAdd [0, 0, 0.05]);
+ TRACE_2("setPos",getPosASL _unit,getPosASL _target);
};
_unit setVariable [QGVAR(isCarrying), false, true];
@@ -87,16 +94,16 @@ if !(_target isKindOf "CAManBase") then {
[QEGVAR(common,fixFloating), _target, _target] call CBA_fnc_targetEvent;
};
-// Recreate UAV crew (add a frame delay or this may cause the vehicle to be moved to [0,0,0])
-if (_target getVariable [QGVAR(isUAV), false]) then {
- _target setVariable [QGVAR(isUAV), nil, true];
+// Reenable UAV crew
+private _UAVCrew = _target getVariable [QGVAR(isUAV), []];
+
+if (_UAVCrew isNotEqualTo []) then {
+ // Reenable AI
+ {
+ [_x, false] call EFUNC(common,disableAiUAV);
+ } forEach _UAVCrew;
- [{
- params ["_target"];
- if (!alive _target) exitWith {};
- TRACE_2("restoring uav crew",_target,getPosASL _target);
- createVehicleCrew _target;
- }, [_target]] call CBA_fnc_execNextFrame;
+ _target setVariable [QGVAR(isUAV), nil, true];
};
// Reset mass
@@ -122,6 +129,12 @@ if (_loadCargo) then {
} else {
[_unit, _target, _cursorObject] call EFUNC(common,loadPerson);
};
+
+ // Repurpose variable for flag used in event below
+ _loadCargo = true;
};
};
};
+
+// API
+[QGVAR(stoppedCarry), [_unit, _target, _loadCargo]] call CBA_fnc_localEvent;
diff --git a/addons/dragging/functions/fnc_handleAnimChanged.sqf b/addons/dragging/functions/fnc_handleAnimChanged.sqf
index 24b8f582057..49ccc18d3f1 100644
--- a/addons/dragging/functions/fnc_handleAnimChanged.sqf
+++ b/addons/dragging/functions/fnc_handleAnimChanged.sqf
@@ -5,7 +5,7 @@
*
* Arguments:
* 0: Unit
- * 1: Animaion
+ * 1: Animation
*
* Return Value:
* None
@@ -17,6 +17,7 @@
*/
params ["_unit", "_anim"];
+//IGNORE_PRIVATE_WARNING ["_thisArgs", "_thisID"];
_thisArgs params ["_realUnit"];
TRACE_4("params",_unit,_anim,_realUnit,_thisID);
diff --git a/addons/dragging/functions/fnc_handleScrollWheel.sqf b/addons/dragging/functions/fnc_handleScrollWheel.sqf
index c7641a8ffa7..065701bbd44 100644
--- a/addons/dragging/functions/fnc_handleScrollWheel.sqf
+++ b/addons/dragging/functions/fnc_handleScrollWheel.sqf
@@ -42,7 +42,7 @@ if (!CBA_events_control) then {
// Uses this method of selecting position because setPosATL did not have immediate effect
private _positionChange = _position vectorDiff (getPosASL _carriedItem);
- private _selectionPosition = _unit worldToModel (ASLtoAGL getPosWorld _carriedItem);
+ private _selectionPosition = _unit worldToModel (ASLToAGL getPosWorld _carriedItem);
_selectionPosition = _selectionPosition vectorAdd _positionChange;
_carriedItem attachTo [_unit, _selectionPosition];
diff --git a/addons/dragging/functions/fnc_resumeDrag.sqf b/addons/dragging/functions/fnc_resumeDrag.sqf
index d0fea988fb8..7ae7c1a8f3c 100644
--- a/addons/dragging/functions/fnc_resumeDrag.sqf
+++ b/addons/dragging/functions/fnc_resumeDrag.sqf
@@ -29,4 +29,4 @@ GVAR(releaseActionID) = [0xF1, [false, false, false], {
}, "keydown", "", false, 0] call CBA_fnc_addKeyHandler;
// Show mouse hint
-["", LLSTRING(Drop)] call EFUNC(interaction,showMouseHint);
+["", LELSTRING(common,Drop)] call EFUNC(interaction,showMouseHint);
diff --git a/addons/dragging/functions/fnc_setCarryable.sqf b/addons/dragging/functions/fnc_setCarryable.sqf
index 60b9854f419..757f7baa045 100644
--- a/addons/dragging/functions/fnc_setCarryable.sqf
+++ b/addons/dragging/functions/fnc_setCarryable.sqf
@@ -5,21 +5,52 @@
*
* Arguments:
* 0: Object
- * 1: True to enable carrying, false to disable
+ * 1: True to enable carrying, false to disable (default: false)
* 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)
+ * 5: Apply globally (default: false)
*
* Return Value:
* None
*
* Example:
- * [cursorTarget, 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
*/
-params ["_object", "_enableCarry", "_position", "_direction", ["_ignoreWeightCarry", false, [false]]];
+params [
+ ["_object", objNull, [objNull]],
+ ["_enableCarry", false, [false]],
+ "_position",
+ "_direction",
+ ["_ignoreWeightCarry", false, [false]],
+ ["_global", false, [false]]
+];
+
+if (isNull _object) exitWith {};
+
+if (!isNil "_position" && {!(_position isEqualType []) || {!(_position isEqualTypeArray [0, 0, 0])}}) exitWith {
+ ERROR_2("setCarryable: Bad position parameter [%1] for [%2], should be a 3D position or nil",_position,_object);
+};
+
+if (!isNil "_direction" && {!(_direction isEqualType 0)}) exitWith {
+ ERROR_2("setCarryable: Bad direction parameter [%1] for [%2], should be a number or nil",_direction,_object);
+};
+
+// Handle global here
+if (_global) exitWith {
+ private _jipID = format [QGVAR(carrying_%1), hashValue _object];
+ [QGVAR(setCarryable), [_object, _enableCarry, _position, _direction, _ignoreWeightCarry], _jipID] call CBA_fnc_globalEventJIP;
+
+ // Remove from JIP queue if object is deleted
+ if !(_object getVariable [QGVAR(setCarryableRemoveJip), false]) then {
+ [_jipID, _object] call CBA_fnc_removeGlobalEventJIP;
+
+ _object setVariable [QGVAR(setCarryableRemoveJip), true, true];
+ };
+};
if (isNil "_position") then {
_position = _object getVariable [QGVAR(carryPosition), [0, 1, 1]];
@@ -56,6 +87,7 @@ GVAR(initializedClasses_carry) = _initializedClasses;
private _icon = [QPATHTOF(UI\icons\box_carry.paa), QPATHTOF(UI\icons\person_carry.paa)] select (_object isKindOf "CAManBase");
+//IGNORE_PRIVATE_WARNING ["_target", "_player"];
private _carryAction = [
QGVAR(carry),
LLSTRING(Carry),
@@ -68,7 +100,7 @@ private _carryAction = [
private _dropAction = [
QGVAR(drop_carry),
- LLSTRING(Drop),
+ LELSTRING(common,Drop),
"",
{
[_player, _target] call FUNC(dropObject_carry)
@@ -78,3 +110,5 @@ private _dropAction = [
[_type, 0, ["ACE_MainActions"], _carryAction] call EFUNC(interact_menu,addActionToClass);
[_type, 0, [], _dropAction] call EFUNC(interact_menu,addActionToClass);
+
+nil // return
diff --git a/addons/dragging/functions/fnc_setDraggable.sqf b/addons/dragging/functions/fnc_setDraggable.sqf
index e024ec5be29..ebec7d64267 100644
--- a/addons/dragging/functions/fnc_setDraggable.sqf
+++ b/addons/dragging/functions/fnc_setDraggable.sqf
@@ -5,21 +5,52 @@
*
* Arguments:
* 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 degrees to rotate the object after attachTo (optional; default: 0)
+ * 1: True to enable dragging, false to disable (default: false)
+ * 2: Position offset for attachTo command (default: [0, 1.5, 0])
+ * 3: Direction in degrees to rotate the object after attachTo (default: 0)
* 4: Override weight limit (default: false)
+ * 5: Apply globally (default: false)
*
* Return Value:
* None
*
* Example:
- * [cursorTarget, 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
*/
-params ["_object", "_enableDrag", "_position", "_direction", ["_ignoreWeightDrag", false, [false]]];
+params [
+ ["_object", objNull, [objNull]],
+ ["_enableDrag", false, [false]],
+ "_position",
+ "_direction",
+ ["_ignoreWeightDrag", false, [false]],
+ ["_global", false, [false]]
+];
+
+if (isNull _object) exitWith {};
+
+if (!isNil "_position" && {!(_position isEqualType []) || {!(_position isEqualTypeArray [0, 0, 0])}}) exitWith {
+ ERROR_2("setDraggable: Bad position parameter [%1] for [%2], should be a 3D position or nil",_position,_object);
+};
+
+if (!isNil "_direction" && {!(_direction isEqualType 0)}) exitWith {
+ ERROR_2("setDraggable: Bad direction parameter [%1] for [%2], should be a number or nil",_direction,_object);
+};
+
+// Handle global here
+if (_global) exitWith {
+ private _jipID = format [QGVAR(dragging_%1), hashValue _object];
+ [QGVAR(setDraggable), [_object, _enableDrag, _position, _direction, _ignoreWeightDrag], _jipID] call CBA_fnc_globalEventJIP;
+
+ // Remove from JIP queue if object is deleted
+ if !(_object getVariable [QGVAR(setDraggableRemoveJip), false]) then {
+ [_jipID, _object] call CBA_fnc_removeGlobalEventJIP;
+
+ _object setVariable [QGVAR(setDraggableRemoveJip), true, true];
+ };
+};
if (isNil "_position") then {
_position = _object getVariable [QGVAR(dragPosition), [0, 1.5, 0]];
@@ -56,6 +87,7 @@ GVAR(initializedClasses) = _initializedClasses;
private _icon = [QPATHTOF(UI\icons\box_drag.paa), QPATHTOF(UI\icons\person_drag.paa)] select (_object isKindOf "CAManBase");
+//IGNORE_PRIVATE_WARNING ["_target", "_player"];
private _dragAction = [
QGVAR(drag),
LLSTRING(Drag),
@@ -68,7 +100,7 @@ private _dragAction = [
private _dropAction = [
QGVAR(drop),
- LLSTRING(Drop),
+ LELSTRING(common,Drop),
"",
{
[_player, _target] call FUNC(dropObject);
@@ -78,3 +110,5 @@ private _dropAction = [
[_type, 0, ["ACE_MainActions"], _dragAction] call EFUNC(interact_menu,addActionToClass);
[_type, 0, [], _dropAction] call EFUNC(interact_menu,addActionToClass);
+
+nil // return
diff --git a/addons/dragging/functions/fnc_startCarry.sqf b/addons/dragging/functions/fnc_startCarry.sqf
index 3e2cc17efde..99652fc263d 100644
--- a/addons/dragging/functions/fnc_startCarry.sqf
+++ b/addons/dragging/functions/fnc_startCarry.sqf
@@ -15,6 +15,7 @@
*
* Public: No
*/
+
params ["_unit", "_target"];
// Try to claim the object
diff --git a/addons/dragging/functions/fnc_startCarryLocal.sqf b/addons/dragging/functions/fnc_startCarryLocal.sqf
index 743a56e1f44..cf17dfb311d 100644
--- a/addons/dragging/functions/fnc_startCarryLocal.sqf
+++ b/addons/dragging/functions/fnc_startCarryLocal.sqf
@@ -41,6 +41,11 @@ private _timer = CBA_missionTime + 5;
// Handle objects vs. persons
if (_target isKindOf "CAManBase") then {
+ // Create clone for dead units
+ if (!alive _target) then {
+ _target = [_unit, _target] call FUNC(createClone);
+ };
+
private _primaryWeapon = primaryWeapon _unit;
// Add a primary weapon if the unit has none
@@ -82,7 +87,7 @@ if (_target isKindOf "CAManBase") then {
// Prevents dragging and carrying at the same time
_unit setVariable [QGVAR(isCarrying), true, true];
-// Required for aborting animation
+// Required for aborting (animation & keybind)
_unit setVariable [QGVAR(carriedObject), _target, true];
[LINKFUNC(startCarryPFH), 0.2, [_unit, _target, _timer]] call CBA_fnc_addPerFrameHandler;
@@ -94,3 +99,6 @@ if (_mass > 1) then {
_target setVariable [QGVAR(originalMass), _mass, true];
[QEGVAR(common,setMass), [_target, 1e-12]] call CBA_fnc_globalEvent; // Force global sync
};
+
+// API
+[QGVAR(setupCarry), [_unit, _target]] call CBA_fnc_localEvent;
diff --git a/addons/dragging/functions/fnc_startCarryPFH.sqf b/addons/dragging/functions/fnc_startCarryPFH.sqf
index f928ef942a5..aefe6d76fcb 100644
--- a/addons/dragging/functions/fnc_startCarryPFH.sqf
+++ b/addons/dragging/functions/fnc_startCarryPFH.sqf
@@ -53,10 +53,9 @@ if (_target isKindOf "CAManBase") then {
// Timeout: Drop target. 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;
+ [_unit, _target] call FUNC(dropObject_carry);
- private _carriedObject = _unit getVariable [QGVAR(carriedObject), objNull];
- [_unit, _carriedObject] call FUNC(dropObject_carry);
+ _idPFH call CBA_fnc_removePerFrameHandler;
};
// Wait for the unit to stand up
diff --git a/addons/dragging/functions/fnc_startDrag.sqf b/addons/dragging/functions/fnc_startDrag.sqf
index 8dd6db6dee5..d65f218acd7 100644
--- a/addons/dragging/functions/fnc_startDrag.sqf
+++ b/addons/dragging/functions/fnc_startDrag.sqf
@@ -15,6 +15,7 @@
*
* Public: No
*/
+
params ["_unit", "_target"];
// Try to claim the object
diff --git a/addons/dragging/functions/fnc_startDragLocal.sqf b/addons/dragging/functions/fnc_startDragLocal.sqf
index de41d712a43..f0468f133ba 100644
--- a/addons/dragging/functions/fnc_startDragLocal.sqf
+++ b/addons/dragging/functions/fnc_startDragLocal.sqf
@@ -90,6 +90,11 @@ if !(_unit call EFUNC(common,isSwimming)) then {
// Move a bit closer and adjust direction when trying to pick up a person
if (_target isKindOf "CAManBase") then {
+ // Create clone for dead units
+ if (!alive _target) then {
+ _target = [_unit, _target] call FUNC(createClone);
+ };
+
[QEGVAR(common,setDir), [_target, getDir _unit + 180], _target] call CBA_fnc_targetEvent;
_target setPosASL (getPosASL _unit vectorAdd (vectorDir _unit vectorMultiply 1.5));
@@ -99,6 +104,9 @@ if (_target isKindOf "CAManBase") then {
// Prevents dragging and carrying at the same time
_unit setVariable [QGVAR(isDragging), true, true];
+// Required for aborting (keybind)
+_unit setVariable [QGVAR(draggedObject), _target, true];
+
[LINKFUNC(startDragPFH), 0.2, [_unit, _target, CBA_missionTime + 5]] call CBA_fnc_addPerFrameHandler;
// Disable collisions by setting the physx mass to almost zero
@@ -108,3 +116,6 @@ if (_mass > 1) then {
_target setVariable [QGVAR(originalMass), _mass, true];
[QEGVAR(common,setMass), [_target, 1e-12]] call CBA_fnc_globalEvent; // Force global sync
};
+
+// API
+[QGVAR(setupDrag), [_unit, _target]] call CBA_fnc_localEvent;
diff --git a/addons/dragging/functions/fnc_startDragPFH.sqf b/addons/dragging/functions/fnc_startDragPFH.sqf
index daf887c362a..e1cf75b38e0 100644
--- a/addons/dragging/functions/fnc_startDragPFH.sqf
+++ b/addons/dragging/functions/fnc_startDragPFH.sqf
@@ -43,11 +43,9 @@ if (!alive _target || {_unit distance _target > 10}) exitWith {
// Timeout: Drop target. 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;
+ [_unit, _target] call FUNC(dropObject);
- // Drop if in timeout
- private _draggedObject = _unit getVariable [QGVAR(draggedObject), objNull];
- [_unit, _draggedObject] call FUNC(dropObject);
+ _idPFH call CBA_fnc_removePerFrameHandler;
};
// Unit is ready to start dragging
diff --git a/addons/dragging/initKeybinds.inc.sqf b/addons/dragging/initKeybinds.inc.sqf
index a8792f35763..b7c3a2ace00 100644
--- a/addons/dragging/initKeybinds.inc.sqf
+++ b/addons/dragging/initKeybinds.inc.sqf
@@ -19,6 +19,7 @@
};
private _cursorObject = cursorObject;
+ if (_cursorObject isKindOf "CaManBase" && {unitIsUAV _cursorObject}) then { _cursorObject = vehicle _cursorObject };
if (isNull _cursorObject || {(_cursorObject distance _player) > 2.6}) exitWith {false};
if !([_player, _cursorObject] call FUNC(canDrag)) exitWith {false};
@@ -48,6 +49,7 @@
};
private _cursorObject = cursorObject;
+ if (_cursorObject isKindOf "CaManBase" && {unitIsUAV _cursorObject}) then { _cursorObject = vehicle _cursorObject };
if (isNull _cursorObject || {(_cursorObject distance _player) > 2.6}) exitWith {false};
if !([_player, _cursorObject] call FUNC(canCarry)) exitWith {false};
diff --git a/addons/dragon/CfgAmmo.hpp b/addons/dragon/CfgAmmo.hpp
index f736e8451ba..3a5a4a1ed6d 100644
--- a/addons/dragon/CfgAmmo.hpp
+++ b/addons/dragon/CfgAmmo.hpp
@@ -1,3 +1,4 @@
+class ace_missileguidance_type_Dragon;
class CfgAmmo {
class ammo_Penetrator_Base;
class M_Scalpel_AT;
@@ -37,39 +38,7 @@ class CfgAmmo {
EGVAR(vehicle_damage,incendiary) = 1.0;
- class ace_missileguidance {
- minDeflection = 0;
- maxDeflection = 0;
- incDeflection = 0;
-
- canVanillaLock = 0;
-
- // Guidance type for munitions
- defaultSeekerType = "SACLOS";
- seekerTypes[] = { "SACLOS" };
-
- defaultSeekerLockMode = "LOAL";
- seekerLockModes[] = { "LOAL", "LOBL" };
-
- seekLastTargetPos = 0;
- seekerAngle = 30;
- seekerAccuracy = 1;
-
- seekerMinRange = 65;
- seekerMaxRange = 1000;
-
- correctionDistance = 30;
- missileLeadDistance = 0;
- offsetFromCrosshair[] = { 0, 0, 0 };
-
- serviceInterval = 0.33; // how many seconds between pops
- serviceCharges = 32; // how many charges are in this missile
- serviceChargeAcceleration = 6.5;
- dragonSpeed = 100; // meters per second
-
- defaultAttackProfile = "DRAGON";
- attackProfiles[] = {"DRAGON"};
- };
+ class ace_missileguidance: ace_missileguidance_type_Dragon {};
};
class GVAR(super): GVAR(dragonBase) {
@@ -79,33 +48,11 @@ class CfgAmmo {
submunitionParentSpeedCoef = 0;
submunitionInitialOffset[] = { 0, 0, -0.2 };
- class ace_missileguidance {
+ class ace_missileguidance: ace_missileguidance {
enabled = 1;
-
- // Guidance type for munitions
- defaultSeekerType = "SACLOS";
- seekerTypes[] = { "SACLOS" };
-
- defaultSeekerLockMode = "LOAL";
- seekerLockModes[] = { "LOAL", "LOBL" };
-
- seekLastTargetPos = 0;
- seekerAngle = 30;
- seekerAccuracy = 1;
-
seekerMinRange = 30;
seekerMaxRange = 1500;
-
- correctionDistance = 30;
- missileLeadDistance = 0;
-
- serviceInterval = 0.33; // how many seconds between pops
serviceCharges = 60; // how many charges are in this missile
- serviceChargeAcceleration = 6.5;
- dragonSpeed = 100; // meters per second
-
- defaultAttackProfile = "DRAGON";
- attackProfiles[] = {"DRAGON"};
};
};
diff --git a/addons/dragon/CfgVehicles.hpp b/addons/dragon/CfgVehicles.hpp
index 13441c6c26a..9cc60771b51 100644
--- a/addons/dragon/CfgVehicles.hpp
+++ b/addons/dragon/CfgVehicles.hpp
@@ -107,7 +107,7 @@ class CfgVehicles {
soundGetIn[] = {"A3\sounds_f\dummysound",0.00031622776,1,5};
armorStructural = 10.0;
- class ACE_CSW {
+ class ace_csw {
disassembleTo = QGVAR(super);
};
diff --git a/addons/dragon/CfgWeapons.hpp b/addons/dragon/CfgWeapons.hpp
index 9cb58e2c1f4..0bdd53e34f2 100644
--- a/addons/dragon/CfgWeapons.hpp
+++ b/addons/dragon/CfgWeapons.hpp
@@ -19,7 +19,7 @@ class CfgWeapons {
descriptionShort = CSTRING(dragonDescription);
scope = 2;
- class ACE_CSW {
+ class ace_csw {
type = "mount";
deployTime = 2;
pickupTime = 2;
@@ -75,7 +75,7 @@ class CfgWeapons {
opticsZoomMin = 0.055;
opticsZoomMax = 0.055;
scope = 2;
- class ACE_CSW {
+ class ace_csw {
type = "weapon";
deployTime = 2;
pickupTime = 1;
diff --git a/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf b/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf
index 58e3844c882..6642d7d7de0 100644
--- a/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf
+++ b/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf
@@ -23,7 +23,7 @@ _attackProfileStateParams params ["_maxCorrectableDistance", "_wireCut", "_seeke
private _projectilePos = getPosASL _projectile;
private _distanceToProjectile = (getPosASL _shooter) vectorDistanceSqr _projectilePos;
-private _retPos = _projectilePos vectorAdd (AGLtoASL (_projectile vectorModelToWorld [0, 50, 0]));
+private _retPos = _projectilePos vectorAdd (AGLToASL (_projectile vectorModelToWorld [0, 50, 0]));
// _shooter returns the vehicle that shot it. If the launcher dies, the wire would probably be cut so assume it
if ((_distanceToProjectile > _seekerMaxRangeSqr) || _wireCut || { !alive _shooter }) exitWith {
diff --git a/addons/explosives/ACE_Arsenal_Stats.hpp b/addons/explosives/ACE_Arsenal_Stats.hpp
index 821ac65bfd1..c2c33b7f0a7 100644
--- a/addons/explosives/ACE_Arsenal_Stats.hpp
+++ b/addons/explosives/ACE_Arsenal_Stats.hpp
@@ -7,7 +7,7 @@ class EGVAR(arsenal,stats) {
displayName = CSTRING(statExploRange);
showText = 1;
textStatement = QUOTE(params [ARR_2('_stat','_config')]; private _exploRangeStat = getNumber (_config >> _stat select 0); format [ARR_3('%1m (%2ft)',_exploRangeStat,(_exploRangeStat / 0.3048) toFixed 1)]);
- condition = QUOTE(params [ARR_2('','_config')]; (getNumber (_config >> QQGVAR(Detonator))) > 0);
+ condition = QUOTE(getNumber (_this select 1 >> QQGVAR(detonator)) > 0);
tabs[] = {{}, {7}};
};
};
diff --git a/addons/explosives/ACE_Triggers.hpp b/addons/explosives/ACE_Triggers.hpp
index 27d63a736dd..a94ad95eaa4 100644
--- a/addons/explosives/ACE_Triggers.hpp
+++ b/addons/explosives/ACE_Triggers.hpp
@@ -18,7 +18,7 @@ class ACE_Triggers {
isAttachable = 1;
displayName = CSTRING(clacker_displayName);
picture = QPATHTOF(Data\UI\Clacker.paa);
- onPlace = QUOTE(_this call FUNC(AddClacker);false);
+ onPlace = QUOTE(_this call FUNC(addClacker); false);
requires[] = {"ACE_Clacker"};
};
class MK16_Transmitter: Command {
@@ -37,7 +37,7 @@ class ACE_Triggers {
isAttachable = 1;
displayName = CSTRING(cellphone_displayName);
picture = QPATHTOF(Data\UI\Cellphone_UI.paa);
- onPlace = QUOTE(_this call FUNC(addCellphoneIED);false);
+ onPlace = QUOTE(_this call FUNC(addCellphoneIED); false);
requires[] = {"ACE_Cellphone"};
};
class PressurePlate {
diff --git a/addons/explosives/CfgAmmo.hpp b/addons/explosives/CfgAmmo.hpp
index c02885362ee..cee1cf99c33 100644
--- a/addons/explosives/CfgAmmo.hpp
+++ b/addons/explosives/CfgAmmo.hpp
@@ -3,38 +3,19 @@ class CfgAmmo {
class Default;
class TimeBombCore: Default {
- GVAR(DefuseTime) = 5;
+ GVAR(defuseTime) = 5;
};
- /*
- class BoundingMineCore: TimeBombCore;
- class BoundingMineBase: BoundingMineCore;
- class APERSBoundingMine_Range_Ammo: BoundingMineBase;
- class MineCore: TimeBombCore;
- class MineBase: MineCore;
- class APERSMine_Range_Ammo: MineBase;
- class ATMine_Range_Ammo: MineBase;
-
- class DirectionalBombCore: TimeBombCore;
- class DirectionalBombBase: DirectionalBombCore;
-
- class SLAMDirectionalMine_Wire_Ammo: DirectionalBombBase;
-
- class PipeBombCore: TimeBombCore;
- class PipeBombBase: PipeBombCore;
- */
// GVAR(size) = 0; is small size
// GVAR(size) = 1; is large size
class DirectionalBombBase;
class ClaymoreDirectionalMine_Remote_Ammo: DirectionalBombBase {
GVAR(magazine) = "ClaymoreDirectionalMine_Remote_Mag";
- GVAR(Explosive) = "ClaymoreDirectionalMine_Remote_Ammo_Scripted";
GVAR(size) = 0;
GVAR(defuseObjectPosition)[] = {0, 0, 0.038};
soundActivation[] = {"", 0, 0, 0};
soundDeactivation[] = {"", 0, 0, 0};
};
- // class ClaymoreDirectionalMine_Remote_Ammo_Scripted: ClaymoreDirectionalMine_Remote_Ammo {};
class APERSTripMine_Wire_Ammo: DirectionalBombBase {
GVAR(defuseObjectPosition)[] = {-1.415, 0, 0.12};
@@ -43,7 +24,7 @@ class CfgAmmo {
class ACE_FlareTripMine_Wire_Ammo: APERSTripMine_Wire_Ammo {
SoundSetExplosion[] = {};
- defaultMagazine = "ACE_FlareTripMine_Mag"; //Mag that gets dropped after defuse
+ defaultMagazine = "ACE_FlareTripMine_Mag"; // Mag that gets dropped after defuse
hit = 0;
indirectHit = 0;
indirectHitRange = 0;
@@ -92,7 +73,6 @@ class CfgAmmo {
class PipeBombBase;
class DemoCharge_Remote_Ammo: PipeBombBase {
GVAR(magazine) = "DemoCharge_Remote_Mag";
- GVAR(Explosive) = "DemoCharge_Remote_Ammo_Scripted"; // can probably remove as base ammo now has triggerWhenDestroyed
GVAR(size) = 0;
GVAR(defuseObjectPosition)[] = {0.07, 0, 0.055};
soundActivation[] = {"", 0, 0, 0};
@@ -103,14 +83,11 @@ class CfgAmmo {
};
class SatchelCharge_Remote_Ammo: PipeBombBase {
GVAR(magazine) = "SatchelCharge_Remote_Mag";
- GVAR(Explosive) = "SatchelCharge_Remote_Ammo_Scripted"; // can probably remove as base ammo now has triggerWhenDestroyed
GVAR(size) = 0;
GVAR(defuseObjectPosition)[] = {0.1, 0.1, 0.05};
soundActivation[] = {"", 0, 0, 0};
soundDeactivation[] = {"", 0, 0, 0};
};
- // class DemoCharge_Remote_Ammo_Scripted: DemoCharge_Remote_Ammo {};
- // class SatchelCharge_Remote_Ammo_Scripted: SatchelCharge_Remote_Ammo {};
class IEDUrbanBig_Remote_Ammo: PipeBombBase {
triggerWhenDestroyed = 1;
@@ -168,10 +145,9 @@ class CfgAmmo {
mineTrigger = "RangeTriggerShort";
};
- // Orange DLC:
+ // Orange DLC
class APERSMineDispenser_Ammo: PipeBombBase {
GVAR(magazine) = "APERSMineDispenser_Mag";
- GVAR(Explosive) = "APERSMineDispenser_Ammo_Scripted"; // triggerWhenDestroyed = 1;
GVAR(size) = 0;
GVAR(defuseObjectPosition)[] = {0.0, -0.05, 0.15};
};
diff --git a/addons/explosives/CfgEventHandlers.hpp b/addons/explosives/CfgEventHandlers.hpp
index ae0e5fe5410..3b9e7077284 100644
--- a/addons/explosives/CfgEventHandlers.hpp
+++ b/addons/explosives/CfgEventHandlers.hpp
@@ -9,6 +9,7 @@ class Extended_PreInit_EventHandlers {
init = QUOTE(call COMPILE_SCRIPT(XEH_preInit));
};
};
+
class Extended_PostInit_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_postInit));
@@ -26,6 +27,7 @@ class Extended_Take_EventHandlers {
GVAR(takeHandler) = QUOTE(call FUNC(onInventoryChanged));
};
};
+
class Extended_Put_EventHandlers {
class CAManBase {
GVAR(takeHandler) = QUOTE([ARR_3(_this select 1,_this select 0,_this select 2)] call FUNC(onInventoryChanged));
diff --git a/addons/explosives/CfgMagazines.hpp b/addons/explosives/CfgMagazines.hpp
index 7bb2c6ff02d..89591f2bd69 100644
--- a/addons/explosives/CfgMagazines.hpp
+++ b/addons/explosives/CfgMagazines.hpp
@@ -1,10 +1,9 @@
class CfgMagazines {
class CA_Magazine;
class ATMine_Range_Mag: CA_Magazine {
- GVAR(Placeable) = 1;
useAction = 0;
- GVAR(SetupObject) = "ACE_Explosives_Place_ATMine"; // CfgVehicle class for setup object.
- GVAR(DelayTime) = 2.5;
+ GVAR(placeable) = 1;
+ GVAR(setupObject) = "ACE_Explosives_Place_ATMine"; // CfgVehicle class for setup object
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -13,7 +12,7 @@ class CfgMagazines {
};
};
class APERSBoundingMine_Range_Mag: ATMine_Range_Mag {
- GVAR(SetupObject) = "ACE_Explosives_Place_APERSBoundingMine";
+ GVAR(setupObject) = "ACE_Explosives_Place_APERSBoundingMine";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -22,7 +21,7 @@ class CfgMagazines {
};
};
class APERSMine_Range_Mag: ATMine_Range_Mag {
- GVAR(SetupObject) = "ACE_Explosives_Place_APERSMine";
+ GVAR(setupObject) = "ACE_Explosives_Place_APERSMine";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@@ -31,7 +30,7 @@ class CfgMagazines {
};
};
class APERSTripMine_Wire_Mag: ATMine_Range_Mag {
- GVAR(SetupObject) = "ACE_Explosives_Place_APERSTripwireMine";
+ GVAR(setupObject) = "ACE_Explosives_Place_APERSTripwireMine";
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire;
@@ -40,17 +39,16 @@ class CfgMagazines {
class ACE_FlareTripMine_Mag: APERSTripMine_Wire_Mag {
author = ECSTRING(common,aceteam);
ammo = "ACE_FlareTripMine_Wire_Ammo";
- GVAR(SetupObject) = "ACE_Explosives_Place_APERSTripwireMine";
+ GVAR(setupObject) = "ACE_Explosives_Place_APERSTripwireMine";
displayName = CSTRING(TripFlare_Name);
descriptionShort = CSTRING(TripFlare_Description);
class Library {libTextDesc = CSTRING(TripFlare_Description);};
};
class ClaymoreDirectionalMine_Remote_Mag: CA_Magazine {
- GVAR(Placeable) = 1;
useAction = 0;
- GVAR(SetupObject) = "ACE_Explosives_Place_Claymore";
- GVAR(DelayTime) = 1.5;
+ GVAR(placeable) = 1;
+ GVAR(setupObject) = "ACE_Explosives_Place_Claymore";
class ACE_Triggers {
SupportedTriggers[] = {"Command", "MK16_Transmitter"};
class Command {
@@ -61,10 +59,9 @@ class CfgMagazines {
};
class SatchelCharge_Remote_Mag: CA_Magazine {
- GVAR(Placeable) = 1;
useAction = 0;
- GVAR(SetupObject) = "ACE_Explosives_Place_SatchelCharge";
- GVAR(DelayTime) = 1;
+ GVAR(placeable) = 1;
+ GVAR(setupObject) = "ACE_Explosives_Place_SatchelCharge";
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"};
class Timer {
@@ -78,12 +75,12 @@ class CfgMagazines {
};
};
class DemoCharge_Remote_Mag: SatchelCharge_Remote_Mag {
- GVAR(SetupObject) = "ACE_Explosives_Place_DemoCharge";
+ GVAR(setupObject) = "ACE_Explosives_Place_DemoCharge";
model = "\A3\Weapons_F\explosives\c4_charge_small_d";
};
class SLAMDirectionalMine_Wire_Mag: ATMine_Range_Mag {
- GVAR(SetupObject) = "ACE_Explosives_Place_SLAM";
+ GVAR(setupObject) = "ACE_Explosives_Place_SLAM";
class ACE_Triggers {
SupportedTriggers[] = {"IRSensor", "PressurePlate", "Timer", "Command", "MK16_Transmitter"};
class PressurePlate {
@@ -107,7 +104,7 @@ class CfgMagazines {
};
class IEDUrbanBig_Remote_Mag: DemoCharge_Remote_Mag {
- GVAR(SetupObject) = "ACE_Explosives_Place_IEDUrbanBig";
+ GVAR(setupObject) = "ACE_Explosives_Place_IEDUrbanBig";
class ACE_Triggers {
SupportedTriggers[] = {"Command", "DeadmanSwitch", "Cellphone", "PressurePlate"};
class Command {
@@ -125,7 +122,7 @@ class CfgMagazines {
};
};
class IEDLandBig_Remote_Mag: IEDUrbanBig_Remote_Mag {
- GVAR(SetupObject) = "ACE_Explosives_Place_IEDLandBig";
+ GVAR(setupObject) = "ACE_Explosives_Place_IEDLandBig";
picture = "\A3\Weapons_F\Data\UI\gear_mine_AT_CA.paa"; // Fix inconsistent picture
class ACE_Triggers: ACE_Triggers {
class Command: Command {
@@ -139,7 +136,7 @@ class CfgMagazines {
};
};
class IEDUrbanSmall_Remote_Mag: DemoCharge_Remote_Mag {
- GVAR(SetupObject) = "ACE_Explosives_Place_IEDUrbanSmall";
+ GVAR(setupObject) = "ACE_Explosives_Place_IEDUrbanSmall";
picture = "\A3\Weapons_F\Data\UI\gear_mine_AP_bouncing_CA.paa"; // Fix inconsistent picture
class ACE_Triggers {
SupportedTriggers[] = {"Command", "DeadmanSwitch", "Cellphone", "PressurePlate"};
@@ -158,7 +155,7 @@ class CfgMagazines {
};
};
class IEDLandSmall_Remote_Mag: IEDUrbanSmall_Remote_Mag {
- GVAR(SetupObject) = "ACE_Explosives_Place_IEDLandSmall";
+ GVAR(setupObject) = "ACE_Explosives_Place_IEDLandSmall";
class ACE_Triggers: ACE_Triggers {
class Command: Command {
ammo = "ACE_IEDLandSmall_Command_Ammo";
@@ -174,7 +171,7 @@ class CfgMagazines {
// Orange DLC:
class APERSMineDispenser_Mag: SatchelCharge_Remote_Mag {
- GVAR(SetupObject) = "ACE_Explosives_Place_APERSMineDispenser";
+ GVAR(setupObject) = "ACE_Explosives_Place_APERSMineDispenser";
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter"};
class Timer {
@@ -187,7 +184,7 @@ class CfgMagazines {
};
};
class TrainingMine_Mag: APERSMine_Range_Mag {
- GVAR(SetupObject) = "ACE_Explosives_Place_TrainingMine";
+ GVAR(setupObject) = "ACE_Explosives_Place_TrainingMine";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
diff --git a/addons/explosives/CfgVehicles.hpp b/addons/explosives/CfgVehicles.hpp
index 91a708beb87..0a67a9a608d 100644
--- a/addons/explosives/CfgVehicles.hpp
+++ b/addons/explosives/CfgVehicles.hpp
@@ -6,24 +6,24 @@ class CfgVehicles {
class ACE_SelfActions {
class ACE_Explosives {
displayName = CSTRING(Menu);
- condition = QUOTE(!(_player getVariable [ARR_2(QQGVAR(PlantingExplosive),false)]));
+ condition = QUOTE(!(_player getVariable [ARR_2(QQGVAR(plantingExplosive),false)]));
statement = "";
exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting"};
showDisabled = 1;
icon = QPATHTOF(UI\Explosives_Menu_ca.paa);
- insertChildren = QUOTE([_player] call FUNC(addTransmitterActions));
+ insertChildren = QUOTE(_player call FUNC(addTransmitterActions));
class ACE_Place {
displayName = CSTRING(Place);
statement = "";
- condition = "true";
+ condition = QUOTE(true);
exceptions[] = {"isNotSwimming"};
icon = QPATHTOF(UI\Place_Explosive_ca.paa);
insertChildren = QUOTE(_player call FUNC(addExplosiveActions));
};
class ACE_Cellphone {
displayName = CSTRING(cellphone_displayName);
- condition = "('ACE_Cellphone' in (items ace_player))";
- statement = "closeDialog 0;createDialog 'Rsc_ACE_PhoneInterface';";
+ condition = QUOTE([ARR_2(_player,'ACE_Cellphone')] call EFUNC(common,hasItem));
+ statement = QUOTE(closeDialog 0; createDialog 'Rsc_ACE_PhoneInterface');
exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting"};
showDisabled = 0;
icon = QPATHTOF(Data\UI\Cellphone_UI.paa);
@@ -87,7 +87,7 @@ class CfgVehicles {
displayName = CSTRING(TriggerMenu);
condition = "true";
statement = "";
- insertChildren = QUOTE([ARR_3(_target getVariable QUOTE(QGVAR(class)),_target,_player)] call FUNC(addTriggerActions));
+ insertChildren = QUOTE([ARR_3(_target getVariable QQGVAR(class),_target,_player)] call FUNC(addTriggerActions));
showDisabled = 0;
exceptions[] = {"isNotSwimming"};
icon = QPATHTOF(UI\Explosives_Menu_ca.paa);
@@ -96,7 +96,7 @@ class CfgVehicles {
selection = "";
displayName = CSTRING(Pickup);
condition = "true";
- statement = QUOTE([ARR_2(_player,_target getVariable QUOTE(QGVAR(class)))] call EFUNC(common,addToInventory);deleteVehicle _target;);
+ statement = QUOTE([ARR_2(_player,_target getVariable QQGVAR(class))] call EFUNC(common,addToInventory); deleteVehicle _target);
showDisabled = 0;
exceptions[] = {"isNotSwimming"};
icon = "\A3\ui_f\data\IGUI\Cfg\Actions\Obsolete\ui_action_takemine_ca.paa";
@@ -106,60 +106,60 @@ class CfgVehicles {
};
class ACE_Explosives_Place_DemoCharge: ACE_Explosives_Place {
- displayName = "Demo Charge";
+ displayName = "$STR_A3_cfgMagazines_DemoCharge0";
model = "\A3\Weapons_F\explosives\c4_charge_small_d";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
- position = "[-0.07,0,0.055]";
+ position = "[-0.07, 0, 0.055]";
};
};
};
class ACE_Explosives_Place_APERSBoundingMine: ACE_Explosives_Place {
- displayName = "APERS Bounding Mine";
+ displayName = "$STR_A3_cfgMagazines_BouncingMineRangeMagazine0";
model = "\A3\Weapons_F\explosives\mine_AP_bouncing";
};
class ACE_Explosives_Place_APERSMine: ACE_Explosives_Place {
- displayName = "APERS Mine";
+ displayName = "$STR_A3_cfgMagazines_ClassicMineRangeMagazine0";
model = "\A3\Weapons_F\explosives\mine_ap";
};
class ACE_Explosives_Place_APERSTripwireMine: ACE_Explosives_Place {
- displayName = "APERS Tripwire Mine";
+ displayName = "$STR_A3_cfgMagazines_ClassicMineWireMagazine0";
model = "\A3\Weapons_F\explosives\mine_AP_tripwire";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
- position = "[1.415,0,0.12]";
+ position = "[1.415, 0, 0.12]";
};
};
};
class ACE_Explosives_Place_ATMine: ACE_Explosives_Place {
- displayName = "AT Mine";
+ displayName = "$STR_A3_CfgMagazines_Mine0";
model = "\A3\Weapons_f\Explosives\mine_at";
};
class ACE_Explosives_Place_Claymore: ACE_Explosives_Place {
- displayName = "Claymore";
+ displayName = "$STR_A3_cfgMagazines_DirectionalMineRemoteMagazine0";
model = "\A3\Weapons_F\explosives\mine_AP_miniclaymore";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
- position = "[0,0,0.038]";
+ position = "[0, 0, 0.038]";
};
};
};
class ACE_Explosives_Place_SatchelCharge: ACE_Explosives_Place {
- displayName = "Satchel Charge";
+ displayName = "$STR_A3_cfgMagazines_PipeBomb0";
model = "\A3\Weapons_F\Explosives\satchel";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
- position = "[-0.1,-0.1,0.05]";
+ position = "[-0.1, -0.1, 0.05]";
};
};
};
// Orange DLC:
class ACE_Explosives_Place_APERSMineDispenser: ACE_Explosives_Place {
- displayName = "APERSMineDispenser";
+ displayName = "$STR_A3_CfgMagazines_APERSMineDispenser_Mag0";
model = "\A3\Weapons_F_Orange\Explosives\APERSmineDispenser";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -168,7 +168,7 @@ class CfgVehicles {
};
};
class ACE_Explosives_Place_TrainingMine: ACE_Explosives_Place {
- displayName = "TrainingMine";
+ displayName = "$STR_A3_CfgMagazines_TrainingMine_Mag0";
model = "\A3\Weapons_F_Orange\Explosives\TrainingMine_F";
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -179,28 +179,28 @@ class CfgVehicles {
class ACE_Explosives_Place_SLAM: ACE_Explosives_Place {
- displayName = "SLAM";
+ displayName = "$STR_A3_cfgMagazines_DirectionalMineRangeMagazine0";
model = "\A3\Weapons_F\Explosives\mine_SLAM_directional";
};
// IEDs
class ACE_Explosives_Place_IEDUrbanBig: ACE_Explosives_Place {
- displayName = "IED Urban Big";
+ displayName = "$STR_A3_CfgVehicles_IEDUrbanBig_F";
model = "\A3\Weapons_F\Explosives\IED_urban_big";
};
class ACE_Explosives_Place_IEDLandBig: ACE_Explosives_Place {
- displayName = "IED Land Big";
+ displayName = "$STR_A3_CfgVehicles_IEDLandBig_F";
model = "\A3\Weapons_F\Explosives\IED_land_big";
};
class ACE_Explosives_Place_IEDUrbanSmall: ACE_Explosives_Place {
- displayName = "IED Urban Small";
+ displayName = "$STR_A3_CfgVehicles_IEDUrbanSmall_F";
model = "\A3\Weapons_F\Explosives\IED_urban_small";
};
class ACE_Explosives_Place_IEDLandSmall: ACE_Explosives_Place {
- displayName = "IED Land Small";
+ displayName = "$STR_A3_CfgVehicles_IEDLandSmall_F";
model = "\A3\Weapons_F\Explosives\IED_land_small";
};
diff --git a/addons/explosives/CfgWeapons.hpp b/addons/explosives/CfgWeapons.hpp
index 30e1fb95cbb..5c81cb9aec0 100644
--- a/addons/explosives/CfgWeapons.hpp
+++ b/addons/explosives/CfgWeapons.hpp
@@ -12,8 +12,7 @@ class CfgWeapons {
class CBA_MiscItem_ItemInfo;
class ACE_ExplosiveItem: CBA_MiscItem_ItemInfo {
- allowedSlots[] = {TYPE_UNIFORM,TYPE_VEST,TYPE_BACKPACK};
- //type = 201;
+ allowedSlots[] = {TYPE_UNIFORM, TYPE_VEST, TYPE_BACKPACK};
};
class ACE_Clacker: ACE_ItemCore {
@@ -23,8 +22,8 @@ class CfgWeapons {
descriptionShort = CSTRING(clacker_description);
picture = QPATHTOF(Data\UI\Clacker.paa);
model = QPATHTOF(data\ace_m57.p3d);
- GVAR(Range) = 250;
- GVAR(Detonator) = 1;
+ GVAR(range) = 250;
+ GVAR(detonator) = 1;
GVAR(triggerType) = "Command";
ACE_isTool = 1;
@@ -37,7 +36,7 @@ class CfgWeapons {
author = ECSTRING(common,ACETeam);
displayName = CSTRING(M152_Clacker_displayName);
picture = QPATHTOF(Data\UI\MK26_Transmitter_ca.paa);
- GVAR(Range) = 5000;
+ GVAR(range) = 5000;
GVAR(triggerType) = "MK16_Transmitter";
};
class ACE_DefusalKit: ACE_ItemCore {
@@ -47,8 +46,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;
+ ACE_isTool = 1;
class ItemInfo: ACE_ExplosiveItem {
mass = 5;
@@ -62,8 +61,8 @@ class CfgWeapons {
descriptionShort = CSTRING(DeadManSwitch_description);
picture = QPATHTOF(Data\UI\DeadmanSwitch.paa);
model = "\A3\weapons_F\ammo\mag_univ.p3d";
- GVAR(Range) = 100;
- GVAR(Detonator) = 1;
+ GVAR(range) = 100;
+ GVAR(detonator) = 1;
GVAR(triggerType) = "DeadManSwitch";
ACE_isTool = 1;
@@ -79,8 +78,8 @@ class CfgWeapons {
descriptionShort = CSTRING(cellphone_description);
picture = QPATHTOF(Data\UI\Cellphone_UI.paa);
model = "\A3\weapons_F\ammo\mag_univ.p3d";
- GVAR(Range) = 15000;
- GVAR(Detonator) = 1;
+ GVAR(range) = 15000;
+ GVAR(detonator) = 1;
GVAR(triggerType) = "Cellphone";
ACE_isTool = 1;
diff --git a/addons/explosives/ExplosivesUI.hpp b/addons/explosives/ExplosivesUI.hpp
index ef32c0c04b6..1b14ba5e887 100644
--- a/addons/explosives/ExplosivesUI.hpp
+++ b/addons/explosives/ExplosivesUI.hpp
@@ -12,10 +12,10 @@ class Rsc_ACE_CallScreen_Edit: RscEdit {
text = "";
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";
+ SizeEx = "(((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 20) * 1)";
+ 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";
- SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 22) * 1)";
- x = "0.288594 * safezoneW + safezoneX";
- w = "0.0825 * safezoneW";
- h = "0.044 * safezoneH";
+ 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";
text = "Name";
};
class speedDial_edit: Rsc_ACE_CallScreen_Edit {
idc = 1401;
- y = "0.302 * safezoneH + safezoneY";
- x = "0.318 * safezoneW + safezoneX";
+ y = "0.302 * safeZoneH + safeZoneY";
+ x = "0.318 * safeZoneW + safeZoneX";
w = "0.1";
};
class numberEdit_Text: RscText {
idc = 1406;
- 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";
+ 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";
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/XEH_postInit.sqf b/addons/explosives/XEH_postInit.sqf
index 81ab1b54069..f47dbbe5bd2 100644
--- a/addons/explosives/XEH_postInit.sqf
+++ b/addons/explosives/XEH_postInit.sqf
@@ -42,7 +42,7 @@ if (isServer) then {
params ["_explosive"];
TRACE_1("exploding",_explosive);
if (!isNull _explosive) then {
- _explosive setDamage 1;
+ [QEGVAR(common,triggerAmmo), _explosive, _explosive] call CBA_fnc_targetEvent;
};
}, _explosive, _delay] call CBA_fnc_waitAndExecute;
}] call CBA_fnc_addEventHandler;
diff --git a/addons/explosives/config.cpp b/addons/explosives/config.cpp
index b60186ab684..db2e48fa8da 100644
--- a/addons/explosives/config.cpp
+++ b/addons/explosives/config.cpp
@@ -32,6 +32,7 @@ class RscEdit;
class RscPicture;
class RscButton;
class ctrlXSliderH;
+
#include "ExplosivesUI.hpp"
#include "TimerDialog.hpp"
#include "GUI_VirtualAmmo.hpp"
diff --git a/addons/explosives/dev/test_magazines.sqf b/addons/explosives/dev/test_magazines.sqf
index ca9744f08da..afd091b24c4 100644
--- a/addons/explosives/dev/test_magazines.sqf
+++ b/addons/explosives/dev/test_magazines.sqf
@@ -5,20 +5,24 @@ INFO("--- Checking Explosive Mags ---");
private _explosivesMags = compatibleMagazines "Put";
private _setupHash = createHashMap;
+
{
private _mag = _x;
private _cfg = configFile >> "CfgMagazines" >> _mag;
private _scope = getNumber (_cfg >> "scope");
- private _setupObject = getText (_cfg >> QGVAR(SetupObject));
+ private _setupObject = getText (_cfg >> QGVAR(setupObject));
+
if (_setupObject == "") then {
WARNING_2("[%1](scope %2) has no setupObject",_mag,_scope);
- continue
+ continue;
};
+
if (!isClass (configFile >> "CfgVehicles" >> _setupObject)) then {
ERROR_2("[%1](scope %2) has invalid setup object",_mag,_scope);
};
- if ((((_setupHash getOrDefault [_setupObject, [], true]) pushBack _mag) > 0)) then {
+
+ if (((_setupHash getOrDefault [_setupObject, [], true]) pushBack _mag) > 0) then {
INFO_2("[%1] setupObject has multiple mags %2",_setupObject,_setupHash get _setupObject);
};
} forEach _explosivesMags;
diff --git a/addons/explosives/functions/fnc_addClacker.sqf b/addons/explosives/functions/fnc_addClacker.sqf
index 794aec0a107..ace01a15265 100644
--- a/addons/explosives/functions/fnc_addClacker.sqf
+++ b/addons/explosives/functions/fnc_addClacker.sqf
@@ -34,7 +34,7 @@ private _detonators = [_unit] call FUNC(getDetonators);
} forEach _requiredItems;
if !(_hasRequired) exitWith {};
-private _config = ConfigFile >> "CfgMagazines" >> _magazineClass >> "ACE_Triggers" >> configName _config;
+private _config = configFile >> "CfgMagazines" >> _magazineClass >> "ACE_Triggers" >> configName _config;
private _clacker = _unit getVariable [QGVAR(Clackers), []];
GVAR(PlacedCount) = GVAR(PlacedCount) + 1;
diff --git a/addons/explosives/functions/fnc_addDetonateActions.sqf b/addons/explosives/functions/fnc_addDetonateActions.sqf
index d950278c357..2e99f2bd4f0 100644
--- a/addons/explosives/functions/fnc_addDetonateActions.sqf
+++ b/addons/explosives/functions/fnc_addDetonateActions.sqf
@@ -19,16 +19,16 @@
params ["_unit", "_detonator"];
TRACE_2("params",_unit,_detonator);
-private _range = getNumber (ConfigFile >> "CfgWeapons" >> _detonator >> QGVAR(Range));
+private _range = getNumber (configFile >> "CfgWeapons" >> _detonator >> QGVAR(Range));
private _result = [_unit] call FUNC(getPlacedExplosives);
private _children = [];
private _explosivesList = [];
{
if (!isNull(_x select 0)) then {
- private _required = getArray (ConfigFile >> "ACE_Triggers" >> (_x select 4) >> "requires");
+ private _required = getArray (configFile >> "ACE_Triggers" >> (_x select 4) >> "requires");
if (_detonator in _required) then {
- private _item = ConfigFile >> "CfgMagazines" >> (_x select 3);
+ private _item = configFile >> "CfgMagazines" >> (_x select 3);
_explosivesList pushBack _x;
@@ -92,19 +92,6 @@ if (_detonator != "ACE_DeadManSwitch") then {
];
};
} else {
- //Add action to detonate all explosives (including the inventory explosive):
- _children pushBack [
- [
- "Explosive_All_Deadman",
- LLSTRING(DetonateAll),
- getText (configFile >> "CfgWeapons" >> _detonator >> "picture"),
- {[_player] call FUNC(onIncapacitated)},
- {true}
- ] call EFUNC(interact_menu,createAction),
- [],
- _unit
- ];
-
//Adds actions for the explosives you can connect to the deadman switch.
private _connectedInventoryExplosive = _unit getVariable [QGVAR(deadmanInvExplosive), ""];
if ((_connectedInventoryExplosive != "") && {!(_connectedInventoryExplosive in (magazines _unit))}) then {
@@ -113,14 +100,26 @@ if (_detonator != "ACE_DeadManSwitch") then {
};
_connectedInventoryExplosive = _unit getVariable [QGVAR(deadmanInvExplosive), ""];
+
+ //Add action to detonate all explosives (including the inventory explosive):
+ if (_connectedInventoryExplosive != "" || {count _explosivesList > 1}) then {
+ _children pushBack [
+ [
+ "Explosive_All_Deadman",
+ LLSTRING(DetonateAll),
+ getText (configFile >> "CfgWeapons" >> _detonator >> "picture"),
+ {[_player] call FUNC(onIncapacitated)},
+ {true}
+ ] call EFUNC(interact_menu,createAction),
+ [],
+ _unit
+ ];
+ };
+
if (_connectedInventoryExplosive != "") then {
//Add the disconnect action
private _magConfig = configFile >> "CfgMagazines" >> _connectedInventoryExplosive;
- private _name = if ((getText (_magConfig >> "displayNameShort")) != "") then {
- getText (_magConfig >> "displayNameShort")
- } else {
- getText(_magConfig >> "displayName")
- };
+ private _name = getText (_magConfig >> "displayName");
private _picture = getText (_magConfig >> "picture");
_children pushBack [
@@ -149,11 +148,7 @@ if (_detonator != "ACE_DeadManSwitch") then {
private _magConfig = configFile >> "CfgMagazines" >> _mag;
private _supportedTriggers = getArray (_magConfig >> "ACE_Triggers" >> "SupportedTriggers");
if (({_x == "DeadmanSwitch"} count _supportedTriggers) == 1) then { //case insensitive search
- private _name = if ((getText (_magConfig >> "displayNameShort")) != "") then {
- getText (_magConfig >> "displayNameShort")
- } else {
- getText(_magConfig >> "displayName")
- };
+ private _name = getText (_magConfig >> "displayName");
private _picture = getText (_magConfig >> "picture");
_children pushBack [
@@ -162,6 +157,7 @@ if (_detonator != "ACE_DeadManSwitch") then {
format [localize LSTRING(connectInventoryExplosiveToDeadman), _name],
_picture,
{
+ //IGNORE_PRIVATE_WARNING ["_player"];
params ["_player", "", "_mag"];
TRACE_2("set new",_player,_mag);
_player setVariable [QGVAR(deadmanInvExplosive), _mag, true];
diff --git a/addons/explosives/functions/fnc_addExplosiveActions.sqf b/addons/explosives/functions/fnc_addExplosiveActions.sqf
index 480ecd27012..6276e48afe6 100644
--- a/addons/explosives/functions/fnc_addExplosiveActions.sqf
+++ b/addons/explosives/functions/fnc_addExplosiveActions.sqf
@@ -27,11 +27,8 @@
{
private _config = _cfgMagazines >> _x;
if (getNumber (_config >> QGVAR(Placeable)) == 1) then {
- private _name = getText (_config >> "displayNameShort");
+ private _name = getText (_config >> "displayName");
private _picture = getText (_config >> "picture");
- if (_name isEqualTo "") then {
- _name = getText (_config >> "displayName");
- };
private _action = [_x, format ["%1 (%2)", _name, _totalCount - count (_magazines - [_x])], _picture, {[{_this call FUNC(setupExplosive)}, _this] call CBA_fnc_execNextFrame}, {true}, {}, _x] call EFUNC(interact_menu,createAction);
_actions pushBack [_action, [], _player];
diff --git a/addons/explosives/functions/fnc_addTransmitterActions.sqf b/addons/explosives/functions/fnc_addTransmitterActions.sqf
index 043c9db661f..d225aeda056 100644
--- a/addons/explosives/functions/fnc_addTransmitterActions.sqf
+++ b/addons/explosives/functions/fnc_addTransmitterActions.sqf
@@ -21,7 +21,7 @@ TRACE_1("params",_unit);
private _detonators = [_unit] call FUNC(getDetonators);
private _children = [];
{
- private _config = ConfigFile >> "CfgWeapons" >> _x;
+ private _config = configFile >> "CfgWeapons" >> _x;
_children pushBack
[
[
diff --git a/addons/explosives/functions/fnc_addTriggerActions.sqf b/addons/explosives/functions/fnc_addTriggerActions.sqf
index b6b6e0ce415..8be63fbc4f9 100644
--- a/addons/explosives/functions/fnc_addTriggerActions.sqf
+++ b/addons/explosives/functions/fnc_addTriggerActions.sqf
@@ -22,7 +22,7 @@ TRACE_2("params",_magazine,_explosive);
private _isAttached = !isNull (attachedTo _explosive);
private _detonators = [ACE_player] call FUNC(getDetonators);
private _triggerTypes = [_magazine] call FUNC(triggerType);
-private _magTriggers = ConfigFile >> "CfgMagazines" >> _magazine >> "ACE_Triggers";
+private _magTriggers = configFile >> "CfgMagazines" >> _magazine >> "ACE_Triggers";
private _children = [];
{
private _required = getArray (_x >> "requires");
diff --git a/addons/explosives/functions/fnc_defuseExplosive.sqf b/addons/explosives/functions/fnc_defuseExplosive.sqf
index 049fff88469..1c8b687c8f3 100644
--- a/addons/explosives/functions/fnc_defuseExplosive.sqf
+++ b/addons/explosives/functions/fnc_defuseExplosive.sqf
@@ -19,7 +19,7 @@
params ["_unit", "_explosive"];
TRACE_2("params",_unit,_explosive);
-if (GVAR(ExplodeOnDefuse) && {(random 1.0) < (getNumber (ConfigFile >> "CfgAmmo" >> typeOf _explosive >> QGVAR(explodeOnDefuseChance)))}) exitWith {
+if (GVAR(ExplodeOnDefuse) && {(random 1.0) < (getNumber (configFile >> "CfgAmmo" >> typeOf _explosive >> QGVAR(explodeOnDefuseChance)))}) exitWith {
TRACE_1("exploding on defuse",_explosive);
[_unit, -1, [_explosive, 1], "#ExplodeOnDefuse"] call FUNC(detonateExplosive);
[QGVAR(explodeOnDefuse), [_explosive, _unit]] call CBA_fnc_globalEvent;
diff --git a/addons/explosives/functions/fnc_detonateExplosive.sqf b/addons/explosives/functions/fnc_detonateExplosive.sqf
index 5e276745b59..e9ad9856fba 100644
--- a/addons/explosives/functions/fnc_detonateExplosive.sqf
+++ b/addons/explosives/functions/fnc_detonateExplosive.sqf
@@ -31,25 +31,9 @@ private _result = true;
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;
- private _exp = getText (ConfigFile >> "CfgAmmo" >> typeOf (_previousExp) >> QGVAR(Explosive));
- if (_exp != "") then {
- _exp = createVehicle [_exp, [0,0,15001], [], 0, "NONE"];
- _exp setDir (getDir _previousExp);
- _item set [0, _exp];
- private _pos = getPosASL _previousExp;
- deleteVehicle _previousExp;
- _exp setPosASL _pos;
- };
-};
-
if (isNull (_item select 0)) then {
WARNING_1("Explosive is null [%1]",_this);
};
-if ((getNumber (configFile >> "CfgAmmo" >> (typeOf (_item select 0)) >> "triggerWhenDestroyed")) != 1) then {
- WARNING_1("Explosive is not triggerWhenDestroyed [%1]",typeOf (_item select 0));
-};
[QGVAR(detonate), [_unit, _item select 0, _item select 1]] call CBA_fnc_serverEvent;
diff --git a/addons/explosives/functions/fnc_getPlacedExplosives.sqf b/addons/explosives/functions/fnc_getPlacedExplosives.sqf
index 867bae2275f..2e6d8840d9a 100644
--- a/addons/explosives/functions/fnc_getPlacedExplosives.sqf
+++ b/addons/explosives/functions/fnc_getPlacedExplosives.sqf
@@ -16,14 +16,14 @@
*
* Public: Yes
*/
-// IGNORE_PRIVATE_WARNING(_allExplosives,_deadmanExplosives);
+//IGNORE_PRIVATE_WARNING ["_allExplosives", "_deadmanExplosives"];
params ["_unit"];
TRACE_1("params",_unit);
private _filter = nil;
if (count _this > 1) then {
- _filter = ConfigFile >> "ACE_Triggers" >> (_this select 1);
+ _filter = configFile >> "ACE_Triggers" >> (_this select 1);
};
private _clackerList = [];
private _adjustedList = false;
@@ -34,7 +34,7 @@ private _list = [];
_clackerList set [_forEachIndex, "X"];
_adjustedList = true;
} else {
- if (isNil "_filter" || {(ConfigFile >> "ACE_Triggers" >> (_x select 4)) == _filter}) then {
+ if (isNil "_filter" || {(configFile >> "ACE_Triggers" >> (_x select 4)) == _filter}) then {
_list pushBack _x;
};
};
diff --git a/addons/explosives/functions/fnc_hasPlacedExplosives.sqf b/addons/explosives/functions/fnc_hasPlacedExplosives.sqf
index c697afb371a..7838a29e1bc 100644
--- a/addons/explosives/functions/fnc_hasPlacedExplosives.sqf
+++ b/addons/explosives/functions/fnc_hasPlacedExplosives.sqf
@@ -14,6 +14,6 @@
*
* Public: Yes
*/
-// IGNORE_PRIVATE_WARNING(_hasPlacedExplosives);
+//IGNORE_PRIVATE_WARNING ["getPlacedExplosives"];
(count (_this call FUNC(getPlacedExplosives)) > 0)
diff --git a/addons/explosives/functions/fnc_onInventoryChanged.sqf b/addons/explosives/functions/fnc_onInventoryChanged.sqf
index 7cf01c2a142..d5f1077dc2d 100644
--- a/addons/explosives/functions/fnc_onInventoryChanged.sqf
+++ b/addons/explosives/functions/fnc_onInventoryChanged.sqf
@@ -23,7 +23,7 @@ TRACE_3("params",_receiver,_giver,_item);
if ((_receiver != ace_player) && {_giver != ace_player}) exitWith {};
-private _config = ConfigFile >> "CfgWeapons" >> _item;
+private _config = configFile >> "CfgWeapons" >> _item;
if (isClass _config && {getNumber(_config >> QGVAR(Detonator)) == 1}) then {
private _clackerItems = _giver getVariable [QGVAR(Clackers), []];
_receiver setVariable [QGVAR(Clackers), (_receiver getVariable [QGVAR(Clackers), []]) + _clackerItems, true];
diff --git a/addons/explosives/functions/fnc_openTimerUI.sqf b/addons/explosives/functions/fnc_openTimerUI.sqf
index 0a490a096dd..391c71b3b24 100644
--- a/addons/explosives/functions/fnc_openTimerUI.sqf
+++ b/addons/explosives/functions/fnc_openTimerUI.sqf
@@ -64,14 +64,14 @@ _display displayAddEventHandler ["MouseZChanged", {
[{
params ["_display", "_pfhID"];
- // Make sure explosive still exists and is near player
- if ((!isNull _display) && {!alive ACE_player} || {!alive GVAR(explosive)} || {(ACE_player distance GVAR(explosive)) > 5}) exitWith {
- INFO_2("explosive became invalid",ACE_player,GVAR(explosive));
- closeDialog 0;
+ if (isNull _display || {!alive ACE_player}) exitWith {
_pfhID call CBA_fnc_removePerFrameHandler;
};
- if (isNull _display) exitWith {
+ // Make sure explosive still exists and is near player
+ if (!alive GVAR(explosive) || {(ACE_player distance GVAR(explosive)) > 5}) exitWith {
+ INFO_2("%1's explosive %2 became invalid",ACE_player,GVAR(explosive));
+ closeDialog 0;
_pfhID call CBA_fnc_removePerFrameHandler;
};
diff --git a/addons/explosives/functions/fnc_placeExplosive.sqf b/addons/explosives/functions/fnc_placeExplosive.sqf
index ec19a6f6fd9..bb6fcea6ab3 100644
--- a/addons/explosives/functions/fnc_placeExplosive.sqf
+++ b/addons/explosives/functions/fnc_placeExplosive.sqf
@@ -37,15 +37,15 @@ if (isNil "_triggerConfig") exitWith {
objNull
};
-private _magazineTrigger = ConfigFile >> "CfgMagazines" >> _magazineClass >> "ACE_Triggers" >> _triggerConfig;
-_triggerConfig = ConfigFile >> "ACE_Triggers" >> _triggerConfig;
+private _magazineTrigger = configFile >> "CfgMagazines" >> _magazineClass >> "ACE_Triggers" >> _triggerConfig;
+_triggerConfig = configFile >> "ACE_Triggers" >> _triggerConfig;
if (isNil "_triggerConfig") exitWith {
ERROR_1("Config not found in PlaceExplosive: %1",_this);
objNull
};
-private _ammo = getText(ConfigFile >> "CfgMagazines" >> _magazineClass >> "ammo");
+private _ammo = getText(configFile >> "CfgMagazines" >> _magazineClass >> "ammo");
if (isText(_magazineTrigger >> "ammo")) then {
_ammo = getText (_magazineTrigger >> "ammo");
};
diff --git a/addons/explosives/functions/fnc_selectTrigger.sqf b/addons/explosives/functions/fnc_selectTrigger.sqf
index 7c7d5e58d46..0a864a77c48 100644
--- a/addons/explosives/functions/fnc_selectTrigger.sqf
+++ b/addons/explosives/functions/fnc_selectTrigger.sqf
@@ -20,7 +20,7 @@
params ["_explosive", "_magazine", "_trigger"];
TRACE_3("params",_explosive,_magazine,_trigger);
-private _config = ConfigFile >> "ACE_Triggers" >> _trigger;
+private _config = configFile >> "ACE_Triggers" >> _trigger;
// Make selected trigger the active one (for keybind) if it's the first to be connected
private _activeTrigger = GVAR(activeTrigger);
diff --git a/addons/explosives/functions/fnc_setupExplosive.sqf b/addons/explosives/functions/fnc_setupExplosive.sqf
index 918bbb0c33c..9214b999146 100644
--- a/addons/explosives/functions/fnc_setupExplosive.sqf
+++ b/addons/explosives/functions/fnc_setupExplosive.sqf
@@ -29,8 +29,8 @@ if (!isClass (configFile >> "CfgVehicles" >> _setupObjectClass)) exitWith {ERROR
private _p3dModel = getText (configFile >> "CfgVehicles" >> _setupObjectClass >> "model");
if (_p3dModel == "") exitWith {ERROR("No Model");}; //"" - will crash game!
-[_unit, "forceWalk", "ACE_Explosives", true] call EFUNC(common,statusEffect_set);
-[_unit, "blockThrow", "ACE_Explosives", true] call EFUNC(common,statusEffect_set);
+[_unit, "forceWalk", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
+[_unit, "blockThrow", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
//Show mouse buttons:
[localize LSTRING(PlaceAction), localize LSTRING(CancelAction), localize LSTRING(ScrollAction)] call EFUNC(interaction,showMouseHint);
@@ -78,7 +78,7 @@ GVAR(TweakedAngle) = 0;
{
private _testPos = _testBase vectorAdd [0.1 * (_x select 0) * (cos _cameraAngle), 0.1 * (_x select 0) * (sin _cameraAngle), 0.1 * (_x select 1)];
#ifdef DEBUG_MODE_FULL
- drawLine3d [(eyePos _unit) call EFUNC(common,ASLToPosition), (_testPos) call EFUNC(common,ASLToPosition), [1,0,0,1]];
+ drawLine3D [(eyePos _unit) call EFUNC(common,ASLToPosition), (_testPos) call EFUNC(common,ASLToPosition), [1,0,0,1]];
#endif
if ((lineIntersectsSurfaces [eyePos _unit, _testPos, _unit]) isNotEqualTo []) exitWith {_return = false;};
} forEach [[0,0], [-1,-1], [1,-1], [-1,1], [1,1]];
@@ -149,8 +149,8 @@ GVAR(TweakedAngle) = 0;
[_pfID] call CBA_fnc_removePerFrameHandler;
GVAR(pfeh_running) = false;
- [_unit, "forceWalk", "ACE_Explosives", false] call EFUNC(common,statusEffect_set);
- [_unit, "blockThrow", "ACE_Explosives", false] call EFUNC(common,statusEffect_set);
+ [_unit, "forceWalk", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
+ [_unit, "blockThrow", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
[] call EFUNC(interaction,hideMouseHint);
[_unit, "DefaultAction", (_unit getVariable [QGVAR(placeActionEH), -1])] call EFUNC(common,removeActionEventHandler);
[_unit, "zoomtemp", (_unit getVariable [QGVAR(cancelActionEH), -1])] call EFUNC(common,removeActionEventHandler);
@@ -167,7 +167,7 @@ GVAR(TweakedAngle) = 0;
if (isNull _attachVehicle) then {
_placeAngle = _cameraAngle - GVAR(TweakedAngle) + 180;
- _expSetupVehicle setPosAsl _virtualPosASL;
+ _expSetupVehicle setPosASL _virtualPosASL;
_expSetupVehicle setDir _placeAngle;
_placeAngle = _placeAngle + 180; //CfgAmmos seem to be 180 for some reason
} else {
diff --git a/addons/explosives/functions/fnc_startDefuse.sqf b/addons/explosives/functions/fnc_startDefuse.sqf
index e023592547c..ef3efac885f 100644
--- a/addons/explosives/functions/fnc_startDefuse.sqf
+++ b/addons/explosives/functions/fnc_startDefuse.sqf
@@ -25,8 +25,8 @@ private _fnc_DefuseTime = {
params ["_specialist", "_target"];
TRACE_2("defuseTime",_specialist,_target);
private _defuseTime = 5;
- if (isNumber(ConfigFile >> "CfgAmmo" >> typeOf (_target) >> QGVAR(DefuseTime))) then {
- _defuseTime = getNumber(ConfigFile >> "CfgAmmo" >> typeOf (_target) >> QGVAR(DefuseTime));
+ if (isNumber(configFile >> "CfgAmmo" >> typeOf (_target) >> QGVAR(DefuseTime))) then {
+ _defuseTime = getNumber(configFile >> "CfgAmmo" >> typeOf (_target) >> QGVAR(DefuseTime));
};
if (!_specialist && {GVAR(PunishNonSpecialists)}) then {
_defuseTime = _defuseTime * 1.5;
@@ -34,7 +34,7 @@ private _fnc_DefuseTime = {
_defuseTime
};
private _actionToPlay = "MedicOther";
-if (STANCE _unit == "Prone") then {
+if (stance _unit == "Prone") then {
_actionToPlay = "PutDown";
};
diff --git a/addons/explosives/functions/fnc_triggerType.sqf b/addons/explosives/functions/fnc_triggerType.sqf
index 0fba459491b..aa890c049f2 100644
--- a/addons/explosives/functions/fnc_triggerType.sqf
+++ b/addons/explosives/functions/fnc_triggerType.sqf
@@ -19,10 +19,10 @@ params ["_magazineClassname"];
TRACE_1("params",_magazineClassname);
private _result = [];
-private _config = getArray (ConfigFile >> "CfgMagazines" >> _magazineClassname >> "ACE_Triggers" >> "SupportedTriggers");
+private _config = getArray (configFile >> "CfgMagazines" >> _magazineClassname >> "ACE_Triggers" >> "SupportedTriggers");
private _count = count _config;
for "_index" from 0 to (_count - 1) do {
- _result set [_index, ConfigFile >> "ACE_Triggers" >> (_config select _index)];
+ _result set [_index, configFile >> "ACE_Triggers" >> (_config select _index)];
};
_result
diff --git a/addons/explosives/initSettings.inc.sqf b/addons/explosives/initSettings.inc.sqf
index bdbd488550d..baa38f0d8f9 100644
--- a/addons/explosives/initSettings.inc.sqf
+++ b/addons/explosives/initSettings.inc.sqf
@@ -6,7 +6,7 @@ private _categoryStr = format ["ACE %1", LLSTRING(Menu)];
[LLSTRING(RequireSpecialist_DisplayName),LLSTRING(RequireSpecialist_Description)],
_categoryStr,
false,
- true
+ 1
] call CBA_fnc_addSetting;
[
@@ -15,7 +15,7 @@ private _categoryStr = format ["ACE %1", LLSTRING(Menu)];
[LLSTRING(PunishNonSpecialists_DisplayName),LLSTRING(PunishNonSpecialists_Description)],
_categoryStr,
true,
- true
+ 1
] call CBA_fnc_addSetting;
[
@@ -24,7 +24,7 @@ private _categoryStr = format ["ACE %1", LLSTRING(Menu)];
[LLSTRING(ExplodeOnDefuse_DisplayName),LLSTRING(ExplodeOnDefuse_Description)],
_categoryStr,
true,
- true
+ 1
] call CBA_fnc_addSetting;
// Variable names to preserve https://github.com/acemod/ACE3/pull/6882
@@ -34,7 +34,7 @@ private _categoryStr = format ["ACE %1", LLSTRING(Menu)];
[LLSTRING(TimerMin_DisplayName), LLSTRING(TimerMin_Description)],
[_categoryStr, LLSTRING(ExplosiveTimer)],
[0, 5999, TIMER_VALUE_MIN],
- true
+ 1
] call CBA_fnc_addSetting;
[
@@ -43,7 +43,7 @@ private _categoryStr = format ["ACE %1", LLSTRING(Menu)];
[LLSTRING(TimerMax_DisplayName), LLSTRING(TimerMax_Description)],
[_categoryStr, LLSTRING(ExplosiveTimer)],
[0, 5999, TIMER_VALUE_MAX],
- true
+ 1
] call CBA_fnc_addSetting;
[
@@ -51,6 +51,5 @@ private _categoryStr = format ["ACE %1", LLSTRING(Menu)];
"TIME",
[LLSTRING(TimerDefault_DisplayName), LLSTRING(TimerDefault_Description)],
[_categoryStr, LLSTRING(ExplosiveTimer)],
- [0, 5999, TIMER_VALUE_DEFAULT],
- false
+ [0, 5999, TIMER_VALUE_DEFAULT]
] call CBA_fnc_addSetting;
diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml
index 168a8302542..d8397320b88 100644
--- a/addons/explosives/stringtable.xml
+++ b/addons/explosives/stringtable.xml
@@ -221,7 +221,7 @@
Ativar Thor III
Активировать Thor III
Thor III を使う
- Thor III 켜기
+ 토르 III 켜기
开启索尔三型
開啟索爾三型
Thor III ü aç
@@ -238,7 +238,7 @@
Desativar Thor III
Деактивировать Thor III
Thor III を止める
- Thor III 끄기
+ 토르 III 끄기
关闭索尔三型
關閉索爾三型
Thor III ü kapat
@@ -847,7 +847,7 @@
Требуется ли специалист по минному делу для обезвреживания взрывчатки? По умолчанию: Нет
Richiedi specialisti esplosivi per disabilitare esplosivi? Predefinito: No
爆発物を無効にするために爆発物専門兵の特性を必要としますか? デフォルト: 不要
- 폭발물을 해제하기 위해서는 전문가가 필요합니까? 기본설정: 아니요
+ 폭발물을 해체하기 위해서는 전문가가 필요합니까? 기본설정: 아니요
需要爆破专业兵才能拆除爆炸物? 预设:否
需要炸彈專家才能拆除炸彈? 預設: 否
Patlayıcı uzmanlarının patlayıcıları etkisiz hale getirmesini ister misiniz? Varsayılan: Hayır
@@ -880,7 +880,7 @@
Увеличивать время завершения действий для не-специалистов? По умолчанию: Нет
Aumenta il tempo richiesto per completare azioni per non-specialisti? Predefinito: Si
専門兵以外がアクション完了するのに必要な時間を増加しますか? デフォルト: 有効
- 비전문가가 폭발물을 해제 시 더욱 많은 시간을 소요합니까? 기본설정: 예
+ 비전문가가 폭발물을 해체 시 더욱 많은 시간을 소요합니까? 기본설정: 예
增加非专业人员相关操作的时间? 预设:是
增加非專業人員相關操作的時間? 預設: 是
@@ -896,7 +896,7 @@
Взрыв при разминировании?
Detona se disarmati?
解除中に爆発するか?
- 해제 시 폭발합니까?
+ 해체 시 폭발합니까?
拆除时引爆?
拆除時引爆?
@@ -912,7 +912,7 @@
Разрешить определенным взрывным устройствам взрываться при разминировании? По умолчанию: Да
Permettere ad alcuni esplosivi di esplodere quando si tenta il disinnesco? Predefinito: Si
特定の爆発物を解除中に爆発可能にしますか? デフォルト: 有効
- 특정 폭발물이 해제 시 폭발하게 합니까? 기본설정: 예
+ 특정 폭발물이 해체 시 폭발하게 합니까? 기본설정: 예
启用后,某些爆炸物会在拆除时引爆? 预设:是
啟用後, 某些炸彈會在拆除時引爆? 預設: 是
diff --git a/addons/fastroping/XEH_postInit.sqf b/addons/fastroping/XEH_postInit.sqf
index 0ba92312153..0cfeee67bd9 100644
--- a/addons/fastroping/XEH_postInit.sqf
+++ b/addons/fastroping/XEH_postInit.sqf
@@ -40,13 +40,21 @@ if (isServer) then {
}, true, ["ACE_friesBase"], true] call CBA_fnc_addClassEventHandler;
};
+// Handles the Vanilla respawn module
+[missionNamespace, "respawn", {
+ params ["_vehicle"];
+
+ if !(_vehicle getVariable [QGVAR(addFRIESOnRespawn), false]) exitWith {};
+
+ _vehicle call FUNC(equipFRIES);
+}] call BIS_fnc_addScriptedEventHandler;
#ifdef DRAW_FASTROPE_INFO
addMissionEventHandler ["Draw3D", {
if !(cursorObject isKindOf "Helicopter") exitWith {};
private _config = configOf cursorObject;
private _enabled = getNumber (_config >> QGVAR(enabled));
- drawIcon3D ["", [.5,.5,1,1], (ASLtoAGL getPosASL cursorObject), 0.5, 0.5, 0, format ["%1 = %2", typeOf cursorObject, _enabled], 0.5, 0.025, "TahomaB"];
+ drawIcon3D ["", [.5,.5,1,1], (ASLToAGL getPosASL cursorObject), 0.5, 0.5, 0, format ["%1 = %2", typeOf cursorObject, _enabled], 0.5, 0.025, "TahomaB"];
if (_enabled > 0) then {
{
private _hookAttachment = cursorObject getVariable [QGVAR(FRIES), cursorObject];
diff --git a/addons/fastroping/functions/fnc_deployRopes.sqf b/addons/fastroping/functions/fnc_deployRopes.sqf
index eea81a77461..c4e999db17c 100644
--- a/addons/fastroping/functions/fnc_deployRopes.sqf
+++ b/addons/fastroping/functions/fnc_deployRopes.sqf
@@ -26,7 +26,7 @@ private _ropeOrigins = getArray (_config >> QGVAR(ropeOrigins));
private _deployedRopes = _vehicle getVariable [QGVAR(deployedRopes), []];
private _hookAttachment = _vehicle getVariable [QGVAR(FRIES), _vehicle];
-private _ropeLength = getNumber (configfile >> "CfgWeapons" >> _ropeClass >> QEGVAR(logistics_rope,length));
+private _ropeLength = getNumber (configFile >> "CfgWeapons" >> _ropeClass >> QEGVAR(logistics_rope,length));
if (_ropeLength <= 0) then {
_ropeLength = DEFAULT_ROPE_LENGTH;
diff --git a/addons/fastroping/functions/fnc_equipFRIES.sqf b/addons/fastroping/functions/fnc_equipFRIES.sqf
index 615840cb75d..869473cdd14 100644
--- a/addons/fastroping/functions/fnc_equipFRIES.sqf
+++ b/addons/fastroping/functions/fnc_equipFRIES.sqf
@@ -19,7 +19,7 @@
params ["_vehicle"];
if (!alive _vehicle) exitWith { WARNING_1("bad vehicle %1",_this); };
- if (alive (_vehicle getVariable [QGVAR(FRIES),objNull])) exitWith { WARNING_1("already equiped %1",_this); };
+ if (alive (_vehicle getVariable [QGVAR(FRIES), objNull])) exitWith { WARNING_1("already equipped %1",_this); };
private _config = configOf _vehicle;
if !(isNumber (_config >> QGVAR(enabled))) then {
@@ -29,6 +29,12 @@
private _fries = (getText (_config >> QGVAR(friesType))) createVehicle [0, 0, 0];
_fries attachTo [_vehicle, getArray (_config >> QGVAR(friesAttachmentPoint))];
_vehicle setVariable [QGVAR(FRIES), _fries, true];
+
+ // The Vanilla respawn module copies all variables from old object to new one
+ // Use that to move variable from wreck to new vehicle
+ _vehicle setVariable [QGVAR(addFRIESOnRespawn), true, true];
};
};
}, _this] call CBA_fnc_execNextFrame;
+
+nil
diff --git a/addons/fastroping/stringtable.xml b/addons/fastroping/stringtable.xml
index 10ea50a7c51..b8245c77829 100644
--- a/addons/fastroping/stringtable.xml
+++ b/addons/fastroping/stringtable.xml
@@ -134,10 +134,10 @@
Equipa el helicoptero seleccionado con un Sistema de Inserción/Extracción Rápida por Cuerda
Equipaggia l'elicottero selezionato con il Fast Rope Insertion Extraction System
Vybavit vybraný vrtulník systémem Fast Rope Insertion Extraction (FRIES)
- Equipa um helicóptero selecionado com um sistema de Fast Rope Insertion Extraction System
+ Equipa o helicóptero selecionado com um Sistema de Inserção/Extração Rápida por Corda
Снаряжает выбранный вертолет оборудованием для спуска десанта по канатам
選択されたヘリコプターで Fast Rope Insertion Extraction System を使えるようにします。
- 선택된 헬리콥터에 패스트로프 투입 및 탈출 시스템을 장착합니다.
+ 선택된 헬리콥터에 패스트로프 투입 및 탈출 시스템(FRIES)을 장착합니다.
使指定的直升机启用快速绳降及撤离系统
使指定的直升機啟用快速繩降及撤離系統
@@ -298,6 +298,7 @@
Schnelles-Abseilen
Fast Rope
패스트로프
+ Descida rápida pela corda
Require rope item to deploy
@@ -321,7 +322,7 @@
FRIESの自動装備
FRIES automatisch ausrüsten
Auto-Aggiungi FRIES
- FRIES 로프 자동 장착
+ 패스트로프 자동 장착
Equipement automatique FRIES
Auto-equipar FRIES
Авто-подготовка канатов
@@ -333,7 +334,7 @@
FRIESをサポートするヘリコプターに自動的にFRIESを追加します。
FRIES automatisch Helikoptern hinzufügen, die es unterstützen
Aggiunge il sistema FRIES in automatico su elicotteri compatibili.
- 로프를 지원하는 헬기에 자동으로 FRIES 로프를 추가합니다.
+ 로프를 지원하는 헬기에 자동으로 패스트로프를 추가합니다.
Ajoute automatiquement des FRIES aux hélicoptères qui les supportent.
Adiciona automaticamente FRIES a helicópteros que os suportam.
Автоматически добавляйте канаты в вертолеты, которые их поддерживают.
diff --git a/addons/fcs/CfgOptics.hpp b/addons/fcs/CfgOptics.hpp
index f8770d7327d..551a965a60d 100644
--- a/addons/fcs/CfgOptics.hpp
+++ b/addons/fcs/CfgOptics.hpp
@@ -26,7 +26,7 @@ class RscInGameUI {
};
};
class Rsc_ACE_Helo_UI_Turret: RscUnitInfo { // RscOptics_Heli_Attack_01_gunner
- onLoad = "[""onLoad"",_this,""RscUnitInfo"",'IGUI'] call (uinamespace getvariable 'BIS_fnc_initDisplay'); uiNamespace setVariable ['ACE_dlgRangefinder', _this select 0]; ((_this select 0) displayCtrl 151) ctrlSetTextColor [0, 0, 0, 0];";
+ onLoad = "[""onLoad"",_this,""RscUnitInfo"",'IGUI'] call (uiNamespace getvariable 'BIS_fnc_initDisplay'); uiNamespace setVariable ['ACE_dlgRangefinder', _this select 0]; ((_this select 0) displayCtrl 151) ctrlSetTextColor [0, 0, 0, 0];";
class CA_IGUI_elements_group: RscControlsGroup {
class controls {
MACRO_RANGEFINDER
diff --git a/addons/fcs/config.cpp b/addons/fcs/config.cpp
index 88e803d0ca4..433f17ac8be 100644
--- a/addons/fcs/config.cpp
+++ b/addons/fcs/config.cpp
@@ -27,13 +27,6 @@ class CfgPatches {
#include "CfgOptics.hpp"
-class ACE_Extensions {
- class ace_fcs {
- windows = 1;
- client = 1;
- };
-};
-
class ACE_Tests {
fcs = QPATHTOF(dev\test_debugConfigs.sqf);
};
diff --git a/addons/fcs/dev/test_debugConfigs.sqf b/addons/fcs/dev/test_debugConfigs.sqf
index c3739123639..dacf8624f37 100644
--- a/addons/fcs/dev/test_debugConfigs.sqf
+++ b/addons/fcs/dev/test_debugConfigs.sqf
@@ -71,13 +71,13 @@ private _problemUIs = [];
_problemUIs pushBackUnique format ["%1: ACE_FCS, but missing ACE_CA_DIST", _turretInfo];
};
if (_aceFCS && {(198 in _idcList)}) then {
- _problemUIs pushBackUnique format ["%1: ACE_FCS, but NEW Lazr CA_DIST", _turretInfo, _vehicleType];
+ _problemUIs pushBackUnique format ["%1-%2: ACE_FCS, but NEW Lazr CA_DIST", _turretInfo, _vehicleType];
};
if ((!_aceFCS) && {(1713151 in _idcList)}) then {
- _problemUIs pushBackUnique format ["%1: Not ACE but has ACE_CA_DIST", _turretInfo, _vehicleType];
+ _problemUIs pushBackUnique format ["%1-%2: Not ACE but has ACE_CA_DIST", _turretInfo, _vehicleType];
};
if (_vanillaFCS && {!(198 in _idcList)}) then {
- _problemUIs pushBackUnique format ["%1: vanillaFCS but missing NEW Lazr CA_DIST [just a warning]", _turretInfo, _vehicleType];
+ _problemUIs pushBackUnique format ["%1-%2: vanillaFCS but missing NEW Lazr CA_DIST [just a warning]", _turretInfo, _vehicleType];
};
};
};
diff --git a/addons/fcs/functions/fnc_calculateSolution.sqf b/addons/fcs/functions/fnc_calculateSolution.sqf
index b0cb2ea1c4e..de9462848d7 100644
--- a/addons/fcs/functions/fnc_calculateSolution.sqf
+++ b/addons/fcs/functions/fnc_calculateSolution.sqf
@@ -63,7 +63,7 @@ private _turretConfig = [configOf _vehicle, _turret] call EFUNC(common,getTurret
};
} forEach (_vehicle weaponsTurret _turret);
- private _offset = "ace_fcs" callExtension format ["%1,%2,%3,%4", _initSpeed, _airFriction, _angleTarget, _distance];
+ private _offset = ("ace" callExtension ["fcs", [_initSpeed, _airFriction, _angleTarget, _distance]]) # 0;
_offset = parseNumber _offset;
_FCSInitSpeed pushBack _initSpeed;
diff --git a/addons/fcs/functions/fnc_firedEH.sqf b/addons/fcs/functions/fnc_firedEH.sqf
index e99416593af..d4e79e84617 100644
--- a/addons/fcs/functions/fnc_firedEH.sqf
+++ b/addons/fcs/functions/fnc_firedEH.sqf
@@ -41,7 +41,7 @@ if (_zeroDistance > 0) then {
private _weaponCombo = [_weapon, _magazine, _ammo, _zeroDistance];
if (_weaponCombo isNotEqualTo (_gunner getVariable [QGVAR(lastWeaponCombo), []])) then {
private _airFriction = getNumber (configFile >> "CfgAmmo" >> _ammo >> "airFriction");
- private _antiOffset = "ace_fcs" callExtension format ["%1,%2,%3,%4", _initSpeed, _airFriction, 0, _zeroDistance];
+ private _antiOffset = ("ace" callExtension ["fcs", [_initSpeed, _airFriction, 0, _zeroDistance]]) # 0;
_antiOffset = parseNumber _antiOffset;
_gunner setVariable [QGVAR(lastWeaponCombo), _weaponCombo];
diff --git a/addons/fcs/functions/fnc_getAngle.sqf b/addons/fcs/functions/fnc_getAngle.sqf
index 9a856d46c97..03e8b4fdc8e 100644
--- a/addons/fcs/functions/fnc_getAngle.sqf
+++ b/addons/fcs/functions/fnc_getAngle.sqf
@@ -21,7 +21,7 @@
* Public: No
*/
-#define PRECISION 0.1
+#define VAR_PRECISION 0.1
params ["_distance", "_angleTarget", "_maxElev", "_initSpeed", "_airFriction", "_timeToLive", "_simulationStep"];
@@ -69,9 +69,9 @@ private _it2 = 0;
_data set [7, _maxElev];
private _f1 = _data call _fnc_traceBullet;
-if (abs _f1 <= PRECISION) exitWith {0};
+if (abs _f1 <= VAR_PRECISION) exitWith {0};
-while {abs _f1 > PRECISION} do {
+while {abs _f1 > VAR_PRECISION} do {
_data set [7, _angle2];
private _f2 = _data call _fnc_traceBullet;
diff --git a/addons/field_rations/XEH_postInit.sqf b/addons/field_rations/XEH_postInit.sqf
index 9fc8406abaf..dac701845f4 100644
--- a/addons/field_rations/XEH_postInit.sqf
+++ b/addons/field_rations/XEH_postInit.sqf
@@ -38,6 +38,7 @@ if !(hasInterface) exitWith {};
[false, false, false, false, true]
] call EFUNC(interact_menu,createAction);
+ //IGNORE_PRIVATE_WARNING ["_player", "_target"];
private _subActions = [
[
QGVAR(checkWater),
diff --git a/addons/field_rations/functions/fnc_getActionOffset.sqf b/addons/field_rations/functions/fnc_getActionOffset.sqf
index dd7658dfda1..763654c6559 100644
--- a/addons/field_rations/functions/fnc_getActionOffset.sqf
+++ b/addons/field_rations/functions/fnc_getActionOffset.sqf
@@ -18,11 +18,11 @@
params ["_object"];
private _configOf = configOf _object;
-if !(isNull _configOf) then {
+if (isNull _configOf) then {
+ // Check for offset corresponding to p3d list
+ GVAR(waterSourceOffsets) param [GVAR(waterSourceP3ds) find (getModelInfo _object select 0), [0, 0, 0], [[]]];
+} else {
// Check for offset in config since we have valid typeOf
private _offset = getArray (_configOf >> QXGVAR(offset));
if (_offset isEqualTo []) then {[0, 0, 0]} else {_offset};
-} else {
- // Check for offset corresponding to p3d list
- GVAR(waterSourceOffsets) param [GVAR(waterSourceP3ds) find (getModelInfo _object select 0), [0, 0, 0], [[]]];
};
diff --git a/addons/field_rations/functions/fnc_getConsumableChildren.sqf b/addons/field_rations/functions/fnc_getConsumableChildren.sqf
index 9fe422109c0..73e75e29a47 100644
--- a/addons/field_rations/functions/fnc_getConsumableChildren.sqf
+++ b/addons/field_rations/functions/fnc_getConsumableChildren.sqf
@@ -18,6 +18,7 @@
params ["_player"];
private _fnc_getActions = {
+ //IGNORE_PRIVATE_WARNING ["_player"];
TRACE_1("Creating consumable item actions",_player);
private _actions = [];
diff --git a/addons/field_rations/functions/fnc_getRemainingWater.sqf b/addons/field_rations/functions/fnc_getRemainingWater.sqf
index 253fd62285d..1011136e0ce 100644
--- a/addons/field_rations/functions/fnc_getRemainingWater.sqf
+++ b/addons/field_rations/functions/fnc_getRemainingWater.sqf
@@ -23,7 +23,10 @@ private _water = _source getVariable QGVAR(currentWaterSupply);
if (isNil "_water") then {
private _configOf = configOf _source;
- if !(isNull _configOf) then {
+ if (isNull _configOf) then {
+ // Check the p3d name against list
+ _water = if ((getModelInfo _source select 0) in GVAR(waterSourceP3ds)) then {REFILL_WATER_INFINITE} else {REFILL_WATER_DISABLED};
+ } else {
// Check for waterSupply entry since we have valid typeOf
_water = getNumber (_configOf >> QXGVAR(waterSupply));
if (_water == 0) then {_water = REFILL_WATER_DISABLED};
@@ -35,9 +38,6 @@ if (isNil "_water") then {
_source setVariable [QGVAR(currentWaterSupply), _water, true];
};
};
- } else {
- // Check the p3d name against list
- _water = if ((getModelInfo _source select 0) in GVAR(waterSourceP3ds)) then {REFILL_WATER_INFINITE} else {REFILL_WATER_DISABLED};
};
};
diff --git a/addons/field_rations/initSettings.inc.sqf b/addons/field_rations/initSettings.inc.sqf
index 86bf04aed2f..16e2d4eb2d6 100644
--- a/addons/field_rations/initSettings.inc.sqf
+++ b/addons/field_rations/initSettings.inc.sqf
@@ -4,9 +4,9 @@
[ELSTRING(common,Enabled), LSTRING(Enabled_Description)],
LSTRING(DisplayName),
false,
- true,
- {},
- true // Needs restart
+ 1,
+ {[QXGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)},
+ true // Needs mission restart
] call CBA_fnc_addSetting;
[
diff --git a/addons/field_rations/stringtable.xml b/addons/field_rations/stringtable.xml
index 2b443ccc3c0..50fece7cfb1 100644
--- a/addons/field_rations/stringtable.xml
+++ b/addons/field_rations/stringtable.xml
@@ -302,7 +302,7 @@
Influenza la Fatica Avanzata
與進階疲勞聯動
与进阶疲劳联动
- アドバンスド疲労への影響
+ 高度な疲労への影響
Влияние на продвинутую усталость
Wpływ na zaawansowane zmęczenie
Gelişmiş Yorgunluk
@@ -317,7 +317,7 @@
Determina se fame e sete influenzano la Fatica Avanzata ACE.
是否讓飲食影響到ACE的進階疲勞。
是否让饮食影响到 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.
@@ -870,7 +870,7 @@
A vízzel töltött kantin
Una borraccia riempita per metà di acqua
半分入っている水筒
- 반이 차 있는 수통입니다
+ 물이 반 정도 차 있는 수통입니다
Manierka w połowie wypełniona wodą
Uma meia cantina cheia de água
Наполовину заполненая водой фляга
diff --git a/addons/fieldmanual/stringtable.xml b/addons/fieldmanual/stringtable.xml
index 12e34d0e34d..9cf2290de2d 100644
--- a/addons/fieldmanual/stringtable.xml
+++ b/addons/fieldmanual/stringtable.xml
@@ -169,6 +169,7 @@
%3IV 輸液%4は失われた血液を回復します。血液、血漿、生理食塩水は機能的には同じです。<br/><br/>%3使用方法:%4<br/>%2[%3%13%4] または [%3%14%4] を使って四肢を選択します。<br/>%2希望の%3IV 輸液%4の種類を選択して、血液量を復元します。
%%3Внутривенные жидкости%4восстанавливают потерянный объем крови. Кровь, плазма и физраствор функционально идентичны.<br/><br/>%3 Использование:%4<br/>%2 Используйте [%3%13%4] или [%3%14%4] и выберите добавку.<br/>%2 Восстановите объем крови выбрав желаемый %4тип %3жидкости
Los %3Fluidos IV%4 restauran el volumen de sangre. Sangre, Plasma, y Salino funcionan de manera similar.<br/><br/>%3Uso:%4<br/>%2Uso [%3%13%4] o [%3%14%4] y seleccionar una extremidad.<br/>%2Restaura el volumen de sangre seleccionando el tipo de %3Fluido IV%4 elegido.
+ %3IV fluides%4 restaurer le volume sanguin perdu. Sang, Plasma, and Saline fonctionnent de la même manière.<br/><br/>%3Utilisation:%4<br/>%2Utiliser [%3%13%4] ou [%3%14%4] et sélectionner un appendice.<br/>%2Restaurer le volume sanguin en sélectionnant le volume désiré %3IV Fluide%4 type.
Increase Heart Rate | Wake Up Faster
@@ -624,7 +625,7 @@
Zaawansowany DAGR
DAGR Avanzato
고급형 DAGR입니다
- より高度なDAGR
+ 高機能なDAGR
Продвинутый DAGR
DAGR avancé
DAGR Avanzado
@@ -634,7 +635,7 @@
%3MicroDAGR GPS%4 jest zaawansowaną wersją %3DAGR%4. Dostarcza dane oparte o pozycję, nawigację, i czas (PNT): <br/>%2Kompas i kierunek<br/>%2Datę i godzinę zsynchronizowaną z misją<br/>%2Elewację (relatywną do poziomu morza)<br/>%2Obecną prędkość<br/>%2GPS z widokiem topograficznym i satelitarnym<br/>%2Tworzenie, nazywanie oraz usuwanie waypointów<br/>%2Identyfikację sojuszników (Wymaga ACE BLUFOR Tracker)<br/>Połączenie do dalmierza Vector-21 w celu importu danych (waypointy i współrzędne zmierzonego celu)<br/><br/>%3Użycie: %4<br/>%2Po instrukcję użycia odwiedź %3MicroDAGR%4 wiki.
Il %3GPS MicroDAGR%4 è una versione avanzata del %3DAGR%4. Esso mostra dati su posizione, navigazione e tempismo (PNT), includendo:<br/>%2Bussola e azimut<br/>%2Data e ora sincronizzate con la missione<br/>%2Elevazione (dal livello del mare)<br/>%2Velocità attuale<br/>%2GPS con visuale topografica e satellitare<br/>%2Creazione, rinomina e rimozione di waypoint<br/>%2Identificazione di alleati (Richiede Impostazioni ACE BLUFOR Tracker)<br/>Connessione al Telemetro Vector-21 per importazione di dati (creazione waypoint e indicazione di griglia su bersagli puntati)<br/><br/>%3Utilizzo:%4<br/>%2Per informazioni sull'utilizzo sei pregato di visitare la pagina wiki dedicata al %3MicroDAGR%4.
%3마이크로DAGR GPS%4는 %3DAGR%4의 고급 버전입니다. 다음과 같이 위치, 내비게이션 및 타이밍(PNT) 데이터를 제공합니다:<br/>%2나침반 및 방향<br/>%2임무와 동기화된 날짜 및 시간<br/>%2고도 (해수면 기준)<br/>%2현재 속도<br/>%2지형 및 위성 시점 기능이 있는 GPS<br/>%2웨이포인트 생성, 작명 및 삭제<br/>%2아군 식별 (ACE의 GPS 피아식별기 켜기 체크 필요)<br/>%2데이터를 가져오기 위한 벡터-21 거리계에 연결(원거리 대상의 웨이포인트 생성 및 좌표 참조)<br/><br/>%3사용 방법:%4<br/>%2사용 방법을 보려면 전용 %3마이크로DAGR%4의 위키를 방문하십시오.
- %3MicroDAGR GPS%4は%3DAGR%4のより高度なバージョンです。測位、航法、計時(PNT)データが提供されます。これには以下の情報を含みます:<br/>%2コンパスと方位<br/>%2ミッションに同期された日付と時間<br/>%2標高 (海面に対する相対値)<br/>%2現在の速度<br/>%2地形図と衛星ビューを備えたGPS<br/>%2ウェイポイントの作成、名前付け、および削除<br/>%2友軍の識別 (ACE ブルーフォーストラッキング設定が必要)<br/>ベクター21レンジファインダーへの接続とデータのインポート (ウェイポイントの作成と遠距離ターゲットのグリッド参照)<br/><br/>%3使用方法:%4<br/>%2使用手順については、専用の %3MicroDAGR%4 wiki を参照してください。
+ %3MicroDAGR GPS%4は%3DAGR%4のより高機能なバージョンです。測位、航法、計時(PNT)データが提供されます。これには以下の情報を含みます:<br/>%2コンパスと方位<br/>%2ミッションに同期された日付と時間<br/>%2標高 (海面に対する相対値)<br/>%2現在の速度<br/>%2地形図と衛星ビューを備えたGPS<br/>%2ウェイポイントの作成、名前付け、および削除<br/>%2友軍の識別 (ACE ブルーフォーストラッキング設定が必要)<br/>ベクター21レンジファインダーへの接続とデータのインポート (ウェイポイントの作成と遠距離ターゲットのグリッド参照)<br/><br/>%3使用方法:%4<br/>%2使用手順については、専用の %3MicroDAGR%4 wiki を参照してください。
El %3GPS MicroDAGR%4 es una versión avanzada del %3DAGR%4. Provee de posicionamiento, navegación y datos de temporización (PNT) que incluye:<br/>%2Brújula y dirección<br/>%2Fecha y hora sincronizada con la misión<br/>%2Elevación (relativa al nivel del mar)<br/>%2Velocidad actual<br/>%2GPS con vista topográfica y satelital<br/>%2Creación, nombrado y borrado de puntos de ruta<br/>%2Identificación de aliados (Requiere la opción de ACE BLUFOR Tracker)<br/>Conexión con el telémetro Vector-21 para importación de datos (creación de puntos de ruta y referenciado en eje de coordenada para objetivos a distancia)<br/><br/>%3Uso:%4<br/>%2Para instrucciones de uso, por favor visita la Wiki dedicada de %3MicroDAGR%4.
diff --git a/addons/finger/functions/fnc_keyPress.sqf b/addons/finger/functions/fnc_keyPress.sqf
index 2445986d15b..16dca938b34 100644
--- a/addons/finger/functions/fnc_keyPress.sqf
+++ b/addons/finger/functions/fnc_keyPress.sqf
@@ -29,8 +29,8 @@ if (diag_tickTime < (GVAR(lastFPTime) + FP_ACTION_TIMEOUT)) exitWith {true};
GVAR(lastFPTime) = diag_tickTime;
// Find where is the finger pointing
-private _originASL = AGLtoASL positionCameraToWorld [0, 0, 0];
-private _fingerPosASL = AGLtoASL positionCameraToWorld [0, 0, FP_DISTANCE];
+private _originASL = AGLToASL positionCameraToWorld [0, 0, 0];
+private _fingerPosASL = AGLToASL positionCameraToWorld [0, 0, FP_DISTANCE];
private _intersections = lineIntersectsSurfaces [_originASL, _fingerPosASL, ACE_player, vehicle ACE_player, true, 1];
if (_intersections isNotEqualTo []) then {
_fingerPosASL = _intersections select 0 select 0;
diff --git a/addons/finger/functions/fnc_perFrameEH.sqf b/addons/finger/functions/fnc_perFrameEH.sqf
index 4af4f6b643e..36acea8a447 100644
--- a/addons/finger/functions/fnc_perFrameEH.sqf
+++ b/addons/finger/functions/fnc_perFrameEH.sqf
@@ -39,7 +39,7 @@ private _iconBaseSize = GVAR(sizeCoef) * BASE_SIZE * 0.10713 * (call EFUNC(commo
_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"];
+ 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/stringtable.xml b/addons/finger/stringtable.xml
index bdb0c835b6b..66c97c70daa 100644
--- a/addons/finger/stringtable.xml
+++ b/addons/finger/stringtable.xml
@@ -62,7 +62,7 @@
Distancia máxima de señalado
Maximální dosah pro ukazování směru
Raggio massimo puntamento
- 指差しの最大範囲
+ 指差しの最大距離
가리키기 최대 범위
指向标记最大显示距离
指向指示器最大顯示距離
@@ -79,7 +79,7 @@
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 [Predefinito: 4 metri]
- 指差しのマーカー表示が他のプレイヤーに表示される最大範囲 [デフォルト: 4メートル]
+ 指差しのマーカー表示が他のプレイヤーに表示される最大距離 [デフォルト: 4メートル]
플레이어 사이에서 가리키기 표시를 보이게 하는 최대거리를 설정합니다[기본설정: 4 미터]
设定指向标记最大显示距离。[预设:4米]
設定指向指示器最大顯示距離。[預設: 4公尺]
diff --git a/addons/fire/addon.toml b/addons/fire/addon.toml
deleted file mode 100644
index bf39213892e..00000000000
--- a/addons/fire/addon.toml
+++ /dev/null
@@ -1,3 +0,0 @@
-[tools]
-pboProject_noBinConfig = true
-sqfvm_skipConfigChecks = true
diff --git a/addons/fire/functions/fnc_burnSimulation.sqf b/addons/fire/functions/fnc_burnSimulation.sqf
index ac98de5dda6..e061d1ce915 100644
--- a/addons/fire/functions/fnc_burnSimulation.sqf
+++ b/addons/fire/functions/fnc_burnSimulation.sqf
@@ -149,7 +149,9 @@ params ["_unit", "_instigator"];
};
// Keep pain around unconsciousness limit to allow for more fun interactions
- private _damageToAdd = [0.15, _intensity / BURN_MAX_INTENSITY] select (!alive _unit || {GET_PAIN_PERCEIVED(_unit) < (PAIN_UNCONSCIOUS + random 0.2)});
+ private _painPercieved = (0 max ((_unit getVariable [QEGVAR(medical,pain), 0]) - (_unit getVariable [QEGVAR(medical,painSuppress), 0])) min 1);
+ private _painUnconscious = missionNamespace getVariable [QEGVAR(medical,painUnconsciousThreshold), 0];
+ private _damageToAdd = [0.15, _intensity / BURN_MAX_INTENSITY] select (!alive _unit || {_painPercieved < _painUnconscious + random 0.2});
if (GETEGVAR(medical,enabled,false)) then {
if (!isNull _instigator) then {
diff --git a/addons/fire/script_component.hpp b/addons/fire/script_component.hpp
index d79ca0d490b..f4b636286b1 100644
--- a/addons/fire/script_component.hpp
+++ b/addons/fire/script_component.hpp
@@ -17,14 +17,6 @@
#include "\z\ace\addons\main\script_macros.hpp"
-#pragma hemtt flag pe23_ignore_has_include
-#if __has_include("\z\ace\addons\medical_engine\script_macros_medical.hpp")
-#include "\z\ace\addons\medical_engine\script_macros_medical.hpp"
-#else
-#define GET_PAIN_PERCEIVED(var) 0
-#define PAIN_UNCONSCIOUS 1
-#endif
-
#define FIRE_MANAGER_PFH_DELAY 0.25
#define FLARE_SIZE_MODIFIER 5
#define PRONE_ROLLING_ANIMS [\
diff --git a/addons/fortify/CfgWeapons.hpp b/addons/fortify/CfgWeapons.hpp
index 66ff7f52d88..82396288721 100644
--- a/addons/fortify/CfgWeapons.hpp
+++ b/addons/fortify/CfgWeapons.hpp
@@ -10,6 +10,7 @@ class CfgWeapons {
picture = QPATHTOF(UI\hammer_ca.paa);
scope = 2;
ACE_isTool = 1;
+ GVAR(fortifyTool) = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 0;
};
diff --git a/addons/fortify/XEH_postInit.sqf b/addons/fortify/XEH_postInit.sqf
index ed13a116c7f..91ce3b7b877 100644
--- a/addons/fortify/XEH_postInit.sqf
+++ b/addons/fortify/XEH_postInit.sqf
@@ -50,6 +50,7 @@ GVAR(objectRotationZ) = 0;
private _text = [format ["Remove Object +$%1", _cost], "Remove Object"] select (_budget == -1);
// Remove object action
+ //IGNORE_PRIVATE_WARNING ["_player"];
private _removeAction = [
QGVAR(removeObject),
_text,
diff --git a/addons/fortify/XEH_preInit.sqf b/addons/fortify/XEH_preInit.sqf
index 382fc805660..50f641f9cf7 100644
--- a/addons/fortify/XEH_preInit.sqf
+++ b/addons/fortify/XEH_preInit.sqf
@@ -13,6 +13,8 @@ GVAR(locations) = [];
// Custom deploy handlers
GVAR(deployHandlers) = [];
+GVAR(fortifyTools) = keys (uiNamespace getVariable QGVAR(fortifyTools));
+
#include "initSettings.inc.sqf"
ADDON = true;
diff --git a/addons/fortify/XEH_preStart.sqf b/addons/fortify/XEH_preStart.sqf
index 022888575ed..4da9eeb40da 100644
--- a/addons/fortify/XEH_preStart.sqf
+++ b/addons/fortify/XEH_preStart.sqf
@@ -1,3 +1,9 @@
#include "script_component.hpp"
#include "XEH_PREP.hpp"
+
+private _fortifyTools = (QUOTE(getNumber (_x >> QQGVAR(fortifyTool)) > 0) configClasses (configFile >> "CfgWeapons") apply {configName _x});
+_fortifyTools append (QUOTE(getNumber (_x >> QQGVAR(fortifyTool)) > 0) configClasses (configFile >> "CfgVehicles") apply {configName _x});
+TRACE_1("",_fortifyTools);
+
+uiNamespace setVariable [QGVAR(fortifyTools), compileFinal (_fortifyTools createHashMapFromArray [])];
diff --git a/addons/fortify/config.cpp b/addons/fortify/config.cpp
index ab12338982f..2808b56cba5 100644
--- a/addons/fortify/config.cpp
+++ b/addons/fortify/config.cpp
@@ -2,6 +2,7 @@
class CfgPatches {
class ADDON {
+ name = COMPONENT_NAME;
units[] = {QXGVAR(setupModule), QXGVAR(buildLocationModule)};
weapons[] = {"ACE_Fortify"};
requiredVersion = REQUIRED_VERSION;
diff --git a/addons/fortify/functions/fnc_addActions.sqf b/addons/fortify/functions/fnc_addActions.sqf
index 4802effa01d..7ac07d1693a 100644
--- a/addons/fortify/functions/fnc_addActions.sqf
+++ b/addons/fortify/functions/fnc_addActions.sqf
@@ -21,7 +21,7 @@ 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;
+private _subActions = createHashMap;
{
_x params ["_classname", "_cost", ["_category", ""]];
diff --git a/addons/fortify/functions/fnc_buildLocationModule.sqf b/addons/fortify/functions/fnc_buildLocationModule.sqf
index c777b80d4e4..497af641f41 100644
--- a/addons/fortify/functions/fnc_buildLocationModule.sqf
+++ b/addons/fortify/functions/fnc_buildLocationModule.sqf
@@ -18,7 +18,7 @@
params ["_logic"];
TRACE_1("buildLocations",_logic);
-private _area = _logic getvariable ["objectArea",[0,0,0,false,0]]; // seems to be set via the canSetArea config
+private _area = _logic getVariable ["objectArea",[0,0,0,false,0]]; // seems to be set via the canSetArea config
if ((_area param [0, 0]) == 0) exitWith {WARNING_1("Bad size? %1",_area);};
private _locationArray = [_logic];
_locationArray append _area;
diff --git a/addons/fortify/functions/fnc_canFortify.sqf b/addons/fortify/functions/fnc_canFortify.sqf
index 3a382bc98c9..ad676a91031 100644
--- a/addons/fortify/functions/fnc_canFortify.sqf
+++ b/addons/fortify/functions/fnc_canFortify.sqf
@@ -19,8 +19,12 @@
params ["_player", ["_cost", 0]];
(missionNamespace getVariable [QGVAR(fortifyAllowed), true]) &&
-{"ACE_Fortify" in (_player call EFUNC(common,uniqueItems))} &&
{
+ private _items = _player call EFUNC(common,uniqueItems);
+ _items append weapons _player;
+ _items pushBack backpack _player;
+ GVAR(fortifyTools) findAny _items != -1
+} && {
private _budget = [side group _player] call FUNC(getBudget);
((_budget == -1) || {_budget >= _cost})
} && {
diff --git a/addons/fortify/functions/fnc_getPlaceableSet.sqf b/addons/fortify/functions/fnc_getPlaceableSet.sqf
index 9643d541906..dfe5a01a1b8 100644
--- a/addons/fortify/functions/fnc_getPlaceableSet.sqf
+++ b/addons/fortify/functions/fnc_getPlaceableSet.sqf
@@ -20,7 +20,7 @@ TRACE_1("getPlaceableSet",_preset);
private _config = missionConfigFile >> "ACEX_Fortify_Presets" >> _preset;
if (!isClass _config) then {
- _config = configfile >> "ACEX_Fortify_Presets" >> _preset;
+ _config = configFile >> "ACEX_Fortify_Presets" >> _preset;
};
if (!isClass _config) exitWith {
private _msg = format ["Could not find [%1]", _preset];
@@ -37,11 +37,11 @@ _objects = _objects select {
if (isClass (configFile >> "CfgVehicles" >> _classname)) then {
true
} else {
- ERROR_2("Preset [%1] - Classname does not exist",_preset,_classname);
+ ERROR_2("Preset [%1] - Classname [%2] does not exist",_preset,_classname);
false
};
} else {
- ERROR_2("Preset [%1] - Bad data in objects array %2",_preset,_x);
+ ERROR_2("Preset [%1] - Bad data [%2] in objects array %2",_preset,_x);
false
};
};
diff --git a/addons/frag/CfgAmmo.hpp b/addons/frag/CfgAmmo.hpp
index 7a124833b3c..ac3605499d8 100644
--- a/addons/frag/CfgAmmo.hpp
+++ b/addons/frag/CfgAmmo.hpp
@@ -4,272 +4,16 @@
class CfgAmmo {
- // ~~~~ Bombs:
- class ammo_Bomb_LaserGuidedBase;
- class Bo_GBU12_LGB: ammo_Bomb_LaserGuidedBase {
- GVAR(enabled) = 1;
+ #include "CfgAmmoBaseClasses.hpp"
- GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large), QGVAR(huge), QGVAR(huge_HD), QGVAR(huge)};
- GVAR(metal) = 140000;
- GVAR(charge) = 87000;
- GVAR(gurney_c) = 2320;
- GVAR(gurney_k) = "1/2";
- };
- class Bomb_04_F: ammo_Bomb_LaserGuidedBase {
- GVAR(enabled) = 1;
-
- GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large), QGVAR(huge), QGVAR(huge_HD), QGVAR(huge)};
- GVAR(metal) = 140000;
- GVAR(charge) = 87000;
- GVAR(gurney_c) = 2320;
- GVAR(gurney_k) = "1/2";
- };
- class BombCore;
- class Bo_Mk82: BombCore {
- GVAR(enabled) = 1;
-
- GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large), QGVAR(huge), QGVAR(huge_HD), QGVAR(huge)};
- GVAR(metal) = 140000;
- GVAR(charge) = 87000;
- GVAR(gurney_c) = 2320;
- GVAR(gurney_k) = "1/2";
- };
-
- // ~~~~ Grenades:
- class GrenadeBase;
- class Grenade;
- class GrenadeHand: Grenade {
- GVAR(enabled) = 1;
-
- GVAR(skip) = 0;
- GVAR(force) = 1;
- // This is a good high-drag frag type for grenades.
- GVAR(classes)[] = {QGVAR(tiny_HD)};
- /*
- These values are based on the M67 Grenade, should be tweaked for
- individual grenades.
- */
- 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
- };
- class GrenadeHand_stone: GrenadeHand {
- GVAR(skip) = 1;
- };
- class SmokeShell: GrenadeHand {
- GVAR(skip) = 1;
- };
- class G_40mm_HE: GrenadeBase {
- // Source: http://www.inetres.com/gp/military/infantry/grenade/40mm_ammo.html#M441
- GVAR(enabled) = 1;
- GVAR(force) = 1;
-
- GVAR(classes)[] = {QGVAR(tiny_HD)};
- GVAR(metal) = 200;
- GVAR(charge) = 32;
- GVAR(gurney_c) = 2700;
- 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
- GVAR(enabled) = 1;
-
- GVAR(classes)[] = {QGVAR(tiny_HD)};
- GVAR(metal) = 200;
- GVAR(charge) = 45;
- GVAR(gurney_c) = 2830;
- GVAR(gurney_k) = "1/2";
- };
-
- class ACE_G_40mm_HEDP: G_40mm_HEDP {};
- class ACE_G_40mm_HE: G_40mm_HE {};
- class ACE_G_40mm_Practice: ACE_G_40mm_HE {
- GVAR(skip) = 1;
- GVAR(force) = 0;
- EGVAR(vehicle_damage,incendiary) = 0;
- };
- class ACE_G40mm_HE_VOG25P: G_40mm_HE {
- GVAR(skip) = 0;
- GVAR(force) = 1;
- };
-
-
- // ~~~~ RPGs:
- class MissileBase;
- class R_PG32V_F;
- class R_TBG32V_F: R_PG32V_F { // HE
- GVAR(enabled) = 1;
- GVAR(metal) = 400;
- GVAR(charge) = 210;
- GVAR(gurney_c) = 2800;
- GVAR(gurney_k) = "3/5";
- GVAR(classes)[] = {"ACE_frag_medium_HD"};
- };
- class M_Titan_AA: MissileBase {
- GVAR(skip) = 1;
- };
- class M_Titan_AT: MissileBase {
- GVAR(skip) = 1;
- };
- class M_Titan_AP: M_Titan_AT { // "anti personnel"
- GVAR(skip) = 0;
- GVAR(enabled) = 1;
- GVAR(metal) = 400;
- GVAR(charge) = 210;
- GVAR(gurney_c) = 2800;
- GVAR(gurney_k) = "3/5";
- GVAR(classes)[] = {"ACE_frag_medium_HD"};
- };
-
- // https://ofb.gov.in/product/products/product-details/84-mm-he-round-ffv-441-b
- // https://armypubs.army.mil/epubs/DR_pubs/DR_a/pdf/web/ARN18072_TC%203-22x84%20FINAL%20WEB.pdf (page 99, Table A-6. HE 441D RS, 84-mm projectile)
- class R_MRAAWS_HEAT_F;
- class R_MRAAWS_HE_F: R_MRAAWS_HEAT_F {
- GVAR(enabled) = 1;
- GVAR(metal) = 2300;
- GVAR(charge) = 590;
- GVAR(gurney_c) = 2800;
- GVAR(gurney_k) = "1/2";
- GVAR(classes)[] = {"ACE_frag_small"};
- };
-
-
- // ~~~~ Missiles:
- class M_PG_AT;
- class M_AT: M_PG_AT { // DAR (Hydra 70)
- // Source: http://fas.org/man/dod-101/sys/missile/hydra-70.htm
- GVAR(enabled) = 1;
-
- GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
- GVAR(metal) = 3850;
- GVAR(charge) = 1040;
- GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "1/2";
- };
- class RocketBase;
- class R_80mm_HE: RocketBase {
- GVAR(skip) = 1;
- };
- class Missile_AGM_02_F: MissileBase {
- // Source: http://fas.org/man/dod-101/sys/smart/agm-65.htm
- GVAR(enabled) = 1;
-
- GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
- GVAR(metal) = 56250;
- GVAR(charge) = 39000;
- GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "1/2";
- };
- class Rocket_04_HE_F: MissileBase { // Shrieker (Hydra 70)
- GVAR(enabled) = 1;
- GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
- GVAR(metal) = 3850;
- GVAR(charge) = 1040;
- GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "1/2";
- };
- class M_Scalpel_AT: MissileBase { // 9K121 Vikhr
- GVAR(enabled) = 1;
- GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
- GVAR(metal) = 10000;
- GVAR(charge) = 3000;
- GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "1/2";
- };
- class ACE_Hellfire_AGM114K: M_Scalpel_AT {
- // Source: http://www.designation-systems.net/dusrm/m-114.html
- GVAR(enabled) = 1;
-
- GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
- GVAR(metal) = 8000;
- GVAR(charge) = 2400;
- GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "1/2";
- };
- class M_Air_AA: MissileBase {
- GVAR(skip) = 1;
- };
- class Missile_AA_04_F: MissileBase {
- GVAR(skip) = 1;
- };
-
- // curator ammo entries
- class ShellBase;
- class Sh_125mm_HEAT;
- class Sh_155mm_AMOS: ShellBase {
- // Source: http://www.globalsecurity.org/military/systems/munitions/m795.htm
- GVAR(enabled) = 1;
-
- GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large), QGVAR(huge), QGVAR(huge_HD), QGVAR(huge)};
- GVAR(metal) = 36000;
- GVAR(charge) = 9979;
- GVAR(gurney_c) = 2440;
- GVAR(gurney_k) = "1/2";
- };
- class Sh_82mm_AMOS: Sh_155mm_AMOS {
- // Source: http://www.arsenal-bg.com/defense_police/mortar_bombs_82mm.htm
- GVAR(enabled) = 1;
-
- GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
- GVAR(metal) = 3200;
- GVAR(charge) = 420;
- GVAR(gurney_c) = 2440;
- GVAR(gurney_k) = "1/2";
- };
- class ModuleOrdnanceMortar_F_Ammo: Sh_82mm_AMOS {
- GVAR(enabled) = 1;
-
- GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
- GVAR(metal) = 800;
- GVAR(charge) = 4200;
- GVAR(gurney_c) = 2320;
- GVAR(gurney_k) = "1/2";
- };
- class Sh_105mm_HEAT_MP: Sh_125mm_HEAT {
- GVAR(enabled) = 1;
-
- GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
- GVAR(metal) = 11400;
- GVAR(charge) = 7100;
- GVAR(gurney_c) = 2800;
- GVAR(gurney_k) = "1/2";
- };
- class Sh_120mm_HE: ShellBase {
- GVAR(enabled) = 1;
-
- GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
- GVAR(metal) = 23000;
- GVAR(charge) = 3148;
- GVAR(gurney_c) = 2830;
- GVAR(gurney_k) = "1/2";
- };
- class Sh_125mm_HE: Sh_120mm_HE {
- GVAR(enabled) = 1;
-
- GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
- GVAR(metal) = 16000;
- GVAR(charge) = 3200;
- GVAR(gurney_c) = 2440;
- GVAR(gurney_k) = "1/2";
- };
- class ModuleOrdnanceHowitzer_F_ammo: Sh_155mm_AMOS {
- GVAR(enabled) = 1;
-
- GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large), QGVAR(huge), QGVAR(huge_HD), QGVAR(huge)};
- GVAR(metal) = 1950;
- GVAR(charge) = 15800;
- GVAR(gurney_c) = 2320;
- GVAR(gurney_k) = "1/2";
- };
-
-
- class B_65x39_Caseless;
+ class B_65x39_Caseless: BulletBase {};
class GVAR(base): B_65x39_Caseless {
ACE_damageType = "grenade"; // compatibility with medical_damage, shrapnel should produce grenade wounds
- timeToLive = 12;
+ timeToLive = 4;
typicalSpeed = 1500;
+ maxSpeed = 1500;
deflecting = 65;
+ GVAR(skip) = 1;
};
class GVAR(tiny): GVAR(base) {
@@ -317,7 +61,7 @@ class CfgAmmo {
};
class GVAR(large_HD): GVAR(large) {
- hit = 28;
+ hit = 28;
indirectHit = 2;
indirectHitRange = 0.25;
airFriction = QUOTE(BASE_DRAG_HD*0.65);
@@ -340,21 +84,6 @@ class CfgAmmo {
caliber = 2.8;
};
- class GVAR(spall_small): GVAR(small) {
- timeToLive = 0.1;
- };
-
- class GVAR(spall_medium): GVAR(medium) {
- timeToLive = 0.15;
- };
-
- class GVAR(spall_large): GVAR(large) {
- timeToLive = 0.25;
- };
-
- class GVAR(spall_huge): GVAR(huge) {
- timeToLive = 0.3;
- };
-
- #include "CfgAmmoReflections.hpp"
+ #include "CfgAmmoSpall.hpp"
+ #include "CfgAmmoFragParameters.hpp"
};
diff --git a/addons/frag/CfgAmmoBaseClasses.hpp b/addons/frag/CfgAmmoBaseClasses.hpp
new file mode 100644
index 00000000000..413dfe3dd93
--- /dev/null
+++ b/addons/frag/CfgAmmoBaseClasses.hpp
@@ -0,0 +1,47 @@
+// We need this since autocannons generally inherit from BulletBase
+class BulletCore;
+class BulletBase: BulletCore {};
+
+class GrenadeCore;
+class GrenadeBase: GrenadeCore {};
+
+class LaserBombCore;
+class ammo_Bomb_LaserGuidedBase: LaserBombCore {};
+
+class MissileCore;
+class MissileBase: MissileCore {};
+
+class RocketCore;
+class RocketBase: RocketCore {
+ GVAR(skip) = 1;
+};
+
+class ArtilleryRocketCore: RocketCore {};
+
+class ShellCore;
+class ShellBase: ShellCore {};
+
+class ShotDeployCore;
+class ShotDeployBase: ShotDeployCore {
+ GVAR(skip) = 1;
+};
+
+class ShotgunCore;
+class ShotgunBase: ShotgunCore {};
+
+class SubmunitionCore;
+class SubmunitionBase: SubmunitionCore {
+ GVAR(skip) = 1;
+};
+
+class BoundingMineCore;
+class BoundingMineBase: BoundingMineCore {};
+
+class PipeBombCore;
+class PipeBombBase: PipeBombCore {};
+
+class DirectionalBombCore;
+class DirectionalBombBase: DirectionalBombCore {};
+
+class MineCore;
+class MineBase: MineCore {};
diff --git a/addons/frag/CfgAmmoFragParameters.hpp b/addons/frag/CfgAmmoFragParameters.hpp
new file mode 100644
index 00000000000..f76231e85c1
--- /dev/null
+++ b/addons/frag/CfgAmmoFragParameters.hpp
@@ -0,0 +1,796 @@
+// ~~~~ Autocannons
+class B_19mm_HE: BulletBase {
+ GVAR(skip) = 1;
+};
+
+class B_20mm: BulletBase {
+ // Used in Weisel/AWC Nyx, which makes it a Rheinmetall Mk 20 Rh-202
+ // Based on jane's ammunition handbook ~2002 (archive.org)
+ GVAR(skip) = 1;
+ GVAR(charge) = 6;
+ GVAR(metal) = 114;
+ GVAR(gurney_c) = 2830;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(tiny_HD)};
+};
+
+class B_20mm_AP: BulletBase {
+ GVAR(skip) = 1;
+};
+
+class ammo_Gun20mmAABase: BulletBase { // 20x139mm
+ GVAR(skip) = 1;
+ GVAR(charge) = 6;
+ GVAR(metal) = 114;
+ GVAR(gurney_c) = 2830;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(tiny_HD)};
+};
+
+class ammo_Gun30mmAABase: BulletBase { // 30x210mm HEI
+ GVAR(skip) = 0;
+ GVAR(charge) = 40;
+ GVAR(metal) = 410;
+ GVAR(gurney_k) = "1/2";
+ GVAR(gurney_c) = 2901;
+ GVAR(classes)[] = {QGVAR(tiny_HD), QGVAR(tiny_HD), QGVAR(small_HD)};
+
+};
+
+class B_30mm_HE: B_19mm_HE {
+ // Used in Gorgon (Pandur II), assuming it's a L21A1 RARDEN, specifically HEI-T due to tracers
+ // https://ordtech-industries.com/30x170-mm-ammunition-for-cannons-oerlikon-kcb-hispano-hs831l-l21-rarden/
+ GVAR(skip) = 0;
+ GVAR(charge) = 25;
+ GVAR(metal) = 320;
+ GVAR(gurney_c) = 2552;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(tiny_HD), QGVAR(tiny_HD), QGVAR(small_HD)};
+};
+class B_30mm_MP: B_30mm_HE {
+ // Used in Mora (FV510 Warrior), assuming it's a Mk44 Bushmaster II, specifically HEI-T due to tracers
+ // http://www.navweaps.com/Weapons/WNUS_30mm_BushmasterII.php
+ GVAR(metal) = 388;
+ GVAR(charge) = 56;
+ GVAR(gurney_c) = 2600;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(tiny_HD), QGVAR(tiny_HD), QGVAR(small_HD)};
+};
+
+class Gatling_30mm_HE_Plane_CAS_01_F: BulletBase {
+ GVAR(skip) = 0;
+ GVAR(classes)[] = {QGVAR(tiny_HD), QGVAR(small_HD)};
+ GVAR(metal) = 388;
+ GVAR(charge) = 56;
+ GVAR(gurney_c) = 2600; // guessed
+ GVAR(gurney_k) = "1/2";
+};
+
+class ammo_Gun35mmAABase: BulletBase {
+ // Gepard uses an Oerlikon GDF and the AA vehicles mimics it like it
+ // https://en.wikipedia.org/wiki/Oerlikon_GDF#Ammunition
+ // https://www.nammo.com/product/our-products/ammunition/medium-caliber-ammunition/35-mm-series/35-mm-x-228-hei-sd-and-hei-t-sd/
+ GVAR(skip) = 0;
+ GVAR(charge) = 98;
+ GVAR(metal) = 400;
+ GVAR(gurney_k) = "1/2";
+ GVAR(gurney_c) = 2700;
+ GVAR(classes)[] = {QGVAR(tiny_HD), QGVAR(tiny_HD), QGVAR(small_HD)};
+};
+
+class B_35mm_AA: BulletBase {
+ // Gepard uses an Oerlikon GDF and the AA vehicles mimics it like it
+ // https://en.wikipedia.org/wiki/Oerlikon_GDF#Ammunition
+ // https://www.nammo.com/product/our-products/ammunition/medium-caliber-ammunition/35-mm-series/35-mm-x-228-hei-sd-and-hei-t-sd/
+ GVAR(skip) = 0;
+ GVAR(charge) = 98;
+ GVAR(metal) = 400;
+ GVAR(gurney_k) = "1/2";
+ GVAR(gurney_c) = 2700;
+ GVAR(classes)[] = {QGVAR(tiny_HD), QGVAR(tiny_HD), QGVAR(small_HD)};
+};
+
+class B_40mm_GPR: B_30mm_HE {
+ // Based on noted 40mm Autocannons, base ROF, and ammo names, looks to be a CTAS40, specifically GPR-PD-T
+ // https://www.cta-international.com/ammunition/
+ // https://ndiastorage.blob.core.usgovcloudapi.net/ndia/2002/gun/leslie.pdf
+ GVAR(classes)[] = {QGVAR(tiny_HD), QGVAR(small_HD)};
+ GVAR(metal) = 750;
+ GVAR(charge) = 120;
+ GVAR(gurney_c) = 2700; // guessed
+ GVAR(gurney_k) = "1/2";
+};
+class UnderwaterMine_Range_Ammo: MineBase {
+ GVAR(skip) = 1;
+};
+
+// ~~~~ Bombs:
+class Bo_GBU12_LGB: ammo_Bomb_LaserGuidedBase {
+ GVAR(skip) = 0;
+ GVAR(charge) = 87000;
+ GVAR(metal) = 140000;
+ GVAR(gurney_c) = 2320;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large_HD), QGVAR(huge_HD), QGVAR(huge_HD), QGVAR(huge_HD)};
+};
+class Bomb_03_F: ammo_Bomb_LaserGuidedBase {
+ GVAR(skip) = 0;
+ GVAR(charge) = 100000;
+ GVAR(metal) = 150000;
+ GVAR(gurney_c) = 2320;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large_HD), QGVAR(huge_HD), QGVAR(huge_HD), QGVAR(huge_HD)};
+};
+class Bomb_04_F: ammo_Bomb_LaserGuidedBase {
+ GVAR(skip) = 0;
+ GVAR(charge) = 87000;
+ GVAR(metal) = 140000;
+ GVAR(gurney_c) = 2320;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large_HD), QGVAR(huge_HD), QGVAR(huge_HD), QGVAR(huge_HD)};
+};
+class BombCluster_01_Ammo_F: Bomb_04_F {
+ GVAR(skip) = 1;
+};
+class ammo_Bomb_SmallDiameterBase: ammo_Bomb_LaserGuidedBase {
+ GVAR(skip) = 0;
+ GVAR(charge) = 160; // kg
+ GVAR(metal) = 113; // kg
+ GVAR(gurney_c) = 2830;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD), QGVAR(large), QGVAR(large_HD), QGVAR(huge_HD), QGVAR(huge_HD)};
+};
+
+class BombCore;
+class Bo_Mk82: BombCore {
+ GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large_HD), QGVAR(huge_HD), QGVAR(huge_HD), QGVAR(huge_HD)};
+ GVAR(metal) = 140000;
+ GVAR(charge) = 87000;
+ GVAR(gurney_c) = 2320;
+ GVAR(gurney_k) = "1/2";
+};
+
+class Mo_cluster_AP: ShellBase {
+ GVAR(skip) = 1;
+ GVAR(force) = 0;
+};
+class Mo_cluster_Bomb_01_F: Mo_cluster_AP { // Mk 118 Rockeye
+ GVAR(skip) = 0;
+ GVAR(classes)[] = {QGVAR(small_HD)};
+ GVAR(metal) = 400;
+ GVAR(charge) = 180;
+ GVAR(gurney_c) = 2700;
+ GVAR(gurney_k) = "1/2";
+};
+class Mo_cluster_Bomb_02_F: Mo_cluster_Bomb_01_F { // ShOAB-0.5
+ GVAR(classes)[] = {QGVAR(small_HD)};
+ GVAR(metal) = 400;
+ GVAR(charge) = 100;
+ GVAR(gurney_c) = 2700;
+};
+class Mo_cluster_Bomb_03_F: Mo_cluster_Bomb_01_F { // idk, @lambda.tiger on the ace discord if you find out
+ GVAR(classes)[] = {QGVAR(small_HD)};
+ GVAR(metal) = 400;
+ GVAR(charge) = 140;
+ GVAR(gurney_c) = 2400;
+};
+
+// ~~~~ Grenades:
+class Grenade;
+class GrenadeHand: Grenade {
+ GVAR(skip) = 0;
+ GVAR(force) = 1;
+ /*
+ These values are based on the M67 Grenade, should be tweaked for
+ individual grenades.
+ */
+ GVAR(classes)[] = {QGVAR(tiny_HD)};
+ 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
+};
+class mini_Grenade: GrenadeHand {
+ GVAR(classes)[] = {QGVAR(tiny_HD)};
+ GVAR(metal) = 104;
+ GVAR(charge) = 36;
+};
+class GrenadeHand_stone: GrenadeHand {
+ GVAR(skip) = 1;
+};
+class SmokeShell: GrenadeHand {
+ GVAR(skip) = 1;
+};
+class G_40mm_HE: GrenadeBase {
+ // Source: http://www.inetres.com/gp/military/infantry/grenade/40mm_ammo.html#M441
+ GVAR(skip) = 0;
+ GVAR(force) = 1;
+ GVAR(classes)[] = {QGVAR(small_HD), QGVAR(tiny_HD), QGVAR(small_HD)};
+ GVAR(metal) = 200;
+ GVAR(charge) = 32;
+ GVAR(gurney_c) = 2700;
+ GVAR(gurney_k) = "3/5"; // interior fragmenter/charge is a sphere
+};
+class G_20mm_HE: G_40mm_HE {
+ GVAR(classes)[] = {QGVAR(tiny_HD)};
+ GVAR(metal) = 50;
+ GVAR(charge) = 8;
+ GVAR(gurney_c) = 2700;
+ GVAR(gurney_k) = "3/5"; // interior fragmenter/charge is a sphere
+};
+class G_40mm_HEDP: G_40mm_HE {
+ // Source: http://www.inetres.com/gp/military/infantry/grenade/40mm_ammo.html#M433
+ GVAR(classes)[] = {QGVAR(tiny_HD), QGVAR(small_HD), QGVAR(small_HD)};
+ GVAR(metal) = 200;
+ GVAR(charge) = 45;
+ GVAR(gurney_c) = 2830;
+ GVAR(gurney_k) = "1/2";
+};
+
+class ACE_G_40mm_HEDP: G_40mm_HEDP {};
+class ACE_G_40mm_HE: G_40mm_HE {};
+class ACE_G_40mm_Practice: ACE_G_40mm_HE {
+ GVAR(skip) = 1;
+ GVAR(force) = 0;
+ EGVAR(vehicle_damage,incendiary) = 0;
+};
+
+// ~~~~ Mines & UXO
+class ATMine_Range_Ammo: MineBase {
+ GVAR(skip) = 1;
+};
+
+class APERSMine_Range_Ammo: MineBase { // VS-50
+ GVAR(skip) = 0;
+ GVAR(force) = 0;
+ GVAR(classes)[] = {QGVAR(tiny_HD), QGVAR(tiny_HD), QGVAR(small_HD)};
+ GVAR(metal) = 100;
+ GVAR(charge) = 50;
+ GVAR(gurney_c) = 2700;
+ GVAR(gurney_k) = "1/3";
+};
+
+class APERSBoundingMine_Range_Ammo: BoundingMineBase {
+ GVAR(skip) = 1;
+ GVAR(force) = 0;
+ GVAR(classes)[] = {QGVAR(tiny_HD)};
+ GVAR(metal) = 80;
+ GVAR(charge) = 170;
+ GVAR(gurney_c) = 2700;
+ GVAR(gurney_k) = "3/5";
+};
+
+class TrainingMine_Ammo: APERSMine_Range_Ammo {
+ GVAR(skip) = 1;
+};
+
+class SLAMDirectionalMine_Wire_Ammo: DirectionalBombBase {
+ GVAR(skip) = 1;
+};
+
+class APERSTripMine_Wire_Ammo: DirectionalBombBase {
+ GVAR(skip) = 0;
+ GVAR(force) = 0;
+ GVAR(classes)[] = {QGVAR(tiny_HD)};
+ GVAR(metal) = 210;
+ GVAR(charge) = 185;
+ GVAR(gurney_c) = 2843;
+ GVAR(gurney_k) = "3/5";
+};
+
+class IEDUrbanBig_Remote_Ammo: PipeBombBase {
+ GVAR(skip) = 0;
+ GVAR(classes)[] = {QGVAR(large), QGVAR(large_HD), QGVAR(large_HD), QGVAR(large_HD), QGVAR(huge_HD), QGVAR(huge_HD), QGVAR(huge_HD)};
+ GVAR(metal) = 36000;
+ GVAR(charge) = 9979;
+ GVAR(gurney_c) = 2440;
+ GVAR(gurney_k) = "3/5";
+};
+class IEDLandBig_Remote_Ammo: PipeBombBase {
+ GVAR(skip) = 0;
+ GVAR(classes)[] = {QGVAR(large), QGVAR(large_HD), QGVAR(large_HD), QGVAR(large_HD), QGVAR(huge_HD), QGVAR(huge_HD), QGVAR(huge_HD)};
+ GVAR(metal) = 36000;
+ GVAR(charge) = 9979;
+ GVAR(gurney_c) = 2440;
+ GVAR(gurney_k) = "3/5";
+};
+class IEDUrbanSmall_Remote_Ammo: PipeBombBase {
+ GVAR(skip) = 0;
+ GVAR(metal) = 23000;
+ GVAR(charge) = 3148;
+ GVAR(gurney_c) = 2830;
+ GVAR(gurney_k) = "3/5";
+ GVAR(classes)[] = {QGVAR(small), QGVAR(medium_HD), QGVAR(medium_HD)};
+};
+class IEDLandSmall_Remote_Ammo: PipeBombBase {
+ GVAR(skip) = 0;
+ GVAR(metal) = 23000;
+ GVAR(charge) = 3148;
+ GVAR(gurney_c) = 2830;
+ GVAR(gurney_k) = "3/5";
+ GVAR(classes)[] = {QGVAR(small), QGVAR(medium_HD), QGVAR(medium_HD)};
+};
+
+class APERSMineDispenser_Ammo: PipeBombBase {
+ GVAR(skip) = 1;
+};
+
+class UXO1_Ammo_Base_F: APERSMine_Range_Ammo { // Mk 118 Rockeye
+ GVAR(skip) = 0;
+ GVAR(charge) = 180;
+ GVAR(metal) = 400;
+ GVAR(gurney_c) = 2700;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(small_HD)};
+};
+
+class UXO2_Ammo_Base_F: UXO1_Ammo_Base_F {
+ GVAR(charge) = 100;
+ GVAR(classes)[] = {QGVAR(small_HD), QGVAR(tiny_HD)};
+};
+
+class APERSMineDispenser_Mine_Ammo: APERSMine_Range_Ammo {
+ GVAR(skip) = 1;
+};
+
+class UXO_deploy_base_f: SubmunitionBase {};
+
+class ClaymoreDirectionalMine_Remote_Ammo: DirectionalBombBase {
+ GVAR(skip) = 1;
+};
+
+class SatchelCharge_Remote_Ammo: PipeBombBase {
+ GVAR(skip) = 1;
+};
+
+class DemoCharge_Remote_Ammo: PipeBombBase {
+ GVAR(skip) = 1;
+};
+
+class Drone_explosive_ammo: MineBase {
+ GVAR(skip) = 1;
+};
+
+class BombDemine_01_Ammo_F: BombCore {
+ GVAR(skip) = 1;
+};
+
+class BombDemine_01_SubAmmo_F: ShellBase {
+ GVAR(skip) = 1;
+};
+
+// ~~~~ Rockets:
+class R_PG7_F: RocketBase {
+ GVAR(skip) = 0;
+ GVAR(force) = 0;
+ GVAR(classes)[] = {QGVAR(tiny), QGVAR(small_HD)};
+ GVAR(metal) = 100;
+ GVAR(charge) = 560;
+ GVAR(gurney_c) = 2730;
+ GVAR(gurney_k) = "1/2";
+};
+
+class R_PG32V_F: RocketBase {
+ GVAR(skip) = 1;
+};
+class R_TBG32V_F: R_PG32V_F { // Thermobaric
+ GVAR(skip) = 0;
+ GVAR(metal) = 400;
+ GVAR(charge) = 210;
+ GVAR(gurney_c) = 2800;
+ GVAR(gurney_k) = "3/5";
+ GVAR(classes)[] = {QGVAR(medium_HD)};
+};
+
+class M_SPG9_HEAT: RocketBase {
+ GVAR(skip) = 0;
+ GVAR(metal) = 4150;
+ GVAR(charge) = 340;
+ GVAR(gurney_c) = 2970;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(small_HD), QGVAR(medium_HD)};
+};
+class M_SPG9_HE: M_SPG9_HEAT {
+ GVAR(metal) = 4695;
+ GVAR(charge) = 655;
+ GVAR(gurney_c) = 2800;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(small_HD), QGVAR(tiny), QGVAR(medium_HD), QGVAR(medium_HD)};
+};
+
+// https://armypubs.army.mil/epubs/DR_pubs/DR_a/pdf/web/ARN18072_TC%203-22x84%20FINAL%20WEB.pdf
+class R_MRAAWS_HEAT_F: RocketBase { // Table A-20. HEAT 751
+ GVAR(skip) = 0;
+ GVAR(metal) = 2265;
+ GVAR(charge) = 635;
+ GVAR(gurney_c) = 2970;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(small_HD)};
+
+};
+class R_MRAAWS_HEAT55_F: R_MRAAWS_HEAT_F { // Table A-16. HEAT 551C
+ GVAR(metal) = 1940;
+ GVAR(charge) = 460;
+};
+class R_MRAAWS_HE_F: R_MRAAWS_HEAT_F { // Table A-6. HE 441D RS
+ GVAR(metal) = 2300;
+ GVAR(charge) = 590;
+ GVAR(gurney_c) = 2800;
+ GVAR(gurney_k) = "3/5";
+ GVAR(classes)[] = {QGVAR(small_HD)};
+};
+
+class R_80mm_HE: RocketBase { // S-8D
+ GVAR(skip) = 0;
+ GVAR(charge) = 2150;
+ GVAR(metal) = 1650;
+ GVAR(gurney_c) = 2700;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(small_HD), QGVAR(tiny_HD), QGVAR(tiny)};
+};
+class R_60mm_HE: R_80mm_HE { // no idea but looks like a FFAR so made it weaker
+ GVAR(metal) = 1040;
+ GVAR(charge) = 3850;
+};
+
+class m_70mm_saami: MissileBase {
+ GVAR(skip) = 0;
+ GVAR(charge) = 2150;
+ GVAR(metal) = 1650;
+ GVAR(gurney_c) = 2700;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(small_HD), QGVAR(tiny_HD), QGVAR(tiny)};
+};
+
+class Rocket_04_HE_F: MissileBase { // Shrieker (Hydra 70)
+ GVAR(skip) = 0;
+ GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
+ GVAR(metal) = 3850;
+ GVAR(charge) = 1040;
+ GVAR(gurney_c) = 2700;
+ GVAR(gurney_k) = "1/2";
+};
+class Rocket_03_HE_F: Rocket_04_HE_F { // S-8DM makes the most sense
+ GVAR(metal) = 1800;
+ GVAR(charge) = 2000;
+ GVAR(gurney_c) = 2300;
+};
+class Rocket_04_AP_F: Rocket_04_HE_F {
+ GVAR(skip) = 1;
+};
+
+class ammo_Missile_CannonLaunchedBase: MissileBase {
+ GVAR(skip) = 1;
+};
+
+class R_230mm_fly: ShellBase {
+ GVAR(skip) = 0;
+ GVAR(charge) = 100; // kg
+ GVAR(metal) = 150; // kg
+ GVAR(gurney_c) = 2320;
+ GVAR(gurney_k) = "3/5";
+ GVAR(classes)[] = {QGVAR(large_HD), QGVAR(large), QGVAR(large), QGVAR(large), QGVAR(huge_HD), QGVAR(huge_HD), QGVAR(huge)};
+};
+
+class M_PG_AT: MissileBase { // DAGR M247 warhead
+ GVAR(skip) = 0;
+ GVAR(classes)[] = {QGVAR(tiny_HD), QGVAR(small_HD), QGVAR(small), QGVAR(medium)};
+ GVAR(charge) = 910;
+ GVAR(metal) = 3085;
+ GVAR(gurney_c) = 2700;
+ GVAR(gurney_k) = "1/2";
+};
+class M_AT: M_PG_AT { // DAR (Hydra 70) M151 warhead
+ GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
+ GVAR(charge) = 1040;
+ GVAR(metal) = 3850;
+ GVAR(gurney_c) = 2700;
+};
+
+// ~~~~ Missiles:
+class Missile_AGM_02_F: MissileBase {
+ // Source: http://fas.org/man/dod-101/sys/smart/agm-65.htm
+ GVAR(skip) = 0;
+ GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
+ GVAR(metal) = 56250;
+ GVAR(charge) = 39000;
+ GVAR(gurney_c) = 2700;
+ GVAR(gurney_k) = "1/2";
+};
+class Missile_AGM_01_F: Missile_AGM_02_F { // Kh-25MTP !!! fix me
+};
+class M_Jian_AT: Missile_AGM_01_F { // imaginary missile? Not simiklar to any modern HJ-x or otherwise
+};
+
+class M_Titan_AA: MissileBase {
+ GVAR(skip) = 0;
+ GVAR(metal) = 1980;
+ GVAR(charge) = 1020;
+ GVAR(gurney_c) = 2501;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(tiny), QGVAR(tiny_HD), QGVAR(small_HD)};
+};
+class M_Titan_AT: MissileBase {
+ GVAR(skip) = 1;
+};
+class M_Titan_AP: M_Titan_AT {
+ GVAR(skip) = 0;
+ GVAR(metal) = 400;
+ GVAR(charge) = 210;
+ GVAR(gurney_c) = 2800;
+ GVAR(gurney_k) = "3/5";
+ GVAR(classes)[] = {QGVAR(medium_HD)};
+};
+
+class M_Scalpel_AT: MissileBase { // 9K121 Vikhr
+ GVAR(skip) = 0;
+ GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
+ GVAR(metal) = 10000;
+ GVAR(charge) = 3000;
+ GVAR(gurney_c) = 2700;
+ GVAR(gurney_k) = "1/2";
+};
+class ACE_Hellfire_AGM114K: M_Scalpel_AT {
+ // Source: http://www.designation-systems.net/dusrm/m-114.html
+ GVAR(skip) = 0;
+
+ GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
+ GVAR(metal) = 8000;
+ GVAR(charge) = 2400;
+ GVAR(gurney_c) = 2700;
+ GVAR(gurney_k) = "1/2";
+};
+
+class ammo_Missile_CruiseBase: MissileBase {};
+class ammo_missile_cruise_01: ammo_Missile_CruiseBase {
+ GVAR(skip) = 0;
+ GVAR(classes)[] = {QGVAR(small), QGVAR(medium_HD), QGVAR(large_HD)};
+ GVAR(metal) = 700000;
+ GVAR(charge) = 110000;
+ GVAR(gurney_c) = 2600;
+ GVAR(gurney_k) = "3/5";
+};
+class ammo_Missile_Cruise_01_Cluster: ammo_missile_cruise_01 {};
+
+class ammo_Missile_AntiRadiationBase: MissileBase {
+ GVAR(gurney_k) = "1/2";
+ GVAR(gurney_c) = 2400;
+};
+class ammo_Missile_HARM: ammo_Missile_AntiRadiationBase {
+ GVAR(skip) = 0;
+ GVAR(classes)[] = {QGVAR(small), QGVAR(medium_HD), QGVAR(large_HD)};
+ GVAR(charge) = 10000;
+ GVAR(metal) = 58000;
+};
+class ammo_Missile_KH58: ammo_Missile_AntiRadiationBase {
+ GVAR(skip) = 0;
+ GVAR(classes)[] = {QGVAR(small), QGVAR(medium_HD), QGVAR(large_HD)};
+ GVAR(charge) = 20000;
+ GVAR(metal) = 129000;
+};
+
+class M_Zephyr: M_Titan_AA { // model is an AMRAAM- WDU-41/B warhead
+ GVAR(skip) = 0;
+ GVAR(metal) = 12800;
+ GVAR(charge) = 4000;
+ GVAR(gurney_c) = 2900;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(tiny), QGVAR(medium_HD), QGVAR(small), QGVAR(small_HD)};
+};
+
+class M_Air_AA: MissileBase { // Looks not real, maybe r-73 inspired?
+ GVAR(skip) = 0;
+ GVAR(charge) = 2450;
+ GVAR(metal) = 4950;
+ GVAR(gurney_c) = 2700;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(tiny), QGVAR(medium_HD), QGVAR(small_HD), QGVAR(small_HD)};
+};
+
+class Missile_AA_04_F: MissileBase {
+ GVAR(skip) = 0;
+ GVAR(charge) = 4400;
+ GVAR(metal) = 5000;
+ GVAR(gurney_c) = 2830;
+ GVAR(gurney_k) = "1/2";
+};
+class Missile_AA_03_F: Missile_AA_04_F {
+ GVAR(charge) = 2450;
+ GVAR(metal) = 4950;
+ GVAR(gurney_c) = 2700;
+};
+
+class ammo_Missile_ShortRangeAABase: MissileBase {
+ GVAR(gurney_k) = "1/2";
+};
+class ammo_Missile_rim116: ammo_Missile_ShortRangeAABase {
+ GVAR(skip) = 0;
+ GVAR(charge) = 400;
+ GVAR(metal) = 730;
+ GVAR(gurney_c) = 2400;
+ GVAR(classes)[] = {QGVAR(tiny), QGVAR(small_HD)};
+};
+class ammo_Missile_BIM9X: ammo_Missile_ShortRangeAABase {
+ GVAR(skip) = 0;
+ GVAR(charge) = 440;
+ GVAR(metal) = 500;
+ GVAR(gurney_c) = 2900;
+ GVAR(classes)[] = {QGVAR(small), QGVAR(tiny)};
+};
+class ammo_Missile_AA_R73: ammo_Missile_ShortRangeAABase {
+ GVAR(skip) = 0;
+ GVAR(charge) = 2450;
+ GVAR(metal) = 4950;
+ GVAR(gurney_c) = 2700;
+ GVAR(classes)[] = {QGVAR(small), QGVAR(small), QGVAR(tiny)};
+};
+
+class ammo_Missile_MediumRangeAABase: MissileBase {
+ GVAR(gurney_c) = 2900;
+ GVAR(gurney_k) = "1/2";
+};
+class ammo_Missile_rim162: ammo_Missile_MediumRangeAABase {
+ GVAR(skip) = 0;
+ GVAR(charge) = 138; // dg
+ GVAR(metal) = 252; // dg
+ GVAR(gurney_c) = 2400;
+ GVAR(classes)[] = {QGVAR(small), QGVAR(medium), QGVAR(medium), QGVAR(large)};
+};
+class ammo_Missile_AMRAAM_C: ammo_Missile_MediumRangeAABase {
+ GVAR(skip) = 0;
+ GVAR(charge) = 70; // dg
+ GVAR(metal) = 128; // dg
+ GVAR(classes)[] = {QGVAR(small), QGVAR(medium), QGVAR(medium)};
+};
+class ammo_Missile_AMRAAM_D: ammo_Missile_MediumRangeAABase {
+ GVAR(skip) = 0;
+ GVAR(charge) = 70; // dg
+ GVAR(metal) = 128; // dg
+ GVAR(classes)[] = {QGVAR(small), QGVAR(medium), QGVAR(medium)};
+};
+class ammo_Missile_AA_R77: ammo_Missile_MediumRangeAABase {
+ GVAR(skip) = 0;
+ GVAR(charge) = 80; // dg
+ GVAR(metal) = 145; // dg
+ GVAR(gurney_c) = 2700;
+ GVAR(classes)[] = {QGVAR(small), QGVAR(medium), QGVAR(large), QGVAR(large)};
+};
+
+class M_Vorona_HEAT: MissileBase {
+ // tandem shaped charges
+ GVAR(skip) = 1;
+};
+class M_Vorona_HE: M_Vorona_HEAT {
+ // All signs point to this being a thermobaric round so low frag count
+ GVAR(skip) = 0;
+ GVAR(metal) = 13800;
+ GVAR(charge) = 4950;
+ GVAR(gurney_c) = 2800;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(tiny)};
+};
+
+class M_127mm_Firefist_AT: MissileBase { // HOT missile
+ GVAR(skip) = 1;
+};
+
+class M_NLAW_AT_F: MissileBase {
+ GVAR(skip) = 1;
+};
+
+// ~~~~ Shell
+class Sh_75mm_Railgun_APFSDS: ShellBase {
+ GVAR(skip) = 1;
+};
+class Sh_120mm_APFSDS: ShellBase {
+ GVAR(skip) = 1;
+};
+class Sh_125mm_APFSDS: Sh_120mm_APFSDS {
+ GVAR(skip) = 1;
+};
+
+class Sh_155mm_AMOS: ShellBase {
+ // Source: http://www.globalsecurity.org/military/systems/munitions/m795.htm
+ GVAR(skip) = 0;
+ GVAR(charge) = 9979;
+ GVAR(metal) = 36000;
+ GVAR(gurney_c) = 2440;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large), QGVAR(huge), QGVAR(huge_HD), QGVAR(huge)};
+};
+
+class Sh_82mm_AMOS: Sh_155mm_AMOS { // VO-832DU
+ GVAR(charge) = 420;
+ GVAR(metal) = 2680;
+ GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
+};
+
+class Sh_120mm_HE: ShellBase {
+ GVAR(skip) = 0;
+ GVAR(charge) = 3148;
+ GVAR(metal) = 23000;
+ GVAR(gurney_c) = 2830;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
+};
+class Sh_120mm_HEAT_MP: ShellBase {
+ GVAR(skip) = 0;
+ GVAR(charge) = 2500;
+ GVAR(metal) = 5000;
+ GVAR(gurney_c) = 2500;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(small), QGVAR(medium), QGVAR(medium_HD), QGVAR(medium_HD)};
+};
+
+class ammo_ShipCannon_120mm_HE: Sh_155mm_AMOS {
+ GVAR(charge) = 3148;
+ GVAR(metal) = 23000;
+ GVAR(gurney_c) = 2830;
+ GVAR(classes)[] = {QGVAR(small), QGVAR(small), QGVAR(medium_HD), QGVAR(large_HD)};
+};
+
+class Sh_125mm_HE: Sh_120mm_HE {
+ GVAR(metal) = 19900;
+ GVAR(charge) = 3400;
+ GVAR(gurney_c) = 2901;
+};
+
+class Sh_125mm_HEAT: Sh_125mm_HE {
+ GVAR(skip) = 1;
+ GVAR(metal) = 16760;
+ GVAR(charge) = 1640;
+ GVAR(gurney_c) = 2901;
+};
+
+class Sh_105mm_HEAT_MP: Sh_125mm_HEAT {
+ GVAR(skip) = 0;
+ GVAR(classes)[] = {QGVAR(small), QGVAR(medium_HD), QGVAR(medium_HD), QGVAR(medium_HD)};
+ GVAR(metal) = 11400;
+ GVAR(charge) = 7100;
+ GVAR(gurney_c) = 2800;
+};
+
+class ModuleOrdnanceHowitzer_F_ammo: Sh_155mm_AMOS {
+ GVAR(skip) = 0;
+ GVAR(metal) = 1950;
+ GVAR(charge) = 15800;
+ GVAR(gurney_c) = 2320;
+ GVAR(gurney_k) = "1/2";
+ GVAR(classes)[] = {QGVAR(large), QGVAR(large_HD), QGVAR(large_HD), QGVAR(large_HD), QGVAR(huge_HD), QGVAR(huge_HD), QGVAR(huge_HD)};
+};
+class ammo_Penetrator_Base: ShellBase {
+ GVAR(skip) = 1;
+};
+
+// ~~~~ Special
+class ProbingBeam_01_F: BulletBase {
+ GVAR(skip) = 1;
+};
+
+class IRStrobeBase: GrenadeCore {
+ GVAR(skip) = 1;
+};
+class FlareCore: GrenadeCore { // flares shouldn't have EH, but in case
+ GVAR(skip) = 1;
+};
+
+class Default;
+class Laserbeam: Default {
+ GVAR(skip) = 1;
+};
+
+class FuelExplosion: Default {
+ GVAR(skip) = 1;
+};
+
+class HelicopterExploSmall: ShellBase {
+ GVAR(skip) = 1;
+};
+
+class LightningBolt: ShellBase {
+ GVAR(skip) = 1;
+};
+
+class M_Mo_82mm_AT: MissileBase {
+ GVAR(skip) = 1;
+};
diff --git a/addons/frag/CfgAmmoSpall.hpp b/addons/frag/CfgAmmoSpall.hpp
new file mode 100644
index 00000000000..c53ce4db4a8
--- /dev/null
+++ b/addons/frag/CfgAmmoSpall.hpp
@@ -0,0 +1,158 @@
+class GVAR(spallBase): B_65x39_Caseless {
+ GVAR(skip) = 1;
+ submunitionAmmo[] = {QGVAR(small), 4, QGVAR(medium), 3, QGVAR(large), 2, QGVAR(huge), 1};
+ submunitionConeType[] = {"random", 20};
+ submunitionConeAngle = 40;
+ submunitionDirectionType = "SubmunitionModelDirection";
+ triggerTime = 0;
+ submunitionInitialOffset[] = {0, 0, 0};
+ submunitionInitSpeed = 0;
+ triggerSpeedCoef[] = {0.75, 1.25};
+ deleteParentWhenTriggered = 1;
+ submunitionParentSpeedCoef = 1;
+};
+
+
+/*
+ * ground
+ */
+class GVAR(ground_spall_tiny): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 9, QGVAR(small), 1};
+ submunitionConeType[] = {"poissondisccenter", 4};
+};
+
+class GVAR(ground_spall_small): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(small), 4, QGVAR(medium), 1};
+ submunitionConeType[] = {"poissondisccenter", 6};
+};
+
+class GVAR(ground_spall_medium): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(small), 2, QGVAR(small_HD), 1, QGVAR(medium), 3, QGVAR(medium_HD), 1, QGVAR(large), 2};
+ submunitionConeType[] = {"poissondisccenter", 15};
+};
+
+class GVAR(ground_spall_large): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 3, QGVAR(tiny_HD), 3, QGVAR(small), 4, QGVAR(small_HD), 4, QGVAR(medium_HD), 5, QGVAR(large), 1, QGVAR(large_HD), 2};
+ submunitionConeType[] = {"poissondisccenter", 15};
+};
+
+class GVAR(ground_spall_huge): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 3, QGVAR(tiny_HD), 3, QGVAR(small), 4, QGVAR(small_HD), 4, QGVAR(medium), 5, QGVAR(large), 1, QGVAR(large_HD), 2};
+ submunitionConeType[] = {"poissondisccenter", 20};
+};
+
+
+/*
+ * rock
+ */
+class GVAR(rock_spall_tiny): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(small), 4, QGVAR(medium_HD), 1};
+ submunitionConeType[] = {"poissondisccenter", 4};
+};
+
+class GVAR(rock_spall_small): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(small), 4, QGVAR(medium), 1};
+ submunitionConeType[] = {"poissondisccenter", 5};
+};
+
+class GVAR(rock_spall_medium): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(small), 4, QGVAR(medium), 1, QGVAR(medium_HD), 2, QGVAR(large_HD), 1};
+ submunitionConeType[] = {"poissondisccenter", 7};
+};
+
+class GVAR(rock_spall_large): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(small), 5, QGVAR(medium), 2, QGVAR(large), 1};
+ submunitionConeType[] = {"poissondisccenter", 10};
+};
+
+class GVAR(rock_spall_huge): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(small), 5, QGVAR(medium), 2, QGVAR(large), 1, QGVAR(huge_HD), 1};
+ submunitionConeType[] = {"poissondisccenter", 13};
+};
+
+
+/*
+ * wood
+ */
+class GVAR(wood_spall_tiny): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 2, QGVAR(small), 4};
+ submunitionConeType[] = {"poissondisccenter", 4};
+};
+
+class GVAR(wood_spall_small): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 2, QGVAR(small), 4, QGVAR(medium), 1};
+ submunitionConeType[] = {"poissondisccenter", 6};
+};
+
+class GVAR(wood_spall_medium): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 2, QGVAR(small), 2, QGVAR(medium), 2, QGVAR(medium_HD), 1, QGVAR(large_HD), 1};
+ submunitionConeType[] = {"poissondisccenter", 8};
+};
+
+class GVAR(wood_spall_large): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 1, QGVAR(small), 3, QGVAR(medium), 2, QGVAR(large_HD), 2, QGVAR(huge_HD), 1};
+ submunitionConeType[] = {"poissondisccenter", 10};
+};
+
+class GVAR(wood_spall_huge): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 1, QGVAR(small), 3, QGVAR(medium), 2, QGVAR(large_HD), 2, QGVAR(huge_HD), 1};
+ submunitionConeType[] = {"poissondisccenter", 12};
+};
+
+
+/*
+ * concrete
+ */
+class GVAR(concrete_spall_tiny): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 6, QGVAR(tiny_HD), 3, QGVAR(small), 1};
+ submunitionConeType[] = {"poissondisccenter", 4};
+};
+
+class GVAR(concrete_spall_small): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 4, QGVAR(tiny_HD), 2, QGVAR(small), 2, QGVAR(medium), 1};
+ submunitionConeType[] = {"poissondisccenter", 6};
+};
+
+class GVAR(concrete_spall_medium): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 6, QGVAR(tiny_HD), 1, QGVAR(small), 4, QGVAR(medium), 5, QGVAR(large_HD), 1};
+ submunitionConeType[] = {"poissondisccenter", 9};
+};
+
+class GVAR(concrete_spall_large): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 6, QGVAR(small), 4, QGVAR(medium), 3, QGVAR(large), 1, QGVAR(large_HD), 2};
+ submunitionConeType[] = {"poissondisccenter", 12};
+};
+
+class GVAR(concrete_spall_huge): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 8, QGVAR(small), 4, QGVAR(medium), 3, QGVAR(large), 1, QGVAR(large_HD), 1, QGVAR(huge_HD), 1};
+ submunitionConeType[] = {"poissondisccenter", 18};
+};
+
+
+/*
+ * metal
+ */
+class GVAR(metal_spall_tiny): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 9, QGVAR(small), 1};
+ submunitionConeType[] = {"poissondisccenter", 4};
+};
+
+class GVAR(metal_spall_small): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 4, QGVAR(small), 2, QGVAR(medium), 1};
+ submunitionConeType[] = {"poissondisccenter", 6};
+};
+
+class GVAR(metal_spall_medium): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 5, QGVAR(small), 4, QGVAR(medium), 2, QGVAR(large), 1};
+ submunitionConeType[] = {"poissondisccenter", 8};
+};
+
+class GVAR(metal_spall_large): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 4, QGVAR(small), 3, QGVAR(medium), 2, QGVAR(large), 1, QGVAR(huge), 1};
+ submunitionConeType[] = {"poissondisccenter", 12};
+};
+
+class GVAR(metal_spall_huge): GVAR(spallBase) {
+ submunitionAmmo[] = {QGVAR(tiny), 8, QGVAR(small), 3, QGVAR(medium), 2, QGVAR(large), 3, QGVAR(huge), 1};
+ submunitionConeType[] = {"poissondisccenter", 18};
+};
diff --git a/addons/frag/README.md b/addons/frag/README.md
index ca62771f00e..797e652b207 100644
--- a/addons/frag/README.md
+++ b/addons/frag/README.md
@@ -1,4 +1,4 @@
ace_frag
========
-Shrapnel system for explosives.
+Explosive fragmentation, round spalling, and explosive reflection
diff --git a/addons/frag/XEH_PREP.hpp b/addons/frag/XEH_PREP.hpp
index a7fb8ff8c34..127f027f98e 100644
--- a/addons/frag/XEH_PREP.hpp
+++ b/addons/frag/XEH_PREP.hpp
@@ -1,25 +1,22 @@
-PREP(dev_debugAmmo);
-
-PREP(doSpall);
-PREP(fired);
-PREP(frago);
-PREP(spallTrack);
-
-// * Other */
PREP(addBlackList);
-PREP(dev_addTrack);
-PREP(dev_drawTraces);
-PREP(spallHP);
-PREP(dev_startTracing);
-PREP(dev_stopTracing);
-PREP(dev_trackTrace);
-
-// New tracking mechanisms
-PREP(masterPFH);
-PREP(pfhRound);
-PREP(addPfhRound);
-
-// Explosive Reflection
-PREP(findReflections);
+PREP(dev_clearTraces);
+PREP(dev_debugAmmo);
+PREP(dev_drawTrace);
+PREP(dev_fragCalcDump);
+PREP(dev_sphereDraw);
+PREP(dev_trackHitBox);
+PREP(dev_trackObj);
PREP(doExplosions);
PREP(doReflections);
+PREP(doSpallHitPart);
+PREP(doSpallPenetrate);
+PREP(findReflections);
+PREP(fired);
+PREP(frago);
+PREP(getFragInfo);
+PREP(getMaterialInfo);
+PREP(getSpallInfo);
+PREP(initMaterialCache);
+PREP(setClassBlacklisted);
+PREP(shouldFrag);
+PREP(shouldSpall);
diff --git a/addons/frag/XEH_postInit.sqf b/addons/frag/XEH_postInit.sqf
index cc58e1d15b2..7b0e32e04c9 100644
--- a/addons/frag/XEH_postInit.sqf
+++ b/addons/frag/XEH_postInit.sqf
@@ -1,32 +1,54 @@
#include "script_component.hpp"
-if (isServer) then {
- GVAR(lastFragTime) = -1;
- [QGVAR(frag_eh), LINKFUNC(frago)] call CBA_fnc_addEventHandler;
-};
-
["CBA_settingsInitialized", {
- if (!GVAR(enabled)) exitWith {};
+ [{
+ params ["_projectile", "_posASL"];
+
+ if (_projectile getVariable [QGVAR(blacklisted), false]) exitWith {};
+
+ private _ammo = typeOf _projectile;
+ if (GVAR(reflectionsEnabled)) then {
+ [_posASL, _ammo] call FUNC(doReflections);
+ };
+ if (GVAR(enabled) && _ammo call FUNC(shouldFrag)) then {
+ // only let a unit make a frag event once per second
+ private _shotParents = getShotParents _projectile;
+ private _instigator = _shotParents select !isNull (_shotParents#1);
+ if (CBA_missionTime < (_instigator getVariable [QGVAR(nextFragEvent), -1])) exitWith {};
+ _instigator setVariable [QGVAR(nextFragEvent), CBA_missionTime + ACE_FRAG_FRAG_UNIT_HOLDOFF];
+
+ // Wait a frame to make sure it doesn't target the dead
+ [{
+ [QGVAR(frag_eh), _this] call CBA_fnc_serverEvent
+ }, [_posASL, _ammo, [objNull, _instigator]]] call CBA_fnc_execNextFrame;
+ };
+ }] call EFUNC(common,addExplosionEventHandler);
- // Register fire event handler
["ace_firedPlayer", LINKFUNC(fired)] call CBA_fnc_addEventHandler;
["ace_firedNonPlayer", LINKFUNC(fired)] call CBA_fnc_addEventHandler;
["ace_firedPlayerVehicle", LINKFUNC(fired)] call CBA_fnc_addEventHandler;
["ace_firedNonPlayerVehicle", LINKFUNC(fired)] call CBA_fnc_addEventHandler;
-
- addMissionEventHandler ["EachFrame", {call FUNC(masterPFH)}];
-}] call CBA_fnc_addEventHandler;
-
-// Cache for ammo type configs
-GVAR(cacheRoundsTypesToTrack) = createHashMap;
-
-
-// Debug stuff:
-
-#ifdef DRAW_FRAG_INFO
-[] call FUNC(dev_startTracing);
+#ifdef DEBUG_MODE_DRAW
+ [QGVAR(dev_clearTraces), LINKFUNC(dev_clearTraces)] call CBA_fnc_addEventHandler;
+
+ if (!hasInterface) exitWith {};
+ GVAR(dev_drawPFEH) = [LINKFUNC(dev_drawTrace), 0] call CBA_fnc_addPerFrameHandler;
+ ["ace_interact_menu_newControllableObject", {
+ params ["_type"];
+
+ private _action = [
+ QGVAR(debugReset),
+ "Reset ACE Frag traces",
+ "",
+ {[QGVAR(dev_clearTraces), []] call CBA_fnc_globalEvent;},
+ {GVAR(dev_trackLines) isNotEqualTo createHashMap}
+ ] call EFUNC(interact_menu,createAction);
+
+ [_type, 1, ["ACE_SelfActions"], _action, true] call EFUNC(interact_menu,addActionToClass);
+ }] call CBA_fnc_addEventHandler;
#endif
+}] call CBA_fnc_addEventHandler;
-#ifdef DEBUG_MODE_FULL
+#ifdef LOG_FRAG_INFO
[true, true, 30] call FUNC(dev_debugAmmo);
#endif
diff --git a/addons/frag/XEH_preInit.sqf b/addons/frag/XEH_preInit.sqf
index dc616917b88..2cb4a8e368d 100644
--- a/addons/frag/XEH_preInit.sqf
+++ b/addons/frag/XEH_preInit.sqf
@@ -6,20 +6,32 @@ PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;
-GVAR(blackList) = [];
-GVAR(traceFrags) = false;
+GVAR(spallMaterialCache) = uiNamespace getVariable QGVAR(spallMaterialCache);
+GVAR(spallInfoCache) = createHashMap;
+GVAR(shouldSpallCache) = createHashMap;
+GVAR(nextSpallAllowTime) = -1;
-GVAR(spallHPData) = [];
-GVAR(spallIsTrackingCount) = 0;
-
-GVAR(traceID) = -1;
-GVAR(traces) = [];
-GVAR(tracesStarted) = false;
-
-GVAR(lastIterationIndex) = 0;
-GVAR(objects) = [];
-GVAR(arguments) = [];
+GVAR(shouldFragCache) = createHashMap;
+GVAR(fragInfoCache) = createHashMap;
+GVAR(lastFragTime) = -1;
#include "initSettings.inc.sqf"
+GVAR(dev_trackLines) = createHashMap;
+GVAR(dev_hitBoxes) = createHashMap;
+GVAR(dev_eventSpheres) = [];
+GVAR(dev_drawPFEH) = -1;
+
+#ifdef DEBUG_MODE_DRAW
+#include "initSettingsDebug.inc.sqf"
+#else
+GVAR(debugOptions) = false;
+GVAR(dbgSphere) = false;
+GVAR(drawHitBox) = false;
+#endif
+
+if (isServer) then {
+ [QGVAR(frag_eh), LINKFUNC(frago)] call CBA_fnc_addEventHandler;
+};
+
ADDON = true;
diff --git a/addons/frag/XEH_preStart.sqf b/addons/frag/XEH_preStart.sqf
index 022888575ed..d3e2573e07e 100644
--- a/addons/frag/XEH_preStart.sqf
+++ b/addons/frag/XEH_preStart.sqf
@@ -1,3 +1,4 @@
#include "script_component.hpp"
#include "XEH_PREP.hpp"
+call FUNC(initMaterialCache);
diff --git a/addons/frag/config.cpp b/addons/frag/config.cpp
index f3b409dbd03..488b72c5070 100644
--- a/addons/frag/config.cpp
+++ b/addons/frag/config.cpp
@@ -8,7 +8,7 @@ class CfgPatches {
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_common"};
author = ECSTRING(common,ACETeam);
- authors[] = {"Nou"};
+ authors[] = {"Nou", "johnb43", "Lambda.Tiger"};
url = ECSTRING(main,URL);
VERSION_CONFIG;
};
diff --git a/addons/frag/functions/fnc_addBlackList.sqf b/addons/frag/functions/fnc_addBlackList.sqf
deleted file mode 100644
index d0cc127d059..00000000000
--- a/addons/frag/functions/fnc_addBlackList.sqf
+++ /dev/null
@@ -1,21 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: Jaynus, NouberNou
- * Adds a round to the blacklist (will be ignored).
- *
- * Arguments:
- * 0: Projectile
- *
- * Return Value:
- * None
- *
- * Example:
- * [bullet] call ace_frag_fnc_addBlackList
- *
- * Public: No
- */
-
-params ["_round"];
-TRACE_1("addBlackList",_round);
-
-GVAR(blackList) pushBack _round;
diff --git a/addons/frag/functions/fnc_addBlacklist.sqf b/addons/frag/functions/fnc_addBlacklist.sqf
new file mode 100644
index 00000000000..a835dc33702
--- /dev/null
+++ b/addons/frag/functions/fnc_addBlacklist.sqf
@@ -0,0 +1,32 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Jaynus, NouberNou, Lambda.Tiger
+ * Adds a round to the blacklist (will be ignored) and removes any ace_frag event handlers added to it.
+ * Once blacklisted a projectile can not be "unblacklisted."
+ *
+ * Arguments:
+ * 0: Projectile to be blacklisted
+ *
+ * Return Value:
+ * Was the projectile blacklisted
+ *
+ * Example:
+ * [_projectile] call ace_frag_fnc_addBlackList
+ *
+ * Public: Yes
+ */
+
+params [["_projectile", objNull, [objNull]]];
+TRACE_2("addBlackList",_projectile,typeOf projectile);
+
+if (isNull _projectile || {!isClass (configFile >> "CfgAmmo" >> (typeOf _projectile))}) exitWith {
+ TRACE_1("Invalid projectile",_this);
+ false
+};
+
+_projectile setVariable [QGVAR(blacklisted), true];
+(_projectile getVariable [QGVAR(spallEH), [-1, -1]]) params ["_hitPartEH", "_penetratedEH"];
+_projectile removeEventHandler ["HitPart", _hitPartEH];
+_projectile removeEventHandler ["Penetrated", _penetratedEH];
+
+true
diff --git a/addons/frag/functions/fnc_addPfhRound.sqf b/addons/frag/functions/fnc_addPfhRound.sqf
deleted file mode 100644
index 358a9ee71ea..00000000000
--- a/addons/frag/functions/fnc_addPfhRound.sqf
+++ /dev/null
@@ -1,77 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: Jaynus, NouberNou
- * Starts tracking a round that will frag.
- * Should only be called once per round.
- *
- * Arguments:
- * 0: Shooter
- * 1: Ammo classname
- * 2: Projectile
- *
- * Return Value:
- * None
- *
- * Example:
- * [player, "handGrenade", bullet] call ace_frag_fnc_addPfhRound
- *
- * Public: No
- */
-
-params ["_gun", "_type", "_round"];
-TRACE_3("addPfhRound",_gun,_type,_round);
-
-if (!GVAR(enabled)) exitWith {TRACE_1("setting disabled",_this);};
-
-if (!alive _round) exitWith {TRACE_1("round dead?",_this);};
-
-if (_round in GVAR(blackList)) exitWith {
- TRACE_1("round in blackList",_this);
- REM(GVAR(blackList),_round);
-};
-
-// Exit on max track
-if ((count GVAR(objects)) >= GVAR(maxTrack)) exitWith {TRACE_1("maxTrack limit",count GVAR(objects));};
-
-private _doSpall = false;
-if (GVAR(SpallEnabled)) then {
- if (GVAR(spallIsTrackingCount) <= 0) then {
- GVAR(spallHPData) = [];
- };
- if (GVAR(spallIsTrackingCount) > 5) then {
- TRACE_1("At Spall Limit",GVAR(spallIsTrackingCount));
- } else {
- _doSpall = true;
- INC(GVAR(spallIsTrackingCount));
- };
- TRACE_2("",_doSpall,GVAR(spallIsTrackingCount));
-};
-
-#ifdef DRAW_FRAG_INFO
-[ACE_player, _round, [0, 1, 0, 1]] call FUNC(dev_addTrack);
-#endif
-
-// We only do the single track object check here.
-// We should do an {!(_round in GVAR(objects))}
-// But we leave that out here for optimization. So this cannot be a framework function
-// Otherwise, it should only be added once and from the FiredEH
-if (alive _round) then {
- private _spallTrack = [];
- private _spallTrackID = [];
-
- private _args = [
- _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"),
- getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(force)),
- getNumber (configFile >> "CfgAmmo" >> _type >> "indirecthit") * (sqrt (getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange")))
- ];
- TRACE_1("Initializing track",_round);
- GVAR(objects) pushBack _round;
- GVAR(arguments) pushBack _args;
-
- if (_doSpall) then {
- [_round, 1, _spallTrack, _spallTrackID] call FUNC(spallTrack);
- };
-};
diff --git a/addons/frag/functions/fnc_dev_addTrack.sqf b/addons/frag/functions/fnc_dev_addTrack.sqf
deleted file mode 100644
index 0e75a9fb994..00000000000
--- a/addons/frag/functions/fnc_dev_addTrack.sqf
+++ /dev/null
@@ -1,26 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: ACE-Team
- *
- *
- * Arguments:
- * None
- *
- * Return Value:
- * None
- *
- * Example:
- * call ace_frag_fnc_dev_addTrack
- *
- * Public: No
- */
-
-params ["_origin", "_obj", ["_color", [1, 0, 0, 1]]];
-
-private _positions = [];
-private _objSpd = vectorMagnitude (velocity _obj);
-_positions pushBack [getPos _obj, _objSpd];
-private _data = [_origin, typeOf _origin, typeOf _obj, _objSpd, _positions, _color];
-
-private _index = GVAR(traces) pushBack _data;
-[DFUNC(dev_trackTrace), 0, [_obj, _index, CBA_missionTime]] call CBA_fnc_addPerFrameHandler;
diff --git a/addons/frag/functions/fnc_dev_clearTraces.sqf b/addons/frag/functions/fnc_dev_clearTraces.sqf
new file mode 100644
index 00000000000..6e2b820bacb
--- /dev/null
+++ b/addons/frag/functions/fnc_dev_clearTraces.sqf
@@ -0,0 +1,25 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Lambda.Tiger
+ * Clears all dev spheres and traces.
+ *
+ * Arguments:
+ * None
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * call ace_frag_fnc_dev_clearTraces
+ *
+ * Public: No
+ */
+
+{
+ deleteVehicle _x;
+} forEach GVAR(dev_eventSpheres);
+
+GVAR(dev_eventSpheres) = [];
+
+GVAR(dev_trackLines) = createHashMap;
+GVAR(dev_hitBoxes) = createHashMap;
diff --git a/addons/frag/functions/fnc_dev_debugAmmo.sqf b/addons/frag/functions/fnc_dev_debugAmmo.sqf
index 4484edbdc43..fe868df3428 100644
--- a/addons/frag/functions/fnc_dev_debugAmmo.sqf
+++ b/addons/frag/functions/fnc_dev_debugAmmo.sqf
@@ -1,11 +1,15 @@
-#define DEBUG_MODE_FULL
#include "..\script_component.hpp"
/*
- * Author: ACE-Team
- *
+ * Author: ACE-Team, Lambda.Tiger
+ * This function will dump every ammo config that would generate ace_frag
+ * fragments that could be fired from a weapon.
*
* Arguments:
- * None
+ * 0: Log ammo types that wouldn't normally frag (default: false)
+ * 1: Only print ammo without ACE_frag entries, inherited or otherwise (default: true)
+ * 2: Only export ammo classes of classes referenced in CfgMagazines and their
+ * submunitions (default: false)
+ * 3: Force a CSV format on debug print. (default: false)
*
* Return Value:
* None
@@ -17,65 +21,90 @@
*/
params [
- ["_debugMissing", true, [false]],
- ["_debugForce", false, [false]],
- ["_debugSkippedFragPower", 30, [0]]
+ ["_logAll", false, [false]],
+ ["_printOnlyIncomplete", true, [true]],
+ ["_onlyShotAmmoTypes", false, [false]],
+ ["_csvFormat", false, [false]]
];
diag_log text format ["~~~~~~~~~~~~~Start [%1]~~~~~~~~~~~~~", _this];
+if (_csvFormat) then {
+ diag_log text format ["ammo,gurney_c,gurney_m,gurney_k,gurney_gC,skip,Inheritance"];
+};
-private _allMagsConfigs = configProperties [configFile >> "CfgMagazines", "isClass _x", true];
-private _processedCfgAmmos = [];
-
-{
- private _ammo = toLowerANSI getText (_x >> "ammo");
- if (_ammo != "" && {!(_ammo in _processedCfgAmmos)}) then {
- _processedCfgAmmos pushBack _ammo;
-
- //Ignore mines/bombs
- if (_ammo isKindOf "TimeBombCore") exitWith {};
-
- _ammoConfig = configFile >> "CfgAmmo" >> _ammo;
-
- //Read configs and test if it would actually cause a frag, using same logic as FUNC(pfhRound)
- private _skip = getNumber (_ammoConfig >> QGVAR(skip));
- private _explosive = getNumber (_ammoConfig >> "explosive");
- private _indirectRange = getNumber (_ammoConfig >> "indirectHitRange");
- private _force = getNumber (_ammoConfig >> QGVAR(force));
- private _fragPower = getNumber (_ammoConfig >> "indirecthit") * (sqrt ((getNumber (_ammoConfig >> "indirectHitRange"))));
+// Gather all configs, either those that could be created from firing or all classes
+private _allAmmoConfigs = createHashMap;
+if (_onlyShotAmmoTypes) then {
+ private _configSearchFunction = {
+ params [
+ ["_ammo", "", [""]]
+ ];
+ if (_ammo isEqualTo "" || {_ammo in _allAmmoConfigs}) exitWith {};
+ _allAmmoConfigs set [_ammo, 1];
+ private _cfgAmmoRoot = configFile >> "CfgAmmo";
+ private _submunitionConfig = _cfgAmmoRoot >> _ammo >> "submunitionAmmo";
+ if (isArray _submunitionConfig) then {
+ private _subMunition = getArray _submunitionConfig;
+ for "_i" from 0 to count _subMunition - 1 do {
+ if (_i mod 2 == 0) then {
+ configName (_cfgAmmoRoot >> (_subMunition#_i)) call _configSearchFunction;
+ };
+ };
+ } else {
+ private _subMunition = getText _submunitionConfig;
+ if (_subMunition isNotEqualTo "") then {
+ configName (_cfgAmmoRoot >> _subMunition) call _configSearchFunction;
+ };
+ };
+ };
+ private _allMagazineConfigs = configProperties [configFile >> "CfgMagazines", "isClass _x", true];
+ private _cfgAmmoCfgPath = configFile >> "CfgAmmo";
+ {
+ private _magAmmo = getText (_x >> "ammo");
+ configName (_cfgAmmoCfgPath >> _magAmmo) call _configSearchFunction;
+ } forEach _allMagazineConfigs;
+ _allAmmoConfigs = keys _allAmmoConfigs;
+} else {
+ _allAmmoConfigs = configProperties [configFile >> "CfgAmmo", "isClass _x && !('ace_frag' in configName _x)", true] apply {configName _x};
+};
- private _shouldAdd = (_skip == 0) && {(_force == 1) || {_explosive > 0.5 && {_indirectRange >= 4.5} && {_fragPower >= 35}}};
+private _processedCfgAmmos = 0;
+private _printCount = 0;
+{ // Begin forEach to check each ammo type
+ private _ammo = _x;
+ if (_ammo isNotEqualTo "") then {
+ INC(_processedCfgAmmos);
- if (_shouldAdd) then {
- if (_debugForce && {((getNumber(_ammoConfig >> "hit")) < 5) || {_fragPower < 10}}) then {
- diag_log text format ["Ammo [%1] from Mag [%2] - Weak but will still frag!", _ammo, configName _x];
- diag_log text format [" - _force=%1,_fragPower=%2", _force, _fragPower];
- };
+ private _ammoConfig = configFile >> "CfgAmmo" >> _ammo;
+ _ammo call FUNC(shouldFrag) params ["_shouldFrag"];
- private _warn = false;
+ if (_shouldFrag || _logAll) then {
- _fragTypes = getArray (_ammoConfig >> QGVAR(CLASSES));
- if (_fragTypes isEqualTo []) then {_warn = true;};
- _c = getNumber(_ammoConfig >> QGVAR(CHARGE));
- if (_c == 0) then {_warn = true;};
- _m = getNumber(_ammoConfig >> QGVAR(METAL));
- if (_m == 0) then {_warn = true;};
- _k = getNumber(_ammoConfig >> QGVAR(GURNEY_K));
- if (_k == 0) then {_warn = true;};
- _gC = getNumber(_ammoConfig >> QGVAR(GURNEY_C));
- if (_gC == 0) then {_warn = true;};
+ private _print = false;
+ private _skip = getNumber (_ammoConfig >> QGVAR(skip));
+ private _fragTypes = getArray (_ammoConfig >> QGVAR(classes));
+ if (_fragTypes isEqualTo []) then {_print = true;};
+ private _c = getNumber (_ammoConfig >> QGVAR(charge));
+ if (_c == 0) then {_print = true;};
+ private _m = getNumber (_ammoConfig >> QGVAR(metal));
+ if (_m == 0) then {_print = true;};
+ private _k = getNumber (_ammoConfig >> QGVAR(gurney_k));
+ if (_k == 0) then {_print = true;};
+ private _gC = getNumber (_ammoConfig >> QGVAR(gurney_c));
+ if (_gC == 0) then {_print = true;};
- if (_debugMissing && {_warn}) then {
- diag_log text format ["Ammo [%1] from Mag [%2] MISSING frag configs:", _ammo, configName _x];
- diag_log text format [" - _c=%1,_m=%2,_k=%3,_gC=%4,_fragTypes=%5", _c, _m, _k, _gC, _fragTypes];
- };
- } else {
- if ((_fragPower > _debugSkippedFragPower) && {isArray (_ammoConfig >> QGVAR(CLASSES))}) then {
- diag_log text format ["Ammo [%1] from Mag [%2] has frag configs but will NOT frag:", _ammo, configName _x];
- diag_log text format ["- skip=%1,explosive=%2,indirectHitRange=%3,force=%4,fragPower=%5", _skip, _explosive, _indirectRange, _force, _fragPower];
+ if (!_printOnlyIncomplete || {_print && _skip != 0}) then {
+ INC(_printCount);
+ if (_csvFormat) then {
+ diag_log text format ["%6,%1,%2,%3,%4,%5,%8,%7", _c, _m, _k, _gC, _skip, _ammo, [_ammoConfig, true] call BIS_fnc_returnParents, _shouldFrag];
+ } else {
+ diag_log text format ["Ammo [%1] MISSING frag configs:", _ammo];
+ diag_log text format ["_c=%1,_m=%2,_k=%3,_gC=%4,_skip=%5,_fragTypes=%6", _c, _m, _k, _gC, _skip, _fragTypes];
+ };
};
};
};
-} forEach _allMagsConfigs;
+} forEach _allAmmoConfigs;
-diag_log text format ["~~~~~~~~~~~~~End [%1-%2]~~~~~~~~~~~~~", count _allMagsConfigs, count _processedCfgAmmos];
+diag_log text format ["~~~~~~~~~~~~~~End [%1-%2]~~~~~~~~~~~~~~", count _allAmmoConfigs, _processedCfgAmmos];
+diag_log text format ["~~~~~~~~~~~~~~Printed: %1~~~~~~~~~~~", _printCount];
diff --git a/addons/frag/functions/fnc_dev_drawTrace.sqf b/addons/frag/functions/fnc_dev_drawTrace.sqf
new file mode 100644
index 00000000000..8b027e1f3ca
--- /dev/null
+++ b/addons/frag/functions/fnc_dev_drawTrace.sqf
@@ -0,0 +1,45 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Lambda.Tiger
+ * This function draws all development traces and is intended to be called on each frame.
+ *
+ * Arguments:
+ * None
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * call ace_frag_fnc_dev_drawTrace
+ *
+ * Public: No
+ */
+
+#define HITBOX_DRAW_PATH [[3, 2, 1, 5, 6, 7, 3, 0, 4, 5], [0, 1], [2, 6], [7, 4]]
+
+if (!GVAR(debugOptions)) exitWith {};
+
+{
+ _y params ["_posArray", "_color"];
+ if (count _posArray > 1) then {
+ for "_j" from 1 to count _posArray - 1 do {
+ drawLine3D [_posArray#(_j - 1), _posArray#_j, _color];
+ };
+ };
+} forEach GVAR(dev_trackLines);
+
+if (GVAR(drawHitBox)) then {
+ {
+ _y params ["_object", "_boxPoints", "_color"];
+ if (!alive _object) then {
+ GVAR(dev_hitBoxes) deleteAt _x;
+ continue;
+ };
+
+ {
+ for "_i" from 1 to count _x - 1 do {
+ drawLine3D [_object modelToWorld (_boxPoints#(_x#_i)), _object modelToWorld (_boxPoints#(_x#(_i - 1))), _color];
+ };
+ } forEach HITBOX_DRAW_PATH;
+ } forEach GVAR(dev_hitBoxes);
+};
diff --git a/addons/frag/functions/fnc_dev_drawTraces.sqf b/addons/frag/functions/fnc_dev_drawTraces.sqf
deleted file mode 100644
index 7fcca3c48fe..00000000000
--- a/addons/frag/functions/fnc_dev_drawTraces.sqf
+++ /dev/null
@@ -1,37 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: ACE-Team
- *
- *
- * Arguments:
- * None
- *
- * Return Value:
- * None
- *
- * Example:
- * call ace_frag_fnc_dev_drawTraces
- *
- * Public: No
- */
-
-{
- _x params ["", "", "", "", "_positions", "_color"];
- private _index = 0;
- private _max = count _positions;
- // private _lastSpd = [];
- private _lastPos = [];
- while {_index < _max} do {
- _data1 = _positions select _index;
- _data2 = _positions select ([_index + ACE_TRACE_DRAW_INC, _max - 1] select (_index + ACE_TRACE_DRAW_INC >= _max));
-
- _pos1 = _data1 select 0;
- _pos2 = _data2 select 0;
- ADD(_index,ACE_TRACE_DRAW_INC);
-
- drawLine3D [_pos1, _pos2, _color];
- _lastPos = _pos2;
- // _lastSpd = _data1 select 1;
- };
- // drawIcon3D ["", [1,0,0,1], _lastPos, 0, 0, 0, format ["%1m/s", _lastSpd], 1, 0.05, "RobotoCondensed"];
-} forEach GVAR(traces);
diff --git a/addons/frag/functions/fnc_dev_fragCalcDump.sqf b/addons/frag/functions/fnc_dev_fragCalcDump.sqf
new file mode 100644
index 00000000000..88be643c258
--- /dev/null
+++ b/addons/frag/functions/fnc_dev_fragCalcDump.sqf
@@ -0,0 +1,56 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Lambda.Tiger, based on fnc_dev_debugAmmo by "ACE-Team"
+ * Dumps all ammo types to see if there's any reason to spawn fragments given hit power and distance.
+ * Good for grasping the values used in shouldFrag to cull non-fragmenting rounds.
+ *
+ * Arguments:
+ * 0: Display rounds that will never frag (default: false)
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * false call ace_frag_fnc_dev_fragCalcDump
+ *
+ * Public: No
+ */
+
+params [["_logAll", false, [false]]];
+
+private _allAmmoConfigs = configProperties [configFile >> "CfgAmmo", "isClass _x && !('ace_frag' in configName _x)", true];
+private _processedCfgAmmos = createHashMap;
+
+private _numberPrinted = 0;
+
+diag_log text "//****************** fragCalcDump Beg ******************//";
+{ // Begin _allAmmoConfigs forEach
+ private _ammo = configName _x;
+
+ if (_ammo isEqualTo "" || {_ammo in _processedCfgAmmos}) then {
+ continue;
+ };
+
+ _ammo call FUNC(shouldFrag) params ["_shouldFrag"];
+ if (_shouldFrag || _logAll) then {
+ private _fragInfo = _ammo call FUNC(getFragInfo);
+ _fragInfo params ["_fragRange", "_fragMaxSpeed"];
+ private _ammoConfig = configFile >> "CfgAmmo" >> _ammo;
+ private _indirectHitRange = getNumber (_ammoConfig >> "indirectHitRange");
+ private _indirectHit = getNumber (_ammoConfig >> "indirectHit");
+ private _fragPowerSpeedRange = [0.5, 1] vectorMultiply _fragMaxSpeed;
+
+ diag_log text format ["Ammo type: %1 | Should frag: %2", _ammo, _shouldFrag];
+ diag_log text format [" Indirect hit range: %1", _indirectHitRange];
+ diag_log text format [" Indirect hit: %1", _indirectHit];
+ diag_log text format [" Max frag speed: %1", _fragMaxSpeed];
+ diag_log text format [" Frag range: %1", _fragRange];
+ diag_log text format [" Frag speed range: %1", _fragPowerSpeedRange];
+ INC(_numberPrinted);
+ };
+
+ _processedCfgAmmos set [_ammo, 1];
+} forEach _allAmmoConfigs;
+
+diag_log text "//****************** fragCalcDump End ******************//";
+diag_log text format ["//********************** printed %1 *********************//", _numberPrinted];
diff --git a/addons/frag/functions/fnc_dev_sphereDraw.sqf b/addons/frag/functions/fnc_dev_sphereDraw.sqf
new file mode 100644
index 00000000000..31a1393991e
--- /dev/null
+++ b/addons/frag/functions/fnc_dev_sphereDraw.sqf
@@ -0,0 +1,41 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Lambda.Tiger
+ * Add a colored sphere at a specified point.
+ *
+ * Arguments:
+ * 0: Position (posASL) to add sphere
+ * 1: Color of sphere (default: "blue")
+ *
+ * Return Value:
+ * The created sphere object
+ *
+ * Example:
+ * [getPosASL player, "red"] call ace_frag_fnc_dev_sphereDraw
+ *
+ * Public: No
+ */
+
+params ["_posASL", ["_color", "blue"]];
+
+if (!isServer) exitWith {};
+
+if (_color select [0,1] != "(") then {
+ _color = switch (toLowerANSI _color) do {
+ case "blue": {"(0,0,0.8,0.5)"};
+ case "black": {"(1,1,1,0.5)"};
+ case "white": {"(0,0,0,0.5)"};
+ case "red": {"(0.8,0,0,0.5)"};
+ case "green": {"(0,0.8,0,0.5)"};
+ case "yellow": {"(0.8,0.8,0,0.5)"};
+ case "orange": {"(0.8,0.518,0,0.5)"};
+ default {"(0.8,0.8,0,0.5)"};
+ };
+};
+private _colorString = "#(argb,8,8,3)color" + _color;
+
+private _sphere = createVehicle ["Sign_Sphere10cm_F", ASLToATL _posASL, [], 0, "CAN_COLLIDE"];
+_sphere setObjectTextureGlobal [0, _colorString];
+GVAR(dev_eventSpheres) pushBack _sphere;
+
+_sphere // return
diff --git a/addons/frag/functions/fnc_dev_startTracing.sqf b/addons/frag/functions/fnc_dev_startTracing.sqf
deleted file mode 100644
index 897dde3011e..00000000000
--- a/addons/frag/functions/fnc_dev_startTracing.sqf
+++ /dev/null
@@ -1,23 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: ACE-Team
- *
- *
- * Arguments:
- * None
- *
- * Return Value:
- * None
- *
- * Example:
- * call ace_frag_fnc_dev_startTracing
- *
- * Public: No
- */
-
-if (GVAR(tracesStarted)) exitWith {};
-
-INFO("Starting Trace Drawing");
-
-GVAR(tracesStarted) = true;
-GVAR(traceID) = [LINKFUNC(dev_drawTraces), 0, []] call CBA_fnc_addPerFrameHandler;
diff --git a/addons/frag/functions/fnc_dev_stopTracing.sqf b/addons/frag/functions/fnc_dev_stopTracing.sqf
deleted file mode 100644
index 949d3cd55d6..00000000000
--- a/addons/frag/functions/fnc_dev_stopTracing.sqf
+++ /dev/null
@@ -1,23 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: ACE-Team
- * Dev things
- *
- * Arguments:
- * None
- *
- * Return Value:
- * None
- *
- * Example:
- * None
- *
- * Public: No
- */
-
-if (!GVAR(tracesStarted)) exitWith {};
-
-INFO("Ending Trace Drawing");
-
-GVAR(tracesStarted) = false;
-[GVAR(traceID)] call CBA_fnc_removePerFrameHandler;
diff --git a/addons/frag/functions/fnc_dev_trackHitBox.sqf b/addons/frag/functions/fnc_dev_trackHitBox.sqf
new file mode 100644
index 00000000000..327e45cf0d3
--- /dev/null
+++ b/addons/frag/functions/fnc_dev_trackHitBox.sqf
@@ -0,0 +1,75 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Lambda.Tiger
+ * Add a hit box outline to an object.
+ *
+ * Arguments:
+ * 0: Object that should have it's hit box drawn (default: objNull)
+ * 1: Add sphere at object origin (default: true)
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * player call ace_frag_fnc_dev_trackHitBox
+ *
+ * Public: No
+ */
+
+params [
+ ["_object", objNull],
+ ["_addSphere", true]
+];
+TRACE_2("Adding hitbox",_object,_addSphere);
+
+if (isNull _object) exitWith {};
+
+// Grab the right hitBox
+private _boundingBox = [];
+if (_object isKindOf "CAManBase") then {
+ if (isNull objectParent _object) then {
+ _boundingBox = 0 boundingBox _object;
+ } else {
+ _boundingBox = boundingBoxReal [_object, "Geometry"];
+ };
+} else {
+ _boundingBox = boundingBoxReal [_object, "FireGeometry"];
+};
+_boundingBox params ["_lowerPoint", "_upperPoint"];
+
+// adjust with stance
+switch (stance _object) do {
+ case "STAND": {_upperPoint set [2, 1.9];};
+ case "CROUCH": {_upperPoint set [2, 1.3];};
+ case "PRONE": {_upperPoint set [2, 0.8];};
+};
+private _centerPoint = ASLToAGL getPosASL _object;
+
+if (GVAR(dbgSphere) && _addSphere && {isNull objectParent _object}) then {
+ private _centerSphere = [getPosASL _object, "yellow"] call FUNC(dev_sphereDraw);
+ _centerSphere attachTo [_object, _object worldToModel _centerPoint];
+};
+
+// create an optimized outline
+_upperPoint params ["_x1","_y1","_z1"];
+_lowerPoint params ["_x2","_y2","_z2"];
+private _p1 = _upperPoint;
+private _p7 = _lowerPoint;
+private _points = [
+ _upperPoint,
+ [_x1, _y2, _z1],
+ [_x2, _y2, _z1],
+ [_x2, _y1, _z1],
+ [_x1, _y1, _z2],
+ [_x1, _y2, _z2],
+ _lowerPoint,
+ [_x2, _y1, _z2]
+];
+
+private _color = switch (side _object) do {
+ case east: {[0.8, 0, 0, 1]};
+ case resistance: {[0, 0.8, 0, 1]};
+ default {[0, 0, 0.8, 1]};
+};
+
+GVAR(dev_hitBoxes) set [getObjectID _object, [_object, _points, _color]];
diff --git a/addons/frag/functions/fnc_dev_trackObj.sqf b/addons/frag/functions/fnc_dev_trackObj.sqf
new file mode 100644
index 00000000000..88b298fa0b8
--- /dev/null
+++ b/addons/frag/functions/fnc_dev_trackObj.sqf
@@ -0,0 +1,87 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Lambda.Tiger
+ * This function adds an object to have its course tracked (every frame).
+ *
+ * Arguments:
+ * 0: Object to draw track (default: objNull)
+ * 1: Color of trace (default: "blue")
+ * 2: Whether the object is a projectile or whether to add projectile EHs (default: false)
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * player call ace_frag_fnc_dev_trackObj
+ *
+ * Public: No
+ */
+
+params [
+ ["_object", objNull],
+ ["_color", "blue"],
+ ["_isProj", false]
+];
+TRACE_3("devDraw",_object,_color,_isProj);
+
+// pick color and add it to the array
+private _colorArray = switch (toLowerANSI _color) do {
+ case "purple": {[0.8, 0, 0.8, 1]};
+ case "blue": {[0, 0, 0.8, 1]};
+ case "green": {[0, 0.8, 0, 1]};
+ case "orange": {[0.8, 0.518, 0, 1]};
+ case "yellow": {[0.8, 0.8, 0, 1]};
+ case "red": {[0.8, 0, 0, 1]};
+ case "black": {[1, 1, 1, 1]};
+ case "white": {[0, 0, 0, 1]};
+ default {[0, 0.8, 0.8, 1]};
+};
+GVAR(dev_trackLines) set [getObjectID _object, [[getPosATL _object], _colorArray]];
+
+// event handler to track round and cleanup when round is "dead"
+[{
+ if (isGamePaused || accTime == 0) exitWith {};
+ params ["_object", "_handle"];
+
+ if (!alive _object) exitWith {
+ _handle call CBA_fnc_removePerFrameHandler;
+ };
+
+ private _objectArray = GVAR(dev_trackLines) get (getObjectID _object);
+
+ if (isNil "_objectArray") exitWith {
+ _handle call CBA_fnc_removePerFrameHandler;
+ };
+
+ (_objectArray#0) pushBack getPosATL _object;
+}, 0, _object] call CBA_fnc_addPerFrameHandler;
+
+// Projectile event handlers that add spheres and points for more accurate round tracking
+if (!_isProj) exitWith {};
+
+_object addEventHandler ["HitPart", {
+ params ["_projectile", "", "", "_posASL"];
+ private _posArr = (GVAR(dev_trackLines) get (getObjectID _projectile))#0;
+ _posArr pushBack ASLToATL _posASL;
+ if (GVAR(dbgSphere)) then {
+ [_posASL, "green"] call FUNC(dev_sphereDraw);
+ };
+}];
+
+_object addEventHandler ["Explode", {
+ params ["_projectile", "_posASL"];
+ private _posArr = (GVAR(dev_trackLines) get (getObjectID _projectile))#0;
+ _posArr pushBack ASLToATL _posASL;
+ if (GVAR(dbgSphere)) then {
+ [_posASL, "red"] call FUNC(dev_sphereDraw);
+ };
+}];
+
+_object addEventHandler ["Deflected", {
+ params ["_projectile", "_posASL"];
+ private _posArr = (GVAR(dev_trackLines) get (getObjectID _projectile))#0;
+ _posArr pushBack ASLToATL _posASL;
+ if (GVAR(dbgSphere)) then {
+ [_posASL, "blue"] call FUNC(dev_sphereDraw);
+ };
+}];
diff --git a/addons/frag/functions/fnc_dev_trackTrace.sqf b/addons/frag/functions/fnc_dev_trackTrace.sqf
deleted file mode 100644
index 6c010bdb631..00000000000
--- a/addons/frag/functions/fnc_dev_trackTrace.sqf
+++ /dev/null
@@ -1,27 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: ACE-Team
- * Dev things
- *
- * Arguments:
- * None
- *
- * Return Value:
- * None
- *
- * Example:
- * call ace_frag_fnc_dev_trackTrace
- *
- * Public: No
- */
-
-params ["_args", "_pfhID"];
-_args params ["_tracerObj", "_index"];
-
-if (alive _tracerObj && {GVAR(traces) isNotEqualTo []}) then {
- private _data = GVAR(traces) select _index;
- private _positions = _data select 4;
- _positions pushBack [getPos _tracerObj, vectorMagnitude (velocity _tracerObj)];
-} else {
- [_pfhID] call CBA_fnc_removePerFrameHandler;
-};
diff --git a/addons/frag/functions/fnc_doExplosions.sqf b/addons/frag/functions/fnc_doExplosions.sqf
index a5a687aa538..74e191532a5 100644
--- a/addons/frag/functions/fnc_doExplosions.sqf
+++ b/addons/frag/functions/fnc_doExplosions.sqf
@@ -21,7 +21,7 @@ _args params ["_explosions", "_index"];
for "_i" from _index to ((_index + 2) min (count _explosions)) do {
private _exp = _explosions select _i;
_exp params ["_refExp", "_bpos", "_hit", "_distance", "_indirectHitRange", "_depth"];
- _refExp createVehicle (ASLtoATL _bpos);
+ _refExp createVehicle (ASLToATL _bpos);
// if (_hit >= 150 && _distance > _indirectHitRange) then {
// [_bpos, _refExp, _depth] call FUNC(doReflections);
// };
diff --git a/addons/frag/functions/fnc_doSpall.sqf b/addons/frag/functions/fnc_doSpall.sqf
deleted file mode 100644
index b206c701b21..00000000000
--- a/addons/frag/functions/fnc_doSpall.sqf
+++ /dev/null
@@ -1,139 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: ACE-Team
- * Dev things
- *
- * Arguments:
- * None
- *
- * Return Value:
- * None
- *
- * Example:
- * call ace_frag_fnc_doSpall
- *
- * Public: No
- */
-
-#define WEIGHTED_SIZE [QGVAR(spall_small), 4, QGVAR(spall_medium), 3, QGVAR(spall_large), 2, QGVAR(spall_huge), 1]
-
-params ["_hitData", "_hitPartDataIndex"];
-private _initialData = GVAR(spallHPData) select (_hitData select 0);
-_initialData params ["_hpId", "_object", "_roundType", "_round", "_curPos", "_velocity"];
-
-private _hpData = (_hitData select 1) select _hitPartDataIndex;
-private _objectHit = _hpData param [0, objNull];
-TRACE_1("",_objectHit);
-if ((isNil "_objectHit") || {isNull _objectHit}) exitWith {WARNING_1("Problem with hitPart data - bad object [%1]",_objectHit);};
-_objectHit removeEventHandler ["HitPart", _hpId];
-
-private _caliber = getNumber (configFile >> "CfgAmmo" >> _roundType >> "caliber");
-private _explosive = getNumber (configFile >> "CfgAmmo" >> _roundType >> "explosive");
-private _idh = getNumber (configFile >> "CfgAmmo" >> _roundType >> "indirectHitRange");
-
-if !(_caliber >= 2.5 || {(_explosive > 0 && {_idh >= 1})}) exitWith {};
-// ACE_player sideChat format ["BBBB"];
-private _exit = false;
-private _vm = 1;
-
-private _oldVelocity = vectorMagnitude _velocity;
-private _curVelocity = vectorMagnitude (velocity _round);
-
-if (alive _round) then {
- private _diff = _velocity vectorDiff (velocity _round);
- private _polar = _diff call CBA_fnc_vect2polar;
- // ACE_player sideChat format ["polar: %1", _polar];
- if (abs (_polar select 1) > 45 || {abs (_polar select 2) > 45}) then {
- if (_caliber < 2.5) then {
- // ACE_player sideChat format ["exit!"];
- _exit = true;
- } else {
- SUB(_vm,_curVelocity / _oldVelocity);
- };
- };
-};
-if (_exit) exitWith {};
-
-private _unitDir = vectorNormalized _velocity;
-private _pos = _hpData select 3;
-private _spallPos = [];
-if ((isNil "_pos") || {!(_pos isEqualTypeArray [0,0,0])}) exitWith {WARNING_1("Problem with hitPart data - bad pos [%1]",_pos);};
-for "_i" from 0 to 100 do {
- private _pos1 = _pos vectorAdd (_unitDir vectorMultiply (0.01 * _i));
- private _pos2 = _pos vectorAdd (_unitDir vectorMultiply (0.01 * (_i + 1)));
- // _data = [nil, nil, nil, 1, [[ASLtoATL _pos1, 1], [ASLtoATL _pos2, 1]]];
- // NOU_TRACES pushBack _data;
-
- if (!lineIntersects [_pos1, _pos2]) exitWith {
- // ACE_player sideChat format ["FOUND!"];
- _spallPos = _pos2;
- };
-};
-if (_spallPos isEqualTo []) exitWith {};
-private _spallPolar = _velocity call CBA_fnc_vect2polar;
-
-if (_explosive > 0) then {
- // ACE_player sideChat format ["EXPLOSIVE!"];
- private _warn = false;
- private _c = getNumber (configFile >> "CfgAmmo" >> _roundType >> QGVAR(CHARGE));
- if (_c == 0) then {_c = 1; _warn = true;};
- private _m = getNumber (configFile >> "CfgAmmo" >> _roundType >> QGVAR(METAL));
- if (_m == 0) then {_m = 2; _warn = true;};
- private _k = getNumber (configFile >> "CfgAmmo" >> _roundType >> QGVAR(GURNEY_K));
- if (_k == 0) then {_k = 1 / 2; _warn = true;};
- private _gC = getNumber (configFile >> "CfgAmmo" >> _roundType >> QGVAR(GURNEY_C));
- if (_gC == 0) then {_gC = 2440; _warn = true;};
-
- // if (_warn) then {
- // WARNING_1("Ammo class %1 lacks proper explosive properties definitions for frag!",_roundType); //TODO: turn this off when we get closer to release
- // };
-
- private _fragPower = (((_m / _c) + _k) ^ - (1 / 2)) * _gC;
- _spallPolar set [0, _fragPower * 0.66];
-};
-
-// diag_log text format ["SPALL POWER: %1", _spallPolar select 0];
-private _spread = 15 + (random 25);
-private _spallCount = 5 + (random 10);
-TRACE_1("",_spallCount);
-for "_i" from 1 to _spallCount do {
- private _elev = ((_spallPolar select 2) - _spread) + (random (_spread * 2));
- private _dir = ((_spallPolar select 1) - _spread) + (random (_spread * 2));
- if (abs _elev > 90) then {
- ADD(_dir,180);
- };
- _dir = _dir % 360;
- private _vel = (_spallPolar select 0) * 0.33 * _vm;
- _vel = (_vel - (_vel * 0.25)) + (random (_vel * 0.5));
-
- private _spallFragVect = [_vel, _dir, _elev] call CBA_fnc_polar2vect;
- private _fragment = (selectRandomWeighted WEIGHTED_SIZE) createVehicleLocal [0,0,10000];
- _fragment setPosASL _spallPos;
- _fragment setVelocity _spallFragVect;
-
- #ifdef DRAW_FRAG_INFO
- [ACE_player, _fragment, [1, 0.5, 0, 1]] call FUNC(dev_addTrack);
- #endif
-};
-
-_spread = 5 + (random 5);
-_spallCount = 3 + (random 5);
-for "_i" from 1 to _spallCount do {
- private _elev = ((_spallPolar select 2) - _spread) + (random (_spread * 2));
- private _dir = ((_spallPolar select 1) - _spread) + (random (_spread * 2));
- if (abs _elev > 90) then {
- ADD(_dir,180);
- };
- _dir = _dir % 360;
- private _vel = (_spallPolar select 0) * 0.55 * _vm;
- _vel = (_vel - (_vel * 0.25)) + (random (_vel * 0.5));
-
- private _spallFragVect = [_vel, _dir, _elev] call CBA_fnc_polar2vect;
- private _fragment = (selectRandomWeighted WEIGHTED_SIZE) createVehicleLocal [0, 0, 10000];
- _fragment setPosASL _spallPos;
- _fragment setVelocity _spallFragVect;
-
- #ifdef DRAW_FRAG_INFO
- [ACE_player, _fragment, [1, 0, 0, 1]] call FUNC(dev_addTrack);
- #endif
-};
diff --git a/addons/frag/functions/fnc_doSpallHitPart.sqf b/addons/frag/functions/fnc_doSpallHitPart.sqf
new file mode 100644
index 00000000000..dc22c66a63c
--- /dev/null
+++ b/addons/frag/functions/fnc_doSpallHitPart.sqf
@@ -0,0 +1,133 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Jaynus, NouberNou, Lambda.Tiger,
+ * This function creates spalling when a projectile hits a object and comes to a stop.
+ *
+ * Arguments:
+ * 0: The projectile that may generate spalling
+ * 1: The object the projectile hit
+ * 2: The position (ASL) of the projectile hit
+ * 3: The velocity of the projectile before it hit the surface
+ * 4: The surface normal of the surface hit
+ * 5: The name of the config name or path to bisurf of the surface hit
+ * 6: The projectiles ammo config
+ * 7: The projectiles shot parent
+ * 8: The "up" vector of the projectile when it hit the object
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [BIS_HITPART_EH_ARGS] call ace_frag_fnc_doSpallHitPart;
+ *
+ * Public: No
+ */
+TRACE_1("doSpallHitPart",_this);
+if (CBA_missionTime < GVAR(nextSpallAllowTime)) exitWith {
+ TRACE_2("timeExit",CBA_missionTime,GVAR(nextSpallAllowTime));
+};
+params ["_projectile", "_objectHit", "_lastPosASL", "_lastVelocity", "_surfaceNorm", "_surfaceType", "_ammo", "_vectorUp"];
+
+// Find spall speed / fragment info
+_ammo call FUNC(getSpallInfo) params ["_caliber", "_explosive", "_indirectHit"];
+// Add in v2.18 `getShotInfo`'s `fuseDistanceLeft <= 0` to _explosive
+if ((alive _projectile && _explosive < 0.5) ||
+ _ammo == "" ||
+ _lastPosASL isEqualTo [0,0,0] ||
+ {_objectHit isKindOf "CAManBase"}) exitWith {
+ TRACE_3("exitEarly",alive _projectile,_lastPosASL,_objectHit);
+};
+
+private _material = _surfaceType call FUNC(getMaterialInfo);
+if (_material == "ground") exitWith {
+ TRACE_1("hitGround",_surfaceType);
+};
+
+private _speedChange = vectorMagnitude _lastVelocity;
+/*
+ * This is all fudge factor since real spalling is too complex for calculation.
+ * There are two terms. The first is from round impact, taking a quasi scale
+ * of caliber coefficient * round caliber * srqt(change in speed). The second term is
+ * explosive * indirect hit, for any explosive contribution
+ */
+private _spallPower = (ACE_FRAG_SPALL_CALIBER_COEF * _caliber * sqrt _speedChange + _explosive * _indirectHit) * GVAR(spallIntensity);
+TRACE_3("found speed",_speedChange,_caliber,_spallPower);
+
+if (_spallPower < ACE_FRAG_SPALL_POWER_MIN) exitWith {
+ TRACE_1("lowImpulse",_ammo);
+};
+
+private _lastVelocityNorm = vectorNormalized _lastVelocity;
+private _deltaStep = _lastVelocityNorm vectorMultiply 0.05;
+
+if (terrainIntersectASL [_lastPosASL vectorAdd _deltaStep, _lastPosASL]) exitWith {
+ TRACE_2("terrainIntersect",_lastPosASL,_deltaStep);
+};
+
+#ifdef DEBUG_MODE_DRAW
+if GVAR(dbgSphere) then {
+ [_lastPosASL vectorAdd _lastVelocityNorm, "orange"] call FUNC(dev_sphereDraw);
+ [_lastPosASL, "yellow"] call FUNC(dev_sphereDraw);
+};
+#endif
+
+/*
+ * Improve performance of finding otherside of object on shallow angle
+ * impacts. 120 degrees due to 90 degree offset with _lastVelocityNorm into object.
+ */
+private _spallPosASL = _lastPosASL vectorAdd _deltaStep;
+if (120 > acos (_lastVelocityNorm vectorDotProduct _surfaceNorm)) then {
+ _spallPosASL = _spallPosASL vectorAdd (_deltaStep vectorMultiply 5);
+};
+private _lastSpallPos = _spallPosASL;
+// we need to check 1.05 m in the direction of last velocity incrementing by delta step
+// Our initial check is from 0m to 5 cm, so we only need to iterate from 2 to 21 to get
+// to the full 1.05m
+for "_stepNumber" from 2 to 21 do
+{
+ _spallPosASL = _lastSpallPos vectorAdd _deltaStep;
+ if (!lineIntersects [_lastSpallPos, _spallPosASL]) exitWith {
+ _spallPosASL = _lastSpallPos vectorAdd _deltaStep;
+ };
+ _lastSpallPos = _spallPosASL;
+};
+
+if (_spallPosASL isEqualTo _lastSpallPos) exitWith {
+ TRACE_2("insideObj",_lastPosASL,_spallPosASL);
+};
+
+#ifdef DEBUG_MODE_DRAW
+if GVAR(dbgSphere) then {
+ [_spallPosASL, "green"] call FUNC(dev_sphereDraw);
+};
+#endif
+
+private _spawnSize = switch (true) do {
+ case (_spallPower < ACE_FRAG_SPALL_POWER_TINY_MAX): {"_spall_tiny"};
+ case (_spallPower < ACE_FRAG_SPALL_POWER_SMALL_MAX): {"_spall_small"};
+ case (_spallPower < ACE_FRAG_SPALL_POWER_MEDIUM_MAX): {"_spall_medium"};
+ case (_spallPower < ACE_FRAG_SPALL_POWER_LARGE_MAX): {"_spall_large"};
+ default {"_spall_huge"};
+};
+GVAR(nextSpallAllowTime) = CBA_missionTime + ACE_FRAG_SPALL_HOLDOFF;
+
+private _spallSpawner = createVehicleLocal [
+ QUOTE(GLUE(ADDON,_)) + _material + _spawnSize,
+ ASLToAGL _spallPosASL,
+ [],
+ 0,
+ "CAN_COLLIDE"
+];
+_spallSpawner setVectorDirAndUp [_lastVelocityNorm, _vectorUp];
+_spallSpawner setVelocityModelSpace [0, _speedChange * ACE_FRAG_SPALL_VELOCITY_INHERIT_COEFF, 0];
+
+TRACE_3("createSpallSpawner",speed _spallSpawner,_material + _spawnSize,_spallPower);
+#ifdef DEBUG_MODE_DRAW
+_spallSpawner addEventHandler [
+ "SubmunitionCreated",
+ {
+ params ["", "_subProj"];
+ [_subProj, "purple", true] call FUNC(dev_trackObj);
+ }
+];
+#endif
diff --git a/addons/frag/functions/fnc_doSpallPenetrate.sqf b/addons/frag/functions/fnc_doSpallPenetrate.sqf
new file mode 100644
index 00000000000..6c8feda7a9d
--- /dev/null
+++ b/addons/frag/functions/fnc_doSpallPenetrate.sqf
@@ -0,0 +1,98 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Jaynus, NouberNou, Lambda.Tiger,
+ * This function creates spalling if a projectile penetrated a surface and was slowed down enough proportional to the caliber.
+ * It is dissimilar in function from fnc_doSpallHitPart, but leveraging the "Penetrated" projectile EH to process faster.
+ *
+ * Arguments:
+ * Arguments are the same as BI's "Penetratred" EH:
+ * https://community.bistudio.com/wiki/Arma_3:_Event_Handlers#Penetrated
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [BIS_PENETRATED_EH_ARGS] call ace_frag_fnc_doSpallPenetrate;
+ *
+ * Public: No
+ */
+#define EPSILON 0.1
+
+TRACE_1("doSpallPenetration",_this);
+if (CBA_missionTime < GVAR(nextSpallAllowTime)) exitWith {
+ TRACE_1("timeExit",_this);
+};
+params ["_projectile", "_hitObject", "_surfaceType", "", "_spallPosASL", "_newVelocity"];
+
+private _ammo = typeOf _projectile;
+if (_spallPosASL isEqualTo [0,0,0] ||
+ {_ammo isEqualTo ""} ||
+ {_hitObject isKindOf "CAManBase"}) exitWith {
+ TRACE_4("time/invalidHit",CBA_missionTime,GVAR(nextSpallAllowTime),_hitObject,_spallPosASL);
+};
+
+private _material = _surfaceType call FUNC(getMaterialInfo);
+if (_material == "ground") exitWith {
+ #ifdef DEBUG_MODE_FULL
+ systemChat "ground spall";
+ #endif
+};
+
+_ammo call FUNC(getSpallInfo) params ["_caliber", "_explosive", "_indirectHit"];
+private _velocityChange = velocity _projectile vectorDiff _newVelocity;
+private _speedChange = vectorMagnitude _velocityChange;
+/*
+ * This is all fudge factor since real spalling is too complex for calculation.
+ * The equation takes taking a quasi scale of energy using caliber and change in speed.
+ */
+private _spallPower = ACE_FRAG_SPALL_CALIBER_COEF * _caliber * sqrt _speedChange * GVAR(spallIntensity);
+TRACE_5("found speed",_velocityChange,_speedChange,_caliber,_spallPower,_material);
+
+if (_spallPower < ACE_FRAG_SPALL_POWER_MIN) exitWith {
+ TRACE_1("lowImpulse",_ammo);
+};
+private _spallDirection = vectorNormalized _velocityChange;
+
+#ifdef DEBUG_MODE_DRAW
+if GVAR(dbgSphere) then {
+ [_spallPosASL, "green"] call FUNC(dev_sphereDraw);
+};
+#endif
+
+private _spawnSize = switch (true) do {
+ case (_spallPower < ACE_FRAG_SPALL_POWER_TINY_MAX): {"_spall_tiny"};
+ case (_spallPower < ACE_FRAG_SPALL_POWER_SMALL_MAX): {"_spall_small"};
+ case (_spallPower < ACE_FRAG_SPALL_POWER_MEDIUM_MAX): {"_spall_medium"};
+ case (_spallPower < ACE_FRAG_SPALL_POWER_LARGE_MAX): {"_spall_large"};
+ default {"_spall_huge"};
+};
+GVAR(nextSpallAllowTime) = CBA_missionTime + ACE_FRAG_SPALL_HOLDOFF;
+
+// Solve for one of the vectors normal to _spallDirection on y = 0 plane
+private _spallVectorUp = [0, 0, 1];
+if (_spallDirection#2 > EPSILON) then {
+ private _newZ = _spallDirection#0 / _spallDirection#2;
+ _spallVectorUp = vectorNormalized [1, 0, -_newZ];
+};
+
+private _spallSpawner = createVehicleLocal [
+ QUOTE(GLUE(ADDON,_)) + _material + _spawnSize,
+ ASLToAGL _spallPosASL,
+ [],
+ 0,
+ "CAN_COLLIDE"
+];
+_spallSpawner setVectorDirAndUp [_spallDirection, _spallVectorUp];
+_spallSpawner setVelocityModelSpace [0, _speedChange * ACE_FRAG_SPALL_VELOCITY_INHERIT_COEFF, 0];
+TRACE_4("dir&up",_spallDirection,vectorDir _spallSpawner,_spallVectorUp,vectorUp _spallSpawner);
+
+TRACE_3("createSpallSpawner",speed _spallSpawner,_material + _spawnSize,_spallPower);
+#ifdef DEBUG_MODE_DRAW
+_spallSpawner addEventHandler [
+ "SubmunitionCreated",
+ {
+ params ["", "_subProj"];
+ [_subProj, "purple", true] call FUNC(dev_trackObj);
+ }
+];
+#endif
diff --git a/addons/frag/functions/fnc_findReflections.sqf b/addons/frag/functions/fnc_findReflections.sqf
index a753934fe85..00a26022e2b 100644
--- a/addons/frag/functions/fnc_findReflections.sqf
+++ b/addons/frag/functions/fnc_findReflections.sqf
@@ -75,7 +75,7 @@ if (_zIndex < 5) then {
} forEach _nlos;
{
if !(_forEachIndex in _excludes) then {
- _testPos = _x;
+ private _testPos = _x;
if (_testPos vectorDistanceSqr _bucketPos <= 30) then {
_bucketList pushBack _x;
_excludes pushBack _forEachIndex;
diff --git a/addons/frag/functions/fnc_fired.sqf b/addons/frag/functions/fnc_fired.sqf
index 03d2fab6096..1cc72af2af6 100644
--- a/addons/frag/functions/fnc_fired.sqf
+++ b/addons/frag/functions/fnc_fired.sqf
@@ -1,14 +1,14 @@
#include "..\script_component.hpp"
/*
- * Author: nou, jaynus, PabstMirror
- * Called from the unified fired EH for all.
- * If spall is not enabled (default), then cache and only track those that will actually trigger fragmentation.
+ * Author: nou, jaynus, Lambda.Tiger, PabstMirror
+ * Add "Exploded" eventhandler to a projectile if it will produce fragments
+ * and a "HitPart" eventhandler if it will produce spall.
*
* Arguments:
- * None. Parameters inherited from EFUNC(common,firedEH)
+ * Parameters inherited from EFUNC(common,firedEH)
*
* Return Value:
- * None
+ * Nothing Useful
*
* Example:
* [clientFiredBIS-XEH] call ace_frag_fnc_fired
@@ -19,40 +19,33 @@
//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);
-private _shouldAdd = GVAR(cacheRoundsTypesToTrack) get _ammo;
-if (isNil "_shouldAdd") then {
- TRACE_1("no cache for round",_ammo);
-
- //Read configs and test if it would actually cause a frag, using same logic as FUNC(pfhRound)
- private _skip = getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(skip));
- private _explosive = getNumber (configFile >> "CfgAmmo" >> _ammo >> "explosive");
- private _indirectRange = getNumber (configFile >> "CfgAmmo" >> _ammo >> "indirectHitRange");
- private _force = getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(force));
- private _fragPower = getNumber (configFile >> "CfgAmmo" >> _ammo >> "indirecthit") * (sqrt (getNumber (configFile >> "CfgAmmo" >> _ammo >> "indirectHitRange")));
-
- _shouldAdd = (_skip == 0) && {(_force == 1) || {_explosive > 0.5 && {_indirectRange >= 4.5} && {_fragPower >= 35}}};
+if (_ammo isEqualTo "" || {isNull _projectile} ||
+ !(if (isNil "_gunner") then {local _unit} else {local _gunner}) ||
+ {_projectile getVariable [QGVAR(blacklisted), false]}) exitWith {
+ TRACE_2("bad ammo or projectile, or blackList",_ammo,_projectile);
+};
- if (GVAR(spallEnabled) && {!_shouldAdd}) then {
- private _caliber = getNumber (configFile >> "CfgAmmo" >> _ammo >> "caliber");
- if !(_caliber >= 2.5 || {(_explosive > 0 && {_indirectRange >= 1})}) exitWith {}; // from check in doSpall: line 34
- TRACE_1("Won't frag, but will spall",_caliber);
- _shouldAdd = true;
- };
+#ifdef DEBUG_MODE_DRAW
+if (GVAR(debugOptions) && {_ammo call FUNC(shouldFrag) || {_ammo call FUNC(shouldSpall)}}) then {
+ [_projectile, "red", true] call FUNC(dev_trackObj);
+};
+#endif
- TRACE_6("Setting Cache",_skip,_explosive,_indirectRange,_force,_fragPower,_shouldAdd);
- GVAR(cacheRoundsTypesToTrack) set [_ammo, _shouldAdd];
+if (!GVAR(spallEnabled) || {!(_ammo call FUNC(shouldSpall))}) exitWith {
+ TRACE_2("No spall",GVAR(spallEnabled),_ammo call FUNC(shouldSpall));
};
-if (_shouldAdd) then {
- // firedMan will have nil "_gunner", so just check _unit; for firedVehicle we want to check _gunner
- private _localShooter = if (isNil "_gunner") then {local _unit} else {local _gunner};
- TRACE_4("",_localShooter,_unit,_ammo,_projectile);
- if (!_localShooter) exitWith {};
- if (_weapon == "Put") exitWith {}; // Ignore explosives placed without ace_explosives
+private _hitPartEventHandler = _projectile addEventHandler ["HitPart", {
+ params ["_projectile", "_objectHit", "", "_posASL", "_velocity", "_surfNorm", "", "" ,"_surfType"];
+ private _ammo = typeOf _projectile;
+ private _vectorUp = vectorUp _projectile;
- // Skip if less than 0.5 second from last shot
- if ((CBA_missionTime - (_unit getVariable [QGVAR(lastTrack), -1])) < 0.5) exitWith {};
- _unit setVariable [QGVAR(lastTrack), CBA_missionTime];
+ /*
+ * Wait a frame to see what happens to the round
+ */
+ [LINKFUNC(doSpallHitPart), [_projectile, _objectHit, _posASL, _velocity, _surfNorm, _surfType, _ammo, _vectorUp]] call CBA_fnc_execNextFrame;
+}];
+private _penetratedEventHandler = _projectile addEventHandler ["Penetrated",LINKFUNC(doSpallPenetrate)];
+_projectile setVariable [QGVAR(hitPartEventHandler), [_hitPartEventHandler, _penetratedEventHandler]];
- [_unit, _ammo, _projectile] call FUNC(addPfhRound);
-};
+TRACE_1("firedExit",_ammo);
diff --git a/addons/frag/functions/fnc_frago.sqf b/addons/frag/functions/fnc_frago.sqf
index 8fd77dbc739..bda1aa58f6d 100644
--- a/addons/frag/functions/fnc_frago.sqf
+++ b/addons/frag/functions/fnc_frago.sqf
@@ -1,15 +1,15 @@
#include "..\script_component.hpp"
/*
- * Author: Jaynus, NouberNou
+ * Author: Jaynus, NouberNou, Lambda.Tiger
* Server func to create the fragmentation for a round.
*
* Arguments:
- * 0: Last Position (ASL)
- * 1: Velocity
- * 2: Ammo Classname
+ * 0: ASL position projetile is fragmenting at
+ * 1: Projectile ammo classname
+ * 2: Projectile shot parents
*
* Return Value:
- * None
+ * The number of fragments created
*
* Example:
* [[], [], "handGrenade"] call ace_frag_fnc_frago
@@ -17,139 +17,109 @@
* Public: No
*/
-#define FRAG_VEC_VAR 0.004
-#define MAX_FRAG_COUNT 50
+#define FRAG_VEC_VAR 0.008
BEGIN_COUNTER(frago);
-params ["_lastPos", "_lastVel", "_shellType"];
-TRACE_3("frago",_lastPos,_lastVel,_shellType);
+params ["_fragPosASL", "_shellType", "_shotParents"];
+TRACE_3("frago",_fragPosASL,_shellType,_shotParents);
// Limit max frag count if there was a recent frag
-private _maxFrags = round (MAX_FRAG_COUNT * linearConversion [0.1, 1.5, (CBA_missionTime - GVAR(lastFragTime)), 0.1, 1, true]);
+private _maxFrags = round linearConversion [
+ ACE_FRAG_COUNT_MIN_TIME,
+ ACE_FRAG_COUNT_MAX_TIME,
+ (CBA_missionTime - GVAR(lastFragTime)),
+ ACE_FRAG_COUNT_MIN,
+ ACE_FRAG_COUNT_MAX,
+ true
+];
TRACE_2("",_maxFrags,CBA_missionTime - GVAR(lastFragTime));
GVAR(lastFragTime) = CBA_missionTime;
-private _fragTypes = [
- QGVAR(tiny), QGVAR(tiny), QGVAR(tiny),
- QGVAR(tiny_HD), QGVAR(tiny_HD), QGVAR(tiny_HD),
- QGVAR(small), QGVAR(small), QGVAR(small), QGVAR(small),
- QGVAR(small_HD), QGVAR(small_HD), QGVAR(small_HD), QGVAR(small_HD),
- QGVAR(medium_HD), QGVAR(medium_HD), QGVAR(medium_HD), QGVAR(medium_HD), QGVAR(medium_HD)
-];
-
-private _warn = false;
-if (isArray (configFile >> "CfgAmmo" >> _shellType >> QGVAR(CLASSES))) then {
- _fragTypes = getArray (configFile >> "CfgAmmo" >> _shellType >> QGVAR(CLASSES));
-} else {
- _warn = true;
-};
+_shellType call FUNC(getFragInfo) params ["_fragRange", "_fragVelocity", "_fragTypes", "_metalMassModifier"];
-private _indirectHitRange = getNumber(configFile >> "CfgAmmo" >> _shellType >> "indirecthitrange");
-private _fragRange = 20 * _indirectHitRange * 4;
-// _c = 185; // grams of comp-b
-// _m = 210; // grams of fragmentating metal
-// _k = 3/5; // spherical K factor
-// _gC = 2843; // Gurney constant of comp-b in /ms
-
-// _c = 429; // grams of tritonal
-// _m = 496; // grams of fragmentating metal
-// _k = 1/2; // spherical K factor
-// _gC = 2320; // Gurney constant of tritonal in /ms
-
-private _c = getNumber (configFile >> "CfgAmmo" >> _shellType >> QGVAR(CHARGE));
-if (_c == 0) then {_c = 1; _warn = true;};
-private _m = getNumber (configFile >> "CfgAmmo" >> _shellType >> QGVAR(METAL));
-if (_m == 0) then {_m = 2; _warn = true;};
-private _k = getNumber (configFile >> "CfgAmmo" >> _shellType >> QGVAR(GURNEY_K));
-if (_k == 0) then {_k = 0.5; _warn = true;};
-private _gC = getNumber (configFile >> "CfgAmmo" >> _shellType >> QGVAR(GURNEY_C));
-if (_gC == 0) then {_gC = 2440; _warn = true;};
-
-if (_warn) then {
- INFO_1("Ammo class %1 lacks proper explosive properties definitions for frag!",_shellType);
+private _fragPosAGL = ASLToAGL _fragPosASL;
+TRACE_5("fragValues",_fragPosASL,_fragPosAGL,_fragRange,_fragVelocity,_metalMassModifier);
+// Post 2.18 change - uncomment line 43, modify lines 45, and remove lines 44, 51-57, 64-66
+// private _targets = [ASLToAGL _fragPosAGL, _fragRange, _fragRange, 0, false, _fragRange] nearEntities [["Car", "Motorcycle", "Tank", "StaticWeapon", "CAManBase", "Air", "Ship"], false, true, true];
+private _objects = _fragPosAGL nearEntities [["Car", "Motorcycle", "Tank", "StaticWeapon", "CAManBase", "Air", "Ship"], _fragRange];
+if (_objects isEqualTo []) exitWith {
+ TRACE_2("No nearby targets",_fragPosAGL,_fragRange);
+ 0
};
-// Gunery equation is for a non-fragmenting metal, imperical value of 80% represents fragmentation
-private _fragPower = 0.8 * (((_m / _c) + _k) ^ - (1 / 2)) * _gC;
-
-private _atlPos = ASLtoATL _lastPos;
-
-private _fragPowerRandom = _fragPower * 0.5;
-if ((_atlPos select 2) < 0.5) then {
- _lastPos vectorAdd [0, 0, 0.5];
-};
-
-private _objects = _atlPos nearEntities [["Car", "Motorcycle", "Tank", "StaticWeapon", "CAManBase", "Air", "Ship"], _fragRange];
-// Add unique crews in faster way
+// grab crews and add them in so that targets stay approx. sorted by distance
+TRACE_1("",_objects);
+private _targets = [];
{
- {
- _objects pushBackUnique _x;
- } forEach (crew _x);
+ private _crew = crew _x;
+ _crew pushBackUnique _x;
+ _targets append _crew;
} forEach _objects;
-TRACE_2("",_fragRange,count _objects);
+TRACE_2("",_fragRange,count _targets);
private _fragCount = 0;
private _fragArcs = [];
_fragArcs set [360, 0];
-private _doRandom = true;
-if (_objects isNotEqualTo []) then {
+if (_targets isNotEqualTo []) then {
if (GVAR(reflectionsEnabled)) then {
- [_lastPos, _shellType] call FUNC(doReflections);
+ [_fragPosASL, _shellType] call FUNC(doReflections);
};
{
private _target = _x;
- if (alive _target) then {
+ if (alive _target && {getNumber ((configOf _target) >> "isPlayableLogic") == 0}) then {
(boundingBox _target) params ["_boundingBoxA", "_boundingBoxB"];
private _cubic = ((abs (_boundingBoxA select 0)) + (_boundingBoxB select 0)) * ((abs (_boundingBoxA select 1)) + (_boundingBoxB select 1)) * ((abs (_boundingBoxA select 2)) + (_boundingBoxB select 2));
if (_cubic <= 1) exitWith {};
- // _doRandom = true;
private _targetVel = velocity _target;
private _targetPos = getPosASL _target;
- private _distance = _targetPos vectorDistance _lastPos;
- private _add = ((_boundingBoxB select 2) / 2) + ((((_distance - (_fragpower / 8)) max 0) / _fragPower) * 10);
+ private _distance = _target distance _fragPosAGL;
+ private _add = ((_boundingBoxB select 2) / 2) + ((((_distance - (_fragVelocity / 8)) max 0) / _fragVelocity) * 10);
_targetPos = _targetPos vectorAdd [
- (_targetVel select 0) * (_distance / _fragPower),
- (_targetVel select 1) * (_distance / _fragPower),
- _add
+ (_targetVel select 0) * (_distance / _fragVelocity),
+ (_targetVel select 1) * (_distance / _fragVelocity),
+ _add
];
- private _baseVec = _lastPos vectorFromTo _targetPos;
+ private _baseVec = _fragPosASL vectorFromTo _targetPos;
private _dir = floor (_baseVec call CBA_fnc_vectDir);
private _currentCount = RETDEF(_fragArcs select _dir,0);
if (_currentCount < 10) then {
- private _count = ceil (random (sqrt (_m / 1000)));
+ private _count = ceil (random _metalMassModifier);
private _vecVar = FRAG_VEC_VAR;
- if !(_target isKindOf "Man") then {
+ if !(_target isKindOf "CAManBase") then {
ADD(_vecVar,(sqrt _cubic) / 2000);
if ((crew _target) isEqualTo [] && {_count > 0}) then {
_count = 0 max (_count / 2);
};
};
+ private _vecVarHalf = _vecVar / 2;
for "_i" from 1 to _count do {
- private _vec = _baseVec vectorDiff [
- (_vecVar / 2) + (random _vecVar),
- (_vecVar / 2) + (random _vecVar),
- (_vecVar / 2) + (random _vecVar)
+ private _vectorDir = _baseVec vectorDiff [
+ _vecVarHalf - (random _vecVar),
+ _vecVarHalf - (random _vecVar),
+ _vecVarHalf - (random _vecVar)
];
- private _fp = _fragPower - (random (_fragPowerRandom));
- private _vel = _vec vectorMultiply _fp;
-
- private _fragObj = (selectRandom _fragTypes) createVehicleLocal [0,0,10000];
- // TRACE_4("targeted",_fp,typeOf _fragObj,_lastPos vectorDistance _targetPos,typeOf _x);
- _fragObj setPosASL _lastPos;
- _fragObj setVectorDir _vec;
- _fragObj setVelocity _vel;
- #ifdef DRAW_FRAG_INFO
- [ACE_player, _fragObj, [1,0,0,1]] call FUNC(dev_addTrack);
+ private _fragObjSpeed = _fragVelocity * (1 - random 0.5);
+ private _fragObjVelocity = _vectorDir vectorMultiply _fragObjSpeed;
+
+ private _fragObj = createVehicleLocal [selectRandom _fragTypes, _fragPosAGL, [], 0, "CAN_COLLIDE"];
+ _fragObj setVectorDir _vectorDir;
+ _fragObj setVelocity _fragObjVelocity;
+ _fragObj setShotParents _shotParents;
+ #ifdef DEBUG_MODE_DRAW
+ [_fragObj, "green", true] call FUNC(dev_trackObj);
+ if (GVAR(dbgSphere)) then {
+ [_targetPos, "(0.88,0.36,0.92,0.8)"] call FUNC(dev_sphereDraw);
+ };
#endif
INC(_fragCount);
INC(_currentCount);
@@ -158,34 +128,31 @@ if (_objects isNotEqualTo []) then {
};
};
if (_fragCount > _maxFrags) exitWith {};
- } forEach _objects;
+ } forEach _targets;
TRACE_1("targeted",_fragCount);
if (_fragCount > _maxFrags) exitWith {};
private _randomCount = ceil ((_maxFrags - _fragCount) * 0.35);
TRACE_1("",_randomCount);
private _sectorSize = 360 / (_randomCount max 1);
- if (_doRandom) then {
- for "_i" from 1 to _randomCount do {
- // Distribute evenly
- private _sectorOffset = 360 * (_i - 1) / (_randomCount max 1);
- private _randomDir = random (_sectorSize);
- _vec = [cos (_sectorOffset + _randomDir), sin (_sectorOffset + _randomDir), sin (30 - (random 45))];
-
- _fp = (_fragPower - (random (_fragPowerRandom)));
+ for "_i" from 1 to _randomCount do {
+ // Distribute evenly
+ private _sectorOffset = 360 * (_i - 1) / (_randomCount max 1);
+ private _randomDir = random (_sectorSize);
+ private _vectorDir = [cos (_sectorOffset + _randomDir), sin (_sectorOffset + _randomDir), sin (30 - (random 45))];
- _vel = _vec vectorMultiply _fp;
+ private _fragObjSpeed = _fragVelocity * (1 - random 0.5);
+ private _fragObjVelocity = _vectorDir vectorMultiply _fragObjSpeed;
- _fragObj = (selectRandom _fragTypes) createVehicleLocal [0, 0, 10000];
- _fragObj setPosASL _lastPos;
- _fragObj setVectorDir _vec;
- _fragObj setVelocity _vel;
+ private _fragObj = createVehicleLocal [selectRandom _fragTypes, _fragPosAGL, [], 0, "CAN_COLLIDE"];
+ _fragObj setVectorDir _vectorDir;
+ _fragObj setVelocity _fragObjVelocity;
+ _fragObj setShotParents _shotParents;
- #ifdef DRAW_FRAG_INFO
- [ACE_player, _fragObj, [1,0.5,0,1]] call FUNC(dev_addTrack);
- #endif
- INC(_fragCount);
- };
+ #ifdef DEBUG_MODE_DRAW
+ [_fragObj, "blue", true] call FUNC(dev_trackObj);
+ #endif
+ INC(_fragCount);
};
};
diff --git a/addons/frag/functions/fnc_getFragInfo.sqf b/addons/frag/functions/fnc_getFragInfo.sqf
new file mode 100644
index 00000000000..77222234235
--- /dev/null
+++ b/addons/frag/functions/fnc_getFragInfo.sqf
@@ -0,0 +1,96 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Jaynus, NouberNou, Lambda.Tiger
+ * This function returns fragmentation parameters for a specific ammo type.
+ *
+ * Arguments:
+ * 0: Ammo classname
+ *
+ * Return Value:
+ * _ammoInfo
+ * 0: Search range for fragments in meters
+ * 1: Gurney equation calculated speed
+ * 2: Array of fragment types
+ * 3: Mass of fragmenting metal modified for frag count
+ *
+ * Example:
+ * "B_556x45_Ball" call ace_frag_fnc_getFragInfo
+ *
+ * Public: No
+ */
+
+params ["_ammo"];
+
+GVAR(fragInfoCache) getOrDefaultCall [_ammo, {
+ private _ammoConfig = configFile >> "CfgAmmo" >> _ammo;
+ private _fragTypes = ACE_FRAG_DEFAULT_FRAG_TYPES;
+ private _notifyMissingEntries = false;
+ if (isArray (_ammoConfig >> QGVAR(classes))) then {
+ _fragTypes = getArray (_ammoConfig >> QGVAR(classes));
+ } else {
+ _notifyMissingEntries = true;
+ };
+
+ /************ Gurney equation notes *****************//*
+ * see https://en.wikipedia.org/wiki/Gurney_equations
+ *
+ * gurney_k is the geometry constant added to _metalMass/_chargeMass
+ * gurney_c = sqrt(2E)
+ *
+ * _chargeMass = 185; - grams of comp-b
+ * _metalMass = 210; - grams of metal are accelerated by explosion
+ * _geometryCoefficient = 3/5; - spherical K factor
+ * _gurneyConstant = 2843; - Gurney constant of comp-b in /ms
+ *
+ * _chargeMass = 429; - grams of tritonal
+ * _metalMass = 496; - grams of metal are accelerated by explosion
+ * _geometryCoefficient = 1/2; - cylindrical K factor
+ * _gurneyConstant = 2320; - Gurney constant of tritonal in m/s
+ * Equation - 0.8 for empirical 80% speed
+ * 0.8 * (((_metalMass / _chargeMass) + _geometryCoefficient) ^ - (1 / 2)) * _gurneyConstant;
+ * or 0.8 * _gurneyConstant * sqrt (_chargeMass /(_metalMass + _chargeMass * _geometryCoefficient)); (slightly faster to compute)
+ */
+
+ private _chargeMass = getNumber (_ammoConfig >> QGVAR(charge));
+ if (_chargeMass == 0) then {
+ _chargeMass = 1;
+ _notifyMissingEntries = true;
+ };
+
+ private _metalMass = getNumber (_ammoConfig >> QGVAR(metal));
+ if (_metalMass == 0) then {
+ _metalMass = 2;
+ _notifyMissingEntries = true;
+ };
+
+ private _geometryCoefficient = getNumber (_ammoConfig >> QGVAR(gurney_k));
+ if (_geometryCoefficient == 0) then {
+ _geometryCoefficient = 0.5;
+ _notifyMissingEntries = true;
+ };
+
+ private _gurneyConstant = getNumber (_ammoConfig >> QGVAR(gurney_c));
+ if (_gurneyConstant == 0) then {
+ _gurneyConstant = 2440;
+ _notifyMissingEntries = true;
+ };
+
+ if (_notifyMissingEntries) then {
+ INFO_1("Ammo class %1 lacks proper explosive properties definitions for frag!",_ammo);
+ };
+
+ private _indirectHitRange = getNumber (_ammoConfig >> "indirecthitrange");
+
+ /********************** _ammoInfo format *************************//*
+ * 0: _fragRange - search range for fragments
+ * 1: _fragVelocity - gurney equation calculated velocity
+ * 2: _fragTypes - array of fragment types
+ * 3: _metalMassModified - mass of fragmenting metal modified for frag count
+ */
+ [
+ 80 * _indirectHitRange,
+ ACE_FRAG_IMPERIC_VELOCITY_CONSTANT * _gurneyConstant * sqrt (_chargeMass / (_metalMass + _chargeMass * _geometryCoefficient)),
+ _fragTypes,
+ sqrt (_metalMass / 1000)
+ ] // return
+}, true]
diff --git a/addons/frag/functions/fnc_getMaterialInfo.sqf b/addons/frag/functions/fnc_getMaterialInfo.sqf
new file mode 100644
index 00000000000..199953b237b
--- /dev/null
+++ b/addons/frag/functions/fnc_getMaterialInfo.sqf
@@ -0,0 +1,62 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Lambda.Tiger
+ * This function returns a classification of material type based on the surface hit.
+ *
+ * Arguments:
+ * 0: Surface type given as either a CfgSurfaces path or .bisurf filepath, same format as "HitPart" projectile parameter
+ *
+ * Return Value:
+ * Material categories as expanded on in line 44 below
+ *
+ * Example:
+ * "a3\data_f\penetration\concrete.bisurf" call ace_frag_fnc_getMaterialInfo
+ *
+ * Public: No
+ */
+
+#define ACE_FRAG_SOUNDENVIRON_STR_LEN 12
+#define ACE_FRAG_SOUNDHIT_STR_LEN 8
+#define ACE_FRAG_MATERIAL_SEARCH_LEN 10
+
+params ["_surfType"];
+
+private _material = GVAR(spallMaterialCache) get _surfType;
+
+TRACE_2("materialCache",_surfType,_material);
+if (!isNil "_material") exitWith {_material};
+// Use 'soundEnviron' or 'soundHit' to extract approx material
+private _surfaceConfig = configFile >> "CfgSurfaces" >> _surfType;
+if (isClass _surfaceConfig) then {
+ _material = getText (_surfaceConfig >> "soundEnviron");
+ if (_material == "" || {_material == "empty"}) then {
+ _material = getText (_surfaceConfig >> "soundhit");
+ };
+} else { // Messy way when a surface isn't added to CfgSurfaces
+ private _surfFileText = toLowerANSI preprocessFile _surfType;
+ _surfFileText = _surfFileText regexReplace ["[^a-z0-9]", ""];
+ private _idx = ACE_FRAG_SOUNDENVIRON_STR_LEN + (_surfFileText find "soundenviron");
+ if (_surfFileText select [_idx, 5] isEqualTo "empty") then {
+ _idx = ACE_FRAG_SOUNDHIT_STR_LEN + (_surfFileText find "soundhit");
+ };
+ _material = _surfFileText select [_idx, ACE_FRAG_MATERIAL_SEARCH_LEN];
+};
+TRACE_1("materialSubString",_material);
+
+_material = switch (true) do {
+ case ("dirt" in _material);
+ case ("grass" in _material): { "ground" };
+ case ("gravel" in _material);
+ case ("rock" in _material): { "rock" };
+ case ("wood" in _material): { "wood" };
+ case ("lino" in _material);
+ case ("building" in _material);
+ case ("concrete" in _material): { "concrete" };
+ case ("metal" in _material): { "metal" };
+ default { "ground" };
+};
+
+GVAR(spallMaterialCache) set [_surfType, _material];
+TRACE_2("materialCacheSet",_surfType,_material);
+
+_material
diff --git a/addons/frag/functions/fnc_getSpallInfo.sqf b/addons/frag/functions/fnc_getSpallInfo.sqf
new file mode 100644
index 00000000000..7bb566064ba
--- /dev/null
+++ b/addons/frag/functions/fnc_getSpallInfo.sqf
@@ -0,0 +1,30 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Lambda.Tiger
+ * This function returns spalling parameters for a specific ammo type.
+ *
+ * Arguments:
+ * 0: Ammo classname
+ *
+ * Return Value:
+ * _ammoInfo
+ * 0: Caliber config value
+ * 1: What part of the hit damage is from ballistic vs explosive energy (1 for all explosive)
+ * 2: Indirect hit damage
+ *
+ * Example:
+ * "B_556x45_Ball" call ace_frag_fnc_getSpallInfo
+ *
+ * Public: No
+ */
+
+params ["_ammo"];
+
+GVAR(spallInfoCache) getOrDefaultCall [_ammo, {
+ private _ammoConfig = configFile >> "CfgAmmo" >> _ammo;
+ private _caliber = getNumber (_ammoConfig >> "caliber");
+ private _explosive = getNumber (_ammoConfig >> "explosive");
+ private _indirectHit = getNumber (_ammoConfig >> "indirectHitRange");
+
+ [_caliber, _explosive, _indirectHit] // return
+}, true]
diff --git a/addons/frag/functions/fnc_initMaterialCache.sqf b/addons/frag/functions/fnc_initMaterialCache.sqf
new file mode 100644
index 00000000000..820133cae0a
--- /dev/null
+++ b/addons/frag/functions/fnc_initMaterialCache.sqf
@@ -0,0 +1,96 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Lambda.Tiger
+ * For performance, we load a bunch of vanilla materials preemptively into the spall material cache.
+ *
+ * Arguments:
+ * None
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * call ace_frag_fnc_initMaterialCache
+ *
+ * Public: No
+ */
+
+uiNamespace setVariable [QGVAR(spallMaterialCache), createHashMapFromArray [
+ ["a3\data_f\penetration\armour.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate_100mm.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate_12mm.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate_16mm.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate_1mm.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate_20mm.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate_23mm.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate_250mm.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate_30mm.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate_3mm.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate_40mm.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate_5mm.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate_60mm.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate_7mm.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate_80mm.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate_heavy.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate_medium.bisurf","metal"],
+ ["a3\data_f\penetration\armour_plate_thin.bisurf","metal"],
+ ["a3\data_f\penetration\bell.bisurf","ground"],
+ ["a3\data_f\penetration\body.bisurf","ground"],
+ ["a3\data_f\penetration\building.bisurf","concrete"],
+ ["a3\data_f\penetration\building_dust_particle.bisurf","concrete"],
+ ["a3\data_f\penetration\building_dust_soft.bisurf","concrete"],
+ ["a3\data_f\penetration\building_plate.bisurf","concrete"],
+ ["a3\data_f\penetration\building_wood_particle.bisurf","wood"],
+ ["a3\data_f\penetration\cactus.bisurf","ground"],
+ ["a3\data_f\penetration\cloth.bisurf","ground"],
+ ["a3\data_f\penetration\cloth_plate.bisurf","ground"],
+ ["a3\data_f\penetration\concrete.bisurf","concrete"],
+ ["a3\data_f\penetration\concrete_plate.bisurf","concrete"],
+ ["a3\data_f\penetration\default.bisurf","ground"],
+ ["a3\data_f\penetration\engine.bisurf","metal"],
+ ["a3\data_f\penetration\foliage.bisurf","ground"],
+ ["a3\data_f\penetration\foliage_dead.bisurf","ground"],
+ ["a3\data_f\penetration\foliage_dead_plate.bisurf","ground"],
+ ["a3\data_f\penetration\foliage_green.bisurf","ground"],
+ ["a3\data_f\penetration\foliage_green_big.bisurf","ground"],
+ ["a3\data_f\penetration\foliage_green_big_plate.bisurf","ground"],
+ ["a3\data_f\penetration\foliage_green_plate.bisurf","ground"],
+ ["a3\data_f\penetration\foliage_palm.bisurf","ground"],
+ ["a3\data_f\penetration\foliage_palm_plate.bisurf","ground"],
+ ["a3\data_f\penetration\foliage_pine.bisurf","ground"],
+ ["a3\data_f\penetration\foliage_pine_plate.bisurf","ground"],
+ ["a3\data_f\penetration\foliage_plate.bisurf","ground"],
+ ["a3\data_f\penetration\fueltank.bisurf","metal"],
+ ["a3\data_f\penetration\glass.bisurf","ground"],
+ ["a3\data_f\penetration\glass_armored.bisurf","ground"],
+ ["a3\data_f\penetration\glass_armored_plate.bisurf","ground"],
+ ["a3\data_f\penetration\glass_plate.bisurf","ground"],
+ ["a3\data_f\penetration\granite.bisurf","ground"],
+ ["a3\data_f\penetration\granite_plate.bisurf","ground"],
+ ["a3\data_f\penetration\hard_ground.bisurf","ground"],
+ ["a3\data_f\penetration\hay.bisurf","ground"],
+ ["a3\data_f\penetration\iron_cast.bisurf","metal"],
+ ["a3\data_f\penetration\iron_cast_plate.bisurf","metal"],
+ ["a3\data_f\penetration\leather.bisurf","ground"],
+ ["a3\data_f\penetration\meat.bisurf","ground"],
+ ["a3\data_f\penetration\meatbones.bisurf","ground"],
+ ["a3\data_f\penetration\medium_ground.bisurf","ground"],
+ ["a3\data_f\penetration\metal.bisurf","metal"],
+ ["a3\data_f\penetration\metal_plate.bisurf","metal"],
+ ["a3\data_f\penetration\metal_plate_thin.bisurf","metal"],
+ ["a3\data_f\penetration\plastic.bisurf","ground"],
+ ["a3\data_f\penetration\plastic_plate.bisurf","ground"],
+ ["a3\data_f\penetration\plexiglass.bisurf","ground"],
+ ["a3\data_f\penetration\plexiglass_plate.bisurf","ground"],
+ ["a3\data_f\penetration\rubber.bisurf","ground"],
+ ["a3\data_f\penetration\soft_ground.bisurf","ground"],
+ ["a3\data_f\penetration\tyre.bisurf","ground"],
+ ["a3\data_f\penetration\tyre_armored.bisurf","ground"],
+ ["a3\data_f\penetration\vehicle_interior.bisurf","metal"],
+ ["a3\data_f\penetration\void.bisurf","ground"],
+ ["a3\data_f\penetration\water.bisurf","ground"],
+ ["a3\data_f\penetration\weapon_plate.bisurf","metal"],
+ ["a3\data_f\penetration\wood.bisurf","wood"],
+ ["a3\data_f\penetration\wood_plate.bisurf","wood"]
+]];
diff --git a/addons/frag/functions/fnc_masterPFH.sqf b/addons/frag/functions/fnc_masterPFH.sqf
deleted file mode 100644
index 004af9a9ce5..00000000000
--- a/addons/frag/functions/fnc_masterPFH.sqf
+++ /dev/null
@@ -1,56 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: jaynus
- * Master single PFH abstraction for all rounds being tracked by frag/spall.
- *
- * Arguments:
- * None
- *
- * Return Value:
- * None
- *
- * Example:
- * call ace_frag_fnc_masterPFH
- *
- * Public: No
- */
-
-BEGIN_COUNTER(PFH);
-
-// Fast exit if nothing to do
-if (GVAR(objects) isEqualTo []) exitWith {END_COUNTER(PFH);};
-
-private _gcIndex = [];
-
-private _iter = 0;
-private _objectCount = count GVAR(objects);
-while {_objectCount > 0 && {_iter < (GVAR(maxTrackPerFrame) min _objectCount)}} do {
-
- if (GVAR(lastIterationIndex) >= _objectCount) then {
- GVAR(lastIterationIndex) = 0;
- };
- private _object = GVAR(objects) select GVAR(lastIterationIndex);
-
- if (!isNil "_object") then {
- private _args = GVAR(arguments) select GVAR(lastIterationIndex);
-
- if !(_args call FUNC(pfhRound)) then {
- _gcIndex pushBack GVAR(lastIterationIndex); // Add it to the GC if it returns false
- };
- };
- INC(_iter);
- INC(GVAR(lastIterationIndex));
-};
-
-// Clean up dead object references
-private _deletionCount = 0;
-{
- TRACE_1("GC Projectile",_x);
- private _deleteIndex = _x - _deletionCount;
- GVAR(objects) deleteAt _deleteIndex;
- GVAR(arguments) deleteAt _deleteIndex;
-
- INC(_deletionCount);
-} forEach _gcIndex;
-
-END_COUNTER(PFH);
diff --git a/addons/frag/functions/fnc_pfhRound.sqf b/addons/frag/functions/fnc_pfhRound.sqf
deleted file mode 100644
index 0c261dcffba..00000000000
--- a/addons/frag/functions/fnc_pfhRound.sqf
+++ /dev/null
@@ -1,59 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: ACE-Team
- *
- *
- * Arguments:
- * None
- *
- * Return Value:
- * None
- *
- * Example:
- * call ace_frag_fnc_pfhRound
- *
- * Public: No
- */
-
-params ["_round", "_lastPos", "_lastVel", "_shellType", "_firedFrame", "_firedPos", "_doSpall", "_spallTrack", "_foundObjectHPIds", "_skip", "_explosive", "_indirectRange", "_force", "_fragPower"];
-
-if (_round in GVAR(blackList)) exitWith {
- false
-};
-
-if (!alive _round) exitWith {
- if ((diag_frameno - _firedFrame) > 1) then { //skip if deleted within a single frame
- 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 ((surfaceIsWater _lastPos) && {(toLowerANSI 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;
- };
- };
- };
- if (_doSpall) then {
- DEC(GVAR(spallIsTrackingCount));
- TRACE_1("doSpall",_foundObjectHPIds);
- {
- if (!isNil "_x") then {
- _x removeEventHandler ["HitPart", _foundObjectHPIds select _forEachIndex];
- };
- } forEach _spallTrack;
- };
- false
-};
-
-_this set [1, getPosASL _round];
-_this set [2, velocity _round];
-
-if (_doSpall) then {
- private _scale = ((count GVAR(objects)) / GVAR(maxTrackPerFrame)) max 0.1;
- [_round, _scale, _spallTrack, _foundObjectHPIds] call FUNC(spallTrack);
-};
-
-true
diff --git a/addons/frag/functions/fnc_setClassBlacklisted.sqf b/addons/frag/functions/fnc_setClassBlacklisted.sqf
new file mode 100644
index 00000000000..03a13500258
--- /dev/null
+++ b/addons/frag/functions/fnc_setClassBlacklisted.sqf
@@ -0,0 +1,49 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Lambda.Tiger
+ * Blacklist an ammo class preventing it from producing fragments and/or spall.
+ * This function will not allow you to force a projectile to produce fragments or spall.
+ * Once an ammo class has been blacklisted, it can be removed from the blacklist using this function without restarting the mission.
+ *
+ * Arguments:
+ * 0: Class name of the ammo to be blacklisted
+ * 1: Should a projectile be blacklisted from producing fragments (default: true)
+ * 2: Should a projectile be blacklisted from producing spall (default: true)
+ *
+ * Return Value:
+ * Were the changes properly applied
+ *
+ * Example:
+ * // Stop "ACE_20mm_HE" from producing spall
+ * ["ACE_20mm_HE", false, true] call ace_frag_fnc_setClassBlacklisted;
+ *
+ * Public: Yes
+ */
+params [
+ ["_ammo", "", [""]],
+ ["_blacklistFrag", true, [true]],
+ ["_blacklistSpall", true, [true]]
+];
+TRACE_3("addBlackListClass",_ammo,_blacklistFrag,_blacklistSpall);
+
+if (_ammo isEqualTo "" || {!isClass (configFile >> "CfgAmmo" >> _ammo)}) exitWith {
+ INFO_1("Invalid ammo class [%1]",_ammo);
+ false
+};
+
+if (_blacklistFrag) then {
+ GVAR(shouldFragCache) set [_ammo, false];
+} else {
+ GVAR(shouldFragCache) deleteAt _ammo;
+ _ammo call FUNC(shouldFrag);
+};
+
+
+if (_blacklistSpall) then {
+ GVAR(shouldSpallCache) set [_ammo, false];
+} else {
+ GVAR(shouldSpallCache) deleteAt _ammo;
+ _ammo call FUNC(shouldSpall);
+};
+
+true
diff --git a/addons/frag/functions/fnc_shouldFrag.sqf b/addons/frag/functions/fnc_shouldFrag.sqf
new file mode 100644
index 00000000000..8cc62f3dac0
--- /dev/null
+++ b/addons/frag/functions/fnc_shouldFrag.sqf
@@ -0,0 +1,46 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Lambda.Tiger
+ * This function checks whether an ammunition type should create fragments.
+ *
+ * Arguments:
+ * 0: Ammo classname
+ *
+ * Return Value:
+ * Could the ammo class generate fragments
+ *
+ * Example:
+ * "B_556x45_Ball" call ace_frag_fnc_shouldFrag
+ *
+ * Public: No
+ */
+
+params ["_ammo"];
+
+GVAR(shouldFragCache) getOrDefaultCall [_ammo, {
+ private _shouldFrag = true;
+
+ private _ammoConfig = configFile >> "CfgAmmo" >> _ammo;
+ private _skip = getNumber (_ammoConfig >> QGVAR(skip));
+ if (_skip == 1) then {
+ _shouldFrag = false;
+ TRACE_1("No frag: skip",_skip);
+ };
+
+ private _force = getNumber (_ammoConfig >> QGVAR(force));
+ if (_shouldFrag && _force == 0) then {
+ private _explosive = getNumber (_ammoConfig >> "explosive");
+ if (_explosive < 0.5) exitWith {
+ _shouldFrag = false;
+ TRACE_3("No frag: _explosive",_skip,_force,_explosive);
+ };
+ private _indirectHit = getNumber (_ammoConfig >> "indirectHit");
+ private _indirectRange = getNumber (_ammoConfig >> "indirectHitRange");
+ if (_indirectRange < 4.5 || {_indirectHit * sqrt(_indirectRange) < 35}) then {
+ _shouldFrag = false;
+ TRACE_5("No frag",_ammo,_skip,_explosive,_indirectRange,_indirectHit);
+ };
+ };
+
+ _shouldFrag
+}, true]
diff --git a/addons/frag/functions/fnc_shouldSpall.sqf b/addons/frag/functions/fnc_shouldSpall.sqf
new file mode 100644
index 00000000000..430a4da8229
--- /dev/null
+++ b/addons/frag/functions/fnc_shouldSpall.sqf
@@ -0,0 +1,24 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Lambda.Tiger
+ * This function checks whether an ammunition type should cause spalling.
+ *
+ * Arguments:
+ * 0: Ammo classname
+ *
+ * Return Value:
+ * Whether the round type could spall when hitting an object
+ *
+ * Example:
+ * "B_556x45_Ball" call ace_frag_fnc_shouldSpall
+ *
+ * Public: No
+ */
+
+params ["_ammo"];
+
+GVAR(shouldSpallCache) getOrDefaultCall [_ammo, {
+ (_ammo call FUNC(getSpallInfo)) params ["_caliber", "_explosive", "_indirectHit"];
+
+ _caliber >= 2.5 || (_explosive > 0 && _indirectHit >= 1) // return
+}, true]
diff --git a/addons/frag/functions/fnc_spallHP.sqf b/addons/frag/functions/fnc_spallHP.sqf
deleted file mode 100644
index 367bea76449..00000000000
--- a/addons/frag/functions/fnc_spallHP.sqf
+++ /dev/null
@@ -1,42 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: ACE-Team
- * Handles the HitPart event
- *
- * Arguments:
- * None
- *
- * Return Value:
- * None
- *
- * Example:
- * call ace_frag_fnc_spallHP
- *
- * Public: No
- */
-
-//player sideChat format ["f: %1 c: %2", (_this select 0), (count GVAR(spallHPData))];
-
-params ["_index", "_hitPartData"];
-
-private _initialData = GVAR(spallHPData) param [_index, []];
-if (_initialData isEqualTo []) exitWith {};
-
-private _hpRound = (_hitPartData select 0) select 2;
-private _round = _initialData select 3;
-private _hpDirect = (_hitPartData select 0) select 10;
-
-if (_hpDirect && {_round == _hpRound}) then {
- {
- // diag_log text format ["HPDUMP-------------------------------------"];
- // {
- // _hp = _x;
- // diag_log text format ["%1 --", _forEachIndex];
- // {
- // diag_log text format ["%1: %2", _forEachIndex, _x];
- // } forEach _hp;
- // } forEach (_this select 1);
- [DFUNC(doSpall), [_this, _forEachIndex]] call CBA_fnc_execNextFrame;
- // player sideChat "WEEE";
- } forEach _hitPartData;
-};
diff --git a/addons/frag/functions/fnc_spallTrack.sqf b/addons/frag/functions/fnc_spallTrack.sqf
deleted file mode 100644
index 50ca64b6ec4..00000000000
--- a/addons/frag/functions/fnc_spallTrack.sqf
+++ /dev/null
@@ -1,39 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: ACE-Team
- * Add HitPart EventHandler to objects in the projectile's path
- *
- * Arguments:
- * None
- *
- * Return Value:
- * None
- *
- * Example:
- * call ace_frag_fnc_spallTrack
- *
- * Public: No
- */
-
-params ["_round", "_multiplier", "_foundObjects", "_foundObjectHPIds"];
-
-private _delta = (1 / diag_fps) * _multiplier;
-private _curPos = getPosASL _round;
-private _velocity = velocity _round;
-
-private _velocityStep = _velocity vectorMultiply _delta;
-private _forwardPos = _curPos vectorAdd _velocityStep;
-
-
-private _intersectsWith = lineIntersectsWith [_curPos, _forwardPos];
-
-if (_intersectsWith isEqualTo []) exitWith {};
-{
- // diag_log text format ["Adding HP: %1", _x];
- private _index = count GVAR(spallHPData);
- private _hpId = _x addEventHandler ["HitPart", compile format ["[%1, _this] call " + QFUNC(spallHP), _index]];
- _foundObjects pushBack _x;
- _foundObjectHPIds pushBack _hpId;
- private _data = [_hpId, _x, typeOf _round, _round, _curPos, _velocity, 0, _foundObjects, _foundObjectHPIds];
- GVAR(spallHPData) pushBack _data;
-} forEach (_intersectsWith select {!(_x in _foundObjects)});
diff --git a/addons/frag/initSettings.inc.sqf b/addons/frag/initSettings.inc.sqf
index 421d5d45664..c4730a3dd0c 100644
--- a/addons/frag/initSettings.inc.sqf
+++ b/addons/frag/initSettings.inc.sqf
@@ -8,13 +8,6 @@ private _category = format ["ACE %1", localize LSTRING(Module_DisplayName)];
1
] call CBA_fnc_addSetting;
-[
- QGVAR(spallEnabled), "CHECKBOX",
- [LSTRING(EnableSpall), LSTRING(EnableSpall_Desc)],
- _category,
- false,
- 1
-] call CBA_fnc_addSetting;
[
QGVAR(reflectionsEnabled), "CHECKBOX",
[LSTRING(EnableReflections), LSTRING(EnableReflections_Desc)],
@@ -24,17 +17,20 @@ private _category = format ["ACE %1", localize LSTRING(Module_DisplayName)];
] call CBA_fnc_addSetting;
[
- QGVAR(maxTrack), "SLIDER",
- [LSTRING(MaxTrack), LSTRING(MaxTrack_Desc)],
+ QGVAR(spallEnabled), "CHECKBOX",
+ [LSTRING(EnableSpall), LSTRING(EnableSpall_Desc)],
_category,
- [0, 50, 10, -1],
+ false,
1
] call CBA_fnc_addSetting;
[
- QGVAR(maxTrackPerFrame), "SLIDER",
- [LSTRING(MaxTrackPerFrame), LSTRING(MaxTrackPerFrame_Desc)],
+ QGVAR(spallIntensity), "SLIDER",
+ [LSTRING(SpallIntensity), LSTRING(SpallIntensity_Desc)],
_category,
- [0, 50, 10, -1],
- 1
+ [0.1, 2, 1, 1],
+ 1,
+ {
+ GVAR(shouldSpallCache) = createHashMap;
+ }
] call CBA_fnc_addSetting;
diff --git a/addons/frag/initSettingsDebug.inc.sqf b/addons/frag/initSettingsDebug.inc.sqf
new file mode 100644
index 00000000000..a1528a446cf
--- /dev/null
+++ b/addons/frag/initSettingsDebug.inc.sqf
@@ -0,0 +1,25 @@
+private _category = format ["ACE %1", LLSTRING(Module_DisplayName)];
+
+[
+ QGVAR(debugOptions),
+ "CHECKBOX",
+ [LSTRING(EnableDebugTrace), LSTRING(EnableDebugTrace_Desc)],
+ [_category, LSTRING(Debug)],
+ true
+] call CBA_fnc_addSetting;
+
+[
+ QGVAR(dbgSphere),
+ "CHECKBOX",
+ [LSTRING(HitSphereEnable), LSTRING(HitSphereEnable_Desc)],
+ [_category, LSTRING(Debug)],
+ false
+] call CBA_fnc_addSetting;
+
+[
+ QGVAR(drawHitBox),
+ "CHECKBOX",
+ [LSTRING(DrawHitBox), LSTRING(DrawHitBox_Desc)],
+ [_category, LSTRING(Debug)],
+ true
+] call CBA_fnc_addSetting;
diff --git a/addons/frag/script_component.hpp b/addons/frag/script_component.hpp
index 0215e9f4d74..bc69597a16b 100644
--- a/addons/frag/script_component.hpp
+++ b/addons/frag/script_component.hpp
@@ -2,13 +2,15 @@
#define COMPONENT_BEAUTIFIED Frag
#include "\z\ace\addons\main\script_mod.hpp"
-// #define DRAW_FRAG_INFO
+// #define LOG_FRAG_INFO
// #define DEBUG_MODE_FULL
+// #define DEBUG_MODE_DRAW
// #define DISABLE_COMPILE_CACHE
// #define ENABLE_PERFORMANCE_COUNTERS
#ifdef DEBUG_ENABLED_FRAG
#define DEBUG_MODE_FULL
+ #define DEBUG_MODE_DRAW
#endif
#ifdef DEBUG_SETTINGS_FRAG
@@ -17,4 +19,32 @@
#include "\z\ace\addons\main\script_macros.hpp"
-#define ACE_TRACE_DRAW_INC 1
+#define GLUE(g1,g2) g1##g2
+
+// Mimimum hold-off time between frag events per unit
+#define ACE_FRAG_FRAG_UNIT_HOLDOFF 0.5
+#define ACE_FRAG_SPALL_UNIT_HOLDOFF 0.5
+// Scaling for the min/max # of fragments since last frag event
+#define ACE_FRAG_COUNT_MIN_TIME 0.1
+#define ACE_FRAG_COUNT_MIN 5
+#define ACE_FRAG_COUNT_MAX_TIME 1.5
+#define ACE_FRAG_COUNT_MAX 50
+#define ACE_FRAG_IMPERIC_VELOCITY_CONSTANT 0.8
+#define ACE_FRAG_DEFAULT_FRAG_TYPES [\
+ QGVAR(tiny), QGVAR(tiny), QGVAR(tiny),\
+ QGVAR(tiny_HD), QGVAR(tiny_HD), QGVAR(tiny_HD),\
+ QGVAR(small), QGVAR(small), QGVAR(small), QGVAR(small),\
+ QGVAR(small_HD), QGVAR(small_HD), QGVAR(small_HD), QGVAR(small_HD),\
+ QGVAR(medium_HD), QGVAR(medium_HD), QGVAR(medium_HD), QGVAR(medium_HD), QGVAR(medium_HD)\
+]
+
+// Spall values
+#define ACE_FRAG_SPALL_HOLDOFF 0.2
+#define ACE_FRAG_SPALL_VELOCITY_INHERIT_COEFF 0.8
+// sqrt(2)/50
+#define ACE_FRAG_SPALL_CALIBER_COEF 0.02828427
+#define ACE_FRAG_SPALL_POWER_MIN 2
+#define ACE_FRAG_SPALL_POWER_TINY_MAX 5
+#define ACE_FRAG_SPALL_POWER_SMALL_MAX 8
+#define ACE_FRAG_SPALL_POWER_MEDIUM_MAX 11
+#define ACE_FRAG_SPALL_POWER_LARGE_MAX 15
diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml
index f88877448d8..07ad77e2475 100644
--- a/addons/frag/stringtable.xml
+++ b/addons/frag/stringtable.xml
@@ -13,7 +13,7 @@
Симуляция осколков
Simulazione Frammentazione
破片シミュレーション
- 파편화 시뮬레이션
+ 파열 시뮬레이션
破片模拟
模擬碎片
@@ -28,8 +28,8 @@
Repesz-szimuláció
Симуляция осколков
Simulazione Frammentazione
- 破片シミュレーション
- 파편화 시뮬레이션
+ フラグメンテーション シミュレーション
+ 파열 시뮬레이션
破片模拟
模擬碎片
@@ -44,8 +44,8 @@
Az ACE repesz-szimuláció engedélyezése
Включить симуляцию осколков ACE
Abilita la Simulazione Frammentazione di ACE
- ACE 破片シミュレーションを有効化
- ACE 파편화 시뮬레이션을 적용합니다.
+ ACE フラグメンテーション シミュレーションを有効化
+ ACE 파열 시뮬레이션을 적용합니다.
启用 ACE 破片模拟
啟用ACE模擬碎片
@@ -60,8 +60,8 @@
Pattogzás-szimuláció
Симуляция обломков
Simulazione Spalling
- 剥離シミュレーション
- 탄환파편 시뮬레이션
+ スポーリング シミュレーション
+ 파편 시뮬레이션
模拟剥落
模擬剝落
@@ -76,8 +76,8 @@
Az ACE pattogzás-szimuláció engedélyezése
Включить симуляцию обломков ACE
Abilita la Simulazione Spalling di ACE
- ACE 剥離シミュレーションを有効化
- ACE 탄환파편 시뮬레이션을 적용합니다.
+ ACE スポーリング シミュレーションを有効化
+ ACE 파편 시뮬레이션을 적용합니다.
启用 ACE 模拟剥落
啟用ACE模擬剝落
@@ -90,7 +90,7 @@
Simulation de la réflexion des explosions
Simulação de reflexo de explosão
Cимуляция отражения взрывов ACE
- 爆発反射シミュレーション
+ 爆風反射シミュレーション
폭발 반사 시뮬레이션
模拟爆炸反射
模擬爆炸反射
@@ -105,107 +105,68 @@
Active la simulation de la réflexion des explosions ACE.
Ativa a simulação de reflexo de explosão do ACE
Включить симуляцию отражения взрывов ACE
- ACE 爆発反射シミュレーションを有効化
+ ACE 爆風反射シミュレーションを有効化
ACE 폭발 반사 시뮬레이션을 적용합니다.
启用 ACE 模拟爆炸反射
啟用ACE模擬爆炸反射
Povolit ACE simulaci odrazu exploze
-
- Maximum Projectiles Tracked
- Máximos proyectiles rastreados
- Maks. liczba śledzonych pocisków
- Maximalzahl der verfolgten Projektile
- Maximální počet sledovaných projektilů
- Máximo de projéteis rastreados
- Nombre maximum de projectiles suivis
- Maximum követett repeszek
- Макс. количество отслеживаемых снарядов
- Numero massimo di Proiettili Tracciati
- 飛翔体最大追跡数
- 최대 발사체 추적수
- 最大破片粒子追踪数量
- 最大碎片/剝落粒子追蹤數量
-
-
- This setting controls the maximum amount of projectiles the fragmentation and spalling system will track at any given time. If more projectiles are fired, they will not be tracked. Lower this setting if you do not want FPS drops at high-count projectile scenarios ( >200 rounds in the air at once)
- Este ajuste controla la cantidad máxima de proyectiles del sistema de fragmentación y astillamiento de los que se hará un seguimiento en cualquier momento dado. Si se disparan más proyectiles, no serán rastreados. Baja esta opción si no deseas una bajada de FPS en escenarios con muchos proyectiles (>200 proyectiles en el aire a la vez)
- To ustawienie kontroluje maksymalną ilość pocisków, jakie fragmentacja i odpryski symulują w danym momencie. Jeżeli więcej pocisków będzie wystrzelonych, wtedy nie będą one śledzone. Zmniejsz tą opcję jeżeli nie chcesz odczuwać spadków FPS podczas ciężkiej wymiany ognia (więcej niż 200 pocisków w powietrzu na raz).
- Diese Einstellung steuert die maximale Anzahl an Projektilen, die das Splitter- und Explosionssystem gleichzeitig verfolgen wird. Wenn mehr Projektile abgefeuert werden, werden sie nicht verfolgt werden. Diese Einstellung zu verringern, kann FPS-Einbrüche bei Szenarien mit vielen Projektilen verhindern (>200 Objekte gleichzeitig in der Luft)
- Toto nastavení kontroluje maximální množství projektilů z fragmentace a úlomků, která jsou sledována v dané době. Pokud je vystřeleno více projektilů, tak nebudou sledovány. Snižte toto nastavení pokud si nepřejete propady FPS v situacích, kde je velké množství projektilů ( >200 nábojů najednou ve vzduchu)
- Esta definição controla a quantidade máxima de projéteis que o sistema de fragmentação e estilhaçamento irá acompanhar em qualquer momento. Se mais projéteis são disparados, eles não serão rastreados. Diminua essa configuração se você não quiser que o FPS caia em cenários com alta contagem de projéteis (> 200 projéteis no ar ao mesmo tempo)
- Ce paramètre contrôle le nombre maximum de projectiles et d'éclats résultant de la fragmentation, que le système peut suivre à chaque instant.\nSi plus de projectiles sont générés, ils ne seront pas pris en compte. Baissez ce réglage si vous ne voulez pas de chute de FPS en cas de nombre important de projectiles (>200 éclats en même temps).
- Ez a beállítás szabályozza a repeszeződés és pattogzás által kilőtt objektumok követett számát. Ha több ez a szám, ezek az objektumok nem lesznek követve. Csökkentsd ezt a beállítást, ha nem akarsz lassulásokat magas-törmelékmennyiségű helyzetekben (200+ repesz a levegőben egyszerre)
- Эта настройка контролирует максимальное количество снарядов, которок отслеживает система осколков и обломков в каждый момент времени. /nСнаряды, выстреленные сверх этого числа, отслеживаться не будут. Уменьшите это значение, если вы не хотите падения FPS при большом количестве снарядов в одной перестрелке (> 200 одновременно летящих снарядов)
- Questo parametro controlla il numero massimo di proiettili che la frammentazione e il sistema di spalling tracciano in ogni momento. Se vengono sparati ulteriori proiettili, non verranno tracciati. Abbassa questo parametro se non vuoi cali di FPS in scenari con molti proiettili (>200 proiettili in aria contemporaneamente)
- この設定では、断片化および剥離システムが常に追跡する飛翔体の最大量を制御します。 この値より多くの飛翔体が発射された場合、それらは追跡されません。 弾数が多いシナリオでFPSを低下させたくない場合は、この設定を下げてください。 (一度に200発以上が空中に発射されます)
- 이 설정은 탄환파편 및 파편 시스템으로 인해 생긴 발사체의 수를 결정합니다. 만약 더 많은 발사체가 나올 경우 정해진 수 이외에는 추적하지 않습니다. 이 설정을 낮춤으로써 파편이 많은 시나리오를 실행할때 더욱 원활히 진행할 수 있습니다 (한 번에 200개 이하)
- 设定在指定时间内,系统最大可追踪的破片粒子数量。如有更多的碎片在这之后产生,这些粒子将不会被追踪。如果你想要维持好的帧数,此设定勿调的过高。( >一次200颗粒子)
- 設定在指定時間內,系統最大可追蹤的碎片/剝落粒子數量。如有更多的碎片在這之後產生,這些粒子將不會被追蹤。如果你想要維持好的幀數,此設定勿調的過高。( >一次200顆粒子)
-
-
- Maximum Projectiles Per Frame
- Máximos proyectiles por cuadro
- Maximale Anzahl an Projektilen pro Frame
- Maks. liczba pocisków na klatkę
- Maximální počet projektilů za jeden snímek
- Projéteis máximos por quadro
- Nombre maximal de projectiles par image
- Maximum repesz/képkocka
- Макс. количество снарядов за кадр
- Numero massimo di proiettili per Frame
- フレームごとの飛翔体最大数
- 프레임 당 최대 발사체 수
- 每帧最大破片粒子数量
- 每一幀數(FPS)最大碎片/剝落粒子數量
-
-
- The number of spall track calculations to perform in any given frame. This helps spread the FPS impact of tracking spall rounds across multiple frames, limiting its impact even further.
- Ilość obliczeń wykonywanych przez symulację odprysków w danej klatce. Ta opcja pomaga rozprzestrzenić obliczenia odprysków na więcej klatek, zmniejszając spadek FPS jeszcze bardziej.
- Gibt die Anzahl der Explosionverfolgungsberechnungen an, die gleichzeitig ausgeführt werden. Das kann dabei helfen den FPS-Einfluss abzuschwächen, wenn Teile über mehrere Frames hinweg verfolgt werden.
- El número de cálculos de esquirlas que se hará en cualquier cuadro. Esto ayuda a dispersar el impacto en FPS del seguimiento de esquirlas de balas a través de múltiples cuadros, lo que limita aún más su impacto.
- Počet úlomků v daném snímku. Toto pomáhá rozšířit FPS dopad sledovaného úlomku napříč více snímky, omezuje jeho vliv ještě více.
- O número de cálculos por estilhaço rastreado para executar em qualquer quadro. Isso ajuda a distribuir o impacto no FPS do rastreamento de estilhaço em vários quadros, o que limita o seu impacto ainda mais.
- Le nombre de calculs de suivi à effectuer pour chaque image. Cela aide à répartir l'impact des calculs sur plusieurs images, limitant ainsi encore davantage l'impact sur les FPS.
- A lepattogzási útvonalak számításának darabjai képkockánként. Ez eloszlatja az FPS-megszakadást több képkockára, ezzel csökkentve a súlyosságát.
- Число обрабатываемых осколков за кадр. Это позволяет распределить нагрузку по отслеживанию осколков между несколькими кадрами, чтобы предотвратить падение FPS.
- Il numero di calcoli per tracciamento di spalling ad ogni frame. Questo aiuta a distribuire l'impatto del tracciamento dello spalling su più frame, riducendolo ulteriormente.
- 任意のフレームごとに追跡される剥離飛翔体の数。剥離による飛翔体を追跡することによるFPSへの影響を複数フレームに分散させ抑えることが出来ます。
- 가능한 프레임마다 파편을 추적 및 계산합니다. 여러 프레임에 걸쳐 파편난 발사체를 추적하여 FPS에 도움을 줍니다. 이를 제한함으로써 더욱 큰 효과를 볼 수 있습니다.
- 设定在每一帧数内,系统最大可追踪的破片粒子数量。此设定可有效帮助系统减低计算压力。
- 設定在每一幀數內,系統最大可追蹤的碎片/剝落粒子數量。此設定可有效幫助系統減低計算壓力
+
+ Debug
+ 디버그
+ デバッグ
+ Отладка
+
+
+ Spalling Intensity
+ 파편 강도
+ スポーリング強度
+ Интенсивность обрушения
+
+
+ Modifier to increase or decrease the number and intensity of spalling events. Increasing this value may cause performance degradation.
+ 파편 이벤트 수와 강도를 늘리거나 줄입니다. 이 값을 늘리면 성능이 저하될 수 있습니다.
+ スポーリング現象が発生する数と強度を増減することが出来ます。この値を大きくすることはパフォーマンスの低下につながる可能性があります。
+ Модификатор для увеличения или уменьшения количества и интенсивности событий обрушения. Увеличение этого значения может привести к ухудшению производительности.
- (SP Only) Frag/Spall Debug Tracing
- (Solo SP) Seguimiento de depuración de Fragmentación/Astillamiento
- (Tylko SP) Wizualny debug odł./odpr.
- (Pouze SP) Debug sledování Frag/Úlomků
- (nur SP) Splitter-/Explosions-Debug-Verfolgung
- (Somente SP) Depuração de fragmentação e estilhaços traçantes
- (SP uniquement) Fragmentation/éclat debug
- (Csak SP) Repesz/Pattogzás debug követés
- (Только для одиночной игры) Отслеживаение/отладка осколков
- (Solo SP) Debug Tracciamento Frag/Spall
- (SP のみ) 破片/剥離のデバッグ用表示
- (싱글플레이 전용) 탄환파편/파편 디버그 추적화
- (仅单人)追踪显示破片粒子
- (僅在單人模式) 碎片/剝落除錯追蹤
+ Frag/Spall Debug Tracing
+ Splitter-/Explosions-Debug-Verfolgung
+ フラグとスポールの追跡デバッグ
+ 파열/파편 디버그 추적
+ Отладка трассировки фрагментации/осколков
- (SP Only) Requires a mission/editor restart. Enables visual tracing of fragmentation and spalling rounds in SP game mode only.
- (Solo SP) Requiere un reinicio misión/editor. Permite el seguimiento visual de la fragmentación y astillamientos de los proyectiles en modo SP.
- (Tylko SP) Wymaga restartu misji/edytora. Aktywuje wizualne śledzenie odłamków oraz odprysków w trybie gry Single Player.
- (nur SP) Splitter-/Explosions-Debugging
- (Pouze SP) Vyžaduje restart mise/editoru. Aktivuje vizuální stopování fragmentace a úlomů pouze v režimu jednoho hráče.
- (Somente SP) Requer um reinício de missão / editor. Habilita o rastreamento visual de projéteis de fragmentação e estilhaçamento apenas no modo de jogo SP.
- (SP seulement) Requiert un redémarrage de mission ou de l'éditeur. Active les traceurs visuels de fragmentation et d'éclats en mode solo seulement.
- (Csak SP) Küldetés/Editor újraindítás szükséges. Engedélyezi a repeszek és pattogzó lövedékek vizuális nyomkövetését, csak egyjátékos módok alatt.
- (Только для одиночной игры) Требует перезапуска миссии/редактора. Включает визуальные следы от осколков и обломков в режиме одиночной игры.
- (Solo SP) Richiede un restart editor/missione. Abilita il tracciamento visivo di schegge da frammentazione/spalling in modalità Giocatore Singolo.
- (SP のみ) ミッションとエディタの再起動が必要です。有効化すると、シングルプレイでのみ破片と剥離の飛翔体が見えるようになります。
- (仅单人)激活后,只有在单人模式下才可观察到破片粒子的移动轨迹。
- (僅在單人模式) 讓你在單人模式下可觀察到碎片/剝落粒子的移動軌跡
- (SP 전용) 임무 / 편집자가 다시 시작해야합니다. SP 게임 모드에서만 파편화 및 탄환파편의 시각적 추적을 가능하게 합니다.
+ Enables visual tracing of fragmentation and spalling rounds.
+ Splitter-/Explosions-Debugging
+ 파열과 파편의 시각적 추적을 활성화합니다.
+ フラグメンテーションとスポーリングによって発生した破片飛翔体の動きを視覚的に追跡できる機能を有効化します。
+ Включает визуальную трассировку фрагментации и осколочных снарядов.
+
+
+ Draw Event Spheres
+ 이벤트 구체 그리기
+ イベントを球体として描画
+ Изобразить сферы событий
+
+
+ Draw color coded spheres at any event for tracked rounds.
+ 모든 ㅇ이벤트에서 추적된 파편을 위한 색상으로 구분하는 구체를 그립니다.
+ 追跡中の飛翔体に発生した全てのイベントを色付けた球体として描画します。
+ Изобразить цветные сферы на любом событии для отслеживаемых раундов.
+
+
+ Draw Hitboxes
+ 히트박스 그리기
+ ヒットボックスを描画
+ Изобразить хитбоксы
+
+
+ Draw hitboxes on objects that were targeted.
+ Splitter-/Explosions-Debugging
+ 被弾した物体のヒットボックスを描画します。
+ 타겟팅된 오브젝트에 히트박스를 그립니다.
+ Изобразить хитбоксы на объектах, которые были нацелены.
diff --git a/addons/goggles/define.hpp b/addons/goggles/define.hpp
index 81d3fcb6896..4e641b692c4 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 38fc57f0ce6..a246f1293fc 100644
--- a/addons/goggles/functions/fnc_applyDirtEffect.sqf
+++ b/addons/goggles/functions/fnc_applyDirtEffect.sqf
@@ -33,6 +33,7 @@ if ([_unit] call FUNC(isGogglesVisible)) then {
private _effectBrightness = linearConversion [0,1,([] call EFUNC(common,ambientBrightness)),0.25,1];
(GETUVAR(GVAR(DisplayEffects),displayNull) displayCtrl 10660) ctrlSetTextColor [_effectBrightness, _effectBrightness, _effectBrightness, 1];
+ [QGVAR(effect), [_unit, "dirt"]] call CBA_fnc_localEvent;
TRACE_1("dirt",_effectBrightness);
};
};
diff --git a/addons/goggles/functions/fnc_applyDustEffect.sqf b/addons/goggles/functions/fnc_applyDustEffect.sqf
index 93bcbad1d6b..c00754c4eaa 100644
--- a/addons/goggles/functions/fnc_applyDustEffect.sqf
+++ b/addons/goggles/functions/fnc_applyDustEffect.sqf
@@ -57,7 +57,7 @@ GVAR(DustHandler) = [{
private _amount = 1 - (GETDUSTT(DAMOUNT) * 0.125);
- if !(_unit getVariable ["ACE_EyesDamaged", false]) then {
+ if !(ACE_player getVariable ["ACE_EyesDamaged", false]) then {
GVAR(PostProcessEyes) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0], [_amount, _amount, _amount, _amount], [1, 1, 1, 0]];
GVAR(PostProcessEyes) ppEffectCommit 0.5;
};
@@ -68,6 +68,7 @@ GVAR(DustHandler) = [{
GVAR(PostProcessEyes) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0], [1, 1, 1, 1], [1, 1, 1, 0]];
GVAR(PostProcessEyes) ppEffectCommit 2;
+ [QGVAR(effect), [ACE_player, "dust"]] call CBA_fnc_localEvent;
[{
if (GVAR(DustHandler) == -1) then {
diff --git a/addons/goggles/functions/fnc_applyRainEffect.sqf b/addons/goggles/functions/fnc_applyRainEffect.sqf
index 0058209acd6..bf1d6fd04aa 100644
--- a/addons/goggles/functions/fnc_applyRainEffect.sqf
+++ b/addons/goggles/functions/fnc_applyRainEffect.sqf
@@ -52,6 +52,7 @@ if (GVAR(RainLastLevel) != rain) then {
GVAR(RainDrops) setParticleClass "ACERainEffect";
GVAR(RainDrops) setDropInterval (0.07 * (1.1 - GVAR(RainLastLevel)));
GVAR(RainDrops) attachTo [vehicle _unit, [0,0,0]];
+ [QGVAR(effect), [_unit, "rain"]] call CBA_fnc_localEvent;
};
} else {
if (GVAR(RainLastLevel) > 0.05) then {
diff --git a/addons/goggles/functions/fnc_applyRotorWashEffect.sqf b/addons/goggles/functions/fnc_applyRotorWashEffect.sqf
index 85b7e60934d..b2369d15107 100644
--- a/addons/goggles/functions/fnc_applyRotorWashEffect.sqf
+++ b/addons/goggles/functions/fnc_applyRotorWashEffect.sqf
@@ -64,18 +64,18 @@ if !(_safe) then {
if !([_unit] call FUNC(isGogglesVisible)) exitWith {};
if (GETDUSTT(DAMOUNT) < 2) then {
- if !(GETDUSTT(DACTIVE)) then {
- SETDUST(DACTIVE,true);
-
- call FUNC(applyDustEffect);
- } else {
+ if (GETDUSTT(DACTIVE)) then {
if (_rotorWash select 1 > 0.5) then {
call FUNC(applyDustEffect);
};
+ } else {
+ SETDUST(DACTIVE,true);
+
+ call FUNC(applyDustEffect);
};
};
- _safe = getNumber (ConfigFile >> "CfgGlasses" >> goggles _unit >> "ACE_Protection") == 1;
+ _safe = getNumber (configFile >> "CfgGlasses" >> goggles _unit >> "ACE_Protection") == 1;
};
// quit if protected by goggles or helmet
@@ -101,5 +101,6 @@ if (_rotorWash select 1 > 0) then {
GVAR(PostProcessEyes) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0], [_scale, _scale, _scale, _scale], [1, 1, 1, 0]];
GVAR(PostProcessEyes) ppEffectCommit 0.5;
GVAR(PostProcessEyes) ppEffectEnable true;
+ [QGVAR(effect), [_unit, "rotorWash"]] call CBA_fnc_localEvent;
};
};
diff --git a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf
index 33c4bdffc21..a1be243b4fa 100644
--- a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf
+++ b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf
@@ -20,7 +20,7 @@ TRACE_1("params",_grenadePosASL);
// Affect local AI (players are not local, except for ACE_player)
// @todo: Affect units in static weapons, turned out, etc
-private _affected = ((ASLtoAGL _grenadePosASL) nearEntities ["CAManBase", 20]) - [ACE_player];
+private _affected = ((ASLToAGL _grenadePosASL) nearEntities ["CAManBase", 20]) - [ACE_player];
{
private _unit = _x;
@@ -69,7 +69,7 @@ private _affected = ((ASLtoAGL _grenadePosASL) nearEntities ["CAManBase", 20]) -
if (!hasInterface) exitWith {};
// Create flash to illuminate environment
-private _light = "#lightpoint" createVehicleLocal ASLtoAGL _grenadePosASL;
+private _light = "#lightpoint" createVehicleLocal ASLToAGL _grenadePosASL;
_light setPosASL _grenadePosASL;
_light setLightBrightness 20;
@@ -113,7 +113,7 @@ if (["ace_hearing"] call EFUNC(common,isModLoaded) && {_strength > 0} && {EGVAR(
};
// Add ace_medical pain effect
-if (GETEGVAR(medical,enabled,false) && {_strength > 0.1} && {isDamageAllowed _unit} && {_unit getVariable [QEGVAR(medical,allowDamage), true]}) then {
+if (GETEGVAR(medical,enabled,false) && {_strength > 0.1} && {isDamageAllowed ACE_player} && {ACE_player getVariable [QEGVAR(medical,allowDamage), true]}) then {
[ACE_player, _strength / 2] call EFUNC(medical,adjustPainLevel);
};
@@ -122,7 +122,7 @@ _strength = 1 - (((_eyePos vectorDistance _grenadePosASL) min 25) / 25) ^ 0.4;
_strength = _strength * _losCoefficient;
// Account for people looking away by slightly reducing the effect for visual effects.
-private _eyeDir = ((AGLtoASL positionCameraToWorld [0, 0, 1]) vectorDiff (AGLtoASL positionCameraToWorld [0, 0, 0]));
+private _eyeDir = ((AGLToASL positionCameraToWorld [0, 0, 1]) vectorDiff (AGLToASL positionCameraToWorld [0, 0, 0]));
private _dirToUnitVector = _eyePos vectorFromTo _grenadePosASL;
private _angleDiff = acos (_eyeDir vectorDotProduct _dirToUnitVector);
TRACE_2("",_angleDiff,((1 - (_angleDiff - 45) / (120 - 45)) max 0));
diff --git a/addons/grenades/functions/fnc_incendiary.sqf b/addons/grenades/functions/fnc_incendiary.sqf
index f0caf82ed8e..9d416c5e115 100644
--- a/addons/grenades/functions/fnc_incendiary.sqf
+++ b/addons/grenades/functions/fnc_incendiary.sqf
@@ -202,7 +202,7 @@ if (isServer) then {
{EGVAR(cookoff,ammoCookoffDuration) != 0} &&
{_x getVariable [QEGVAR(cookoff,enableAmmoCookoff), true]}
) then {
- [QEGVAR(cookOff,cookOffBoxServer), _box] call CBA_fnc_serverEvent;
+ [QEGVAR(cookOff,cookOffBoxServer), _x] call CBA_fnc_serverEvent;
} else {
_x setDamage 1;
};
diff --git a/addons/grenades/stringtable.xml b/addons/grenades/stringtable.xml
index b0630e3a437..1a6243464fa 100644
--- a/addons/grenades/stringtable.xml
+++ b/addons/grenades/stringtable.xml
@@ -110,6 +110,7 @@
이 수류탄은 굴릴 수 없습니다. %1(으)로 전환되었습니다.
Granate kann nicht rollen, zu %1 gewechselt
Granata non può rotolare, cambiato a %1
+ Grenade ne peut pas rouler, passé à %1
M84 Stun Grenade
diff --git a/addons/gunbag/functions/fnc_calculateMass.sqf b/addons/gunbag/functions/fnc_calculateMass.sqf
index 6dd6a5a660d..b614d95f587 100644
--- a/addons/gunbag/functions/fnc_calculateMass.sqf
+++ b/addons/gunbag/functions/fnc_calculateMass.sqf
@@ -23,7 +23,7 @@ private _mass = getNumber (configFile >> "CfgWeapons" >> _weapon >> "WeaponSlots
{
_mass = _mass + getNumber (configFile >> "CfgWeapons" >> _x >> "ItemInfo" >> "mass");
-} foreach _items;
+} forEach _items;
{
_mass = _mass + getNumber (configFile >> "CfgMagazines" >> _x >> "mass");
diff --git a/addons/headless/functions/fnc_transferGroups.sqf b/addons/headless/functions/fnc_transferGroups.sqf
index 0efbe263652..920470c335f 100644
--- a/addons/headless/functions/fnc_transferGroups.sqf
+++ b/addons/headless/functions/fnc_transferGroups.sqf
@@ -74,13 +74,9 @@ private _numTransferredHC1 = 0;
private _numTransferredHC2 = 0;
private _numTransferredHC3 = 0;
-private _units = [];
-private _transfer = false;
-private _previousOwner = -1;
-
// Transfer AI groups
{
- _units = units _x;
+ private _units = units _x;
// No transfer if empty group or if group is blacklisted
if (_units isEqualTo [] || {_x getVariable [QXGVAR(blacklist), false]}) then {
@@ -92,6 +88,8 @@ private _previousOwner = -1;
continue;
};
+ private _transfer = true;
+
{
// No transfer if already transferred
if (!_force && {(owner _x) in [_idHC1, _idHC2, _idHC3]}) exitWith {
@@ -126,7 +124,7 @@ private _previousOwner = -1;
};
// Round robin between HCs if load balance enabled, else pass all to one HC
- _previousOwner = groupOwner _x;
+ private _previousOwner = groupOwner _x;
switch (_currentHC) do {
case 1: {
@@ -145,11 +143,13 @@ private _previousOwner = -1;
// Don't transfer if it's already local to HC1
if (_previousOwner == _idHC1) exitWith {};
- [QGVAR(groupTransferPre), [_x, _HC1, _previousOwner, _idHC1], [_previousOwner, _idHC1]] call CBA_fnc_targetEvent; // API
+ [QGVAR(groupTransferPre), [_x, _HC1, _previousOwner, _idHC1], _previousOwner] call CBA_fnc_ownerEvent; // API
+ [QGVAR(groupTransferPre), [_x, _HC1, _previousOwner, _idHC1], _idHC1] call CBA_fnc_ownerEvent; // API
private _transferred = _x setGroupOwner _idHC1;
- [QGVAR(groupTransferPost), [_x, _HC1, _previousOwner, _idHC1, _transferred], [_previousOwner, _idHC1]] call CBA_fnc_targetEvent; // API
+ [QGVAR(groupTransferPost), [_x, _HC1, _previousOwner, _idHC1, _transferred], _previousOwner] call CBA_fnc_ownerEvent; // API
+ [QGVAR(groupTransferPost), [_x, _HC1, _previousOwner, _idHC1, _transferred], _idHC1] call CBA_fnc_ownerEvent; // API
if (_transferred) then {
_numTransferredHC1 = _numTransferredHC1 + 1;
@@ -171,11 +171,13 @@ private _previousOwner = -1;
// Don't transfer if it's already local to HC2
if (_previousOwner == _idHC2) exitWith {};
- [QGVAR(groupTransferPre), [_x, _HC2, _previousOwner, _idHC2], [_previousOwner, _idHC2]] call CBA_fnc_targetEvent; // API
+ [QGVAR(groupTransferPre), [_x, _HC2, _previousOwner, _idHC2], _previousOwner] call CBA_fnc_ownerEvent; // API
+ [QGVAR(groupTransferPre), [_x, _HC2, _previousOwner, _idHC2], _idHC2] call CBA_fnc_ownerEvent; // API
private _transferred = _x setGroupOwner _idHC2;
- [QGVAR(groupTransferPost), [_x, _HC2, _previousOwner, _idHC2, _transferred], [_previousOwner, _idHC2]] call CBA_fnc_targetEvent; // API
+ [QGVAR(groupTransferPost), [_x, _HC2, _previousOwner, _idHC2, _transferred], _previousOwner] call CBA_fnc_ownerEvent; // API
+ [QGVAR(groupTransferPost), [_x, _HC2, _previousOwner, _idHC2, _transferred], _idHC2] call CBA_fnc_ownerEvent; // API
if (_transferred) then {
_numTransferredHC2 = _numTransferredHC2 + 1;
@@ -197,11 +199,13 @@ private _previousOwner = -1;
// Don't transfer if it's already local to HC3
if (_previousOwner == _idHC3) exitWith {};
- [QGVAR(groupTransferPre), [_x, _HC3, _previousOwner, _idHC3], [_previousOwner, _idHC3]] call CBA_fnc_targetEvent; // API
+ [QGVAR(groupTransferPre), [_x, _HC3, _previousOwner, _idHC3], _previousOwner] call CBA_fnc_ownerEvent; // API
+ [QGVAR(groupTransferPre), [_x, _HC3, _previousOwner, _idHC3], _idHC3] call CBA_fnc_ownerEvent; // API
private _transferred = _x setGroupOwner _idHC2;
- [QGVAR(groupTransferPost), [_x, _HC3, _previousOwner, _idHC3, _transferred], [_previousOwner, _idHC3]] call CBA_fnc_targetEvent; // API
+ [QGVAR(groupTransferPost), [_x, _HC3, _previousOwner, _idHC3, _transferred], _previousOwner] call CBA_fnc_ownerEvent; // API
+ [QGVAR(groupTransferPost), [_x, _HC3, _previousOwner, _idHC3, _transferred], _idHC3] call CBA_fnc_ownerEvent; // API
if (_transferred) then {
_numTransferredHC3 = _numTransferredHC3 + 1;
diff --git a/addons/headless/stringtable.xml b/addons/headless/stringtable.xml
index 35dcb118620..063f72d1404 100644
--- a/addons/headless/stringtable.xml
+++ b/addons/headless/stringtable.xml
@@ -88,7 +88,7 @@
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는 지원함)
+ 연결된 플레이어가 없으면 미션을 종료합니다(서버 설정의 'persistent = 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',但支援 Headless 客户端)。
@@ -145,7 +145,7 @@
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)
+ 전송 통계 및 헤드리스 클라이언트 연결(해제)를 RPT파일에 기록합니다. (기본값: No)
統計とヘッドレスクライアントの接続有無を PRT へ記録します。 (デフォルト: 無効)
Archive les statistiques de transfert et de (dé)connections du Headless Client dans le RPT. (Défaut: Non)
记录 Headless 客户端间的转换数量与连线/断线等记录到 RPT 报告档中。(预设:关闭)
diff --git a/addons/hearing/XEH_PREP.hpp b/addons/hearing/XEH_PREP.hpp
index a2bcbb708a4..64161300d3e 100644
--- a/addons/hearing/XEH_PREP.hpp
+++ b/addons/hearing/XEH_PREP.hpp
@@ -1,6 +1,6 @@
PREP(addEarPlugs);
PREP(earRinging);
-PREP(explosionNear);
+PREP(explosion);
PREP(firedNear);
PREP(getAmmoLoudness);
PREP(handleRespawn);
diff --git a/addons/hearing/XEH_postInit.sqf b/addons/hearing/XEH_postInit.sqf
index 4261933bd92..f9fb2043334 100644
--- a/addons/hearing/XEH_postInit.sqf
+++ b/addons/hearing/XEH_postInit.sqf
@@ -11,6 +11,26 @@ if (isServer) then {
}] call CBA_fnc_addEventHandler;
};
+["CBA_settingsInitialized", {
+ TRACE_1("settingInit - common",GVAR(enableCombatDeafness));
+ // Only install event handler if combat deafness is enabled
+ if (!GVAR(enableCombatDeafness)) exitWith {};
+
+ [{ // Convert ace_common's local explosion to a hearing global explosion event
+ params ["_projectile", "_pos"];
+ TRACE_1("Explode",_this);
+
+ // If projectile is local only, don't raise event globally
+ // TODO: netId always returns valid after 2.18
+ // use _projectile getShotInfo 5 (https://community.bistudio.com/wiki/getShotInfo)
+ if (isMultiplayer && {(netId _projectile) == "0:0"}) then {
+ [QGVAR(explosion), [_projectile, _pos]] call CBA_fnc_localEvent;
+ } else {
+ [QGVAR(explosion), [_projectile, _pos]] call CBA_fnc_globalEvent;
+ };
+ }] call EFUNC(common,addExplosionEventHandler);
+}] call CBA_fnc_addEventHandler;
+
if (!hasInterface) exitWith {};
#include "initKeybinds.inc.sqf"
@@ -27,7 +47,7 @@ GVAR(volumeAttenuation) = 1;
GVAR(lastPlayerVehicle) = objNull;
["CBA_settingsInitialized", {
- TRACE_1("settingInit",GVAR(enableCombatDeafness));
+ TRACE_1("settingInit - client",GVAR(enableCombatDeafness));
// Only run PFEH and install event handlers if combat deafness is enabled
if (!GVAR(enableCombatDeafness)) exitWith {};
@@ -35,6 +55,7 @@ GVAR(lastPlayerVehicle) = objNull;
// Spawn volume updating process
[LINKFUNC(updateVolume), 1, false] call CBA_fnc_addPerFrameHandler;
+ [QGVAR(explosion), LINKFUNC(explosion)] call CBA_fnc_addEventHandler;
[QGVAR(updateVolume), LINKFUNC(updateVolume)] call CBA_fnc_addEventHandler;
// Update veh attunation when player veh changes
@@ -71,12 +92,7 @@ GVAR(lastPlayerVehicle) = objNull;
private _firedEH = _oldPlayer getVariable [QGVAR(firedEH), -1];
_oldPlayer removeEventHandler ["FiredNear", _firedEH];
_oldPlayer setVariable [QGVAR(firedEH), nil];
-
- private _explosionEH = _oldPlayer getVariable [QGVAR(explosionEH), -1];
- _oldPlayer removeEventHandler ["Explosion", _explosionEH];
- _oldPlayer setVariable [QGVAR(explosionEH), nil];
-
- TRACE_3("removed unit eh",_oldPlayer,_firedEH,_explosionEH);
+ TRACE_2("removed unit eh",_oldPlayer,_firedEH);
};
// Don't add a new EH if the unit respawned
if ((_player getVariable [QGVAR(firedEH), -1]) == -1) then {
@@ -86,11 +102,7 @@ GVAR(lastPlayerVehicle) = objNull;
private _firedEH = _player addEventHandler ["FiredNear", {call FUNC(firedNear)}];
_player setVariable [QGVAR(firedEH), _firedEH];
-
- private _explosionEH = _player addEventHandler ["Explosion", {call FUNC(explosionNear)}];
- _player setVariable [QGVAR(explosionEH), _explosionEH];
-
- TRACE_3("added unit eh",_player,_firedEH,_explosionEH);
+ TRACE_2("added unit eh",_player,_firedEH);
};
GVAR(deafnessDV) = 0;
diff --git a/addons/hearing/functions/fnc_explosion.sqf b/addons/hearing/functions/fnc_explosion.sqf
new file mode 100644
index 00000000000..b5a6f14a69c
--- /dev/null
+++ b/addons/hearing/functions/fnc_explosion.sqf
@@ -0,0 +1,54 @@
+#include "..\script_component.hpp"
+/*
+ * Author: johnb43
+ * Handles deafness due to explosions going off near the player.
+ *
+ * Arguments:
+ * 0: Projectile
+ * 1: Explosion position ASL
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [_projectile, [0, 0, 0]] call ace_hearing_fnc_explosion
+ *
+ * Public: No
+ */
+
+// Ignore spectators, curators and alike
+if ((getNumber (configOf ACE_player >> "isPlayableLogic")) == 1) exitWith {};
+
+params ["_projectile", "_pos"];
+
+// Don't allow for distances under 1
+private _distance = ((eyePos ACE_player) vectorDistance _pos) max 1;
+
+// Fast exit if explosion far away
+if (_distance > 100) exitWith {
+ TRACE_1("too far away",_distance);
+};
+
+private _ammoConfig = configOf _projectile;
+private _explosive = getNumber (_ammoConfig >> "explosive");
+
+private _vehAttenuation = [GVAR(playerVehAttenuation), 1] select (isNull objectParent ACE_player || {isTurnedOut ACE_player});
+
+TRACE_5("",typeOf _projectile,_distance,_explosive,_audibleFire,_vehAttenuation);
+
+(if (isArray (_ammoConfig >> "soundHit1")) then {
+ getArray (_ammoConfig >> "soundHit1")
+} else {
+ getArray (_ammoConfig >> "soundHit")
+}) params ["", ["_volume", 1], "", ["_maxDistance", 1500]];
+
+if (_distance > _maxDistance) exitWith {
+ TRACE_2("too far away",_distance,_maxDistance);
+};
+
+private _strength = _vehAttenuation * _explosive * _volume * _maxDistance / _distance^2;
+
+TRACE_2("strength",_volume,_strength);
+
+// Call immediately, as it will get picked up later by the update thread anyway
+_strength call FUNC(earRinging);
diff --git a/addons/hearing/functions/fnc_explosionNear.sqf b/addons/hearing/functions/fnc_explosionNear.sqf
deleted file mode 100644
index 583c55749e9..00000000000
--- a/addons/hearing/functions/fnc_explosionNear.sqf
+++ /dev/null
@@ -1,26 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: KoffeinFlummi, commy2, Ruthberg
- * Handles deafness due to explosions going off near the player.
- *
- * Arguments:
- * 0: Unit
- * 1: Damage inflicted to the unit
- *
- * Return Value:
- * None
- *
- * Example:
- * [clientExplosionEvent] call ace_hearing_fnc_explosionNear
- *
- * Public: No
- */
-
-params ["_unit", "_damage"];
-
-TRACE_2("explosion near player",_unit,_damage);
-
-private _strength = (0 max _damage) * 30;
-
-// Call immediately, as it will get picked up later by the update thread anyway
-_strength call FUNC(earRinging);
diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml
index 9aba1ab56b0..08419d4e42b 100644
--- a/addons/hearing/stringtable.xml
+++ b/addons/hearing/stringtable.xml
@@ -372,6 +372,7 @@
Mettre/enlever les bouchons
Ohrstöpsel einsetzen/herausnehmen
Poner/quitar tapones
+ Colocar/retirar protetores auriculares
Only units with heavy weapons
@@ -382,6 +383,7 @@
Sólo unidades con armas pesadas
Solo a unità con armi pesanti
중화기를 가진 유닛만 해당
+ Apenas unidades com armas pesadas
diff --git a/addons/hellfire/CfgAmmo.hpp b/addons/hellfire/CfgAmmo.hpp
index 5eef9ad47eb..8789be711ce 100644
--- a/addons/hellfire/CfgAmmo.hpp
+++ b/addons/hellfire/CfgAmmo.hpp
@@ -1,3 +1,4 @@
+class ace_missileguidance_type_Hellfire;
class CfgAmmo {
class M_Scalpel_AT;
@@ -23,32 +24,8 @@ class CfgAmmo {
EGVAR(rearm,caliber) = 178;
- class ace_missileguidance {
+ class ace_missileguidance: ace_missileguidance_type_Hellfire {
enabled = 1;
-
- minDeflection = 0.0005; // Minium flap deflection for guidance
- maxDeflection = 0.01; // Maximum flap deflection for guidance
- incDeflection = 0.0005; // The incrmeent in which deflection adjusts.
-
- canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
-
- // Guidance type for munitions
- defaultSeekerType = "SALH";
- seekerTypes[] = { "SALH", "LIDAR", "SARH", "Optic", "Thermal", "GPS", "SACLOS", "MCLOS" };
-
- defaultSeekerLockMode = "LOAL";
- seekerLockModes[] = { "LOAL", "LOBL" };
-
- seekLastTargetPos = 1; // seek last target position [if seeker loses LOS of target, continue to last known pos]
- seekerAngle = 70; // Angle in front of the missile which can be searched
- seekerAccuracy = 1; // seeker accuracy multiplier
-
- seekerMinRange = 1;
- seekerMaxRange = 8000; // Range from the missile which the seeker can visually search
-
- // Attack profile type selection
- defaultAttackProfile = "hellfire";
- attackProfiles[] = {"hellfire", "hellfire_hi", "hellfire_lo"};
};
};
class ACE_Hellfire_AGM114N: ACE_Hellfire_AGM114K {
@@ -75,8 +52,8 @@ class CfgAmmo {
canVanillaLock = 1;
enabled = 1; // Missile Guidance must be explicitly enabled
seekLastTargetPos = 0;
- defaultSeekerType = "ARH";
- seekerTypes[] = { "ARH" };
+ defaultSeekerType = "MillimeterWaveRadar";
+ seekerTypes[] = { "MillimeterWaveRadar" };
defaultSeekerLockMode = "LOBL";
seekerLockModes[] = { "LOBL" };
diff --git a/addons/hellfire/XEH_PREP.hpp b/addons/hellfire/XEH_PREP.hpp
index f30cf0bffdf..011810aa044 100644
--- a/addons/hellfire/XEH_PREP.hpp
+++ b/addons/hellfire/XEH_PREP.hpp
@@ -2,3 +2,4 @@ LOG("prep");
PREP(attackProfile);
PREP(getAttackProfileSettings);
PREP(setupVehicle);
+PREP(midCourseTransition);
diff --git a/addons/hellfire/functions/fnc_attackProfile.sqf b/addons/hellfire/functions/fnc_attackProfile.sqf
index 26bc3f1ff07..aa457d02fa5 100644
--- a/addons/hellfire/functions/fnc_attackProfile.sqf
+++ b/addons/hellfire/functions/fnc_attackProfile.sqf
@@ -18,80 +18,99 @@
*/
params ["_seekerTargetPos", "_args", "_attackProfileStateParams"];
-_args params ["_firedEH", "_launchParams", "", "", "_stateParams"];
+_args params ["_firedEH", "_launchParams", "_flightParams", "", "_stateParams"];
_stateParams params ["", "_seekerStateParams"];
_launchParams params ["","_targetLaunchParams","_seekerType"];
-_targetLaunchParams params ["", "", "_launchPos"];
+_targetLaunchParams params ["", "", "_launchPos", "_launchDir"];
_firedEH params ["","","","","","","_projectile"];
// Get state params:
if (_attackProfileStateParams isEqualTo []) then {
_this call FUNC(getAttackProfileSettings);
};
-_attackProfileStateParams params ["_attackStage", "_configLaunchHeightClear"];
-
+_attackProfileStateParams params ["_attackStage", "_configLaunchHeightClear", "_missileStateData"];
private _projectilePos = getPosASL _projectile;
-private _distanceFromLaunch2d = _launchPos distance2d _projectilePos;
+private _distanceFromLaunch2d = _launchPos distance2D _projectilePos;
private _heightAboveLaunch = (_projectilePos select 2) - (_launchPos select 2);
// Add height depending on distance for compensate
-private _returnTargetPos = nil;
+private _returnTargetPos = _seekerTargetPos;
+if (_returnTargetPos isEqualTo [0, 0, 0]) then {
+ private _initialDistanceToTarget = 8000;
+ _returnTargetPos = _launchPos vectorAdd (_launchDir vectorMultiply _initialDistanceToTarget);
+};
+
+private _closingRate = vectorMagnitude velocity _projectile;
+// subtract 500 meters to account for the fact that we don't want to be at the perfect pitch exactly when we cross the target
+// 500 seemed good in testing
+private _timeToGo = ((_projectilePos distance2D _seekerTargetPos) - 500) / _closingRate;
+
+// we could do stuff like desired attack angle, but I'm not going that far today
+private _los = _projectilePos vectorFromTo _seekerTargetPos;
+
+_flightParams params ["_pitchRate", "_yawRate"];
+
+private _angleToTarget = acos ((vectorDir _projectile) vectorCos _los);
+private _atMinRotationAngle = _angleToTarget >= (_pitchRate * _timeToGo);
switch (_attackStage) do {
case STAGE_LAUNCH: { // Gain height quickly to pass terrain mask
- _returnTargetPos = _projectilePos getPos [100, getDir _projectile];
- _returnTargetPos set [2, (_projectilePos select 2) + 36.4]; // 100 and 36.4 gives a 20 deg angle
+ _missileStateData params ["_heightBeforeStateSwitch", "_initialDistanceToTarget"];
+
+ _returnTargetPos set [2, _heightBeforeStateSwitch + (_initialDistanceToTarget * sin 20)]; // 100 and 36.4 gives a 20 deg angle
if (_heightAboveLaunch > _configLaunchHeightClear) then {
_attackProfileStateParams set [0, STAGE_SEEK_CRUISE];
+
+ _attackProfileStateParams set [2, [_projectilePos select 2, _seekerTargetPos distance2D _projectilePos]];
TRACE_2("New Stage: STAGE_SEEK_CRUISE",_distanceFromLaunch2d,_heightAboveLaunch);
};
+
+ if (_atMinRotationAngle) then {
+ _attackProfileStateParams set [0, STAGE_ATTACK_TERMINAL];
+
+ _attackProfileStateParams set [2, [_projectilePos select 2, _seekerTargetPos distance2D _projectilePos]];
+ TRACE_2("New Stage: STAGE_ATTACK_TERMINAL",_distanceToTarget2d,_currentHeightOverTarget);
+ };
};
case STAGE_SEEK_CRUISE: { // Slowly gain altitude while searching for target
+ _missileStateData params ["_heightBeforeStateSwitch", "_initialDistanceToTarget"];
+
// Before 4000 cruise at 5.7 degrees up, then level out
- private _cruiseHeight = linearConversion [3000, 5000, _distanceFromLaunch2d, 10, 0, true];
-
- _returnTargetPos = _projectilePos getPos [100, getDir _projectile];
- _returnTargetPos set [2, (_projectilePos select 2) + _cruiseHeight];
-
+ _returnTargetPos set [2, _heightBeforeStateSwitch + (_initialDistanceToTarget * sin 5.7)];
+
if (_seekerTargetPos isNotEqualTo [0,0,0]) then {
_attackProfileStateParams set [0, STAGE_ATTACK_CRUISE];
+
+ _attackProfileStateParams set [2, [_projectilePos select 2, _seekerTargetPos distance2D _projectilePos]];
TRACE_1("New Stage: STAGE_ATTACK_CRUISE",_distanceFromLaunch2d);
};
};
case STAGE_ATTACK_CRUISE: {
+ _missileStateData params ["_heightBeforeStateSwitch", "_initialDistanceToTarget"];
+
private _currentHeightOverTarget = (_projectilePos select 2) - (_seekerTargetPos select 2);
- private _distanceToTarget2d = _seekerTargetPos distance2d _projectilePos;
- private _distToGoRatio = _distanceToTarget2d / (_launchPos distance2d _seekerTargetPos);
+ private _distanceToTarget2d = _seekerTargetPos distance2D _projectilePos;
- // arcing up at 7 degrees to start until 50% left, then smooth curve to a downward attack
- private _gainSlope = linearConversion [0.5, 0.1, _distToGoRatio, 7, -7, true];
- _returnTargetPos = +_seekerTargetPos;
- _returnTargetPos set [2, ((_projectilePos select 2) + (_distanceToTarget2d * sin _gainSlope)) max (_seekerTargetPos select 2)];
+ _returnTargetPos set [2, _heightBeforeStateSwitch + (_initialDistanceToTarget * sin 7)];
- if ((_distanceToTarget2d < 500) || {(_currentHeightOverTarget atan2 _distanceToTarget2d) > 15}) then { // Wait until we can come down at a sharp angle
+ // if we are at the rotation limit, rotate to target
+ if (_atMinRotationAngle || {(_currentHeightOverTarget atan2 _distanceToTarget2d) > 15}) then { // Wait until we can come down at a sharp angle
_attackProfileStateParams set [0, STAGE_ATTACK_TERMINAL];
+
+ _attackProfileStateParams set [2, [_projectilePos select 2, _seekerTargetPos distance2D _projectilePos]];
TRACE_2("New Stage: STAGE_ATTACK_TERMINAL",_distanceToTarget2d,_currentHeightOverTarget);
};
};
case STAGE_ATTACK_TERMINAL: {
- private _distanceToTarget2d = _seekerTargetPos distance2d _projectilePos;
- _returnTargetPos = _seekerTargetPos vectorAdd [0, 0, _distanceToTarget2d * 0.02];
};
};
-// Special radar case. Adjust target position such that we are leading it
-if (_attackStage >= 3 && { _seekerType isEqualTo "ARH" }) then {
- _seekerStateParams params ["", "", "", "", "", "", "", "_lastKnownVelocity"];
- private _projectileVelocity = velocity _projectile;
- if (_projectileVelocity#2 < 0) then {
- private _projectileSpeed = vectorMagnitude _projectileVelocity; // this gives a precise impact time versus using speed _projectile. Dont change
- private _timeUntilImpact = (_seekerTargetPos distance _projectilePos) / _projectileSpeed;
- _returnTargetPos = _returnTargetPos vectorAdd (_lastKnownVelocity vectorMultiply _timeUntilImpact);
- };
-};
+// missile guidance defines this variable in doAttackProfile
+//IGNORE_PRIVATE_WARNING ["_attackProfileName"];
+_attackProfileName = ["na", "hellfire - LAUNCH", "hellfire - SEEK CRUISE", "hellfire - ATTACK CRUISE", "hellfire - TERMINAL"] select _attackStage;
-// TRACE_1("Adjusted target position",_returnTargetPos);
+TRACE_1("Adjusted target position",_returnTargetPos);
_returnTargetPos;
diff --git a/addons/hellfire/functions/fnc_getAttackProfileSettings.sqf b/addons/hellfire/functions/fnc_getAttackProfileSettings.sqf
index 14d89f82e31..d9e1c23b205 100644
--- a/addons/hellfire/functions/fnc_getAttackProfileSettings.sqf
+++ b/addons/hellfire/functions/fnc_getAttackProfileSettings.sqf
@@ -27,6 +27,8 @@ private _attackConfig = configFile >> QEGVAR(missileguidance,AttackProfiles) >>
// Launch (clearing terrain mask for LO/HI):
private _configLaunchHeightClear = getNumber (_attackConfig >> QGVAR(launchHeightClear));
+private _projectilePos = getPosASL _projectile;
+
// Get starting stage
private _startingStage = if (_configLaunchHeightClear > 0) then {
STAGE_LAUNCH; // LOAL-HI / LO
@@ -40,5 +42,9 @@ private _startingStage = if (_configLaunchHeightClear > 0) then {
// Set data in param array
_attackProfileStateParams set [0, _startingStage];
_attackProfileStateParams set [1, _configLaunchHeightClear];
+_attackProfileStateParams set [2, [
+ _projectilePos select 2,
+ _seekerTargetPos distance2D _projectilePos
+]];
TRACE_1("new shot settings",_attackProfileStateParams);
diff --git a/addons/hellfire/functions/fnc_midCourseTransition.sqf b/addons/hellfire/functions/fnc_midCourseTransition.sqf
new file mode 100644
index 00000000000..034bd25d61a
--- /dev/null
+++ b/addons/hellfire/functions/fnc_midCourseTransition.sqf
@@ -0,0 +1,30 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Condition to switch to next navigation profile
+ *
+ * Arguments:
+ * Guidance Arg Array
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [] call ace_hellfire_fnc_midCourseTransition
+ *
+ * Public: No
+ */
+
+params ["_args", "_timestep"];
+_args params ["_firedEH", "_launchParams", "_flightParams", "_seekerParams", "_stateParams", "_targetData", "_navigationStateData"];
+_firedEH params ["_shooter","","","","_ammo","","_projectile"];
+_launchParams params ["_shooter","_targetLaunchParams","_seekerType","_attackProfile","_lockMode","_laserInfo","_navigationType"];
+_targetLaunchParams params ["_target", "_targetPos", "_launchPos", "_launchDir", "_launchTime"];
+_flightParams params ["_pitchRate", "_yawRate", "_isBangBangGuidance"];
+_stateParams params ["_lastRunTime", "_seekerStateParams", "_attackProfileStateParams", "_lastKnownPosState","_navigationParams", "_guidanceParameters"];
+_seekerParams params ["_seekerAngle", "_seekerAccuracy", "_seekerMaxRange", "_seekerMinRange"];
+_targetData params ["_targetDirection", "_attackProfileDirection", "_targetRange", "_targetVelocity", "_targetAcceleration"];
+
+_attackProfileStateParams params ["_state"];
+_state isEqualTo STAGE_ATTACK_TERMINAL;
+
diff --git a/addons/hitreactions/functions/fnc_getRandomAnimation.sqf b/addons/hitreactions/functions/fnc_getRandomAnimation.sqf
index 8b26bf70efd..a52f2958dca 100644
--- a/addons/hitreactions/functions/fnc_getRandomAnimation.sqf
+++ b/addons/hitreactions/functions/fnc_getRandomAnimation.sqf
@@ -25,6 +25,7 @@ if (_weapon == "") exitWith {
if (_weapon == primaryWeapon _unit) exitWith {
if (_unit call EFUNC(common,isPlayer)) then {
+ //IGNORE_PRIVATE_WARNING ["_velocity"]; // from upper scope
private _isRunning = _velocity > 4;
[
diff --git a/addons/hitreactions/stringtable.xml b/addons/hitreactions/stringtable.xml
index ff541ad6a34..e60be5b353a 100644
--- a/addons/hitreactions/stringtable.xml
+++ b/addons/hitreactions/stringtable.xml
@@ -24,6 +24,8 @@
플레이어가 무기를 떨굴 확률 (팔 피격)
Spieler Wahrscheinlichkeit, die Waffe fallen zu lassen (Arm Treffer)
Probabilità dei giocatori di far cadere l'arma (colpo al braccio)
+ Probabilité de lâcher l'arme (coup au bras)
+ Probabilidade do jogador de largar a arma após tiro no braço
AI Weapon Drop Chance (Arm Hit)
@@ -32,6 +34,8 @@
인공지능이 무기를 떨굴 확률 (팔 피격)
KI-Wahrscheinlichkeit, die Waffe fallen zu lassen (Arm Treffer)
Probabilità dell'IA di far cadere l'arma (colpo al braccio)
+ Probabilité de l'IA de lâcher l'arme (coup au bras)
+ Probabilidade da IA de largar a arma após tiro no braço
diff --git a/addons/hot/CfgAmmo.hpp b/addons/hot/CfgAmmo.hpp
index 1be8c6067f6..6f91d241fb9 100644
--- a/addons/hot/CfgAmmo.hpp
+++ b/addons/hot/CfgAmmo.hpp
@@ -1,3 +1,4 @@
+class ace_missileguidance_type_Hot;
class CfgAmmo {
class M_Scalpel_AT;
class ammo_Penetrator_Base;
@@ -55,35 +56,8 @@ class CfgAmmo {
EGVAR(rearm,caliber) = 178;
EGVAR(vehicle_damage,incendiary) = 1.0;
- class ace_missileguidance {
+ class ace_missileguidance: ace_missileguidance_type_Hot {
enabled = 1;
-
- minDeflection = 0; // Minium flap deflection for guidance
- maxDeflection = 0.0030; // Maximum flap deflection for guidance
- incDeflection = 0.0005; // The incrmeent in which deflection adjusts.
-
- canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
-
- // Guidance type for munitions
- defaultSeekerType = "SACLOS";
- seekerTypes[] = { "SACLOS" };
-
- defaultSeekerLockMode = "LOAL";
- seekerLockModes[] = { "LOAL", "LOBL" };
-
- seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
- seekerAngle = 30; // Angle from the shooter's view that can track the missile
- seekerAccuracy = 1; // seeker accuracy multiplier
-
- seekerMinRange = 75;
- seekerMaxRange = 4000; // Range from the missile which the seeker can visually search
-
- correctionDistance = 8; // distance from center of crosshair where missile slows down
- offsetFromCrosshair[] = { 0, 0, 0.5 }; // where the missile wants to stay in relation to the center of the crosshair.
-
- // Attack profile type selection
- defaultAttackProfile = "WIRE";
- attackProfiles[] = {"WIRE"};
};
};
@@ -135,6 +109,7 @@ class CfgAmmo {
class ace_missileguidance: ace_missileguidance {
enabled = 1;
seekerMaxRange = 4300;
+ offsetFromCrosshair[] = { 0, 0, 0.5 }; // where the missile wants to stay in relation to the center of the crosshair.
};
};
};
diff --git a/addons/hot/CfgVehicles.hpp b/addons/hot/CfgVehicles.hpp
index db5b8b5262e..46ac7d5136b 100644
--- a/addons/hot/CfgVehicles.hpp
+++ b/addons/hot/CfgVehicles.hpp
@@ -4,11 +4,22 @@ class CfgVehicles {
class Turrets;
};
class LT_01_base_F: Tank_F {
+ class AnimationSources;
class Turrets: Turrets {
class MainTurret;
};
};
class LT_01_AT_base_F: LT_01_base_F {
+ class AnimationSources: AnimationSources {
+ class Missiles_revolving {
+ source = "revolving";
+ weapon = QGVAR(generic_launcher);
+ };
+ class Missiles_reloadMagazine {
+ source = "reloadMagazine";
+ weapon = QGVAR(generic_launcher);
+ };
+ };
class Turrets: Turrets {
class MainTurret: MainTurret {
weapons[] = {"SmokeLauncher","HMG_127",QGVAR(generic_launcher)};
diff --git a/addons/huntir/functions/fnc_cam.sqf b/addons/huntir/functions/fnc_cam.sqf
index 411dbfe30eb..4a80a4819e9 100644
--- a/addons/huntir/functions/fnc_cam.sqf
+++ b/addons/huntir/functions/fnc_cam.sqf
@@ -31,10 +31,10 @@ GVAR(ELEVAT) = 0.01;
HUNTIR_BACKGROUND_LAYER_ID cutText["","PLAIN"];
-closedialog 0;
+closeDialog 0;
createDialog QGVAR(cam_dialog);
-uiNameSpace setVariable [QGVAR(monitor), findDisplay 18880];
-(uiNameSpace getVariable QGVAR(monitor)) displaySetEventHandler ["Keydown", QUOTE(_this call FUNC(keyPressed))];
+uiNamespace setVariable [QGVAR(monitor), findDisplay 18880];
+(uiNamespace getVariable QGVAR(monitor)) displaySetEventHandler ["Keydown", QUOTE(_this call FUNC(keyPressed))];
ctrlSetText [4, "0X"];
@@ -68,8 +68,9 @@ GVAR(no_cams) sort true;
} forEach GVAR(no_cams);
[{
//Close monitor if we no longer have the item:
- if ((!([ACE_player, "ACE_HuntIR_monitor"] call EFUNC(common,hasItem))) && {!isNull (uiNameSpace getVariable [QGVAR(monitor), displayNull])}) then {
+ if ((!([ACE_player, "ACE_HuntIR_monitor"] call EFUNC(common,hasItem))) && {!isNull (uiNamespace getVariable [QGVAR(monitor), displayNull])}) then {
closeDialog 0;
+ [QGVAR(monitorClosed), [ACE_player]] call CBA_fnc_localEvent;
};
GVAR(nearHuntIRs) = ACE_player nearEntities ["ACE_HuntIR", HUNTIR_MAX_TRANSMISSION_RANGE];
@@ -104,32 +105,33 @@ GVAR(no_cams) sort true;
GVAR(NV) = 0;
setAperture -1;
- closedialog 0;
- titletext [" ", "BLACK IN", 4];
+ closeDialog 0;
+ titleText [" ", "BLACK IN", 4];
ACE_player switchCamera "INTERNAL";
- GVAR(cam) CameraEffect ["Terminate", "Back"];
- CamDestroy GVAR(cam);
+ GVAR(cam) cameraEffect ["Terminate", "Back"];
+ camDestroy GVAR(cam);
deleteVehicle GVAR(logic);
if (player != ACE_player) then {
player remoteControl ACE_player;
};
+ [QGVAR(monitorClosed), [ACE_player]] call CBA_fnc_localEvent;
};
switch (GVAR(ZOOM)) do {
case 0: {
- GVAR(cam) camsetFOV 0.7;
+ GVAR(cam) camSetFov 0.7;
GVAR(cam) camSetFocus [GVAR(pos) select 2, 1];
};
case 1: {
- GVAR(cam) camsetFOV 0.35;
+ GVAR(cam) camSetFov 0.35;
GVAR(cam) camSetFocus [(GVAR(pos) select 2)/2, 1];
};
case 2: {
- GVAR(cam) camsetFOV 0.17;
+ GVAR(cam) camSetFov 0.17;
GVAR(cam) camSetFocus [(GVAR(pos) select 2)/4, 1];
};
case 3: {
- GVAR(cam) camsetFOV 0.1;
+ GVAR(cam) camSetFov 0.1;
GVAR(cam) camSetFocus [(GVAR(pos) select 2)/8, 1];
};
};
@@ -137,7 +139,7 @@ GVAR(no_cams) sort true;
GVAR(logic) setPosATL (GVAR(pos) vectorAdd [0, 0, -5]);
GVAR(logic) setDir GVAR(ROTATE);
GVAR(logic) setVectorUp [0.0001, 0.0001, 1];
- GVAR(cam) CameraEffect ["internal", "BACK"];
+ GVAR(cam) cameraEffect ["internal", "BACK"];
private _cam_coord_y = GVAR(ELEVAT) * cos(GVAR(ROTATE));
private _cam_coord_x = GVAR(ELEVAT) * sin(GVAR(ROTATE));
GVAR(cam) camSetRelPos [_cam_coord_x, _cam_coord_y, 2];
diff --git a/addons/huntir/functions/fnc_huntir.sqf b/addons/huntir/functions/fnc_huntir.sqf
index 60b7a1fc141..c54d193d9e3 100644
--- a/addons/huntir/functions/fnc_huntir.sqf
+++ b/addons/huntir/functions/fnc_huntir.sqf
@@ -18,20 +18,23 @@
#define __TYPE_WRITER_DELAY 0.05
-if ((ACE_player call CBA_fnc_getUnitAnim) select 0 == "stand") then {
+if (missionNamespace getVariable [QGVAR(animatePlayer), true] && {(ACE_player call CBA_fnc_getUnitAnim) select 0 == "stand"}) then {
ACE_player playMove "AmovPercMstpSrasWrflDnon_diary";
};
HUNTIR_BACKGROUND_LAYER_ID cutText ["", "BLACK", 0];
createDialog QGVAR(cam_dialog_off);
+[QGVAR(monitorOpened), [ACE_player]] call CBA_fnc_localEvent;
+
[{
if (!dialog) exitWith {
HUNTIR_BACKGROUND_LAYER_ID cutText ["", "PLAIN", 0];
+ [QGVAR(monitorClosed), [ACE_player]] call CBA_fnc_localEvent;
};
closeDialog 0;
createDialog QGVAR(cam_dialog_inactive);
- uiNameSpace setVariable [QGVAR(monitor), findDisplay 18881];
+ uiNamespace setVariable [QGVAR(monitor), findDisplay 18881];
[{
GVAR(startTime) = CBA_missionTime;
GVAR(done) = false;
@@ -40,10 +43,12 @@ createDialog QGVAR(cam_dialog_off);
GVAR(message) = [];
GVAR(messageSearching) = toArray "Searching.....";
GVAR(messageConnecting) = toArray "Connecting.....";
+ [QGVAR(monitorStarted), [ACE_player]] call CBA_fnc_localEvent;
[{
//Close monitor if we no longer have item:
- if ((!([ACE_player, "ACE_HuntIR_monitor"] call EFUNC(common,hasItem))) && {!isNull (uiNameSpace getVariable [QGVAR(monitor), displayNull])}) then {
+ if ((!([ACE_player, "ACE_HuntIR_monitor"] call EFUNC(common,hasItem))) && {!isNull (uiNamespace getVariable [QGVAR(monitor), displayNull])}) then {
closeDialog 0;
+ [QGVAR(monitorClosed), [ACE_player]] call CBA_fnc_localEvent;
};
private _elapsedTime = CBA_missionTime - GVAR(startTime);
@@ -55,6 +60,7 @@ createDialog QGVAR(cam_dialog_off);
GVAR(done) = false;
GVAR(message) = [];
GVAR(connectionDelay) = 5;
+ [QGVAR(monitorDisconnected), [ACE_player]] call CBA_fnc_localEvent;
};
if ((!dialog) || GVAR(done)) exitWith {
@@ -64,6 +70,7 @@ createDialog QGVAR(cam_dialog_off);
[_nearestHuntIRs select 0] call FUNC(cam);
} else {
HUNTIR_BACKGROUND_LAYER_ID cutText ["", "PLAIN"];
+ [QGVAR(monitorClosed), [ACE_player]] call CBA_fnc_localEvent;
};
};
switch (GVAR(state)) do {
@@ -75,9 +82,11 @@ createDialog QGVAR(cam_dialog_off);
GVAR(message) = [];
if (_elapsedTime > 10) then {
GVAR(state) = "noGDS";
+ [QGVAR(monitorNoGDS), [ACE_player]] call CBA_fnc_localEvent;
};
if (_elapsedTime > 5 && {{_x getHitPointDamage "HitCamera" < 0.25} count _nearestHuntIRs > 0}) then {
GVAR(state) = "connecting";
+ [QGVAR(monitorConnecting), [ACE_player]] call CBA_fnc_localEvent;
};
};
};
@@ -91,6 +100,7 @@ createDialog QGVAR(cam_dialog_off);
if (GVAR(connectionDelay) <= 0) then {
GVAR(done) = true;
GVAR(state) = "connected";
+ [QGVAR(monitorConnected), [ACE_player, _nearestHuntIRs select 0]] call CBA_fnc_localEvent;
};
};
};
@@ -98,8 +108,9 @@ createDialog QGVAR(cam_dialog_off);
ctrlSetText [1, "No GDS System detected"];
[{
GVAR(done) = true;
- closedialog 0;
+ closeDialog 0;
HUNTIR_BACKGROUND_LAYER_ID cutText ["", "PLAIN"];
+ [QGVAR(monitorClosed), [ACE_player]] call CBA_fnc_localEvent;
}, [], 3, 0] call CBA_fnc_waitAndExecute;
};
};
diff --git a/addons/intelitems/CfgWeapons.hpp b/addons/intelitems/CfgWeapons.hpp
new file mode 100644
index 00000000000..727b163de28
--- /dev/null
+++ b/addons/intelitems/CfgWeapons.hpp
@@ -0,0 +1,17 @@
+class CfgWeapons {
+ class ACE_ItemCore;
+ class CBA_MiscItem_ItemInfo;
+
+ // Since base game doesn't support misc. items, this is needed to filling inventories in the editor
+ class GVAR(notepad_Item): ACE_ItemCore {
+ displayName = CSTRING(Notepad_DisplayName);
+ author = ECSTRING(common,ACETeam);
+ scope = 2;
+ scopeArsenal = 0;
+ descriptionShort = CSTRING(Notepad_Description);
+ picture = QPATHTOF(ui\notepad_ca.paa);
+ class ItemInfo: CBA_MiscItem_ItemInfo {
+ mass = 0.1;
+ };
+ };
+};
diff --git a/addons/intelitems/XEH_postInit.sqf b/addons/intelitems/XEH_postInit.sqf
index f416b3667ed..f79ae9f6362 100644
--- a/addons/intelitems/XEH_postInit.sqf
+++ b/addons/intelitems/XEH_postInit.sqf
@@ -1,5 +1,8 @@
#include "script_component.hpp"
+// Notepad item to magazine
+[QGVAR(notepad_Item), QXGVAR(notepad)] call EFUNC(common,registerItemReplacement);
+
// Only handle loadout change when on map or have open controls
["loadout", {
if (!visibleMap && {GVAR(controlsGroups) isEqualTo []}) exitWith {};
diff --git a/addons/intelitems/config.cpp b/addons/intelitems/config.cpp
index 3b9b37b5b63..1eafb3fe860 100644
--- a/addons/intelitems/config.cpp
+++ b/addons/intelitems/config.cpp
@@ -8,7 +8,7 @@ class CfgPatches {
QXGVAR(document),
QXGVAR(photo)
};
- weapons[] = {};
+ weapons[] = {QGVAR(notepad_Item)};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_interact_menu", "ace_zeus"};
author = ECSTRING(common,ACETeam);
@@ -23,5 +23,6 @@ class CfgPatches {
#include "CfgEventHandlers.hpp"
#include "CfgEditorSubcategories.hpp"
#include "CfgMagazines.hpp"
+#include "CfgWeapons.hpp"
#include "CfgVehicles.hpp"
#include "gui.hpp"
diff --git a/addons/interact_menu/CursorMenus.hpp b/addons/interact_menu/CursorMenus.hpp
index 79f1109598c..82cb9e79e66 100644
--- a/addons/interact_menu/CursorMenus.hpp
+++ b/addons/interact_menu/CursorMenus.hpp
@@ -28,10 +28,10 @@ class RscTitles {
size = 1;
colorBackground[] = {0, 0, 0, 0.65};
colorText[] = {0, 0, 0, 0};
- x = "safezoneX";
- y = "safezoneY";
- w = "safezoneW";
- h = "safezoneH";
+ x = "safeZoneX";
+ y = "safeZoneY";
+ w = "safeZoneW";
+ h = "safeZoneH";
};
};
};
diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf
index 88269bcc04d..a62996df688 100644
--- a/addons/interact_menu/XEH_preInit.sqf
+++ b/addons/interact_menu/XEH_preInit.sqf
@@ -88,8 +88,8 @@ GVAR(inheritedClassesMan) = [];
if (GVAR(inheritedClassesAll) pushBackUnique _type == -1) exitWith { END_COUNTER(InitPost); };
{
- _x params ["_objectType", "_typeNum", "_parentPath", "_action"];
- if (_object isKindOf _objectType) then {
+ _x params ["_objectType", "_typeNum", "_parentPath", "_action", "_excludedClasses"];
+ if (_type isKindOf _objectType && {_excludedClasses findIf {_type isKindOf _x} == -1}) then {
[_type, _typeNum, _parentPath, _action] call FUNC(addActionToClass);
};
} forEach GVAR(inheritedActionsAll);
@@ -102,8 +102,10 @@ GVAR(inheritedClassesMan) = [];
if (GVAR(inheritedClassesMan) pushBackUnique _type == -1) exitWith { END_COUNTER(InitPost); };
{
- _x params ["_typeNum", "_parentPath", "_action"];
- [_type, _typeNum, _parentPath, _action] call FUNC(addActionToClass);
+ _x params ["_typeNum", "_parentPath", "_action", "_excludedClasses"];
+ if (_excludedClasses findIf {_type isKindOf _x} == -1) then { // skip excluded classes and children
+ [_type, _typeNum, _parentPath, _action] call FUNC(addActionToClass);
+ };
} forEach GVAR(inheritedActionsMan);
END_COUNTER(InitPost);
}, true, ["VirtualMan_F"]] call CBA_fnc_addClassEventHandler;
diff --git a/addons/interact_menu/config.cpp b/addons/interact_menu/config.cpp
index 756e8775abc..d29a9fb6879 100644
--- a/addons/interact_menu/config.cpp
+++ b/addons/interact_menu/config.cpp
@@ -21,10 +21,3 @@ class CfgPatches {
#include "CursorMenus.hpp"
#include "ACE_Settings.hpp"
-
-class ACE_Extensions {
- class ace_break_line {
- windows = 1;
- client = 1;
- };
-};
diff --git a/addons/interact_menu/functions/fnc_addActionToClass.sqf b/addons/interact_menu/functions/fnc_addActionToClass.sqf
index ccea8c4654d..d2167c8079c 100644
--- a/addons/interact_menu/functions/fnc_addActionToClass.sqf
+++ b/addons/interact_menu/functions/fnc_addActionToClass.sqf
@@ -1,7 +1,7 @@
#include "..\script_component.hpp"
/*
* Author: esteldunedain
- * Insert an ACE action to a class, under a certain path
+ * Inserts an ACE action to a class, under a certain path.
* Note: This function is NOT global.
*
* Arguments:
@@ -10,12 +10,13 @@
* 2: Parent path of the new action
* 3: Action
* 4: Use Inheritance (default: false)
+ * 5: Classes excluded from inheritance (children included) (default: [])
*
* Return Value:
* The entry full path, which can be used to remove the entry, or add children entries .
*
* Example:
- * [typeOf cursorTarget, 0, ["ACE_TapShoulderRight"],VulcanPinchAction] call ace_interact_menu_fnc_addActionToClass;
+ * [typeOf cursorTarget, 0, ["ACE_TapShoulderRight"], VulcanPinchAction] call ace_interact_menu_fnc_addActionToClass;
*
* Public: Yes
*/
@@ -25,22 +26,30 @@ if (!params [["_objectType", "", [""]], ["_typeNum", 0, [0]], ["_parentPath", []
ERROR("Bad Params");
[]
};
-TRACE_4("addActionToClass",_objectType,_typeNum,_parentPath,_action);
+private _useInheritance = _this param [4, false, [false]];
+private _excludedClasses = _this param [5, [], [[]]];
+TRACE_6("addActionToClass",_objectType,_typeNum,_parentPath,_action,_useInheritance,_excludedClasses);
-if (param [4, false, [false]]) exitwith {
+if (_useInheritance) exitWith {
BEGIN_COUNTER(addAction);
+ private _cfgVehicles = configFile >> "CfgVehicles"; // store this so we don't resolve for every element
+ _excludedClasses = (_excludedClasses apply {configName (_cfgVehicles >> _x)}) - [""]; // ends up being faster than toLower'ing everything else
if (_objectType == "CAManBase") then {
- GVAR(inheritedActionsMan) pushBack [_typeNum, _parentPath, _action];
+ GVAR(inheritedActionsMan) pushBack [_typeNum, _parentPath, _action, _excludedClasses];
{
- [_x, _typeNum, _parentPath, _action] call FUNC(addActionToClass);
- } forEach GVAR(inheritedClassesMan);
+ private _type = _x;
+ if (_excludedClasses findIf {_type isKindOf _x} == -1) then { // skip excluded classes and children
+ [_x, _typeNum, _parentPath, _action] call FUNC(addActionToClass);
+ };
+ } forEach (GVAR(inheritedClassesMan) - _excludedClasses);
} else {
- GVAR(inheritedActionsAll) pushBack [_objectType, _typeNum, _parentPath, _action];
+ GVAR(inheritedActionsAll) pushBack [_objectType, _typeNum, _parentPath, _action, _excludedClasses];
{
- if (_x isKindOf _objectType) then {
- [_x, _typeNum, _parentPath, _action] call FUNC(addActionToClass);
+ private _type = _x;
+ if (_type isKindOf _objectType && {_excludedClasses findIf {_type isKindOf _x} == -1}) then {
+ [_type, _typeNum, _parentPath, _action] call FUNC(addActionToClass);
};
- } forEach GVAR(inheritedClassesAll);
+ } forEach (GVAR(inheritedClassesAll) - _excludedClasses);
};
END_COUNTER(addAction);
diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf
index 8f19dfabbec..a7fe168a5d9 100644
--- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf
+++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf
@@ -109,6 +109,7 @@ if (_objectType isKindOf "CAManBase") then {
TRACE_1("Building ACE_SelfActions",_objectType);
// Create a master action to base on self action
+//IGNORE_PRIVATE_WARNING ["_target"];
private _actions = [
[
[
@@ -119,7 +120,7 @@ private _actions = [
// Dummy statement so it's not collapsed when there's no available actions
true
},
- {[ACE_player, _target, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering", "isNotSitting", "isNotOnLadder", "isNotRefueling"]] call EFUNC(common,canInteractWith)},
+ {[ACE_player, _target, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering", "isNotHandcuffed", "isNotSitting", "isNotOnLadder", "isNotRefueling"]] call EFUNC(common,canInteractWith)},
{},
{},
"Spine3",
diff --git a/addons/interact_menu/functions/fnc_createAction.sqf b/addons/interact_menu/functions/fnc_createAction.sqf
index ae00f4fb820..f099ae9fb03 100644
--- a/addons/interact_menu/functions/fnc_createAction.sqf
+++ b/addons/interact_menu/functions/fnc_createAction.sqf
@@ -26,7 +26,8 @@
* Public: Yes
*/
-// IGNORE_PRIVATE_WARNING(_actionName,_displayName,_icon,_statement,_condition,_insertChildren,_customParams,_position,_distance,_params,_modifierFunction);
+//IGNORE_PRIVATE_WARNING ["_actionName", "_displayName", "_icon", "_statement", "_condition", "_insertChildren"];
+//IGNORE_PRIVATE_WARNING ["_customParams", "_position", "_distance", "_params", "_modifierFunction"];
if (!hasInterface) exitWith { [] };
params [
diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf
index 9cb638bcea4..d87f6cfa3ba 100644
--- a/addons/interact_menu/functions/fnc_keyDown.sqf
+++ b/addons/interact_menu/functions/fnc_keyDown.sqf
@@ -36,7 +36,7 @@ if (_isTextEditing) then {
if (
_isTextEditing ||
{(isNull curatorCamera) && {
- !([ACE_player, objNull, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering", "isNotSitting", "isNotOnLadder", "isNotRefueling"]] call EFUNC(common,canInteractWith))
+ !([ACE_player, objNull, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering", "isNotHandcuffed", "isNotSitting", "isNotOnLadder", "isNotRefueling"]] call EFUNC(common,canInteractWith))
}
}) exitWith {false};
@@ -84,8 +84,8 @@ if (GVAR(useCursorMenu)) then {
} else {
createDialog QGVAR(cursorMenu);
};
- (finddisplay 91919) displayAddEventHandler ["KeyUp", {[_this,'keyup'] call CBA_events_fnc_keyHandler}];
- (finddisplay 91919) displayAddEventHandler ["KeyDown", {
+ (findDisplay 91919) displayAddEventHandler ["KeyUp", {[_this,'keyup'] call CBA_events_fnc_keyHandler}];
+ (findDisplay 91919) displayAddEventHandler ["KeyDown", {
// Handle the escape key being pressed with menu open:
if ((_this select [1,4]) isEqualTo [1,false,false,false]) exitWith { // escape key with no modifiers
[displayNull] call FUNC(handleEscapeMenu);
@@ -102,8 +102,8 @@ if (GVAR(useCursorMenu)) then {
_ctrl ctrlCommit 0;
// handles Mouse moving and LMB in cursor mode when action on keyrelease is disabled
- ((finddisplay 91919) displayctrl 9922) ctrlAddEventHandler ["MouseMoving", DFUNC(handleMouseMovement)];
- ((finddisplay 91919) displayctrl 9922) ctrlAddEventHandler ["MouseButtonDown", DFUNC(handleMouseButtonDown)];
+ ((findDisplay 91919) displayCtrl 9922) ctrlAddEventHandler ["MouseMoving", DFUNC(handleMouseMovement)];
+ ((findDisplay 91919) displayCtrl 9922) ctrlAddEventHandler ["MouseButtonDown", DFUNC(handleMouseButtonDown)];
setMousePosition [0.5, 0.5];
} else {
if (uiNamespace getVariable [QGVAR(cursorMenuOpened),false]) then {
@@ -111,18 +111,12 @@ if (GVAR(useCursorMenu)) then {
};
};
-GVAR(selfMenuOffset) = (AGLtoASL (positionCameraToWorld [0, 0, 2])) vectorDiff (AGLtoASL (positionCameraToWorld [0, 0, 0]));
+GVAR(selfMenuOffset) = (AGLToASL (positionCameraToWorld [0, 0, 2])) vectorDiff (AGLToASL (positionCameraToWorld [0, 0, 0]));
//Auto expand the first level when self, mounted vehicle or zeus (skips the first animation as there is only one choice)
if (GVAR(openedMenuType) == 0) then {
if (isNull curatorCamera) then {
- if !(isNull (ACE_controlledUAV select 0)) then {
- GVAR(menuDepthPath) = [["ACE_SelfActions", (ACE_controlledUAV select 0)]];
- GVAR(expanded) = true;
- GVAR(expandedTime) = diag_tickTime;
- GVAR(lastPath) = +GVAR(menuDepthPath);
- GVAR(startHoverTime) = -1000;
- } else {
+ if (isNull (ACE_controlledUAV select 0)) then {
if (vehicle ACE_player != ACE_player) then {
GVAR(menuDepthPath) = [["ACE_SelfActions", (vehicle ACE_player)]];
GVAR(expanded) = true;
@@ -130,6 +124,12 @@ if (GVAR(openedMenuType) == 0) then {
GVAR(lastPath) = +GVAR(menuDepthPath);
GVAR(startHoverTime) = -1000;
};
+ } else {
+ GVAR(menuDepthPath) = [["ACE_SelfActions", (ACE_controlledUAV select 0)]];
+ GVAR(expanded) = true;
+ GVAR(expandedTime) = diag_tickTime;
+ GVAR(lastPath) = +GVAR(menuDepthPath);
+ GVAR(startHoverTime) = -1000;
};
} else {
GVAR(menuDepthPath) = [["ACE_ZeusActions", (getAssignedCuratorLogic player)]];
diff --git a/addons/interact_menu/functions/fnc_removeActionFromClass.sqf b/addons/interact_menu/functions/fnc_removeActionFromClass.sqf
index 7585616ef6a..87cc8609ccc 100644
--- a/addons/interact_menu/functions/fnc_removeActionFromClass.sqf
+++ b/addons/interact_menu/functions/fnc_removeActionFromClass.sqf
@@ -1,29 +1,63 @@
#include "..\script_component.hpp"
/*
* Author: esteldunedain
- * Removes an action from a class
+ * Removes an action from a class.
*
* Arguments:
* 0: TypeOf of the class
* 1: Type of action, 0 for actions, 1 for self-actions
* 2: Full path of the new action
+ * 3: Remove action from child classes (default: false)
*
* Return Value:
* None
*
* Example:
- * [typeOf cursorTarget, 0,["ACE_TapShoulderRight","VulcanPinch"]] call ace_interact_menu_fnc_removeActionFromClass;
+ * [typeOf cursorTarget, 0, ["ACE_TapShoulderRight", "VulcanPinch"]] call ace_interact_menu_fnc_removeActionFromClass;
*
* Public: No
*/
-params ["_objectType", "_typeNum", "_fullPath"];
+params ["_objectType", "_typeNum", "_fullPath", ["_useInheritance", false, [false]]];
_objectType = _objectType call EFUNC(common,getConfigName);
private _res = _fullPath call FUNC(splitPath);
_res params ["_parentPath", "_actionName"];
+if (_useInheritance) exitWith {
+ // Only need to run for classes that have already been initialized
+ {
+ [_x, _typeNum, _fullPath] call FUNC(removeActionFromClass);
+ } forEach (GVAR(inheritedClassesAll) select {_x isKindOf _objectType});
+
+ // Find same path and actionName, and check if it's a parent class, needs to be checked for all classes
+ private _index = GVAR(inheritedActionsAll) findIf {
+ _x params ["_currentType", "", "_currentParentPath", "_currentAction"];
+
+ [_objectType isKindOf _currentType, _currentParentPath, _currentAction select 0] isEqualTo [true, _parentPath, _actionName]
+ };
+
+ // Add to exclude classes
+ if (_index != -1) then {
+ (GVAR(inheritedActionsAll) select _index select 4) pushBackUnique _objectType;
+ };
+
+ // Children of CAManBase need special treatment because of inheritedActionsMan array
+ if (_objectType isKindOf "CAManBase") then {
+ private _index = GVAR(inheritedActionsMan) findIf {
+ _x params ["", "_currentParentPath", "_currentAction"];
+
+ [_currentParentPath, _currentAction select 0] isEqualTo [_parentPath, _actionName]
+ };
+
+ // Different index because array doesn't include _objectType
+ if (_index != -1) then {
+ (GVAR(inheritedActionsMan) select _index select 3) pushBackUnique _objectType;
+ };
+ };
+};
+
private _namespace = [GVAR(ActNamespace), GVAR(ActSelfNamespace)] select _typeNum;
private _actionTrees = _namespace getOrDefault [_objectType, []];
diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf
index e4ee0d63575..2089f6b1060 100644
--- a/addons/interact_menu/functions/fnc_render.sqf
+++ b/addons/interact_menu/functions/fnc_render.sqf
@@ -38,7 +38,7 @@ if (GVAR(openedMenuType) >= 0) then {
private _closestSelection = -1;
{
_x params ["", "_sPos"];
- private _distanceFromCursor = _cursorScreenPos distance2d _sPos;
+ private _distanceFromCursor = _cursorScreenPos distance2D _sPos;
if ((_distanceFromCursor < 0.1118) && {_distanceFromCursor < _closestDistance}) then {
_closestDistance = _distanceFromCursor;
_closestSelection = _forEachIndex;
diff --git a/addons/interact_menu/functions/fnc_renderActionPoints.sqf b/addons/interact_menu/functions/fnc_renderActionPoints.sqf
index 62d29be91f4..1887a6d790e 100644
--- a/addons/interact_menu/functions/fnc_renderActionPoints.sqf
+++ b/addons/interact_menu/functions/fnc_renderActionPoints.sqf
@@ -19,8 +19,8 @@ GVAR(currentOptions) = [];
private _player = ACE_player;
-GVAR(cameraPosASL) = AGLtoASL (positionCameraToWorld [0, 0, 0]);
-GVAR(cameraDir) = (AGLtoASL (positionCameraToWorld [0, 0, 1])) vectorDiff GVAR(cameraPosASL);
+GVAR(cameraPosASL) = AGLToASL (positionCameraToWorld [0, 0, 0]);
+GVAR(cameraDir) = (AGLToASL (positionCameraToWorld [0, 0, 1])) vectorDiff GVAR(cameraPosASL);
private _fnc_renderNearbyActions = {
// Render all nearby interaction menus
@@ -97,15 +97,15 @@ private _fnc_renderSelfActions = {
// Iterate through base level class actions and render them if appropiate
private _classActions = GVAR(ActSelfNamespace) get typeOf _target;
- private _pos = if !(GVAR(useCursorMenu)) then {
- //Convert to ASL, add offset and then convert back to AGL (handles waves when over water)
- ASLtoAGL ((AGLtoASL (positionCameraToWorld [0, 0, 0])) vectorAdd GVAR(selfMenuOffset));
- } else {
+ private _pos = if (GVAR(useCursorMenu)) then {
[0.5, 0.5]
+ } else {
+ //Convert to ASL, add offset and then convert back to AGL (handles waves when over water)
+ ASLToAGL ((AGLToASL (positionCameraToWorld [0, 0, 0])) vectorAdd GVAR(selfMenuOffset));
};
{
- _action = _x;
+ private _action = _x;
[_target, _action, _pos] call FUNC(renderBaseMenu);
} forEach _classActions;
};
@@ -123,10 +123,7 @@ GVAR(collectedActionPoints) resize 0;
// Render nearby actions, unit self actions or vehicle self actions as appropiate
if (GVAR(openedMenuType) == 0) then {
if (isNull curatorCamera) then {
- if !(isNull (ACE_controlledUAV select 0)) then {
- // Render UAV self actions when in control of UAV AI
- (ACE_controlledUAV select 0) call _fnc_renderSelfActions;
- } else {
+ if (isNull (ACE_controlledUAV select 0)) then {
if (vehicle ACE_player == ACE_player) then {
if (diag_tickTime > GVAR(lastTimeSearchedActions) + 0.20) then {
// Once every 0.2 secs, collect nearby objects active and visible action points and render them
@@ -139,6 +136,10 @@ if (GVAR(openedMenuType) == 0) then {
// Render vehicle self actions when in vehicle
(vehicle ACE_player) call _fnc_renderSelfActions;
};
+ } else {
+ // Render UAV self actions when in control of UAV AI
+ (ACE_controlledUAV select 0) call _fnc_renderSelfActions;
+
};
} else {
// Render zeus actions when zeus open
@@ -160,7 +161,7 @@ if (count GVAR(collectedActionPoints) > 1) then {
private _delta = vectorNormalized ((GVAR(collectedActionPoints) select _i select 1) vectorDiff (GVAR(collectedActionPoints) select _j select 1));
// If _i is inside a cone with 20º half angle with origin on _j
- if ((_delta select 2 > 0.94) && {((GVAR(collectedActionPoints) select _i select 1) distance2d (GVAR(collectedActionPoints) select _j select 1)) < 0.1}) exitWith {
+ if ((_delta select 2 > 0.94) && {((GVAR(collectedActionPoints) select _i select 1) distance2D (GVAR(collectedActionPoints) select _j select 1)) < 0.1}) exitWith {
GVAR(collectedActionPoints) deleteAt _i;
};
};
diff --git a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf
index 9e3aaa53a92..5af5afcc7ca 100644
--- a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf
+++ b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf
@@ -46,7 +46,7 @@ if ((GVAR(openedMenuType) == 0) && {isNull (ACE_controlledUAV select 0)} && {veh
if ((_distanceToBasePoint > 1.2) && {!(_params select 4)}) exitWith {
// If distance to action is greater than 1.2 m and check isn't disabled in params, check LOS
- lineIntersects [AGLtoASL _headPos, AGLtoASL _pos, _object, ACE_player]
+ lineIntersects [AGLToASL _headPos, AGLToASL _pos, _object, ACE_player]
};
false
}) exitWith {false};
@@ -91,7 +91,7 @@ if (_activeActionTree isEqualTo []) exitWith {false};
BEGIN_COUNTER(fnc_renderMenus);
if (count _pos > 2) then {
- _sPos pushBack (((AGLtoASL _pos) vectorDiff GVAR(cameraPosASL)) vectorDotProduct GVAR(cameraDir));
+ _sPos pushBack (((AGLToASL _pos) vectorDiff GVAR(cameraPosASL)) vectorDotProduct GVAR(cameraDir));
} else {
_sPos pushBack 0;
};
diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf
index fffa5e91a7f..a1118b77b0c 100644
--- a/addons/interact_menu/functions/fnc_renderIcon.sqf
+++ b/addons/interact_menu/functions/fnc_renderIcon.sqf
@@ -27,8 +27,8 @@ if(GVAR(iconCount) > (count GVAR(iconCtrls))-1) then {
private _displayNum = [[46, 12] select visibleMap, 91919] select (uiNamespace getVariable [QGVAR(cursorMenuOpened),false]);
GVAR(iconCtrls) pushBack ((findDisplay _displayNum) ctrlCreate ["RscStructuredText", 54021 + GVAR(iconCount)]);
if (GVAR(useCursorMenu)) then {
- ((finddisplay _displayNum) displayctrl (54021 + GVAR(iconCount))) ctrlAddEventHandler ["MouseMoving", DFUNC(handleMouseMovement)];
- ((finddisplay _displayNum) displayctrl (54021 + GVAR(iconCount))) ctrlAddEventHandler ["MouseButtonDown", DFUNC(handleMouseButtonDown)];
+ ((findDisplay _displayNum) displayCtrl (54021 + GVAR(iconCount))) ctrlAddEventHandler ["MouseMoving", DFUNC(handleMouseMovement)];
+ ((findDisplay _displayNum) displayCtrl (54021 + GVAR(iconCount))) ctrlAddEventHandler ["MouseButtonDown", DFUNC(handleMouseButtonDown)];
};
};
private _ctrl = GVAR(iconCtrls) select GVAR(iconCount);
@@ -41,16 +41,16 @@ if (_iconFile isEqualTo "") then {
_text = if ([GVAR(useListMenu), GVAR(useListMenuSelf)] select GVAR(keyDownSelfAction)) then {
format ["%4", _iconFile, _iconColor, _textSettings, _text]
} else {
- format ["
%4", _iconFile, _iconColor, _textSettings, "ace_break_line" callExtension _text];
+ format ["
%4", _iconFile, _iconColor, _textSettings, ("ace" callExtension ["break_line", [_text]]) select 0];
};
[_ctrl, GVAR(iconCount), _text] call FUNC(ctrlSetParsedTextCached);
GVAR(iconCount) = GVAR(iconCount) + 1;
private _pos = if ([GVAR(useListMenu), GVAR(useListMenuSelf)] select GVAR(keyDownSelfAction)) then {
- [(_sPos select 0) - (0.0095 * SafeZoneW), (_sPos select 1) - (0.0095 * SafeZoneW), 0.20 * SafeZoneW, 0.035 * SafeZoneW]
+ [(_sPos select 0) - (0.0095 * safeZoneW), (_sPos select 1) - (0.0095 * safeZoneW), 0.20 * safeZoneW, 0.035 * safeZoneW]
} else {
- [(_sPos select 0) - (0.0750 * SafeZoneW), (_sPos select 1) - (0.0095 * SafeZoneW), 0.15 * SafeZoneW, 0.100 * SafeZoneW]
+ [(_sPos select 0) - (0.0750 * safeZoneW), (_sPos select 1) - (0.0095 * safeZoneW), 0.15 * safeZoneW, 0.100 * safeZoneW]
};
diff --git a/addons/interact_menu/functions/fnc_renderSelector.sqf b/addons/interact_menu/functions/fnc_renderSelector.sqf
index bf719299244..27170d9fa83 100644
--- a/addons/interact_menu/functions/fnc_renderSelector.sqf
+++ b/addons/interact_menu/functions/fnc_renderSelector.sqf
@@ -22,8 +22,8 @@ if(GVAR(iconCount) > (count GVAR(iconCtrls))-1) then {
private _displayNum = [[46, 12] select visibleMap,91919] select (uiNamespace getVariable [QGVAR(cursorMenuOpened),false]);
GVAR(iconCtrls) pushBack ((findDisplay _displayNum) ctrlCreate ["RscStructuredText", 54021+GVAR(iconCount)]);
if (GVAR(useCursorMenu)) then {
- ((finddisplay _displayNum) displayctrl (54021+GVAR(iconCount))) ctrlAddEventHandler ["MouseMoving", DFUNC(handleMouseMovement)];
- ((finddisplay _displayNum) displayctrl (54021+GVAR(iconCount))) ctrlAddEventHandler ["MouseButtonDown", DFUNC(handleMouseButtonDown)];
+ ((findDisplay _displayNum) displayCtrl (54021+GVAR(iconCount))) ctrlAddEventHandler ["MouseMoving", DFUNC(handleMouseMovement)];
+ ((findDisplay _displayNum) displayCtrl (54021+GVAR(iconCount))) ctrlAddEventHandler ["MouseButtonDown", DFUNC(handleMouseButtonDown)];
};
};
@@ -31,10 +31,10 @@ private _ctrl = GVAR(iconCtrls) select GVAR(iconCount);
private _pos = if (GVAR(UseListMenu)) then {
[_ctrl, GVAR(iconCount), format ["", _icon, GVAR(selectorColorHex)]] call FUNC(ctrlSetParsedTextCached);
- [(_sPos select 0)-(0.014*SafeZoneW), (_sPos select 1)-(0.014*SafeZoneW), 0.05*SafeZoneW, 0.035*SafeZoneW]
+ [(_sPos select 0)-(0.014*safeZoneW), (_sPos select 1)-(0.014*safeZoneW), 0.05*safeZoneW, 0.035*safeZoneW]
} else {
[_ctrl, GVAR(iconCount), format ["", _icon, GVAR(selectorColorHex)]] call FUNC(ctrlSetParsedTextCached);
- [(_sPos select 0)-(0.050*SafeZoneW), (_sPos select 1)-(0.014*SafeZoneW), 0.1*SafeZoneW, 0.035*SafeZoneW]
+ [(_sPos select 0)-(0.050*safeZoneW), (_sPos select 1)-(0.014*safeZoneW), 0.1*safeZoneW, 0.035*safeZoneW]
};
GVAR(iconCount) = GVAR(iconCount) + 1;
diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp
index 6ae0d4a9821..643b5448955 100644
--- a/addons/interaction/CfgVehicles.hpp
+++ b/addons/interaction/CfgVehicles.hpp
@@ -78,7 +78,7 @@ class CfgVehicles {
class ACE_AssignTeamRed {
displayName = CSTRING(AssignTeamRed);
- condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam));
+ condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam) && {assignedTeam _target != 'RED'});
statement = QUOTE([ARR_3(_target,'RED',true)] call DFUNC(joinTeam));
exceptions[] = {"isNotSwimming"};
showDisabled = 1;
@@ -86,7 +86,7 @@ class CfgVehicles {
};
class ACE_AssignTeamGreen {
displayName = CSTRING(AssignTeamGreen);
- condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam));
+ condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam) && {assignedTeam _target != 'GREEN'});
statement = QUOTE([ARR_3(_target,'GREEN',true)] call DFUNC(joinTeam));
exceptions[] = {"isNotSwimming"};
showDisabled = 1;
@@ -94,7 +94,7 @@ class CfgVehicles {
};
class ACE_AssignTeamBlue {
displayName = CSTRING(AssignTeamBlue);
- condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam));
+ condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam) && {assignedTeam _target != 'BLUE'});
statement = QUOTE([ARR_3(_target,'BLUE',true)] call DFUNC(joinTeam));
exceptions[] = {"isNotSwimming"};
showDisabled = 1;
@@ -102,14 +102,14 @@ class CfgVehicles {
};
class ACE_AssignTeamYellow {
displayName = CSTRING(AssignTeamYellow);
- condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam));
+ condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam) && {assignedTeam _target != 'YELLOW'});
statement = QUOTE([ARR_3(_target,'YELLOW',true)] call DFUNC(joinTeam));
exceptions[] = {"isNotSwimming"};
showDisabled = 1;
modifierFunction = QUOTE([ARR_3('YELLOW','PATHTOF(UI\team\team_white_ca.paa)',_this select 3)] call FUNC(modifyTeamManagementAction));
};
- class ACE_UnassignTeam {
- displayName = CSTRING(LeaveTeam);
+ class ACE_AssignTeamMain {
+ displayName = "$str_assign_main";
condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam) && {assignedTeam _target != 'MAIN'});
statement = QUOTE([ARR_3(_target,'MAIN',true)] call DFUNC(joinTeam));
exceptions[] = {"isNotSwimming"};
@@ -253,9 +253,16 @@ class CfgVehicles {
modifierFunction = QUOTE([ARR_3(assignedTeam _target,'PATHTOF(UI\team\team_management_ca.paa)',_this select 3)] call FUNC(modifyTeamManagementAction));
showDisabled = 1;
+ class ACE_remoteTeamManagement {
+ displayName = CSTRING(Squad);
+ icon = QPATHTOF(UI\team\team_management_ca.paa);
+ condition = QUOTE(GVAR(remoteTeamManagement));
+ exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting", "isNotOnLadder", "isNotRefueling"};
+ insertChildren = QUOTE(call FUNC(addSquadChildren));
+ };
class ACE_JoinTeamRed {
displayName = CSTRING(JoinTeamRed);
- condition = QUOTE(true);
+ condition = QUOTE(assignedTeam _player != 'RED');
exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting", "isNotOnLadder", "isNotRefueling"};
statement = QUOTE([ARR_3(_player,'RED',true)] call DFUNC(joinTeam));
showDisabled = 1;
@@ -263,7 +270,7 @@ class CfgVehicles {
};
class ACE_JoinTeamGreen {
displayName = CSTRING(JoinTeamGreen);
- condition = QUOTE(true);
+ condition = QUOTE(assignedTeam _player != 'GREEN');
exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting", "isNotOnLadder", "isNotRefueling"};
statement = QUOTE([ARR_3(_player,'GREEN',true)] call DFUNC(joinTeam));
showDisabled = 1;
@@ -271,7 +278,7 @@ class CfgVehicles {
};
class ACE_JoinTeamBlue {
displayName = CSTRING(JoinTeamBlue);
- condition = QUOTE(true);
+ condition = QUOTE(assignedTeam _player != 'BLUE');
exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting", "isNotOnLadder", "isNotRefueling"};
statement = QUOTE([ARR_3(_player,'BLUE',true)] call DFUNC(joinTeam));
showDisabled = 1;
@@ -279,14 +286,14 @@ class CfgVehicles {
};
class ACE_JoinTeamYellow {
displayName = CSTRING(JoinTeamYellow);
- condition = QUOTE(true);
+ condition = QUOTE(assignedTeam _player != 'YELLOW');
exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting", "isNotOnLadder", "isNotRefueling"};
statement = QUOTE([ARR_3(_player,'YELLOW',true)] call DFUNC(joinTeam));
showDisabled = 1;
modifierFunction = QUOTE([ARR_3('YELLOW','PATHTOF(UI\team\team_white_ca.paa)',_this select 3)] call FUNC(modifyTeamManagementAction));
};
- class ACE_LeaveTeam {
- displayName = CSTRING(LeaveTeam);
+ class ACE_JoinTeamMain {
+ displayName = CSTRING(JoinTeamMain);
condition = QUOTE(assignedTeam _player != 'MAIN');
exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting", "isNotOnLadder", "isNotRefueling"};
statement = QUOTE([ARR_3(_player,'MAIN',true)] call DFUNC(joinTeam));
@@ -372,6 +379,39 @@ class CfgVehicles {
};
class Car_F: Car {};
+ class Offroad_01_base_F: Car_F {
+ class GVAR(anims) {
+ class HideBackpacks {
+ positions[] = {{-1.15, -1.15, -0.2}, {1.05, -1.15, -0.2}, {1.05, -2.5, -0.2}};
+ items[] = {"B_TacticalPack_blk", "B_TacticalPack_blk", "B_Carryall_khk", "B_Carryall_khk"};
+ name = "$STR_a3_cfgvehicleclasses_backpacks0";
+ text = "$STR_a3_cfgvehicleclasses_backpacks0";
+ };
+ };
+ };
+ class Offroad_01_military_base_F: Offroad_01_base_F {};
+ class Offroad_01_armed_base_F: Offroad_01_military_base_F {
+ class GVAR(anims): GVAR(anims) {
+ class HideBackpacks: HideBackpacks {
+ positions[] = {{-1.15, -1.03, -0.8}, {1.05, -1.03, -0.8}, {1.05, -2.38, -0.8}};
+ };
+ };
+ };
+ class Offroad_01_AT_base_F: Offroad_01_military_base_F {
+ class GVAR(anims): GVAR(anims) {
+ class HideBackpacks: HideBackpacks {
+ positions[] = {{-1.15, -1.25, -0.2}, {1.05, -1.25, -0.2}, {1.05, -2.6, -0.2}};
+ };
+ };
+ };
+ class Offroad_01_military_covered_base_F: Offroad_01_military_base_F {
+ class GVAR(anims): GVAR(anims) {
+ class HideBackpacks: HideBackpacks {
+ positions[] = {{-1.15, -1, -0.27}, {1.05, -1, -0.27}, {1.05, -2.35, -0.27}};
+ };
+ };
+ };
+
class Quadbike_01_base_F: Car_F {
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
@@ -405,6 +445,45 @@ class CfgVehicles {
};
};
+ class Wheeled_APC_F;
+ class APC_Wheeled_01_base_F: Wheeled_APC_F {
+ class GVAR(anims) {
+ class showBags {
+ phase = 0;
+ selections[] = {"vhc_bags"};
+ items[] = {"B_Carryall_cbr", "B_Carryall_cbr"};
+ name = "$STR_A3_B_Carryall_cbr0";
+ text = "$STR_A3_B_Carryall_cbr0";
+ distance = 3;
+ };
+ };
+ };
+ class APC_Wheeled_02_base_F: Wheeled_APC_F {
+ class GVAR(anims);
+ };
+ class APC_Wheeled_02_base_v2_F: APC_Wheeled_02_base_F {
+ class GVAR(anims): GVAR(anims) {
+ class showBags {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['vhc_bags', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"B_Carryall_cbr"};
+ name = "$STR_A3_B_Carryall_cbr0";
+ text = "$STR_A3_B_Carryall_cbr0";
+ };
+ };
+ };
+ class APC_Wheeled_03_base_F: Wheeled_APC_F {
+ class GVAR(anims) {
+ class showBags {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['vhc_bags', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"B_Carryall_cbr", "B_Carryall_cbr"};
+ name = "$STR_A3_B_Carryall_cbr0";
+ text = "$STR_A3_B_Carryall_cbr0";
+ };
+ };
+ };
+
class Tank: LandVehicle {
class ACE_Actions {
class ACE_MainActions {
@@ -432,6 +511,82 @@ class CfgVehicles {
};
};
};
+ class Tank_F;
+ class LT_01_base_F: Tank_F {
+ class GVAR(anims) {
+ class showBags {
+ phase = 0;
+ positions[] = {"_target selectionPosition ['vhc_bags', 'FireGeometry', 'AveragePoint']"};
+ items[] = {"B_Carryall_cbr"};
+ name = "$STR_A3_B_Carryall_cbr0";
+ text = "$STR_A3_B_Carryall_cbr0";
+ };
+ class showBags2: showBags {
+ positions[] = {"_target selectionPosition ['vhc_bags2', 'FireGeometry', 'AveragePoint']"};
+ };
+ };
+ };
+
+ class APC_Tracked_01_base_F: Tank_F {
+ class GVAR(anims) {
+ class showBags {
+ phase = 0;
+ selections[] = {"vhc_bags"};
+ positions[] = {"private _pos = _target selectionPosition 'vhc_bags'; _pos set [0, -(_pos select 0)]; _pos"}; // Mirror position to other side of vehicle
+ items[] = {"B_Carryall_cbr", "B_Carryall_cbr", "B_Carryall_cbr", "B_Carryall_cbr", "B_Carryall_cbr"};
+ name = "$STR_A3_B_Carryall_cbr0";
+ text = "$STR_A3_B_Carryall_cbr0";
+ };
+ };
+ };
+ class B_APC_Tracked_01_base_F: APC_Tracked_01_base_F {};
+ class B_APC_Tracked_01_CRV_F: B_APC_Tracked_01_base_F {
+ class GVAR(anims): GVAR(anims) {
+ class showBags: showBags {
+ items[] = {"B_Carryall_cbr", "B_Carryall_cbr", "B_Carryall_cbr", "B_Carryall_cbr"};
+ };
+ };
+ };
+
+ class APC_Tracked_02_base_F: Tank_F {
+ class GVAR(anims) {
+ class showBags {
+ phase = 0;
+ selections[] = {"vhc_bags"};
+ items[] = {"B_Carryall_cbr", "B_Carryall_cbr", "B_Carryall_cbr"};
+ name = "$STR_A3_B_Carryall_cbr0";
+ text = "$STR_A3_B_Carryall_cbr0";
+ };
+ };
+ };
+
+ class APC_Tracked_03_base_F: Tank_F {
+ class GVAR(anims) {
+ class showBags {
+ phase = 0;
+ selections[] = {"vhc_bags"};
+ items[] = {"B_Carryall_cbr", "B_Carryall_cbr"};
+ name = "$STR_A3_B_Carryall_cbr0";
+ text = "$STR_A3_B_Carryall_cbr0";
+ };
+ };
+ };
+
+ class MBT_01_base_F: Tank_F {
+ class GVAR(anims);
+ };
+ class B_MBT_01_base_F: MBT_01_base_F {};
+ class B_MBT_01_cannon_F: B_MBT_01_base_F {
+ class GVAR(anims): GVAR(anims) {
+ class showBags {
+ phase = 0;
+ selections[] = {"vhc_bags"};
+ items[] = {"B_Carryall_cbr", "B_Carryall_cbr", "B_Carryall_cbr", "B_Carryall_cbr", "B_Carryall_cbr", "B_Carryall_cbr"};
+ name = "$STR_A3_B_Carryall_cbr0";
+ text = "$STR_A3_B_Carryall_cbr0";
+ };
+ };
+ };
class Motorcycle: LandVehicle {
class ACE_Actions {
diff --git a/addons/interaction/RscTitles.hpp b/addons/interaction/RscTitles.hpp
index ec7856c62cb..d2f2f0ef92c 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;
diff --git a/addons/interaction/XEH_PREP.hpp b/addons/interaction/XEH_PREP.hpp
index 554f9037047..63053fd5122 100644
--- a/addons/interaction/XEH_PREP.hpp
+++ b/addons/interaction/XEH_PREP.hpp
@@ -13,6 +13,7 @@ PREP(showMouseHint);
PREP(hideMouseHint);
// interaction with units
+PREP(addSquadChildren);
PREP(canInteractWithCivilian);
PREP(canInteractWithVehicleCrew);
PREP(getDown);
@@ -54,4 +55,5 @@ PREP(push);
// misc
PREP(canFlip);
+PREP(initAnimActions);
PREP(replaceTerrainObject);
diff --git a/addons/interaction/XEH_postInit.sqf b/addons/interaction/XEH_postInit.sqf
index f461e2a770e..d341c27fd38 100644
--- a/addons/interaction/XEH_postInit.sqf
+++ b/addons/interaction/XEH_postInit.sqf
@@ -149,11 +149,20 @@ GVAR(isOpeningDoor) = false;
["isNotOnLadder", {getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> animationState (_this select 0) >> "ACE_isLadder") != 1}] call EFUNC(common,addCanInteractWithCondition);
["CBA_settingsInitialized", {
+ TRACE_2("settingsInitialized",GVAR(disableNegativeRating),GVAR(enableAnimActions));
+
if (GVAR(disableNegativeRating)) then {
player addEventHandler ["HandleRating", {
(_this select 1) max 0
}];
};
+
+ if (!GVAR(enableAnimActions)) exitWith {};
+
+ // Don't add inherited anim actions (but actions are added to child classes)
+ {
+ [_x, "InitPost", LINKFUNC(initAnimActions), true, [], true] call CBA_fnc_addClassEventHandler;
+ } forEach (keys (uiNamespace getVariable QGVAR(animActionsClasses)));
}] call CBA_fnc_addEventHandler;
{
@@ -162,8 +171,8 @@ GVAR(isOpeningDoor) = false;
}] call CBA_fnc_addPlayerEventHandler;
} forEach ["loadout", "weapon"];
-
// add "Take _weapon_" action to dropped weapons
+//IGNORE_PRIVATE_WARNING ["_target", "_player"];
private _action = [
// action display name will be overwritten in modifier function
QGVAR(takeWeapon), "take", "\A3\ui_f\data\igui\cfg\actions\take_ca.paa",
@@ -172,7 +181,7 @@ private _action = [
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")]];
+ _actionData set [1, format [localize "STR_ACTION_TAKE_BAG", getText (configFile >> "CfgWeapons" >> weaponCargo _target select 0 >> "displayName")]];
}
] call EFUNC(interact_menu,createAction);
diff --git a/addons/interaction/XEH_preInit.sqf b/addons/interaction/XEH_preInit.sqf
index c5873bcfc98..ec73b62b1b9 100644
--- a/addons/interaction/XEH_preInit.sqf
+++ b/addons/interaction/XEH_preInit.sqf
@@ -16,6 +16,7 @@ DFUNC(repair_Statement) = { // moved from config because of build problems
};
if (hasInterface) then {
+ GVAR(initializedAnimClasses) = [];
GVAR(replaceTerrainModels) = createHashMapFromArray call (uiNamespace getVariable QGVAR(cacheReplaceTerrainModels));
};
diff --git a/addons/interaction/XEH_preStart.sqf b/addons/interaction/XEH_preStart.sqf
index 331b5c6d36c..39da54b3b58 100644
--- a/addons/interaction/XEH_preStart.sqf
+++ b/addons/interaction/XEH_preStart.sqf
@@ -23,3 +23,13 @@ private _cacheReplaceTerrainModels = createHashMap;
} forEach _replaceTerrainClasses;
uiNamespace setVariable [QGVAR(cacheReplaceTerrainModels), compileFinal str _cacheReplaceTerrainModels];
+
+
+// Cache classes with anim actions
+private _animActionsClasses = (QUOTE(isClass (_x >> QQGVAR(anims)) && {!isClass (inheritsFrom _x >> QQGVAR(anims))}) configClasses (configFile >> "CfgVehicles"));
+_animActionsClasses = _animActionsClasses apply { configName _x };
+_animActionsClasses = _animActionsClasses select {
+ private _class = _x;
+ (_animActionsClasses findIf {(_class != _x) && {_class isKindOf _x}}) == -1 // filter classes that already have a parent in the list
+};
+uiNamespace setVariable [QGVAR(animActionsClasses), compileFinal (_animActionsClasses createHashMapFromArray [])];
diff --git a/addons/interaction/dev/initReplaceTerrainCursorObject.sqf b/addons/interaction/dev/initReplaceTerrainCursorObject.sqf
index a1708be423d..6dadf678b7c 100644
--- a/addons/interaction/dev/initReplaceTerrainCursorObject.sqf
+++ b/addons/interaction/dev/initReplaceTerrainCursorObject.sqf
@@ -47,12 +47,12 @@ DFUNC(replaceTerrainModelsAdd) = {
) then {
// wait while server replaces object, then init dragging on all clients
[{
- if (typeOf cursorObject == "") exitwith {};
- [cursorObject, {
- if !hasInterface exitWith {};
- [_this, true] call EFUNC(dragging,setDraggable);
- [_this, true] call EFUNC(dragging,setCarryable);
- }] remoteExec ["call", 0];
+ private _object = cursorObject;
+
+ if (isNull _object) exitWith {};
+
+ [_object, true, nil, nil, nil, true] call EFUNC(dragging,setCarryable);
+ [_object, true, nil, nil, nil, true] call EFUNC(dragging,setDraggable);
}, [], 1] call CBA_fnc_waitAndExecute;
};
true
diff --git a/addons/interaction/functions/fnc_addPassengersActions.sqf b/addons/interaction/functions/fnc_addPassengersActions.sqf
index 50b0d98a21c..4a88485a3f1 100644
--- a/addons/interaction/functions/fnc_addPassengersActions.sqf
+++ b/addons/interaction/functions/fnc_addPassengersActions.sqf
@@ -41,6 +41,7 @@ private _icon = "";
_icon = QPATHTOEF(captives,UI\handcuff_ca.paa);
};
+ //IGNORE_PRIVATE_WARNING ["_target"];
_actions pushBack [
[
str _unit,
diff --git a/addons/interaction/functions/fnc_addSquadChildren.sqf b/addons/interaction/functions/fnc_addSquadChildren.sqf
new file mode 100644
index 00000000000..a34c2e884c3
--- /dev/null
+++ b/addons/interaction/functions/fnc_addSquadChildren.sqf
@@ -0,0 +1,52 @@
+#include "..\script_component.hpp"
+/*
+ * Author: PabstMirror
+ * Gets the squad child actions
+ *
+ * Arguments:
+ * 1: Player
+ *
+ * Return Value:
+ * Children actions
+ *
+ * Example:
+ * [player, player] call ace_interaction_fnc_addSquadChildren
+ *
+ * Public: No
+ */
+
+params ["", "_player"];
+
+private _fnc_color = {
+ (switch (toUpper _this) do {
+ case "RED": {missionNamespace getVariable [QEGVAR(nametags,nametagColorRed), [221, 0, 0]]};
+ case "GREEN": {missionNamespace getVariable [QEGVAR(nametags,nametagColorGreen), [0, 221, 0]]};
+ case "BLUE": {missionNamespace getVariable [QEGVAR(nametags,nametagColorBlue), [0, 0, 221]]};
+ case "YELLOW": {missionNamespace getVariable [QEGVAR(nametags,nametagColorYellow), [221, 221, 0]]};
+ default {missionNamespace getVariable [QEGVAR(nametags,nametagColorMain), [255, 255, 255]]};
+ }) call BIS_fnc_colorRGBtoHTML
+};
+
+private _units = (units group _player) - [_player];
+
+//IGNORE_PRIVATE_WARNING ["_target"];
+private _subActions = [];
+_subActions pushBack (["drop", localize "str_a3_endgame_notifications_title_drop", "\a3\ui_f\data\igui\cfg\actions\ico_off_ca.paa",
+ {[_target] joinSilent grpNull}, {true}] call EFUNC(interact_menu,createAction));
+
+{
+ private _icon = [QPATHTOF(UI\team\team_white_ca.paa), _x call _fnc_color];
+ private _name = localize format ["str_assign_%1", _x];
+ _subActions pushBack ([_x, _name, _icon,
+ {[_target, _this#2] call FUNC(joinTeam)}, {assignedTeam _target != _this#2}, {}, _x] call EFUNC(interact_menu,createAction));
+} forEach ["RED", "GREEN", "BLUE", "YELLOW", "MAIN"];
+
+private _actions = _units apply {
+ private _unit = _x;
+ private _icon = [QPATHTOF(UI\team\team_white_ca.paa), (assignedTeam _unit) call _fnc_color];
+ private _actionUnit = [hashValue _x, [_x, true] call EFUNC(common,getName), _icon, {}, {true}] call EFUNC(interact_menu,createAction);
+
+ [_actionUnit, _subActions apply { [_x, [], _unit] }, _unit]
+};
+
+_actions
diff --git a/addons/interaction/functions/fnc_canInteractWithVehicleCrew.sqf b/addons/interaction/functions/fnc_canInteractWithVehicleCrew.sqf
index a314a8b601a..e8b7e47d754 100644
--- a/addons/interaction/functions/fnc_canInteractWithVehicleCrew.sqf
+++ b/addons/interaction/functions/fnc_canInteractWithVehicleCrew.sqf
@@ -11,13 +11,16 @@
* Unit can interact with vehicle crew
*
* Example:
- * [cursorObject, player] call ace_interaction_fnc_canInteractWithVehicleCrew
+ * [player, cursorObject] call ace_interaction_fnc_canInteractWithVehicleCrew
*
* Public: No
*/
params ["_player", "_vehicle"];
+if (GVAR(interactWithEnemyCrew) == 2) exitWith { true };
+if ((GVAR(interactWithEnemyCrew) == 1) && {_vehicle isKindOf "StaticWeapon"}) exitWith { true };
+
private _crew = crew _vehicle;
// If vehicle is empty, quit
diff --git a/addons/interaction/functions/fnc_doRemoteControl.sqf b/addons/interaction/functions/fnc_doRemoteControl.sqf
index a2ec19b1801..d728190b3e3 100644
--- a/addons/interaction/functions/fnc_doRemoteControl.sqf
+++ b/addons/interaction/functions/fnc_doRemoteControl.sqf
@@ -13,6 +13,7 @@
*
* Public: No
*/
+//IGNORE_PRIVATE_WARNING ["_target"];
private _units = curatorSelected select 0;
private _index = _units findIf {
diff --git a/addons/interaction/functions/fnc_getVehiclePos.sqf b/addons/interaction/functions/fnc_getVehiclePos.sqf
index ce2ce9377b7..d90bc228d2d 100644
--- a/addons/interaction/functions/fnc_getVehiclePos.sqf
+++ b/addons/interaction/functions/fnc_getVehiclePos.sqf
@@ -14,7 +14,7 @@
*
* Public: No
*/
-// IGNORE_PRIVATE_WARNING(_target);
+//IGNORE_PRIVATE_WARNING ["_target"];
private _bb = boundingBoxReal _target;
(_bb select 0) params ["_bbX", "_bbY", "_bbZ"];
diff --git a/addons/interaction/functions/fnc_getWeaponAttachmentsActions.sqf b/addons/interaction/functions/fnc_getWeaponAttachmentsActions.sqf
index c771589904f..e91a027068c 100644
--- a/addons/interaction/functions/fnc_getWeaponAttachmentsActions.sqf
+++ b/addons/interaction/functions/fnc_getWeaponAttachmentsActions.sqf
@@ -1,6 +1,6 @@
#include "..\script_component.hpp"
/*
- * Author: mharis001, Dystopian
+ * Author: mharis001, Dystopian, PabstMirror, johnb43
* Returns children actions for weapon attachment switching.
*
* Arguments:
@@ -21,48 +21,115 @@ params ["_unit"];
params ["_unit"];
private _currentWeapon = currentWeapon _unit;
- if (_currentWeapon isEqualTo "") exitWith {[]};
- private _weaponItems = _unit weaponAccessories _currentWeapon;
+
+ if (_currentWeapon == "") exitWith {[]};
+
private _cfgWeapons = configFile >> "CfgWeapons";
- private _actions = [];
+ private _weaponItems = _unit weaponAccessories _currentWeapon;
- // "attach" actions
- private _items = _unit call EFUNC(common,uniqueItems);
- private _compatibleItems = _currentWeapon call CBA_fnc_compatibleItems;
- {
- private _config = _cfgWeapons >> _x;
- private _name = format [LLSTRING(weaponAttachmentsAttach), getText (_config >> "displayName")];
- private _picture = getText (_config >> "picture");
- private _type = getNumber (_config >> "itemInfo" >> "type");
- private _oldAttachment = _weaponItems select ([TYPE_MUZZLE, TYPE_FLASHLIGHT, TYPE_OPTICS, TYPE_BIPOD] find _type);
-
- private _action = [
- _x, _name, _picture,
- LINKFUNC(switchWeaponAttachment),
- {true},
- {},
- [_currentWeapon, _x, _oldAttachment]
- ] call EFUNC(interact_menu,createAction);
- _actions pushBack [_action, [], _unit];
- } forEach ((_items arrayIntersect _compatibleItems) - _weaponItems);
-
- // "detach" actions
- {
- if (_x isEqualTo "") then {continue};
+ // Get current weapon attachments, as well as compatible attachments in inventory
+ private _allAttachments = (+_weaponItems) - [""];
+ _allAttachments append ((_unit call EFUNC(common,uniqueItems)) arrayIntersect (compatibleItems _currentWeapon));
+ (_allAttachments arrayIntersect _allAttachments) apply {
private _config = _cfgWeapons >> _x;
- private _name = format [LLSTRING(weaponAttachmentsDetach), getText (_config >> "displayName")];
+ private _name = getText (_config >> "displayName");
private _picture = getText (_config >> "picture");
- private _action = [
- _x, _name, _picture,
- LINKFUNC(switchWeaponAttachment),
- {true},
- {},
- [_currentWeapon, "", _x]
- ] call EFUNC(interact_menu,createAction);
- _actions pushBack [_action, [], _unit];
- } forEach _weaponItems;
-
- _actions
+ [
+ [
+ _x,
+ _name,
+ _picture,
+ {},
+ {true},
+ {
+ params ["", "_unit", "_args"];
+ _args params ["_attachment", "_name", "_picture", "_weaponItems", "_currentWeapon"];
+
+ private _cfgWeapons = configFile >> "CfgWeapons";
+ private _attachmentNotOnGun = !(_attachment in _weaponItems);
+ private _actions = [];
+
+ // "attach" action
+ if (_attachmentNotOnGun && {[_unit, _attachment] call EFUNC(common,hasItem)}) then {
+ private _type = getNumber (_cfgWeapons >> _attachment >> "itemInfo" >> "type");
+ private _currentAttachment = _weaponItems select ([TYPE_MUZZLE, TYPE_FLASHLIGHT, TYPE_OPTICS, TYPE_BIPOD] find _type);
+
+ _actions pushBack [
+ [
+ QGVAR(attach_) + _attachment,
+ LLSTRING(weaponAttachmentsAttach),
+ _picture,
+ LINKFUNC(switchWeaponAttachment),
+ {true},
+ {},
+ [_currentWeapon, _attachment, _currentAttachment]
+ ] call EFUNC(interact_menu,createAction),
+ [],
+ _unit
+ ];
+ };
+
+ // Don't show interaction with attachments that aren't on the current weapon
+ if (_attachmentNotOnGun) exitWith {_actions};
+
+ // "detach" action
+ _actions pushBack [
+ [
+ QGVAR(detach_) + _attachment,
+ LLSTRING(weaponAttachmentsDetach),
+ _picture,
+ LINKFUNC(switchWeaponAttachment),
+ {true},
+ {},
+ [_currentWeapon, "", _attachment]
+ ] call EFUNC(interact_menu,createAction),
+ [],
+ _unit
+ ];
+
+ private _CBA_PIPItems = configFile >> "CBA_PIPItems";
+
+ // "switch" action
+ {
+ // Ignore 2D scopes when using a PIP scope (e.g. CUP uses this)
+ if (getText (_CBA_PIPItems >> _x) == _attachment) then {
+ continue;
+ };
+
+ private _config = _cfgWeapons >> _x;
+ private _modeName = getText (_config >> "MRT_SwitchItemHintText");
+
+ if (_modeName == "") then {
+ _modeName = getText (_config >> "displayName");
+ };
+
+ _actions pushBack [
+ [
+ QGVAR(switch_) + _x,
+ format ["%1: %2", localize "str_sensortype_switch", _modeName],
+ getText (_config >> "picture"),
+ {
+ params ["", "_unit", "_actionParams"];
+ _actionParams params ["_weapon", "_newAttachment", "_oldAttachment"];
+ [_unit, _weapon, _oldAttachment, _newAttachment] call EFUNC(common,switchAttachmentMode);
+ },
+ {true},
+ {},
+ [_currentWeapon, _x, _attachment]
+ ] call EFUNC(interact_menu,createAction),
+ [],
+ _unit
+ ];
+ } forEach ((_attachment call CBA_fnc_switchableAttachments) - [_attachment]); // Don't allow switching to current mode
+
+ _actions
+ },
+ [_x, _name, _picture, _weaponItems, _currentWeapon]
+ ] call EFUNC(interact_menu,createAction),
+ [],
+ _unit
+ ]
+ } // return
}, _unit, QGVAR(weaponAttachmentsActions), 5, QGVAR(clearWeaponAttachmentsActionsCache)] call EFUNC(common,cachedCall);
diff --git a/addons/interaction/functions/fnc_getWeaponPos.sqf b/addons/interaction/functions/fnc_getWeaponPos.sqf
index 85cb3dc0076..429a012ec4d 100644
--- a/addons/interaction/functions/fnc_getWeaponPos.sqf
+++ b/addons/interaction/functions/fnc_getWeaponPos.sqf
@@ -14,7 +14,7 @@
*
* Public: No
*/
-// IGNORE_PRIVATE_WARNING(_target);
+//IGNORE_PRIVATE_WARNING ["_target"];
private _weaponDir = _target weaponDirection currentWeapon _target;
private _refSystem = _weaponDir call EFUNC(common,createOrthonormalReference);
diff --git a/addons/interaction/functions/fnc_initAnimActions.sqf b/addons/interaction/functions/fnc_initAnimActions.sqf
new file mode 100644
index 00000000000..e47f80008b8
--- /dev/null
+++ b/addons/interaction/functions/fnc_initAnimActions.sqf
@@ -0,0 +1,202 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Dystopian
+ * Initializes object interactions based on animations.
+ *
+ * Arguments:
+ * 0: Target
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * cursorObject call ace_interaction_fnc_initAnimActions
+ *
+ * Public: No
+ */
+
+params ["_object"];
+
+private _class = typeOf _object;
+
+if (_class in GVAR(initializedAnimClasses)) exitWith {};
+
+GVAR(initializedAnimClasses) pushBack _class;
+
+private _statement = {
+ params ["_target", "_player", "_params"];
+ _params params ["_anim", "_phase", "_duration", "_text"];
+ TRACE_5("statement",_target,_player,_anim,_phase,_duration);
+
+ [
+ _duration,
+ [_target, _player, _anim, _phase],
+ {
+ (_this select 0) params ["_target", "_player", "_anim", "_phase"];
+
+ private _items = _target getVariable [
+ format [QGVAR(animsItems_%1), _anim],
+ getArray (configOf _target >> QGVAR(anims) >> _anim >> "items")
+ ];
+
+ // If 1 object was spawned in, consider it a success
+ private _success = false;
+
+ if (_items isNotEqualTo []) then {
+ if (_items isEqualType "") then {
+ _items = [_items];
+ };
+
+ private _weaponHolder = objNull;
+
+ {
+ private _type = (_x call EFUNC(common,getItemType)) select 0;
+
+ if (_type == "") then {
+ private _emptyPosAGL = [];
+
+ // This covers testing vehicle stability and finding a safe position
+ for "_i" from 1 to 3 do {
+ _emptyPosAGL = [_target, _x, _player] call EFUNC(common,findUnloadPosition);
+
+ if (_emptyPosAGL isNotEqualTo []) exitWith {};
+ };
+
+ // If still no valid position, try the next item
+ if (_emptyPosAGL isEqualTo []) then {
+ [LELSTRING(common,NoRoomToUnload)] call EFUNC(common,displayTextStructured);
+
+ continue;
+ };
+
+ private _object = createVehicle [_x, _emptyPosAGL, [], 0, "CAN_COLLIDE"];
+
+ if (!isNull _object) then {
+ // Prevent items from taking damage when unloaded
+ [_object, "blockDamage", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
+ [EFUNC(common,statusEffect_set), [_object, "blockDamage", QUOTE(ADDON), false], 2] call CBA_fnc_waitAndExecute;
+
+ _success = true;
+ } else {
+ WARNING_1("Failed to create object of type '%1'",_x);
+ };
+
+ continue;
+ };
+
+ // Functions/code below are guaranteed to spawn in objects
+ _success = true;
+
+ // getItemType considers backpacks as weapons, so handle them first
+ if (getNumber (configFile >> "CfgVehicles" >> _x >> "isBackpack") == 1) then {
+ if (backpack _player == "") then {
+ _player addBackpackGlobal _x;
+ } else {
+ if (isNull _weaponHolder) then {
+ _weaponHolder = nearestObject [_player, "WeaponHolder"];
+
+ if (isNull _weaponHolder || {_player distance _weaponHolder > 2}) then {
+ _weaponHolder = createVehicle ["GroundWeaponHolder", [0, 0, 0], [], 0, "NONE"];
+ _weaponHolder setPosASL getPosASL _player;
+ };
+ };
+
+ _weaponHolder addBackpackCargoGlobal [_x, 1];
+ };
+
+ continue;
+ };
+
+ switch (_type) do {
+ case "weapon": {
+ [_player, _x, true] call CBA_fnc_addWeapon;
+ };
+ case "item": {
+ [_player, _x, true] call CBA_fnc_addItem;
+ };
+ case "magazine": {
+ [_player, _x, -1, true] call CBA_fnc_addMagazine;
+ };
+ };
+ } forEach _items;
+ } else {
+ [LELSTRING(common,disabled)] call EFUNC(common,displayTextStructured);
+ };
+
+ if (!_success) exitWith {};
+
+ _target animate [_anim, _phase, true];
+ },
+ {},
+ _text,
+ {
+ (_this select 0) params ["_target", "", "_anim", "_phase"];
+
+ _target animationPhase _anim != _phase
+ },
+ ["isNotSwimming"]
+ ] call EFUNC(common,progressBar);
+};
+
+private _condition = {
+ params ["_target", "_player", "_params"];
+ _params params ["_anim", "_phase"];
+
+ _target animationPhase _anim != _phase
+ && {[_player, _target, ["isNotSwimming"]] call EFUNC(common,canInteractWith)}
+};
+
+private _config = configOf _object;
+
+{
+ private _animConfig = _x;
+ private _anim = configName _animConfig;
+
+ private _animationSourcesConfig = _config >> "AnimationSources" >> _anim;
+
+ if !(
+ isClass _animationSourcesConfig // anim exist
+ && {0 != [_animationSourcesConfig >> "scope", "NUMBER", 1] call CBA_fnc_getConfigEntry} // anim not hidden
+ && {isNumber (_animationSourcesConfig >> "initPhase")} // anim correct (some CUP anims are inherited and cleared)
+ && {0 != [_animConfig >> "enabled", "NUMBER", 1] call CBA_fnc_getConfigEntry} // anim enabled
+ ) then {continue};
+
+ private _positions = [];
+ {
+ if (_x isEqualType "") then {
+ _positions pushBack compile _x;
+ } else {
+ _positions pushBack _x;
+ };
+ } forEach getArray (_animConfig >> "positions");
+
+ _positions append getArray (_animConfig >> "selections");
+
+ if (_positions isEqualTo []) then {
+ ERROR_2("No action position for _class %1 anim %2",_class,_anim);
+ continue;
+ };
+
+ private _phase = [_animConfig >> "phase", "NUMBER", 1] call CBA_fnc_getConfigEntry;
+ private _name = [_animConfig >> "name", "TEXT", localize "str_a3_cfgactions_unmountitem0"] call CBA_fnc_getConfigEntry;
+ private _icon = [_animConfig >> "icon", "TEXT", "\A3\ui_f\data\igui\cfg\actions\take_ca.paa"] call CBA_fnc_getConfigEntry;
+ private _duration = [_animConfig >> "duration", "NUMBER", 10] call CBA_fnc_getConfigEntry;
+ private _text = getText (_animConfig >> "text");
+ private _distance = [_animConfig >> "distance", "NUMBER", 2] call CBA_fnc_getConfigEntry;
+
+ {
+ private _action = [
+ format [QGVAR(anim_%1_%2), _anim, _forEachIndex],
+ _name,
+ _icon,
+ _statement,
+ _condition,
+ {},
+ [_anim, _phase, _duration, _text],
+ _x,
+ _distance
+ ] call EFUNC(interact_menu,createAction);
+ [_class, 0, [], _action] call EFUNC(interact_menu,addActionToClass);
+ TRACE_3("add anim",_class,_anim,_x);
+ } forEach _positions;
+} forEach configProperties [_config >> QGVAR(anims), "isClass _x"];
diff --git a/addons/interaction/functions/fnc_joinTeam.sqf b/addons/interaction/functions/fnc_joinTeam.sqf
index 977e9022229..0d1928eb2fc 100644
--- a/addons/interaction/functions/fnc_joinTeam.sqf
+++ b/addons/interaction/functions/fnc_joinTeam.sqf
@@ -22,16 +22,8 @@ params ["_unit", "_team", ["_displayHint", false, [false]]];
_unit assignTeam _team;
// display message
-if (_unit == ACE_player) then {
- private _message = "";
-
- if (_team == "MAIN") then {
- _message = localize LSTRING(LeftTeam);
- } else {
- _team = localize format [LSTRING(Team%1), _team];
- _message = format [localize LSTRING(JoinedTeam), _team];
- };
- if (_displayHint) then {
- [_message] call EFUNC(common,displayTextStructured);
- };
+if (_displayHint && {_unit == ACE_player}) then {
+ private _team = localize format ["str_team_%1", _team];
+ private _message = format [LLSTRING(JoinedTeam), _team];
+ [_message] call EFUNC(common,displayTextStructured);
};
diff --git a/addons/interaction/functions/fnc_modifyJoinGroupAction.sqf b/addons/interaction/functions/fnc_modifyJoinGroupAction.sqf
index eef77dfd37d..9eeda7ee3c4 100644
--- a/addons/interaction/functions/fnc_modifyJoinGroupAction.sqf
+++ b/addons/interaction/functions/fnc_modifyJoinGroupAction.sqf
@@ -20,7 +20,7 @@
params ["_target", "_player", "", "_actionData"];
-private _actionText = format ["%1: %2", localize LSTRING(JoinGroup), groupID group _target];
+private _actionText = format ["%1: %2", localize LSTRING(JoinGroup), groupId group _target];
TRACE_3("",_target,group _target,_actionText);
_actionData set [1, _actionText];
diff --git a/addons/interaction/functions/fnc_openDoor.sqf b/addons/interaction/functions/fnc_openDoor.sqf
index 11b9c67c918..f83cc88b1ec 100644
--- a/addons/interaction/functions/fnc_openDoor.sqf
+++ b/addons/interaction/functions/fnc_openDoor.sqf
@@ -89,9 +89,9 @@ GVAR(usedScrollWheel) = false;
};
// this allows for holding the door in it's current state.
- if (CBA_missionTime > _time && {diag_frameno > _frame}) then {
+ if (CBA_missionTime > _time && {diag_frameNo > _frame}) then {
GVAR(usedScrollWheel) = true;
};
// do incremental door opening
{_house animate [_x, GVAR(doorTargetPhase)]} forEach _animations;
-}, 0.1, [_house, _animations, getPosASL ACE_player, CBA_missionTime + 0.2, diag_frameno + 2, _door]] call CBA_fnc_addPerFrameHandler;
+}, 0.1, [_house, _animations, getPosASL ACE_player, CBA_missionTime + 0.2, diag_frameNo + 2, _door]] call CBA_fnc_addPerFrameHandler;
diff --git a/addons/interaction/functions/fnc_passMagazine.sqf b/addons/interaction/functions/fnc_passMagazine.sqf
index 87500785026..757700ce8ba 100644
--- a/addons/interaction/functions/fnc_passMagazine.sqf
+++ b/addons/interaction/functions/fnc_passMagazine.sqf
@@ -34,7 +34,7 @@ private _magToPassIndex = 0;
_magToPass = _x;
_magToPassIndex = _forEachIndex;
};
-} foreach _filteredMags;
+} forEach _filteredMags;
//remove the magazine from _player and add it to _target
_magToPass params ["_magToPassClassName", "_magToPassAmmoCount"];
diff --git a/addons/interaction/functions/fnc_renameGroup.sqf b/addons/interaction/functions/fnc_renameGroup.sqf
index 4ffff5771a1..8ad606a1eb1 100644
--- a/addons/interaction/functions/fnc_renameGroup.sqf
+++ b/addons/interaction/functions/fnc_renameGroup.sqf
@@ -20,12 +20,12 @@ params [
["_group", grpNull, [grpNull]],
["_newName", "", [""]]
];
-if (_newName isEqualTo (groupID _group)) exitWith {true};
+if (_newName isEqualTo (groupId _group)) exitWith {true};
private _lowerName = toLower _newName; // Case insensitive name search
private _nameAlreadyTaken = allGroups findIf {
side _x isEqualTo side _group
- && {_lowerName isEqualTo toLower (groupID _x)}
+ && {_lowerName isEqualTo toLower (groupId _x)}
&& {_group != _x}
} != -1;
diff --git a/addons/interaction/functions/fnc_renameGroupUI.sqf b/addons/interaction/functions/fnc_renameGroupUI.sqf
index 5d891b0cf8e..9e0973327da 100644
--- a/addons/interaction/functions/fnc_renameGroupUI.sqf
+++ b/addons/interaction/functions/fnc_renameGroupUI.sqf
@@ -21,7 +21,7 @@
private _display = findDisplay 46 createDisplay QGVAR(groupNameDisplay);
private _textCtrl = _display displayCtrl 451;
- _textCtrl ctrlSetText (groupID group _unit);
+ _textCtrl ctrlSetText (groupId group _unit);
_display setVariable [QGVAR(renamedGroup), group _unit];
_display displayAddEventHandler ["Unload", {
params ["_display", "_exitCode"];
diff --git a/addons/interaction/functions/fnc_switchWeaponAttachment.sqf b/addons/interaction/functions/fnc_switchWeaponAttachment.sqf
index aaefb3315ed..6fede349624 100644
--- a/addons/interaction/functions/fnc_switchWeaponAttachment.sqf
+++ b/addons/interaction/functions/fnc_switchWeaponAttachment.sqf
@@ -4,9 +4,12 @@
* Switches weapon attachment.
*
* Arguments:
- * 0: Target
- * 1: Player (not used)
+ * 0: Target (not used)
+ * 1: Player
* 2: Action params
+ * - 0: Weapon
+ * - 1: New Attachment
+ * - 2: Old Attachment
*
* Return Value:
* None
@@ -17,11 +20,13 @@
* Public: No
*/
-params ["_unit", "", "_actionParams"];
+params ["", "_unit", "_actionParams"];
_actionParams params ["_weapon", "_newAttachment", "_oldAttachment"];
TRACE_3("Switching attachment",_weapon,_newAttachment,_oldAttachment);
-[_unit, "Gear"] call EFUNC(common,doGesture);
+private _currWeaponType = [_unit, _weapon] call EFUNC(common,getWeaponIndex);
+
+if (_currWeaponType == -1) exitWith {};
private _addNew = _newAttachment isNotEqualTo "";
private _removeOld = _oldAttachment isNotEqualTo "";
@@ -38,22 +43,33 @@ if (_removeOld && {!([_unit, _oldAttachment] call CBA_fnc_canAddItem)}) exitWith
};
};
+[_unit, "Gear"] call EFUNC(common,doGesture);
+
if (_removeOld) then {
[{
- params ["_unit", "_weapon", "_oldAttachment"];
- switch (_weapon) do {
- case (primaryWeapon _unit): {_unit removePrimaryWeaponItem _oldAttachment;};
- case (handgunWeapon _unit): {_unit removeHandgunItem _oldAttachment;};
- default {_unit removeSecondaryWeaponItem _oldAttachment;};
+ params ["_unit", "_currWeaponType", "_oldAttachment"];
+
+ switch (_currWeaponType) do {
+ case 0: {_unit removePrimaryWeaponItem _oldAttachment};
+ case 1: {_unit removeSecondaryWeaponItem _oldAttachment};
+ case 2: {_unit removeHandgunItem _oldAttachment};
+ default {};
};
+
_unit addItem _oldAttachment;
- }, [_unit, _weapon, _oldAttachment], 0.3] call CBA_fnc_waitAndExecute;
+ }, [_unit, _currWeaponType, _oldAttachment], 0.3] call CBA_fnc_waitAndExecute;
};
if (!_addNew) exitWith {};
[{
params ["_unit", "_weapon", "_newAttachment"];
+
_unit addWeaponItem [_weapon, _newAttachment];
+
+ if (_unit != ACE_player) exitWith {};
+
[[getText (configFile >> "CfgWeapons" >> _newAttachment >> "picture"), 4], true] call CBA_fnc_notify;
+
+ playSound "click";
}, [_unit, _weapon, _newAttachment], 1] call CBA_fnc_waitAndExecute;
diff --git a/addons/interaction/groupRename_GUI.hpp b/addons/interaction/groupRename_GUI.hpp
index 20684b0e463..977b9b3efda 100644
--- a/addons/interaction/groupRename_GUI.hpp
+++ b/addons/interaction/groupRename_GUI.hpp
@@ -1,4 +1,4 @@
-#define FONT_H (((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)
+#define FONT_H (((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25) * 1)
#define FONT_W (FONT_H / pixelH * pixelW)
#define GAP_W (pixelW * 2)
#define GAP_H (pixelH * 2)
diff --git a/addons/interaction/initSettings.inc.sqf b/addons/interaction/initSettings.inc.sqf
index 2cefb162a76..f634b44313f 100644
--- a/addons/interaction/initSettings.inc.sqf
+++ b/addons/interaction/initSettings.inc.sqf
@@ -6,6 +6,14 @@
true
] call CBA_fnc_addSetting;
+[
+ QGVAR(remoteTeamManagement), "CHECKBOX",
+ [LSTRING(remoteTeamManagement_DisplayName), LSTRING(remoteTeamManagement_Description)],
+ format ["ACE %1", LLSTRING(DisplayName)],
+ true,
+ true
+] call CBA_fnc_addSetting;
+
[
QGVAR(enableMagazinePassing), "CHECKBOX",
LSTRING(PassMagazineSetting),
@@ -38,6 +46,16 @@
true
] call CBA_fnc_addSetting;
+[
+ QGVAR(enableAnimActions), "CHECKBOX",
+ LSTRING(SettingAnimActionsName),
+ format ["ACE %1", LLSTRING(DisplayName)],
+ true,
+ true,
+ {[QGVAR(enableAnimActions), _this] call EFUNC(common,cbaSettings_settingChanged)},
+ true // Needs mission restart
+] call CBA_fnc_addSetting;
+
[
QGVAR(interactWithTerrainObjects), "CHECKBOX",
["str_a3_modules_moduleomquest_defend_f_attributes_useterrainobject0", LSTRING(interactWithTerrainObjects_Description)],
@@ -45,3 +63,11 @@
false,
true
] call CBA_fnc_addSetting;
+
+[
+ QGVAR(interactWithEnemyCrew), "LIST",
+ [LSTRING(interactWithEnemyCrew_DisplayName), LSTRING(interactWithEnemyCrew_Description)],
+ format ["ACE %1", LLSTRING(DisplayName)],
+ [[0, 1, 2], [ELSTRING(common,Never), LSTRING(interactWithEnemyCrew_allowCSW), ELSTRING(common,Always)], 0],
+ true
+] call CBA_fnc_addSetting;
diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml
index 38c86f5f99b..e77b4aedfd0 100644
--- a/addons/interaction/stringtable.xml
+++ b/addons/interaction/stringtable.xml
@@ -283,7 +283,7 @@
Csatlakozás a csoporthoz
Unir-se ao grupo
Unisciti alla squadra
- グループに入る
+ グループに参加
그룹 참여
加入小队
加入小隊
@@ -373,7 +373,7 @@
TÁNC!
DANCE!
DANZA!
- おどれ!
+ 踊ろう!
춤추기!
跳舞
跳舞
@@ -582,6 +582,36 @@
小隊管理
Takım Yönetimi
+
+ Remote Squad Management
+ Gestion à distance de l'escouade
+ Дистанционное управление отрядом
+ 遠隔分隊管理
+ 분대 원격 관리
+
+
+ Allow dropping and changing team colors of any unit in player's squad
+ Permettre d'abandonner et de changer les couleurs de n'importe quelle unité de l'escouade du joueur
+ Позволяет сбрасывать и менять командные цвета любого подразделения в отряде игрока
+ プレイヤー分隊内の任意のユニットにチームからの脱退と色の変更を許可します
+ 플레이어 분대의 모든 유닛을 삭제하고 팀 색상 변경하는 것을 허용합니다.
+
+
+ Squad
+ Družstvo
+ Trupp
+ Отряд
+ Drużyna
+ Squadra
+ Escuadrón
+ Escouade
+ 分隊
+ 分隊
+ 분대
+ Esquadrão
+ 小队
+ Manga
+
Red
Rot
@@ -729,7 +759,7 @@
Присоединиться к Красной группе
Rejoindre rouge
Unirsi al team rosso
- レッドに入る
+ レッドに参加
빨강에 참여
加入红组
加入紅組
@@ -746,7 +776,7 @@
Присоединиться к Зеленой группе
Rejoindre vert
Unirsi al team verde
- グリーンに入る
+ グリーンに参加
초록에 참여
加入绿组
加入綠組
@@ -763,7 +793,7 @@
Присоединиться к Синей группе
Rejoindre bleu
Unirsi al team blu
- ブルーに入る
+ ブルーに参加
파랑에 참여
加入蓝组
加入藍組
@@ -780,12 +810,25 @@
Присоединиться к Жёлтой группе
Rejoindre jaune
Unirsi al team giallo
- イエローに入る
+ イエローに参加
노랑에 참여
加入黄组
加入黃組
Sarıya Katıl
+
+ Join White
+ Weiss beitreten
+ Unirse a Blanco
+ Dołącz do Biała
+ Entrar em Branco
+ Připojit k Bílý Tým
+ Присоединиться к Белая
+ Rejoindre Blanc
+ Unirsi al team Bianco
+ 백팀 참여
+ ホワイトに参加
+
You joined Team %1
Du bist Gruppe %1 beigetreten
@@ -797,7 +840,7 @@
Você uniu-se à Equipe %1
Sei entrato nel team %1
Csatlakoztál a %1 csapathoz
- チーム %1 に入りました
+ チーム %1 に参加しました
당신은 %1팀에 참여했습니다
你已加入%1组
你已加入%1組
@@ -1060,7 +1103,7 @@
Disable negative rating
Negative Bewertung deaktivieren
- 否定評価を無効化
+ ネガティブな評価を無効化
Impedisci Valutazione Negativa
關閉負面評價
关闭负面评价
@@ -1075,7 +1118,7 @@
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 possono ricevere valutazioni negative? Se abilitato i giocatori riceveranno esclusivamente valutazioni positive, impedendo l'ingaggio da parte di IA alleate quando distruggono equipaggiamenti o uccidono alleati/civili.
玩家是否會收到負面評價? 當本功能開啟時玩家只會接收到正面評價,所以當玩家做出擊殺友軍AI、毀壞友軍裝備或殺害小隊夥伴都不會收到負面評價
玩家是否会收到负面评价? 当本功能开启时玩家只会接收到正面评价,所以当玩家做出击杀友军 AI、毁坏友军装备或杀害小队伙伴都不会收到负面评价。
@@ -1208,7 +1251,7 @@
Mostra l'interazione "passa caricatore"
Mostrar "Pasar cargador" en el menú de interacción
Montrer l'interaction "Passer un chargeur"
- "弾倉を渡す"をインタラクションに表示
+ 弾倉を渡すをインタラクションに表示
'탄창 건네기'를 상호작용에서 보여줌
显示"给予弹匣"互动动作
顯示"給予彈匣"互動動作
@@ -1237,7 +1280,7 @@
Выбить лобовое стекло
Wyłam szybę
Szélvédő széttörése
- フロントガラスを破る
+ 風防を破る
Sfonda il parabrezza
Quebrar pára-brisa
踹開擋風玻璃
@@ -1247,30 +1290,30 @@
전면유리 부수기
- Attach %1
- Установить %1
- %1 を取り付け
- Acoplar %1
- Fixer %1
- Przyczep %1
- Befestige %1
- Attacca %1
- 附加 %1
- %1 붙이기
- Fixar %1
+ Attach
+ Установить
+ を取り付け
+ Acoplar
+ Fixer
+ Przyczep
+ Befestige
+ Attacca
+ 附加
+ 붙이기
+ Fixar
- Detach %1
- Снять %1
- %1 を外す
- Desacoplar %1
- Retirer %1
- Odczep %1
- Löse %1
- Stacca %1
- 拆卸 %1
- %1 떼내기
- Desfixar %1
+ Detach
+ Снять
+ を外す
+ Desacoplar
+ Retirer
+ Odczep
+ Löse
+ Stacca
+ 拆卸
+ 떼내기
+ Desfixar
Enables attach/detach weapon attachment actions for current weapon.
@@ -1324,5 +1367,33 @@
Advertencia: puede provocar que algunos objetos choquen con otros.
Aviso: pode causar que alguns objetos colidam com outros.
+
+ Interaction with animations
+ Взаимодействие с анимациями
+ Interaction avec les animations
+ 車両アニメーションベースのインタラクション
+ 애니메이션 있는 상호작용
+
+
+ Interact With Enemy Crew
+ 敵乗員がいる状態でのインタラクト
+ Interagir avec l'équipage ennemi
+ Взаимодействие с вражеским экипажем
+ 적 승무원과의 상호작용
+
+
+ Limit some interactions on vehicles crewed by enemy factions.
+ 敵性力の乗員が乗っている車両へのインタラクションを一部制限します。
+ Limiter certaines interactions sur les véhicules dont l'équipage appartient à des factions ennemies.
+ Ограничьте некоторые взаимодействия на транспортных средствах, управляемых вражеской стороной.
+ 적 진영이 탑승한 차량과의 일부 상호작용을 제한합니다.
+
+
+ Allow for Static Weapons
+ 固定火器での許可
+ Autoriser les armes statiques
+ Разрешить использование статического оружия
+ 고정화기 허용
+
diff --git a/addons/inventory/RscDisplayInventory.hpp b/addons/inventory/RscDisplayInventory.hpp
index 91e68f5fb1c..06752dcfec5 100644
--- a/addons/inventory/RscDisplayInventory.hpp
+++ b/addons/inventory/RscDisplayInventory.hpp
@@ -17,13 +17,13 @@ class RscStructuredText;
class RscActiveText;
class RscCombo;
-#define X_BIS(num) (num * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2))
-#define Y_BIS(num) (num * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2))
-#define W_BIS(num) (num * (((safezoneW / safezoneH) min 1.2) / 40))
-#define H_BIS(num) (num * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))
+#define X_BIS(num) (num * (((safeZoneW / safeZoneH) min 1.2) / 40) + (safeZoneX + (safeZoneW - ((safeZoneW / safeZoneH) min 1.2))/2))
+#define Y_BIS(num) (num * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25) + (safeZoneY + (safeZoneH - (((safeZoneW / safeZoneH) min 1.2) / 1.2))/2))
+#define W_BIS(num) (num * (((safeZoneW / safeZoneH) min 1.2) / 40))
+#define H_BIS(num) (num * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25))
-#define X_MAKEITBIGGA(num) (num * (safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2))
-#define Y_MAKEITBIGGA(num) (num * (safeZoneH / 30) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2))
+#define X_MAKEITBIGGA(num) (num * (safeZoneH / 40) + (safeZoneX + (safeZoneW - safeZoneH)/2))
+#define Y_MAKEITBIGGA(num) (num * (safeZoneH / 30) + (safeZoneY + (safeZoneH - (safeZoneH / 1.2))/2))
#define W_MAKEITBIGGA(num) (num * (safeZoneH / 40))
#define H_MAKEITBIGGA(num) (num * (safeZoneH / 30))
diff --git a/addons/inventory/functions/fnc_forceItemListUpdate.sqf b/addons/inventory/functions/fnc_forceItemListUpdate.sqf
index fb8f09b5c84..ede73b01519 100644
--- a/addons/inventory/functions/fnc_forceItemListUpdate.sqf
+++ b/addons/inventory/functions/fnc_forceItemListUpdate.sqf
@@ -29,9 +29,9 @@ private _itemKeyCache = uiNamespace getVariable QGVAR(itemKeyCache);
private _backpackKeyCache = uiNamespace getVariable QGVAR(backpackKeyCache);
private _config = configNull;
-for "_i" from (lbSize _itemList) to 0 step -1 do {
+for "_i" from (lbSize _itemList) - 1 to 0 step -1 do {
// All items have their classnames in lbData, except backpacks
- _className = _itemList lbData _i;
+ private _className = _itemList lbData _i;
_config = if (_className != "") then {
_itemKeyCache get _className
diff --git a/addons/irlight/XEH_PREP.hpp b/addons/irlight/XEH_PREP.hpp
index db1a29d22e1..83c619aab87 100644
--- a/addons/irlight/XEH_PREP.hpp
+++ b/addons/irlight/XEH_PREP.hpp
@@ -1,3 +1 @@
-PREP(getGlowOffset);
PREP(initItemContextMenu);
-PREP(onLightToggled);
diff --git a/addons/irlight/XEH_postInit.sqf b/addons/irlight/XEH_postInit.sqf
index d95186f07bb..77b98936c19 100644
--- a/addons/irlight/XEH_postInit.sqf
+++ b/addons/irlight/XEH_postInit.sqf
@@ -1,30 +1,27 @@
#include "script_component.hpp"
-[] call FUNC(initItemContextMenu);
-
-addUserActionEventHandler ["headlights", "Deactivate", LINKFUNC(onLightToggled)];
+call FUNC(initItemContextMenu);
["ACE3 Equipment", QGVAR(hold), LLSTRING(MomentarySwitch), {
- ACE_player action ["GunLightOn", ACE_player];
- ACE_player action ["IRLaserOn", ACE_player];
- [] call FUNC(onLightToggled);
+ if !(ACE_player call CBA_fnc_canUseWeapon) exitWith {};
+
+ // Save current weapon state to reapply later
+ private _weaponState = (weaponState ACE_player) select [0, 3];
+
+ action ["GunLightOn", ACE_player];
+ action ["IRLaserOn", ACE_player];
+
+ ACE_player selectWeapon _weaponState;
+
true
}, {
- ACE_player action ["GunLightOff", ACE_player];
- ACE_player action ["IRLaserOff", ACE_player];
- [] call FUNC(onLightToggled);
- true
-}] call CBA_fnc_addKeybind;
+ if !(ACE_player call CBA_fnc_canUseWeapon) exitWith {};
+
+ // Save current weapon state to reapply later
+ private _weaponState = (weaponState ACE_player) select [0, 3];
-["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;
+ action ["GunLightOff", ACE_player];
+ action ["IRLaserOff", ACE_player];
+
+ ACE_player selectWeapon _weaponState;
+}] call CBA_fnc_addKeybind;
diff --git a/addons/irlight/functions/fnc_getGlowOffset.sqf b/addons/irlight/functions/fnc_getGlowOffset.sqf
deleted file mode 100644
index 613e551111c..00000000000
--- a/addons/irlight/functions/fnc_getGlowOffset.sqf
+++ /dev/null
@@ -1,41 +0,0 @@
-#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
index fa75eba77be..75a9508b180 100644
--- a/addons/irlight/functions/fnc_initItemContextMenu.sqf
+++ b/addons/irlight/functions/fnc_initItemContextMenu.sqf
@@ -10,7 +10,7 @@
* None
*
* Example:
- * [] call ace_irlight_fnc_initItemContextMenu
+ * call ace_irlight_fnc_initItemContextMenu
*
* Public: No
*/
@@ -19,30 +19,34 @@
_x params ["_variant", "_displayName"];
[
- "ACE_DBAL_A3_Red", "POINTER", _displayName, [], "", {
+ "ACE_DBAL_A3_Red",
+ "POINTER",
+ _displayName,
+ [],
+ "",
+ {
params ["", "", "_item", "", "_variant"];
private _baseClass = getText (configFile >> "CfgWeapons" >> _item >> "baseWeapon");
_item != _baseClass + _variant
}, {
- params ["", "", "_item", "", "_variant"];
+ params ["_unit", "", "_item", "_slot", "_variant"];
- private _baseClass = getText (configFile >> "CfgWeapons" >> _item >> "baseWeapon");
+ private _weapon = switch (_slot) do {
+ case "RIFLE_POINTER": {primaryWeapon _unit};
+ case "LAUNCHER_POINTER": {secondaryWeapon _unit};
+ case "PISTOL_POINTER": {handgunWeapon _unit};
+ default {""};
+ };
- ACE_player removePrimaryWeaponItem _item;
- ACE_player addPrimaryWeaponItem (_baseClass + _variant);
- playSound "click";
+ if (_weapon == "") exitWith {};
- if (_turnedOn) then {
- // Force update of flashlight
- ACE_player action ["GunLightOff", ACE_player];
+ private _baseClass = getText (configFile >> "CfgWeapons" >> _item >> "baseWeapon");
- {
- ACE_player action ["GunLightOn", ACE_player];
- ACE_player action ["IRLaserOn", ACE_player];
- } call CBA_fnc_execNextFrame;
- };
- }, false, _variant
+ [_unit, _weapon, _item, _baseClass + _variant] call EFUNC(common,switchAttachmentMode);
+ },
+ false,
+ _variant
] call CBA_fnc_addItemContextMenuOption;
} forEach [
["", LSTRING(Mode_IRDual)],
diff --git a/addons/irlight/functions/fnc_onLightToggled.sqf b/addons/irlight/functions/fnc_onLightToggled.sqf
deleted file mode 100644
index b3592f28f60..00000000000
--- a/addons/irlight/functions/fnc_onLightToggled.sqf
+++ /dev/null
@@ -1,36 +0,0 @@
-#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/javelin/functions/fnc_getTarget.sqf b/addons/javelin/functions/fnc_getTarget.sqf
index 6fd4686eb8d..926e400a18b 100644
--- a/addons/javelin/functions/fnc_getTarget.sqf
+++ b/addons/javelin/functions/fnc_getTarget.sqf
@@ -20,8 +20,8 @@ params ["_lastTarget", "_maxRange"];
scopeName "main";
-private _viewASL = AGLtoASL positionCameraToWorld [0,0,0];
-private _viewDir = _viewASL vectorFromTo (AGLtoASL positionCameraToWorld [0,0,1]);
+private _viewASL = AGLToASL positionCameraToWorld [0,0,0];
+private _viewDir = _viewASL vectorFromTo (AGLToASL positionCameraToWorld [0,0,1]);
// Attempt to lock onto current target if it is still valid
if (!isNull _lastTarget) then {
@@ -65,7 +65,7 @@ if ((cursorTarget isKindOf "AllVehicles") && {(cursorObject distance ace_player)
// Attempt to scan using multiple rayscasts - This is expensive (n^2) and care should be given to balance accuracy vs speed
for "_xOffset" from -14 to 14 step 2 do {
for "_yOffset" from -12 to 12 step 4 do {
- private _testPosASL = AGLtoASL (positionCameraToWorld [_xOffset, _yOffset, _maxRange]);
+ private _testPosASL = AGLToASL (positionCameraToWorld [_xOffset, _yOffset, _maxRange]);
private _intersectionsToCursorTarget = lineIntersectsSurfaces [_viewASL, _testPosASL, ace_player, vehicle ace_player, true, 1];
// drawIcon3D ["\A3\ui_f\data\map\markers\military\dot_CA.paa", [[0,1,0,1], [1,0,0,1]] select (count _intersectionsToCursorTarget), (ASLtoAGL _testPosASL), 0.25, 0.25, 0, "", 0.5, 0.025, "TahomaB"];
if (_intersectionsToCursorTarget isNotEqualTo []) then {
diff --git a/addons/javelin/functions/fnc_mapHelperDraw.sqf b/addons/javelin/functions/fnc_mapHelperDraw.sqf
index 4f7ac84b4a6..e8b917a933e 100644
--- a/addons/javelin/functions/fnc_mapHelperDraw.sqf
+++ b/addons/javelin/functions/fnc_mapHelperDraw.sqf
@@ -25,7 +25,7 @@ if (isNil QGVAR(arguments)) then {
_currentShooter setVariable ["ace_missileguidance_target", nil, false];
GVAR(arguments) = [
- diag_frameno, // Last run frame
+ diag_frameNo, // Last run frame
objNull, // currentTargetObject
0, // Lock Start Time
0, // Next Sound timer
@@ -37,7 +37,7 @@ if (isNil QGVAR(arguments)) then {
[{
if (isNull (uiNamespace getVariable ["ACE_RscOptics_javelin", displayNull])) exitWith {true};
GVAR(arguments) params ["_lastRunFrame"];
- (diag_frameno < _lastRunFrame) || {diag_frameno > (_lastRunFrame + 1)}
+ (diag_frameNo < _lastRunFrame) || {diag_frameNo > (_lastRunFrame + 1)}
}, {
TRACE_1("old/null display - ending optic draw",_this);
private _fireDisabledEH = GVAR(arguments) param [4, -1];
diff --git a/addons/javelin/functions/fnc_onOpticDraw.sqf b/addons/javelin/functions/fnc_onOpticDraw.sqf
index aacc4f5fa1f..9dfb7d2e484 100644
--- a/addons/javelin/functions/fnc_onOpticDraw.sqf
+++ b/addons/javelin/functions/fnc_onOpticDraw.sqf
@@ -53,7 +53,7 @@ if ((_ammoCount == 0) || // No ammo loaded
__JavelinIGUISeek ctrlSetTextColor __ColorGray;
_fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire);
- _this set [0, diag_frameno];
+ _this set [0, diag_frameNo];
_this set [4, _fireDisabledEH];
// Fix weapon being in top-attack when loading AP magazine (https://feedback.bistudio.com/T171012)
@@ -194,7 +194,7 @@ if (isNull _newTarget) then {
};
// Save arguments for next run
-_this set [0, diag_frameno];
+_this set [0, diag_frameNo];
_this set [1, _currentTarget];
_this set [2, _lockStartTime];
_this set [3, _soundNextPlayTime];
diff --git a/addons/javelin/functions/fnc_showFireMode.sqf b/addons/javelin/functions/fnc_showFireMode.sqf
index 85ed9837185..a3315188f1f 100644
--- a/addons/javelin/functions/fnc_showFireMode.sqf
+++ b/addons/javelin/functions/fnc_showFireMode.sqf
@@ -14,11 +14,12 @@
*
* Public: No
*/
+//IGNORE_PRIVATE_WARNING ["_currentShooter"]; // from upper scope
(if (((vehicle ACE_player) == ACE_player) || {ACE_player call CBA_fnc_canUseWeapon}) then {
weaponState ACE_player
} else {
- _turretPath = if (ACE_player == (driver _currentShooter)) then {[-1]} else {ACE_player call CBA_fnc_turretPath};
+ private _turretPath = if (ACE_player == (driver _currentShooter)) then {[-1]} else {ACE_player call CBA_fnc_turretPath};
weaponState [vehicle ACE_player, _turretPath]
}) params ["_weapon", "", "_mode"];
diff --git a/addons/javelin/script_component.hpp b/addons/javelin/script_component.hpp
index 3e9ad4ebfc1..b5cf7bea3ce 100644
--- a/addons/javelin/script_component.hpp
+++ b/addons/javelin/script_component.hpp
@@ -18,7 +18,7 @@
// Javelin IGUI defines
-#define __JavelinIGUI (uinamespace getVariable "ACE_RscOptics_javelin")
+#define __JavelinIGUI (uiNamespace getVariable "ACE_RscOptics_javelin")
// Custom controls
#define __JavelinIGUITargeting (__JavelinIGUI displayCtrl 6999)
diff --git a/addons/kestrel4500/RscTitles.hpp b/addons/kestrel4500/RscTitles.hpp
index faae6a8f32b..ffb44de9132 100644
--- a/addons/kestrel4500/RscTitles.hpp
+++ b/addons/kestrel4500/RscTitles.hpp
@@ -64,7 +64,7 @@ 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";
@@ -74,7 +74,7 @@ class Kestrel4500_Display {
};
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";
@@ -83,7 +83,7 @@ class Kestrel4500_Display {
};
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,13 +115,13 @@ 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";
@@ -129,13 +129,13 @@ class Kestrel4500_Display {
};
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;
@@ -236,7 +236,7 @@ class RscTitles {
font="TahomaB";
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";
@@ -246,7 +246,7 @@ class RscTitles {
};
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";
diff --git a/addons/kestrel4500/config.cpp b/addons/kestrel4500/config.cpp
index 5ea15f07ffe..fc339ccf6b0 100644
--- a/addons/kestrel4500/config.cpp
+++ b/addons/kestrel4500/config.cpp
@@ -6,7 +6,7 @@ class CfgPatches {
units[] = {"ACE_Item_Kestrel4500"};
weapons[] = {"ACE_Kestrel4500"};
requiredVersion = REQUIRED_VERSION;
- requiredAddons[] = {"ACE_common", "ACE_weather"};
+ requiredAddons[] = {"ace_common", "ace_weather"};
author = ECSTRING(common,ACETeam);
authors[] = {ECSTRING(common,ACETeam), "Ruthberg"};
url = ECSTRING(main,URL);
diff --git a/addons/kestrel4500/functions/fnc_generateOutputData.sqf b/addons/kestrel4500/functions/fnc_generateOutputData.sqf
index 59bb3056dd1..1aeac9a182a 100644
--- a/addons/kestrel4500/functions/fnc_generateOutputData.sqf
+++ b/addons/kestrel4500/functions/fnc_generateOutputData.sqf
@@ -89,7 +89,7 @@ if (GVAR(referenceHeadingMenu) == 0) then {
private _monthString = localize (["str_january","str_february","str_march","str_april","str_may","str_june","str_july","str_august","str_september","str_october","str_november","str_december"] select (_month - 1));
_textTop = _dayString;
_textCenter = format["%1 %2 %3", _day, _monthString, _year];
- _textBottomBig = [daytime, "HH:MM:SS"] call bis_fnc_timeToString;
+ _textBottomBig = [dayTime, "HH:MM:SS"] call bis_fnc_timeToString;
};
case 1: { // Direction
if (!GVAR(MinAvgMax)) then {
@@ -105,7 +105,7 @@ if (GVAR(referenceHeadingMenu) == 0) then {
};
case 2: { // Wind SPD
if (!GVAR(MinAvgMax)) then {
- _textCenterBig = Str(round(_windSpeed * 10) / 10);
+ _textCenterBig = str(round(_windSpeed * 10) / 10);
} else {
_textCenterLine1Left = "Max";
_textCenterLine2Left = "Avg";
@@ -116,13 +116,13 @@ if (GVAR(referenceHeadingMenu) == 0) then {
_textInfoLine2 = "- average";
};
case 1: {
- _textCenterLine1Right = Str(round((GVAR(Max) select 2) * 10) / 10);
- _textCenterLine2Right = Str(round((GVAR(Total) select 2) / (GVAR(Entries) select 2) * 10) / 10);
+ _textCenterLine1Right = str(round((GVAR(Max) select 2) * 10) / 10);
+ _textCenterLine2Right = str(round((GVAR(Total) select 2) / (GVAR(Entries) select 2) * 10) / 10);
_textInfoLine2 = "- stop";
};
case 2: {
- _textCenterLine1Right = Str(round((GVAR(Max) select 2) * 10) / 10);
- _textCenterLine2Right = Str(round((GVAR(Total) select 2) / (GVAR(Entries) select 2) * 10) / 10);
+ _textCenterLine1Right = str(round((GVAR(Max) select 2) * 10) / 10);
+ _textCenterLine2Right = str(round((GVAR(Total) select 2) / (GVAR(Entries) select 2) * 10) / 10);
_textInfoLine2 = "- clear";
};
};
@@ -131,10 +131,10 @@ if (GVAR(referenceHeadingMenu) == 0) then {
case 3: { // CROSSWIND
if (!GVAR(MinAvgMax)) then {
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
- _textCenterBig = Str(round(abs(sin(GVAR(RefHeading) - _playerDir) * _windSpeed) * 10) / 10);
+ _textCenterBig = str(round(abs(sin(GVAR(RefHeading) - _playerDir) * _windSpeed) * 10) / 10);
_textInfoLine1 = format["%1 m/s @ %2", round(_windSpeed * 10) / 10, round(_playerDir)];
} else {
- _textCenterBig = Str(round(abs(sin(GVAR(RefHeading) - _windDir) * _windSpeed) * 10) / 10);
+ _textCenterBig = str(round(abs(sin(GVAR(RefHeading) - _windDir) * _windSpeed) * 10) / 10);
_textInfoLine1 = format["%1 m/s @ %2", round(_windSpeed * 10) / 10, round(180 + _windDir)];
};
_textInfoLine2 = "- set heading";
@@ -148,13 +148,13 @@ if (GVAR(referenceHeadingMenu) == 0) then {
_textInfoLine2 = "- average";
};
case 1: {
- _textCenterLine1Right = Str(round((GVAR(Max) select 3) * 10) / 10);
- _textCenterLine2Right = Str(round((GVAR(Total) select 3) / (GVAR(Entries) select 3) * 10) / 10);
+ _textCenterLine1Right = str(round((GVAR(Max) select 3) * 10) / 10);
+ _textCenterLine2Right = str(round((GVAR(Total) select 3) / (GVAR(Entries) select 3) * 10) / 10);
_textInfoLine2 = "- stop";
};
case 2: {
- _textCenterLine1Right = Str(round((GVAR(Max) select 3) * 10) / 10);
- _textCenterLine2Right = Str(round((GVAR(Total) select 3) / (GVAR(Entries) select 3) * 10) / 10);
+ _textCenterLine1Right = str(round((GVAR(Max) select 3) * 10) / 10);
+ _textCenterLine2Right = str(round((GVAR(Total) select 3) / (GVAR(Entries) select 3) * 10) / 10);
_textInfoLine2 = "- clear";
};
};
@@ -163,10 +163,10 @@ if (GVAR(referenceHeadingMenu) == 0) then {
case 4: { // HEADWIND
if (!GVAR(MinAvgMax)) then {
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
- _textCenterBig = Str(round(cos(GVAR(RefHeading) - _playerDir) * _windSpeed * 10) / 10);
+ _textCenterBig = str(round(cos(GVAR(RefHeading) - _playerDir) * _windSpeed * 10) / 10);
_textInfoLine1 = format["%1 m/s @ %2", round(_windSpeed * 10) / 10, round(_playerDir)];
} else {
- _textCenterBig = Str(round(-cos(GVAR(RefHeading) - _windDir) * _windSpeed * 10) / 10);
+ _textCenterBig = str(round(-cos(GVAR(RefHeading) - _windDir) * _windSpeed * 10) / 10);
_textInfoLine1 = format["%1 m/s @ %2", round(_windSpeed * 10) / 10, round(180 + _windDir)];
};
_textInfoLine2 = "- set heading";
@@ -180,13 +180,13 @@ if (GVAR(referenceHeadingMenu) == 0) then {
_textInfoLine2 = "- average";
};
case 1: {
- _textCenterLine1Right = Str(round((GVAR(Max) select 4) * 10) / 10);
- _textCenterLine2Right = Str(round((GVAR(Total) select 4) / (GVAR(Entries) select 4) * 10) / 10);
+ _textCenterLine1Right = str(round((GVAR(Max) select 4) * 10) / 10);
+ _textCenterLine2Right = str(round((GVAR(Total) select 4) / (GVAR(Entries) select 4) * 10) / 10);
_textInfoLine2 = "- stop";
};
case 2: {
- _textCenterLine1Right = Str(round((GVAR(Max) select 4) * 10) / 10);
- _textCenterLine2Right = Str(round((GVAR(Total) select 4) / (GVAR(Entries) select 4) * 10) / 10);
+ _textCenterLine1Right = str(round((GVAR(Max) select 4) * 10) / 10);
+ _textCenterLine2Right = str(round((GVAR(Total) select 4) / (GVAR(Entries) select 4) * 10) / 10);
_textInfoLine2 = "- clear";
};
};
@@ -194,124 +194,124 @@ if (GVAR(referenceHeadingMenu) == 0) then {
};
case 5: { // TEMP
if (!GVAR(MinAvgMax)) then {
- _textCenterBig = Str(round(_temperature * 10) / 10);
+ _textCenterBig = str(round(_temperature * 10) / 10);
} else {
_textCenterLine1Left = "Min";
_textCenterLine2Left = "Avg";
_textCenterLine3Left = "Max";
- _textCenterLine1Right = Str(round((GVAR(Min) select 5) * 10) / 10);
- _textCenterLine2Right = Str(round((GVAR(Total) select 5) / (GVAR(Entries) select 5) * 10) / 10);
- _textCenterLine3Right = Str(round((GVAR(Max) select 5) * 10) / 10);
+ _textCenterLine1Right = str(round((GVAR(Min) select 5) * 10) / 10);
+ _textCenterLine2Right = str(round((GVAR(Total) select 5) / (GVAR(Entries) select 5) * 10) / 10);
+ _textCenterLine3Right = str(round((GVAR(Max) select 5) * 10) / 10);
};
};
case 6: { // CHILL
if (!GVAR(MinAvgMax)) then {
- _textCenterBig = Str(round(_chill * 10) / 10);
+ _textCenterBig = str(round(_chill * 10) / 10);
} else {
_textCenterLine1Left = "Min";
_textCenterLine2Left = "Avg";
_textCenterLine3Left = "Max";
- _textCenterLine1Right = Str(round((GVAR(Min) select 6) * 10) / 10);
- _textCenterLine2Right = Str(round((GVAR(Total) select 6) / (GVAR(Entries) select 6) * 10) / 10);
- _textCenterLine3Right = Str(round((GVAR(Max) select 6) * 10) / 10);
+ _textCenterLine1Right = str(round((GVAR(Min) select 6) * 10) / 10);
+ _textCenterLine2Right = str(round((GVAR(Total) select 6) / (GVAR(Entries) select 6) * 10) / 10);
+ _textCenterLine3Right = str(round((GVAR(Max) select 6) * 10) / 10);
};
};
case 7: { // HUMIDITY
if (!GVAR(MinAvgMax)) then {
- _textCenterBig = Str(round(_humidity * 100 * 10) / 10);
+ _textCenterBig = str(round(_humidity * 100 * 10) / 10);
} else {
_textCenterLine1Left = "Min";
_textCenterLine2Left = "Avg";
_textCenterLine3Left = "Max";
- _textCenterLine1Right = Str(round((GVAR(Min) select 7) * 100 * 10) / 10);
- _textCenterLine2Right = Str(round((GVAR(Total) select 7) / (GVAR(Entries) select 7) * 100 * 10) / 10);
- _textCenterLine3Right = Str(round((GVAR(Max) select 7) * 100 * 10) / 10);
+ _textCenterLine1Right = str(round((GVAR(Min) select 7) * 100 * 10) / 10);
+ _textCenterLine2Right = str(round((GVAR(Total) select 7) / (GVAR(Entries) select 7) * 100 * 10) / 10);
+ _textCenterLine3Right = str(round((GVAR(Max) select 7) * 100 * 10) / 10);
};
};
case 8: { // HEAT INDEX
if (!GVAR(MinAvgMax)) then {
- _textCenterBig = Str(round(_heatIndex * 10) / 10);
+ _textCenterBig = str(round(_heatIndex * 10) / 10);
} else {
_textCenterLine1Left = "Min";
_textCenterLine2Left = "Avg";
_textCenterLine3Left = "Max";
- _textCenterLine1Right = Str(round((GVAR(Min) select 8) * 10) / 10);
- _textCenterLine2Right = Str(round((GVAR(Total) select 8) / (GVAR(Entries) select 8) * 10) / 10);
- _textCenterLine3Right = Str(round((GVAR(Max) select 8) * 10) / 10);
+ _textCenterLine1Right = str(round((GVAR(Min) select 8) * 10) / 10);
+ _textCenterLine2Right = str(round((GVAR(Total) select 8) / (GVAR(Entries) select 8) * 10) / 10);
+ _textCenterLine3Right = str(round((GVAR(Max) select 8) * 10) / 10);
};
};
case 9: { // DEW POINT
if (!GVAR(MinAvgMax)) then {
- _textCenterBig = Str(round(_dewPoint * 10) / 10);
+ _textCenterBig = str(round(_dewPoint * 10) / 10);
} else {
_textCenterLine1Left = "Min";
_textCenterLine2Left = "Avg";
_textCenterLine3Left = "Max";
- _textCenterLine1Right = Str(round((GVAR(Min) select 9) * 10) / 10);
- _textCenterLine2Right = Str(round((GVAR(Total) select 9) / (GVAR(Entries) select 9) * 10) / 10);
- _textCenterLine3Right = Str(round((GVAR(Max) select 9) * 10) / 10);
+ _textCenterLine1Right = str(round((GVAR(Min) select 9) * 10) / 10);
+ _textCenterLine2Right = str(round((GVAR(Total) select 9) / (GVAR(Entries) select 9) * 10) / 10);
+ _textCenterLine3Right = str(round((GVAR(Max) select 9) * 10) / 10);
};
};
case 10: { // WET BULB
if (!GVAR(MinAvgMax)) then {
- _textCenterBig = Str(round(_wetBulb * 10) / 10);
+ _textCenterBig = str(round(_wetBulb * 10) / 10);
} else {
_textCenterLine1Left = "Min";
_textCenterLine2Left = "Avg";
_textCenterLine3Left = "Max";
- _textCenterLine1Right = Str(round((GVAR(Min) select 10) * 10) / 10);
- _textCenterLine2Right = Str(round((GVAR(Total) select 10) / (GVAR(Entries) select 10) * 10) / 10);
- _textCenterLine3Right = Str(round((GVAR(Max) select 10) * 10) / 10);
+ _textCenterLine1Right = str(round((GVAR(Min) select 10) * 10) / 10);
+ _textCenterLine2Right = str(round((GVAR(Total) select 10) / (GVAR(Entries) select 10) * 10) / 10);
+ _textCenterLine3Right = str(round((GVAR(Max) select 10) * 10) / 10);
};
};
case 11: { // BARO
if (!GVAR(MinAvgMax)) then {
- _textCenterBig = Str(round(_barometricPressure * 10) / 10);
+ _textCenterBig = str(round(_barometricPressure * 10) / 10);
} else {
_textCenterLine1Left = "Min";
_textCenterLine2Left = "Avg";
_textCenterLine3Left = "Max";
- _textCenterLine1Right = Str(round((GVAR(Min) select 11) * 10) / 10);
- _textCenterLine2Right = Str(round((GVAR(Total) select 11) / (GVAR(Entries) select 11) * 10) / 10);
- _textCenterLine3Right = Str(round((GVAR(Max) select 11) * 10) / 10);
+ _textCenterLine1Right = str(round((GVAR(Min) select 11) * 10) / 10);
+ _textCenterLine2Right = str(round((GVAR(Total) select 11) / (GVAR(Entries) select 11) * 10) / 10);
+ _textCenterLine3Right = str(round((GVAR(Max) select 11) * 10) / 10);
};
};
case 12: { // ALTITUDE
if (!GVAR(MinAvgMax)) then {
- _textCenterBig = Str(round(EGVAR(common,mapAltitude) + _playerAltitude));
+ _textCenterBig = str(round(EGVAR(common,mapAltitude) + _playerAltitude));
} else {
_textCenterLine1Left = "Min";
_textCenterLine2Left = "Avg";
_textCenterLine3Left = "Max";
- _textCenterLine1Right = Str(round(GVAR(Min) select 12));
- _textCenterLine2Right = Str(round((GVAR(Total) select 12) / (GVAR(Entries) select 12)));
- _textCenterLine3Right = Str(round(GVAR(Max) select 12));
+ _textCenterLine1Right = str(round(GVAR(Min) select 12));
+ _textCenterLine2Right = str(round((GVAR(Total) select 12) / (GVAR(Entries) select 12)));
+ _textCenterLine3Right = str(round(GVAR(Max) select 12));
};
};
case 13: { // DENSITY ALTITUDE
if (!GVAR(MinAvgMax)) then {
- _textCenterBig = Str(round(_densityAltitude));
+ _textCenterBig = str(round(_densityAltitude));
} else {
_textCenterLine1Left = "Min";
_textCenterLine2Left = "Avg";
_textCenterLine3Left = "Max";
- _textCenterLine1Right = Str(round(GVAR(Min) select 13));
- _textCenterLine2Right = Str(round((GVAR(Total) select 13) / (GVAR(Entries) select 13)));
- _textCenterLine3Right = Str(round(GVAR(Max) select 13));
+ _textCenterLine1Right = str(round(GVAR(Min) select 13));
+ _textCenterLine2Right = str(round((GVAR(Total) select 13) / (GVAR(Entries) select 13)));
+ _textCenterLine3Right = str(round(GVAR(Max) select 13));
};
};
case 14: { // User Screen 1
- _textCenterLine1Left = Str(round(_playerDir));
- _textCenterLine2Left = Str(round(EGVAR(common,mapAltitude) + _playerAltitude));
- _textCenterLine3Left = Str(round(abs(_windSpeed) * 10) / 10);
+ _textCenterLine1Left = str(round(_playerDir));
+ _textCenterLine2Left = str(round(EGVAR(common,mapAltitude) + _playerAltitude));
+ _textCenterLine3Left = str(round(abs(_windSpeed) * 10) / 10);
_textCenterLine1Right = GVAR(Directions) select GVAR(Direction);
_textCenterLine2Right = "m";
_textCenterLine3Right = "m/s";
};
case 15: { // User Screen 2
- _textCenterLine1Left = Str(round(_temperature * 10) / 10);
- _textCenterLine2Left = Str(round(_humidity * 100 * 10) / 10);
- _textCenterLine3Left = Str(round((_playerAltitude call EFUNC(weather,calculateBarometricPressure)) * 10) / 10);
+ _textCenterLine1Left = str(round(_temperature * 10) / 10);
+ _textCenterLine2Left = str(round(_humidity * 100 * 10) / 10);
+ _textCenterLine3Left = str(round((_playerAltitude call EFUNC(weather,calculateBarometricPressure)) * 10) / 10);
_textCenterLine1Right = "C";
_textCenterLine2Right = "%";
_textCenterLine3Right = "hPA";
@@ -322,7 +322,7 @@ if (GVAR(referenceHeadingMenu) == 0) then {
switch (GVAR(referenceHeadingMenu)) do {
case 1: {
_textCenterLine1 = "MAGNETIC HEADING";
- _textCenterLine2 = Str(round(GVAR(RefHeading)));
+ _textCenterLine2 = str(round(GVAR(RefHeading)));
_textCenterLine3 = "Auto Set ";
_textCenterLine4 = "Manual Set ";
_textCenterLine5 = "================";
@@ -330,7 +330,7 @@ if (GVAR(referenceHeadingMenu) == 0) then {
};
case 2: {
_textCenterLine1 = "MAGNETIC HEADING";
- _textCenterLine2 = Str(round(_playerDir));
+ _textCenterLine2 = str(round(_playerDir));
_textCenterLine3 = "Point Down the";
_textCenterLine4 = "Runway or Range";
_textCenterLine5 = "================";
@@ -338,7 +338,7 @@ if (GVAR(referenceHeadingMenu) == 0) then {
};
case 3: {
_textCenterLine1 = "MAGNETIC HEADING";
- _textCenterLine2 = Str(round(GVAR(TmpHeading)));
+ _textCenterLine2 = str(round(GVAR(TmpHeading)));
_textCenterLine3 = "Press < and >";
_textCenterLine4 = "to Adjust";
_textCenterLine5 = "================";
diff --git a/addons/kestrel4500/functions/fnc_measureWindSpeed.sqf b/addons/kestrel4500/functions/fnc_measureWindSpeed.sqf
index 9ecbca180cc..756a5418a49 100644
--- a/addons/kestrel4500/functions/fnc_measureWindSpeed.sqf
+++ b/addons/kestrel4500/functions/fnc_measureWindSpeed.sqf
@@ -15,7 +15,7 @@
* Public: No
*/
-private _playerDir = getDir ACE_player;
+private _playerDir = (ACE_player call CBA_fnc_headDir) select 0;
private _windSpeed = vectorMagnitude wind;
private _windDir = (wind select 0) atan2 (wind select 1);
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
diff --git a/addons/killtracker/XEH_postInit.sqf b/addons/killtracker/XEH_postInit.sqf
index 35050d1dc30..bf944c930e0 100644
--- a/addons/killtracker/XEH_postInit.sqf
+++ b/addons/killtracker/XEH_postInit.sqf
@@ -16,7 +16,7 @@
* Public: No
*/
-if ((getText (missionconfigfile >> "CfgDebriefingSections" >> QUOTE(XADDON) >> "variable")) != QXGVAR(outputText)) exitWith {
+if ((getText (missionConfigFile >> "CfgDebriefingSections" >> QUOTE(XADDON) >> "variable")) != QXGVAR(outputText)) exitWith {
TRACE_1("no mission debriefing config",_this);
};
@@ -65,7 +65,7 @@ GVAR(killCount) = 0;
private _killInfo = [];
if (!isNull _killer) then {
- if !(_killer isKindof "CAManBase") then { // If killer is a vehicle log the vehicle type
+ if !(_killer isKindOf "CAManBase") then { // If killer is a vehicle log the vehicle type
_killInfo pushBack format [LLSTRING(Vehicle), getText ((configOf _killer) >> "displayName")];
};
if (isNull _instigator) then {
diff --git a/addons/killtracker/stringtable.xml b/addons/killtracker/stringtable.xml
index 64b9ee764d4..9ab1423f1f5 100644
--- a/addons/killtracker/stringtable.xml
+++ b/addons/killtracker/stringtable.xml
@@ -126,6 +126,7 @@
Mostra uccisioni del veicolo a membri dell'equipaggio
車両でのキルを乗員全員に表示する
다른 승무원에게 차량 처치 표시
+ Montrer les véhicules tués aux membres de l'équipage
Show kills from a vehicle to driver, gunner and commander
@@ -134,6 +135,7 @@
Mostra uccisioni del veicolo al pilota, artigliere e comandante
車両でのキルを操縦手、砲手、車長で共有して表示する
차량 처치를 운전수, 사수, 지휘관에게 보여줍니다
+ Montrer les véhicules tués au pilote, à l'artilleur et au commandant.
diff --git a/addons/laser/RscTitles.hpp b/addons/laser/RscTitles.hpp
index 7421246181b..c63b601ab77 100644
--- a/addons/laser/RscTitles.hpp
+++ b/addons/laser/RscTitles.hpp
@@ -9,10 +9,10 @@ class RscTitles {
class controls {
class ModeControlGroup: RscControlsGroupNoScrollbars {
idc = IDC_MODECONTROLGROUP;
- x = "3.8 * (((safezoneW / safezoneH) min 1.2) / 40) + (profilenamespace getvariable ['IGUI_GRID_WEAPON_X',((safezoneX + safezoneW) - (10 * (((safezoneW / safezoneH) min 1.2) / 40)) - 4.3 * (((safezoneW / safezoneH) min 1.2) / 40))])";
- y = "2.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (profilenamespace getVariable ['IGUI_GRID_WEAPON_Y', (safezoneY + 0.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))])";
- w = "10 * (((safezoneW / safezoneH) min 1.2) / 40)";
- h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
+ x = "3.8 * (((safeZoneW / safeZoneH) min 1.2) / 40) + (profilenamespace getvariable ['IGUI_GRID_WEAPON_X',((safeZoneX + safeZoneW) - (10 * (((safeZoneW / safeZoneH) min 1.2) / 40)) - 4.3 * (((safeZoneW / safeZoneH) min 1.2) / 40))])";
+ y = "2.5 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25) + (profilenamespace getVariable ['IGUI_GRID_WEAPON_Y', (safeZoneY + 0.5 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25))])";
+ w = "10 * (((safeZoneW / safeZoneH) min 1.2) / 40)";
+ h = "1 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
class controls {
class AttackMode: RscText {
@@ -21,29 +21,29 @@ class RscTitles {
colorBackground[] = {0, 0, 0, 0};
x = "0";
y = "0";
- w = "(2.6) * (((safezoneW / safezoneH) min 1.2) / 40)";
- h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
- sizeEx = "0.8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
+ w = "(2.6) * (((safeZoneW / safeZoneH) min 1.2) / 40)";
+ h = "1 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
+ sizeEx = "0.8 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
};
class LaserCode: RscText {
idc = IDC_LASERCODE;
colorText[] = {1, 1, 1, 1};
colorBackground[] = {0, 0, 0, 0};
- x = "(3.6) * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
+ x = "(3.6) * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
y = "0";
- w = "(2.5) * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
- h = "(1) * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
- sizeEx = "0.8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
+ w = "(2.5) * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
+ h = "(1) * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
+ sizeEx = "0.8 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
};
class LaserIcon: RscPictureKeepAspect {
idc = IDC_LASERICON;
colorText[] = {1, 0, 0, 1};
colorBackground[] = {0, 0, 0, 0};
text = "\a3\Ui_F_Curator\Data\CfgCurator\laser_ca.paa";
- x = "(6.1) * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
+ x = "(6.1) * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
y = "0";
- w = "(1) * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
- h = "(1) * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
+ w = "(1) * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
+ h = "(1) * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
};
};
};
diff --git a/addons/laser/XEH_postInit.sqf b/addons/laser/XEH_postInit.sqf
index 768752bee2e..eb4cb247ed7 100644
--- a/addons/laser/XEH_postInit.sqf
+++ b/addons/laser/XEH_postInit.sqf
@@ -21,10 +21,10 @@ if (hasInterface) then {
["ACE_controlledUAV", {
params ["_UAV", "_seatAI", "_turret", "_position"];
TRACE_4("ACE_controlledUAV EH",_UAV,_seatAI,_turret,_position);
- if (!isNull _seatAI) then {
- [_seatAI] call FUNC(showVehicleHud);
- } else {
+ if (isNull _seatAI) then {
[ace_player] call FUNC(showVehicleHud);
+ } else {
+ [_seatAI] call FUNC(showVehicleHud);
};
}] call CBA_fnc_addEventHandler;
}] call CBA_fnc_addEventHandler;
diff --git a/addons/laser/functions/fnc_addLaserTarget.sqf b/addons/laser/functions/fnc_addLaserTarget.sqf
index 3fc02b2189c..f0414fd3ad2 100644
--- a/addons/laser/functions/fnc_addLaserTarget.sqf
+++ b/addons/laser/functions/fnc_addLaserTarget.sqf
@@ -20,9 +20,9 @@ params ["_targetObject", "_vehicle"];
TRACE_2("params",_targetObject,_vehicle);
// Get the designator variables, or use defaults
-private _waveLength = _vehicle getVariable [QEGVAR(laser,waveLength), ACE_DEFAULT_LASER_WAVELENGTH];
-private _laserCode = _vehicle getVariable [QEGVAR(laser,code), ACE_DEFAULT_LASER_CODE];
-private _beamSpread = _vehicle getVariable [QEGVAR(laser,beamSpread), ACE_DEFAULT_LASER_BEAMSPREAD];
+private _waveLength = _vehicle getVariable [QGVAR(waveLength), ACE_DEFAULT_LASER_WAVELENGTH];
+private _laserCode = _vehicle getVariable [QGVAR(code), ACE_DEFAULT_LASER_CODE];
+private _beamSpread = _vehicle getVariable [QGVAR(beamSpread), ACE_DEFAULT_LASER_BEAMSPREAD];
TRACE_3("codes",_waveLength,_laserCode,_beamSpread);
// Laser method is the method ACE_Laser will use to determine from where to where it should project the designator cone
diff --git a/addons/laser/functions/fnc_dev_drawVisibleLaserTargets.sqf b/addons/laser/functions/fnc_dev_drawVisibleLaserTargets.sqf
index 4c57a613252..294a0262385 100644
--- a/addons/laser/functions/fnc_dev_drawVisibleLaserTargets.sqf
+++ b/addons/laser/functions/fnc_dev_drawVisibleLaserTargets.sqf
@@ -35,8 +35,8 @@ private _testSeekerDir = vectorDirVisual _seekerVehicle;
private _resultPos = _results select 0;
if (!isNil "_resultPos") then {
// Draw lock results
- drawLine3D [ASLtoAGL _testSeekerPosASL, ASLtoAGL _resultPos, [0,0,1,1]];
- drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [0,0,1,1], (ASLtoAGL _resultPos), 1.5, 1.5, 45, format ["%1 from %2", _code, _results select 1], 0.5, 0.025, "TahomaB"];
+ drawLine3D [ASLToAGL _testSeekerPosASL, ASLToAGL _resultPos, [0,0,1,1]];
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [0,0,1,1], (ASLToAGL _resultPos), 1.5, 1.5, 45, format ["%1 from %2", _code, _results select 1], 0.5, 0.025, "TahomaB"];
};
} forEach [ACE_DEFAULT_LASER_CODE, 1688]; // Scan at codes 1111 and 1688
@@ -51,29 +51,29 @@ private _testSeekerDir = vectorDirVisual _seekerVehicle;
if (_laserMethod isEqualTo QFUNC(findLaserSource)) then { // Normal vanilla laserTarget func
private _targetObject = _obj getVariable [QGVAR(targetObject), objNull];
private _targetPosASL = getPosASL _targetObject;
- drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [1,0,0,1], (ASLtoAGL _targetPosASL), 0.5, 0.5, 0, "", 0.5, 0.025, "TahomaB"];
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [1,0,0,1], (ASLToAGL _targetPosASL), 0.5, 0.5, 0, "", 0.5, 0.025, "TahomaB"];
(_y call FUNC(findLaserSource)) params ["_laserPosASL", "_laserDir"];
private _resultsRay = [_laserPosASL, _laserDir, _obj] call FUNC(shootRay);
private _rayPos = _resultsRay select 0;
if (isNil "_rayPos") then {
- drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [1,0,0,1], (ASLtoAGL _targetPosASL), 2, 2, 0, "Nil Ray", 0.5, 0.025, "TahomaB"];
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [1,0,0,1], (ASLToAGL _targetPosASL), 2, 2, 0, "Nil Ray", 0.5, 0.025, "TahomaB"];
} else {
private _diff = _rayPos vectorDistance (getPosASL _targetObject); // Diff from ray position compared to actual
- drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [1,0,0,1], (ASLtoAGL _rayPos), 2, 2, 0, format ["Diff %1",_diff], 0.5, 0.025, "TahomaB"];
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [1,0,0,1], (ASLToAGL _rayPos), 2, 2, 0, format ["Diff %1",_diff], 0.5, 0.025, "TahomaB"];
};
};
// Draw array weapon lasers [YELLOW]
if ((_laserMethod isEqualType []) && {(count _laserMethod) == 2}) then {
_laserMethod params ["_modelPosition", "_weaponName"];
private _laserPosASL = _obj modelToWorldVisualWorld _modelPosition;
- drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [1,1,0,1], (ASLtoAGL _laserPosASL), 0.5, 0.5, 0, _weaponName, 0.5, 0.025, "TahomaB"];
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [1,1,0,1], (ASLToAGL _laserPosASL), 0.5, 0.5, 0, _weaponName, 0.5, 0.025, "TahomaB"];
private _laserDir = _obj weaponDirection _weaponName;
private _resultsRay = [_laserPosASL, _laserDir, _obj] call FUNC(shootRay);
private _rayPos = _resultsRay select 0;
if (!isNil "_rayPos") then {
- drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [1,1,0,1], (ASLtoAGL _rayPos), 2, 2, 0, _weaponName, 0.5, 0.025, "TahomaB"];
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [1,1,0,1], (ASLToAGL _rayPos), 2, 2, 0, _weaponName, 0.5, 0.025, "TahomaB"];
};
};
} forEach GVAR(laserEmitters);
diff --git a/addons/laser/functions/fnc_handleLaserTargetCreation.sqf b/addons/laser/functions/fnc_handleLaserTargetCreation.sqf
index bd42a3e5a53..4d5a7164b75 100644
--- a/addons/laser/functions/fnc_handleLaserTargetCreation.sqf
+++ b/addons/laser/functions/fnc_handleLaserTargetCreation.sqf
@@ -22,13 +22,13 @@ TRACE_1("params",_this);
// Only handle locally created lasers
if(!(local _targetObject)) exitWith {TRACE_1("not local",_targetObject);};
- private _owners = allUnits select {(lasertarget _x) == _targetObject};
+ private _owners = allUnits select {(laserTarget _x) == _targetObject};
if (count _owners == 1) exitWith {
TRACE_2("Laser target owner [allUnits]",_targetObject,_owners select 0);
[_targetObject, _owners select 0] call FUNC(addLaserTarget);
};
- _owners = vehicles select {(lasertarget _x) == _targetObject};
+ _owners = vehicles select {(laserTarget _x) == _targetObject};
if (count _owners == 1) exitWith {
TRACE_2("Laser target owner [vehicles]",_targetObject,_owners select 0);
[_targetObject, _owners select 0] call FUNC(addLaserTarget);
@@ -58,7 +58,7 @@ TRACE_1("params",_this);
};
};
if (!_foundSource) then {
- WARNING_1("Laser target doesn't have owner",_targetObject);
+ WARNING_1("Laser target %1 doesn't have owner",_targetObject);
};
}, _this] call CBA_fnc_execNextFrame;
diff --git a/addons/laser/functions/fnc_laserTargetPFH.sqf b/addons/laser/functions/fnc_laserTargetPFH.sqf
index 0b19b4d1c34..af2098a6f8d 100644
--- a/addons/laser/functions/fnc_laserTargetPFH.sqf
+++ b/addons/laser/functions/fnc_laserTargetPFH.sqf
@@ -29,7 +29,7 @@ GVAR(trackedLaserTargets) = GVAR(trackedLaserTargets) select {
TRACE_1("Laser off:",_laserUuid);
false
} else {
- private _newCode = _owner getVariable [QEGVAR(laser,code), ACE_DEFAULT_LASER_CODE];
+ private _newCode = _owner getVariable [QGVAR(code), ACE_DEFAULT_LASER_CODE];
if (_laserCode != _newCode) then {
TRACE_2("code change",_newCode,_laserCode);
[QGVAR(updateCode), [_laserUuid, _newCode]] call CBA_fnc_globalEvent;
diff --git a/addons/laser/functions/fnc_seekerFindLaserSpot.sqf b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf
index 4ceb15d8148..cf805f7496f 100644
--- a/addons/laser/functions/fnc_seekerFindLaserSpot.sqf
+++ b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf
@@ -72,7 +72,7 @@ private _finalOwner = objNull;
TRACE_1("",_laser);
//Handle Weird Data Return - skips over this laser in the for loop
- if ((_laser isEqualTo []) || {_laser isEqualTo [-1, -1]}) exitWith {WARNING_1("Bad Laser Return",_laser);};
+ if ((_laser isEqualTo []) || {_laser isEqualTo [-1, -1]}) exitWith {WARNING_1("Bad Laser Return %1",_laser);};
_laser params [["_laserPos", [], [[]], 3], ["_laserDir", [], [[]], 3]];
if (GVAR(dispersionCount) > 0) then {
@@ -192,10 +192,10 @@ END_COUNTER(seekerFindLaserSpot);
#ifdef DRAW_LASER_INFO
if (isNil "_finalPos") then {
- drawIcon3D ["\A3\ui_f\data\map\vehicleicons\iconMan_ca.paa", [0.9,1,0,1], (ASLtoAGL _posASL), 1, 1, 0, format ["Seeker: %1", _seekerCode], 0.5, 0.025, "TahomaB"];
+ drawIcon3D ["\A3\ui_f\data\map\vehicleicons\iconMan_ca.paa", [0.9,1,0,1], (ASLToAGL _posASL), 1, 1, 0, format ["Seeker: %1", _seekerCode], 0.5, 0.025, "TahomaB"];
} else {
- drawIcon3D ["\A3\ui_f\data\map\vehicleicons\iconManAT_ca.paa", [0.5,1,0,1], (ASLtoAGL _posASL), 1, 1, 0, format ["Seeker: %1", _seekerCode], 0.5, 0.025, "TahomaB"];
- drawLine3D [ASLtoAGL _posASL, ASLtoAGL _finalPos, [0.5,1,0,1]];
+ drawIcon3D ["\A3\ui_f\data\map\vehicleicons\iconManAT_ca.paa", [0.5,1,0,1], (ASLToAGL _posASL), 1, 1, 0, format ["Seeker: %1", _seekerCode], 0.5, 0.025, "TahomaB"];
+ drawLine3D [ASLToAGL _posASL, ASLToAGL _finalPos, [0.5,1,0,1]];
};
#endif
diff --git a/addons/laser/functions/fnc_shootRay.sqf b/addons/laser/functions/fnc_shootRay.sqf
index 862e972dd1b..9b8341909c3 100644
--- a/addons/laser/functions/fnc_shootRay.sqf
+++ b/addons/laser/functions/fnc_shootRay.sqf
@@ -48,8 +48,8 @@ TRACE_3("",_resultPos,_distance,_intersects);
#ifdef DRAW_LASER_INFO
if (!isNil "_resultPos") then {
private _text = [_distance, 4, 0] call CBA_fnc_formatNumber;
- drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [0, 1, 0, 1], ASLtoAGL _resultPos, 0.5, 0.5, 0, _text, 0.4, 0.025, "TahomaB"];
- drawLine3D [ASLtoAGL _posASL, ASLtoAGL _resultPos, [0,1,0,1]];
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [0, 1, 0, 1], ASLToAGL _resultPos, 0.5, 0.5, 0, _text, 0.4, 0.025, "TahomaB"];
+ drawLine3D [ASLToAGL _posASL, ASLToAGL _resultPos, [0,1,0,1]];
};
#endif
diff --git a/addons/laser/functions/fnc_showVehicleHud.sqf b/addons/laser/functions/fnc_showVehicleHud.sqf
index 778df61a6ca..856030bf8cb 100644
--- a/addons/laser/functions/fnc_showVehicleHud.sqf
+++ b/addons/laser/functions/fnc_showVehicleHud.sqf
@@ -68,7 +68,7 @@ GVAR(pfID) = [{
if (_adjustDown) then {
private _ctrl = (uiNamespace getVariable [QGVAR(display), displayNull]) displayCtrl IDC_MODECONTROLGROUP;
private _pos = ctrlPosition _ctrl;
- _pos set [1, (_pos select 1) + ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)];
+ _pos set [1, (_pos select 1) + ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)];
_ctrl ctrlSetPosition _pos;
_ctrl ctrlCommit 0;
};
@@ -91,7 +91,7 @@ GVAR(pfID) = [{
// Do Laser Scan:
private _ammo = getText (configFile >> "CfgMagazines" >> _vehicle currentMagazineTurret _turretPath >> "ammo");
private _laserSource = _vehicle modelToWorldWorld (_vehicle selectionPosition _seekerSource);
- private _laserCode = _vehicle getVariable [QEGVAR(laser,code), ACE_DEFAULT_LASER_CODE];
+ private _laserCode = _vehicle getVariable [QGVAR(code), ACE_DEFAULT_LASER_CODE];
private _seekerAngle = getNumber (configFile >> "CfgAmmo" >> _ammo >> "ace_missileguidance" >> "seekerAngle");
private _seekerMaxRange = getNumber (configFile >> "CfgAmmo" >> _ammo >> "ace_missileguidance" >> "seekerMaxRange");
private _laserResult = [_laserSource, vectorDir _vehicle, _seekerAngle, _seekerMaxRange, [ACE_DEFAULT_LASER_WAVELENGTH,ACE_DEFAULT_LASER_WAVELENGTH], _laserCode, _vehicle] call EFUNC(laser,seekerFindLaserSpot);
diff --git a/addons/laser/functions/fnc_toggleLST.sqf b/addons/laser/functions/fnc_toggleLST.sqf
index 59969d014eb..eae4ad68ef7 100644
--- a/addons/laser/functions/fnc_toggleLST.sqf
+++ b/addons/laser/functions/fnc_toggleLST.sqf
@@ -39,7 +39,7 @@ if (_enabled) exitWith {};
[_pfhID] call CBA_fnc_removePerFrameHandler;
};
- private _laserCode = _vehicle getVariable [QEGVAR(laser,code), ACE_DEFAULT_LASER_CODE];
+ private _laserCode = _vehicle getVariable [QGVAR(code), ACE_DEFAULT_LASER_CODE];
private _angle = 25;
private _pos = _vehicle modelToWorldVisualWorld [0,0,0];
diff --git a/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf b/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf
index 2176793aed5..8b44f7be5a6 100644
--- a/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf
+++ b/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf
@@ -63,7 +63,7 @@ if !(_unit call EFUNC(common,isSwimming)) then {
!isNull _fence
&& {damage _fence < 1}
- && {HAS_WIRECUTTER(_player)}
+ && {HAS_WIRECUTTER(_unit)}
},
["isNotSwimming"]
] call EFUNC(common,progressBar);
diff --git a/addons/magazinerepack/functions/fnc_canRepackMagazine.sqf b/addons/magazinerepack/functions/fnc_canRepackMagazine.sqf
index d6d8f3b827c..2c32ec57276 100644
--- a/addons/magazinerepack/functions/fnc_canRepackMagazine.sqf
+++ b/addons/magazinerepack/functions/fnc_canRepackMagazine.sqf
@@ -18,6 +18,9 @@
params ["_unit", "_magazine"];
+// Exit if repack is disabled for this magazine.
+if (getNumber (configFile >> "CfgMagazines" >> _magazine >> "ace_disableRepacking") == 1) exitWith {false};
+
private _maxAmmoCount = getNumber (configFile >> "CfgMagazines" >> _magazine >> "count");
{
diff --git a/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf b/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf
index b4cf8b16ef6..09d6974fefe 100644
--- a/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf
+++ b/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf
@@ -1,7 +1,7 @@
#include "..\script_component.hpp"
/*
* Author: PabstMirror, commy2, esteldunedain, Ruthberg
- * Gets magazine children for interaciton menu.
+ * Gets magazine children for interaction menu.
*
* Arguments:
* 0: Target
@@ -18,16 +18,20 @@
params ["_target", "_player"];
+private _cfgMagazines = configFile >> "CfgMagazines";
+
// get all mags and ammo count
private _unitMagazines = [];
private _unitMagCounts = [];
{
_x params ["_xClassname", "_xCount", "_xLoaded", "_xType"];
- private _xFullMagazineCount = getNumber (configFile >> "CfgMagazines" >> _xClassname >> "count");
+ private _configMagazine = _cfgMagazines >> _xClassname;
+ private _xFullMagazineCount = getNumber (_configMagazine >> "count");
+ private _isRepackDisabled = getNumber (_configMagazine >> "ace_disableRepacking") == 1;
//for every partial magazine, that is either in inventory or can be moved there
- if ((_xCount < _xFullMagazineCount) && {_xCount > 0} && {(!_xLoaded) || {GVAR(repackLoadedMagazines) && {[_player, _xClassname] call CBA_fnc_canAddItem}}}) then {
+ if ((!_isRepackDisabled) && {_xCount < _xFullMagazineCount} && {_xCount > 0} && {(!_xLoaded) || {GVAR(repackLoadedMagazines) && {[_player, _xClassname] call CBA_fnc_canAddItem}}}) then {
private _index = _unitMagazines find _xClassname;
if (_index == -1) then {
_unitMagazines pushBack _xClassname;
diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp
index 12faeb07c07..7ca3793586c 100644
--- a/addons/main/script_mod.hpp
+++ b/addons/main/script_mod.hpp
@@ -10,7 +10,7 @@
#define VERSION_AR MAJOR,MINOR,PATCHLVL,BUILD
// MINIMAL required version for the Mod. Components can specify others..
-#define REQUIRED_VERSION 2.14
+#define REQUIRED_VERSION 2.16
#define REQUIRED_CBA_VERSION {3,16,0}
#ifndef COMPONENT_BEAUTIFIED
diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf
index 534b37da8bd..083cd02b59f 100644
--- a/addons/map/XEH_postInitClient.sqf
+++ b/addons/map/XEH_postInitClient.sqf
@@ -109,6 +109,7 @@ GVAR(vehicleLightColor) = [1,1,1,0];
compile _vehicleLightCondition
};
} else {
+ //IGNORE_PRIVATE_WARNING ["_vehicle", "_unit"];
switch (true) do {
case (_vehicle isKindOf "Tank");
case (_vehicle isKindOf "Wheeled_APC_F"): { {true} };
diff --git a/addons/map/config.cpp b/addons/map/config.cpp
index 943a63c228e..a4d086d6029 100644
--- a/addons/map/config.cpp
+++ b/addons/map/config.cpp
@@ -119,16 +119,16 @@ class RscDisplayDiary {
onButtonClick = "";
};
class CA_PlayerName: RscText {
- x = "2 * ( ((safezoneW / safezoneH) min 1.2) / 40)";
+ x = "2 * ( ((safeZoneW / safeZoneH) min 1.2) / 40)";
};
class ProfilePicture: RscPicture {
- x = "13.5 * ( ((safezoneW / safezoneH) min 1.2) / 40)";
+ x = "13.5 * ( ((safeZoneW / safeZoneH) min 1.2) / 40)";
};
class ProfileBackground: RscText {
- x = "13.3 * ( ((safezoneW / safezoneH) min 1.2) / 40)";
+ x = "13.3 * ( ((safeZoneW / safeZoneH) min 1.2) / 40)";
};
class Separator1: RscPicture {
- x = "14.5 * ( ((safezoneW / safezoneH) min 1.2) / 40)";
+ x = "14.5 * ( ((safeZoneW / safeZoneH) min 1.2) / 40)";
};
};
};
diff --git a/addons/map/functions/fnc_blueForceTrackingModule.sqf b/addons/map/functions/fnc_blueForceTrackingModule.sqf
index af95ce3d6d0..8a2dcbf2452 100644
--- a/addons/map/functions/fnc_blueForceTrackingModule.sqf
+++ b/addons/map/functions/fnc_blueForceTrackingModule.sqf
@@ -22,4 +22,4 @@ params ["_logic"];
[_logic, QGVAR(BFT_HideAiGroups), "HideAiGroups"] call EFUNC(common,readSettingFromModule);
[_logic, QGVAR(BFT_ShowPlayerNames), "ShowPlayerNames"] call EFUNC(common,readSettingFromModule);
-INFO_3("Blue Force Tracking Module Initialized:",GVAR(BFT_Enabled),GVAR(BFT_Interval),GVAR(BFT_HideAiGroups));
+INFO_3("Blue Force Tracking Module Initialized:%1-%2-%3",GVAR(BFT_Enabled),GVAR(BFT_Interval),GVAR(BFT_HideAiGroups));
diff --git a/addons/map/functions/fnc_compileFlashlightMenu.sqf b/addons/map/functions/fnc_compileFlashlightMenu.sqf
index 4dc24a23f64..b0778981a7e 100644
--- a/addons/map/functions/fnc_compileFlashlightMenu.sqf
+++ b/addons/map/functions/fnc_compileFlashlightMenu.sqf
@@ -30,6 +30,7 @@ _unitLight params ["_flashlight", ""];
private _displayName = getText (_cfg >> "displayName");
private _icon = getText (_cfg >> "picture");
+ //IGNORE_PRIVATE_WARNING ["_player"];
private _statement = if (_flashlight == _x) then {
_displayName = format [localize LSTRING(turnLightOff), _displayName];
{[_player, ""] call FUNC(switchFlashlight)}
diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml
index 5d91167639b..13ee042d1f0 100644
--- a/addons/map/stringtable.xml
+++ b/addons/map/stringtable.xml
@@ -492,7 +492,7 @@
Setear canal al comenzar
Définir un canal par défaut
開始時のチャンネルを指定
- 시작시 채널
+ 시작 시 채널 설정
设定游戏开始时的聊天频道
設定遊戲開始時的聊天頻道
@@ -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.
ミッション開始時に使用されるマーカーチャンネルの指定を変更します
- 미션 시작시 마커채널을 변경합니다
+ 미션 시작 시 마커채널을 변경합니다
更改任务启动时的聊天频道
更改任務啟動時的聊天頻道
diff --git a/addons/map_gestures/functions/fnc_addGroupColorMapping.sqf b/addons/map_gestures/functions/fnc_addGroupColorMapping.sqf
index f533f9df345..c5577fb7e88 100644
--- a/addons/map_gestures/functions/fnc_addGroupColorMapping.sqf
+++ b/addons/map_gestures/functions/fnc_addGroupColorMapping.sqf
@@ -22,7 +22,7 @@ if (!params [["_group", "", [grpNull, ""]], ["_leadColor", [1,1,1,1], [[]], 4],
};
TRACE_3("params",_group,_leadColor,_unitColor);
-if (_group isEqualType grpNull) then {_group = groupID _group};
+if (_group isEqualType grpNull) then {_group = groupId _group};
if (_group == "") exitWith {ERROR("Group ID is blank, which is not valid.")};
if !([_leadColor] call FUNC(isValidColorArray)) exitWith {ERROR("leadColor is not a valid color array.")};
diff --git a/addons/map_gestures/functions/fnc_drawMapGestures.sqf b/addons/map_gestures/functions/fnc_drawMapGestures.sqf
index 0a69c1924b8..35b462910a8 100644
--- a/addons/map_gestures/functions/fnc_drawMapGestures.sqf
+++ b/addons/map_gestures/functions/fnc_drawMapGestures.sqf
@@ -41,7 +41,7 @@ private _players = [_positions, FUNC(getProximityPlayers), missionNamespace, QGV
};
// If color settings for the group exist, then use those, otherwise fall back to the default colors
- private _colorMap = GVAR(GroupColorCfgMappingNew) getOrDefault [toLower groupID (group _x), [GVAR(defaultLeadColor), GVAR(defaultColor)]];
+ private _colorMap = GVAR(GroupColorCfgMappingNew) getOrDefault [toLower groupId (group _x), [GVAR(defaultLeadColor), GVAR(defaultColor)]];
private _color = _colorMap select (_x != leader _x);
TRACE_2("",_colorMap,_color);
diff --git a/addons/map_gestures/functions/fnc_initDisplaySpectator.sqf b/addons/map_gestures/functions/fnc_initDisplaySpectator.sqf
index dbbd31ae65c..7c1f09bbf53 100644
--- a/addons/map_gestures/functions/fnc_initDisplaySpectator.sqf
+++ b/addons/map_gestures/functions/fnc_initDisplaySpectator.sqf
@@ -23,11 +23,11 @@ _mapCtrl ctrlAddEventHandler ["Draw", {
private _aceSpectatorFocus = missionNamespace getVariable [QEGVAR(spectator,camFocus), objNull];
if (!isNull _aceSpectatorFocus) then {
- _targets pushback [_aceSpectatorFocus, GVAR(maxRange)];
+ _targets pushBack [_aceSpectatorFocus, GVAR(maxRange)];
};
private _vanillaSpectatorFocus = uiNamespace getVariable ["RscEGSpectator_focus", objNull];
if (!isNull _vanillaSpectatorFocus) then {
- _targets pushback [_vanillaSpectatorFocus, GVAR(maxRange)];
+ _targets pushBack [_vanillaSpectatorFocus, GVAR(maxRange)];
};
[_this select 0, _targets] call FUNC(drawMapGestures);
}];
diff --git a/addons/map_gestures/stringtable.xml b/addons/map_gestures/stringtable.xml
index cff2d15f4ff..94c6d05ef10 100644
--- a/addons/map_gestures/stringtable.xml
+++ b/addons/map_gestures/stringtable.xml
@@ -75,7 +75,7 @@
Maximale Reichweite zwischen Spielern um Kartenzeichen anzuzeigen
Máxima distancia a la cual pueden verse el indicador de gestos
Définit le rayon au-delà duquel un joueur ne verra plus l'indicateur de pointage des autres joueurs.
- マップ ジェスチャのインジケータを表示可能なプレーヤー間の最大距離
+ マップ ジェスチャのインジケータを表示可能なプレーヤー間の最大範囲距離
플레이어간에 지도 신호 표시거리를 설정합니다.
设定地图指示显示的最大范围距离
設定地圖指示器顯示的最大範圍距離
diff --git a/addons/maptools/functions/fnc_drawLinesOnRoamer.sqf b/addons/maptools/functions/fnc_drawLinesOnRoamer.sqf
index 782d8762a07..652edf8768b 100644
--- a/addons/maptools/functions/fnc_drawLinesOnRoamer.sqf
+++ b/addons/maptools/functions/fnc_drawLinesOnRoamer.sqf
@@ -73,11 +73,11 @@ switch (true) do {
GVAR(freeDrawingData) = ["left", _currentMousePos, _currentMousePos];
} else {
if ((GVAR(freeDrawingData) select 0) == "left") then { // We are already drawing on this line, find best spot
- if ((_currentMousePos distance2d _posTopLeft) < ((GVAR(freeDrawingData) select 1) distance2d _posTopLeft)) then {
+ if ((_currentMousePos distance2D _posTopLeft) < ((GVAR(freeDrawingData) select 1) distance2D _posTopLeft)) then {
GVAR(freeDrawingData) set [1, _currentMousePos];
};
- if ((_currentMousePos distance2d _posBottomLeft) < ((GVAR(freeDrawingData) select 2) distance2d _posBottomLeft)) then {
+ if ((_currentMousePos distance2D _posBottomLeft) < ((GVAR(freeDrawingData) select 2) distance2D _posBottomLeft)) then {
GVAR(freeDrawingData) set [2, _currentMousePos];
};
};
@@ -95,11 +95,11 @@ switch (true) do {
GVAR(freeDrawingData) = ["top", _currentMousePos, _currentMousePos];
} else {
if ((GVAR(freeDrawingData) select 0) == "top") then { // We are already drawing on this line, find best spot
- if ((_currentMousePos distance2d _posTopLeft) < ((GVAR(freeDrawingData) select 1) distance2d _posTopLeft)) then {
+ if ((_currentMousePos distance2D _posTopLeft) < ((GVAR(freeDrawingData) select 1) distance2D _posTopLeft)) then {
GVAR(freeDrawingData) set [1, _currentMousePos];
};
- if ((_currentMousePos distance2d _posTopRight) < ((GVAR(freeDrawingData) select 2) distance2d _posTopRight)) then {
+ if ((_currentMousePos distance2D _posTopRight) < ((GVAR(freeDrawingData) select 2) distance2D _posTopRight)) then {
GVAR(freeDrawingData) set [2, _currentMousePos];
};
};
@@ -117,11 +117,11 @@ switch (true) do {
GVAR(freeDrawingData) = ["right", _currentMousePos, _currentMousePos];
} else {
if ((GVAR(freeDrawingData) select 0) == "right") then { // We are already drawing on this line, find best spot
- if ((_currentMousePos distance2d _posTopRight) < ((GVAR(freeDrawingData) select 1) distance2d _posTopRight)) then {
+ if ((_currentMousePos distance2D _posTopRight) < ((GVAR(freeDrawingData) select 1) distance2D _posTopRight)) then {
GVAR(freeDrawingData) set [1, _currentMousePos];
};
- if ((_currentMousePos distance2d _posBottomRight) < ((GVAR(freeDrawingData) select 2) distance2d _posBottomRight)) then {
+ if ((_currentMousePos distance2D _posBottomRight) < ((GVAR(freeDrawingData) select 2) distance2D _posBottomRight)) then {
GVAR(freeDrawingData) set [2, _currentMousePos];
};
};
@@ -139,11 +139,11 @@ switch (true) do {
GVAR(freeDrawingData) = ["bottom", _currentMousePos, _currentMousePos];
} else {
if ((GVAR(freeDrawingData) select 0) == "bottom") then { // We are already drawing on this line, find best spot
- if ((_currentMousePos distance2d _posBottomLeft) < ((GVAR(freeDrawingData) select 1) distance2d _posBottomLeft)) then {
+ if ((_currentMousePos distance2D _posBottomLeft) < ((GVAR(freeDrawingData) select 1) distance2D _posBottomLeft)) then {
GVAR(freeDrawingData) set [1, _currentMousePos];
};
- if ((_currentMousePos distance2d _posBottomRight) < ((GVAR(freeDrawingData) select 2) distance2d _posBottomRight)) then {
+ if ((_currentMousePos distance2D _posBottomRight) < ((GVAR(freeDrawingData) select 2) distance2D _posBottomRight)) then {
GVAR(freeDrawingData) set [2, _currentMousePos];
};
};
diff --git a/addons/maptools/functions/fnc_isInsidePlottingBoard.sqf b/addons/maptools/functions/fnc_isInsidePlottingBoard.sqf
index e3e64675080..b9c4b7f4570 100644
--- a/addons/maptools/functions/fnc_isInsidePlottingBoard.sqf
+++ b/addons/maptools/functions/fnc_isInsidePlottingBoard.sqf
@@ -27,7 +27,6 @@ private _isRuler = if (GVAR(plottingBoard_Shown) == 2) then {
if (_dist <= PLOTTINGBOARD_RULERCENTER) exitWith {true};
private _rulerVector = [sin GVAR(plottingBoard_rulerAngle), cos GVAR(plottingBoard_rulerAngle)];
- private _dirRightVector = [_dirVector select 1, -(_dirVector select 0)];
private _rulerAng = acos (_rulerVector vectorCos _relPos);
if (cos _rulerAng > 0 && {(tan _rulerAng) * _dist < PLOTTINGBOARD_RULERHALFWIDTH}) exitWith {true};
diff --git a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf
index 1a6d83b6985..f26c831b7e8 100644
--- a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf
+++ b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf
@@ -71,7 +71,7 @@ if (GVAR(plottingBoard_Shown) == 0) then {
// Rotate all points of polyline
if (_count >= 4) then { // polylines need at least 2 points (2 components per point)
- _rotatedPolyline = [];
+ private _rotatedPolyline = [];
for "_i" from 0 to _count - 1 step 2 do {
_rotatedPolyPos = [[0, 0], [_polyline select _i, _polyline select (_i + 1)], -_angle] call CBA_fnc_vectRotate2D;
diff --git a/addons/marker_flags/XEH_postInit.sqf b/addons/marker_flags/XEH_postInit.sqf
index 19011893cca..da13925d9cc 100644
--- a/addons/marker_flags/XEH_postInit.sqf
+++ b/addons/marker_flags/XEH_postInit.sqf
@@ -15,6 +15,7 @@ private _weapons = (call (uiNamespace getVariable [QGVAR(flagItems), {[]}])) app
private _icon = getText (_x >> QGVAR(icon));
GVAR(flagCache) set [_name, [_vehicleClass, _displayName, _icon]];
+ //IGNORE_PRIVATE_WARNING ["_player", "_target"];
private _action = [
QGVAR(pickup),
LLSTRING(ActionPickUp),
diff --git a/addons/marker_flags/XEH_preStart.sqf b/addons/marker_flags/XEH_preStart.sqf
index 2a2bc521616..e671b522a4c 100644
--- a/addons/marker_flags/XEH_preStart.sqf
+++ b/addons/marker_flags/XEH_preStart.sqf
@@ -2,5 +2,5 @@
#include "XEH_PREP.hpp"
-private _weapons = (configProperties [configfile >> "CfgWeapons", QUOTE(isClass _x && {isText (_x >> QQGVAR(vehicle))}), true]) apply {configName _x};
+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/markers/XEH_preInit.sqf b/addons/markers/XEH_preInit.sqf
index 142dedb89a1..605920b7770 100644
--- a/addons/markers/XEH_preInit.sqf
+++ b/addons/markers/XEH_preInit.sqf
@@ -12,7 +12,7 @@ PREP_RECOMPILE_END;
if (isNil QGVAR(MarkersCache)) then {
GVAR(MarkersCache) = [];
- private _config = configfile >> "CfgMarkers";
+ private _config = configFile >> "CfgMarkers";
for "_a" from 0 to (count _config - 1) do {
private _marker = _config select _a;
@@ -31,7 +31,7 @@ if (isNil QGVAR(MarkersCache)) then {
if (isNil QGVAR(MarkerColorsCache)) then {
GVAR(MarkerColorsCache) = [];
- private _config = configfile >> "CfgMarkerColors";
+ private _config = configFile >> "CfgMarkerColors";
for "_a" from 0 to (count _config - 1) do {
private _marker = _config select _a;
diff --git a/addons/markers/functions/fnc_initInsertMarker.sqf b/addons/markers/functions/fnc_initInsertMarker.sqf
index a102502b24c..2a3804959f2 100644
--- a/addons/markers/functions/fnc_initInsertMarker.sqf
+++ b/addons/markers/functions/fnc_initInsertMarker.sqf
@@ -19,7 +19,7 @@
#define BORDER 0.005
[{
- disableserialization;
+ disableSerialization;
params ["_display"];
TRACE_1("params",_display);
@@ -29,24 +29,24 @@
};
//BIS Controls:
- private _text = _display displayctrl IDC_INSERT_MARKER;
- private _picture = _display displayctrl IDC_INSERT_MARKER_PICTURE;
- private _channel = _display displayctrl IDC_INSERT_MARKER_CHANNELS;
- private _buttonOK = _display displayctrl IDC_OK;
- private _buttonCancel = _display displayctrl IDC_CANCEL;
- private _description = _display displayctrl 1100;
- private _title = _display displayctrl 1001;
- private _descriptionChannel = _display displayctrl 1101;
+ private _text = _display displayCtrl IDC_INSERT_MARKER;
+ private _picture = _display displayCtrl IDC_INSERT_MARKER_PICTURE;
+ private _channel = _display displayCtrl IDC_INSERT_MARKER_CHANNELS;
+ private _buttonOK = _display displayCtrl IDC_OK;
+ private _buttonCancel = _display displayCtrl IDC_CANCEL;
+ private _description = _display displayCtrl 1100;
+ private _title = _display displayCtrl 1001;
+ private _descriptionChannel = _display displayCtrl 1101;
//ACE Controls:
private _ctrlTimestamp = _display displayCtrl IDC_ACE_INSERT_MARKER_TIMESTAMP;
private _ctrlTimestampText = _display displayCtrl IDC_ACE_INSERT_MARKER_TIMESTAMP_TEXT;
- private _aceShapeLB = _display displayctrl IDC_ACE_INSERT_MARKER_SHAPE;
- private _aceColorLB = _display displayctrl IDC_ACE_INSERT_MARKER_COLOR;
- private _aceAngleSlider = _display displayctrl IDC_ACE_INSERT_MARKER_ANGLE;
- private _aceAngleSliderText = _display displayctrl IDC_ACE_INSERT_MARKER_ANGLE_TEXT;
- private _aceScaleSlider = _display displayctrl IDC_ACE_INSERT_MARKER_SCALE;
- private _aceScaleSliderText = _display displayctrl IDC_ACE_INSERT_MARKER_SCALE_TEXT;
+ private _aceShapeLB = _display displayCtrl IDC_ACE_INSERT_MARKER_SHAPE;
+ private _aceColorLB = _display displayCtrl IDC_ACE_INSERT_MARKER_COLOR;
+ private _aceAngleSlider = _display displayCtrl IDC_ACE_INSERT_MARKER_ANGLE;
+ private _aceAngleSliderText = _display displayCtrl IDC_ACE_INSERT_MARKER_ANGLE_TEXT;
+ private _aceScaleSlider = _display displayCtrl IDC_ACE_INSERT_MARKER_SCALE;
+ private _aceScaleSliderText = _display displayCtrl IDC_ACE_INSERT_MARKER_SCALE_TEXT;
private _mapDisplay = displayParent _display;
if (isNull _mapDisplay) exitWith {ERROR("No Map");};
@@ -102,7 +102,7 @@
ctrlSetFocus _text;
//--- Background
- private _pos = ctrlposition _text;
+ private _pos = ctrlPosition _text;
_pos params ["_posX", "_posY", "_posW", "_posH"];
_posX = _posX + 0.01;
_posY = _posY min ((safeZoneH + safeZoneY) - (11 * _posH + 11 * BORDER)); //prevent buttons being placed below bottom edge of screen
diff --git a/addons/markers/functions/fnc_mapDisplayInitEH.sqf b/addons/markers/functions/fnc_mapDisplayInitEH.sqf
index e5242b9067c..6d26d3dab81 100644
--- a/addons/markers/functions/fnc_mapDisplayInitEH.sqf
+++ b/addons/markers/functions/fnc_mapDisplayInitEH.sqf
@@ -18,14 +18,14 @@
params ["_display"];
TRACE_1("params",_display);
-private _bisShapeLB = _display displayctrl 1091;
+private _bisShapeLB = _display displayCtrl 1091;
private _curSelShape = missionNamespace getVariable [QGVAR(curSelMarkerShape), 0];
TRACE_2("shape",_bisShapeLB,_curSelShape);
_bisShapeLB ctrlAddEventHandler ["LBSelChanged", {_this call FUNC(onLBSelChangedShape)}];
_bisShapeLB lbSetCurSel _curSelShape;
-private _bisColorLB = _display displayctrl 1090;
+private _bisColorLB = _display displayCtrl 1090;
private _curSelColor = missionNamespace getVariable [QGVAR(curSelMarkerColor), 0];
TRACE_2("color",_bisColorLB,_curSelColor);
_bisColorLB ctrlAddEventHandler ["LBSelChanged", {_this call FUNC(onLBSelChangedColor)}];
diff --git a/addons/markers/functions/fnc_placeMarker.sqf b/addons/markers/functions/fnc_placeMarker.sqf
index fdd758be5e1..1899dff5fd5 100644
--- a/addons/markers/functions/fnc_placeMarker.sqf
+++ b/addons/markers/functions/fnc_placeMarker.sqf
@@ -35,7 +35,7 @@ if (_closeNum isEqualTo 1) then {
private _newestMarkerDist = 1e10;
{
- private _distX = GVAR(currentMarkerPosition) distance2d (getMarkerPos _x);
+ private _distX = GVAR(currentMarkerPosition) distance2D (getMarkerPos _x);
if (_distX < _newestMarkerDist) then {
_newestMarker = _x;
_newestMarkerDist = _distX;
diff --git a/addons/markers/functions/fnc_setMarkerJIP.sqf b/addons/markers/functions/fnc_setMarkerJIP.sqf
index 12dfe5de77d..fe4a1b68ae5 100644
--- a/addons/markers/functions/fnc_setMarkerJIP.sqf
+++ b/addons/markers/functions/fnc_setMarkerJIP.sqf
@@ -27,7 +27,7 @@ TRACE_2("params",_allMapMarkers,_allMapMarkersProperties);
private _data = _allMapMarkersProperties select _index;
_data params ["_markerClassname", "_colorClassname", "_pos", "_dir", "_scale"];
- private _config = (configfile >> "CfgMarkers") >> _markerClassname;
+ private _config = (configFile >> "CfgMarkers") >> _markerClassname;
if (!isClass _config) then {
WARNING("CfgMarker not found, changed to milDot");
@@ -36,7 +36,7 @@ TRACE_2("params",_allMapMarkers,_allMapMarkersProperties);
_x setMarkerTypeLocal configName _config;
- _config = configfile >> "CfgMarkerColors" >> _colorClassname;
+ _config = configFile >> "CfgMarkerColors" >> _colorClassname;
if (!isClass _config) then {
WARNING("CfgMarkerColors not found, changed to Default");
diff --git a/addons/markers/functions/fnc_setMarkerNetwork.sqf b/addons/markers/functions/fnc_setMarkerNetwork.sqf
index 7d0cc0e8271..94c66f40789 100644
--- a/addons/markers/functions/fnc_setMarkerNetwork.sqf
+++ b/addons/markers/functions/fnc_setMarkerNetwork.sqf
@@ -21,7 +21,7 @@ params ["_marker", "_data"];
TRACE_2("params",_marker,_data);
_data params ["_markerClassname", "_colorClassname", "_pos", "_dir", "_scale"];
-private _config = configfile >> "CfgMarkers" >> _markerClassname;
+private _config = configFile >> "CfgMarkers" >> _markerClassname;
if (!isClass _config) then {
WARNING("CfgMarker not found, changed to milDot");
@@ -30,7 +30,7 @@ if (!isClass _config) then {
_marker setMarkerTypeLocal configName _config;
-_config = configfile >> "CfgMarkerColors" >> _colorClassname;
+_config = configFile >> "CfgMarkerColors" >> _colorClassname;
if (!isClass _config) then {
WARNING("CfgMarkerColors not found, changed to Default");
diff --git a/addons/maverick/ACE_GuidanceConfig.hpp b/addons/maverick/ACE_GuidanceConfig.hpp
index 948404b7cce..4360bd4a87d 100644
--- a/addons/maverick/ACE_GuidanceConfig.hpp
+++ b/addons/maverick/ACE_GuidanceConfig.hpp
@@ -2,6 +2,6 @@ class EGVAR(missileguidance,AttackProfiles) {
class maverick {
name = "LOAL-DIR";
nameLocked = "LOBL-DIR";
- functionName = QEFUNC(missileguidance,attackProfile_DIR);
+ functionName = QEFUNC(missileguidance,attackProfile_LIN);
};
};
diff --git a/addons/maverick/CfgAmmo.hpp b/addons/maverick/CfgAmmo.hpp
index 654c1fbe80c..dbf847b10d6 100644
--- a/addons/maverick/CfgAmmo.hpp
+++ b/addons/maverick/CfgAmmo.hpp
@@ -1,3 +1,4 @@
+class ace_missileguidance_type_Maverick;
class CfgAmmo {
class MissileCore;
class MissileBase: MissileCore {
@@ -5,6 +6,21 @@ class CfgAmmo {
};
class Missile_AGM_02_F: MissileBase {};
+ class GVAR(D): Missile_AGM_02_F {
+ author = "Dani (TCVM)";
+ missileLockMaxDistance = 14000;
+ maneuvrability = 0;
+ class ace_missileguidance: ace_missileguidance_type_Maverick {
+ enabled = 1;
+ };
+ };
+
+ class GVAR(G): GVAR(D) {
+ class ace_missileguidance: ace_missileguidance {
+ enabled = 1;
+ };
+ };
+
class GVAR(L): Missile_AGM_02_F {
author = "xrufix";
autoSeekTarget = 0;
@@ -13,30 +29,15 @@ class CfgAmmo {
manualControl = 0;
missileLockMaxDistance = 16000;
weaponLockSystem = 4;
- class ace_missileguidance {
+ class ace_missileguidance: ace_missileguidance_type_Maverick {
enabled = 1;
-
- minDeflection = 0;
- maxDeflection = 0.002;
- incDeflection = 0.001;
-
- canVanillaLock = 0;
-
defaultSeekerType = "SALH";
seekerTypes[] = {"SALH"};
defaultSeekerLockMode = "LOAL";
- seekerLockModes[] = {"LOAL","LOBL"};
-
- seekLastTargetPos = 1;
- seekerAngle = 60;
- seekerAccuracy = 1;
+ seekerLockModes[] = {"LOAL"};
- seekerMinRange = 1;
seekerMaxRange = 16000;
-
- defaultAttackProfile = "maverick";
- attackProfiles[] = {"maverick"};
};
};
@@ -46,14 +47,10 @@ class CfgAmmo {
irLock = 0;
missileLockMaxDistance = 10000;
weaponLockSystem = 4;
- class ace_missileguidance {
+ class ace_missileguidance: ace_missileguidance_type_Maverick {
enabled = 1;
-
- minDeflection = 0;
- maxDeflection = 0.002;
- incDeflection = 0.001;
-
- canVanillaLock = 0;
+ pitchRate = 20;
+ yawRate = 20;
defaultSeekerType = "SALH";
seekerTypes[] = {"SALH"};
@@ -61,15 +58,8 @@ class CfgAmmo {
defaultSeekerLockMode = "LOAL";
seekerLockModes[] = {"LOAL"};
- seekLastTargetPos = 1;
seekerAngle = 40;
- seekerAccuracy = 1;
-
- seekerMinRange = 1;
seekerMaxRange = 10000;
-
- defaultAttackProfile = "maverick";
- attackProfiles[] = {"maverick"};
};
};
};
diff --git a/addons/maverick/CfgMagazines.hpp b/addons/maverick/CfgMagazines.hpp
index 705d52010d2..1e51ede8b01 100644
--- a/addons/maverick/CfgMagazines.hpp
+++ b/addons/maverick/CfgMagazines.hpp
@@ -12,7 +12,71 @@ class CfgMagazines {
class PylonRack_Missile_AGM_02_x1: magazine_Missile_AGM_02_x1 {};
class PylonRack_Missile_AGM_02_x2: magazine_Missile_AGM_02_x1 {};
+
+ // Optical Mavericks
+ class GVAR(D_magazine): 6Rnd_Missile_AGM_02_F {
+ ammo = QGVAR(D);
+ author = "Dani (TCVM)";
+ displayName = CSTRING(d_mag_x1);
+ };
+ class GVAR(D_pylonRack_1Rnd): PylonRack_1Rnd_Missile_AGM_02_F {
+ ammo = QGVAR(D);
+ author = "Dani (TCVM)";
+ displayName = CSTRING(d_mag_x1);
+ pylonWeapon = QGVAR(D_Launcher);
+ };
+ class GVAR(D_pylonRack_3Rnd): PylonRack_3Rnd_Missile_AGM_02_F {
+ ammo = QGVAR(D);
+ author = "Dani (TCVM)";
+ displayName = CSTRING(d_mag_x3);
+ pylonWeapon = QGVAR(D_Launcher);
+ };
+
+ class GVAR(G_magazine_x1): magazine_Missile_AGM_02_x1 {
+ ammo = QGVAR(G);
+ author = "Dani (TCVM)";
+ displayName = CSTRING(g_mag_x1);
+ };
+ class GVAR(G_pylonmissile_x1): PylonMissile_Missile_AGM_02_x1 {
+ ammo = QGVAR(G);
+ author = "Dani (TCVM)";
+ displayName = CSTRING(g_mag_x1);
+ pylonWeapon = QGVAR(G_Launcher);
+ };
+ class GVAR(G_pylonmissile_x2): PylonMissile_Missile_AGM_02_x2 {
+ ammo = QGVAR(G);
+ author = "Dani (TCVM)";
+ displayName = CSTRING(g_mag_x2);
+ pylonWeapon = QGVAR(G_Launcher);
+ };
+
+ class GVAR(G_pylonRack_1Rnd): PylonRack_1Rnd_Missile_AGM_02_F {
+ ammo = QGVAR(G);
+ author = "Dani (TCVM)";
+ displayName = CSTRING(g_mag_x1);
+ pylonWeapon = QGVAR(G_Launcher);
+ };
+ class GVAR(G_PylonRack_3Rnd): PylonRack_3Rnd_Missile_AGM_02_F {
+ ammo = QGVAR(G);
+ author = "Dani (TCVM)";
+ displayName = CSTRING(g_mag_x3);
+ pylonWeapon = QGVAR(G_Launcher);
+ };
+
+ class GVAR(G_PylonRack_x1): PylonRack_Missile_AGM_02_x1 {
+ ammo = QGVAR(G);
+ author = "Dani (TCVM)";
+ displayName = CSTRING(g_mag_x1);
+ pylonWeapon = QGVAR(G_Launcher);
+ };
+ class GVAR(G_PylonRack_x2): PylonRack_Missile_AGM_02_x2 {
+ ammo = QGVAR(G);
+ author = "Dani (TCVM)";
+ displayName = CSTRING(g_mag_x2);
+ pylonWeapon = QGVAR(G_Launcher);
+ };
+ // Laser Mavericks
class GVAR(L_magazine_x1): magazine_Missile_AGM_02_x1 {
ammo = QGVAR(L);
author = "xrufix";
diff --git a/addons/maverick/CfgWeapons.hpp b/addons/maverick/CfgWeapons.hpp
index 1c0ae744efe..a60681a3cf1 100644
--- a/addons/maverick/CfgWeapons.hpp
+++ b/addons/maverick/CfgWeapons.hpp
@@ -6,6 +6,22 @@ class CfgWeapons {
class MissileLauncher: LauncherCore {};
class Missile_AGM_02_Plane_CAS_01_F: MissileLauncher {};
+ class GVAR(D_Launcher): Missile_AGM_02_Plane_CAS_01_F {
+ author = "Dani (TCVM)";
+ displayname = CSTRING(D);
+ magazines[] = {QGVAR(D_magazine), QGVAR(D_pylonRack_1Rnd), QGVAR(D_pylonRack_3Rnd)};
+ weaponLockDelay = 0.1;
+ weaponLockSystem = 2;
+ };
+
+ class GVAR(G_Launcher): weapon_AGM_65Launcher {
+ author = "Dani (TCVM)";
+ displayname = CSTRING(G);
+ magazines[] = {QGVAR(G_magazine_x1), QGVAR(G_pylonmissile_x1), QGVAR(G_pylonmissile_x2), QGVAR(G_pylonRack_1Rnd), QGVAR(G_PylonRack_3Rnd), QGVAR(G_PylonRack_x1), QGVAR(G_PylonRack_x2)};
+ weaponLockDelay = 0.1;
+ weaponLockSystem = 2;
+ };
+
class GVAR(L_Launcher): weapon_AGM_65Launcher {
author = "xrufix";
displayname = CSTRING(L);
diff --git a/addons/maverick/stringtable.xml b/addons/maverick/stringtable.xml
index 6bf1d80e042..824e20c3275 100644
--- a/addons/maverick/stringtable.xml
+++ b/addons/maverick/stringtable.xml
@@ -6,7 +6,7 @@
AGM-65 Maverick L, Laser Guided Anti-Ground-Missile
AGM-65 Maverick L, lasergelenkte Luft-Boden-Rakete
AGM-65 Maverick L, Missile Aria-Terra Laserguidato
- AGM-65 マーベリック L、レーザー誘導対地ミサイル
+ AGM-65 マーベリック L、 レーザー誘導対地ミサイル
AGM-65"小牛"飛彈L型,雷射導引對地導彈
AGM-65"小牛"L型激光制导对地导弹
AGM-65 매버릭 L, 레이저 유도 대지 미사일
@@ -82,10 +82,10 @@
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、 レーザー誘導対地ミサイル
Kh-25ML, Missile Aria-Terra Laserguidato
Kh-25ML, Kierowany laserowo pocisk powietrze-ziemia
Х-25МЛ, ракета Воздух-Земля с лазерным наведением
@@ -111,6 +111,55 @@
1x Kh-25ML [ACE]
1x Kh-25ML [ACE]
+
+ AGM-65 Maverick D
+ AGM-65 Maverick D
+ AGM-65 Maverick D
+ AGM-65 マーベリック D
+ AGM-65 매버릭 D
+
+
+ AGM-65 Maverick G
+ AGM-65 Maverick G
+ AGM-65 Maverick G
+ AGM-65 マーベリック G
+ AGM-65 매버릭 G
+
+
+ AGM-65 Maverick D [ACE]
+ AGM-65 Maverick D [ACE]
+ AGM-65 Maverick D [ACE]
+ AGM-65 マーベリック D [ACE]
+ AGM-65 매버릭 D [ACE]
+
+
+ 3x AGM-65 Maverick D [ACE]
+ 3x AGM-65 Maverick D [ACE]
+ 3x AGM-65 Maverick D [ACE]
+ 3x AGM-65 マーベリック D [ACE]
+ 3x AGM-65 매버릭 D [ACE]
+
+
+ AGM-65 Maverick G [ACE]
+ AGM-65 Maverick G [ACE]
+ AGM-65 Maverick G [ACE]
+ AGM-65 マーベリック G [ACE]
+ AGM-65 매버릭 G [ACE]
+
+
+ 2x AGM-65 Maverick G [ACE]
+ 2x AGM-65 Maverick G [ACE]
+ 2x AGM-65 Maverick G [ACE]
+ 2x AGM-65 マーベリック G [ACE]
+ 2x AGM-65 매버릭 G [ACE]
+
+
+ 3x AGM-65 Maverick G [ACE]
+ 3x AGM-65 Maverick G [ACE]
+ 3x AGM-65 Maverick G [ACE]
+ 3x AGM-65 マーベリック G [ACE]
+ 3x AGM-65 매버릭 G [ACE]
+
diff --git a/addons/medical/dev/test_hitpointConfigs.sqf b/addons/medical/dev/test_hitpointConfigs.sqf
index 7bdeb189c23..ff1c3a95b7d 100644
--- a/addons/medical/dev/test_hitpointConfigs.sqf
+++ b/addons/medical/dev/test_hitpointConfigs.sqf
@@ -10,7 +10,11 @@ private _cfgWeapons = configFile >> "CfgWeapons";
private _cfgVehicles = configFile >> "CfgVehicles";
private _uniforms = "getNumber (_x >> 'scope') == 2 && {configName _x isKindOf ['Uniform_Base', _cfgWeapons]}" configClasses _cfgWeapons;
-private _units = _uniforms apply {_cfgVehicles >> getText (_x >> "ItemInfo" >> "uniformClass")};
+private _units = _uniforms apply {
+ private _unitCfg = _cfgVehicles >> getText (_x >> "ItemInfo" >> "uniformClass");
+ if (isNull _unitCfg) then { WARNING_2("%1 has invalid uniformClass %2",configName _x,getText (_x >> "ItemInfo" >> "uniformClass")) };
+ _unitCfg
+};
if (param [0, false]) then { // Check all units (if naked)
INFO("checking ALL units");
_units append ((configProperties [configFile >> "CfgVehicles", "(isClass _x) && {(getNumber (_x >> 'scope')) == 2} && {configName _x isKindOf 'CAManBase'}", true]));
@@ -21,6 +25,7 @@ INFO_1("Checking uniforms for correct medical hitpoints [%1 units]",count _units
private _testPass = true;
{
private _typeOf = configName _x;
+ if (_typeOf == "") then { continue };
private _hitpoints = (configProperties [_x >> "HitPoints", "isClass _x", true]) apply {toLowerANSI configName _x};
private _expectedHitPoints = ["hitleftarm","hitrightarm","hitleftleg","hitrightleg","hithead","hitbody"];
private _missingHitPoints = _expectedHitPoints select {!(_x in _hitpoints)};
diff --git a/addons/medical/functions/fnc_deserializeState.sqf b/addons/medical/functions/fnc_deserializeState.sqf
index b7846bf9015..6fbb00985db 100644
--- a/addons/medical/functions/fnc_deserializeState.sqf
+++ b/addons/medical/functions/fnc_deserializeState.sqf
@@ -29,6 +29,7 @@ if (!local _unit) exitWith { ERROR_1("unit [%1] is not local",_unit) };
if !(_unit getVariable [QGVAR(initialized), false]) exitWith {
[QEGVAR(medical_status,initialized), {
params ["_unit"];
+ //IGNORE_PRIVATE_WARNING ["_thisArgs", "_thisId", "_thisType"];
_thisArgs params ["_target"];
if (_unit == _target) then {
diff --git a/addons/medical/initSettings.inc.sqf b/addons/medical/initSettings.inc.sqf
index 3c54f47cee1..adc53c2ea83 100644
--- a/addons/medical/initSettings.inc.sqf
+++ b/addons/medical/initSettings.inc.sqf
@@ -34,7 +34,7 @@
"SLIDER",
[LSTRING(SpontaneousWakeUpChance_DisplayName), LSTRING(SpontaneousWakeUpChance_Description)],
LSTRING(Category),
- [0, 1, 0.05, 2, true],
+ [0, 1, 0.1, 2, true],
true
] call CBA_fnc_addSetting;
@@ -43,6 +43,6 @@
"SLIDER",
[LSTRING(spontaneousWakeUpEpinephrineBoost_DisplayName), LSTRING(spontaneousWakeUpEpinephrineBoost_Description)],
LSTRING(Category),
- [1, 30, 1, 1],
+ [1, 30, 1.5, 1],
true
] call CBA_fnc_addSetting;
diff --git a/addons/medical_ai/XEH_PREP.hpp b/addons/medical_ai/XEH_PREP.hpp
index de4ac3c38a3..3cf2b3e2441 100644
--- a/addons/medical_ai/XEH_PREP.hpp
+++ b/addons/medical_ai/XEH_PREP.hpp
@@ -1,3 +1,4 @@
+PREP(addHealingCommandActions);
PREP(canRequestMedic);
PREP(healingLogic);
PREP(healSelf);
diff --git a/addons/medical_ai/XEH_postInit.sqf b/addons/medical_ai/XEH_postInit.sqf
index 0b225c7f0b0..22f2fa5f23f 100644
--- a/addons/medical_ai/XEH_postInit.sqf
+++ b/addons/medical_ai/XEH_postInit.sqf
@@ -2,10 +2,12 @@
["CBA_settingsInitialized", {
TRACE_1("settingsInitialized",GVAR(enabledFor));
+
if (GVAR(enabledFor) == 0) exitWith {}; // 0: disabled
if ((GVAR(enabledFor) == 1) && {!isServer} && {hasInterface}) exitWith {}; // 1: Don't Run on non-hc Clients
["ace_firedNonPlayer", {
+ //IGNORE_PRIVATE_WARNING ["_unit"];
_unit setVariable [QGVAR(lastFired), CBA_missionTime];
}] call CBA_fnc_addEventHandler;
@@ -19,6 +21,19 @@
_unit setVariable [QGVAR(lastSuppressed), CBA_missionTime];
}] call CBA_fnc_addClassEventHandler;
- #include "stateMachine.inc.sqf"
+ // Add command actions to command AI medics to treat other units
+ call FUNC(addHealingCommandActions);
+ if (GVAR(requireItems) == 2) then {
+ ["CAManBase", "InitPost", {
+ [{
+ params ["_unit"];
+ if ((!local _unit) || {!alive _unit} || {isPlayer _unit}) exitWith {};
+ TRACE_2("replacing medical items on AI",_unit,typeOf _unit);
+ [_unit] call EFUNC(common,replaceRegisteredItems);
+ }, _this] call CBA_fnc_execNextFrame; // need to delay a frame before modifying items in a backpack
+ }, nil, [IGNORE_BASE_UAVPILOTS], true] call CBA_fnc_addClassEventHandler;
+ };
+
+ #include "stateMachine.inc.sqf"
}] call CBA_fnc_addEventHandler;
diff --git a/addons/medical_ai/XEH_preInit.sqf b/addons/medical_ai/XEH_preInit.sqf
index 5725d1e119e..8cdc2ee6ad8 100644
--- a/addons/medical_ai/XEH_preInit.sqf
+++ b/addons/medical_ai/XEH_preInit.sqf
@@ -13,6 +13,6 @@ 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);
+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 b4d795cbbf6..3782a3eab78 100644
--- a/addons/medical_ai/XEH_preStart.sqf
+++ b/addons/medical_ai/XEH_preStart.sqf
@@ -20,8 +20,9 @@ private _itemHash = createHashMap;
} forEach [
["@bandage", ["FieldDressing", "PackingBandage", "ElasticBandage", "QuikClot"]],
["@iv", ["SalineIV", "SalineIV_500", "SalineIV_250", "BloodIV", "BloodIV_500", "BloodIV_250", "PlasmaIV", "PlasmaIV_500", "PlasmaIV_250"]],
+ ["tourniquet", ["ApplyTourniquet"]],
["splint", ["splint"]],
["morphine", ["morphine"]],
["epinephrine", ["epinephrine"]]
];
-uinamespace setVariable [QGVAR(itemHash), compileFinal _itemHash];
+uiNamespace setVariable [QGVAR(itemHash), compileFinal _itemHash];
diff --git a/addons/medical_ai/functions/fnc_addHealingCommandActions.sqf b/addons/medical_ai/functions/fnc_addHealingCommandActions.sqf
new file mode 100644
index 00000000000..853fdad8582
--- /dev/null
+++ b/addons/medical_ai/functions/fnc_addHealingCommandActions.sqf
@@ -0,0 +1,89 @@
+#include "..\script_component.hpp"
+/*
+ * Author: johnb43
+ * Adds ACE actions for the player to command medics to heal injured units.
+ *
+ * Arguments:
+ * None
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * call ace_medical_ai_fnc_addHealingCommandActions
+ *
+ * Public: No
+ */
+
+if (!hasInterface) exitWith {};
+
+//IGNORE_PRIVATE_WARNING ["_player", "_target"];
+private _action = [
+ QGVAR(heal),
+ localize "STR_A3_Task180_name",
+ "",
+ {},
+ {_player == leader _player},
+ {
+ private _units = units _player;
+
+ (_units select {_x call EFUNC(common,isAwake) && {_x call EFUNC(medical_treatment,isMedic)} && {!(_x call EFUNC(common,isPlayer))}}) apply {
+ [
+ [
+ QGVAR(medicHeal_) + str _x,
+ format ["%1: (%2)", [_x, false, true] call EFUNC(common,getName), groupId _x],
+ "",
+ {},
+ {true},
+ {
+ (_this select 2) params ["_healer", "_units"];
+
+ (_units select {_x call FUNC(isInjured)}) apply {
+ [
+ [
+ QGVAR(healUnit_) + str _x,
+ format [localize "str_action_heal_soldier", ([_x, false, true] call EFUNC(common,getName)) + " (" + str groupId _x + ")"],
+ "",
+ {
+ (_this select 2) params ["_healer", "_target"];
+
+ private _assignedMedic = _target getVariable [QGVAR(assignedMedic), objNull];
+
+ // Remove from previous medic's queue
+ if (!isNull _assignedMedic && {_healer != _assignedMedic}) then {
+ private _healQueue = _assignedMedic getVariable [QGVAR(healQueue), []];
+
+ _healQueue deleteAt (_healQueue find _target);
+
+ _assignedMedic setVariable [QGVAR(healQueue), _healQueue];
+ };
+
+ _target setVariable [QGVAR(assignedMedic), _healer];
+
+ // Add to new medic
+ private _healQueue = _healer getVariable [QGVAR(healQueue), []];
+
+ _healQueue deleteAt (_healQueue find _target);
+ _healQueue insert [0, [_target]];
+
+ _healer setVariable [QGVAR(healQueue), _healQueue];
+ },
+ {true},
+ {},
+ [_healer, _x]
+ ] call EFUNC(interact_menu,createAction),
+ [],
+ _x
+ ]
+ };
+ },
+ [_x, _units]
+ ] call EFUNC(interact_menu,createAction),
+ [],
+ _x
+ ]
+ };
+ }
+] call EFUNC(interact_menu,createAction);
+
+["CAManBase", 1, ["ACE_SelfActions"], _action, true] call EFUNC(interact_menu,addActionToClass);
diff --git a/addons/medical_ai/functions/fnc_canRequestMedic.sqf b/addons/medical_ai/functions/fnc_canRequestMedic.sqf
index 685bd57f540..5064e1a7321 100644
--- a/addons/medical_ai/functions/fnc_canRequestMedic.sqf
+++ b/addons/medical_ai/functions/fnc_canRequestMedic.sqf
@@ -4,13 +4,13 @@
* Checks if there is a medic available in the unit's group.
*
* Arguments:
- * None
+ * Unit
*
* Return Value:
* Can request medic
*
* Example:
- * player call ACE_medical_ai_fnc_canRequestMedic
+ * player call ace_medical_ai_fnc_canRequestMedic
*
* Public: No
*/
diff --git a/addons/medical_ai/functions/fnc_healSelf.sqf b/addons/medical_ai/functions/fnc_healSelf.sqf
index 5747637995e..60f2b837124 100644
--- a/addons/medical_ai/functions/fnc_healSelf.sqf
+++ b/addons/medical_ai/functions/fnc_healSelf.sqf
@@ -4,13 +4,13 @@
* Makes the unit heal itself.
*
* Arguments:
- * None
+ * Unit
*
* Return Value:
* None
*
* Example:
- * call ACE_medical_ai_fnc_healSelf
+ * cursorObject call ace_medical_ai_fnc_healSelf
*
* Public: No
*/
diff --git a/addons/medical_ai/functions/fnc_healUnit.sqf b/addons/medical_ai/functions/fnc_healUnit.sqf
index ad867d25700..6d94749d1f9 100644
--- a/addons/medical_ai/functions/fnc_healUnit.sqf
+++ b/addons/medical_ai/functions/fnc_healUnit.sqf
@@ -4,16 +4,17 @@
* Makes a medic heal the next unit that needs treatment.
*
* Arguments:
- * None
+ * Unit
*
* Return Value:
* None
*
* Example:
- * call ACE_medical_ai_fnc_healUnit
+ * cursorObject call ace_medical_ai_fnc_healUnit
*
* Public: No
*/
+
// Player will have to do this manually of course
if ([_this] call EFUNC(common,isPlayer)) exitWith {};
// Can't heal other units when unconscious
@@ -23,10 +24,16 @@ if IS_UNCONSCIOUS(_this) exitWith {
// Find next unit to treat
private _healQueue = _this getVariable [QGVAR(healQueue), []];
-private _target = _healQueue select 0;
+private _target = _healQueue param [0, objNull];
// If unit died or was healed, be lazy and wait for the next tick
-if (isNull _target || {!alive _target} || {!(_target call FUNC(isInjured))}) exitWith {
+// If the unit can't be healed, go to the next unit to be healed
+if (!alive _target || {!(_target call FUNC(isInjured))} || {
+ private _treatmentEvent = (_this getVariable [QGVAR(currentTreatment), []]) param [2, ""];
+
+ // Target still needs healing, but the healer doesn't have the required items (only happens if GVAR(requireItems) != 0) or needs to wait
+ (_treatmentEvent select [0, 6]) == "#needs"
+}) exitWith {
_this forceSpeed -1;
_target forceSpeed -1;
_healQueue deleteAt 0;
@@ -46,6 +53,10 @@ if (_this distance _target > 2.5) exitWith {
_this setVariable [QGVAR(currentTreatment), nil];
if (CBA_missionTime >= (_this getVariable [QGVAR(nextMoveOrder), CBA_missionTime])) then {
_this setVariable [QGVAR(nextMoveOrder), CBA_missionTime + 10];
+
+ // Medic, when doing a lot of treatment, moves away from injured over time (because of animations)
+ // Need to allow the medic to move back to the injured again
+ _this forceSpeed -1;
_this doMove getPosATL _target;
#ifdef DEBUG_MODE_FULL
systemChat format ["%1 moving to %2", _this, _target];
diff --git a/addons/medical_ai/functions/fnc_healingLogic.sqf b/addons/medical_ai/functions/fnc_healingLogic.sqf
index fa35b49284d..9c7ce1c847f 100644
--- a/addons/medical_ai/functions/fnc_healingLogic.sqf
+++ b/addons/medical_ai/functions/fnc_healingLogic.sqf
@@ -1,7 +1,9 @@
#include "..\script_component.hpp"
/*
- * Author: BaerMitUmlaut, PabstMirror
- * Applies healing to target
+ * Author: BaerMitUmlaut, PabstMirror, johnb43
+ * Applies healing to target.
+ * States that contain "needs" are states in which the medic is blocked, either temporairly (HR too high/low) or until resupplied, from treating.
+ * States that contain "wait" are states where the medic waits temporairly before continuing treatment.
*
* Arguments:
* 0: Healer
@@ -11,7 +13,7 @@
* Nothing
*
* Example:
- * [a, b] call ACE_medical_ai_fnc_healingLogic
+ * [cursorObject, cursorObject] call ace_medical_ai_fnc_healingLogic
*
* Public: No
*/
@@ -24,14 +26,58 @@ if (_finishTime > 0) exitWith {
if (CBA_missionTime >= _finishTime) then {
TRACE_5("treatment finished",_finishTime,_treatmentTarget,_treatmentEvent,_treatmentArgs,_treatmentItem);
_healer setVariable [QGVAR(currentTreatment), nil];
+
+ private _usedItem = "";
+
if ((GVAR(requireItems) > 0) && {_treatmentItem != ""}) then {
([_healer, _treatmentItem] call FUNC(itemCheck)) params ["_itemOk", "_itemClassname", "_treatmentClass"];
- if (!_itemOk) exitWith { _treatmentEvent = "#fail"; }; // no item after delay
+ // No item after treatment done
+ if (!_itemOk) exitWith {
+ _treatmentEvent = "#fail";
+ };
+
_healer removeItem _itemClassname;
- if (_treatmentClass != "") then { _treatmentArgs set [2, _treatmentClass]; };
+ _usedItem = _itemClassname;
+
+ if (_treatmentClass != "") then {
+ _treatmentArgs set [2, _treatmentClass];
+ };
};
if ((_treatmentTarget == _target) && {(_treatmentEvent select [0, 1]) != "#"}) then {
+ // There is no event for tourniquet removal, so handle calling function directly
+ if (_treatmentEvent == QGVAR(tourniquetRemove)) exitWith {
+ _treatmentArgs call EFUNC(medical_treatment,tourniquetRemove);
+ };
+
[_treatmentEvent, _treatmentArgs, _target] call CBA_fnc_targetEvent;
+
+ // Splints are already logged on their own
+ switch (_treatmentEvent) do {
+ case QEGVAR(medical_treatment,bandageLocal): {
+ [_target, "activity", ELSTRING(medical_treatment,Activity_bandagedPatient), [[_healer, false, true] call EFUNC(common,getName)]] call EFUNC(medical_treatment,addToLog);
+ };
+ case QEGVAR(medical_treatment,ivBagLocal): {
+ if (_usedItem == "") then {
+ _usedItem = "ACE_salineIV";
+ };
+
+ [_target, _usedItem] call EFUNC(medical_treatment,addToTriageCard);
+ [_target, "activity", ELSTRING(medical_treatment,Activity_gaveIV), [[_healer, false, true] call EFUNC(common,getName)]] call EFUNC(medical_treatment,addToLog);
+ };
+ case QEGVAR(medical_treatment,medicationLocal): {
+ if (_usedItem == "") then {
+ _usedItem = ["ACE_epinephrine", "ACE_morphine"] select (_treatmentArgs select 2 == "Morphine");
+ };
+
+ [_target, _usedItem] call EFUNC(medical_treatment,addToTriageCard);
+ [_target, "activity", ELSTRING(medical_treatment,Activity_usedItem), [[_healer, false, true] call EFUNC(common,getName), getText (configFile >> "CfgWeapons" >> _usedItem >> "displayName")]] call EFUNC(medical_treatment,addToLog);
+ };
+ case QEGVAR(medical_treatment,tourniquetLocal): {
+ [_target, "ACE_tourniquet"] call EFUNC(medical_treatment,addToTriageCard);
+ [_target, "activity", ELSTRING(medical_treatment,Activity_appliedTourniquet), [[_healer, false, true] call EFUNC(common,getName)]] call EFUNC(medical_treatment,addToLog);
+ };
+ };
+
#ifdef DEBUG_MODE_FULL
INFO_4("%1->%2: %3 - %4",_healer,_target,_treatmentEvent,_treatmentArgs);
systemChat format ["Applying [%1->%2]: %3", _healer, _treatmentTarget, _treatmentEvent];
@@ -40,38 +86,164 @@ if (_finishTime > 0) exitWith {
};
};
-private _isMedic = [_healer] call EFUNC(medical_treatment,isMedic);
-private _heartRate = GET_HEART_RATE(_target);
-private _fractures = GET_FRACTURES(_target);
+// Bandage a limb up, then remove the tourniquet on it
+private _fnc_removeTourniquet = {
+ params [["_removeAllTourniquets", false]];
+
+ // Ignore head & torso if not removing all tourniquets (= administering drugs/IVs)
+ private _offset = [2, 0] select _removeAllTourniquets;
+
+ // Bandage the least bleeding body part
+ private _bodyPartBleeding = [];
+ _bodyPartBleeding resize [[4, 6] select _removeAllTourniquets, -1];
+
+ {
+ // Ignore head and torso, if only looking for place to administer drugs/IVs
+ private _partIndex = (ALL_BODY_PARTS find _x) - _offset;
+
+ if (_partIndex >= 0 && {_tourniquets select _partIndex != 0}) then {
+ {
+ _x params ["", "_amountOf", "_bleeding"];
+
+ // max 0, to set the baseline to 0, as body parts with no wounds are marked with -1
+ _bodyPartBleeding set [_partIndex, ((_bodyPartBleeding select _partIndex) max 0) + (_amountOf * _bleeding)];
+ } forEach _y;
+ };
+ } forEach GET_OPEN_WOUNDS(_target);
+
+ // If there are no open wounds, check if there are tourniquets on limbs with no open wounds (stitched or fully healed),
+ // as we know there have to be tourniquets at this point
+ if (_bodyPartBleeding findIf {_x != -1} == -1) then {
+ _bodyPartBleeding set [_tourniquets findIf {_x != 0}, 0];
+ };
+
+ // Ignore body parts that don't have open wounds (-1)
+ private _minBodyPartBleeding = selectMin (_bodyPartBleeding select {_x != -1});
+ private _selection = ALL_BODY_PARTS select ((_bodyPartBleeding find _minBodyPartBleeding) + _offset);
+
+ // If not bleeding anymore, remove the tourniquet
+ if (_minBodyPartBleeding == 0) exitWith {
+ _treatmentEvent = QGVAR(tourniquetRemove);
+ _treatmentTime = 7;
+ _treatmentArgs = [_healer, _target, _selection];
+ };
+
+ // If no bandages available, wait
+ // If check is done at the start of the scope, it will miss the edge case where the unit ran out of bandages just as they finished bandaging tourniqueted body part
+ if !(([_healer, "@bandage"] call FUNC(itemCheck)) # 0) exitWith {
+ _treatmentEvent = "#needsBandage";
+ };
+
+ // Otherwise keep bandaging
+ _treatmentEvent = QEGVAR(medical_treatment,bandageLocal);
+ _treatmentTime = 5;
+ _treatmentArgs = [_target, _selection, "FieldDressing"];
+ _treatmentItem = "@bandage";
+};
+
+// Find a suitable limb (no tourniquets) for adminstering drugs/IVs
+private _fnc_findNoTourniquet = {
+ private _bodyPart = "";
+
+ // If all limbs have tourniquets, find the least damaged limb and try to bandage it
+ if ((_tourniquets select [2]) find 0 == -1) then {
+ call _fnc_removeTourniquet;
+ } else {
+ // Select a random non-tourniqueted limb otherwise
+ private _bodyParts = ["leftarm", "rightarm", "leftleg", "rightleg"];
+
+ while {_bodyParts isNotEqualTo []} do {
+ _bodyPart = selectRandom _bodyParts;
+
+ // If no tourniquet on, use that body part
+ if (_tourniquets select (ALL_BODY_PARTS find _bodyPart) == 0) exitWith {};
+
+ _bodyParts deleteAt (_bodyParts find _bodyPart);
+ };
+ };
+
+ _bodyPart // return
+};
+
+private _tourniquets = GET_TOURNIQUETS(_target);
private _treatmentEvent = "#none";
private _treatmentArgs = [];
private _treatmentTime = 6;
private _treatmentItem = "";
-switch (true) do {
- case ((GET_WOUND_BLEEDING(_target) > 0)
- && {([_healer, "@bandage"] call FUNC(itemCheck)) # 0}): {
- // Select first bleeding wound and bandage it
- private _selection = "?";
+
+if (true) then {
+ if (IS_BLEEDING(_target)) exitWith {
+ private _hasBandage = ([_healer, "@bandage"] call FUNC(itemCheck)) # 0;
+ private _hasTourniquet = ([_healer, "tourniquet"] call FUNC(itemCheck)) # 0;
+
+ // Patient is not worth treating if bloodloss can't be stopped
+ if !(_hasBandage || _hasTourniquet) exitWith {
+ _treatmentEvent = "#needsBandageOrTourniquet";
+ };
+
+ // Bandage the heaviest bleeding body part
+ private _bodyPartBleeding = [0, 0, 0, 0, 0, 0];
+
{
- private _foundBleeding = _y findIf {
- _x params ["", "_amount", "_percentage"];
- (_amount * _percentage) > 0
+ private _partIndex = ALL_BODY_PARTS find _x;
+
+ // Ignore tourniqueted limbs
+ if (_tourniquets select _partIndex == 0) then {
+ {
+ _x params ["", "_amountOf", "_bleeding"];
+ _bodyPartBleeding set [_partIndex, (_bodyPartBleeding select _partIndex) + (_amountOf * _bleeding)];
+ } forEach _y;
};
- if (_foundBleeding != -1) exitWith { _selection = _x; };
} forEach GET_OPEN_WOUNDS(_target);
+
+ private _maxBodyPartBleeding = selectMax _bodyPartBleeding;
+ private _bodyPartIndex = _bodyPartBleeding find _maxBodyPartBleeding;
+ private _selection = ALL_BODY_PARTS select _bodyPartIndex;
+
+ // Apply tourniquet if moderate bleeding or no bandage is available, and if not head and torso
+ if (_hasTourniquet && {_bodyPartIndex > HITPOINT_INDEX_BODY} && {!_hasBandage || {_maxBodyPartBleeding > 0.3}}) exitWith {
+ _treatmentEvent = QEGVAR(medical_treatment,tourniquetLocal);
+ _treatmentTime = 7;
+ _treatmentArgs = [_target, _selection];
+ _treatmentItem = "tourniquet";
+ };
+
_treatmentEvent = QEGVAR(medical_treatment,bandageLocal);
_treatmentTime = 5;
_treatmentArgs = [_target, _selection, "FieldDressing"];
_treatmentItem = "@bandage";
};
- case (IN_CRDC_ARRST(_target) && {EGVAR(medical_treatment,cprSuccessChanceMin) > 0}): {
+
+ private _bloodVolume = GET_BLOOD_VOLUME(_target);
+ private _needsIV = _bloodVolume < MINIMUM_BLOOD_FOR_STABLE_VITALS;
+ private _canGiveIV = _needsIV &&
+ {_healer call EFUNC(medical_treatment,isMedic)} &&
+ {([_healer, "@iv"] call FUNC(itemCheck)) # 0}; // Has IVs
+ private _doCPR = IN_CRDC_ARRST(_target) && {EGVAR(medical_treatment,cprSuccessChanceMin) > 0};
+
+ // If in cardiac arrest, first add some blood to injured if necessary, then do CPR (doing CPR when not enough blood is suboptimal if you have IVs)
+ // If healer has no IVs, allow AI to do CPR to keep injured alive
+ if (
+ _doCPR &&
+ {!_canGiveIV || {_bloodVolume >= BLOOD_VOLUME_CLASS_3_HEMORRHAGE}}
+ ) exitWith {
_treatmentEvent = QEGVAR(medical_treatment,cprLocal);
_treatmentArgs = [_healer, _target];
_treatmentTime = 15;
};
- case (_isMedic && {GET_BLOOD_VOLUME(_target) < MINIMUM_BLOOD_FOR_STABLE_VITALS}
- && {([_healer, "@iv"] call FUNC(itemCheck)) # 0}): {
+
+ private _bodypart = "";
+
+ if (
+ _canGiveIV && {
+ // If all limbs are tourniqueted, bandage the one with the least amount of wounds, so that the tourniquet can be removed
+ _bodyPart = call _fnc_findNoTourniquet;
+ _bodyPart == ""
+ }
+ ) exitWith {};
+
+ if (_canGiveIV) then {
// Check if patient's blood volume + remaining IV volume is enough to allow the patient to wake up
private _totalIvVolume = 0; //in ml
{
@@ -79,57 +251,132 @@ switch (true) do {
_totalIvVolume = _totalIvVolume + _volumeRemaining;
} forEach (_target getVariable [QEGVAR(medical,ivBags), []]);
- if (GET_BLOOD_VOLUME(_target) + (_totalIvVolume / 1000) > MINIMUM_BLOOD_FOR_STABLE_VITALS) exitWith {
- _treatmentEvent = "#waitForBlood";
+ // Check if the medic has to wait, which allows for a little multitasking
+ if (_bloodVolume + (_totalIvVolume / 1000) >= MINIMUM_BLOOD_FOR_STABLE_VITALS) then {
+ _treatmentEvent = "#waitForIV";
+ _needsIV = false;
+ _canGiveIV = false;
};
+ };
+
+ if (_canGiveIV) exitWith {
_treatmentEvent = QEGVAR(medical_treatment,ivBagLocal);
_treatmentTime = 5;
- _treatmentArgs = [_target, selectRandom ["leftarm", "rightarm", "leftleg", "rightleg"], "SalineIV"];
+ _treatmentArgs = [_target, _bodyPart, "SalineIV"];
_treatmentItem = "@iv";
};
- case ((count (_target getVariable [VAR_MEDICATIONS, []])) >= 6): {
- _treatmentEvent = "#tooManyMeds";
- };
- case (((_fractures select 4) == 1)
- && {([_healer, "splint"] call FUNC(itemCheck)) # 0}): {
+
+ // Leg fractures
+ private _index = (GET_FRACTURES(_target) select [4, 2]) find 1;
+
+ if (
+ _index != -1 && {
+ // In case the unit doesn't have a splint, set state here
+ _treatmentEvent = "#needsSplint";
+
+ ([_healer, "splint"] call FUNC(itemCheck)) # 0
+ }
+ ) exitWith {
_treatmentEvent = QEGVAR(medical_treatment,splintLocal);
_treatmentTime = 6;
- _treatmentArgs = [_healer, _target, "leftleg"];
+ _treatmentArgs = [_healer, _target, ALL_BODY_PARTS select (_index + 4)];
_treatmentItem = "splint";
};
- case (((_fractures select 5) == 1)
- && {([_healer, "splint"] call FUNC(itemCheck)) # 0}): {
- _treatmentEvent = QEGVAR(medical_treatment,splintLocal);
- _treatmentTime = 6;
- _treatmentArgs = [_healer, _target, "rightleg"];
- _treatmentItem = "splint";
+
+ // Wait until the injured has enough blood before administering drugs
+ // (_needsIV && !_canGiveIV), but _canGiveIV is false here, otherwise IV would be given
+ if (_needsIV || {_doCPR && {_treatmentEvent == "#waitForIV"}}) exitWith {
+ // If injured is in cardiac arrest and the healer is doing nothing else, start CPR
+ if (_doCPR) exitWith {
+ // Medic remains in this loop until injured is given enough IVs or dies
+ _treatmentEvent = QEGVAR(medical_treatment,cprLocal);
+ _treatmentArgs = [_healer, _target];
+ _treatmentTime = 15;
+ };
+
+ // If the injured needs IVs, but healer can't give it to them, have healder wait
+ if (_needsIV) exitWith {
+ _treatmentEvent = "#needsIV";
+ };
};
- case ((IS_UNCONSCIOUS(_target) || {_heartRate <= 50})
- && {([_healer, "epinephrine"] call FUNC(itemCheck)) # 0}): {
- if (CBA_missionTime < (_target getVariable [QGVAR(nextEpinephrine), -1])) exitWith {
+
+ // These checks are not exitWith, so that the medic can try to bandage up tourniqueted body parts
+ if ((count (_target getVariable [VAR_MEDICATIONS, []])) >= 6) then {
+ _treatmentEvent = "#needsFewerMeds";
+ };
+
+ private _heartRate = GET_HEART_RATE(_target);
+ private _canGiveEpinephrine = !(_treatmentEvent in ["#needsFewerMeds", "#waitForIV"]) &&
+ {IS_UNCONSCIOUS(_target) || {_heartRate <= 50}} &&
+ {
+ // In case the unit doesn't have a epinephrine injector, set state here
+ _treatmentEvent = "#needsEpinephrine";
+
+ ([_healer, "epinephrine"] call FUNC(itemCheck)) # 0
+ };
+
+ // This allows for some multitasking
+ if (_canGiveEpinephrine) then {
+ if (CBA_missionTime < (_target getVariable [QGVAR(nextEpinephrine), -1])) then {
_treatmentEvent = "#waitForEpinephrineToTakeEffect";
+ _canGiveEpinephrine = false;
};
- if (_heartRate > 180) exitWith {
- _treatmentEvent = "#waitForSlowerHeart";
+
+ if (_heartRate > 180) then {
+ _treatmentEvent = "#needsSlowerHeart";
+ _canGiveEpinephrine = false;
};
+ };
+
+ if (_canGiveEpinephrine) exitWith {
+ // If all limbs are tourniqueted, bandage the one with the least amount of wounds, so that the tourniquet can be removed
+ _bodyPart = call _fnc_findNoTourniquet;
+
+ if (_bodyPart == "") exitWith {};
+
_target setVariable [QGVAR(nextEpinephrine), CBA_missionTime + 10];
_treatmentEvent = QEGVAR(medical_treatment,medicationLocal);
_treatmentTime = 2.5;
- _treatmentArgs = [_target, selectRandom ["leftarm", "rightarm", "leftleg", "rightleg"], "Epinephrine"];
+ _treatmentArgs = [_target, _bodyPart, "Epinephrine"];
_treatmentItem = "epinephrine";
};
- case (((GET_PAIN_PERCEIVED(_target) > 0.25) || {_heartRate >= 180})
- && {([_healer, "morphine"] call FUNC(itemCheck)) # 0}): {
+
+ // Remove all remaining tourniquets by bandaging all body parts
+ if (_tourniquets isNotEqualTo DEFAULT_TOURNIQUET_VALUES) then {
+ true call _fnc_removeTourniquet;
+ };
+
+ // If the healer can bandage or remove tourniquets, do that
+ if (_treatmentEvent in [QEGVAR(medical_treatment,bandageLocal), QGVAR(tourniquetRemove)]) exitWith {};
+
+ // Otherwise, if the healer is either done or out of bandages, continue
+ if (
+ !(_treatmentEvent in ["#needsFewerMeds", "#waitForIV"]) &&
+ {(GET_PAIN_PERCEIVED(_target) > 0.25) || {_heartRate >= 180}} &&
+ {
+ // In case the unit doesn't have a morphine injector, set state here
+ _treatmentEvent = "#needsMorphine";
+
+ ([_healer, "morphine"] call FUNC(itemCheck)) # 0
+ }
+ ) exitWith {
if (CBA_missionTime < (_target getVariable [QGVAR(nextMorphine), -1])) exitWith {
_treatmentEvent = "#waitForMorphineToTakeEffect";
};
+
if (_heartRate < 60) exitWith {
- _treatmentEvent = "#waitForFasterHeart";
+ _treatmentEvent = "#needsFasterHeart";
};
+
+ // If all limbs are tourniqueted, bandage the one with the least amount of wounds, so that the tourniquet can be removed
+ _bodyPart = call _fnc_findNoTourniquet;
+
+ if (_bodyPart == "") exitWith {};
+
_target setVariable [QGVAR(nextMorphine), CBA_missionTime + 30];
_treatmentEvent = QEGVAR(medical_treatment,medicationLocal);
_treatmentTime = 2.5;
- _treatmentArgs = [_target, selectRandom ["leftarm", "rightarm", "leftleg", "rightleg"], "Morphine"];
+ _treatmentArgs = [_target, _bodyPart, "Morphine"];
_treatmentItem = "morphine";
};
};
@@ -137,10 +384,16 @@ switch (true) do {
_healer setVariable [QGVAR(currentTreatment), [CBA_missionTime + _treatmentTime, _target, _treatmentEvent, _treatmentArgs, _treatmentItem]];
// Play animation
-if ((_treatmentEvent select [0,1]) != "#") then {
- private _treatmentClassname = _treatmentArgs select 2;
- if (_treatmentEvent == QEGVAR(medical_treatment,splintLocal)) then { _treatmentClassname = "Splint" };
- [_healer, _treatmentClassname, (_healer == _target)] call FUNC(playTreatmentAnim);
+if ((_treatmentEvent select [0, 1]) != "#") then {
+ private _treatmentClassname = switch (_treatmentEvent) do {
+ case QEGVAR(medical_treatment,splintLocal): {"Splint"};
+ case QEGVAR(medical_treatment,cprLocal): {"CPR"};
+ case QEGVAR(medical_treatment,tourniquetLocal): {"ApplyTourniquet"};
+ case QGVAR(tourniquetRemove): {"RemoveTourniquet"};
+ default {_treatmentArgs select 2};
+ };
+
+ [_healer, _treatmentClassname, _healer == _target] call FUNC(playTreatmentAnim);
};
#ifdef DEBUG_MODE_FULL
diff --git a/addons/medical_ai/functions/fnc_isInjured.sqf b/addons/medical_ai/functions/fnc_isInjured.sqf
index a163a4c808b..2a4b6895143 100644
--- a/addons/medical_ai/functions/fnc_isInjured.sqf
+++ b/addons/medical_ai/functions/fnc_isInjured.sqf
@@ -10,7 +10,7 @@
* Does unit need treatment
*
* Example:
- * player call ACE_medical_ai_fnc_isInjured
+ * cursorObject call ace_medical_ai_fnc_isInjured
*
* Public: No
*/
@@ -24,3 +24,4 @@ if !(alive _this) exitWith {false};
private _fractures = GET_FRACTURES(_this);
((_fractures select 4) == 1) || {(_fractures select 5) == 1}
}
+|| { GET_TOURNIQUETS(_this) isNotEqualTo DEFAULT_TOURNIQUET_VALUES }
diff --git a/addons/medical_ai/functions/fnc_isSafe.sqf b/addons/medical_ai/functions/fnc_isSafe.sqf
index 04da058ce0c..21d59a15d63 100644
--- a/addons/medical_ai/functions/fnc_isSafe.sqf
+++ b/addons/medical_ai/functions/fnc_isSafe.sqf
@@ -10,7 +10,7 @@
* Is unit safe enough
*
* Example:
- * call ACE_medical_ai_fnc_isSafe
+ * cursorObject call ace_medical_ai_fnc_isSafe
*
* Public: No
*/
diff --git a/addons/medical_ai/functions/fnc_itemCheck.sqf b/addons/medical_ai/functions/fnc_itemCheck.sqf
index 6d91594ce47..320ae62410c 100644
--- a/addons/medical_ai/functions/fnc_itemCheck.sqf
+++ b/addons/medical_ai/functions/fnc_itemCheck.sqf
@@ -1,7 +1,7 @@
#include "..\script_component.hpp"
/*
* Author: PabstMirror
- * Checks if AI healer has items
+ * Checks if AI healer has items.
*
* Arguments:
* 0: Healer
@@ -13,7 +13,7 @@
* 2: Treatment (Optional)
*
* Example:
- * [cursorObject, "@bandage"] call ACE_medical_ai_fnc_itemCheck
+ * [cursorObject, "@bandage"] call ace_medical_ai_fnc_itemCheck
*
* Public: No
*/
diff --git a/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf b/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf
index b8e77aab43e..9b663f65b22 100644
--- a/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf
+++ b/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf
@@ -12,10 +12,11 @@
* None
*
* Example:
- * [bob, true, true] call ACE_medical_ai_fnc_playTreatmentAnim
+ * [cursorObject, "Splint", true] call ace_medical_ai_fnc_playTreatmentAnim
*
* Public: No
*/
+
params ["_unit", "_actionName", "_isSelfTreatment"];
TRACE_3("playTreatmentAnim",_unit,_actionName,_isSelfTreatment);
diff --git a/addons/medical_ai/functions/fnc_requestMedic.sqf b/addons/medical_ai/functions/fnc_requestMedic.sqf
index 9e59181204d..758fa80a1fd 100644
--- a/addons/medical_ai/functions/fnc_requestMedic.sqf
+++ b/addons/medical_ai/functions/fnc_requestMedic.sqf
@@ -4,21 +4,24 @@
* Sends a request to the units assigned medic to heal it.
*
* Arguments:
- * None
+ * Unit
*
* Return Value:
* None
*
* Example:
- * call ACE_medical_ai_fnc_requestMedic
+ * cursorObject call ace_medical_ai_fnc_requestMedic
*
* Public: No
*/
private _assignedMedic = _this getVariable QGVAR(assignedMedic);
private _healQueue = _assignedMedic getVariable [QGVAR(healQueue), []];
-_healQueue pushBack _this;
-_assignedMedic setVariable [QGVAR(healQueue), _healQueue];
+
+// Only update if it was actually changed
+if (_healQueue pushBackUnique _this != -1) then {
+ _assignedMedic setVariable [QGVAR(healQueue), _healQueue];
+};
#ifdef DEBUG_MODE_FULL
systemChat format ["%1 requested %2 for medical treatment", _this, _assignedMedic];
diff --git a/addons/medical_ai/functions/fnc_wasRequested.sqf b/addons/medical_ai/functions/fnc_wasRequested.sqf
index 3b6c1cf0592..ffb9aa37808 100644
--- a/addons/medical_ai/functions/fnc_wasRequested.sqf
+++ b/addons/medical_ai/functions/fnc_wasRequested.sqf
@@ -4,13 +4,13 @@
* Checks if the unit was requested to treat another unit.
*
* Arguments:
- * None
+ * Unit
*
* Return Value:
* Was requested
*
* Example:
- * call ACE_medical_ai_fnc_wasRequested
+ * cursorObject call ace_medical_ai_fnc_wasRequested
*
* Public: No
*/
diff --git a/addons/medical_ai/initSettings.inc.sqf b/addons/medical_ai/initSettings.inc.sqf
index a2b06519a48..b8ff7e61346 100644
--- a/addons/medical_ai/initSettings.inc.sqf
+++ b/addons/medical_ai/initSettings.inc.sqf
@@ -1,7 +1,8 @@
private _categoryArray = [ELSTRING(medical,Category), "STR_TEAM_SWITCH_AI"];
[
- QGVAR(enabledFor), "LIST",
+ QGVAR(enabledFor),
+ "LIST",
[LLSTRING(enableFor_title), LLSTRING(enableFor_desc)],
_categoryArray,
[
@@ -15,7 +16,8 @@ private _categoryArray = [ELSTRING(medical,Category), "STR_TEAM_SWITCH_AI"];
] call CBA_fnc_addSetting;
[
- QGVAR(requireItems), "LIST",
+ QGVAR(requireItems),
+ "LIST",
[LSTRING(requireItems_title), LSTRING(requireItems_desc)],
_categoryArray,
[
@@ -24,16 +26,6 @@ private _categoryArray = [ELSTRING(medical,Category), "STR_TEAM_SWITCH_AI"];
0
],
true, // isGlobal
- {
- if (GVAR(requireItems) != 2) exitWith {};
- ["CAManBase", "initPost", {
- [{
- params ["_unit"];
- if ((!local _unit) || {!alive _unit} || {isPlayer _unit}) exitWith {};
- TRACE_2("replacing medical items on AI",_unit,typeOf _unit);
- [_unit] call EFUNC(common,replaceRegisteredItems);
- }, _this] call CBA_fnc_execNextFrame; // need to delay a frame before modifying items in a backpack
- }, nil, [IGNORE_BASE_UAVPILOTS], true] call CBA_fnc_addClassEventHandler;
- },
+ {[QGVAR(requireItems), _this] call EFUNC(common,cbaSettings_settingChanged)},
true // Needs mission restart
] call CBA_fnc_addSetting;
diff --git a/addons/medical_ai/stateMachine.inc.sqf b/addons/medical_ai/stateMachine.inc.sqf
index 03483f49815..73b82f98a9c 100644
--- a/addons/medical_ai/stateMachine.inc.sqf
+++ b/addons/medical_ai/stateMachine.inc.sqf
@@ -17,13 +17,8 @@ GVAR(stateMachine) = [{call EFUNC(common,getLocalUnits)}, true] call CBA_statema
#endif
}, {}, {}, "Safe"] call CBA_statemachine_fnc_addState;
-[GVAR(stateMachine), LINKFUNC(healSelf), {}, {
- _this setVariable [QGVAR(treatmentOverAt), nil];
-}, "HealSelf"] call CBA_statemachine_fnc_addState;
-
-[GVAR(stateMachine), LINKFUNC(healUnit), {}, {
- _this setVariable [QGVAR(treatmentOverAt), nil];
-}, "HealUnit"] call CBA_statemachine_fnc_addState;
+[GVAR(stateMachine), LINKFUNC(healSelf), {}, {}, "HealSelf"] call CBA_statemachine_fnc_addState;
+[GVAR(stateMachine), LINKFUNC(healUnit), {}, {}, "HealUnit"] call CBA_statemachine_fnc_addState;
// Add Transistions [statemachine, originalState, targetState, condition, onTransition, name]
[GVAR(stateMachine), "Initial", "Injured", LINKFUNC(isInjured), {}, "Injured"] call CBA_statemachine_fnc_addTransition;
diff --git a/addons/medical_damage/CfgEventHandlers.hpp b/addons/medical_damage/CfgEventHandlers.hpp
index 865276cfba9..f6503c2479b 100644
--- a/addons/medical_damage/CfgEventHandlers.hpp
+++ b/addons/medical_damage/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/medical_damage/XEH_postInit.sqf b/addons/medical_damage/XEH_postInit.sqf
new file mode 100644
index 00000000000..39b1c9301e9
--- /dev/null
+++ b/addons/medical_damage/XEH_postInit.sqf
@@ -0,0 +1,4 @@
+#include "script_component.hpp"
+
+// Reload configs (handle functions being compiled after medical_damage's preInit)
+call FUNC(parseConfigForInjuries);
diff --git a/addons/medical_damage/XEH_preInit.sqf b/addons/medical_damage/XEH_preInit.sqf
index 344b9c81ee0..b389a0eaa0c 100644
--- a/addons/medical_damage/XEH_preInit.sqf
+++ b/addons/medical_damage/XEH_preInit.sqf
@@ -10,11 +10,13 @@ PREP_RECOMPILE_END;
call FUNC(parseConfigForInjuries);
+/*
addMissionEventHandler ["Loaded",{
INFO("Mission Loaded - Reloading medical configs for extension");
// Reload configs into extension (handle full game restart)
call FUNC(parseConfigForInjuries);
}];
+*/
[QEGVAR(medical,woundReceived), LINKFUNC(woundReceived)] call CBA_fnc_addEventHandler;
diff --git a/addons/medical_damage/config.cpp b/addons/medical_damage/config.cpp
index 4df519a648e..89ac2955250 100644
--- a/addons/medical_damage/config.cpp
+++ b/addons/medical_damage/config.cpp
@@ -27,13 +27,4 @@ class CfgPatches {
#include "CfgEventHandlers.hpp"
#include "CfgAmmo.hpp"
#include "CfgEden.hpp"
-
-/*
-class ACE_Extensions {
- class ace_medical {
- // Not yet used
- };
-};
- */
-
#endif
diff --git a/addons/medical_damage/functions/fnc_debug_explosiveTest.sqf b/addons/medical_damage/functions/fnc_debug_explosiveTest.sqf
index d17b268c157..a867a654707 100644
--- a/addons/medical_damage/functions/fnc_debug_explosiveTest.sqf
+++ b/addons/medical_damage/functions/fnc_debug_explosiveTest.sqf
@@ -34,7 +34,7 @@ params [
_distances params [["_min", 1], ["_max", 10], ["_step", 1]];
-if (isNil "_center") exitwith {};
+if (isNil "_center") exitWith {};
_max = _max max _min;
private _nSteps = 0 max ceil ((_max - _min) / _step);
diff --git a/addons/medical_damage/functions/fnc_parseWoundHandlersCfg.sqf b/addons/medical_damage/functions/fnc_parseWoundHandlersCfg.sqf
index 0dad747c683..010f02b7f5d 100644
--- a/addons/medical_damage/functions/fnc_parseWoundHandlersCfg.sqf
+++ b/addons/medical_damage/functions/fnc_parseWoundHandlersCfg.sqf
@@ -1,7 +1,7 @@
#include "..\script_component.hpp"
/*
* Author: Pterolatypus
- * Read a list of wound handler entries from config, accounting for inheritance
+ * Read a list of wound handler entries from config, accounting for inheritance.
*
* Arguments:
* 0: The config class containing the entries
@@ -10,24 +10,43 @@
* None
*
* Example:
- * [configFile >> "ace_medical_injuries" >> "damageTypes"] call ace_medical_damage_fnc_parseWoundHandlersCfg
+ * [configFile >> "ace_medical_injuries" >> "damageTypes" >> "woundHandlers"] call ace_medical_damage_fnc_parseWoundHandlersCfg
*
* Public: No
*/
+
params ["_config"];
-// read all valid entries from config and store
+// Read all valid entries from config and store
private _entries = [];
+
{
- private _entryResult = call compile getText _x;
- if !(isNil "_entryResult") then {
- _entries pushBack _entryResult;
- }
+ private _entryResult = getText _x;
+
+ if (_entryResult != "") then {
+ if (ADDON) then {
+ // Runs in postInit
+ _entryResult = call compile _entryResult;
+
+ if (!isNil "_entryResult") then {
+ if (_entryResult isEqualType {}) then {
+ _entries pushBack _entryResult;
+ } else {
+ ERROR_2("Wound handler '%1' needs to be a function, but is of type %2.",configName _x,toLowerANSI typeName _entryResult);
+ };
+ };
+ } else {
+ // Runs in preInit
+ // In case function doesn't exist yet, wrap in extra layer
+ _entries pushBack (compile format ["call %1", _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;
+// Recursive call for parent
+// Can't use configProperties for inheritance since it returns entries in the wrong order
+([_parent] call FUNC(parseWoundHandlersCfg)) + _entries // return
diff --git a/addons/medical_damage/functions/fnc_woundReceived.sqf b/addons/medical_damage/functions/fnc_woundReceived.sqf
index a7e3861dee1..c31cf5b3789 100644
--- a/addons/medical_damage/functions/fnc_woundReceived.sqf
+++ b/addons/medical_damage/functions/fnc_woundReceived.sqf
@@ -17,18 +17,23 @@
*
* 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);
+
+ // If invalid return, exit
+ if (isNil "_damageData" || {!(_damageData isEqualType [])} || {(count _damageData) < 3}) exitWith {
+ TRACE_1("Return invalid, skipping wound handling",_damageData);
};
} forEach _woundHandlers;
};
diff --git a/addons/medical_damage/functions/fnc_woundsHandlerBase.sqf b/addons/medical_damage/functions/fnc_woundsHandlerBase.sqf
index fb82f383b6e..92effda9bd5 100644
--- a/addons/medical_damage/functions/fnc_woundsHandlerBase.sqf
+++ b/addons/medical_damage/functions/fnc_woundsHandlerBase.sqf
@@ -22,7 +22,7 @@ TRACE_3("woundsHandlerBase",_unit,_allDamages,_typeOfDamage);
if !(_typeOfDamage in GVAR(damageTypeDetails)) then {
- WARNING_1("damage type not found",_typeOfDamage);
+ WARNING_1("damage type %1 not found",_typeOfDamage);
_typeOfDamage = "unknown";
};
@@ -80,7 +80,7 @@ private _bodyPartVisParams = [_unit, false, false, false, false]; // params arra
// 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);
+ WARNING_4("No valid wound types %1-%2-%3-%4",_damage,_dmgPerWound,_typeOfDamage,_bodyPart);
continue
};
GVAR(woundDetails) get _woundTypeToAdd params ["","_injuryBleedingRate","_injuryPain","_causeLimping","_causeFracture"];
diff --git a/addons/medical_damage/functions/fnc_woundsHandlerBurning.sqf b/addons/medical_damage/functions/fnc_woundsHandlerBurning.sqf
index 47c625684ac..1130c8d3f53 100644
--- a/addons/medical_damage/functions/fnc_woundsHandlerBurning.sqf
+++ b/addons/medical_damage/functions/fnc_woundsHandlerBurning.sqf
@@ -37,7 +37,7 @@ TRACE_3("woundsHandlerBurning",_unit,_allDamages,_typeOfDamage);
[{
params ["_unit"];
- _bodyPart = selectRandom ["body", "leftleg", "rightleg"];
+ private _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];
diff --git a/addons/medical_engine/functions/fnc_handleDamage.sqf b/addons/medical_engine/functions/fnc_handleDamage.sqf
index 168203366c2..591e68e2533 100644
--- a/addons/medical_engine/functions/fnc_handleDamage.sqf
+++ b/addons/medical_engine/functions/fnc_handleDamage.sqf
@@ -94,7 +94,7 @@ if (
GET_NUMBER(_ammoCfg >> "explosive",0) > 0 ||
{GET_NUMBER(_ammoCfg >> "indirectHit",0) > 0}
}
-) exitwith {
+) exitWith {
TRACE_5("Vehicle hit",_unit,_shooter,_instigator,_damage,_newDamage);
_unit setVariable [QEGVAR(medical,lastDamageSource), _shooter];
@@ -165,7 +165,11 @@ if (_context == 2) then {
if (_environmentDamage) then {
// Any collision with terrain/vehicle/object has a shooter
// Check this first because burning can happen at any velocity
- if !(isNull _shooter) then {
+ if (isNull _shooter) then {
+ // Anything else is almost guaranteed to be fire damage
+ _ammo = "fire";
+ TRACE_5("Fire Damage",_unit,_shooter,_instigator,_damage,_allDamages);
+ } else {
/*
If shooter != unit then they hit unit, otherwise it could be:
- Unit hitting anything at speed
@@ -180,10 +184,6 @@ if (_context == 2) then {
_ammo = "collision";
TRACE_5("Collision",_unit,_shooter,_instigator,_damage,_allDamages);
};
- } else {
- // Anything else is almost guaranteed to be fire damage
- _ammo = "fire";
- TRACE_5("Fire Damage",_unit,_shooter,_instigator,_damage,_allDamages);
};
};
diff --git a/addons/medical_engine/functions/fnc_lockUnconsciousSeat.sqf b/addons/medical_engine/functions/fnc_lockUnconsciousSeat.sqf
index cc29e75cc1a..8441df4ad83 100644
--- a/addons/medical_engine/functions/fnc_lockUnconsciousSeat.sqf
+++ b/addons/medical_engine/functions/fnc_lockUnconsciousSeat.sqf
@@ -11,7 +11,6 @@
*
* Public: No
*/
-if (missionNamespace getVariable [QGVAR(disableSeatLocking), false]) exitWith {};
params ["_unit"];
private _vehicle = objectParent _unit;
@@ -20,6 +19,13 @@ TRACE_3("lockUnconsciousSeat",_unit,_vehicle,lifeState _unit);
if (isNull _vehicle) exitWith {};
if (alive _unit && {lifeState _unit != "INCAPACITATED"}) exitWith {};
+private _disable = missionNamespace getVariable [QGVAR(disableSeatLocking), false];
+if (_disable isEqualTo true || {
+ _disable isEqualType [] && {
+ (_disable findIf {_vehicle isKindOf _x}) != -1
+ }
+}) exitWith {};
+
switch (true) do {
case (_unit isEqualTo (driver _vehicle)): {
_vehicle lockDriver true;
diff --git a/addons/medical_engine/functions/fnc_updateDamageEffects.sqf b/addons/medical_engine/functions/fnc_updateDamageEffects.sqf
index 7dc73e04f47..f4a18094a60 100644
--- a/addons/medical_engine/functions/fnc_updateDamageEffects.sqf
+++ b/addons/medical_engine/functions/fnc_updateDamageEffects.sqf
@@ -67,7 +67,7 @@ if (!_isLimping && {EGVAR(medical,limping) > 0}) then {
(_xAmountOf > 0)
&& {_xDamage > LIMPING_DAMAGE_THRESHOLD}
// select _causeLimping from woundDetails
- && {(EGVAR(medical_damage,woundDetails) get (_xClassID / 10)) select 3}
+ && {(EGVAR(medical_damage,woundDetails) get (floor (_xClassID / 10))) select 3}
) exitWith {
TRACE_1("limping because of wound",_x);
_isLimping = true;
diff --git a/addons/medical_feedback/functions/fnc_playInjuredSound.sqf b/addons/medical_feedback/functions/fnc_playInjuredSound.sqf
index c278e6e08ae..b33b533e25f 100644
--- a/addons/medical_feedback/functions/fnc_playInjuredSound.sqf
+++ b/addons/medical_feedback/functions/fnc_playInjuredSound.sqf
@@ -6,8 +6,11 @@
*
* Arguments:
* 0: Unit
- * 1: Type (optional) ["hit" (default) or "moan"]
- * 2: Severity (optional) [0 (default), 1, 2]
+ * 1: Type ["hit", "moan"] (default: "hit")
+ * 2: Severity [0, 1, 2] (default: 0)
+ * 3: Hit sound distances (default: [50, 60, 70])
+ * 4: Moan sound distances (default: [10, 15, 20])
+ * 5: Allow unconscious units (default: false)
*
* Return Value:
* None
@@ -20,18 +23,18 @@
#define TIME_OUT_HIT 1
#define TIME_OUT_MOAN [12, 7.5, 5]
-params [["_unit", objNull, [objNull]], ["_type", "hit", [""]], ["_severity", 0, [0]]];
+params [["_unit", objNull, [objNull]], ["_type", "hit", [""]], ["_severity", 0, [0]], ["_hitDistances", [50, 60, 70], [[]], [3]], ["_moanDistances", [10, 15, 20], [[]], [3]], ["_allowUnconscious", false, [true]]];
// TRACE_3("",_unit,_type,_severity);
if (!local _unit) exitWith { ERROR_2("playInjuredSound: Unit not local or null [%1:%2]",_unit,typeOf _unit); };
-if !(_unit call EFUNC(common,isAwake)) exitWith {};
+if (!_allowUnconscious && {!(_unit call EFUNC(common,isAwake))}) exitWith {};
// Limit network traffic by only sending the event to players who can potentially hear it
private _distance = if (_type == "hit") then {
- [50, 60, 70] select _severity;
+ _hitDistances select _severity
} else {
- [10, 15, 20] select _severity;
+ _moanDistances select _severity
};
private _targets = allPlayers inAreaArray [ASLToAGL getPosASL _unit, _distance, _distance, 0, false, _distance];
if (_targets isEqualTo []) exitWith {};
diff --git a/addons/medical_gui/XEH_postInit.sqf b/addons/medical_gui/XEH_postInit.sqf
index 2b7fb8ce523..6d18696b0e7 100644
--- a/addons/medical_gui/XEH_postInit.sqf
+++ b/addons/medical_gui/XEH_postInit.sqf
@@ -2,6 +2,8 @@
if (!hasInterface) exitWith {};
+#include "initKeybinds.inc.sqf"
+
GVAR(target) = objNull;
GVAR(previousTarget) = objNull;
GVAR(selectedBodyPart) = 0;
@@ -35,64 +37,6 @@ GVAR(selfInteractionActions) = [];
};
}] call CBA_fnc_addEventHandler;
-["ACE3 Common", QGVAR(openMedicalMenuKey), localize LSTRING(OpenMedicalMenu), {
- // Get target (cursorTarget, cursorObject, and lineIntersectsSurfaces along camera to maxDistance), if not valid then target is ACE_player
- TRACE_3("Open menu key",cursorTarget,cursorObject,ACE_player);
- private _target = cursorTarget;
- if !(_target isKindOf "CAManBase" && {[ACE_player, _target] call FUNC(canOpenMenu)}) then {
- _target = cursorObject;
- if !(_target isKindOf "CAManBase" && {[ACE_player, _target] call FUNC(canOpenMenu)}) then {
- private _start = AGLToASL positionCameraToWorld [0, 0, 0];
- private _end = AGLToASL positionCameraToWorld [0, 0, GVAR(maxDistance)];
- private _intersections = lineIntersectsSurfaces [_start, _end, ACE_player, objNull, true, -1, "FIRE"];
- {
- _x params ["", "", "_intersectObject"];
- // Only look "through" player and player's vehicle
- if (!(_intersectObject isKindOf "CAManBase") && {_intersectObject != vehicle ACE_player}) exitWith {};
- if (_intersectObject != ACE_player && {_intersectObject isKindOf "CAManBase" && {[ACE_player, _intersectObject] call FUNC(canOpenMenu)}}) exitWith {
- _target =_intersectObject
- };
- } forEach _intersections;
- if (!(_target isKindOf "CAManBase") || {!([ACE_player, _target] call FUNC(canOpenMenu))}) then {
- _target = ACE_player;
- };
- };
- };
-
- // Check conditions: canInteract and canOpenMenu
- if !([ACE_player, _target, ["isNotInside", "isNotSwimming"]] call EFUNC(common,canInteractWith)) exitWith {false};
- if !([ACE_player, _target] call FUNC(canOpenMenu)) exitWith {false};
-
- // Statement
- [_target] call FUNC(openMenu);
- false
-}, {
- // Close menu if enough time passed from opening
- if (CBA_missionTime - GVAR(lastOpenedOn) > 0.5) exitWith {
- [objNull] call FUNC(openMenu);
- };
- false
-}, [DIK_H, [false, false, false]], false, 0] call CBA_fnc_addKeybind;
-
-["ACE3 Common", QGVAR(peekMedicalInfoKey), localize LSTRING(PeekMedicalInfo),
-{
- // Conditions: canInteract
- if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false};
-
- // Statement
- [ACE_player, -1] call FUNC(displayPatientInformation);
- false
-}, {
- if (CBA_missionTime - GVAR(peekLastOpenedOn) > GVAR(peekMedicalInfoReleaseDelay)) then {
- [{
- CBA_missionTime - GVAR(peekLastOpenedOn) > GVAR(peekMedicalInfoReleaseDelay)
- }, {QGVAR(RscPatientInfo) cutFadeOut 0.3}] call CBA_fnc_waitUntilAndExecute;
- };
- GVAR(peekLastOpenedOn) = CBA_missionTime;
- false
-}, [DIK_H, [false, true, false]], false, 0] call CBA_fnc_addKeybind;
-
-
// Close patient information display when interaction menu is closed
["ace_interactMenuClosed", {
QGVAR(RscPatientInfo) cutFadeOut 0.3;
diff --git a/addons/medical_gui/functions/fnc_displayPatientInformation.sqf b/addons/medical_gui/functions/fnc_displayPatientInformation.sqf
index 65660eec798..abea0ec07bb 100644
--- a/addons/medical_gui/functions/fnc_displayPatientInformation.sqf
+++ b/addons/medical_gui/functions/fnc_displayPatientInformation.sqf
@@ -40,6 +40,7 @@ if (isNull _display) then {
if (ACE_player distance _target > MAX_DISTANCE && {vehicle _target != vehicle ACE_player}) exitWith {
[_pfhID] call CBA_fnc_removePerFrameHandler;
QGVAR(RscPatientInfo) cutFadeOut 0.3;
+ if (((getPosATL _target) # 2) < -9) exitWith {}; // handle dragging corpse/clone
[[ELSTRING(medical,DistanceToFar), _target call EFUNC(common,getName)], 2] call EFUNC(common,displayTextStructured);
};
diff --git a/addons/medical_gui/functions/fnc_menuPFH.sqf b/addons/medical_gui/functions/fnc_menuPFH.sqf
index b3d51c2dc9c..0e213eaf5ec 100644
--- a/addons/medical_gui/functions/fnc_menuPFH.sqf
+++ b/addons/medical_gui/functions/fnc_menuPFH.sqf
@@ -23,6 +23,8 @@ if !(
closeDialog 0;
// Show hint if distance condition failed
if ((ACE_player distance GVAR(target) > GVAR(maxDistance)) && {vehicle ACE_player != vehicle GVAR(target)}) then {
+ if (((getPosATL GVAR(target)) # 2) < -9) exitWith {}; // handle dragging corpse/clone
+
[[ELSTRING(medical,DistanceToFar), GVAR(target) call EFUNC(common,getName)], 2] call EFUNC(common,displayTextStructured);
};
};
diff --git a/addons/medical_gui/initKeybinds.inc.sqf b/addons/medical_gui/initKeybinds.inc.sqf
new file mode 100644
index 00000000000..53c577084e9
--- /dev/null
+++ b/addons/medical_gui/initKeybinds.inc.sqf
@@ -0,0 +1,55 @@
+["ACE3 Common", QGVAR(openMedicalMenuKey), LLSTRING(OpenMedicalMenu), {
+ // Get target (cursorTarget, cursorObject, and lineIntersectsSurfaces along camera to maxDistance), if not valid then target is ACE_player
+ TRACE_3("Open menu key",cursorTarget,cursorObject,ACE_player);
+ private _target = cursorTarget;
+ if !(_target isKindOf "CAManBase" && {[ACE_player, _target] call FUNC(canOpenMenu)}) then {
+ _target = cursorObject;
+ if !(_target isKindOf "CAManBase" && {[ACE_player, _target] call FUNC(canOpenMenu)}) then {
+ private _start = AGLToASL positionCameraToWorld [0, 0, 0];
+ private _end = AGLToASL positionCameraToWorld [0, 0, GVAR(maxDistance)];
+ private _intersections = lineIntersectsSurfaces [_start, _end, ACE_player, objNull, true, -1, "FIRE"];
+ {
+ _x params ["", "", "_intersectObject"];
+ // Only look "through" player and player's vehicle
+ if (!(_intersectObject isKindOf "CAManBase") && {_intersectObject != vehicle ACE_player}) exitWith {};
+ if (_intersectObject != ACE_player && {_intersectObject isKindOf "CAManBase" && {[ACE_player, _intersectObject] call FUNC(canOpenMenu)}}) exitWith {
+ _target = _intersectObject;
+ };
+ } forEach _intersections;
+ if (!(_target isKindOf "CAManBase") || {!([ACE_player, _target] call FUNC(canOpenMenu))}) then {
+ _target = ACE_player;
+ };
+ };
+ };
+
+ // Check conditions: canInteract and canOpenMenu
+ if !([ACE_player, _target, ["isNotInside", "isNotSwimming"]] call EFUNC(common,canInteractWith)) exitWith {false};
+ if !([ACE_player, _target] call FUNC(canOpenMenu)) exitWith {false};
+
+ // Statement
+ [_target] call FUNC(openMenu);
+ false
+}, {
+ // Close menu if enough time passed from opening
+ if (CBA_missionTime - GVAR(lastOpenedOn) > 0.5) exitWith {
+ [objNull] call FUNC(openMenu);
+ };
+}, [DIK_H, [false, false, false]], false, 0] call CBA_fnc_addKeybind;
+
+["ACE3 Common", QGVAR(peekMedicalInfoKey), LLSTRING(PeekMedicalInfo), {
+ // Conditions: canInteract
+ if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false};
+
+ // Statement
+ [ACE_player, -1] call FUNC(displayPatientInformation);
+ false
+}, {
+ if (CBA_missionTime - GVAR(peekLastOpenedOn) > GVAR(peekMedicalInfoReleaseDelay)) then {
+ [{
+ CBA_missionTime - GVAR(peekLastOpenedOn) > GVAR(peekMedicalInfoReleaseDelay)
+ }, {
+ QGVAR(RscPatientInfo) cutFadeOut 0.3;
+ }] call CBA_fnc_waitUntilAndExecute;
+ };
+ GVAR(peekLastOpenedOn) = CBA_missionTime;
+}, [DIK_H, [false, true, false]], false, 0] call CBA_fnc_addKeybind;
diff --git a/addons/medical_gui/stringtable.xml b/addons/medical_gui/stringtable.xml
index 3f816aa39bb..6dfc16f9b95 100644
--- a/addons/medical_gui/stringtable.xml
+++ b/addons/medical_gui/stringtable.xml
@@ -222,6 +222,7 @@
Zeige Triage-Einstufung im Interaktionsmenü
在交互式菜单中显示分诊级别
상호작용 메뉴에서 부상자 카드 보기
+ Mostrar Nível de Triagem no Menu de Interação
Medical
@@ -294,6 +296,7 @@
医療情報一時表示
Просмотр медицинской информации
Ojear Información Médica
+ Visualização rápida das informações médicas
Medical Peek Duration
@@ -305,6 +308,7 @@
医療情報一時表示の表示時間
Продолжительность медицинского осмотра
Duración del Ojear Información Médica
+ Duração da visualização geral das informações médicas
How long the medical info peek remains open after releasing the key.
@@ -316,6 +320,7 @@
医療情報一時表示キーを放してからどれだけ長く情報表示するか。
Как долго окно просмотра медицинской информации остается открытым после отпускания клавиши.
Durante cuánto tiempo la información médica ojeada permanece abierta una ves se deje de apretar la tecla.
+ Quanto tempo a visualização rápida das informações médicas permanece aberta após soltar a tecla.
Load Patient
@@ -570,6 +575,7 @@
自分に切り替え
Переключиться на себя
Cambiar a uno mismo
+ Trocar para si mesmo
Switch to target
@@ -581,6 +587,7 @@
相手に切り替え
Переключиться на цель
Cambiar al objetivo
+ Trocar para paciente
Head
@@ -1008,6 +1015,7 @@
出血はしていない
Кровотечения нет
Sin sangrado
+ Sem sangramento
Slow bleeding
@@ -1019,6 +1027,7 @@
出血は穏やか
Медленное кровотечение
Sangrado lento
+ Sangramento lento
Moderate bleeding
@@ -1030,6 +1039,7 @@
出血はそこそこ速い
Умеренное кровотечение
Sangrado moderado
+ Sangramento moderado
Severe bleeding
@@ -1041,6 +1051,7 @@
出血は激しい
Сильное кровотечение
Sangrado severo
+ Sangramento grave
Massive bleeding
@@ -1052,6 +1063,7 @@
出血は酷く多い
Огромное кровотечение
Sangrado masivo
+ Sangramento massivo
in Pain
@@ -1127,6 +1139,7 @@
失血なし
Потери крови нет
Sin pérdida de sangre
+ Sem perda de sangue
@@ -1271,6 +1284,7 @@
Información de paciente
Patienteninformation
환자 정보
+ Informações do paciente
Blood Loss Colors
@@ -1283,6 +1297,7 @@
失血颜色
출혈 색상
Colores de pérdida de sangre
+ Cores de perda de sangue
Defines the 10 color gradient used to indicate blood loss in Medical GUIs.
@@ -1295,6 +1310,7 @@
失血颜色,用于医学图形用户界面。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.
+ Define os 10 gradientes de cores utilizados para indicar perda de sangue nas interfaces médicas.
Blood Loss Color %1
@@ -1307,6 +1323,7 @@
失血颜色 %1
출혈 색상 %1
Color de pérdida de sangre %1
+ Cor de perda de sangue %1
Damage Colors
@@ -1319,6 +1336,7 @@
负伤颜色
피해 색상
Colores de daño
+ Cores de dano
Defines the 10 color gradient used to indicate damage in Medical GUIs.
@@ -1331,6 +1349,7 @@
负伤颜色,用于医学图形用户界面。10种渐变颜色。
의료 GUI에 쓰이는 피해 색상입니다. 총 10가지 색상이 있습니다.
Define los 10 gradientes de color utilizados para indicar el daño en la interfaz gráfiica del sistema Médico.
+ Define os 10 gradientes de cor utilizados para indicar dano nas interfaces médicas.
Damage Color %1
@@ -1343,6 +1362,7 @@
负伤颜色 %1
피해 색상 %1
Color de daño %1
+ Cor de dano %1
Show Blood Loss
@@ -1355,6 +1375,7 @@
Показывать кровопотерю
Mostrar pérdida de sangre
Afficher les pertes de sang
+ Mostrar perda de sangue
Show qualitative blood loss in the injury list.
@@ -1367,6 +1388,7 @@
Показывать тяжесть кровопотери в списке ранений.
Mostrar la pérdida de sangre cualitativa en la lista de heridas.
Afficher la quantité de sang perdue
+ Mostrar perda de sangue qualitativa na lista de feridas.
Show Bleeding State
@@ -1412,6 +1434,7 @@
被弾時の医療情報一時表示
Показать медицинскую информацию о попадании
Ojear Información Médica en Impacto
+ Visualização rápida das informações médicas durante uma lesão
Temporarily show medical info when injured.
@@ -1424,6 +1447,7 @@
被弾時に医療情報を一時的に表示します。
Временно показывать медицинскую информацию при травме.
Temporalmente muestra la información médica cuando es herido.
+ Mostrar informações médicas temporariamente durante uma lesão.
Medical Peek Duration on Hit
@@ -1436,6 +1460,7 @@
被弾時の医療情報一時表示の表示時間
Продолжительность медицинского осмотра при попадании
Duración de Ojear la Información Médica cuando hay Impacto
+ Duração da visualização rápida de informações médicas durante uma lesão
How long the medical info peek remains open after being injured.
@@ -1448,6 +1473,7 @@
被弾時の医療情報の一時表示をどれだけ長く表示するか。
Как долго окно просмотра медицинской информации остается открытым после получения травмы.
Durante cuánto tiempo la información médica ojeada permanece abierta una tras haber sido herido.
+ Quanto tempo a visualização rápida de informações médicas permanece aberta após ser ferido.
Show Trauma Sustained
@@ -1486,6 +1512,7 @@
身体部位の輪郭表示の色
Цвет контура части тела
Color de Contorno de las Partes del Cuerpo
+ Cor do contorno da parte do corpo
Color of outline around selected body part.
@@ -1498,6 +1525,7 @@
選択した身体部位の輪郭表示の色。
Цвет контура вокруг выбранной части тела.
Color del contorno alrededor de la parte del cuerpo seleccionada.
+ Cor do contorno em volta da parte do corpo selecionada.
Minor Trauma
@@ -1562,6 +1590,7 @@
左
Лево
I
+ E
R
@@ -1574,6 +1603,7 @@
右
Право
D
+ D
in your inventory
@@ -1586,6 +1616,7 @@
個あなたが保有
в вашем инвентаре
en tu inventario
+ em seu inventário
in patient's inventory
@@ -1598,6 +1629,7 @@
個患者が保有
в инвентаре пациента
en el inventario del paciente
+ no inventário do paciente
in vehicle's inventory
@@ -1610,6 +1642,7 @@
個車両内に保有
в инвентаре транспорта
en el inventario del vehículo
+ no inventário do veículo
No effect until tourniquet removed
@@ -1621,6 +1654,7 @@
止血帯を外すまで効果を発揮しません
Никакого эффекта до тех пор, пока жгут не будет снят
Sin efecto hasta que se quita el torniquete
+ Sem efeito até o torniquete ser removido
Show Tourniquet Warning
@@ -1632,6 +1666,7 @@
止血帯の警告を表示
Показать предупреждение о наложении жгута
Mostrar Advertencia de Torniquete
+ Mostrar aviso de torniquete
Show a warning tooltip when a tourniquet will interfere with a medical action.
@@ -1643,6 +1678,7 @@
止血帯が医療行為を妨げる場合には、警告ツールチップを表示します。
Показать всплывающую подсказку с предупреждением, когда жгут помешает медицинскому вмешательству.
Muestra un mensaje de advertencia cuando un torniquete interfiera con una acción médica.
+ Mostra uma dica de aviso quando um torniquete interfere com uma ação médica.
diff --git a/addons/medical_statemachine/stringtable.xml b/addons/medical_statemachine/stringtable.xml
index 2b828d506e9..9c1d807bd00 100644
--- a/addons/medical_statemachine/stringtable.xml
+++ b/addons/medical_statemachine/stringtable.xml
@@ -173,6 +173,7 @@
Wykrwawienie podczas zatrzymanej akcji serca
心脏骤停期间失血情况
심정지 중 출혈
+ Sangramento durante parada cardíaca
Controls whether a person can die in cardiac arrest by blood loss before the cardiac arrest time runs out.
@@ -185,6 +186,7 @@
Kontroluje czy śmierć osoby może nastąpić poprzez wykrwawienie zanim wyczerpię się Czas Zatrzymania Akcji Serca.
控制单位是否会在心脏骤停时间耗完之前因失血过多而死亡。
지정한 심정지 시간이 다 되기 전에 출혈로 인해 사망할 수 있는 지를 결정합니다.
+ Controla se uma pessoa pode morrer em parada cardíaca por perda de sangue antes que o tempo de parada cardíaca acabe.
diff --git a/addons/medical_status/functions/fnc_addInventoryActions.sqf b/addons/medical_status/functions/fnc_addInventoryActions.sqf
index 8041eb06135..e4e65a31649 100644
--- a/addons/medical_status/functions/fnc_addInventoryActions.sqf
+++ b/addons/medical_status/functions/fnc_addInventoryActions.sqf
@@ -46,5 +46,6 @@ _unit addAction ["OpenBag", {
{!lockedInventory _backpackContainer} &&
{maxLoad _backpackContainer > 0} &&
{getNumber (_backpackConfig >> "disableInventory") != 1} &&
+ {!(_target isKindOf QEGVAR(dragging,clone))} &&
{_target setUserActionText [_actionId, format [localize "STR_ACTION_OPEN_BAG", getText (_backpackConfig >> "displayName")]]; true}
}, 2];
diff --git a/addons/medical_status/functions/fnc_getBloodLoss.sqf b/addons/medical_status/functions/fnc_getBloodLoss.sqf
index c2a66046791..5193ccbb0b0 100644
--- a/addons/medical_status/functions/fnc_getBloodLoss.sqf
+++ b/addons/medical_status/functions/fnc_getBloodLoss.sqf
@@ -21,9 +21,10 @@ private _woundBleeding = GET_WOUND_BLEEDING(_unit);
if (_woundBleeding == 0) exitWith {0};
private _cardiacOutput = [_unit] call FUNC(getCardiacOutput);
+private _resistance = _unit getVariable [VAR_PERIPH_RES, DEFAULT_PERIPH_RES]; // can use value directly since this is sum of default and adjustments
// even if heart stops blood will still flow slowly (gravity)
-private _bloodLoss = (_woundBleeding * (_cardiacOutput max CARDIAC_OUTPUT_MIN) * EGVAR(medical,bleedingCoefficient));
+private _bloodLoss = (_woundBleeding * (_cardiacOutput max CARDIAC_OUTPUT_MIN) * (DEFAULT_PERIPH_RES / _resistance) * EGVAR(medical,bleedingCoefficient));
private _eventArgs = [_unit, _bloodLoss]; // Pass by reference
diff --git a/addons/medical_status/stringtable.xml b/addons/medical_status/stringtable.xml
index ea3f77429b2..cefc85ff421 100644
--- a/addons/medical_status/stringtable.xml
+++ b/addons/medical_status/stringtable.xml
@@ -127,6 +127,7 @@
武器を落とす確率
Шанс выпадения оружия
Probabilidad de Soltar Arma
+ Probabilidade de largar a arma
Chance for a player to drop their weapon when going unconscious.\nHas no effect on AI.
@@ -138,6 +139,7 @@
プレーヤーが意識を失ったときに武器を落とす可能性。\nAI には影響しません。
Шанс для игрока выронить свое оружие, когда он теряет сознание.\nНе влияет на ИИ
Probabilidad del jugador de soltar su arma cuando quedan inconscientes.\nNo tiene efecto sobre la IA.
+ Chance de um jogador largar sua arma quando ficar inconsciente.\nNão tem efeito sobre a IA.
diff --git a/addons/medical_treatment/CfgWeapons.hpp b/addons/medical_treatment/CfgWeapons.hpp
index 7b31e10bee6..aae3fbb69cc 100644
--- a/addons/medical_treatment/CfgWeapons.hpp
+++ b/addons/medical_treatment/CfgWeapons.hpp
@@ -310,4 +310,17 @@ class CfgWeapons {
hiddenSelectionsTextures[] = {QPATHTOF(data\bodybagItem_white_co.paa)};
GVAR(bodyBagObject) = "ACE_bodyBagObject_white";
};
+
+ // Since base game doesn't support misc. items, this is needed to filling inventories in the editor
+ class ACE_painkillers_Item: ACE_ItemCore {
+ displayName = CSTRING(painkillers_Display);
+ author = ECSTRING(common,ACETeam);
+ scope = 2;
+ scopeArsenal = 0;
+ descriptionShort = CSTRING(painkillers_Desc_Short);
+ picture = QPATHTOF(ui\painkillers_ca.paa);
+ class ItemInfo: CBA_MiscItem_ItemInfo {
+ mass = 1;
+ };
+ };
};
diff --git a/addons/medical_treatment/XEH_postInit.sqf b/addons/medical_treatment/XEH_postInit.sqf
index 4c7a780fc3b..eda15a4bfcf 100644
--- a/addons/medical_treatment/XEH_postInit.sqf
+++ b/addons/medical_treatment/XEH_postInit.sqf
@@ -1,5 +1,8 @@
#include "script_component.hpp"
+// Pain killers item to magazine
+["ACE_painkillers_Item", "ACE_painkillers"] call EFUNC(common,registerItemReplacement);
+
[QEGVAR(medical_status,initialized), {
params ["_unit"];
@@ -69,6 +72,7 @@ if (["ace_trenches"] call EFUNC(common,isModLoaded)) then {
LLSTRING(checkHeadstoneName),
QPATHTOEF(medical_gui,ui\grave.paa),
{
+ //IGNORE_PRIVATE_WARNING ["_target"];
[
[_target getVariable QGVAR(headstoneData)],
true
@@ -77,7 +81,7 @@ if (["ace_trenches"] call EFUNC(common,isModLoaded)) then {
{!isNil {_target getVariable QGVAR(headstoneData)}}
] call EFUNC(interact_menu,createAction);
- [missionNameSpace getVariable [QGVAR(graveClassname), "ACE_Grave"], 0, [], _checkHeadstoneAction] call EFUNC(interact_menu,addActionToClass);
+ [missionNamespace getVariable [QGVAR(graveClassname), "ACE_Grave"], 0, [], _checkHeadstoneAction] call EFUNC(interact_menu,addActionToClass);
};
if (isServer) then {
diff --git a/addons/medical_treatment/config.cpp b/addons/medical_treatment/config.cpp
index 3782645019d..7b340d01091 100644
--- a/addons/medical_treatment/config.cpp
+++ b/addons/medical_treatment/config.cpp
@@ -12,7 +12,7 @@ class CfgPatches {
class ADDON {
name = COMPONENT_NAME;
units[] = {"ACE_fieldDressingItem","ACE_packingBandageItem","ACE_elasticBandageItem","ACE_tourniquetItem","ACE_splintItem","ACE_painkillersItem","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_painkillers","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","ACE_bodyBag_blue","ACE_bodyBag_white"};
+ weapons[] = {"ACE_fieldDressing","ACE_packingBandage","ACE_elasticBandage","ACE_tourniquet","ACE_splint","ACE_painkillers","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","ACE_bodyBag_blue","ACE_bodyBag_white","ACE_painkillers_Item"};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_medical_status", "ace_medical_damage", "ace_apl"};
author = ECSTRING(common,ACETeam);
diff --git a/addons/medical_treatment/functions/fnc_hasItem.sqf b/addons/medical_treatment/functions/fnc_hasItem.sqf
index e0ef4c8a4fe..8faea65652f 100644
--- a/addons/medical_treatment/functions/fnc_hasItem.sqf
+++ b/addons/medical_treatment/functions/fnc_hasItem.sqf
@@ -31,7 +31,7 @@ private _fnc_checkItems = {
_unitItems append (itemCargo _unitVehicle);
_unitItems append (magazineCargo _unitVehicle);
};
- _items findIf {_x in _unitItems} != -1
+ _items findAny _unitItems != -1
};
_medic call _fnc_checkItems || {GVAR(allowSharedEquipment) != 2 && {_patient call _fnc_checkItems}}
diff --git a/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf b/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf
index d04c1497bdb..dfae6782a33 100644
--- a/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf
+++ b/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf
@@ -18,6 +18,7 @@
#define CHECK_OBJECTS(var) ((var) findIf {typeOf _x in GVAR(facilityClasses) || {_x getVariable [QEGVAR(medical,isMedicalFacility), false]}} != -1)
params ["_unit"];
+//IGNORE_PRIVATE_WARNING ["_unit"];
private _fnc_check = {
private _position = _unit modelToWorldVisual [0, 0, eyePos _unit select 2];
diff --git a/addons/medical_treatment/functions/fnc_ivBagLocal.sqf b/addons/medical_treatment/functions/fnc_ivBagLocal.sqf
index 80f06fc11e0..dc416f90c50 100644
--- a/addons/medical_treatment/functions/fnc_ivBagLocal.sqf
+++ b/addons/medical_treatment/functions/fnc_ivBagLocal.sqf
@@ -23,7 +23,7 @@ params ["_patient", "_bodyPart", "_classname"];
private _bloodVolume = GET_BLOOD_VOLUME(_patient);
if (_bloodVolume >= DEFAULT_BLOOD_VOLUME) exitWith {};
-private _partIndex = ALL_BODY_PARTS find tolowerANSI _bodyPart;
+private _partIndex = ALL_BODY_PARTS find toLowerANSI _bodyPart;
// Get attributes for the used IV
private _defaultConfig = configFile >> QUOTE(ADDON) >> "IV";
diff --git a/addons/medical_treatment/functions/fnc_medicationLocal.sqf b/addons/medical_treatment/functions/fnc_medicationLocal.sqf
index 0b23b365e84..18ef4e4d680 100644
--- a/addons/medical_treatment/functions/fnc_medicationLocal.sqf
+++ b/addons/medical_treatment/functions/fnc_medicationLocal.sqf
@@ -49,7 +49,7 @@ TRACE_1("Running treatmentMedicationLocal with Advanced configuration for",_pati
// Handle tourniquet on body part blocking blood flow at injection site
-private _partIndex = ALL_BODY_PARTS find tolowerANSI _bodyPart;
+private _partIndex = ALL_BODY_PARTS find toLowerANSI _bodyPart;
if (HAS_TOURNIQUET_APPLIED_ON(_patient,_partIndex)) exitWith {
TRACE_1("unit has tourniquets blocking blood flow on injection site",_tourniquets);
diff --git a/addons/medical_treatment/functions/fnc_placeBodyBagInGrave.sqf b/addons/medical_treatment/functions/fnc_placeBodyBagInGrave.sqf
index 82cd2bc080b..55908b1e17d 100644
--- a/addons/medical_treatment/functions/fnc_placeBodyBagInGrave.sqf
+++ b/addons/medical_treatment/functions/fnc_placeBodyBagInGrave.sqf
@@ -29,7 +29,7 @@ TRACE_2("placeBodyBagInGrave",_bodybag,_medic);
if (GVAR(graveDiggingMarker)) then {
_graveClassname = missionNamespace getVariable [QGVAR(graveClassname), "ACE_Grave"];
};
- private _graveRotation = missionNameSpace getVariable [QGVAR(graveRotation), 0];
+ private _graveRotation = missionNamespace getVariable [QGVAR(graveRotation), 0];
[[_medic, _bodybag], _graveClassname, [0,0,0], _graveRotation, true] call FUNC(placeInBodyBagOrGrave);
},
diff --git a/addons/medical_treatment/functions/fnc_placeInGrave.sqf b/addons/medical_treatment/functions/fnc_placeInGrave.sqf
index 6bea5c6db96..afc6a1fe4a2 100644
--- a/addons/medical_treatment/functions/fnc_placeInGrave.sqf
+++ b/addons/medical_treatment/functions/fnc_placeInGrave.sqf
@@ -27,7 +27,7 @@ private _graveClassname = "";
if (GVAR(graveDiggingMarker)) then {
_graveClassname = missionNamespace getVariable [QGVAR(graveClassname), "ACE_Grave"];
};
-private _graveRotation = missionNameSpace getVariable [QGVAR(graveRotation), 0];
+private _graveRotation = missionNamespace getVariable [QGVAR(graveRotation), 0];
[_this, _graveClassname, [0,0,0], _graveRotation, true] call FUNC(placeInBodyBagOrGrave)
diff --git a/addons/medical_treatment/functions/fnc_splintLocal.sqf b/addons/medical_treatment/functions/fnc_splintLocal.sqf
index ee15a63bf0c..4861f428cdd 100644
--- a/addons/medical_treatment/functions/fnc_splintLocal.sqf
+++ b/addons/medical_treatment/functions/fnc_splintLocal.sqf
@@ -20,7 +20,7 @@
params ["_medic", "_patient", "_bodyPart"];
TRACE_3("splintLocal",_medic,_patient,_bodyPart);
-private _partIndex = ALL_BODY_PARTS find tolowerANSI _bodyPart;
+private _partIndex = ALL_BODY_PARTS find toLowerANSI _bodyPart;
private _fractures = GET_FRACTURES(_patient);
_fractures set [_partIndex, -1];
diff --git a/addons/medical_treatment/functions/fnc_tourniquetLocal.sqf b/addons/medical_treatment/functions/fnc_tourniquetLocal.sqf
index 9a0480bcb01..0ed8afd37c9 100644
--- a/addons/medical_treatment/functions/fnc_tourniquetLocal.sqf
+++ b/addons/medical_treatment/functions/fnc_tourniquetLocal.sqf
@@ -19,7 +19,7 @@
params ["_patient", "_bodyPart"];
TRACE_2("tourniquetLocal",_patient,_bodyPart);
-private _partIndex = ALL_BODY_PARTS find tolowerANSI _bodyPart;
+private _partIndex = ALL_BODY_PARTS find toLowerANSI _bodyPart;
private _tourniquets = GET_TOURNIQUETS(_patient);
_tourniquets set [_partIndex, CBA_missionTime];
diff --git a/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf b/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf
index 8a6be10bb49..80dab5094cf 100644
--- a/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf
+++ b/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf
@@ -22,11 +22,13 @@ params ["_medic", "_patient", "_bodyPart"];
TRACE_3("tourniquetRemove",_medic,_patient,_bodyPart);
// Remove tourniquet from body part, exit if no tourniquet applied
-private _partIndex = ALL_BODY_PARTS find tolowerANSI _bodyPart;
+private _partIndex = ALL_BODY_PARTS find toLowerANSI _bodyPart;
private _tourniquets = GET_TOURNIQUETS(_patient);
if (_tourniquets select _partIndex == 0) exitWith {
- [LSTRING(noTourniquetOnBodyPart), 1.5] call EFUNC(common,displayTextStructured);
+ if (_medic == ACE_player) then {
+ [LSTRING(noTourniquetOnBodyPart), 1.5] call EFUNC(common,displayTextStructured);
+ };
};
_tourniquets set [_partIndex, 0];
@@ -39,8 +41,15 @@ TRACE_1("clearConditionCaches: tourniquetRemove",_nearPlayers);
[QEGVAR(interact_menu,clearConditionCaches), [], _nearPlayers] call CBA_fnc_targetEvent;
// Add tourniquet item to medic or patient
-private _receiver = [_patient, _medic, _medic] select GVAR(allowSharedEquipment);
-[_receiver, "ACE_tourniquet"] call EFUNC(common,addToInventory);
+if (_medic call EFUNC(common,isPlayer)) then {
+ private _receiver = [_patient, _medic, _medic] select GVAR(allowSharedEquipment);
+ [_receiver, "ACE_tourniquet"] call EFUNC(common,addToInventory);
+} else {
+ // If the medic is AI, only return tourniquet if enabled
+ if (missionNamespace getVariable [QEGVAR(medical_ai,requireItems), 0] > 0) then {
+ [_medic, "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/initSettings.inc.sqf b/addons/medical_treatment/initSettings.inc.sqf
index d080965eb9e..7f0fc06764c 100644
--- a/addons/medical_treatment/initSettings.inc.sqf
+++ b/addons/medical_treatment/initSettings.inc.sqf
@@ -86,7 +86,9 @@
[LSTRING(ConvertItems_DisplayName), LSTRING(ConvertItems_Description)],
[ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)],
[[0, 1, 2], [ELSTRING(common,Enabled), LSTRING(ConvertItems_RemoveOnly), ELSTRING(common,Disabled)], 0],
- true
+ 1,
+ {[QGVAR(convertItems), _this] call EFUNC(common,cbaSettings_settingChanged)},
+ true // Needs mission restart
] call CBA_fnc_addSetting;
[
diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml
index 383048626ab..cbe76041a0c 100644
--- a/addons/medical_treatment/stringtable.xml
+++ b/addons/medical_treatment/stringtable.xml
@@ -75,6 +75,7 @@
已启用 & 可以诊断死亡/心搏骤停
활성화 및 사망/심정지 진찰 가능
Habilitado y poder diagnosticar Muerte/Parada cardíaca
+ Habilitado e permite diagnosticar morte/parada cardíaca
Abilitato e può diagnosticare Morte/Arresto Cardiaco
@@ -84,6 +85,7 @@
활성화 및 사망/심정지 진찰 가능 [직접]
Aktiviert & kann Tod/Herzstillstand diagnostizieren [Direkt]
Abilitato e può diagnosticare Morte/Arresto Cardiaco [Esplicito]
+ Activé & peut diagnostiquer la mort/l'arrêt cardiaque [Direct].
Advanced Medication
@@ -161,6 +163,7 @@
Attivi e possono riaprirsi
已启用 & 可以伤口开裂
활성화 및 붕대 풀림 구현
+ Habilitado e pode reabrir
Wound Reopening Coefficient
@@ -175,6 +178,7 @@
Coeficiente de reapertura de heridas
伤口开裂系数
붕대 풀림 계수
+ Coeficiente de reabertura de feridas
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.
@@ -189,6 +193,7 @@
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所使用的绷带的具体开裂概率。
붕대가 풀리는 확률 계수를 정합니다. 최종 붕대 풀림 계수는 상처의 종류와 쓰인 붕대의 합의 결과에 계수를 곱한 결과입니다.
+ Coeficiente para controlar a chance de reabertura da ferida. A chance final de reabertura é determinada multiplicando este valor com a chance específica de reabertura para o tipo de ferida e bandagem usada.
Clear Trauma
@@ -201,6 +206,7 @@
清理创伤
상처 제거
Despejar trauma
+ Remover trauma
Controls when hitpoint damage from wounds is healed.
@@ -213,6 +219,7 @@
控制伤口治疗后确定受伤部位的受伤情况。
상처가 언제 제거되는 지를 결정합니다.
Controla cuando los puntos de daño de las heridas son curados.
+ Controla quando o dano de pontos de vida de feridas é curado.
After Bandage
@@ -225,6 +232,7 @@
包扎后
붕대 묶은 후
Después de vendado
+ Após fechamento com bandagens
After Stitch
@@ -237,6 +245,7 @@
缝合后
상처 봉합 후
Después de sutura
+ Após sutura
Boost medical training when in medical vehicles or facilities. Untrained becomes medic, medic becomes doctor.
@@ -329,6 +338,7 @@
Tempo di utilizzo dell'autoiniettore
自动注射器治疗时间
주사기 사용 시간
+ Tempo de tratamento de auto-injetores
Time, in seconds, required to administer medication using an autoinjector.
@@ -341,6 +351,7 @@
Tempo in secondi richiesto per ricevere medicina da un autoiniettore.
使用自动注射器给药所需的时间(秒)
초 단위로 주사기를 사용하는데 걸리는 시간을 정합니다.
+ Tempo, em segundos, necessário para administrar medicações usando o auto-injetor.
Tourniquet Treatment Time
@@ -353,6 +364,7 @@
Czas aplikacji stazy
止血带治疗时间
지혈대 사용 시간
+ Tempo de tratamento de torniquetes
Time, in seconds, required to apply/remove a tourniquet.
@@ -365,6 +377,7 @@
Czas w sekundach potrzebny do założenia/zdjęcia stazy.
使用/移除止血带所需的时间(秒)
초 단위로 지혈대를 사용/제거하는 데 걸리는 시간을 정합니다.
+ Tempo, em segundos, necessário para aplicar/remover um torniquete.
IV Bag Treatment Time
@@ -377,6 +390,7 @@
Czas aplikacji IV
静脉输液袋治疗时间
수액용기 사용 시간
+ Tempo de tratamento de bolsas de IV
Time, in seconds, required to administer an IV bag.
@@ -389,6 +403,7 @@
Czas w sekundach potrzebny na aplikację transfuzji IV.
使用静脉输液所需的时间(秒)
초 단위로 수액용기를 사용하는 데 걸리는 시간을 정합니다.
+ Tempo, em segundos, necessário para administrar uma bolsa de IV.
Splint Treatment Time
@@ -401,6 +416,7 @@
Czas aplikacji szyny
夹板治疗时间
부목 사용 시간
+ Tempo de tratamento de talas
Time, in seconds, required to apply a splint.
@@ -413,6 +429,7 @@
Czas w sekundach potrzebny na aplikację szyny.
使用夹板所需的时间(秒)
초 단위로 부목을 사용하는데 걸리는 시간을 정합니다.
+ Tempo, em segundos, necessário para aplicar uma talas.
Body Bag Use Time
@@ -425,6 +442,7 @@
Czas użycia worka na ciało
尸袋使用时间
시체 운반용 부대 사용 시간
+ Tempo de uso de sacos de cadáver
Time, in seconds, required to put a patient in a body bag.
@@ -437,6 +455,7 @@
Czas w sekundach potrzebny na spakowanie ciała do worka na ciało.
装入裹尸袋时间
초 단위로 시체 운반용 부대를 사용하는데 걸리는 시간을 정합니다.
+ Tempo, em segundos, necessário para colocar um paciente em um saco de cadáver.
Grave Digging Time
@@ -448,6 +467,7 @@
墓掘りの所要時間
Время рытья могилы
Tiempo de Cavado de Tumba
+ Tempo de escavação de cova
Time, in seconds, required to dig a grave for a body.
@@ -459,6 +479,7 @@
遺体の墓を掘るのに掛かる時間。 (秒単位)
Время в секундах, необходимое для того, чтобы выкопать могилу для тела.
Tiempo, en segundos, requerido para cavar una tumba para un cuerpo.
+ Tempo, em segundos, necessário para cavar uma cova para um corpo.
Allow Epinephrine
@@ -636,6 +657,7 @@
Kendi PAK Kullanımı
Usar EPA sobre uno mismo
개인응급키트 자가 사용
+ Auto-tratamento com KPS
Enables the use of PAKs to heal oneself.
@@ -651,6 +673,7 @@
Kendini iyileştirmek için PAK'ların kullanılmasını sağlar.
Habilita el uso de EPA para curarse a uno mismo.
개인응급키트를 사용자 본인에게 쓸 수 있는 지를 정합니다.
+ Permite o uso de KPS para se tratar.
Time Coefficient PAK
@@ -815,6 +838,7 @@
Tempo di suturazione ferita.
伤口缝合时间
상처 봉합 시간
+ Tempo de sutura de feridas
Time, in seconds, required to stitch a single wound.
@@ -827,6 +851,7 @@
Tempo in secondi richiesto per suturare una singola ferita.
缝合一个伤口所需的时间(秒)
초 단위로, 한 상처를 봉합하는데 걸리는 시간을 설정합니다.
+ Tempo, em segundos, necessário para suturar uma única ferida.
Self IV Transfusion
@@ -869,6 +894,7 @@
Permetti di insaccare un paziente svenuto
允许昏迷者装入尸袋
기절 인원 시체 운반용 부대에 옮기기
+ Permitir inconscientes em sacos de cadáver
Enables placing an unconscious patient in a body bag.
@@ -881,6 +907,7 @@
Permette l'uso della sacca per morti anche su pazienti che sono solo svenuti (causa la morte del paziente)
能够将昏迷的伤员装入尸袋中。
기절 상태의 인원을 시체 운반용 부대에 옮겨 담을 수 있는 지를 정합니다.
+ Permite colocar um paciente inconsciente em um saco de cadáver.
Allow Grave Digging
@@ -892,6 +919,7 @@
Autoriser le creusement de tombes
墓掘りを許可
Рытье могил
+ Permitir escavamento de cova
Enables digging graves to dispose of corpses.
@@ -903,6 +931,7 @@
Active la possibilité de creuser des tombes pour enterrer les cadavres.
墓を掘って死体を処理できるようになります。
Позволяет рыть могилы для захоронения трупов.
+ Permite escavar covas para se livrar de cadáveres.
Only if dead
@@ -914,6 +943,7 @@
Uniquement s'il est mort
死体のみ
Только если мертв
+ Apenas se estiver morto
Create Grave Markers
@@ -925,6 +955,7 @@
Créer des pierres tombales
墓標を作成
Надгробные знаки
+ Criar marcadores de covas
Enables the creation of grave markers when digging graves.
@@ -936,6 +967,7 @@
Active la création de pierres tombales lors de l'enterrement de cadavres.
墓を掘った際、墓標を作成できるようにします。
Позволяет создавать надгробные знаки при рытье могил.
+ Permite a criação de marcadores de covas ao escavá-las.
Allow IV Transfusion
@@ -950,6 +982,7 @@
Доступ к внутривенному переливанию
Permitir transfusión de IV
수액용기 사용 허가
+ Permitir transfusão IV
Training level required to transfuse IVs.
@@ -964,6 +997,7 @@
Уровень навыка, требуемый для осуществления внутривенного переливания.
Nivel de capacitación requerido para transfusiones de IV.
수액용기를 사용하는데 필요한 등급을 정합니다.
+ Nível de treinamento necessário para transfusões IV.
Locations IV Transfusion
@@ -976,6 +1010,7 @@
Luoghi Fleboclisi EV
静脉输液地点
수액용기 사용 장소
+ Locais para transfusão IV
Controls where IV transfusions can be performed.
@@ -988,6 +1023,7 @@
Luoghi in cui è possibile applicare Fleboclisi Endovenose.
控制何地可以静脉输液
수액용기를 사용할 수 있는 장소를 정합니다.
+ Controla onde as transfusões IV podem ser realizadas.
Convert Vanilla Items
@@ -1220,6 +1256,7 @@
心肺复苏的最低成功率
최소 심폐소생술 성공 가능성
RCP posibilidad mínima de resultado satisfactorio
+ Probabilidade mínima de sucesso de RCP
CPR Success Chance Maximum
@@ -1232,6 +1269,7 @@
心肺复苏的最高成功率
최대 심폐소생술 성공 가능성
RCP posibilidad máxima de resultado satisfactorio
+ Probabilidade máxima de sucesso de RCP
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.
@@ -1244,6 +1282,7 @@
实施心肺复苏恢复心律的最小可能性。\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.
+ Probabilidade mínima do RCP restaurar a frequência cardíaca.\nEste valor é usado em pacientes que "perderam uma quantidade fatal de sangue".\nValores entre quantidades extremas de sangue resultam em uma probabilidade interpolada entre a mínima e a máxima.
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.
@@ -1256,6 +1295,7 @@
实施心肺复苏恢复心律的最大可能性。\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.
+ Probabilidade máxima do RCP restaurar a frequência cardíaca.\nEste valor é usado em pacientes que "perderam pouco sangue".\nValores entre quantidades extremas de sangue resultam em uma probabilidade interpolada entre a mínima e a máxima.
CPR Treatment Time
@@ -1268,6 +1308,7 @@
HLW Behandlungsdauer
心肺复苏时间
심폐소생술 시행 시간
+ Duração do RCP
Time, in seconds, required to perform CPR on a patient.
@@ -1280,6 +1321,7 @@
Zeit in Sekunden, die benötigt wird, um eine HLW durzuführen.
对伤员实施心肺复苏所需的时间(秒)
초 단위로, 심폐소생술을 진행하는 시간을 결정합니다.
+ Tempo, em segundos, necessário para realizar RCP em um paciente.
Holster Required
@@ -1294,6 +1336,7 @@
Необходимость убирать оружие
Requiere enfundar
무장여부
+ Necessário guardar armas
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.
@@ -1308,6 +1351,7 @@
Нужно ли убирать оружие для проведения медицинских действий.\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검사제외 옵션의 경우 맥박 확인, 혈압 확인, 반응 확인은 앞선 옵션에 구애받지 않고 사용할 수 있습니다.
+ Controla se as armas devem ser guardadas/abaixadas para realizar ações médicas.\n"Exceto exame" faz com que ações de verificação de pulso, pressão arterial e resposta sejam permitidas a qualquer momento.
Lowered or Holstered
@@ -1322,6 +1366,7 @@
Опущено или убрано
Bajada o enfundada
내리거나 집어넣기
+ Abaixada ou guardada
Lowered or Holstered (Except Exam)
@@ -1336,6 +1381,7 @@
Опущено или убрано (Проверка разрешена)
Bajada o enfundada (excepto examen)
내리거나 집어넣기(검사 제외)
+ Abaixada ou guardada (exceto exame)
Holstered Only
@@ -1350,6 +1396,7 @@
Только убрано
Solo enfundada
집어넣기
+ Guardada apenas
Holstered Only (Except Exam)
@@ -1364,6 +1411,7 @@
Только убрано (Проверка разрешена)
Solo enfundada (excepto examen)
집어넣기(검사 제외)
+ Guardada apenas (exceto exame)
[ACE] Medical Supply Crate (Basic)
@@ -1376,7 +1424,7 @@
[ACE] Caisse médicale (basique)
[ACE] Orvosi láda (Alap)
[ACE] Cassa Rifornimenti Medici (Basici)
- [ACE] 医療物資箱 (ベーシック)
+ [ACE] 医療物資箱 (基本)
[ACE] 의료 물자 (기본)
[ACE] 医疗补给箱(基础)
[ACE] 醫療補給箱(基本)
@@ -1393,7 +1441,7 @@
[ACE] Caisse médicale (avancée)
[ACE] Orvosi láda (Fejlett)
[ACE] Cassa Rifornimenti Medici (Avanzati)
- [ACE] 医療物資箱 (アドバンスド)
+ [ACE] 医療物資箱 (高度)
[ACE] 의료 물자 (고급)
[ACE] 医疗补给箱(高级)
[ACE] 醫療補給箱(進階)
@@ -1827,7 +1875,7 @@
Auto-morfin
Morfium autoinjektor
Autoiniettore di Morfina
- Auto-injetor de morfina
+ Autoinjetor de Morfina
モルヒネ自動注射器
자동주사기 (모르핀)
吗啡自动注射器
@@ -1874,7 +1922,7 @@
Auto-injecteur d'adénosine
Autoiniettore di Adenosina
Auto-adenosine
- Auto-injetor de Adenosina
+ Autoinjetor de Adenosina
Аденозин в пневмошприце
アデノシン自動注射器
자동주사기 (아데노신)
@@ -1922,7 +1970,7 @@
Auto-atropine
Atropin autoinjektor
Autoiniettore di Atropina
- Auto-injetor de Atropina
+ Autoinjetor de Atropina
アトロピン自動注射器
자동주사기 (아트로핀)
阿托品自动注射器
@@ -1971,7 +2019,7 @@
Auto-adrenalin
Epinefrin autoinjektor
Autoiniettore di Epinefrina
- Auto-injetor de epinefrina
+ Autoinjetor de Epinefrina
アドレナリン自動注射器
자동주사기 (에피네프린)
肾上腺素自动注射器
@@ -2385,7 +2433,7 @@
Operationsset
Sebészeti készlet
Kit chirurgico
- Kit Cirurgico
+ Kit Cirúrgico
Chirurgická sada
手術キット
봉합 키트
@@ -2402,7 +2450,7 @@
Operationsset für fortgeschrittene medizinische Feldversorgung
Sebészeti készlet komplex orvosi feladatok terepen való ellátására
Kit chirurgico per trattamenti avanzati sul campo.
- Kit Cirurgico para uso de tratamento médico avançado em campo
+ Kit Cirúrgico para uso de tratamento médico avançado em campo
Chirurgická sada určená k pokročilejším zdravotnickým zákrokům v poli
手術キットは戦場で高度な処置をする為に用いる
야전 상황에서 고급 의료 처치를 위해 사용되는 봉합 키트
@@ -2419,7 +2467,7 @@
Trousse chirurgicale pour le traitement avancé sur le terrain.
Sebészeti készlet komplex orvosi feladatok terepen való ellátására
Kit chirurgico per trattamenti avanzati sul campo.
- Kit Cirurgico para uso de tratamento médico avançado em campo.
+ Kit Cirúrgico para uso de tratamento médico avançado em campo.
Chirurgická sada určená k pokročilejším zdravotnickým zákrokům v poli
手術キットは戦場で高度な処置をする為に用いる
야전 상황에서 고급 의료 처치를 위해 사용되는 봉합 키트
@@ -2454,6 +2502,7 @@
봉합술
Suture
Нить
+ Sutura
Surgical Suture for stitching injuries.
@@ -2465,6 +2514,7 @@
상처를 꿰메는 수술용 봉합술.
Suture chirurgicale pour suturer les blessures.
Хирургическая нить для зашивания травм.
+ Sutura cirúrgica para fechar feridas.
Surgical Suture for stitching injuries.
@@ -2476,6 +2526,7 @@
상처를 꿰메는 수술용 봉합술.
Suture chirurgicale pour suturer les blessures.
Хирургическая нить для зашивания травм.
+ Sutura cirúrgica para fechar feridas.
Bodybag
@@ -4147,7 +4198,7 @@
%1 is not responsive
%1 не реагирует на раздражители
- %1 est inconscient.
+ %1 ne répond pas aux stimuli
%1 no reacciona
%1 jest nieprzytomny
%1 ist nicht ansprechbar
@@ -4168,6 +4219,7 @@
%1은(는) 의식불명입니다
%1 ist bewusstlos
%1 è privo di sensi
+ %1 est inconscient
%1 is not responsive, taking shallow gasps and convulsing
@@ -4180,6 +4232,7 @@
%1 은 반응이 없고, 얕은 헐떡임과 경련증세를 보입니다
%1 не реагирует на раздражители, поверхностно дышит, в конвульсиях
%1 no responde, dando pequeñas bocanadas y convulsionando
+ %1 está inconsciente, com respiração curta e convulsionando
%1 is in cardiac arrest
@@ -4188,6 +4241,7 @@
%1은(는) 심정지 상태입니다
%1 ist im Herzstillstand
%1 è in arresto cardiaco
+ %1 est en arrêt cardiaque
%1 is not responsive, motionless and cold
@@ -4200,6 +4254,7 @@
%1 은 반응이 없고, 움직임이 없으며 차갑습니다
%1 не реагирует на раздражители, не шевелится и холодный
%1 no responde, sin movimiento y frío
+ %1 está inconsciente, sem movimento e frio
%1 is dead
@@ -4208,6 +4263,7 @@
%1은(는) 사망했습니다
%1 ist tod
%1 è morto
+ %1 est mort
You checked %1
@@ -4694,6 +4750,7 @@
墓を掘る
Выкопать могилу для тела
Cavar tumba para cuerpo
+ Escavar cova para cadáver
Digging grave for body...
@@ -4705,6 +4762,7 @@
墓を掘っています
Рытьё могилы для тела...
Cavando tumba para cuerpo...
+ Escavando cova para cadáver...
%1 has bandaged patient
@@ -4947,6 +5005,7 @@
Der Körper zuckte und kann nicht tot sein!
身体抽搐了一下,可能还没死!
꿈틀대는걸 보니 죽은 것 같지는 않습니다!
+ O corpo se retorceu e pode não estar morto!
Check name on headstone
@@ -4958,6 +5017,7 @@
墓石の名前を確認
Проверьте имя на надгробии
Comprobar nombre en la lápida
+ Checar nome na lápide
Bandage Rollover
@@ -4969,6 +5029,7 @@
包帯の繰り越し
Перевязка множественных ран
Vendaje múltiple
+ Bandagem de Múltiplas Feridas
If enabled, bandages can close different types of wounds on the same body part.\nBandaging multiple injuries will scale bandaging time accordingly.
@@ -4980,6 +5041,7 @@
有効にすると、体の同じ部分にある別の種類の傷を一つの包帯で閉じることができます。\n複数の傷に包帯を巻くと、それに応じて包帯時間が変動します。
Если эта функция включена, бинты могут закрывать различные типы ран на одной и той же части тела.\nПри перевязке нескольких повреждений время перевязки будет увеличено соответствующим образом.
Si se habilita, las vendas pueden cerrar diferentes tipos de heridas en la misma parte del cuerpo.n\Vendar múltiples heridas escala el tiempo de vendado acorde.
+ Se habilitado, bandagens podem fechar diferentes tipos de ferimento na mesma parte do corpo.\nO fechamento de múltiplas feridas modificará o tempo de aplicação proporcionalmente.
Bandage Effectiveness Coefficient
@@ -4991,6 +5053,7 @@
包帯有効性係数
Коэф. эффективности повязки
Coeficiente de Efectividad de Vendado
+ Coeficiente de Eficácia da Bandagem
Determines how effective bandages are at closing wounds.
@@ -5002,6 +5065,7 @@
包帯が傷をふさぐのにどれだけ効果的かを定義します。
Определяет, насколько эффективны бинты при закрытии ран.
Determina como de efectivos son los vendajes cerrando heridas.
+ Determina o quão efetivas as bandagens são em fechar ferimentos.
Medical Items
@@ -5016,6 +5080,7 @@
Medizinisches Material
医療品
Objetos médicos
+ Objetos médicos
Zeus Treatment Time Coefficient
diff --git a/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf b/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf
index c284b00701d..77aec7fd621 100644
--- a/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf
+++ b/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf
@@ -85,17 +85,17 @@ if (_adjustments isNotEqualTo []) then {
private _timeInSystem = CBA_missionTime - _timeAdded;
if (_timeInSystem >= _maxTimeInSystem) then {
_deleted = true;
- _adjustments set [_forEachIndex, objNull];
+ _adjustments deleteAt _forEachIndex;
} else {
private _effectRatio = (((_timeInSystem / _timeTillMaxEffect) ^ 2) min 1) * (_maxTimeInSystem - _timeInSystem) / _maxTimeInSystem;
if (_hrAdjust != 0) then { _hrTargetAdjustment = _hrTargetAdjustment + _hrAdjust * _effectRatio; };
if (_painAdjust != 0) then { _painSupressAdjustment = _painSupressAdjustment + _painAdjust * _effectRatio; };
if (_flowAdjust != 0) then { _peripheralResistanceAdjustment = _peripheralResistanceAdjustment + _flowAdjust * _effectRatio; };
};
- } forEach _adjustments;
+ } forEachReversed _adjustments;
if (_deleted) then {
- _unit setVariable [VAR_MEDICATIONS, _adjustments - [objNull], true];
+ _unit setVariable [VAR_MEDICATIONS, _adjustments, true];
_syncValues = true;
};
};
diff --git a/addons/medical_vitals/functions/fnc_updatePeripheralResistance.sqf b/addons/medical_vitals/functions/fnc_updatePeripheralResistance.sqf
index 30f8038d80f..05056fa0a33 100644
--- a/addons/medical_vitals/functions/fnc_updatePeripheralResistance.sqf
+++ b/addons/medical_vitals/functions/fnc_updatePeripheralResistance.sqf
@@ -20,4 +20,4 @@
params ["_unit", "_peripheralResistanceAdjustment", "_deltaT", "_syncValue"];
-_unit setVariable [VAR_PERIPH_RES, 0 max (DEFAULT_PERIPH_RES + _peripheralResistanceAdjustment), _syncValue];
+_unit setVariable [VAR_PERIPH_RES, 1 max (DEFAULT_PERIPH_RES + _peripheralResistanceAdjustment), _syncValue];
diff --git a/addons/medical_vitals/stringtable.xml b/addons/medical_vitals/stringtable.xml
index 2fe7336dc08..25b278732ea 100644
--- a/addons/medical_vitals/stringtable.xml
+++ b/addons/medical_vitals/stringtable.xml
@@ -21,6 +21,7 @@
Activer la simulation de la SpO2
SpO2-Simulation aktivieren
Habilitar Simulación SpO2
+ Habilitar simulação de SpO2
Enables oxygen saturation simulation, providing variable heart rate and oxygen demand based on physical activity and altitude. Required for Airway Management.
@@ -31,6 +32,7 @@
Permet de simuler la saturation en oxygène, de modifier la fréquence cardiaque et la consommation d'oxygène en fonction de l'activité physique et de l'altitude. Nécessaire pour la gestion des voies respiratoires.
Aktiviert die Simulation der Sauerstoffsättigung und bietet variable Herzfrequenz und Sauerstoffbedarf basierend auf körperlicher Aktivität und Geländehöhe. Erforderlich für das Atemwegsmanagement.
Habilita la saturación de oxígeno, utilizando la demanda de oxígeno y ritmo cardíaco basado en la actividad física y la altitud. Requerido para el Manejo de las Vías Aéreas.
+ Habilita a saturação de oxigênio, tornando variáveis o batimento cardíaco e demanda de oxigênio baseados em atividade física e altitude. Necessário para o gerenciamento de vias aéreas.
diff --git a/addons/metis/CfgAmmo.hpp b/addons/metis/CfgAmmo.hpp
index 1f613a36b18..4a6fe513d23 100644
--- a/addons/metis/CfgAmmo.hpp
+++ b/addons/metis/CfgAmmo.hpp
@@ -1,3 +1,4 @@
+class ace_missileguidance_type_Metis;
class CfgAmmo {
class M_Vorona_HEAT;
class GVAR(HEAT): M_Vorona_HEAT {
@@ -7,35 +8,8 @@ class CfgAmmo {
airLock = 0;
lockType = 0;
- class ace_missileguidance {
+ class ace_missileguidance: ace_missileguidance_type_Metis {
enabled = 1;
-
- minDeflection = 0; // Minium flap deflection for guidance
- maxDeflection = 0.0027; // Maximum flap deflection for guidance
- incDeflection = 0.0005; // The incrmeent in which deflection adjusts.
-
- canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
-
- // Guidance type for munitions
- defaultSeekerType = "SACLOS";
- seekerTypes[] = { "SACLOS" };
-
- defaultSeekerLockMode = "LOAL";
- seekerLockModes[] = { "LOAL", "LOBL" };
-
- seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
- seekerAngle = 15; // Angle from the shooter's view that can track the missile
- seekerAccuracy = 1; // seeker accuracy multiplier
-
- seekerMinRange = 80;
- seekerMaxRange = 2000; // Range from the missile which the seeker can visually search
-
- correctionDistance = 3; // distance from center of crosshair where missile slows down
- offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
-
- // Attack profile type selection
- defaultAttackProfile = "WIRE";
- attackProfiles[] = {"WIRE"};
};
};
@@ -47,35 +21,8 @@ class CfgAmmo {
airLock = 0;
lockType = 0;
- class ace_missileguidance {
+ class ace_missileguidance: ace_missileguidance_type_Metis {
enabled = 1;
-
- minDeflection = 0; // Minium flap deflection for guidance
- maxDeflection = 0.0027; // Maximum flap deflection for guidance
- incDeflection = 0.0005; // The incrmeent in which deflection adjusts.
-
- canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
-
- // Guidance type for munitions
- defaultSeekerType = "SACLOS";
- seekerTypes[] = { "SACLOS" };
-
- defaultSeekerLockMode = "LOAL";
- seekerLockModes[] = { "LOAL", "LOBL" };
-
- seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
- seekerAngle = 15; // Angle from the shooter's view that can track the missile
- seekerAccuracy = 1; // seeker accuracy multiplier
-
- seekerMinRange = 80;
- seekerMaxRange = 2000; // Range from the missile which the seeker can visually search
-
- correctionDistance = 3; // distance from center of crosshair where missile slows down
- offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
-
- // Attack profile type selection
- defaultAttackProfile = "WIRE";
- attackProfiles[] = {"WIRE"};
};
};
};
diff --git a/addons/microdagr/CfgUIGrids.hpp b/addons/microdagr/CfgUIGrids.hpp
index 5d7b921800a..3c5379f879d 100644
--- a/addons/microdagr/CfgUIGrids.hpp
+++ b/addons/microdagr/CfgUIGrids.hpp
@@ -3,7 +3,7 @@ class CfgUIGrids {
class Presets {
class Arma3 {
class Variables {
- grid_ACE_microDagr[] = {{"(safezoneX + safezoneW - 11 * (((safezoneW / safezoneH) min 1.2) / 40))","(safezoneY + safezoneH - 15 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))","(10 * (((safezoneW / safezoneH) min 1.2) / 40))","(10 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))"},"(((safezoneW / safezoneH) min 1.2) / 40)","((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"};
+ grid_ACE_microDagr[] = {{"(safeZoneX + safeZoneW - 11 * (((safeZoneW / safeZoneH) min 1.2) / 40))","(safeZoneY + safeZoneH - 15 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25))","(10 * (((safeZoneW / safeZoneH) min 1.2) / 40))","(10 * ((((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/microdagr/functions/fnc_showApplicationPage.sqf b/addons/microdagr/functions/fnc_showApplicationPage.sqf
index 75f817ad3f3..daa5edd28a5 100644
--- a/addons/microdagr/functions/fnc_showApplicationPage.sqf
+++ b/addons/microdagr/functions/fnc_showApplicationPage.sqf
@@ -57,8 +57,8 @@ if (GVAR(currentApplicationPage) == APP_MODE_INFODISPLAY) then {
(_display displayCtrl IDC_MAPDETAILS) ctrlShow ((GVAR(currentApplicationPage) == APP_MODE_MAP) && {GVAR(mapShowTexture)});
if (GVAR(currentApplicationPage) == APP_MODE_MAP) then {
- _theMap = if (!GVAR(mapShowTexture)) then {_display displayCtrl IDC_MAPPLAIN} else {_display displayCtrl IDC_MAPDETAILS};
- _mapSize = (ctrlPosition _theMap) select 3;
+ private _theMap = if (GVAR(mapShowTexture)) then {_display displayCtrl IDC_MAPDETAILS} else {_display displayCtrl IDC_MAPPLAIN};
+ private _mapSize = (ctrlPosition _theMap) select 3;
_theMap ctrlMapAnimAdd [0, (GVAR(mapZoom) / _mapSize), GVAR(mapPosition)];
ctrlMapAnimCommit _theMap;
if (GVAR(mapAutoTrackPosition)) then {
diff --git a/addons/microdagr/functions/fnc_updateDisplay.sqf b/addons/microdagr/functions/fnc_updateDisplay.sqf
index 3e5775b86dc..e5de2b2fe49 100644
--- a/addons/microdagr/functions/fnc_updateDisplay.sqf
+++ b/addons/microdagr/functions/fnc_updateDisplay.sqf
@@ -24,7 +24,7 @@ if (isNull _display) exitWith {ERROR("No Display");};
private _daylight = [] call EFUNC(common,ambientBrightness);
(_display displayCtrl IDC_MICRODAGRSHELL) ctrlSetTextColor [_daylight, _daylight, _daylight, 1];
-(_display displayCtrl IDC_CLOCKTEXT) ctrlSetText ([daytime, "HH:MM"] call bis_fnc_timeToString);
+(_display displayCtrl IDC_CLOCKTEXT) ctrlSetText ([dayTime, "HH:MM"] call bis_fnc_timeToString);
private _waypoints = [] call FUNC(deviceGetWaypoints);
@@ -61,7 +61,7 @@ case (APP_MODE_INFODISPLAY): {
private _dayString = if ((date select 2) < 10) then {"0" + str (date select 2)} else {str (date select 2)};
(_display displayCtrl IDC_MODEDISPLAY_TIMEDISPLAYGREEN1) ctrlSetText format ["%1-%2-%3", _yearString, _monthSring, _dayString]; //"18-Feb-2010";
- (_display displayCtrl IDC_MODEDISPLAY_TIMEDISPLAYGREEN2) ctrlSetText ([daytime, "HH:MM:SS"] call bis_fnc_timeToString);
+ (_display displayCtrl IDC_MODEDISPLAY_TIMEDISPLAYGREEN2) ctrlSetText ([dayTime, "HH:MM:SS"] call bis_fnc_timeToString);
} else {
private _targetPosName = "";
private _targetPosLocationASL = [];
diff --git a/addons/microdagr/gui.hpp b/addons/microdagr/gui.hpp
index 1404f6b81db..2a3f52deb43 100644
--- a/addons/microdagr/gui.hpp
+++ b/addons/microdagr/gui.hpp
@@ -40,8 +40,8 @@ class GVAR(RscText): RscText {
};
//Redfine Scaling for the Dialog
-#define X_PART(num) QUOTE((((60 - 25)/2) + (num)) * (safeZoneH / 64) + (safezoneX + (safezoneW - safeZoneH)/2))
-#define Y_PART(num) QUOTE((0 + (num)) * (safeZoneH / 36) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2))
+#define X_PART(num) QUOTE((((60 - 25)/2) + (num)) * (safeZoneH / 64) + (safeZoneX + (safeZoneW - safeZoneH)/2))
+#define Y_PART(num) QUOTE((0 + (num)) * (safeZoneH / 36) + (safeZoneY + (safeZoneH - (safeZoneH / 1.2))/2))
#define W_PART(num) QUOTE((num) * (safeZoneH / 64))
#define H_PART(num) QUOTE((num) * (safeZoneH / 36))
diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml
index c9bd546afce..79b66e18ebb 100644
--- a/addons/microdagr/stringtable.xml
+++ b/addons/microdagr/stringtable.xml
@@ -29,7 +29,7 @@
MicroDAGR fejlett GPS vevőegység
Ricevitore GPS avanzato MicroDAGR
Receptor GPS avançado MicroDAGR
- MicroDAGRは改良された高度なGPS受信機です
+ MicroDAGRは高機能なGPS受信機です
마이크로DAGR 고급 위성항법 수신기
微型军用高级防御 GPS 接收器
微型軍用高級防禦GPS接收器
@@ -605,6 +605,7 @@
MicroDAGR - Poprzedni Tryb
微型 GPS 接收器—上一个模式
마이크로DAGR - 이전 모드
+ MicroDAGR - Modo Anterior
MicroDAGR - Next Mode
@@ -617,6 +618,7 @@
MicroDAGR - Kolejny Tryb
微型 GPS 接收器—下一个模式
마이크로DAGR - 다음 모드
+ MicroDAGR - Modo Seguinte
diff --git a/addons/minedetector/XEH_postInit.sqf b/addons/minedetector/XEH_postInit.sqf
index f5f5de0ca8a..0671699f9e8 100644
--- a/addons/minedetector/XEH_postInit.sqf
+++ b/addons/minedetector/XEH_postInit.sqf
@@ -16,9 +16,9 @@ addMissionEventHandler ["Draw3D", {
{
private _name = format ["%1@%2", typeOf _x, (floor ((_x distance _detectorPointAGL) * 10)) / 10];
if ((getNumber (configOf _x >> QGVAR(detectable))) == 1) then {
- drawIcon3D ["\A3\ui_f\data\map\markers\military\dot_CA.paa", [1,0,0,1], (ASLtoAGL (getPosASL _x)), 1, 1, 0, _name, 1, 0.02, "PuristaMedium"];
+ drawIcon3D ["\A3\ui_f\data\map\markers\military\dot_CA.paa", [1,0,0,1], (ASLToAGL (getPosASL _x)), 1, 1, 0, _name, 1, 0.02, "PuristaMedium"];
} else {
- drawIcon3D ["\A3\ui_f\data\map\markers\military\dot_CA.paa", [1,1,0,1], (ASLtoAGL (getPosASL _x)), 1, 1, 0, _name, 1, 0.02, "PuristaMedium"];
+ drawIcon3D ["\A3\ui_f\data\map\markers\military\dot_CA.paa", [1,1,0,1], (ASLToAGL (getPosASL _x)), 1, 1, 0, _name, 1, 0.02, "PuristaMedium"];
};
} forEach _mines;
}];
diff --git a/addons/missileguidance/ACE_GuidanceConfig.hpp b/addons/missileguidance/ACE_GuidanceConfig.hpp
index 3628c9eec04..131beee3398 100644
--- a/addons/missileguidance/ACE_GuidanceConfig.hpp
+++ b/addons/missileguidance/ACE_GuidanceConfig.hpp
@@ -6,6 +6,11 @@ class GVAR(AttackProfiles) {
functionName = QFUNC(attackProfile_LIN);
};
+ // empty classes for backwards compat
+ class MID: LIN {
+ };
+ class HI: LIN {
+ };
class DIR {
name = "";
visualName = "";
@@ -13,21 +18,14 @@ class GVAR(AttackProfiles) {
functionName = QFUNC(attackProfile_DIR);
};
- class MID {
- name = "";
- visualName = "";
- description = "";
-
- functionName = QFUNC(attackProfile_MID);
- };
- class HI {
+ class LOFT {
name = "";
visualName = "";
description = "";
- functionName = QFUNC(attackProfile_HI);
+ functionName = QFUNC(attackProfile_LOFT);
};
- class JAV_DIR {
+ class JAV_DIR {
name = "";
visualName = "";
description = "";
@@ -82,12 +80,39 @@ class GVAR(SeekerTypes) {
functionName = QFUNC(seekerType_SACLOS);
onFired = QFUNC(SACLOS_onFired);
};
- class ARH {
+ class MillimeterWaveRadar {
name = "";
visualName = "";
description = "";
- functionName = QFUNC(seekerType_ARH);
- onFired = QFUNC(ahr_onFired);
+ functionName = QFUNC(seekerType_MWR);
+ onFired = QFUNC(mwr_onFired);
+ };
+};
+
+class GVAR(NavigationTypes) {
+ class Direct {
+ functionName = QFUNC(navigationType_direct);
+ onFired = "";
+ };
+ class Line {
+ functionName = QFUNC(navigationType_line);
+ onFired = QFUNC(line_onFired);
+ };
+ class LineOfSight {
+ functionName = QFUNC(navigationType_lineOfSight);
+ onFired = QFUNC(proNav_onFired);
+ };
+ class ProportionalNavigation {
+ functionName = QFUNC(navigationType_proNav);
+ onFired = QFUNC(proNav_onFired);
+ };
+ class AugmentedProportionalNavigation {
+ functionName = QFUNC(navigationType_augmentedProNav);
+ onFired = QFUNC(proNav_onFired);
+ };
+ class ZeroEffortMiss {
+ functionName = QFUNC(navigationType_zeroEffortMiss);
+ onFired = QFUNC(proNav_onFired);
};
};
diff --git a/addons/missileguidance/CfgAmmo.hpp b/addons/missileguidance/CfgAmmo.hpp
index a2b07b7fff1..44e35d40811 100644
--- a/addons/missileguidance/CfgAmmo.hpp
+++ b/addons/missileguidance/CfgAmmo.hpp
@@ -17,31 +17,8 @@ class CfgAmmo {
EGVAR(rearm,caliber) = 70;
- class ADDON {
+ class ADDON: GVAR(type_Dagr) {
enabled = 1;
-
- minDeflection = 0.0005; // Minium flap deflection for guidance
- maxDeflection = 0.0025; // Maximum flap deflection for guidance
- incDeflection = 0.0005; // The incrmeent in which deflection adjusts.
-
- canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
-
- // Guidance type for munitions
- defaultSeekerType = "SALH";
- seekerTypes[] = { "SALH", "LIDAR", "SARH", "Optic", "Thermal", "GPS", "SACLOS", "MCLOS" };
-
- defaultSeekerLockMode = "LOAL";
- seekerLockModes[] = { "LOAL", "LOBL" };
-
- seekerAngle = 90; // Angle in front of the missile which can be searched
- seekerAccuracy = 1; // seeker accuracy multiplier
-
- seekerMinRange = 1;
- seekerMaxRange = 2500; // Range from the missile which the seeker can visually search
-
- // Attack profile type selection
- defaultAttackProfile = "LIN";
- attackProfiles[] = { "LIN", "DIR", "MID", "HI" };
};
};
@@ -66,34 +43,8 @@ class CfgAmmo {
initTime = 0.5;
// Begin ACE guidance Configs
- class ADDON {
+ class ADDON: GVAR(type_Javelin) {
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;
};
};
class ACE_Javelin_FGM148_static: ACE_Javelin_FGM148 {
@@ -102,6 +53,8 @@ class CfgAmmo {
effectsMissileInit = "RocketBackEffectsStaticRPG";
//Explicity add guidance config
- class ADDON: ADDON {};
+ class ADDON: ADDON {
+ enabled = 1;
+ };
};
};
diff --git a/addons/missileguidance/CfgMagazines.hpp b/addons/missileguidance/CfgMagazines.hpp
index 74d75e8d4ae..c7ef48004ca 100644
--- a/addons/missileguidance/CfgMagazines.hpp
+++ b/addons/missileguidance/CfgMagazines.hpp
@@ -4,24 +4,40 @@ class CfgMagazines {
class 6Rnd_ACE_Hydra70_DAGR: 12Rnd_PG_missiles {
ammo = "ACE_Hydra70_DAGR";
count = 12;
- displayName = "6 Round DAGR";
- displayNameShort = "6 Round DAGR";
- descriptionShort = "6 Round DAGR";
+ displayName = CSTRING(Hydra70_DAGR_6x);
weight = 36;
};
class 12Rnd_ACE_Hydra70_DAGR: 6Rnd_ACE_Hydra70_DAGR {
count = 12;
- displayName = "16 Round DAGR";
- displayNameShort = "16 Round DAGR";
- descriptionShort = "16 Round DAGR";
+ displayName = CSTRING(Hydra70_DAGR_12x);
weight = 72;
};
class 24Rnd_ACE_Hydra70_DAGR: 6Rnd_ACE_Hydra70_DAGR {
count = 24;
- displayName = "24 Round DAGR";
- displayNameShort = "24 Round DAGR";
- descriptionShort = "24 Round DAGR";
+ displayName = CSTRING(Hydra70_DAGR_24x);
weight = 72;
};
+
+ class PylonRack_12Rnd_PG_missiles;
+ class PylonRack_6Rnd_ACE_DAGR: PylonRack_12Rnd_PG_missiles {
+ ammo = "ACE_Hydra70_DAGR";
+ displayName = CSTRING(Hydra70_DAGR_6x);
+ count = 6;
+ pylonWeapon = QGVAR(dagr);
+ };
+
+ class PylonRack_12Rnd_ACE_DAGR: PylonRack_12Rnd_PG_missiles {
+ ammo = "ACE_Hydra70_DAGR";
+ displayName = CSTRING(Hydra70_DAGR_12x);
+ count = 12;
+ pylonWeapon = QGVAR(dagr);
+ };
+
+ class PylonRack_24Rnd_ACE_DAGR: PylonRack_12Rnd_PG_missiles {
+ ammo = "ACE_Hydra70_DAGR";
+ displayName = CSTRING(Hydra70_DAGR_24x);
+ count = 24;
+ pylonWeapon = QGVAR(dagr);
+ };
};
diff --git a/addons/missileguidance/CfgMissileTypesNato.hpp b/addons/missileguidance/CfgMissileTypesNato.hpp
new file mode 100644
index 00000000000..ee4c76890e9
--- /dev/null
+++ b/addons/missileguidance/CfgMissileTypesNato.hpp
@@ -0,0 +1,716 @@
+class GVAR(type_AMRAAM) {
+ enabled = 0;
+
+ pitchRate = 30; // Minium flap deflection for guidance
+ yawRate = 30; // Maximum flap deflection for guidance
+
+ canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "DopplerRadar";
+ seekerTypes[] = { "DopplerRadar" };
+ lockableTypes[] = {"Air"};
+
+ minimumSpeedFilter = 25; // filter out targets that have a closing velocity less than this
+ minimumTimeFilter = 0.0001; // filter out targets that are this close to the ground (speed of light)
+ maxTerrainCheck = 16000; // How far we should check for terrain
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "ZeroEffortMiss";
+ navigationTypes[] = { "ZeroEffortMiss" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 50; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 2500; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR", "LOFT"};
+ useModeForAttackProfile = 1;
+};
+
+class GVAR(type_ASRAAM) {
+ enabled = 0;
+
+ pitchRate = 100; // Minium flap deflection for guidance
+ yawRate = 100; // Maximum flap deflection for guidance
+
+ canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "IR";
+ seekerTypes[] = { "IR" };
+
+ flareDistanceFilter = 50;
+ flareAngleFilter = 0.8; // can filter out flares that are >= flareAngleFilter to known target velocity
+
+ defaultSeekerLockMode = "LOBL";
+ seekerLockModes[] = { "LOBL" };
+
+ defaultNavigationType = "ZeroEffortMiss";
+ navigationTypes[] = { "ZeroEffortMiss" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 120; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 0.98; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 8000; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR"};
+};
+
+class GVAR(type_Dagr) {
+ enabled = 0;
+
+ pitchRate = 40; // degrees per second
+ yawRate = 40;
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "SALH";
+ seekerTypes[] = { "SALH" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "AugmentedProportionalNavigation";
+ navigationTypes[] = { "AugmentedProportionalNavigation" };
+
+ seekerAngle = 90; // Angle in front of the missile which can be searched
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 1;
+ seekerMaxRange = 2500; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "LIN";
+ attackProfiles[] = { "LIN", "DIR", "MID", "HI" };
+};
+
+class GVAR(type_Dragon) {
+ enabled = 0;
+
+ pitchRate = 0;
+ yawRate = 0;
+
+ canVanillaLock = 0;
+
+ // Guidance type for munitions
+ defaultSeekerType = "SACLOS";
+ seekerTypes[] = { "SACLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "LineOfSight";
+ navigationTypes[] = { "LineOfSight" };
+
+ seekLastTargetPos = 0;
+ seekerAngle = 30;
+ seekerAccuracy = 1;
+
+ seekerMinRange = 65;
+ seekerMaxRange = 1000;
+
+ correctionDistance = 30;
+ missileLeadDistance = 0;
+ offsetFromCrosshair[] = { 0, 0, 0 };
+
+ serviceInterval = 0.33; // how many seconds between pops
+ serviceCharges = 32; // how many charges are in this missile
+ serviceChargeAcceleration = 6.5;
+ dragonSpeed = 100; // meters per second
+
+ defaultAttackProfile = "DRAGON";
+ attackProfiles[] = {"DRAGON"};
+};
+
+class GVAR(type_ESSM) {
+ enabled = 0;
+
+ pitchRate = 15; // Minium flap deflection for guidance
+ yawRate = 15; // Maximum flap deflection for guidance
+
+ canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "DopplerRadar";
+ seekerTypes[] = { "DopplerRadar" };
+ lockableTypes[] = {"Air"};
+
+ minimumSpeedFilter = 20; // filter out targets that have a closing velocity less than this
+ minimumTimeFilter = 0.00001; // filter out targets that are this close to the ground (speed of light)
+ maxTerrainCheck = 16000; // How far we should check for terrain
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "ZeroEffortMiss";
+ navigationTypes[] = { "ZeroEffortMiss" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 50; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 2500; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR"};
+};
+
+class GVAR(type_Hellfire) {
+ enabled = 0;
+
+ pitchRate = 30; // degrees per second
+ yawRate = 30;
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "SALH";
+ seekerTypes[] = { "SALH" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "Direct";
+ navigationTypes[] = { "Direct", "ZeroEffortMiss" };
+
+ seekLastTargetPos = 1; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 70; // Angle in front of the missile which can be searched
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 1;
+ seekerMaxRange = 8000; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "hellfire";
+ attackProfiles[] = {"hellfire", "hellfire_hi", "hellfire_lo"};
+
+ class navigationStates {
+ class initial {
+ transitionCondition = QEFUNC(hellfire,midCourseTransition);
+ navigationType = "Direct";
+ };
+ class terminal {
+ transitionCondition = "";
+ navigationType = "ZeroEffortMiss";
+ };
+ // transitions from initial -> termimal
+ states[] = {"initial", "terminal"};
+ };
+};
+
+class GVAR(type_Hot) {
+ enabled = 0;
+
+ pitchRate = 45; // Minium flap deflection for guidance
+ yawRate = 45; // Maximum flap deflection for guidance
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ showTrail = 1;
+
+ // Guidance type for munitions
+ defaultSeekerType = "SACLOS";
+ seekerTypes[] = { "SACLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 7;
+ lineGainD = 6;
+
+ initialPitch = 2;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 30; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 4000; // Range from the missile which the seeker can visually search
+
+ offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
+
+ // Attack profile type selection
+ defaultAttackProfile = "WIRE";
+ attackProfiles[] = {"WIRE"};
+};
+
+class GVAR(type_Javelin) {
+ enabled = 0;
+
+ pitchRate = 120; // degrees per second
+ yawRate = 120;
+ stabilityCoefficient = 0.2;
+ bangBangGuidance = 0;
+
+ canVanillaLock = 0;
+
+ // Guidance type for munitions
+ defaultSeekerType = "Optic";
+ seekerTypes[] = { "Optic" };
+
+ defaultSeekerLockMode = "LOBL";
+ seekerLockModes[] = { "LOBL" };
+
+ defaultNavigationType = "Direct";
+ navigationTypes[] = { "Direct", "ZeroEffortMiss" };
+
+ navigationGain = 3;
+
+ 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;
+
+ class navigationStates {
+ class initial {
+ transitionCondition = QFUNC(javelin_midCourseTransition);
+ navigationType = "Direct";
+ };
+ class terminal {
+ transitionCondition = "";
+ navigationType = "ZeroEffortMiss";
+ };
+ // transitions from initial -> termimal
+ states[] = {"initial", "terminal"};
+ };
+};
+
+class GVAR(type_Jdam) {
+ enabled = 0;
+
+ pitchRate = 15;
+ yawRate = 20;
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "GPS";
+ seekerTypes[] = { "GPS" };
+
+ defaultSeekerLockMode = "LOBL";
+ seekerLockModes[] = { "LOBL" };
+
+ defaultNavigationType = "LINE";
+ navigationTypes[] = { "LINE" };
+
+ lineGainP = 50;
+ lineGainD = 0;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 60; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 5;
+ seekerMaxRange = 4000; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "JDAM";
+ attackProfiles[] = {"JDAM"};
+};
+
+class GVAR(type_Maverick) {
+ enabled = 0;
+
+ pitchRate = 15;
+ yawRate = 15;
+
+ canVanillaLock = 1;
+
+ defaultSeekerType = "Optic";
+ seekerTypes[] = {"Optic"};
+
+ defaultSeekerLockMode = "LOBL";
+ seekerLockModes[] = {"LOBL"};
+
+ defaultNavigationType = "AugmentedProportionalNavigation";
+ navigationTypes[] = { "AugmentedProportionalNavigation" };
+
+ seekLastTargetPos = 1;
+ seekerAngle = 60;
+ seekerAccuracy = 1;
+
+ seekerMinRange = 1;
+ seekerMaxRange = 14000;
+
+ defaultAttackProfile = "maverick";
+ attackProfiles[] = {"maverick"};
+};
+
+class GVAR(type_Milan) {
+ enabled = 0;
+
+ pitchRate = 60; // Minium flap deflection for guidance
+ yawRate = 60; // Maximum flap deflection for guidance
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ showTrail = 0;
+
+ // Guidance type for munitions
+ defaultSeekerType = "SACLOS";
+ seekerTypes[] = { "SACLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 25;
+ lineGainD = 12;
+
+ initialPitch = -0.4;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 5; // Angle from the shooter's view that can track the missile, implemented
+ seekerAccuracy = 1; // seeker accuracy multiplier, not implemented?
+
+ seekerMinRange = 100;
+ seekerMaxRange = 2000; // Range from the missile which the seeker can visually search
+
+ offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
+
+ // Attack profile type selection
+ defaultAttackProfile = "WIRE";
+ attackProfiles[] = {"WIRE"};
+};
+
+class GVAR(type_Nlaw) {
+ enabled = 0;
+
+ pitchRate = 5; // Minium flap deflection for guidance
+ yawRate = 10; // Maximum flap deflection for guidance
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = QEGVAR(nlaw,seeker);
+ seekerTypes[] = {QEGVAR(nlaw,seeker)};
+
+ defaultSeekerLockMode = "LOBL";
+ seekerLockModes[] = {"LOBL"};
+
+ defaultNavigationType = QEGVAR(nlaw,PLOS);
+ navigationTypes[] = { QEGVAR(nlaw,PLOS) };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 45; // Angle in front of the missile which can be searched
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 0;
+ seekerMaxRange = 10; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = QEGVAR(nlaw,directAttack);
+ attackProfiles[] = {QEGVAR(nlaw,directAttack), QEGVAR(nlaw,overflyTopAttack)};
+ useModeForAttackProfile = 1;
+ showHintOnCycle = 1;
+
+ // Run once at fired event
+ onFired = QEFUNC(nlaw,onFired);
+};
+
+class GVAR(type_Patriot) {
+ enabled = 0;
+
+ pitchRate = 30; // Minium flap deflection for guidance
+ yawRate = 30; // Maximum flap deflection for guidance
+
+ canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "DopplerRadar";
+ seekerTypes[] = { "DopplerRadar" };
+ lockableTypes[] = {"Air"};
+
+ minimumSpeedFilter = 10; // filter out targets that have a closing velocity less than this
+ minimumTimeFilter = 0.00001; // filter out targets that are this close to the ground (speed of light)
+ maxTerrainCheck = 16000; // How far we should check for terrain
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "ZeroEffortMiss";
+ navigationTypes[] = { "ZeroEffortMiss" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 50; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 2500; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR"};
+};
+
+class GVAR(type_Paveway) {
+ enabled = 0;
+
+ pitchRate = 5;
+ yawRate = 5;
+
+ bangBangGuidance = 1;
+ stabilityCoefficient = 0.4; // how much this projectile likes to "weathervane" (keep direction toward velocity)
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "SALH";
+ seekerTypes[] = { "SALH" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL" };
+
+ defaultNavigationType = "ProportionalNavigation";
+ navigationTypes[] = { "ProportionalNavigation" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 60; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 5;
+ seekerMaxRange = 4000; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR"};
+};
+
+class GVAR(type_RAM) {
+ enabled = 0;
+
+ pitchRate = 50; // Minium flap deflection for guidance
+ yawRate = 50; // Maximum flap deflection for guidance
+
+ canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "IR";
+ seekerTypes[] = { "IR" };
+
+ flareDistanceFilter = 100;
+ flareAngleFilter = 0.5; // can filter out flares that are >= flareAngleFilter to known target velocity
+
+ defaultSeekerLockMode = "LOBL";
+ seekerLockModes[] = { "LOBL" };
+
+ defaultNavigationType = "ZeroEffortMiss";
+ navigationTypes[] = { "ZeroEffortMiss" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 45; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 0.8; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 5000; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR"};
+};
+
+class GVAR(type_RBS70) {
+ enabled = 0;
+
+ pitchRate = 45; // Minium flap deflection for guidance
+ yawRate = 45; // Maximum flap deflection for guidance
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ showTrail = 1;
+
+ // Guidance type for munitions
+ defaultSeekerType = "SACLOS";
+ seekerTypes[] = { "SACLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 20;
+ lineGainD = 16;
+
+ initialPitch = 2;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 30; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 5000; // Range from the missile which the seeker can visually search
+
+ correctionDistance = 30; // distance from center of crosshair where missile slows down
+ offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
+
+ // Attack profile type selection
+ defaultAttackProfile = "BEAM";
+ attackProfiles[] = {"BEAM"};
+};
+
+class GVAR(type_Redeye) {
+ enabled = 0;
+
+ pitchRate = 27; // Minium flap deflection for guidance
+ yawRate = 27; // Maximum flap deflection for guidance
+
+ canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "IR";
+ seekerTypes[] = { "IR" };
+
+ flareDistanceFilter = 100;
+ flareAngleFilter = 2.0; // can filter out flares that are >= flareAngleFilter to known target velocity
+
+ defaultSeekerLockMode = "LOBL";
+ seekerLockModes[] = { "LOBL" };
+
+ defaultNavigationType = "ProportionalNavigation";
+ navigationTypes[] = { "ProportionalNavigation" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 45; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 0.4; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 4500; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR"};
+};
+
+class GVAR(type_Sidewinder) {
+ enabled = 0;
+
+ pitchRate = 25; // Minium flap deflection for guidance
+ yawRate = 25; // Maximum flap deflection for guidance
+
+ canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "IR";
+ seekerTypes[] = { "IR" };
+
+ flareDistanceFilter = 100;
+ flareAngleFilter = 1.6; // can filter out flares that are >= flareAngleFilter to known target velocity
+
+ defaultSeekerLockMode = "LOBL";
+ seekerLockModes[] = { "LOBL" };
+
+ defaultNavigationType = "AugmentedProportionalNavigation";
+ navigationTypes[] = { "AugmentedProportionalNavigation" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 45; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 0.8; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 5000; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR"};
+};
+
+class GVAR(type_Stinger) {
+ enabled = 0;
+
+ pitchRate = 42; // Minium flap deflection for guidance
+ yawRate = 42; // Maximum flap deflection for guidance
+
+ canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "IR";
+ seekerTypes[] = { "IR" };
+
+ flareDistanceFilter = 100;
+ flareAngleFilter = 1.3; // can filter out flares that are >= flareAngleFilter to known target velocity
+
+ defaultSeekerLockMode = "LOBL";
+ seekerLockModes[] = { "LOBL" };
+
+ defaultNavigationType = "AugmentedProportionalNavigation";
+ navigationTypes[] = { "AugmentedProportionalNavigation" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 45; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 0.8; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 5000; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR"};
+};
+
+class GVAR(type_TOW) {
+ enabled = 0;
+
+ pitchRate = 45; // Minium flap deflection for guidance
+ yawRate = 45; // Maximum flap deflection for guidance
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ showTrail = 1;
+
+ // Guidance type for munitions
+ defaultSeekerType = "SACLOS";
+ seekerTypes[] = { "SACLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 20;
+ lineGainD = 7;
+
+ initialPitch = 2;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 30; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 65;
+ seekerMaxRange = 3750; // Range from the missile which the seeker can visually search
+
+ correctionDistance = 30; // distance from center of crosshair where missile slows down
+ offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
+
+ // Attack profile type selection
+ defaultAttackProfile = "WIRE";
+ attackProfiles[] = {"WIRE"};
+};
\ No newline at end of file
diff --git a/addons/missileguidance/CfgMissileTypesWarsaw.hpp b/addons/missileguidance/CfgMissileTypesWarsaw.hpp
new file mode 100644
index 00000000000..4dbe81bbbf5
--- /dev/null
+++ b/addons/missileguidance/CfgMissileTypesWarsaw.hpp
@@ -0,0 +1,901 @@
+class GVAR(type_Ataka) {
+ enabled = 0;
+
+ pitchRate = 45; // Minium flap deflection for guidance
+ yawRate = 45; // Maximum flap deflection for guidance
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ showTrail = 1;
+
+ // Guidance type for munitions
+ defaultSeekerType = "SACLOS";
+ seekerTypes[] = { "SACLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 16;
+ lineGainD = 10.44;
+
+ initialPitch = 2;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 30; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 6000; // Range from the missile which the seeker can visually search
+
+ offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
+
+ // Attack profile type selection
+ defaultAttackProfile = "BEAM";
+ attackProfiles[] = {"BEAM"};
+};
+
+class GVAR(type_Bastion) {
+ enabled = 0;
+
+ pitchRate = 45; // Minium flap deflection for guidance
+ yawRate = 45; // Maximum flap deflection for guidance
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ showTrail = 1;
+
+ // Guidance type for munitions
+ defaultSeekerType = "SACLOS";
+ seekerTypes[] = { "SACLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 16;
+ lineGainD = 10.44;
+
+ initialPitch = 2;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 30; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 6000; // Range from the missile which the seeker can visually search
+
+ offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
+
+ // Attack profile type selection
+ defaultAttackProfile = "BEAM";
+ attackProfiles[] = {"BEAM"};
+};
+
+class GVAR(type_Drakon) {
+ enabled = 0;
+
+ pitchRate = 25; // Minium flap deflection for guidance
+ yawRate = 25; // Maximum flap deflection for guidance
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ showTrail = 1;
+
+ // Guidance type for munitions
+ defaultSeekerType = "SACLOS";
+ seekerTypes[] = { "SACLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 16;
+ lineGainD = 9.5;
+
+ initialPitch = 2;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 30; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 3300; // Range from the missile which the seeker can visually search
+
+ correctionDistance = 30; // distance from center of crosshair where missile slows down
+ offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
+
+ // Attack profile type selection
+ defaultAttackProfile = "BEAM";
+ attackProfiles[] = {"BEAM"};
+};
+
+class GVAR(type_Fagot) {
+ enabled = 0;
+
+ pitchRate = 45; // Minium flap deflection for guidance
+ yawRate = 45; // Maximum flap deflection for guidance
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ showTrail = 1;
+
+ // Guidance type for munitions
+ defaultSeekerType = "SACLOS";
+ seekerTypes[] = { "SACLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 16;
+ lineGainD = 10.44;
+
+ initialPitch = 2;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 30; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 2000; // Range from the missile which the seeker can visually search
+
+ correctionDistance = 30; // distance from center of crosshair where missile slows down
+ offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
+
+ // Attack profile type selection
+ defaultAttackProfile = "BEAM";
+ attackProfiles[] = {"BEAM"};
+};
+
+class GVAR(type_Falanga) {
+ enabled = 0;
+
+ pitchRate = 15; // Minium flap deflection for guidance
+ yawRate = 15; // Maximum flap deflection for guidance
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ showTrail = 1;
+
+ // Guidance type for munitions
+ defaultSeekerType = "MCLOS";
+ seekerTypes[] = { "MCLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 5;
+ lineGainD = 0;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 30; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 0;
+ seekerMaxRange = 2500; // Range from the missile which the seeker can visually search
+
+ correctionDistance = 0; // distance from center of crosshair where missile slows down
+ offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
+
+ // Attack profile type selection
+ defaultAttackProfile = "WIRE";
+ attackProfiles[] = {"WIRE"};
+};
+
+class GVAR(type_Fleyta) {
+ enabled = 0;
+
+ pitchRate = 15; // Minium flap deflection for guidance
+ yawRate = 15; // Maximum flap deflection for guidance
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ showTrail = 1;
+
+ // Guidance type for munitions
+ defaultSeekerType = "MCLOS";
+ seekerTypes[] = { "MCLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 5;
+ lineGainD = 0;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 30; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 0;
+ seekerMaxRange = 3000; // Range from the missile which the seeker can visually search
+
+ correctionDistance = 0; // distance from center of crosshair where missile slows down
+ offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
+
+ // Attack profile type selection
+ defaultAttackProfile = "WIRE";
+ attackProfiles[] = {"WIRE"};
+};
+
+class GVAR(type_Igla) {
+ enabled = 0;
+
+ pitchRate = 30; // Minium flap deflection for guidance
+ yawRate = 43; // Maximum flap deflection for guidance
+
+ canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "IR";
+ seekerTypes[] = { "IR" };
+
+ flareDistanceFilter = 100;
+ flareAngleFilter = 1.1; // can filter out flares that are >= flareAngleFilter to known target velocity
+
+ defaultSeekerLockMode = "LOBL";
+ seekerLockModes[] = { "LOBL" };
+
+ defaultNavigationType = "AugmentedProportionalNavigation";
+ navigationTypes[] = { "AugmentedProportionalNavigation" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 45; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 0.76; // seeker accuracy multiplier
+
+ seekerMinRange = 5;
+ seekerMaxRange = 5200; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR"};
+};
+
+class GVAR(type_KAB) {
+ enabled = 0;
+
+ pitchRate = 8;
+ yawRate = 8;
+
+ bangBangGuidance = 1;
+ stabilityCoefficient = 0.4; // how much this projectile likes to "weathervane" (keep direction toward velocity)
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "SALH";
+ seekerTypes[] = { "SALH" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL" };
+
+ defaultNavigationType = "ProportionalNavigation";
+ navigationTypes[] = { "ProportionalNavigation" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 60; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 5;
+ seekerMaxRange = 4000; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR"};
+};
+
+class GVAR(type_KH25) {
+ enabled = 0;
+
+ pitchRate = 20;
+ yawRate = 20;
+
+ canVanillaLock = 0;
+
+ defaultSeekerType = "SALH";
+ seekerTypes[] = {"SALH"};
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = {"LOAL"};
+
+ defaultNavigationType = "AugmentedProportionalNavigation";
+ navigationTypes[] = { "AugmentedProportionalNavigation" };
+
+ seekLastTargetPos = 1;
+ seekerAngle = 40;
+ seekerAccuracy = 1;
+
+ seekerMinRange = 1;
+ seekerMaxRange = 10000;
+
+ defaultAttackProfile = "maverick";
+ attackProfiles[] = {"maverick"};
+};
+
+class GVAR(type_KH29) {
+ enabled = 0;
+
+ pitchRate = 20;
+ yawRate = 20;
+
+ canVanillaLock = 0;
+
+ defaultSeekerType = "SALH";
+ seekerTypes[] = {"SALH"};
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = {"LOAL"};
+
+ defaultNavigationType = "AugmentedProportionalNavigation";
+ navigationTypes[] = { "AugmentedProportionalNavigation" };
+
+ seekLastTargetPos = 1;
+ seekerAngle = 40;
+ seekerAccuracy = 1;
+
+ seekerMinRange = 1;
+ seekerMaxRange = 10000;
+
+ defaultAttackProfile = "maverick";
+ attackProfiles[] = {"maverick"};
+};
+
+class GVAR(type_Kobra) {
+ enabled = 0;
+
+ pitchRate = 45; // Minium flap deflection for guidance
+ yawRate = 45; // Maximum flap deflection for guidance
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ showTrail = 1;
+
+ // Guidance type for munitions
+ defaultSeekerType = "SACLOS";
+ seekerTypes[] = { "SACLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 16;
+ lineGainD = 9.5;
+
+ initialPitch = 2;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 30; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 5000; // Range from the missile which the seeker can visually search
+
+ correctionDistance = 30; // distance from center of crosshair where missile slows down
+ offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
+
+ // Attack profile type selection
+ defaultAttackProfile = "BEAM";
+ attackProfiles[] = {"BEAM"};
+};
+
+class GVAR(type_Konkurs) {
+ enabled = 0;
+
+ pitchRate = 45; // Minium flap deflection for guidance
+ yawRate = 45; // Maximum flap deflection for guidance
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ showTrail = 1;
+
+ // Guidance type for munitions
+ defaultSeekerType = "SACLOS";
+ seekerTypes[] = { "SACLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 10;
+ lineGainD = 8.5;
+
+ initialPitch = 2;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 30; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 4000; // Range from the missile which the seeker can visually search
+
+ offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
+
+ // Attack profile type selection
+ defaultAttackProfile = "WIRE";
+ attackProfiles[] = {"WIRE"};
+};
+
+class GVAR(type_Kornet) {
+ enabled = 0;
+
+ pitchRate = 45; // Minium flap deflection for guidance
+ yawRate = 45; // Maximum flap deflection for guidance
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ showTrail = 1;
+
+ // Guidance type for munitions
+ defaultSeekerType = "SACLOS";
+ seekerTypes[] = { "SACLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 16;
+ lineGainD = 10.44;
+
+ initialPitch = 2;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 30; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 5000; // Range from the missile which the seeker can visually search
+
+ correctionDistance = 30; // distance from center of crosshair where missile slows down
+ offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
+
+ // Attack profile type selection
+ defaultAttackProfile = "BEAM";
+ attackProfiles[] = {"BEAM"};
+};
+
+class GVAR(type_Malyutka) {
+ enabled = 0;
+
+ pitchRate = 15; // Minium flap deflection for guidance
+ yawRate = 15; // Maximum flap deflection for guidance
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ showTrail = 1;
+
+ // Guidance type for munitions
+ defaultSeekerType = "MCLOS";
+ seekerTypes[] = { "MCLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 5;
+ lineGainD = 0;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 30; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 0;
+ seekerMaxRange = 2500; // Range from the missile which the seeker can visually search
+
+ correctionDistance = 0; // distance from center of crosshair where missile slows down
+ offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
+
+ // Attack profile type selection
+ defaultAttackProfile = "WIRE";
+ attackProfiles[] = {"WIRE"};
+};
+
+class GVAR(type_Metis) {
+ enabled = 0;
+
+ pitchRate = 50; // Minium flap deflection for guidance
+ yawRate = 50; // Maximum flap deflection for guidance
+ initialPitch = 2;
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ showTrail = 1;
+
+ // Guidance type for munitions
+ defaultSeekerType = "SACLOS";
+ seekerTypes[] = { "SACLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 16;
+ lineGainD = 10.44;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 15; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 80;
+ seekerMaxRange = 1000; // Range from the missile which the seeker can visually search
+
+ correctionDistance = 3; // distance from center of crosshair where missile slows down
+ offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
+
+ // Attack profile type selection
+ defaultAttackProfile = "WIRE";
+ attackProfiles[] = {"WIRE"};
+};
+
+class GVAR(type_Molniya) {
+ enabled = 0;
+
+ pitchRate = 45; // Minium flap deflection for guidance
+ yawRate = 45; // Maximum flap deflection for guidance
+
+ canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "IR";
+ seekerTypes[] = { "IR" };
+
+ flareDistanceFilter = 50;
+ flareAngleFilter = 0.8; // can filter out flares that are >= flareAngleFilter to known target velocity
+
+ defaultSeekerLockMode = "LOBL";
+ seekerLockModes[] = { "LOBL" };
+
+ defaultNavigationType = "AugmentedProportionalNavigation";
+ navigationTypes[] = { "AugmentedProportionalNavigation" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 40; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 0.85; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 5000; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR"};
+};
+
+class GVAR(type_R73) {
+ enabled = 0;
+
+ pitchRate = 35; // Minium flap deflection for guidance
+ yawRate = 35; // Maximum flap deflection for guidance
+
+ canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "IR";
+ seekerTypes[] = { "IR" };
+
+ flareDistanceFilter = 50;
+ flareAngleFilter = 0.8; // can filter out flares that are >= flareAngleFilter to known target velocity
+
+ defaultSeekerLockMode = "LOBL";
+ seekerLockModes[] = { "LOBL" };
+
+ defaultNavigationType = "AugmentedProportionalNavigation";
+ navigationTypes[] = { "AugmentedProportionalNavigation" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 40; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 0.85; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 5000; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR"};
+};
+
+class GVAR(type_R74) {
+ enabled = 1;
+
+ pitchRate = 50; // Minium flap deflection for guidance
+ yawRate = 50; // Maximum flap deflection for guidance
+
+ canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "IR";
+ seekerTypes[] = { "IR" };
+
+ flareDistanceFilter = 50;
+ flareAngleFilter = 0.8; // can filter out flares that are >= flareAngleFilter to known target velocity
+
+ defaultSeekerLockMode = "LOBL";
+ seekerLockModes[] = { "LOBL" };
+
+ defaultNavigationType = "AugmentedProportionalNavigation";
+ navigationTypes[] = { "AugmentedProportionalNavigation" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 75; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 0.95; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 8000; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR"};
+};
+
+class GVAR(type_R77) {
+ enabled = 0;
+
+ pitchRate = 40; // Minium flap deflection for guidance
+ yawRate = 40; // Maximum flap deflection for guidance
+
+ canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "DopplerRadar";
+ seekerTypes[] = { "DopplerRadar" };
+ lockableTypes[] = {"Air"};
+
+ minimumSpeedFilter = 15; // filter out targets that have a closing velocity less than this
+ minimumTimeFilter = 0.00005; // filter out targets that are this close to the ground (speed of light)
+ maxTerrainCheck = 16000; // How far we should check for terrain
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "ZeroEffortMiss";
+ navigationTypes[] = { "ZeroEffortMiss" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 50; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 2500; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR", "LOFT"};
+ useModeForAttackProfile = 1;
+};
+
+class GVAR(type_Refleks) {
+ enabled = 0;
+
+ pitchRate = 45; // Minium flap deflection for guidance
+ yawRate = 45; // Maximum flap deflection for guidance
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ showTrail = 1;
+
+ // Guidance type for munitions
+ defaultSeekerType = "SACLOS";
+ seekerTypes[] = { "SACLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 16;
+ lineGainD = 10.44;
+
+ initialPitch = 2;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 30; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 5000; // Range from the missile which the seeker can visually search
+
+ correctionDistance = 30; // distance from center of crosshair where missile slows down
+ offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
+
+ // Attack profile type selection
+ defaultAttackProfile = "BEAM";
+ attackProfiles[] = {"BEAM"};
+};
+
+class GVAR(type_S400) {
+ enabled = 0;
+
+ pitchRate = 25; // Minium flap deflection for guidance
+ yawRate = 25; // Maximum flap deflection for guidance
+
+ canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "DopplerRadar";
+ seekerTypes[] = { "DopplerRadar" };
+ lockableTypes[] = {"Air"};
+
+ minimumSpeedFilter = 5; // filter out targets that have a closing velocity less than this
+ minimumTimeFilter = 0.000001; // filter out targets that are this close to the ground (speed of light)
+ maxTerrainCheck = 16000; // How far we should check for terrain
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "ZeroEffortMiss";
+ navigationTypes[] = { "ZeroEffortMiss" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 50; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 2500; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR"};
+};
+
+class GVAR(type_Shturm) {
+ enabled = 0;
+
+ pitchRate = 45; // Minium flap deflection for guidance
+ yawRate = 45; // Maximum flap deflection for guidance
+
+ canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ showTrail = 1;
+
+ // Guidance type for munitions
+ defaultSeekerType = "SACLOS";
+ seekerTypes[] = { "SACLOS" };
+
+ defaultSeekerLockMode = "LOAL";
+ seekerLockModes[] = { "LOAL", "LOBL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 16;
+ lineGainD = 10.44;
+
+ initialPitch = 2;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 30; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 4000; // Range from the missile which the seeker can visually search
+
+ offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
+
+ // Attack profile type selection
+ defaultAttackProfile = "BEAM";
+ attackProfiles[] = {"BEAM"};
+};
+
+class GVAR(type_Strela) {
+ enabled = 0;
+
+ pitchRate = 30; // Minium flap deflection for guidance
+ yawRate = 30; // Maximum flap deflection for guidance
+
+ canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "IR";
+ seekerTypes[] = { "IR" };
+
+ flareDistanceFilter = 100;
+ flareAngleFilter = 1.6; // can filter out flares that are >= flareAngleFilter to known target velocity
+
+ defaultSeekerLockMode = "LOBL";
+ seekerLockModes[] = { "LOBL" };
+
+ defaultNavigationType = "ProportionalNavigation";
+ navigationTypes[] = { "ProportionalNavigation" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 45; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 0.6; // seeker accuracy multiplier
+
+ seekerMinRange = 10;
+ seekerMaxRange = 3700; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR"};
+};
+
+class GVAR(type_Vikhr) {
+ enabled = 0;
+ showTrail = 1;
+
+ pitchRate = 60; // Minium flap deflection for guidance
+ yawRate = 60; // Maximum flap deflection for guidance
+
+ canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "SACLOS";
+ seekerTypes[] = { "SACLOS" };
+
+ defaultSeekerLockMode = "LOBL";
+ seekerLockModes[] = { "LOBL" };
+
+ defaultNavigationType = "Line";
+ navigationTypes[] = { "Line" };
+
+ lineGainP = 20;
+ lineGainD = 16;
+ correctionDistance = 5;
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 15; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 1; // seeker accuracy multiplier
+
+ seekerMinRange = 30;
+ seekerMaxRange = 12000; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "BEAM";
+ attackProfiles[] = {"BEAM"};
+};
+
+class GVAR(type_Vympel) {
+ enabled = 0;
+
+ pitchRate = 35; // Minium flap deflection for guidance
+ yawRate = 35; // Maximum flap deflection for guidance
+
+ canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
+
+ // Guidance type for munitions
+ defaultSeekerType = "IR";
+ seekerTypes[] = { "IR" };
+
+ flareDistanceFilter = 50;
+ flareAngleFilter = 0.8; // can filter out flares that are >= flareAngleFilter to known target velocity
+
+ defaultSeekerLockMode = "LOBL";
+ seekerLockModes[] = { "LOBL" };
+
+ defaultNavigationType = "AugmentedProportionalNavigation";
+ navigationTypes[] = { "AugmentedProportionalNavigation" };
+
+ seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
+ seekerAngle = 40; // Angle from the shooter's view that can track the missile
+ seekerAccuracy = 0.85; // seeker accuracy multiplier
+
+ seekerMinRange = 75;
+ seekerMaxRange = 5000; // Range from the missile which the seeker can visually search
+
+ // Attack profile type selection
+ defaultAttackProfile = "DIR";
+ attackProfiles[] = {"DIR"};
+};
\ No newline at end of file
diff --git a/addons/missileguidance/CfgWeapons.hpp b/addons/missileguidance/CfgWeapons.hpp
index b03628e7776..d88cf27b539 100644
--- a/addons/missileguidance/CfgWeapons.hpp
+++ b/addons/missileguidance/CfgWeapons.hpp
@@ -2,8 +2,13 @@ class CfgWeapons {
class missiles_DAGR;
class GVAR(dagr): missiles_DAGR {
+ EGVAR(laser,canSelect) = 1; // can ace_laser lock (allows switching laser code)
+ EGVAR(laser,showHud) = 1; // show attack profile / lock on hud
+ magazines[] = {"6Rnd_ACE_Hydra70_DAGR","12Rnd_ACE_Hydra70_DAGR","24Rnd_ACE_Hydra70_DAGR","PylonRack_6Rnd_ACE_DAGR","PylonRack_12Rnd_ACE_DAGR","PylonRack_24Rnd_ACE_DAGR"};
+
+ autoFire = 0;
canLock = 0;
- magazines[] = {"6Rnd_ACE_Hydra70_DAGR","12Rnd_ACE_Hydra70_DAGR","24Rnd_ACE_Hydra70_DAGR"};
+ weaponLockSystem = 0;
lockingTargetSound[] = {"",0,1};
lockedTargetSound[] = {"",0,1};
};
diff --git a/addons/missileguidance/XEH_PREP.hpp b/addons/missileguidance/XEH_PREP.hpp
index 075f2f03c59..daff5b502b5 100644
--- a/addons/missileguidance/XEH_PREP.hpp
+++ b/addons/missileguidance/XEH_PREP.hpp
@@ -6,6 +6,8 @@ PREP(changeMissileDirection);
PREP(checkSeekerAngle);
PREP(checkLos);
+PREP(dev_ProjectileCamera);
+
PREP(onFired);
PREP(onIncomingMissile);
@@ -16,28 +18,45 @@ PREP(doSeekerSearch);
PREP(doHandoff);
PREP(handleHandoff);
+//re-enable after feature merge - PREP(shouldFilterRadarHit);
+
// Attack Profiles
PREP(attackProfile_AIR);
PREP(attackProfile_DIR);
-PREP(attackProfile_HI);
PREP(attackProfile_LIN);
-PREP(attackProfile_MID);
+PREP(attackProfile_LOFT);
PREP(attackProfile_WIRE);
PREP(attackProfile_BEAM);
+//re-enable after feature merge - PREP(attackProfile_JDAM);
// Javelin profiles
PREP(attackProfile_JAV_DIR);
PREP(attackProfile_JAV_TOP);
+PREP(javelin_midCourseTransition);
+
+// Navigation Profiles
+PREP(navigationType_zeroEffortMiss);
+PREP(navigationType_augmentedProNav);
+PREP(navigationType_proNav);
+PREP(navigationType_lineOfSight);
+PREP(navigationType_line);
+PREP(navigationType_direct);
// Seeker search functions
PREP(seekerType_SALH);
PREP(seekerType_Optic);
PREP(seekerType_SACLOS);
-PREP(seekerType_ARH);
+//re-enable after feature merge - PREP(seekerType_Doppler);
+PREP(seekerType_MWR);
// Attack Profiles OnFired
PREP(wire_onFired);
// Seeker OnFired
PREP(SACLOS_onFired);
-PREP(ahr_onFired);
+PREP(mwr_onFired);
+
+// Navigation OnFired
+PREP(proNav_onFired);
+PREP(line_onFired);
+
diff --git a/addons/missileguidance/XEH_postInit.sqf b/addons/missileguidance/XEH_postInit.sqf
index eb0fb60abfa..e0fc98ba1ba 100644
--- a/addons/missileguidance/XEH_postInit.sqf
+++ b/addons/missileguidance/XEH_postInit.sqf
@@ -2,12 +2,10 @@
[QGVAR(handoff), LINKFUNC(handleHandoff)] call CBA_fnc_addEventHandler;
-["ACE3 Weapons", QGVAR(cycleFireMode), localize LSTRING(CycleFireMode),
-{
+["ACE3 Weapons", QGVAR(cycleFireMode), localize LSTRING(CycleFireMode), {
[] call FUNC(cycleAttackProfileKeyDown);
false
-},
-{
+}, {
false
},
[15, [false, true, false]], false] call CBA_fnc_addKeybind; //Ctrl+Tab Key
diff --git a/addons/missileguidance/XEH_preInit.sqf b/addons/missileguidance/XEH_preInit.sqf
index 0798fed2e43..9b1a85e37c7 100644
--- a/addons/missileguidance/XEH_preInit.sqf
+++ b/addons/missileguidance/XEH_preInit.sqf
@@ -11,4 +11,15 @@ PREP_RECOMPILE_END;
// As weapons take config changes, there is little point in being able to disable guidance
if (isNil QGVAR(enabled)) then { GVAR(enabled) = 2; };
+GVAR(debug_enableMissileCamera) = false;
+GVAR(debug_drawGuidanceInfo) = false;
+
+#ifdef DRAW_GUIDANCE_INFO
+GVAR(debug_drawGuidanceInfo) = true;
+#endif
+
+#ifdef ENABLE_PROJECTILE_CAMERA
+GVAR(debug_enableMissileCamera) = true;
+#endif
+
ADDON = true;
diff --git a/addons/missileguidance/config.cpp b/addons/missileguidance/config.cpp
index e98d99ebcbb..4e1f2e3e1f1 100644
--- a/addons/missileguidance/config.cpp
+++ b/addons/missileguidance/config.cpp
@@ -15,6 +15,8 @@ class CfgPatches {
#include "ACE_GuidanceConfig.hpp"
+#include "CfgMissileTypesNato.hpp"
+#include "CfgMissileTypesWarsaw.hpp"
#include "CfgEventhandlers.hpp"
#include "CfgAmmo.hpp"
#include "CfgMagazines.hpp"
diff --git a/addons/missileguidance/dev/getAmmoProperties.sqf b/addons/missileguidance/dev/getAmmoProperties.sqf
new file mode 100644
index 00000000000..9c416c228fd
--- /dev/null
+++ b/addons/missileguidance/dev/getAmmoProperties.sqf
@@ -0,0 +1,26 @@
+#include "..\script_component.hpp"
+
+private _configs = configProperties [configFile >> "CfgAmmo", QUOTE((isClass _x) && { isClass (_x >> QUOTE(QUOTE(ADDON)))})];
+
+private _seekerTypes = createHashMap;
+private _navigationTypes = createHashMap;
+private _attackProfiles = createHashMap;
+{
+ private _seekerType = getText (_x >> QUOTE(ADDON) >> "defaultSeekerType");
+ private _navigationType = getText (_x >> QUOTE(ADDON) >> "defaultNavigationType");
+ private _attackProfile = getText (_x >> QUOTE(ADDON) >> "defaultAttackProfile");
+
+ private _seekers = _seekerTypes getOrDefault [_seekerType, []];
+ private _navigations = _navigationTypes getOrDefault [_navigationType, []];
+ private _attacks = _attackProfiles getOrDefault [_attackProfile, []];
+
+ _seekers pushBack configName _x;
+ _navigations pushBack configName _x;
+ _attacks pushBack configName _x;
+
+ _seekerTypes set [_seekerType, _seekers];
+ _navigationTypes set [_navigationType, _navigations];
+ _attackProfiles set [_attackProfile, _attacks];
+} forEach _configs;
+
+[_seekerTypes, _navigationTypes, _attackProfiles]
diff --git a/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf b/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf
index 299ec6f236c..f48b4a95713 100644
--- a/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf
+++ b/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf
@@ -32,4 +32,3 @@ _seekerStateParams set [2, _animationSourceGun];
_seekerStateParams set [3, _usePilotCamera || { (_shooter isKindOf "Plane") && hasPilotCamera _shooter }];
if ((_shooter isKindOf "Plane") && !hasPilotCamera _shooter) then { WARNING("SACLOS fired from planes without pilot camera unsupported!"); };
-
diff --git a/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf b/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf
index 5aaff9d7f8d..fd86b571045 100644
--- a/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf
+++ b/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf
@@ -17,31 +17,26 @@
* Public: No
*/
params ["_seekerTargetPos", "_args", "_attackProfileStateParams"];
-_args params ["_firedEH"];
+_args params ["_firedEH", "", "", "", "", "_targetData"];
_firedEH params ["_shooter","","","","","","_projectile"];
-_attackProfileStateParams params["_maxCorrectableDistance", "_wireCut", "_randomVector", "_crosshairOffset", "_seekerMaxRangeSqr", "_seekerMinRangeSqr", "_wireCutSource", "_distanceAheadOfMissile"];
+_attackProfileStateParams params ["_maxCorrectableDistance", "_wireCut", "_lastInput", "_crosshairOffset", "_seekerMaxRangeSqr", "_seekerMinRangeSqr", "_wireCutSource", "_distanceAheadOfMissile"];
private _projectilePos = getPosASL _projectile;
private _shooterPos = getPosASL _shooter;
-private _shooterDir = vectorNormalized(_seekerTargetPos vectorDiff _shooterPos);
private _distanceToProjectile = _shooterPos vectorDistanceSqr _projectilePos;
-if (_distanceToProjectile > _seekerMaxRangeSqr || { _seekerTargetPos isEqualTo [0, 0, 0] } || { _distanceToProjectile < _seekerMinRangeSqr }) exitWith {
- // return position 50m infront of projectile
- _projectilePos vectorAdd (_projectile vectorModelToWorld [0, 50, 0])
+if ((_distanceToProjectile > _seekerMaxRangeSqr) || { _wireCut }) exitWith {
+ // wire snap, random direction
+ if !(_wireCut) then {
+ _attackProfileStateParams set [1, true];
+ };
+ _lastInput
};
-private _relativeCorrection = _projectile vectorWorldToModel (_projectilePos vectorDiff _seekerTargetPos);
-_relativeCorrection = _relativeCorrection vectorDiff _crosshairOffset;
+private _final = _seekerTargetPos vectorAdd _crosshairOffset;
+_attackProfileStateParams set [2, _final];
-private _magnitude = vectorMagnitude [_relativeCorrection select 0, 0, _relativeCorrection select 2];
-private _fovImpulse = 1 min (_magnitude / _maxCorrectableDistance); // the simulated impulse for the missile being close to the center of the crosshair
+_targetData set [0, _projectilePos vectorFromTo _final];
-// Adjust the impulse due to near-zero values creating wobbly missiles?
-private _correction = _fovImpulse;
-
-
-_relativeCorrection = (vectorNormalized _relativeCorrection) vectorMultiply _correction;
-private _returnPos = _projectilePos vectorDiff (_projectile vectorModelToWorld _relativeCorrection);
-_returnPos vectorAdd (_shooterDir vectorMultiply _distanceAheadOfMissile)
+_final
diff --git a/addons/missileguidance/functions/fnc_attackProfile_DIR.sqf b/addons/missileguidance/functions/fnc_attackProfile_DIR.sqf
index 80499a85da8..d2a2c0616c9 100644
--- a/addons/missileguidance/functions/fnc_attackProfile_DIR.sqf
+++ b/addons/missileguidance/functions/fnc_attackProfile_DIR.sqf
@@ -1,8 +1,8 @@
#include "..\script_component.hpp"
/*
- * Author: jaynus / nou
+ * Author: tcvm
* Attack profile: DIR
- * TODO: falls back to Linear
+ * Returns target position with no modifications
*
* Arguments:
* 0: Seeker Target PosASL
@@ -18,4 +18,5 @@
* Public: No
*/
-_this call FUNC(attackProfile_LIN);
+params ["_seekerTargetPos"];
+_seekerTargetPos
diff --git a/addons/missileguidance/functions/fnc_attackProfile_HI.sqf b/addons/missileguidance/functions/fnc_attackProfile_HI.sqf
deleted file mode 100644
index 92413f59d07..00000000000
--- a/addons/missileguidance/functions/fnc_attackProfile_HI.sqf
+++ /dev/null
@@ -1,21 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: jaynus / nou
- * Attack profile: HI
- * TODO: falls back to Linear
- *
- * Arguments:
- * 0: Seeker Target PosASL
- * 1: Guidance Arg Array
- * 2: Attack Profile State
- *
- * Return Value:
- * Missile Aim PosASL
- *
- * Example:
- * [[1,2,3], [], []] call ace_missileguidance_fnc_attackProfile_HI;
- *
- * Public: No
- */
-
-_this call FUNC(attackProfile_LIN);
diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf
index b690ab2075e..64895a3e54a 100644
--- a/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf
+++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf
@@ -22,6 +22,9 @@
#define STAGE_COAST 3
#define STAGE_TERMINAL 4
+#define CLIMB_ANGLE 12
+#define ATTACK_ANGLE 2
+
params ["_seekerTargetPos", "_args", "_attackProfileStateParams"];
_args params ["_firedEH"];
_firedEH params ["_shooter","","","","","","_projectile"];
@@ -30,6 +33,7 @@ if (_seekerTargetPos isEqualTo [0,0,0]) exitWith {_seekerTargetPos};
if (_attackProfileStateParams isEqualTo []) then {
_attackProfileStateParams set [0, STAGE_LAUNCH];
+ _attackProfileStateParams set [1, 0];
};
private _shooterPos = getPosASL _shooter;
@@ -44,23 +48,28 @@ TRACE_2("",_distanceToTarget,_distanceToShooter);
// Add height depending on distance for compensate
private _returnTargetPos = _seekerTargetPos;
+private _attackDirection = _seekerTargetPos vectorDiff _projectilePos;
+private _horizon = velocity _projectile;
+_horizon set [2, 0];
+_horizon = vectorNormalized _horizon;
+private _attackAngle = acos (_horizon vectorCos _attackDirection);
+
switch (_attackProfileStateParams select 0) do {
case STAGE_LAUNCH: {
TRACE_1("STAGE_LAUNCH","");
- if (_distanceToShooter < 10) then {
- _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget*2];
+ if (_distanceToShooter < 6) then {
+ _returnTargetPos = _seekerTargetPos vectorAdd [0,0,5];
} else {
_attackProfileStateParams set [0, STAGE_CLIMB];
};
};
case STAGE_CLIMB: {
TRACE_1("STAGE_CLIMB","");
- private _cruisAlt = 60 * (_distanceShooterToTarget/2000);
-
- if ( ((ASLToAGL _projectilePos) select 2) - ((ASLToAGL _seekerTargetPos) select 2) >= _cruisAlt) then {
+ if (_attackAngle >= ATTACK_ANGLE) then {
_attackProfileStateParams set [0, STAGE_TERMINAL];
} else {
- _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget*1.5];
+ private _height = _distanceShooterToTarget * tan CLIMB_ANGLE;
+ _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_height];
};
};
case STAGE_TERMINAL: {
@@ -69,5 +78,7 @@ switch (_attackProfileStateParams select 0) do {
};
};
+_attackProfileStateParams set [2, _returnTargetPos];
+
TRACE_1("Adjusted target position",_returnTargetPos);
_returnTargetPos;
diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf
index f1f360e403a..a3ae233eba0 100644
--- a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf
+++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf
@@ -22,6 +22,10 @@
#define STAGE_COAST 3
#define STAGE_TERMINAL 4
+#define CRUISE_ALT 160
+#define CLIMB_ANGLE 22
+#define ATTACK_ANGLE 12
+
params ["_seekerTargetPos", "_args", "_attackProfileStateParams"];
_args params ["_firedEH"];
_firedEH params ["_shooter","","","","","","_projectile"];
@@ -30,6 +34,7 @@ if (_seekerTargetPos isEqualTo [0,0,0]) exitWith {_seekerTargetPos};
if (_attackProfileStateParams isEqualTo []) then {
_attackProfileStateParams set [0, STAGE_LAUNCH];
+ _attackProfileStateParams set [1, 0];
};
private _shooterPos = getPosASL _shooter;
@@ -44,39 +49,44 @@ TRACE_2("",_distanceToTarget,_distanceToShooter);
// Add height depending on distance for compensate
private _returnTargetPos = _seekerTargetPos;
+private _attackDirection = _seekerTargetPos vectorDiff _projectilePos;
+private _horizon = velocity _projectile;
+_horizon set [2, 0];
+_horizon = vectorNormalized _horizon;
+private _attackAngle = acos (_horizon vectorCos _attackDirection);
+
switch( (_attackProfileStateParams select 0) ) do {
case STAGE_LAUNCH: {
TRACE_1("STAGE_LAUNCH","");
if (_distanceToShooter < 10) then {
- _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget*2];
+ _returnTargetPos = _seekerTargetPos vectorAdd [0,0,5];
} else {
_attackProfileStateParams set [0, STAGE_CLIMB];
};
};
case STAGE_CLIMB: {
TRACE_1("STAGE_CLIMB","");
- private _cruisAlt = 140;
- if (_distanceShooterToTarget < 1250) then {
- _cruisAlt = 140 * (_distanceShooterToTarget/1250);
- TRACE_1("_cruisAlt",_cruisAlt);
- };
- if ( ((ASLToAGL _projectilePos) select 2) - ((ASLToAGL _seekerTargetPos) select 2) >= _cruisAlt) then {
- if (_cruisAlt < 140) then {
- _attackProfileStateParams set [0, STAGE_TERMINAL];
- } else {
+ private _altitude = (ASLToAGL _projectilePos) select 2;
+ switch (true) do {
+ case (_altitude >= CRUISE_ALT): {
_attackProfileStateParams set [0, STAGE_COAST];
};
- } else {
- _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget*1.5];
- };
+ case (_attackAngle >= ATTACK_ANGLE): {
+ _attackProfileStateParams set [0, STAGE_TERMINAL];
+ };
+ default {
+ private _height = _distanceShooterToTarget * tan CLIMB_ANGLE;
+ _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_height];
+ }
+ }
};
case STAGE_COAST: {
TRACE_1("STAGE_COAST","");
- TRACE_1("",((ASLToAGL _projectilePos) select 2) - (( ASLToAGL _seekerTargetPos) select 2));
- if (_distanceToTarget < ( ((ASLToAGL _projectilePos) select 2) - (( ASLToAGL _seekerTargetPos) select 2) ) * 2) then {
+ TRACE_1("",_attackAngle);
+ if (_attackAngle >= ATTACK_ANGLE) then {
_attackProfileStateParams set [0, STAGE_TERMINAL];
} else {
- _returnTargetPos = _seekerTargetPos vectorAdd [0,0,(_projectilePos select 2)];
+ _returnTargetPos = _seekerTargetPos vectorAdd [0,0,(_projectilePos select 2) min CRUISE_ALT];
};
};
case STAGE_TERMINAL: {
@@ -86,5 +96,7 @@ switch( (_attackProfileStateParams select 0) ) do {
};
};
+_attackProfileStateParams set [2, _returnTargetPos];
+
TRACE_1("Adjusted target position",_returnTargetPos);
_returnTargetPos;
diff --git a/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf b/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf
index e346b16eb66..cc823b1e8c3 100644
--- a/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf
+++ b/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf
@@ -18,8 +18,10 @@
*/
params ["_seekerTargetPos", "_args"];
-_args params ["_firedEH"];
+_args params ["_firedEH", "_launchParams"];
_firedEH params ["_shooter","","","","","","_projectile"];
+_launchParams params ["","_targetLaunchParams"];
+_targetLaunchParams params ["", "", "_launchPos"];
if (_seekerTargetPos isEqualTo [0,0,0]) exitWith {_seekerTargetPos};
@@ -30,29 +32,31 @@ private _distanceToTarget = _projectilePos vectorDistance _seekerTargetPos;
private _distanceToShooter = _projectilePos vectorDistance _shooterPos;
private _distanceShooterToTarget = _shooterPos vectorDistance _seekerTargetPos;
+private _ttgo = _distanceToTarget / (vectorMagnitude velocity _projectile);
+
TRACE_2("",_distanceToTarget,_distanceToShooter);
// Add height depending on distance for compensate
private _addHeight = [0,0,0];
-// Always climb an arc on initial launch if we are close to the round
-if ((((ASLtoAGL _projectilePos) select 2) < 5) && {_distanceToShooter < 15}) then {
- _addHeight = _addHeight vectorAdd [0,0,_distanceToTarget];
- TRACE_1("climb - near shooter",_addHeight);
+private _2dDistance = (800 + (_projectilePos distance2D _launchPos)) / (_projectilePos distance2D _seekerTargetPos);
+
+if (_2dDistance <= 1) then {
+ _addHeight = [0, 0, (_projectilePos#2) + 8];
} else {
- // If we are below the target, increase the climbing arc
- if (((_projectilePos select 2) < (_seekerTargetPos select 2)) && {_distanceToTarget > 100}) then {
- _addHeight = _addHeight vectorAdd [0,0, ((_seekerTargetPos select 2) - (_projectilePos select 2))];
- TRACE_1("climb - below target and far",_addHeight);
+ // Always climb an arc on initial launch if we are close to the round
+ if ((((ASLToAGL _projectilePos) select 2) < 5) && {_distanceToShooter < 15}) then {
+ _addHeight = _addHeight vectorAdd [0,0,_distanceToTarget];
+ TRACE_1("climb - near shooter",_addHeight);
+ } else {
+ // If we are below the target, increase the climbing arc
+ if (((_projectilePos select 2) < (_seekerTargetPos select 2)) && {_distanceToTarget > 100}) then {
+ _addHeight = _addHeight vectorAdd [0,0, ((_seekerTargetPos select 2) - (_projectilePos select 2))];
+ TRACE_1("climb - below target and far",_addHeight);
+ };
};
};
-// Projectile above target
-if ((_projectilePos select 2) > (_seekerTargetPos select 2)) then {
- TRACE_1("above - far",_addHeight);
- _addHeight = _addHeight vectorAdd [0,0, _distanceToTarget / 50];
-};
-
private _returnTargetPos = _seekerTargetPos vectorAdd _addHeight;
TRACE_2("Adjusted target position",_returnTargetPos,_addHeight);
diff --git a/addons/missileguidance/functions/fnc_attackProfile_LOFT.sqf b/addons/missileguidance/functions/fnc_attackProfile_LOFT.sqf
new file mode 100644
index 00000000000..934ac04123a
--- /dev/null
+++ b/addons/missileguidance/functions/fnc_attackProfile_LOFT.sqf
@@ -0,0 +1,53 @@
+#include "..\script_component.hpp"
+/*
+ * Author: jaynus / nou
+ * Attack profile: AIR
+ * TODO: falls back to Linear
+ *
+ * Arguments:
+ * 0: Seeker Target PosASL
+ * 1: Guidance Arg Array
+ * 2: Seeker State
+ *
+ * Return Value:
+ * Missile Aim PosASL
+ *
+ * Example:
+ * [[1,2,3], [], []] call ace_missileguidance_fnc_attackProfile_AIR;
+ *
+ * Public: No
+ */
+
+params ["_seekerTargetPos", "_args"];
+_args params ["_firedEH", "_launchParams", "_flightParams", "_seekerParams", "_stateParams"];
+_firedEH params ["_shooter","","","","_ammo","","_projectile"];
+_launchParams params ["_shooter","_targetLaunchParams","_seekerType","_attackProfile","_lockMode","_laserInfo","_navigationType"];
+_targetLaunchParams params ["_target", "_targetPos", "_launchPos", "_launchDir", "_launchTime"];
+_flightParams params ["_pitchRate", "_yawRate", "_isBangBangGuidance"];
+_stateParams params ["_lastRunTime", "_seekerStateParams", "_attackProfileStateParams", "_lastKnownPosState","_navigationParams"];
+_seekerParams params ["_seekerAngle", "_seekerAccuracy", "_seekerMaxRange", "_seekerMinRange"];
+
+if (_seekerTargetPos isEqualTo [0, 0, 0]) exitWith {
+ _seekerTargetPos
+};
+
+private _projectilePos = getPosASLVisual _projectile;
+private _distanceToTarget2d = _projectilePos distance2D _seekerTargetPos;
+
+private _closingRate = vectorMagnitude velocity _projectile;
+private _timeToGo = (_projectilePos distance _seekerTargetPos) / _closingRate;
+
+// we could do stuff like desired attack angle, but I'm not going that far today
+private _los = vectorNormalized (_seekerTargetPos vectorDiff _projectilePos);
+
+private _angleToTarget = acos ((vectorDir _projectile) vectorCos _los);
+private _atMinRotationAngle = _angleToTarget >= (0.5 * _pitchRate * _timeToGo);
+
+private _returnTargetPos = _seekerTargetPos;
+
+if (!_atMinRotationAngle && _distanceToTarget2d >= 500 && _timeToGo >= 10) then {
+ // 10 degree pitch up
+ _returnTargetPos = _seekerTargetPos vectorAdd [0, 0, (_projectilePos distance _seekerTargetPos) * sin 10];
+};
+
+_returnTargetPos
diff --git a/addons/missileguidance/functions/fnc_attackProfile_MID.sqf b/addons/missileguidance/functions/fnc_attackProfile_MID.sqf
deleted file mode 100644
index 2ca9eef77f3..00000000000
--- a/addons/missileguidance/functions/fnc_attackProfile_MID.sqf
+++ /dev/null
@@ -1,21 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: jaynus / nou
- * Attack profile: MID
- * TODO: falls back to Linear
- *
- * Arguments:
- * 0: Seeker Target PosASL
- * 1: Guidance Arg Array
- * 2: Attack Profile State
- *
- * Return Value:
- * Missile Aim PosASL
- *
- * Example:
- * [[1,2,3], [], []] call ace_missileguidance_fnc_attackProfile_MID;
- *
- * Public: No
- */
-
-_this call FUNC(attackProfile_LIN);
diff --git a/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf b/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf
index 443fe1bb975..1733ad10153 100644
--- a/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf
+++ b/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf
@@ -17,47 +17,27 @@
* Public: No
*/
params ["_seekerTargetPos", "_args", "_attackProfileStateParams"];
-_args params ["_firedEH"];
+_args params ["_firedEH", "", "", "", "", "_targetData"];
_firedEH params ["_shooter","","","","","","_projectile"];
-_attackProfileStateParams params["_maxCorrectableDistance", "_wireCut", "_randomVector", "_crosshairOffset", "_seekerMaxRangeSqr", "_seekerMinRangeSqr", "_wireCutSource", "_distanceAheadOfMissile"];
+_attackProfileStateParams params ["_maxCorrectableDistance", "_wireCut", "_lastInput", "_crosshairOffset", "_seekerMaxRangeSqr", "_seekerMinRangeSqr", "_wireCutSource", "_distanceAheadOfMissile"];
private _projectilePos = getPosASL _projectile;
private _shooterPos = getPosASL _shooter;
-private _shooterDir = vectorNormalized(_seekerTargetPos vectorDiff _shooterPos);
private _distanceToProjectile = _shooterPos vectorDistanceSqr _projectilePos;
if ((_distanceToProjectile > _seekerMaxRangeSqr) || { _wireCut }) exitWith {
// wire snap, random direction
- if (_randomVector isEqualTo [0, 0, 0]) then {
- _randomVector = RANDOM_VECTOR_3D vectorMultiply 300;
+ if !(_wireCut) then {
_attackProfileStateParams set [1, true];
- _attackProfileStateParams set [2, _randomVector];
-
- playSound3D ["a3\sounds_f\air\sfx\SL_rope_break.wss", objNull, false, AGLtoASL (_shooter modelToWorld _wireCutSource), 5, 1, 150];
+ playSound3D ["a3\sounds_f\air\sfx\SL_rope_break.wss", objNull, false, AGLToASL (_shooter modelToWorld _wireCutSource), 5, 1, 150];
};
- _projectilePos vectorAdd _randomVector
-};
-
-if (_seekerTargetPos isEqualTo [0, 0, 0] || { _distanceToProjectile < _seekerMinRangeSqr }) exitWith {
- // cut wire if its caught on terrain
- /*if (lineIntersectsSurfaces [getPosASL _shooter, _projectilePos, _shooter] isNotEqualTo []) then {
- _attackProfileStateParams set [1, true];
- };*/
- // return position 50m infront of projectile
- _projectilePos vectorAdd (_projectile vectorModelToWorld [0, 50, 0])
+ _lastInput
};
-private _relativeCorrection = _projectile vectorWorldToModel (_projectilePos vectorDiff _seekerTargetPos);
-_relativeCorrection = _relativeCorrection vectorDiff _crosshairOffset;
-
-private _magnitude = vectorMagnitude [_relativeCorrection select 0, 0, _relativeCorrection select 2];
-private _fovImpulse = 1 min (_magnitude / _maxCorrectableDistance); // the simulated impulse for the missile being close to the center of the crosshair
-
-// Adjust the impulse due to near-zero values creating wobbly missiles?
-private _correction = _fovImpulse;
+private _final = _seekerTargetPos vectorAdd _crosshairOffset;
+_attackProfileStateParams set [2, _final];
+_targetData set [0, _projectilePos vectorFromTo _final];
-_relativeCorrection = (vectorNormalized _relativeCorrection) vectorMultiply _correction;
-private _returnPos = _projectilePos vectorDiff (_projectile vectorModelToWorld _relativeCorrection);
-_returnPos vectorAdd (_shooterDir vectorMultiply _distanceAheadOfMissile)
+_final
diff --git a/addons/missileguidance/functions/fnc_changeMissileDirection.sqf b/addons/missileguidance/functions/fnc_changeMissileDirection.sqf
index 21884c16938..77858401ba8 100644
--- a/addons/missileguidance/functions/fnc_changeMissileDirection.sqf
+++ b/addons/missileguidance/functions/fnc_changeMissileDirection.sqf
@@ -2,6 +2,7 @@
/*
* Author: jaynus / nou
* Change a projectile's direction, maintaing speed
+ * No longer used in guidancePFH, kept for backwards compatibility
*
* Arguments:
* 0: Projectile
@@ -16,10 +17,9 @@
* Public: No
*/
-params ["_projectile", "_v"];
+params ["_projectile", "_pitch", "_yaw", "_roll"];
-private _l = sqrt ((_v select 0) ^ 2 + (_v select 1) ^ 2);
-private _r = -(_v select 2) / _l;
+private _dir = [sin _yaw * cos _pitch, cos _yaw * cos _pitch, sin _pitch];
+private _up = [[sin _roll, -sin _pitch, cos _roll * cos _pitch], -_yaw] call BIS_fnc_rotateVector2D;
-_projectile setVectorDirAndUp [ _v, [(_v select 0) * _r,(_v select 1) * _r, _l] ];
-_projectile setVelocity (_v vectorMultiply (vectorMagnitude (velocity _projectile)));
+_projectile setVectorDirAndUp [_dir, _up];
diff --git a/addons/missileguidance/functions/fnc_checkLos.sqf b/addons/missileguidance/functions/fnc_checkLos.sqf
index 1fadc5510e8..152c7c24074 100644
--- a/addons/missileguidance/functions/fnc_checkLos.sqf
+++ b/addons/missileguidance/functions/fnc_checkLos.sqf
@@ -25,7 +25,7 @@ if (_checkVisibilityTest) exitWith {
_visibility > 0.001
};
if ((isNil "_seeker") || {isNil "_target"}) exitWith {
- ERROR_2("nil",_seeker,_target);
+ ERROR_2("nil [%1]->[%2]",_seeker,_target);
false
};
@@ -34,13 +34,12 @@ private _targetAimPos = aimPos _target;
private _seekerPos = getPosASL _seeker;
private _return = true;
-if (!((terrainIntersectASL [_seekerPos, _targetPos]) && {terrainIntersectASL [_seekerPos, _targetAimPos]})) then {
+if ((terrainIntersectASL [_seekerPos, _targetPos]) && {terrainIntersectASL [_seekerPos, _targetAimPos]}) then {
+ _return = false;
+} else {
if (lineIntersects [_seekerPos, _targetPos, _seeker, _target]) then {
_return = false;
};
-} else {
- _return = false;
};
_return
-
diff --git a/addons/missileguidance/functions/fnc_cycleAttackProfileKeyDown.sqf b/addons/missileguidance/functions/fnc_cycleAttackProfileKeyDown.sqf
index 2263716724a..f8494e474c5 100644
--- a/addons/missileguidance/functions/fnc_cycleAttackProfileKeyDown.sqf
+++ b/addons/missileguidance/functions/fnc_cycleAttackProfileKeyDown.sqf
@@ -76,7 +76,7 @@ private _nextFireMode = _attackProfiles select _index;
TRACE_4("",_currentFireMode,_nextFireMode,_index,_attackProfiles);
-private _currentFireMode = if (_useModeForAttackProfile) then {
+if (_useModeForAttackProfile) then {
TRACE_2("setting fire mode",_weaponStateToken,_nextFireMode);
{
_x params ["_xIndex", "", "_xWeapon", "", "_xMode"];
diff --git a/addons/missileguidance/functions/fnc_dev_ProjectileCamera.sqf b/addons/missileguidance/functions/fnc_dev_ProjectileCamera.sqf
new file mode 100644
index 00000000000..bf3a5af67c5
--- /dev/null
+++ b/addons/missileguidance/functions/fnc_dev_ProjectileCamera.sqf
@@ -0,0 +1,61 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * tracks a projectile until it explodes
+ *
+ * Arguments:
+ * None
+ *
+ * Return Value:
+ * None
+ *
+ * Public: No
+ */
+params ["_projectile"];
+
+private _camera = "camera" camCreate getPosATL _projectile;
+_camera camPrepareFov 0.7;
+_camera cameraEffect ["internal", "back"];
+
+_camera camCommitPrepared 0;
+
+GVAR(debug_camera_close) = false;
+private _displayEH = (findDisplay 46) displayAddEventHandler ["KeyDown", {
+ params ["_displayorcontrol", "_key", "_shift", "_ctrl", "_alt"];
+ GVAR(debug_camera_close) = (_key == 1);
+ true
+}];
+
+[{
+ params ["_args", "_pfh"];
+ _args params ["_projectile", "_camera", "_projectilePos", "_displayEH"];
+ if (!alive _projectile || GVAR(debug_camera_close)) exitWith {
+ private _delay = 1.5;
+ if (GVAR(debug_camera_close)) then {
+ _delay = 0;
+ };
+
+ (findDisplay 46) displayRemoveEventHandler ["KeyDown", _displayEH];
+
+ [{
+ params ["_camera"];
+
+ _camera cameraEffect ["terminate", "back"];
+ _camera camCommitPrepared 0;
+ camDestroy _camera;
+ }, [_camera], _delay] call CBA_fnc_waitAndExecute;
+
+ _camera camPrepareTarget _projectilePos;
+ _camera camCommitPrepared 0;
+
+ [_pfh] call CBA_fnc_removePerFrameHandler;
+ };
+
+ private _currentProjectilePos = getPosATLVisual _projectile;
+
+ _camera camPrepareTarget _projectile;
+ _camera camPrepareRelPos [0, -5, 1];
+ _camera camCommitPrepared 0;
+
+ _args set [2, getPosATL _projectile];
+}, 0, [_projectile, _camera, getPosATL _projectile, _displayEH]] call CBA_fnc_addPerFrameHandler;
diff --git a/addons/missileguidance/functions/fnc_doAttackProfile.sqf b/addons/missileguidance/functions/fnc_doAttackProfile.sqf
index cafbadf69c6..e33d2bfd9be 100644
--- a/addons/missileguidance/functions/fnc_doAttackProfile.sqf
+++ b/addons/missileguidance/functions/fnc_doAttackProfile.sqf
@@ -22,18 +22,17 @@ _args params ["", "_launchParams"];
_launchParams params ["", "", "", "_attackProfileName"];
private _attackProfileFunction = getText (configFile >> QGVAR(AttackProfiles) >> _attackProfileName >> "functionName");
-
private _attackProfilePos = _this call (missionNamespace getVariable _attackProfileFunction);
if ((isNil "_attackProfilePos") || {_attackProfilePos isEqualTo [0,0,0]}) exitWith {
- ERROR_1("attack profile returned bad pos",_attackProfilePos);
+ ERROR_2("attack profile [%1] returned bad pos %2",_attackProfileName,_attackProfilePos);
[0,0,0]
};
-#ifdef DRAW_GUIDANCE_INFO
-drawLine3D [(ASLtoAGL _attackProfilePos), (ASLtoAGL _seekerTargetPos), [0,1,1,1]];
-drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [0,0,1,1], ASLtoAGL _attackProfilePos, 0.5, 0.5, 0, _attackProfileName, 1, 0.025, "TahomaB"];
-#endif
+if (GVAR(debug_drawGuidanceInfo)) then {
+ drawLine3D [(ASLToAGL _attackProfilePos), (ASLToAGL _seekerTargetPos), [0,1,1,1]];
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [0,0,1,1], ASLToAGL _attackProfilePos, 0.5, 0.5, 0, _attackProfileName, 1, 0.025, "TahomaB"];
+};
TRACE_2("return",_attackProfilePos,_attackProfileName);
_attackProfilePos;
diff --git a/addons/missileguidance/functions/fnc_doSeekerSearch.sqf b/addons/missileguidance/functions/fnc_doSeekerSearch.sqf
index 6008725b4c0..fe915d1bb4f 100644
--- a/addons/missileguidance/functions/fnc_doSeekerSearch.sqf
+++ b/addons/missileguidance/functions/fnc_doSeekerSearch.sqf
@@ -30,9 +30,9 @@ if ((isNil "_seekerTargetPos") || {_seekerTargetPos isEqualTo [0,0,0]}) then { /
if (_seekLastTargetPos && {_lastKnownPos isNotEqualTo [0,0,0]}) then { // if enabled for the ammo, use last known position if we have one stored
TRACE_2("seeker returned bad pos - using last known",_seekLastTargetPos,_lastKnownPos);
_seekerTargetPos = _lastKnownPos;
- #ifdef DRAW_GUIDANCE_INFO
- drawIcon3D ["\A3\ui_f\data\map\markers\military\unknown_CA.paa", [1,1,0,1], ASLtoAGL _lastKnownPos, 0.25, 0.25, 0, "LastKnownPos", 1, 0.02, "TahomaB"];
- #endif
+ if (GVAR(debug_drawGuidanceInfo)) then {
+ drawIcon3D ["\A3\ui_f\data\map\markers\military\unknown_CA.paa", [1,1,0,1], ASLToAGL _lastKnownPos, 0.25, 0.25, 0, "LastKnownPos", 1, 0.02, "TahomaB"];
+ };
} else {
TRACE_1("seeker returned no pos",_seekerTargetPos);
_seekerTargetPos = [0,0,0];
@@ -44,9 +44,9 @@ if ((isNil "_seekerTargetPos") || {_seekerTargetPos isEqualTo [0,0,0]}) then { /
};
};
-#ifdef DRAW_GUIDANCE_INFO
-drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [0,1,0,1], ASLtoAGL _seekerTargetPos, 0.5, 0.5, 0, _seekerTypeName, 1, 0.025, "TahomaB"];
-#endif
+if (GVAR(debug_drawGuidanceInfo)) then {
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [0,1,0,1], ASLToAGL _seekerTargetPos, 0.5, 0.5, 0, _seekerTypeName, 1, 0.025, "TahomaB"];
+};
TRACE_2("return",_seekerTargetPos,_seekerTypeName);
_seekerTargetPos;
diff --git a/addons/missileguidance/functions/fnc_guidancePFH.sqf b/addons/missileguidance/functions/fnc_guidancePFH.sqf
index 0620e9e3c03..8b8df3d5114 100644
--- a/addons/missileguidance/functions/fnc_guidancePFH.sqf
+++ b/addons/missileguidance/functions/fnc_guidancePFH.sqf
@@ -15,100 +15,192 @@
*
* Public: No
*/
+#define TRAIL_COLOUR(multiplier) [1 * multiplier, 1 * multiplier, 0.3 * multiplier, 0.7 * multiplier]
BEGIN_COUNTER(guidancePFH);
-#define TIMESTEP_FACTOR 0.01
-
params ["_args", "_pfID"];
-_args params ["_firedEH", "_launchParams", "_flightParams", "_seekerParams", "_stateParams"];
+_args params ["_firedEH", "_launchParams", "_flightParams", "_seekerParams", "_stateParams", "_targetData", "_navigationStateParams"];
_firedEH params ["_shooter","","","","_ammo","","_projectile"];
-_launchParams params ["","_targetLaunchParams"];
-_stateParams params ["_lastRunTime", "_seekerStateParams", "_attackProfileStateParams", "_lastKnownPosState"];
+_launchParams params ["","_targetLaunchParams","","","","","_navigationType"];
+_stateParams params ["_lastRunTime", "_seekerStateParams", "_attackProfileStateParams", "_lastKnownPosState", "_navigationParameters", "_guidanceParameters"];
+_navigationStateParams params ["_currentState", "_navigationStateData"];
+_flightParams params ["_pitchRate", "_yawRate", "_isBangBangGuidance", "_stabilityCoefficient", "_showTrail"];
if (!alive _projectile || isNull _projectile || isNull _shooter) exitWith {
[_pfID] call CBA_fnc_removePerFrameHandler;
END_COUNTER(guidancePFH);
};
-private _runtimeDelta = diag_tickTime - _lastRunTime;
-private _adjustTime = 1;
-
-if (accTime > 0) then {
- _adjustTime = 1/accTime;
- _adjustTime = _adjustTime * (_runtimeDelta / TIMESTEP_FACTOR);
- TRACE_4("Adjust timing",1/accTime,_adjustTime,_runtimeDelta,(_runtimeDelta / TIMESTEP_FACTOR));
-} else {
- _adjustTime = 0;
+if (_showTrail) then {
+ drop ["\a3\data_f\kouleSvetlo", "", "Billboard", 100, 0.03, _projectile modelToWorld [0, 0, 0],
+ [0, 0, 0], 0, 1.25, 1, 0.05, [0.5], [TRAIL_COLOUR(1)], [0], 0, 0, "", "", "", 0, false, -1, [TRAIL_COLOUR(10000)]];
};
-private _minDeflection = ((_flightParams select 0) - ((_flightParams select 0) * _adjustTime)) max 0;
-private _maxDeflection = (_flightParams select 1) * _adjustTime;
-// private _incDeflection = _flightParams select 2; // todo
-
-private _projectilePos = getPosASL _projectile;
+private _timestep = diag_deltaTime * accTime;
// Run seeker function:
-private _seekerTargetPos = [[0,0,0], _args, _seekerStateParams, _lastKnownPosState] call FUNC(doSeekerSearch);
-
+private _seekerTargetPos = [[0,0,0], _args, _seekerStateParams, _lastKnownPosState, _timestep] call FUNC(doSeekerSearch);
// Run attack profile function:
-private _profileAdjustedTargetPos = [_seekerTargetPos, _args, _attackProfileStateParams] call FUNC(doAttackProfile);
+_seekerTargetPos = AGLToASL ASLToAGL _seekerTargetPos;
+private _profileAdjustedTargetPos = [_seekerTargetPos, _args, _attackProfileStateParams, _timestep] call FUNC(doAttackProfile);
+
+private _projectilePos = getPosASLVisual _projectile;
+_targetData set [1, _projectilePos vectorFromTo _profileAdjustedTargetPos];
// If we have no seeker target, then do not change anything
// If there is no deflection on the missile, this cannot change and therefore is redundant. Avoid calculations for missiles without any deflection
-if ((_minDeflection != 0 || {_maxDeflection != 0}) && {_profileAdjustedTargetPos isNotEqualTo [0,0,0]}) then {
+if ((_pitchRate != 0 || {_yawRate != 0})) then {
+ private _navigationFunction = getText (configFile >> QGVAR(NavigationTypes) >> _navigationType >> "functionName");
+ if (_navigationStateData isNotEqualTo []) then {
+ (_navigationStateData select _currentState) params ["_transitionCondition"];
+ private _transition = ([_args, _timestep] call (missionNamespace getVariable [_transitionCondition, { false }]));
+ if (_transition) then {
+ _currentState = _currentState + 1;
+ _navigationStateParams set [0, _currentState];
+ };
- private _targetVector = _projectilePos vectorFromTo _profileAdjustedTargetPos;
- private _adjustVector = _targetVector vectorDiff (vectorDir _projectile);
- _adjustVector params ["_adjustVectorX", "_adjustVectorY", "_adjustVectorZ"];
+ _navigationType = (_navigationStateData select _currentState) select 1;
+ _navigationFunction = getText (configFile >> QGVAR(NavigationTypes) >> _navigationType >> "functionName");
- private _yaw = 0;
- private _pitch = 0;
- private _roll = 0;
+ _navigationParameters = (_navigationStateData select _currentState) select 2;
+ _stateParams set [4, _navigationParameters];
+ };
+ private _commandedAcceleration = [_args, _timestep, _seekerTargetPos, _profileAdjustedTargetPos, _targetData, _navigationParameters] call (missionNamespace getVariable _navigationFunction);
+
+ if (isNil "_commandedAcceleration") exitWith {
+ systemChat format ["Error in %1 Missile Type %2 Seeker Pos %3", _navigationFunction, typeOf _projectile, _seekerTargetPos];
+ ERROR_MSG_3("_commandedAcceleration is nil! Guidance cancelled [%1 %2 %3]",_navigationFunction,typeOf _projectile,_seekerTargetPos);
+ };
- if (_adjustVectorX < 0) then {
- _yaw = - ( (_minDeflection max ((abs _adjustVectorX) min _maxDeflection) ) );
- } else {
- if (_adjustVectorX > 0) then {
- _yaw = ( (_minDeflection max (_adjustVectorX min _maxDeflection) ) );
- };
+ if (GVAR(debug_drawGuidanceInfo)) then {
+ private _projectilePosAGL = ASLToAGL _projectilePos;
+ private _cmdAccelLocal = _projectile vectorWorldToModelVisual _commandedAcceleration;
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,1], _projectilePosAGL vectorAdd [0, 0, 1], 0.75, 0.75, 0, format ["cmdPitch: %1 cmdYaw %2", _cmdAccelLocal#2, _cmdAccelLocal#0], 1, 0.025, "TahomaB"];
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,0,1], _projectilePosAGL vectorAdd [0, 0, 2], 0.75, 0.75, 0, _navigationType, 1, 0.025, "TahomaB"];
+ drawLine3D [_projectilePosAGL, _projectilePosAGL vectorAdd _commandedAcceleration, [1, 0, 1, 1]];
};
- if (_adjustVectorY < 0) then {
- _roll = - ( (_minDeflection max ((abs _adjustVectorY) min _maxDeflection) ) );
- } else {
- if (_adjustVectorY > 0) then {
- _roll = ( (_minDeflection max (_adjustVectorY min _maxDeflection) ) );
+
+ // activate missile servos and change direction
+ if (!isGamePaused && accTime > 0) then {
+ _guidanceParameters params ["_yaw", "_roll", "_pitch"];
+
+ _commandedAcceleration = _projectile vectorWorldToModelVisual _commandedAcceleration;
+ _commandedAcceleration params ["_yawChange", "", "_pitchChange"];
+
+ if (isNil "_yawChange") then {
+ _yawChange = 0;
};
- };
- if (_adjustVectorZ < 0) then {
- _pitch = - ( (_minDeflection max ((abs _adjustVectorZ) min _maxDeflection) ) );
- } else {
- if (_adjustVectorZ > 0) then {
- _pitch = ( (_minDeflection max (_adjustVectorZ min _maxDeflection) ) );
+ if (isNil "_pitchChange") then {
+ _pitchChange = 0;
};
- };
- private _finalAdjustVector = [_yaw, _roll, _pitch];
- TRACE_3("",_pitch,_yaw,_roll);
- TRACE_3("",_targetVector,_adjustVector,_finalAdjustVector);
+ private _clampedPitch = (_pitchChange min _pitchRate) max -_pitchRate;
+ private _clampedYaw = (_yawChange min _yawRate) max -_yawRate;
+
+ // controls are either on or off, no proportional
+ if (_isBangBangGuidance) then {
+ private _pitchSign = if (_clampedPitch == 0) then {
+ 0
+ } else {
+ _clampedPitch / abs _clampedPitch
+ };
+ private _yawSign = if (_clampedYaw == 0) then {
+ 0
+ } else {
+ _clampedYaw / abs _clampedYaw
+ };
+ _clampedPitch = _pitchSign * _pitchRate;
+ _clampedYaw = _yawSign * _yawRate;
+ };
+
+ TRACE_9("pitch/yaw/roll",_pitch,_yaw,_roll,_yawChange,_pitchChange,_pitchRate,_yawRate,_clampedPitch,_clampedYaw);
+ // directional stability
+ private _localVelocity = _projectile vectorWorldToModelVisual (velocity _projectile);
+
+ private _velocityAngleYaw = (_localVelocity#0) atan2 (_localVelocity#1);
+ private _velocityAnglePitch = (_localVelocity#2) atan2 (_localVelocity#1);
+
+ // bastardized version of direction stability https://en.wikipedia.org/wiki/Directional_stability#Steering_forces
+ private _forceYaw = _stabilityCoefficient * _velocityAngleYaw + _clampedYaw;
+ private _forcePitch = _stabilityCoefficient * _velocityAnglePitch + _clampedPitch;
+
+ _pitch = _pitch + _forcePitch * _timestep;
+ _yaw = _yaw + _forceYaw * _timestep;
- if (accTime > 0) then {
- private _changeVector = (vectorDir _projectile) vectorAdd _finalAdjustVector;
- TRACE_2("",_projectile,_changeVector);
- [_projectile, _changeVector] call FUNC(changeMissileDirection);
+ TRACE_3("new pitch/yaw/roll",_pitch,_yaw,_roll);
+
+ private _multiplyQuat = {
+ params ["_qLHS", "_qRHS"];
+ _qLHS params ["_lhsX", "_lhsY", "_lhsZ", "_lhsW"];
+ _qRHS params ["_rhsX", "_rhsY", "_rhsZ", "_rhsW"];
+
+ private _lhsImaginary = [_lhsX, _lhsY, _lhsZ];
+ private _rhsImaginary = [_rhsX, _rhsY, _rhsZ];
+
+ private _scalar = _lhsW * _rhsW - (_lhsImaginary vectorDotProduct _rhsImaginary);
+ private _imginary = (_rhsImaginary vectorMultiply _lhsW) vectorAdd (_lhsImaginary vectorMultiply _rhsW) vectorAdd (_lhsImaginary vectorCrossProduct _rhsImaginary);
+
+ _imginary + [_scalar]
+ };
+
+ private _multiplyVector = {
+ params ["_quaternion", "_vector"];
+
+ private _real = _quaternion#3;
+ private _imaginary = [
+ _quaternion#0,
+ _quaternion#1,
+ _quaternion#2
+ ];
+
+ private _vectorReturn = _vector vectorAdd ((
+ _imaginary vectorCrossProduct (
+ (_imaginary vectorCrossProduct _vector) vectorAdd (
+ _vector vectorMultiply _real
+ )
+ )
+ ) vectorMultiply 2);
+
+ _vectorReturn
+ };
+
+ private _quaternion = [0, 0, 0, 1];
+
+ private _temp = [0, 0, sin (-_yaw / 2), cos (-_yaw / 2)];
+ _quaternion = [_quaternion, _temp] call _multiplyQuat;
+
+ _temp = [sin (_pitch / 2), 0, 0, cos (_pitch / 2)];
+ _quaternion = [_quaternion, _temp] call _multiplyQuat;
+
+ private _dir = [_quaternion, [0, 1, 0]] call _multiplyVector;
+ private _up = [_quaternion, [0, 0, 1]] call _multiplyVector;
+
+ _projectile setVectorDirAndUp [_dir, _up];
+
+ _guidanceParameters set [0, _yaw];
+ _guidanceParameters set [2, _pitch];
+
+ _stateParams set [5, _guidanceParameters];
};
+
+ _stateParams set [4, _navigationParameters];
+ _args set [4, _stateParams];
};
-#ifdef DRAW_GUIDANCE_INFO
-TRACE_3("",_projectilePos,_seekerTargetPos,_profileAdjustedTargetPos);
-drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,1], ASLtoAGL _projectilePos, 0.75, 0.75, 0, _ammo, 1, 0.025, "TahomaB"];
+if (GVAR(debug_drawGuidanceInfo)) then {
+ TRACE_3("",_projectilePos,_seekerTargetPos,_profileAdjustedTargetPos);
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,1], ASLToAGL _projectilePos, 0.75, 0.75, 0, _ammo, 1, 0.025, "TahomaB"];
-private _ps = "#particlesource" createVehicleLocal (ASLtoAGL _projectilePos);
-_PS setParticleParams [["\A3\Data_f\cl_basic", 8, 3, 1], "", "Billboard", 1, 3.0141, [0, 0, 2], [0, 0, 0], 1, 1.275, 1, 0, [1, 1], [[1, 0, 0, 1], [1, 0, 0, 1], [1, 0, 0, 1]], [1], 1, 0, "", "", nil];
-_PS setDropInterval 3.0;
-#endif
+ if (!isGamePaused && accTime > 0) then {
+ private _ps = "#particlesource" createVehicleLocal (ASLToAGL _projectilePos);
+ _PS setParticleParams [["\A3\Data_f\cl_basic", 8, 3, 1], "", "Billboard", 1, 3.0141, [0, 0, 0], [0, 0, 0], 1, 1.275, 1, 0, [1, 1], [[1, 0, 0, 1], [1, 0, 0, 1], [1, 0, 0, 1]], [1], 1, 0, "", "", nil];
+ _PS setDropInterval 1.0;
+ };
+
+ drawLine3D [ASLToAGL _projectilePos, (ASLToAGL _projectilePos) vectorAdd velocity _projectile, [1, 1, 1, 1]];
+};
_stateParams set [0, diag_tickTime];
END_COUNTER(guidancePFH);
-
diff --git a/addons/missileguidance/functions/fnc_javelin_midCourseTransition.sqf b/addons/missileguidance/functions/fnc_javelin_midCourseTransition.sqf
new file mode 100644
index 00000000000..58995dee31d
--- /dev/null
+++ b/addons/missileguidance/functions/fnc_javelin_midCourseTransition.sqf
@@ -0,0 +1,48 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Condition to switch to next navigation profile
+ *
+ * Arguments:
+ * Guidance Arg Array
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [] call ace_missileguidance_fnc_javelin_midCourseTransition
+ *
+ * Public: No
+ */
+#define STAGE_LAUNCH 1
+#define STAGE_CLIMB 2
+#define STAGE_COAST 3
+#define STAGE_TERMINAL 4
+
+#define REQUIRED_STABLE_TIME 0.2
+#define REQUIRED_ANGLE 1
+
+params ["_args", "_timestep"];
+_args params ["_firedEH", "_launchParams", "_flightParams", "_seekerParams", "_stateParams", "_targetData", "_navigationStateData"];
+_firedEH params ["_shooter","","","","_ammo","","_projectile"];
+_launchParams params ["_shooter","_targetLaunchParams","_seekerType","_attackProfile","_lockMode","_laserInfo","_navigationType"];
+_targetLaunchParams params ["_target", "_targetPos", "_launchPos", "_launchDir", "_launchTime"];
+_flightParams params ["_pitchRate", "_yawRate", "_isBangBangGuidance"];
+_stateParams params ["_lastRunTime", "_seekerStateParams", "_attackProfileStateParams", "_lastKnownPosState","_navigationParams", "_guidanceParameters"];
+_seekerParams params ["_seekerAngle", "_seekerAccuracy", "_seekerMaxRange", "_seekerMinRange"];
+_targetData params ["_targetDirection", "_attackProfileDirection", "_targetRange", "_targetVelocity", "_targetAcceleration"];
+
+_attackProfileStateParams params ["_state", "_stableTime", "_target"];
+private _projectileDirection = vectorNormalized velocity _projectile;
+private _targetDistance = _target vectorDistance getPosASLVisual _projectile;
+private _targetDirection = (getPosASLVisual _projectile) vectorFromTo _target;
+private _angle = _projectileDirection vectorCos _targetDirection;
+if (_angle > cos REQUIRED_ANGLE) then {
+ _stableTime = _stableTime + _timestep;
+} else {
+ _stableTime = 0;
+};
+
+_attackProfileStateParams set [1, _stableTime];
+_state isEqualTo STAGE_TERMINAL && _stableTime > REQUIRED_STABLE_TIME
+
diff --git a/addons/missileguidance/functions/fnc_line_onFired.sqf b/addons/missileguidance/functions/fnc_line_onFired.sqf
new file mode 100644
index 00000000000..6093dc27384
--- /dev/null
+++ b/addons/missileguidance/functions/fnc_line_onFired.sqf
@@ -0,0 +1,35 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Sets up line state arrays (called from missileGuidance's onFired).
+ *
+ * Arguments:
+ * Guidance Arg Array
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [] call ace_missileguidance_fnc_line_onFired
+ *
+ * Public: No
+ */
+params ["_firedEH", "", "", "", "_stateParams"];
+_firedEH params ["","","","","","","_projectile"];
+
+private _ammoConfig = configOf _projectile;
+private _p = getNumber (_ammoConfig >> QUOTE(ADDON) >> "lineGainP");
+private _d = getNumber (_ammoConfig >> QUOTE(ADDON) >> "lineGainD");
+private _correctionDistance = getNumber (_ammoConfig >> QUOTE(ADDON) >> "correctionDistance");
+
+if (_correctionDistance == 0) then {
+ _correctionDistance = 1;
+};
+
+private _navigationParams = [
+ _p, 0, _d,
+ 0,
+ 0,
+ _correctionDistance
+];
+_navigationParams
diff --git a/addons/missileguidance/functions/fnc_ahr_onFired.sqf b/addons/missileguidance/functions/fnc_mwr_onFired.sqf
similarity index 92%
rename from addons/missileguidance/functions/fnc_ahr_onFired.sqf
rename to addons/missileguidance/functions/fnc_mwr_onFired.sqf
index 0618c046ad4..845b81cda64 100644
--- a/addons/missileguidance/functions/fnc_ahr_onFired.sqf
+++ b/addons/missileguidance/functions/fnc_mwr_onFired.sqf
@@ -10,7 +10,7 @@
* None
*
* Example:
- * [] call ace_missileguidance_fnc_ahr_onFired
+ * [] call ace_missileguidance_fnc_mwr_onFired
*
* Public: No
*/
@@ -38,6 +38,8 @@ private _activeRadarDistance = [_config >> "activeRadarEngageDistance", "NUMBER"
private _projectileThrust = [_projectileConfig >> "thrust", "NUMBER", 0] call CBA_fnc_getConfigEntry;
private _projectileThrustTime = [_projectileConfig >> "thrustTime", "NUMBER", 0] call CBA_fnc_getConfigEntry;
+private _lockTypes = [_config >> "lockableTypes", "ARRAY", ["Air", "LandVehicle", "Ship"]] call CBA_fnc_getConfigEntry;
+
private _velocityAtImpact = _projectileThrust * _projectileThrustTime;
private _timeToActive = 0;
if (!isNil "_target" && _velocityAtImpact > 0) then {
@@ -70,4 +72,4 @@ _seekerStateParams set [6, false];
_seekerStateParams set [7, [0, 0, 0]];
_seekerStateParams set [8, CBA_missionTime];
_seekerStateParams set [9, isNull _target];
-
+_seekerStateParams set [10, _lockTypes];
diff --git a/addons/missileguidance/functions/fnc_navigationType_augmentedProNav.sqf b/addons/missileguidance/functions/fnc_navigationType_augmentedProNav.sqf
new file mode 100644
index 00000000000..f8f1e6c0f42
--- /dev/null
+++ b/addons/missileguidance/functions/fnc_navigationType_augmentedProNav.sqf
@@ -0,0 +1,50 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Determine path for projectile to take in accordance to proportional navigation, takes target acceleration into account
+ *
+ * Arguments:
+ * Guidance Arg Array
+ *
+ * Return Value:
+ * Commanded acceleration normal to LOS in world space
+ *
+ * Example:
+ * [] call ace_missileguidance_fnc_navigationType_augmentedProNav
+ *
+ * Public: No
+ */
+params ["_args", "_timestep", "_seekerTargetPos", "_profileAdjustedTargetPos"];
+_args params ["_firedEH", "", "", "", "_stateParams", "_targetData"];
+_firedEH params ["","","","","","","_projectile"];
+_stateParams params ["", "", "", "","_navigationParams"];
+_navigationParams params ["_lastMissileFrame", "_navigationGain"];
+_lastMissileFrame params ["_lastLineOfSight"];
+_targetData params ["_targetDirection", "_attackProfileDirection", "", "_targetVelocity", "_targetAcceleration"];
+
+// Proportional navigation implemented via "Fundamentals of proportional navigation" by Stephen Murtaugh and Harry Criel
+private _closingVelocity = _targetVelocity vectorDiff velocity _projectile;
+
+private _targetAccelerationProjected = _attackProfileDirection vectorMultiply (_targetAcceleration vectorDotProduct _attackProfileDirection);
+_targetAcceleration = _targetAcceleration vectorDiff _targetAccelerationProjected;
+
+private _losDelta = (vectorNormalized _attackProfileDirection) vectorDiff (vectorNormalized _lastLineOfSight);
+private _losRate = if (_timestep == 0) then {
+ 0
+} else {
+ 1 * (vectorMagnitude _losDelta) / _timestep;
+};
+
+private _lateralAcceleration = _navigationGain * _losRate;
+private _commandedAcceleration = _closingVelocity vectorMultiply _lateralAcceleration;
+_commandedAcceleration = _commandedAcceleration vectorAdd (_losDelta vectorMultiply (0.5 * _navigationGain * vectorMagnitude _targetAcceleration));
+
+// we need acceleration normal to our LOS
+private _commandedAccelerationProjected = _attackProfileDirection vectorMultiply (_commandedAcceleration vectorDotProduct _attackProfileDirection);
+_commandedAcceleration = _commandedAcceleration vectorDiff _commandedAccelerationProjected;
+
+if (accTime > 0) then {
+ _navigationParams set [0, [_seekerTargetPos, _targetVelocity, _attackProfileDirection]];
+};
+
+_commandedAcceleration vectorMultiply _timestep
diff --git a/addons/missileguidance/functions/fnc_navigationType_direct.sqf b/addons/missileguidance/functions/fnc_navigationType_direct.sqf
new file mode 100644
index 00000000000..5681c85b9ae
--- /dev/null
+++ b/addons/missileguidance/functions/fnc_navigationType_direct.sqf
@@ -0,0 +1,36 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Points directly toward attack profile positon
+ *
+ * Arguments:
+ * Guidance Arg Array
+ *
+ * Return Value:
+ * Commanded acceleration normal to LOS in world space
+ *
+ * Example:
+ * [] call ace_missileguidance_fnc_navigationType_direct
+ *
+ * Public: No
+ */
+params ["_args", "_timestep", "", "_profileAdjustedTargetPos"];
+_args params ["_firedEH", "", "_flightParams"];
+_flightParams params ["_pitchRate", "_yawRate"];
+_firedEH params ["","","","","","","_projectile"];
+
+private _projectilePos = getPosASLVisual _projectile;
+
+private _targetDirection = _projectilePos vectorFromTo _profileAdjustedTargetPos;
+private _projectileDirection = vectorNormalized velocity _projectile;
+
+private _deltaDirection = _targetDirection vectorDiff _projectileDirection;
+_deltaDirection = _projectile vectorWorldToModelVisual _deltaDirection;
+_deltaDirection = _deltaDirection vectorMultiply [_yawRate, 0, _pitchRate];
+_deltaDirection = _projectile vectorModelToWorldVisual _deltaDirection;
+
+private _iTimestep = 0;
+if (_timestep != 0) then {
+ _iTimestep = 1 / _timestep;
+};
+_deltaDirection vectorMultiply _iTimestep // return
diff --git a/addons/missileguidance/functions/fnc_navigationType_line.sqf b/addons/missileguidance/functions/fnc_navigationType_line.sqf
new file mode 100644
index 00000000000..c9a3870c58b
--- /dev/null
+++ b/addons/missileguidance/functions/fnc_navigationType_line.sqf
@@ -0,0 +1,52 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Assumes targetDir is pointing toward line we want to stay on
+ *
+ * Arguments:
+ * Guidance Arg Array
+ *
+ * Return Value:
+ * Commanded acceleration normal to LOS in world space
+ *
+ * Example:
+ * [] call ace_missileguidance_fnc_navigationType_line
+ *
+ * Public: No
+ */
+params ["_args", "_timestep", "_seekerTargetPos", "_profileAdjustedTargetPos", "_targetData", "_navigationParams"];
+_args params ["", "", "_flightParams"];
+_targetData params ["", "_targetDir", "_distance"];
+_flightParams params ["_pitchRate", "_yawRate"];
+
+_navigationParams params ["_proportionalGain", "", "_derivativeGain", "_lastErrorX", "_lastErrorY", "_correctionDistance"];
+private _relativeTargetDirection = [0, (velocityModelSpace _projectile) select 1, 0] vectorAdd (_projectile vectorWorldToModelVisual (_targetDir vectorMultiply _distance));
+
+private _angleX = ((_relativeTargetDirection select 0) atan2 (_relativeTargetDirection select 1));
+private _angleY = ((_relativeTargetDirection select 2) atan2 (_relativeTargetDirection select 1));
+
+private _pX = _proportionalGain * _angleX;
+private _dX = 0;
+if (_timestep > 0) then {
+ _dX = _derivativeGain * (_angleX - _lastErrorX) / _timestep;
+};
+
+private _pY = _proportionalGain * _angleY;
+private _dY = 0;
+if (_timestep > 0) then {
+ _dY = _derivativeGain * (_angleY - _lastErrorY) / _timestep;
+};
+
+private _accelerationX = _pX + _dX;
+private _accelerationY = _pY + _dY;
+
+private _commandedAcceleration = [
+ _accelerationX,
+ 0,
+ _accelerationY
+];
+
+_navigationParams set [3, _angleX];
+_navigationParams set [4, _angleY];
+
+_projectile vectorModelToWorldVisual _commandedAcceleration;
diff --git a/addons/missileguidance/functions/fnc_navigationType_lineOfSight.sqf b/addons/missileguidance/functions/fnc_navigationType_lineOfSight.sqf
new file mode 100644
index 00000000000..5056d837228
--- /dev/null
+++ b/addons/missileguidance/functions/fnc_navigationType_lineOfSight.sqf
@@ -0,0 +1,48 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Accelerates toward LOS
+ *
+ * Arguments:
+ * Guidance Arg Array
+ *
+ * Return Value:
+ * Commanded acceleration normal to LOS in world space
+ *
+ * Example:
+ * [] call ace_missileguidance_fnc_navigationType_lineOfSight
+ *
+ * Public: No
+ */
+params ["_args", "_timestep", "_seekerTargetPos", "_profileAdjustedTargetPos"];
+_args params ["_firedEH", "", "", "", "_stateParams", "_targetData"];
+_firedEH params ["","","","","","","_projectile"];
+_stateParams params ["", "", "", "","_navigationParams"];
+_navigationParams params ["_onLaunch"];
+_onLaunch params ["_lastLineOfSight"];
+_targetData params ["_targetDirection", "_attackProfileDirection", "", "_targetVelocity", ""];
+
+// Semi-proportional navigation implemented via "Fundamentals of proportional navigation" by Stephen Murtaugh and Harry Criel
+
+// the los rate is tiny, so we multiply by a constant of a power of ten to get more aggressive acceleration
+// this is just due to how we measure our LOS delta, the vectors involved are _tiny_
+private _losDelta = _attackProfileDirection vectorDiff _lastLineOfSight;
+private _losRate = if (_timestep == 0) then {
+ 0
+} else {
+ 10 * (vectorMagnitude _losDelta) / _timestep;
+};
+
+private _closingVelocity = _targetVelocity vectorDiff (velocity _projectile);
+
+private _commandedAcceleration = _closingVelocity vectorMultiply _losRate;
+
+// we need acceleration normal to our LOS
+private _commandedAccelerationProjected = _attackProfileDirection vectorMultiply (_commandedAcceleration vectorDotProduct _attackProfileDirection);
+_commandedAcceleration = _commandedAcceleration vectorDiff _commandedAccelerationProjected;
+
+if (accTime > 0) then {
+ _navigationParams set [0, [_attackProfileDirection]];
+};
+
+_targetDirection
diff --git a/addons/missileguidance/functions/fnc_navigationType_proNav.sqf b/addons/missileguidance/functions/fnc_navigationType_proNav.sqf
new file mode 100644
index 00000000000..45052689b05
--- /dev/null
+++ b/addons/missileguidance/functions/fnc_navigationType_proNav.sqf
@@ -0,0 +1,46 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Determine path for projectile to take in accordance to proportional navigation
+ *
+ * Arguments:
+ * Guidance Arg Array
+ *
+ * Return Value:
+ * Commanded acceleration normal to LOS in world space
+ *
+ * Example:
+ * [] call ace_missileguidance_fnc_navigationType_proNav
+ *
+ * Public: No
+ */
+params ["_args", "_timestep", "_seekerTargetPos", "_profileAdjustedTargetPos"];
+_args params ["_firedEH", "", "", "", "_stateParams", "_targetData"];
+_firedEH params ["","","","","","","_projectile"];
+_stateParams params ["", "", "", "","_navigationParams"];
+_navigationParams params ["_lastMissileFrame", "_navigationGain"];
+_lastMissileFrame params ["_lastLineOfSight"];
+_targetData params ["_targetDirection", "_attackProfileDirection", "", "_targetVelocity", ""];
+
+// Proportional navigation implemented via "Fundamentals of proportional navigation" by Stephen Murtaugh and Harry Criel
+private _closingVelocity = _targetVelocity vectorDiff velocity _projectile;
+
+private _losDelta = (vectorNormalized _attackProfileDirection) vectorDiff (vectorNormalized _lastLineOfSight);
+private _losRate = if (_timestep == 0) then {
+ 0
+} else {
+ 1 * (vectorMagnitude _losDelta) / _timestep;
+};
+
+private _lateralAcceleration = _navigationGain * _losRate;
+private _commandedAcceleration = _closingVelocity vectorMultiply _lateralAcceleration;
+
+// we need acceleration normal to our LOS
+private _commandedAccelerationProjected = _attackProfileDirection vectorMultiply (_commandedAcceleration vectorDotProduct _attackProfileDirection);
+_commandedAcceleration = _commandedAcceleration vectorDiff _commandedAccelerationProjected;
+
+if (accTime > 0) then {
+ _navigationParams set [0, [_seekerTargetPos, _targetVelocity, _attackProfileDirection]];
+};
+
+_commandedAcceleration vectorMultiply _timestep
diff --git a/addons/missileguidance/functions/fnc_navigationType_zeroEffortMiss.sqf b/addons/missileguidance/functions/fnc_navigationType_zeroEffortMiss.sqf
new file mode 100644
index 00000000000..293bede8bf2
--- /dev/null
+++ b/addons/missileguidance/functions/fnc_navigationType_zeroEffortMiss.sqf
@@ -0,0 +1,38 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Determine path for projectile to take in accordance to zero-effort miss pro-nav, takes target acceleration into account. Super deadly
+ *
+ * Arguments:
+ * Guidance Arg Array
+ *
+ * Return Value:
+ * Commanded acceleration normal to LOS in world space
+ *
+ * Example:
+ * [] call ace_missileguidance_fnc_navigationType_zeroEffortMiss
+ *
+ * Public: No
+ */
+params ["_args", "_timestep", "_seekerTargetPos", "_profileAdjustedTargetPos"];
+_args params ["_firedEH", "", "", "", "_stateParams", "_targetData"];
+_firedEH params ["","","","","","","_projectile"];
+_stateParams params ["", "", "", "","_navigationParams"];
+_navigationParams params ["", "_navigationGain"];
+_targetData params ["_targetDirection", "_attackProfileDirection", "_targetRange", "_targetVelocity", "_targetAcceleration"];
+
+private _vectorToTarget = _attackProfileDirection vectorMultiply _targetRange;
+private _closingVelocity = _targetVelocity vectorDiff velocity _projectile;
+private _timeToGo = _targetRange / vectorMagnitude _closingVelocity;
+
+if (_timeToGo == 0) then {
+ _timeToGo = 0.001;
+};
+
+private _zeroEffortMiss = _vectorToTarget vectorAdd (_closingVelocity vectorMultiply _timeToGo);
+private _zeroEffortMissProjectiled = _attackProfileDirection vectorMultiply (_zeroEffortMiss vectorDotProduct _attackProfileDirection);
+private _zeroEffortMissNormal = _zeroEffortMiss vectorDiff _zeroEffortMissProjectiled;
+
+private _commandedAcceleration = _zeroEffortMissNormal vectorMultiply (_navigationGain / (_timeToGo * _timeToGo));
+
+_commandedAcceleration
diff --git a/addons/missileguidance/functions/fnc_onFired.sqf b/addons/missileguidance/functions/fnc_onFired.sqf
index 1d63d120a9a..9cc91f300a9 100644
--- a/addons/missileguidance/functions/fnc_onFired.sqf
+++ b/addons/missileguidance/functions/fnc_onFired.sqf
@@ -19,9 +19,6 @@
params ["_shooter","_weapon","","_mode","_ammo","","_projectile"];
-// Bail on not missile
-if !(_ammo isKindOf "MissileBase") exitWith {};
-
// Bail if guidance is disabled for this ammo
if ((getNumber (configFile >> "CfgAmmo" >> _ammo >> QUOTE(ADDON) >> "enabled")) != 1) exitWith {};
@@ -44,6 +41,7 @@ private _target = _shooter getVariable [QGVAR(target), nil];
private _targetPos = _shooter getVariable [QGVAR(targetPosition), nil];
private _seekerType = _shooter getVariable [QGVAR(seekerType), nil];
private _attackProfile = _shooter getVariable [QGVAR(attackProfile), nil];
+private _navigationType = _shooter getVariable [QGVAR(navigationType), nil];
if ((getNumber (configFile >> "CfgAmmo" >> _ammo >> QUOTE(ADDON) >> "useModeForAttackProfile")) == 1) then {
_attackProfile = getText (configFile >> "CfgWeapons" >> _weapon >> _mode >> QGVAR(attackProfile))
};
@@ -52,7 +50,7 @@ private _lockMode = _shooter getVariable [QGVAR(lockMode), nil];
private _laserCode = _shooter getVariable [QEGVAR(laser,code), ACE_DEFAULT_LASER_CODE];
private _laserInfo = [_laserCode, ACE_DEFAULT_LASER_WAVELENGTH, ACE_DEFAULT_LASER_WAVELENGTH];
-TRACE_6("getVars",_target,_targetPos,_seekerType,_attackProfile,_lockMode,_laserCode);
+TRACE_7("getVars",_target,_targetPos,_seekerType,_attackProfile,_lockMode,_laserCode,_navigationType);
private _launchPos = getPosASL (vehicle _shooter);
@@ -65,6 +63,14 @@ if (isNil "_attackProfile" || {!(_attackProfile in (getArray (_config >> "attack
if (isNil "_lockMode" || {!(_lockMode in (getArray (_config >> "seekerLockModes")))}) then {
_lockMode = getText (_config >> "defaultSeekerLockMode");
};
+if (isNil "_navigationType" || {!(_navigationType in (getArray (_config >> "navigationTypes")))}) then {
+ _navigationType = getText (_config >> "defaultNavigationType");
+};
+
+if (isNil "_navigationType" || _navigationType isEqualTo "") then {
+ // most missiles use ProNav by default
+ _navigationType = "ProportionalNavigation";
+};
// If we didn't get a target, try to fall back on tab locking
if (isNil "_target") then {
@@ -76,7 +82,7 @@ if (isNil "_target") then {
private _canUseLock = getNumber (_config >> "canVanillaLock");
// @TODO: Get vanilla target
if (_canUseLock > 0 || difficulty < 1) then {
- private _vanillaTarget = cursorTarget;
+ private _vanillaTarget = missileTarget _projectile;
TRACE_1("Using Vanilla Locking",_vanillaTarget);
if (!isNil "_vanillaTarget") then {
@@ -85,6 +91,7 @@ if (isNil "_target") then {
};
};
};
+_targetPos = getPosASLVisual _target;
// Array for seek last target position
private _seekLastTargetPos = (getNumber ( _config >> "seekLastTargetPos")) == 1;
@@ -95,19 +102,66 @@ if (_seekLastTargetPos && {!isNil "_target"}) then {
_lastKnownPosState set [1, [0,0,0]];
};
-TRACE_4("Beginning ACE guidance system",_target,_ammo,_seekerType,_attackProfile);
+private _navigationParameters = [
+ // set up in navigation type onFired function
+];
+
+// default config values to make sure there is backwards compat
+private _pitchRate = 30;
+private _yawRate = 30;
+private _bangBang = false;
+if (isNumber (_config >> "pitchRate")) then {
+ _pitchRate = getNumber ( _config >> "pitchRate" );
+ _yawRate = getNumber ( _config >> "yawRate" );
+ _bangBang = (1 == getNumber (_config >> "bangBangGuidance"));
+};
+
+// How much this projectile likes to stay toward current velocity
+private _stabilityCoefficient = getNumber (_config >> "stabilityCoefficient");
+
+// show a light trail in flight
+private _showTrail = (1 == getNumber (_config >> "showTrail"));
+
+private _navigationStateSubclass = _config >> "navigationStates";
+private _states = getArray (_navigationStateSubclass >> "states");
+
+private _navigationStateData = [];
+private _initialState = "";
+
+if (_states isNotEqualTo []) then {
+ _initialState = _states select 0;
+ {
+ private _stateClass = _navigationStateSubclass >> _x;
+ _navigationStateData pushBack [
+ getText (_stateClass >> "transitionCondition"),
+ getText (_stateClass >> "navigationType"),
+ []
+ ];
+ } forEach _states;
+};
+
+private _initialRoll = getNumber (_config >> "initialRoll");
+private _initialYaw = getNumber (_config >> "initialYaw");
+private _initialPitch = getNumber (_config >> "initialPitch");
+
+private _yawRollPitch = (vectorDir _projectile) call CBA_fnc_vect2Polar;
+
+TRACE_5("Beginning ACE guidance system",_target,_ammo,_seekerType,_attackProfile,_navigationType);
private _args = [_this,
[ _shooter,
- [_target, _targetPos, _launchPos],
+ [_target, _targetPos, _launchPos, vectorDirVisual vehicle _shooter, CBA_missionTime],
_seekerType,
_attackProfile,
_lockMode,
- _laserInfo
+ _laserInfo,
+ _navigationType
],
[
- getNumber ( _config >> "minDeflection" ),
- getNumber ( _config >> "maxDeflection" ),
- getNumber ( _config >> "incDeflection" )
+ _pitchRate,
+ _yawRate,
+ _bangBang,
+ _stabilityCoefficient,
+ _showTrail
],
[
getNumber ( _config >> "seekerAngle" ),
@@ -115,37 +169,70 @@ private _args = [_this,
getNumber ( _config >> "seekerMaxRange" ),
getNumber ( _config >> "seekerMinRange" )
],
- [ diag_tickTime, [], [], _lastKnownPosState]
+ [ diag_tickTime, [], [], _lastKnownPosState, _navigationParameters, [_initialYaw + (_yawRollPitch select 1), _initialRoll, _initialPitch + (_yawRollPitch select 2)]],
+ [
+ // target data from missile. Must be filled by seeker for navigation to work
+ [0, 0, 0], // direction to target
+ [0, 0, 0], // direction to attack profile
+ 0, // range to target
+ [0, 0, 0], // target velocity
+ [0, 0, 0] // target acceleration
+ ],
+ [0, _navigationStateData]
];
private _onFiredFunc = getText (configFile >> QGVAR(SeekerTypes) >> _seekerType >> "onFired");
-TRACE_1("",_onFiredFunc);
+TRACE_1("seeker on fired",_onFiredFunc);
if (_onFiredFunc != "") then {
_args call (missionNamespace getVariable _onFiredFunc);
};
_onFiredFunc = getText (configFile >> QGVAR(AttackProfiles) >> _attackProfile >> "onFired");
-TRACE_1("",_onFiredFunc);
+TRACE_1("attack on fired",_onFiredFunc);
if (_onFiredFunc != "") then {
_args call (missionNamespace getVariable _onFiredFunc);
};
+if (_states isEqualTo []) then {
+ _onFiredFunc = getText (configFile >> QGVAR(NavigationTypes) >> _navigationType >> "onFired");
+ TRACE_1("navigation on fired",_onFiredFunc);
+ if (_onFiredFunc != "") then {
+ private _navState = (_args call (missionNamespace getVariable _onFiredFunc));
+ (_args select 4) set [4, _navState];
+ };
+} else {
+ {
+ _onFiredFunc = getText (configFile >> QGVAR(NavigationTypes) >> _x >> "onFired");
+ TRACE_1("navigation on fired",_onFiredFunc);
+ if (_onFiredFunc != "") then {
+ private _navState = (_args call (missionNamespace getVariable _onFiredFunc));
+ (_navigationStateData select _forEachIndex) set [2, _navState];
+ };
+ } forEach getArray (_config >> "navigationTypes");
+};
+
// Run the "onFired" function passing the full guidance args array
_onFiredFunc = getText (_config >> "onFired");
-TRACE_1("",_onFiredFunc);
+TRACE_1("general on fired",_onFiredFunc);
if (_onFiredFunc != "") then {
_args call (missionNamespace getVariable _onFiredFunc);
};
// Reverse:
-// _args params ["_firedEH", "_launchParams", "_flightParams", "_seekerParams", "_stateParams"];
+// _args params ["_firedEH", "_launchParams", "_flightParams", "_seekerParams", "_stateParams", "_targetData", "_navigationStateData"];
// _firedEH params ["_shooter","","","","_ammo","","_projectile"];
-// _launchParams params ["_shooter","_targetLaunchParams","_seekerType","_attackProfile","_lockMode","_laserInfo"];
-// _targetLaunchParams params ["_target", "_targetPos", "_launchPos"];
-// _stateParams params ["_lastRunTime", "_seekerStateParams", "_attackProfileStateParams", "_lastKnownPosState"];
+// _launchParams params ["_shooter","_targetLaunchParams","_seekerType","_attackProfile","_lockMode","_laserInfo","_navigationType"];
+// _targetLaunchParams params ["_target", "_targetPos", "_launchPos", "_launchDir", "_launchTime"];
+// _flightParams params ["_pitchRate", "_yawRate", "_isBangBangGuidance"];
+// _stateParams params ["_lastRunTime", "_seekerStateParams", "_attackProfileStateParams", "_lastKnownPosState", "_navigationParams", "_guidanceParameters"];
// _seekerParams params ["_seekerAngle", "_seekerAccuracy", "_seekerMaxRange", "_seekerMinRange"];
+// _targetData params ["_targetDirection", "_attackProfileDirection", "_targetRange", "_targetVelocity", "_targetAcceleration"];
+
+[LINKFUNC(guidancePFH),0, _args ] call CBA_fnc_addPerFrameHandler;
-[LINKFUNC(guidancePFH), 0, _args ] call CBA_fnc_addPerFrameHandler;
+if (GVAR(debug_enableMissileCamera)) then {
+ [_projectile] call FUNC(dev_ProjectileCamera);
+};
/* Clears locking settings
diff --git a/addons/missileguidance/functions/fnc_proNav_onFired.sqf b/addons/missileguidance/functions/fnc_proNav_onFired.sqf
new file mode 100644
index 00000000000..c297d3ce59a
--- /dev/null
+++ b/addons/missileguidance/functions/fnc_proNav_onFired.sqf
@@ -0,0 +1,36 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Sets up proportional navigation state arrays (called from missileGuidance's onFired).
+ *
+ * Arguments:
+ * Guidance Arg Array
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [] call ace_missileguidance_fnc_proNav_onFired
+ *
+ * Public: No
+ */
+params ["_firedEH", "", "", "", "_stateParams"];
+_firedEH params ["_shooter","","","","_ammo","","_projectile"];
+_launchParams params ["_shooter","_targetLaunchParams","_seekerType","_attackProfile","_lockMode","_laserInfo","_navigationType"];
+_targetLaunchParams params ["_target", "_targetPos", "_launchPos"];
+_stateParams params ["_lastRunTime", "_seekerStateParams", "_attackProfileStateParams", "_lastKnownPosState"];
+_seekerParams params ["_seekerAngle", "_seekerAccuracy", "_seekerMaxRange", "_seekerMinRange"];
+
+private _ammoConfig = configOf _projectile;
+private _navigationGain = getNumber (_ammoConfig >> QUOTE(ADDON) >> "navigationGain");
+if (_navigationGain == 0) then {
+ _navigationGain = 3;
+};
+
+private _navigationParams = [
+ [ // Last Missile Frame
+ [0, 0, 0] // Last line of sight
+ ],
+ _navigationGain // navigation gain of missile. Set in the navigation onFired function
+];
+_navigationParams
diff --git a/addons/missileguidance/functions/fnc_seekerType_ARH.sqf b/addons/missileguidance/functions/fnc_seekerType_MWR.sqf
similarity index 79%
rename from addons/missileguidance/functions/fnc_seekerType_ARH.sqf
rename to addons/missileguidance/functions/fnc_seekerType_MWR.sqf
index 54e487a9a0b..1b7eef07ee7 100644
--- a/addons/missileguidance/functions/fnc_seekerType_ARH.sqf
+++ b/addons/missileguidance/functions/fnc_seekerType_MWR.sqf
@@ -11,16 +11,16 @@
* Seeker Pos
*
* Example:
- * [] call call ace_missileguidance_fnc_seekerType_ARH;
+ * [] call call ace_missileguidance_fnc_seekerType_MWR;
*
* Public: No
*/
-params ["", "_args", "_seekerStateParams"];
-_args params ["_firedEH", "_launchParams", "", "_seekerParams", "_stateParams"];
+params ["", "_args", "_seekerStateParams", "", "_timestep"];
+_args params ["_firedEH", "_launchParams", "", "_seekerParams", "_stateParams", "_targetData"];
_firedEH params ["_shooter","","","","","","_projectile"];
_launchParams params ["_target","","","",""];
_seekerParams params ["_seekerAngle", "", "_seekerMaxRange"];
-_seekerStateParams params ["_isActive", "_activeRadarEngageDistance", "_timeWhenActive", "_expectedTargetPos", "_lastTargetPollTime", "_shooterHasRadar", "_wasActive", "_lastKnownVelocity", "_lastTimeSeen", "_doesntHaveTarget"];
+_seekerStateParams params ["_isActive", "_activeRadarEngageDistance", "_timeWhenActive", "_expectedTargetPos", "_lastTargetPollTime", "_shooterHasRadar", "_wasActive", "_lastKnownVelocity", "_lastTimeSeen", "_doesntHaveTarget", "_lockTypes"];
if (_isActive || { CBA_missionTime >= _timeWhenActive }) then {
if !(_isActive) then {
@@ -60,8 +60,7 @@ if (_isActive || { CBA_missionTime >= _timeWhenActive }) then {
_seekerBaseRadiusAdjusted = _seekerBaseRadiusAtGround;
};
// Look in front of seeker for any targets
- private _nearestObjects = nearestObjects [ASLtoAGL _searchPos, ["Air", "LandVehicle", "Ship"], _seekerBaseRadiusAdjusted, false];
-
+ private _nearestObjects = nearestObjects [ASLToAGL _searchPos, _lockTypes, _seekerBaseRadiusAdjusted, false];
_nearestObjects = _nearestObjects apply {
// I check both Line of Sight versions to make sure that a single bush doesnt make the target lock dissapear but at the same time ensure that this can see through smoke. Should work 80% of the time
if ([_projectile, getPosASL _x, _seekerAngle] call FUNC(checkSeekerAngle) && { ([_projectile, _x, true] call FUNC(checkLOS)) || { ([_projectile, _x, false] call FUNC(checkLOS)) } }) then {
@@ -74,12 +73,13 @@ if (_isActive || { CBA_missionTime >= _timeWhenActive }) then {
// Select closest object to the expected position to be the current radar target
if (_nearestObjects isEqualTo []) exitWith {
_projectile setMissileTarget objNull;
+ _seekerStateParams set [3, _searchPos];
_searchPos
};
private _closestDistance = _seekerBaseRadiusAtGround;
{
- if ((_x distance2d _searchPos) < _closestDistance) then {
- _closestDistance = _x distance2d _searchPos;
+ if ((_x distance2D _searchPos) < _closestDistance) then {
+ _closestDistance = _x distance2D _searchPos;
_target = _x;
};
} forEach _nearestObjects;
@@ -89,9 +89,9 @@ if (_isActive || { CBA_missionTime >= _timeWhenActive }) then {
_projectile setMissileTarget _target;
} else {
- #ifdef DRAW_GUIDANCE_INFO
- _seekerTypeName = "AHR - EXT";
- #endif
+ if (GVAR(debug_drawGuidanceInfo)) then {
+ _seekerTypeName = "MWR - EXT";
+ };
// External radar homing
// if the target is in the remote targets for the side, whoever the donor is will "datalink" the target for the hellfire.
private _remoteTargets = listRemoteTargets side _shooter;
@@ -104,16 +104,30 @@ if (_isActive || { CBA_missionTime >= _timeWhenActive }) then {
};
};
+if (GVAR(debug_drawGuidanceInfo)) then {
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,1], ASLToAGL _expectedTargetPos, 0.75, 0.75, 0, "expected target pos", 1, 0.025, "TahomaB"];
+};
+
if !(isNull _target) then {
private _centerOfObject = getCenterOfMass _target;
- private _targetAdjustedPos = _target modelToWorldWorld _centerOfObject;
+ private _targetAdjustedPos = _target modelToWorldVisualWorld _centerOfObject;
_expectedTargetPos = _targetAdjustedPos;
- _seekerStateParams set [3, _expectedTargetPos];
_seekerStateParams set [7, velocity _target];
_seekerStateParams set [8, CBA_missionTime];
_seekerStateParams set [9, false];
+
+ _targetData set [2, _projectile distance _target];
+ _targetData set [3, velocity _target];
+
+ if (_timestep != 0) then {
+ private _acceleration = ((velocity _target) vectorDiff _lastKnownVelocity) vectorMultiply (1 / _timestep);
+ _targetData set [4, _acceleration];
+ };
};
+_targetData set [0, (getPosASLVisual _projectile) vectorFromTo _expectedTargetPos];
+
+_seekerStateParams set [3, _expectedTargetPos];
_launchParams set [0, _target];
_expectedTargetPos
diff --git a/addons/missileguidance/functions/fnc_seekerType_Optic.sqf b/addons/missileguidance/functions/fnc_seekerType_Optic.sqf
index bac01d05b4d..0507bc2c11d 100644
--- a/addons/missileguidance/functions/fnc_seekerType_Optic.sqf
+++ b/addons/missileguidance/functions/fnc_seekerType_Optic.sqf
@@ -17,7 +17,7 @@
*/
params ["", "_args"];
-_args params ["_firedEH", "_launchParams", "", "_seekerParams", "_stateParams"];
+_args params ["_firedEH", "_launchParams", "", "_seekerParams", "_stateParams", "_targetData"];
_firedEH params ["","","","","","","_projectile"];
_launchParams params ["", "_targetParams"];
_targetParams params ["_target"];
@@ -25,7 +25,7 @@ _seekerParams params ["_seekerAngle", "", "_seekerMaxRange"];
if (isNil "_target") exitWith {[0,0,0]};
-private _foundTargetPos = aimPos _target;
+private _foundTargetPos = _target modelToWorldVisualWorld getCenterOfMass _target;
// @TODO: This is seeker LOS and angle checks for LOAL only; LOBL does not need visual
private _angleOkay = [_projectile, _foundTargetPos, _seekerAngle] call FUNC(checkSeekerAngle);
@@ -40,14 +40,11 @@ TRACE_2("",_angleOkay,_losOkay);
if (!_angleOkay || !_losOkay) exitWith {[0,0,0]};
TRACE_2("",_target,_foundTargetPos);
-// @TODO: Configurable lead for seekers
-private _projectileSpeed = (vectorMagnitude velocity _projectile);
private _distanceToTarget = (getPosASL _projectile) vectorDistance _foundTargetPos;
-private _eta = _distanceToTarget / _projectileSpeed;
-private _adjustDistance = (velocity _target) vectorMultiply _eta;
-TRACE_3("leading target",_distanceToTarget,_eta,_adjustDistance);
-_foundTargetPos = _foundTargetPos vectorAdd _adjustDistance;
+_targetData set [0, (getPosASL _projectile) vectorFromTo _foundTargetPos];
+_targetData set [2, _distanceToTarget];
+_targetData set [3, velocity _target];
TRACE_2("return",_foundTargetPos,(aimPos _target) distance _foundTargetPos);
_foundTargetPos;
diff --git a/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf b/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf
index da9549c3ae5..d9fd444043f 100644
--- a/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf
+++ b/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf
@@ -16,16 +16,19 @@
* Public: No
*/
params ["", "_args"];
-_args params ["_firedEH", "", "", "_seekerParams", "_stateParams"];
+_args params ["_firedEH", "", "", "_seekerParams", "_stateParams", "_targetData"];
_firedEH params ["_shooter","_weapon","","","","","_projectile"];
_seekerParams params ["_seekerAngle"];
_stateParams params ["", "_seekerStateParams"];
_seekerStateParams params ["_memoryPointGunnerOptics", "_animationSourceBody", "_animationSourceGun", "_usePilotCamera"];
-private _shooterPos = AGLToASL (_shooter modelToWorld(_shooter selectionPosition _memoryPointGunnerOptics));
+private _shooterPos = AGLToASL (_shooter modelToWorldVisual (_shooter selectionPosition _memoryPointGunnerOptics));
private _projPos = getPosASL _projectile;
-private _lookDirection = if !(_shooter isKindOf "CAManBase" || {_shooter isKindOf "StaticWeapon"}) then {
+private _lookDirection = if (_shooter isKindOf "CAManBase" || {_shooter isKindOf "StaticWeapon"}) then {
+ _shooterPos = eyePos _shooter;
+ _shooter weaponDirection _weapon
+} else {
private _finalLookDirection = if (_usePilotCamera) then {
_shooterPos = _shooter modelToWorldVisualWorld getPilotCameraPosition _shooter;
private _trackingTarget = getPilotCameraTarget _shooter;
@@ -37,14 +40,12 @@ private _lookDirection = if !(_shooter isKindOf "CAManBase" || {_shooter isKindO
_shooter vectorModelToWorldVisual getPilotCameraDirection _shooter;
};
} else {
- private _gBody = -deg(_shooter animationPhase _animationSourceBody);
- private _gGun = deg(_shooter animationPhase _animationSourceGun);
+ // use animationSourcePhase
+ private _gBody = -deg(_shooter animationSourcePhase _animationSourceBody);
+ private _gGun = deg(_shooter animationSourcePhase _animationSourceGun);
_shooter vectorModelToWorldVisual ([1, _gBody, _gGun] call CBA_fnc_polar2vect);
};
_finalLookDirection
-} else {
- _shooterPos = eyePos _shooter;
- _shooter weaponDirection _weapon
};
private _distanceToProj = _shooterPos vectorDistance _projPos;
@@ -58,5 +59,9 @@ if ((_testDotProduct < (cos _seekerAngle)) || {_testIntersections isNotEqualTo [
[0, 0, 0]
};
-_shooterPos vectorAdd (_lookDirection vectorMultiply _distanceToProj);
+private _returnPos = _shooterPos vectorAdd (_lookDirection vectorMultiply _distanceToProj);
+
+_targetData set [0, _projPos vectorFromTo _returnPos];
+_targetData set [2, _returnPos vectorDistance getPosASLVisual _projectile];
+_returnPos
diff --git a/addons/missileguidance/functions/fnc_seekerType_SALH.sqf b/addons/missileguidance/functions/fnc_seekerType_SALH.sqf
index a16c58ce5fa..8772d73178f 100644
--- a/addons/missileguidance/functions/fnc_seekerType_SALH.sqf
+++ b/addons/missileguidance/functions/fnc_seekerType_SALH.sqf
@@ -16,17 +16,58 @@
*
* Public: No
*/
+#define MAX_AVERAGES 15
+#define MINIMUM_DISTANCE_UNTIL_NEW_POS 1
-params ["", "_args"];
-_args params ["_firedEH", "_launchParams", "", "_seekerParams"];
+params ["", "_args", "", "", "_timestep"];
+_args params ["_firedEH", "_launchParams", "", "_seekerParams", "", "_targetData"];
_firedEH params ["","","","","","","_projectile"];
_launchParams params ["","","","","","_laserParams"];
-_seekerParams params ["_seekerAngle", "", "_seekerMaxRange"];
+_seekerParams params ["_seekerAngle", "", "_seekerMaxRange", "", ["_lastPositions", []], ["_lastPositionIndex", 0], ["_lastPositionSum", [0, 0, 0]]];
_laserParams params ["_code", "_wavelengthMin", "_wavelengthMax"];
-
private _laserResult = [(getPosASL _projectile), (velocity _projectile), _seekerAngle, _seekerMaxRange, [_wavelengthMin, _wavelengthMax], _code, _projectile] call EFUNC(laser,seekerFindLaserSpot);
private _foundTargetPos = _laserResult select 0;
TRACE_1("Search",_laserResult);
-_foundTargetPos;
+if (isNil "_foundTargetPos") exitWith {
+ [0, 0, 0]
+};
+
+// average out any error from laser jump
+private _positionSum = [0, 0, 0];
+{
+ _positionSum = _positionSum vectorAdd _x;
+} forEach _lastPositions;
+
+if (_foundTargetPos isNotEqualTo [0, 0, 0]) then {
+ _lastPositions set [_lastPositionIndex % MAX_AVERAGES, _foundTargetPos];
+ _seekerParams set [4, _lastPositions];
+ _seekerParams set [5, _lastPositionIndex + 1];
+};
+
+private _aproximateVelocity = [0, 0, 0];
+_positionSum = _positionSum vectorAdd _foundTargetPos;
+if (MAX_AVERAGES == count _lastPositions) then {
+ _positionSum = _positionSum vectorMultiply (1 / (1 + count _lastPositions));
+
+ // if we are within a meter of the previous average, just use the previous average
+ if (_positionSum distanceSqr _lastPositionSum < MINIMUM_DISTANCE_UNTIL_NEW_POS * MINIMUM_DISTANCE_UNTIL_NEW_POS) then {
+ _positionSum = _lastPositionSum;
+ };
+
+ if (_timestep != 0) then {
+ _aproximateVelocity = (_positionSum vectorDiff _lastPositionSum) vectorMultiply (1 / _timestep);
+ };
+} else {
+ _positionSum = _positionSum vectorMultiply (1 / count _lastPositions);
+};
+
+_seekerParams set [6, _positionSum];
+
+_targetData set [0, (getPosASL _projectile) vectorFromTo _positionSum];
+_targetData set [3, _aproximateVelocity];
+
+TRACE_3("laser target found",_foundTargetPos,_positionSum,count _lastPositions);
+
+_positionSum
diff --git a/addons/missileguidance/functions/fnc_wire_onFired.sqf b/addons/missileguidance/functions/fnc_wire_onFired.sqf
index 0cfa90ff99e..870754c5091 100644
--- a/addons/missileguidance/functions/fnc_wire_onFired.sqf
+++ b/addons/missileguidance/functions/fnc_wire_onFired.sqf
@@ -45,4 +45,3 @@ _attackProfileStateParams set [4, _maxDistanceSqr]; // max distance squared used
_attackProfileStateParams set [5, _minDistanceSqr];
_attackProfileStateParams set [6, _wireCutSource];
_attackProfileStateParams set [7, _distanceAheadOfMissile];
-
diff --git a/addons/missileguidance/script_component.hpp b/addons/missileguidance/script_component.hpp
index 2b43be42f3c..47f0e83e034 100644
--- a/addons/missileguidance/script_component.hpp
+++ b/addons/missileguidance/script_component.hpp
@@ -3,6 +3,7 @@
#include "\z\ace\addons\main\script_mod.hpp"
// #define DRAW_GUIDANCE_INFO
+// #define ENABLE_PROJECTILE_CAMERA
// #define DEBUG_MODE_FULL
// #define DISABLE_COMPILE_CACHE
// #define ENABLE_PERFORMANCE_COUNTERS
@@ -28,4 +29,3 @@
#define DEFAULT_LEAD_DISTANCE 5
#define ACTIVE_RADAR_POLL_FREQUENCY (1 / 7)
#define ACTIVE_RADAR_MINIMUM_SCAN_AREA 30
-
diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml
index aacdd472d69..292529a95bf 100644
--- a/addons/missileguidance/stringtable.xml
+++ b/addons/missileguidance/stringtable.xml
@@ -12,7 +12,7 @@
Orientação avançada de Míssil
Fejlett rakétairányító
Продвинутое наведение ракет
- アドバンスドミサイル誘導
+ 高度なミサイル誘導
고급 미사일 유도
进阶导弹制导
進階飛彈制導
@@ -29,7 +29,7 @@
A fejlett rakétairányító (vagy AMG) többféle módosítást tartalmaz a rakéták célkövetéséhez és tüzeléséhez. Ez egy szükséges keresztrendszer a rakéta-alapú fegyverekhez.
Orientação avançada de mísseis ou OAM, fornece vários aprimoramentos para travamento de mísseis e disparos. Também é um sistema requerido para disparar armas que utilizem mísseis.
Pokočilé navádění raket (AMG) poskytuje několik vylepšení pro lepší zaměření a následnou střelbu. Je to prvek vyžadovaný u typu zbraní jako jsou rakety.
- アドバンスドミサイル誘導 (AMG) は、ミサイルの捕捉と発射に複数の機能強化を提供します。 これは、ミサイル兵器の種類に必要なフレームワークでもあります。
+ 高度なミサイル誘導 (AMG) は、ミサイルの捕捉と発射に複数の機能強化を提供します。 これは、ミサイル兵器の種類に必要なフレームワークでもあります。
고급 미사일 유도 혹은 AMG는 표적 획득 및 발사를 위한 여러 기능을 제공합니다. 미사일 종류에 따라 체계가 필요합니다.
进阶导弹制导增强了多种导弹锁定和射击的能力。此系统适用于所有导弹类型的武器。
進階飛彈制導增強了多種導彈鎖定和射擊的能力。此系統適用於所有飛彈類型的武器
@@ -205,5 +205,26 @@
循環切換開火模式
Ateşleme Modunu Değiştir
+
+ 6x DAGR [ACE]
+ 6x DAGR [ACE]
+ 6x DAGR [ACE]
+ 6x DAGR [ACE]
+ 6x DAGR [ACE]
+
+
+ 12x DAGR [ACE]
+ 12x DAGR [ACE]
+ 12x DAGR [ACE]
+ 12x DAGR [ACE]
+ 12x DAGR [ACE]
+
+
+ 24x DAGR [ACE]
+ 24x DAGR [ACE]
+ 24x DAGR [ACE]
+ 24x DAGR [ACE]
+ 24x DAGR [ACE]
+
diff --git a/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf b/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf
index 88e2ba02d56..86a14a8c8d0 100644
--- a/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf
+++ b/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf
@@ -48,7 +48,7 @@ private _missionRoot = str missionConfigFile select [0, count str missionConfigF
};
} else {
if (isClass (configFile >> "CfgSounds" >> _x)) then {
- _soundPath = (getArray(configFile >> "CfgSounds" >> _x >> "sound")) param [0, ""];
+ private _soundPath = (getArray(configFile >> "CfgSounds" >> _x >> "sound")) param [0, ""];
if ((_soundPath select [0, 1]) == "\") then {_soundPath = _soundPath select [1];};
_ambianceSounds pushBack _soundPath;
} else {
@@ -85,9 +85,9 @@ TRACE_1("",_ambianceSounds);
private _newPosASL = if (_followPlayers) then {
// Select a target unit at random.
private _targetUnit = selectRandom _allUnits;
- AGLtoASL (_targetUnit getPos [_minimalDistance + random (_maximalDistance - _minimalDistance), random 360]);
+ AGLToASL (_targetUnit getPos [_minimalDistance + random (_maximalDistance - _minimalDistance), random 360]);
} else {
- AGLtoASL (_logic getPos [_minimalDistance + random (_maximalDistance - _minimalDistance), random 360]);
+ AGLToASL (_logic getPos [_minimalDistance + random (_maximalDistance - _minimalDistance), random 360]);
};
TRACE_1("",_newPosASL);
diff --git a/addons/mk6mortar/initSettings.inc.sqf b/addons/mk6mortar/initSettings.inc.sqf
index fc900295626..15047dee296 100644
--- a/addons/mk6mortar/initSettings.inc.sqf
+++ b/addons/mk6mortar/initSettings.inc.sqf
@@ -3,41 +3,41 @@
private _category = [format ["ACE %1", localize "str_a3_cfgmarkers_nato_art"], localize LSTRING(DisplayName)];
[
- QGVAR(airResistanceEnabled), "CHECKBOX",
+ QGVAR(airResistanceEnabled),
+ "CHECKBOX",
[LSTRING(airResistanceEnabled_DisplayName), LSTRING(airResistanceEnabled_Description)],
_category,
false, // default value
- true, // isGlobal
+ 1, // isGlobal
{[QGVAR(airResistanceEnabled), _this] call EFUNC(common,cbaSettings_settingChanged)},
true // Needs mission restart
] call CBA_fnc_addSetting;
[
- QGVAR(allowComputerRangefinder), "CHECKBOX",
+ QGVAR(allowComputerRangefinder),
+ "CHECKBOX",
[LSTRING(allowComputerRangefinder_DisplayName), LSTRING(allowComputerRangefinder_Description)],
_category,
true, // default value
- true, // isGlobal
- {[QGVAR(allowComputerRangefinder), _this] call EFUNC(common,cbaSettings_settingChanged)},
- true // Needs mission restart
+ 1 // isGlobal
] call CBA_fnc_addSetting;
[
- QGVAR(allowCompass), "CHECKBOX",
+ QGVAR(allowCompass),
+ "CHECKBOX",
[LSTRING(allowCompass_DisplayName), LSTRING(allowCompass_Description)],
_category,
true, // default value
- true, // isGlobal
- {[QGVAR(allowCompass), _this] call EFUNC(common,cbaSettings_settingChanged)},
- true // Needs mission restart
+ 1 // isGlobal
] call CBA_fnc_addSetting;
[
- QGVAR(useAmmoHandling), "CHECKBOX",
+ QGVAR(useAmmoHandling),
+ "CHECKBOX",
[LSTRING(useAmmoHandling_DisplayName), LSTRING(useAmmoHandling_Description)],
_category,
false, // default value
- true, // isGlobal
+ 1, // isGlobal
{[QGVAR(useAmmoHandling), _this] call EFUNC(common,cbaSettings_settingChanged)},
true // Needs mission restart
] call CBA_fnc_addSetting;
diff --git a/addons/mk6mortar/stringtable.xml b/addons/mk6mortar/stringtable.xml
index c6f29a037d8..186cd926849 100644
--- a/addons/mk6mortar/stringtable.xml
+++ b/addons/mk6mortar/stringtable.xml
@@ -120,10 +120,10 @@
Hava Direnci
- For Player Shots, Model Air Resistance and Wind Effects
+ Simulates air resistance and wind effects for player shots.
Modeluj opór powietrza oraz wpływ wiatru na tor lotu pocisku dla strzałów z moździerza Mk6 przez graczy
Para disparos del jugador, modelo de resistencia al aire y efectos de viento
- Für Spielerschüsse, Luftwiderstand und Windeffekte
+ Simuliert Luftwiderstand und Windeffekte für Spielerschüsse.
Pro hráčovu střelbu, Model odporu vzduchu a povětrných podmínek
Para disparos do jogador, modelo de resistência de ar e efeitos de vento
Pour les tirs des joueurs, simule la résistance de l'air et les effets du vent.
@@ -233,19 +233,19 @@
Používat ruční manipulaci s municí
- Removes mortar magazines, requiring individual rounds to be loaded by the gunner or loader. Does not affect AI mortars.
- Enfernt das Magzin des Mörsers. Es ist nun erforderlich, die einzelnen Patronen manuell zu laden. Dies beeinflusst nicht die KI-Truppen.
- Elimina los cargadores del mortero, requiriendo al artillero o cargador la carga manual de cada rondas. No afecta morteros controlados por IA.
- Usuwa magazynki moździerza, wymagając ładowania pojedynczych pocisków przez strzelca lub ładowniczego. Nie dotyczy moździerzy AI.
- Enlève les chargeurs de mortier, ce qui oblige le tireur ou le servant à charger les obus manuellement. N'affecte pas les mortiers IA.
- Rimuove i caricatori di colpi dal mortaio. Un operatore dovrà caricare proiettili singoli prima di poter fare fuoco. Non viene applicato su operatori IA.
- 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射擊的迫擊砲
- 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.
+ Removes mortar magazines, requiring individual rounds to be loaded by the gunner or loader.
+ Enfernt das Magzin des Mörsers. Es ist nun erforderlich, die einzelnen Patronen manuell zu laden.
+ Elimina los cargadores del mortero, requiriendo al artillero o cargador la carga manual de cada rondas.
+ Usuwa magazynki moździerza, wymagając ładowania pojedynczych pocisków przez strzelca lub ładowniczego.
+ Enlève les chargeurs de mortier, ce qui oblige le tireur ou le servant à charger les obus manuellement.
+ Rimuove i caricatori di colpi dal mortaio. Un operatore dovrà caricare proiettili singoli prima di poter fare fuoco.
+ Elimina os carregadores do morteiro, requerendo que o atirador ou carregador utilize de forma individual a munição.
+ Удаляет артиллерийские магазины, требует загрузку отдельных снарядов стрелком или заряжающим.
+ 迫撃砲から弾倉を除去します。一発ずつ射手か装填手によって装填される必要があります。
+ 박격포 탄창을 제거합니다, 사수나 장전수가 개별적으로 탄환을 넣어줘야 합니다.
+ 开启此功能时。迫击炮的弹药需由炮手与装填手共同合作来进行装填
+ 開啟此功能時。迫擊砲的彈藥需由砲手與裝填手共同合作來進行裝填
+ 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.
Remove Round
diff --git a/addons/movement/functions/fnc_handleClimb.sqf b/addons/movement/functions/fnc_handleClimb.sqf
index 1325f2f021e..a54007862e3 100644
--- a/addons/movement/functions/fnc_handleClimb.sqf
+++ b/addons/movement/functions/fnc_handleClimb.sqf
@@ -24,5 +24,5 @@ private _pos = _unit modelToWorldVisual (_unit selectionPosition "camera");
_pos = _pos vectorDiff (_unit selectionPosition "camera");
-_unit setPosASL (AGLtoASL _pos);
-TRACE_2("",AGLtoASL _pos,getPosASL _unit);
+_unit setPosASL (AGLToASL _pos);
+TRACE_2("",AGLToASL _pos,getPosASL _unit);
diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf
index efe0c6bf157..ea6f16ebc39 100644
--- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf
+++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf
@@ -25,7 +25,7 @@ TRACE_1("drawName:",_this);
params ["", "_target", "", "_heightOffset"];
-_fnc_parameters = {
+private _fnc_parameters = {
params ["_player", "_target", "_alpha", "_heightOffset", "_drawName", "_drawRank", "_drawSoundwave"];
//Set Icon:
@@ -44,11 +44,11 @@ _fnc_parameters = {
private _targetFaction = _target getVariable [QGVAR(faction), faction _target];
private _customRankIcons = GVAR(factionRanks) get _targetFaction;
- if (!isNil "_customRankIcons") then {
- _customRankIcons param [ALL_RANKS find rank _target, ""] // return
- } else {
+ if (isNil "_customRankIcons") then {
// default rank icons
format ["\A3\Ui_f\data\GUI\Cfg\Ranks\%1_gs.paa", rank _target] // return
+ } else {
+ _customRankIcons param [ALL_RANKS find rank _target, ""] // return
};
};
};
diff --git a/addons/nametags/functions/fnc_onDraw3d.sqf b/addons/nametags/functions/fnc_onDraw3d.sqf
index f831a3209fc..75a24e528d8 100644
--- a/addons/nametags/functions/fnc_onDraw3d.sqf
+++ b/addons/nametags/functions/fnc_onDraw3d.sqf
@@ -37,17 +37,17 @@ if (GVAR(showPlayerNames) == 4) then {
private _camPosAGL = positionCameraToWorld [0, 0, 0];
if !((_camPosAGL select 0) isEqualType 0) exitWith {}; // handle RHS / bugged vehicle slots
-private _camPosASL = AGLtoASL _camPosAGL;
+private _camPosASL = AGLToASL _camPosAGL;
// Show nametag for the unit behind the cursor or its commander
if (_enabledTagsCursor) then {
private _target = cursorTarget;
if !(_target isKindOf "CAManBase") then {
// When cursorTarget is on a vehicle show the nametag for the commander.
- if !(_target in allUnitsUAV) then {
- _target = effectiveCommander _target;
- } else {
+ if (_target in allUnitsUAV) then {
_target = objNull;
+ } else {
+ _target = effectiveCommander _target;
};
};
if (isNull _target) exitWith {};
@@ -78,6 +78,7 @@ if (_enabledTagsCursor) then {
if (_enabledTagsNearby) then {
// Find valid targets and cache them
private _targets = [[], {
+ //IGNORE_PRIVATE_WARNING ["_camPosAGL", "_maxDistance"];
private _nearMen = _camPosAGL nearObjects ["CAManBase", _maxDistance + 7];
_nearMen = _nearMen select {
_x != ACE_player &&
@@ -115,7 +116,7 @@ if (_enabledTagsNearby) then {
private _screenPos = worldToScreen (_target modelToWorld (_target selectionPosition "head"));
if (_screenPos isNotEqualTo []) then {
// Distance from center / half of screen width
- _centerOffsetFactor = 1 - ((_screenPos distance2D [0.5, 0.5]) / (safezoneW / 3));
+ _centerOffsetFactor = 1 - ((_screenPos distance2D [0.5, 0.5]) / (safeZoneW / 3));
} else {
_centerOffsetFactor = 0;
};
diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml
index 9f410c6a75b..1aed143b18e 100644
--- a/addons/nametags/stringtable.xml
+++ b/addons/nametags/stringtable.xml
@@ -29,7 +29,7 @@
Ez a modul lehetővé teszi a névcímkék beállításainak testreszabását.
Этот модуль позволяет настроить опции и дистанцию отображения имен игроков.
Questo modulo ti consente di personalizzare le impostazioni ed la distanza visibile delle Etichette Nomi
- このモジュールを使用すると、ネーム タグの設定と範囲を調整できます。
+ このモジュールを使用すると、ネーム タグの範囲と設定を調整できます。
이 모듈은 당신이 이름표의 범위를 임의로 수정할 수 있게 해줍니다.
这个模块允许您设定名字和显示范围等设定
這個模塊允許您設定名稱和顯示範圍等設定
diff --git a/addons/nightvision/RscTitles.hpp b/addons/nightvision/RscTitles.hpp
index 1a4d030e015..f3b1d1870f6 100644
--- a/addons/nightvision/RscTitles.hpp
+++ b/addons/nightvision/RscTitles.hpp
@@ -28,13 +28,13 @@ class RscTitles {
idc = 1002;
text = "#(argb,8,8,3)color(0,0,0,1)";
x = "safeZoneXAbs";
- Y = "safezoneY";
- W = "(safezoneX - safeZoneXAbs) * ((getResolution select 4)/(16/3))";
+ Y = "safeZoneY";
+ W = "(safeZoneX - safeZoneXAbs) * ((getResolution select 4)/(16/3))";
H = "safeZoneH";
};
class trippleHeadRight: trippleHeadLeft {
idc = 1003;
- x = "safeZoneXAbs + safeZoneWAbs - (safezoneX - safeZoneXABS) * ((getResolution select 4)/(16/3))";
+ x = "safeZoneXAbs + safeZoneWAbs - (safeZoneX - safeZoneXABS) * ((getResolution select 4)/(16/3))";
};
};
};
diff --git a/addons/nightvision/XEH_postInit.sqf b/addons/nightvision/XEH_postInit.sqf
index 5a1aa19b82e..2933877771c 100644
--- a/addons/nightvision/XEH_postInit.sqf
+++ b/addons/nightvision/XEH_postInit.sqf
@@ -21,6 +21,9 @@ GVAR(ppeffectRadialBlur) = -1;
GVAR(ppeffectColorCorrect) = -1;
GVAR(ppeffectBlur) = -1;
+if (isNil QGVAR(const_MaxBrightness)) then { GVAR(const_MaxBrightness) = 0; };
+if (isNil QGVAR(const_MinBrightness)) then { GVAR(const_MinBrightness) = -6; };
+
GVAR(isUsingMagnification) = false;
["CBA_settingsInitialized", {
diff --git a/addons/nightvision/functions/fnc_changeNVGBrightness.sqf b/addons/nightvision/functions/fnc_changeNVGBrightness.sqf
index 1697fa907e8..d0b210fe295 100644
--- a/addons/nightvision/functions/fnc_changeNVGBrightness.sqf
+++ b/addons/nightvision/functions/fnc_changeNVGBrightness.sqf
@@ -23,7 +23,7 @@ private _effectsEnabled = GVAR(effectScaling) != 0;
private _defaultBrightness = [-3, 0] select _effectsEnabled;
private _brightness = _player getVariable [QGVAR(NVGBrightness), _defaultBrightness];
-_brightness = ((_brightness + _changeInBrightness) min 0) max -6;
+_brightness = ((_brightness + _changeInBrightness) min GVAR(const_MaxBrightness)) max GVAR(const_MinBrightness);
_player setVariable [QGVAR(NVGBrightness), _brightness, false];
// Display default setting as 0
diff --git a/addons/nightvision/functions/fnc_pfeh.sqf b/addons/nightvision/functions/fnc_pfeh.sqf
index dbd101631cd..9d5f6e93bb8 100644
--- a/addons/nightvision/functions/fnc_pfeh.sqf
+++ b/addons/nightvision/functions/fnc_pfeh.sqf
@@ -163,7 +163,9 @@ if (CBA_missionTime < GVAR(nextEffectsUpdate)) then {
};
_fogApply = linearConversion [0, 1, GVAR(priorFog) select 0, (GVAR(fogScaling) * _fogApply), 1]; // mix in old fog if present
- GVAR(nvgFog) = [_fogApply, 0, 0];
+ GVAR(nvgFog) = fogParams;
+ GVAR(nvgFog) set [0, _fogApply];
+
0 setFog GVAR(nvgFog)
};
diff --git a/addons/nightvision/functions/fnc_refreshGoggleType.sqf b/addons/nightvision/functions/fnc_refreshGoggleType.sqf
index ccfbd017b6f..2c7dedaa834 100644
--- a/addons/nightvision/functions/fnc_refreshGoggleType.sqf
+++ b/addons/nightvision/functions/fnc_refreshGoggleType.sqf
@@ -106,7 +106,7 @@ if (_borderImage == "") then {
_borderImageCtrl ctrlSetFade ([.15, 0] select _eyeCups);
#define BORDER_SIZE 3
- GVAR(defaultPositionBorder) = [safezoneX - (((BORDER_SIZE * 0.75) * safezoneH) - safezoneW) / 2, safezoneY - ((BORDER_SIZE - 1) / 2) * safezoneH, (BORDER_SIZE * 0.75) * safezoneH, BORDER_SIZE * safezoneH];
+ GVAR(defaultPositionBorder) = [safeZoneX - (((BORDER_SIZE * 0.75) * safeZoneH) - safeZoneW) / 2, safeZoneY - ((BORDER_SIZE - 1) / 2) * safeZoneH, (BORDER_SIZE * 0.75) * safeZoneH, BORDER_SIZE * safeZoneH];
[_borderImageCtrl, GVAR(defaultPositionBorder), _scale] call FUNC(scaleCtrl);
};
@@ -119,7 +119,7 @@ if (_hideHex) then {
_hexCtrl ctrlSetText QPATHTOF(data\nvg_mask_hexes_thin.paa);
#define HEX_SIZE 1.5
- GVAR(defaultPositionHex) = [safezoneX - (((HEX_SIZE * 0.75) * safezoneH) - safezoneW) / 2, safezoneY - ((HEX_SIZE - 1) / 2) * safezoneH, (HEX_SIZE * 0.75) * safezoneH, HEX_SIZE * safezoneH];
+ GVAR(defaultPositionHex) = [safeZoneX - (((HEX_SIZE * 0.75) * safeZoneH) - safeZoneW) / 2, safeZoneY - ((HEX_SIZE - 1) / 2) * safeZoneH, (HEX_SIZE * 0.75) * safeZoneH, HEX_SIZE * safeZoneH];
[_hexCtrl, GVAR(defaultPositionHex), _scale] call FUNC(scaleCtrl);
};
diff --git a/addons/nightvision/stringtable.xml b/addons/nightvision/stringtable.xml
index 1c1cd61ba7a..1911681dd68 100644
--- a/addons/nightvision/stringtable.xml
+++ b/addons/nightvision/stringtable.xml
@@ -28,6 +28,7 @@
夜视仪(一代,棕色)
아투경 (1세대, 갈색)
Gafas de visión nocturna (Gen1, Marrón)
+ Óculos de Visão Noturna (Gen1, Marrom)
NV Goggles (Gen1, Black)
@@ -40,6 +41,7 @@
夜视仪(一代,黑色)
아투경 (1세대, 검정)
Gafas de visión nocturna (Gen1, Negro)
+ Óculos de Visão Noturna (Gen1, Preto)
NV Goggles (Gen1, Green)
@@ -52,6 +54,7 @@
夜视仪(一代,绿色)
아투경 (1세대, 녹색)
Gafas de visión nocturna (Gen1, Verde)
+ Óculos de Visão Noturna (Gen1, Verde)
NV Goggles (Gen2, Brown)
@@ -64,6 +67,7 @@
夜视仪(二代,棕色)
아투경 (2세대, 갈색)
Gafas de visión nocturna (Gen2, Marrón)
+ Óculos de Visão Noturna (Gen2, Marrom)
NV Goggles (Gen2, Black)
@@ -76,6 +80,7 @@
夜视仪(二代,黑色)
아투경 (2세대, 검정)
Gafas de visión nocturna (Gen2, Negro)
+ Óculos de Visão Noturna (Gen2, Preto)
NV Goggles (Gen2, Green)
@@ -88,6 +93,7 @@
夜视仪(二代,绿色)
아투경 (2세대, 녹색)
Gafas de visión nocturna (Gen2, Verde)
+ Óculos de Visão Noturna (Gen2, Verde)
NV Goggles (Gen3)
@@ -96,7 +102,7 @@
NS-Brille (3. Gen.)
Visore Notturno (Gen3)
Gogle noktowizyjne (Gen3)
- Óculos de visão noturna (Gen3)
+ Óculos de Visão Noturna (Gen3)
ПНВ (Gen3)
Gafas de visión nocturna (Gen3)
Éjjellátó szemüveg (3. Gen.)
@@ -113,7 +119,7 @@
NS-Brille (3. Gen., braun)
Visore Notturno (Gen3, Marrone)
Gogle noktowizyjne (Gen3, Brązowe)
- Óculos de visão noturna (Gen3, marrons)
+ Óculos de Visão Noturna (Gen3, Marrom)
ПНВ (Gen3, Коричневый)
Gafas de visión nocturna (Gen3, Marrón)
Éjjellátó szemüveg (3. Gen., barna)
@@ -133,6 +139,7 @@
JVN (Gen3, marron, WP)
ПНВ (Gen3, Коричневый, БФ)
Gafas de visión nocturna (Gen3, Marrón, FB)
+ Óculos de Visão Noturna (Gen3, Marrom, FB)
Night Vision Goggles, White Phosphor
@@ -144,6 +151,7 @@
Jumelles Vision Nocturne, Phosphore blanc
Очки ночного видения, белый фосфор
Gafas de Visión Nocturna, Fósforo Blanco
+ Óculos de Visão Nortuna, Fósforo Branco
NV Goggles (Gen3, Green)
@@ -152,7 +160,7 @@
NS-Brille (3. Gen., grün)
Visore Notturno (Gen3, Verde)
Gogle noktowizyjne (Gen3, Zielone)
- Óculos de visão noturna (Gen3, verdes)
+ Óculos de Visão Noturna (Gen3, verdes)
ПНВ (Gen3, Зелёный)
Gafas de visión nocturna (Gen3, Verde)
Éjjellátó szemüveg (3. Gen., zöld)
@@ -172,6 +180,7 @@
JVN (Gen3, vertes, WP)
ПНВ (Gen3, Зелёный, БФ)
Gafas de visión nocturna (Gen3, Verde, FB)
+ Óculos de Visão Noturna (Gen3, Verde, FB)
NV Goggles (Gen3, Black)
@@ -180,7 +189,7 @@
NS-Brille (3. Gen., schwarz)
Visore Notturno (Gen3, Nero)
Gogle noktowizyjne (Gen3, Czarne)
- Óculos de visão noturna (Gen3, pretos)
+ Óculos de Visão Noturna (Gen3, Preto)
ПНВ (Gen3, Чёрный)
Gafas de visión nocturna (Gen3, Negro)
Éjjellátó szemüveg (3. Gen., fekete)
@@ -200,6 +209,7 @@
JVN (Gen3, noires, WP)
ПНВ (Gen3, Чёрный, БФ)
Gafas de visión nocturna (Gen3, Negro, FB)
+ Óculos de Visão Noturna (Gen3, Preto, FB)
NV Goggles (Gen4, Brown)
@@ -212,6 +222,7 @@
夜视仪(四代,棕色)
야투경 (4세대, 갈색)
Gafas de visión nocturna (Gen4, Marrón)
+ Óculos de Visão Noturna (Gen4, Marrom)
NV Goggles (Gen4, Brown, WP)
@@ -223,6 +234,7 @@
JVN (Gen4, marron, WP)
ПНВ (Gen4, Коричневый, БФ)
Gafas de visión nocturna (Gen4, Marrón, FB)
+ Óculos de Visão Noturna (Gen4, Marrom, FB)
NV Goggles (Gen4, Black)
@@ -235,6 +247,7 @@
夜视仪(四代,黑色)
야투경 (4세대, 검정)
Gafas de visión nocturna (Gen4, Negro)
+ Óculos de Visão Noturna (Gen4, Preto)
NV Goggles (Gen4, Black, WP)
@@ -246,6 +259,7 @@
JVN (Gen4, noires, WP)
ПНВ (Gen4, Чёрный, БФ)
Gafas de visión nocturna (Gen4, Negro, FB)
+ Óculos de Visão Noturna (Gen4, Preto, FB)
NV Goggles (Gen4, Green)
@@ -258,6 +272,7 @@
夜视仪(四代,绿色)
야투경 (4세대, 녹색)
Gafas de visión nocturna (Gen4, Verde)
+ Óculos de Visão Noturna (Gen4, Verde)
NV Goggles (Gen4, Green, WP)
@@ -269,6 +284,7 @@
JVN (Gen4, vertes, WP)
ПНВ (Gen4, Зелёный, БФ)
Gafas de visión nocturna (Gen4, Verde, FB)
+ Óculos de Visão Noturna (Gen4, Verde, FB)
NV Goggles (Wide, Brown)
@@ -281,6 +297,7 @@
夜视仪(宽,棕色)
야투경 (넓음, 갈색)
Gafas de visión nocturna (Panorámicas, Marrón)
+ Óculos de Visão Noturna (Panorâmico, Marrom)
NV Goggles (Wide, Brown, WP)
@@ -292,6 +309,7 @@
JVN (Large, marron, WP)
ПНВ (Широкий, Коричневый, БФ)
Gafas de visión nocturna (Panorámicas, Marrón, FB)
+ Óculos de Visão Noturna (Panorâmico, Marrom, FB)
NV Goggles (Wide, Black)
@@ -304,6 +322,7 @@
夜视仪(宽,黑色)
야투경 (넓음, 검정)
Gafas de visión nocturna (Panorámicas, Negro)
+ Óculos de Visão Noturna (Panorâmico, Preto)
NV Goggles (Wide, Black, WP)
@@ -315,6 +334,7 @@
JVN (Large, noires, WP)
ПНВ (Широкий, Чёрный, БФ)
Gafas de visión nocturna (Panorámicas, Negro, FB)
+ Óculos de Visão Noturna (Panorâmico, Preto, FB)
NV Goggles (Wide, Green)
@@ -327,6 +347,7 @@
夜视仪(宽,绿色)
야투경 (넓음, 녹색)
Gafas de visión nocturna (Panorámicas, Verde)
+ Óculos de Visão Noturna (Panorâmico, Verde)
NV Goggles (Wide, Green, WP)
@@ -338,6 +359,7 @@
JVN (Large, vertes, WP)
ПНВ (Широкий, Зелёный, БФ)
Gafas de visión nocturna (Panorámicas, Verde, FB)
+ Óculos de Visão Noturna (Panorâmico, Verde, FB)
Brightness: %1
@@ -365,7 +387,7 @@
Augmenter la luminosité des JVN
Увеличить яркость ПНВ
Éjjellátó fényerejének növelése
- Aumentar Luminosidade do EVN
+ Aumentar Luminosidade do OVN
Aumenta la luminosità dell'NVG
暗視装置の明度を上げる
야투경 밝기 높이기
@@ -382,7 +404,7 @@
Abaisser la luminosité des JVN
Уменьшить яркость ПНВ
Éjjellátó fényerejének csökkentése
- Diminuir Luminosidade do EVN
+ Diminuir Luminosidade do OVN
Riduci la luminosità dell'NVG
暗視装置の明度を下げる
야투경 밝기 줄이기
@@ -598,6 +620,7 @@
Génération de jumelles de vision nocturne
Генерация ночного видения
Generación de Visión Nocturna
+ Geração de Visão Noturna
Gen %1
@@ -609,6 +632,7 @@
Gen %1
Генерация %1
Gen %1
+ Gen %1
diff --git a/addons/nlaw/ACE_GuidanceConfig.hpp b/addons/nlaw/ACE_GuidanceConfig.hpp
index e04753d6816..6003586fe86 100644
--- a/addons/nlaw/ACE_GuidanceConfig.hpp
+++ b/addons/nlaw/ACE_GuidanceConfig.hpp
@@ -12,3 +12,9 @@ class EGVAR(missileguidance,SeekerTypes) {
functionName = QFUNC(seeker);
};
};
+class EGVAR(missileguidance,NavigationTypes) {
+ class GVAR(PLOS) {
+ functionName = QFUNC(navigation);
+ onFired = QFUNC(navigation_onFired);
+ };
+};
diff --git a/addons/nlaw/CfgAmmo.hpp b/addons/nlaw/CfgAmmo.hpp
index b579ebeb065..650fa148873 100644
--- a/addons/nlaw/CfgAmmo.hpp
+++ b/addons/nlaw/CfgAmmo.hpp
@@ -1,39 +1,11 @@
+class ace_missileguidance_type_Nlaw;
class CfgAmmo {
class M_NLAW_AT_F;
class ACE_NLAW: M_NLAW_AT_F {
hit = 400; // Default was 500
indirectHit = 20; // Default was 15
- class ace_missileguidance {
+ class ace_missileguidance: ace_missileguidance_type_Nlaw {
enabled = 1;
-
- minDeflection = 0.0005; // Minium flap deflection for guidance
- maxDeflection = 0.01; // Maximum flap deflection for guidance
- incDeflection = 0.0005; // The incrmeent in which deflection adjusts.
-
- canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
-
- // Guidance type for munitions
- defaultSeekerType = QGVAR(seeker);
- seekerTypes[] = {QGVAR(seeker)};
-
- defaultSeekerLockMode = "LOBL";
- seekerLockModes[] = {"LOBL"};
-
- seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
- seekerAngle = 45; // Angle in front of the missile which can be searched
- seekerAccuracy = 1; // seeker accuracy multiplier
-
- seekerMinRange = 0;
- seekerMaxRange = 10; // Range from the missile which the seeker can visually search
-
- // Attack profile type selection
- defaultAttackProfile = QGVAR(directAttack);
- attackProfiles[] = {QGVAR(directAttack), QGVAR(overflyTopAttack)};
- useModeForAttackProfile = 1;
- showHintOnCycle = 1;
-
- // Run once at fired event
- onFired = QFUNC(onFired);
};
};
diff --git a/addons/nlaw/XEH_PREP.hpp b/addons/nlaw/XEH_PREP.hpp
index aad1e57efb2..1cd8dbc3c59 100644
--- a/addons/nlaw/XEH_PREP.hpp
+++ b/addons/nlaw/XEH_PREP.hpp
@@ -4,3 +4,5 @@ PREP(attackProfile);
PREP(keyDown);
PREP(onFired);
PREP(seeker);
+PREP(navigation);
+PREP(navigation_onFired);
diff --git a/addons/nlaw/XEH_postInit.sqf b/addons/nlaw/XEH_postInit.sqf
index 885e2d5e2f2..5e3f35572c8 100644
--- a/addons/nlaw/XEH_postInit.sqf
+++ b/addons/nlaw/XEH_postInit.sqf
@@ -22,24 +22,28 @@ GVAR(pitchChange) = 0;
// Visual debuging, idealy used with a moving vehicle called "testTarget"
#ifdef DRAW_NLAW_INFO
+GVAR(debug_firedPrediction) = [];
addMissionEventHandler ["Draw3d", {
+ // BLACK - On fired path prediction
+ { drawIcon3D _x; } forEach GVAR(debug_firedPrediction);
+
// GREEN - Draw an object called "testTarget"'s aim pos and 1 sec aimpos predicted by velocity
if ((!isNil "testTarget") && {!isNull testTarget}) then {
{
- drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [0,1,0,1], ASLtoAGL ((aimPos testTarget) vectorAdd ((velocity testTarget) vectorMultiply _x)), 0.75, 0.75, 0, format ["%1", _x], 1, 0.025, "TahomaB"];
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [0,1,0,1], ASLToAGL ((aimPos testTarget) vectorAdd ((velocity testTarget) vectorMultiply _x)), 0.75, 0.75, 0, format ["%1", _x], 1, 0.025, "TahomaB"];
} forEach [0, 1, 2, 3];
};
// RED - If lock key is down, draw weapon dir and predicted path at various times
if (GVAR(yawChange) != 0) then {
{
- private _viewASL = AGLtoASL positionCameraToWorld [0,0,0];
+ private _viewASL = AGLToASL positionCameraToWorld [0,0,0];
private _viewDir = ACE_player weaponDirection (currentWeapon ACE_player);
(_viewDir call CBA_fnc_vect2Polar) params ["", "_yaw", "_pitch"];
private _realYaw = _yaw + GVAR(yawChange) * _x;
private _realPitch = _pitch + GVAR(pitchChange) * _x;
private _returnTargetPos = _viewASL vectorAdd ([1000, _realYaw, _realPitch] call CBA_fnc_polar2vect);
- drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,1], ASLtoAGL _returnTargetPos, 0.75, 0.75, 0, format ["%1", _x], 1, 0.025, "TahomaB"];
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,1], ASLToAGL _returnTargetPos, 0.75, 0.75, 0, format ["%1", _x], 1, 0.025, "TahomaB"];
} forEach [0, 1, 2, 3];
};
}];
diff --git a/addons/nlaw/functions/fnc_attackProfile.sqf b/addons/nlaw/functions/fnc_attackProfile.sqf
index 9628974800c..8f06e26f9c4 100644
--- a/addons/nlaw/functions/fnc_attackProfile.sqf
+++ b/addons/nlaw/functions/fnc_attackProfile.sqf
@@ -18,14 +18,13 @@
*/
params ["_seekerTargetPos", "_args", "_attackProfileStateParams"];
+
+#ifdef DRAW_NLAW_INFO
_args params ["_firedEH", "_launchParams"];
_launchParams params ["","_targetLaunchParams", "", "_attackProfile"];
_targetLaunchParams params ["", "", "_launchPos"];
_firedEH params ["","","","","","","_projectile"];
-// Use seeker (if terminal)
-if (_seekerTargetPos isNotEqualTo [0,0,0]) exitWith {_seekerTargetPos};
-
_attackProfileStateParams params ["_startTime", "_startLOS", "_yawChange", "_pitchChange"];
(_startLOS call CBA_fnc_vect2Polar) params ["", "_yaw", "_pitch"];
@@ -36,25 +35,16 @@ private _flightTime = CBA_missionTime - _startTime;
private _realYaw = _yaw + _yawChange * _flightTime;
private _realPitch = _pitch + _pitchChange * _flightTime;
-private _returnTargetPos = _launchPos vectorAdd ([_distanceFromLaunch, _realYaw, _realPitch] call CBA_fnc_polar2vect);
-
-if (_attackProfile == QGVAR(overflyTopAttack)) then { // Add 2m height in OTA attack mode
- _returnTargetPos = _returnTargetPos vectorAdd [0,0,2];
-};
-
-
-#ifdef DRAW_NLAW_INFO
-drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,1,1], ASLtoAGL _launchPos, 0.75, 0.75, 0, "LAUNCH", 1, 0.025, "TahomaB"];
-drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [0,1,1,1], ASLtoAGL (_launchPos vectorAdd (_startLOS vectorMultiply (_distanceFromLaunch + 50))), 0.75, 0.75, 0, "Original LOS", 1, 0.025, "TahomaB"];
-drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,0,1], ASLtoAGL (_launchPos vectorAdd ([_distanceFromLaunch + 50, _realYaw, _realPitch] call CBA_fnc_polar2vect)), 0.75, 0.75, 0, format ["Predicted @%1sec",(floor(_flightTime * 10)/10)], 1, 0.025, "TahomaB"];
-drawLine3D [ASLtoAGL _launchPos, ASLtoAGL (_launchPos vectorAdd (_startLOS vectorMultiply (_distanceFromLaunch + 50))), [1,0,0,1]];
-drawLine3D [ASLtoAGL _launchPos, ASLtoAGL (_launchPos vectorAdd ([_distanceFromLaunch + 50, _realYaw, _realPitch] call CBA_fnc_polar2vect)), [1,1,0,1]];
+drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,1,1], ASLToAGL _launchPos, 0.75, 0.75, 0, "LAUNCH", 1, 0.025, "TahomaB"];
+drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [0,1,1,1], ASLToAGL (_launchPos vectorAdd (_startLOS vectorMultiply (_distanceFromLaunch + 50))), 0.75, 0.75, 0, "Original LOS", 1, 0.025, "TahomaB"];
+drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,0,1], ASLToAGL (_launchPos vectorAdd ([_distanceFromLaunch + 50, _realYaw, _realPitch] call CBA_fnc_polar2vect)), 0.75, 0.75, 0, format ["Predicted @%1sec",(floor(_flightTime * 10)/10)], 1, 0.025, "TahomaB"];
+drawLine3D [ASLToAGL _launchPos, ASLToAGL (_launchPos vectorAdd (_startLOS vectorMultiply (_distanceFromLaunch + 50))), [1,0,0,1]];
+drawLine3D [ASLToAGL _launchPos, ASLToAGL (_launchPos vectorAdd ([_distanceFromLaunch + 50, _realYaw, _realPitch] call CBA_fnc_polar2vect)), [1,1,0,1]];
private _test = lineIntersectsSurfaces [_launchPos, _launchPos vectorAdd (_startLOS vectorMultiply 3000), player, _projectile];
if ((count _test) > 0) then {
- private _posAGL = ASLtoAGL ((_test select 0) select 0);
+ private _posAGL = ASLToAGL ((_test select 0) select 0);
drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,1], _posAGL, 0.75, 0.75, 0, "Original Impact", 1, 0.025, "TahomaB"];
};
#endif
-// TRACE_1("Adjusted target position",_returnTargetPos);
-_returnTargetPos;
+[0, 0, 1]
diff --git a/addons/nlaw/functions/fnc_keyDown.sqf b/addons/nlaw/functions/fnc_keyDown.sqf
index 5b75c721406..aee9739474b 100644
--- a/addons/nlaw/functions/fnc_keyDown.sqf
+++ b/addons/nlaw/functions/fnc_keyDown.sqf
@@ -74,7 +74,7 @@ playSound "ACE_Sound_Click";
_args set [1, _yaw];
_args set [2, _pitch];
- #ifdef DEBUG_MODE_FULL
+ #ifdef DRAW_NLAW_INFO
hintSilent format ["Instantaneous\nYaw: %1\n Pitch: %2\nGVAR\nYaw: %3\nPitch: %4", _yawChange, _pitchChange, GVAR(yawChange), GVAR(pitchChange)];
#endif
}, .25, [CBA_missionTime, _yaw, _pitch, true]] call CBA_fnc_addPerFrameHandler;
diff --git a/addons/nlaw/functions/fnc_navigation.sqf b/addons/nlaw/functions/fnc_navigation.sqf
new file mode 100644
index 00000000000..7572b44d6f3
--- /dev/null
+++ b/addons/nlaw/functions/fnc_navigation.sqf
@@ -0,0 +1,78 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Attempts to hold angle as fed to by seeker. Does so with a simple proportional controller
+ *
+ * Arguments:
+ * Guidance Arg Array
+ *
+ * Return Value:
+ * Commanded acceleration normal to LOS in world space
+ *
+ * Example:
+ * [] call ace_missileguidance_fnc_navigationType_line
+ *
+ * Public: No
+ */
+// arbitrary constant
+#define PROPORTIONALITY_CONSTANT 20
+params ["_args", "_timestep", "_seekerTargetPos", "_profileAdjustedTargetPos", "_targetData", "_navigationParams"];
+_args params ["_firedEH"];
+_firedEH params ["","","","","","","_projectile"];
+
+_navigationParams params ["_yawChange", "_pitchChange", "_lastPitch", "_lastYaw", "_initialPitch", "_pitchUp", "_lastYawRateDifference"];
+
+// for some reason we need to multiply this. I don't know why, but it just works
+_pitchChange = _pitchChange * 1.5;
+_yawChange = _yawChange * 1.5;
+
+((velocity _projectile) call CBA_fnc_vect2polar) params ["", "_currentYaw", "_currentPitch"];
+
+private _pitchRate = if (_timestep == 0) then {
+ 0
+} else {
+ (_currentPitch - _lastPitch) / _timestep
+};
+_navigationParams set [2, _currentPitch];
+
+private _pitchModifier = if (_pitchChange == 0) then {
+ 1
+} else {
+ abs (_pitchRate / _pitchChange)
+};
+private _desiredPitchChange = (_pitchChange - _pitchRate) * PROPORTIONALITY_CONSTANT * _pitchModifier;
+_desiredPitchChange = _desiredPitchChange + _pitchUp * (_initialPitch - _currentPitch) * PROPORTIONALITY_CONSTANT * _pitchModifier;
+
+private _yawRate = if (_timestep == 0) then {
+ 0
+} else {
+ (_currentYaw - _lastYaw) / _timestep
+};
+_navigationParams set [3, _currentYaw];
+
+private _yawModifier = if (_yawChange == 0) then {
+ 1
+} else {
+ abs (_yawRate / _yawChange)
+};
+
+private _yawRateDifference = _yawChange - _yawRate;
+private _yawChangeDerivative = if (_timestep == 0) then {
+ 0
+} else {
+ (_yawRateDifference - _lastYawRateDifference) / _timestep
+};
+_navigationParams set [6, _yawRateDifference];
+
+private _desiredYawChange = _yawRateDifference * PROPORTIONALITY_CONSTANT + _yawRateDifference * 2;
+
+#ifdef DRAW_NLAW_INFO
+drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,1,1], ASLToAGL getPosASLVisual _projectile, 0.75, 0.75, 0, format ["dP [%1] dY: [%2]", _desiredPitchChange, _desiredYawChange], 1, 0.025, "TahomaB"];
+drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,1,1], [0, 0, 1] vectorAdd ASLToAGL getPosASLVisual _projectile, 0.75, 0.75, 0, format ["pitch proportional [%1] yaw proportional [%2]", _pitchModifier, _yawModifier], 1, 0.025, "TahomaB"];
+#endif
+
+TRACE_4("nlaw pitch/yaw info",_currentPitch,_lastPitch,_currentYaw,_lastYaw);
+TRACE_6("nlaw navigation",_yawChange,_desiredYawChange,_pitchChange,_desiredPitchChange,_yawRate,_pitchRate);
+
+_projectile vectorModelToWorldVisual [_yawChange + _desiredYawChange, 0, _pitchChange + _desiredPitchChange]
+
diff --git a/addons/nlaw/functions/fnc_navigation_onFired.sqf b/addons/nlaw/functions/fnc_navigation_onFired.sqf
new file mode 100644
index 00000000000..895d5ff78b3
--- /dev/null
+++ b/addons/nlaw/functions/fnc_navigation_onFired.sqf
@@ -0,0 +1,70 @@
+#include "..\script_component.hpp"
+/*
+ * Author: PabstMirror
+ * Sets up missile guidance state arrays (called from missileGuidance's onFired).
+ *
+ * Arguments:
+ * Guidance Arg Array
+ *
+ * Return Value:
+ * Navigation Parameters
+ *
+ * Example:
+ * [] call ace_nlaw_fnc_onFired
+ *
+ * Public: No
+ */
+
+params ["_firedEH", "_launchParams", "_flightParams", "_seekerParams", "_stateParams"];
+_firedEH params ["_shooter","","","","","","_projectile"];
+_launchParams params ["","_targetLaunchParams","","_attackProfile"];
+_targetLaunchParams params ["_target"];
+_stateParams params ["", "", "", "", "_navigationParams"];
+
+// Reset _launchPos origin as projectile's height instead of player's foot
+_targetLaunchParams set [2, getPosASL _projectile];
+
+// Get state params:
+TRACE_3("start of attack profile",_attackProfile,_shooter,vectorDir _projectile);
+
+private _firedLOS = _shooter weaponDirection (currentWeapon _shooter);
+private _yawChange = 0;
+private _pitchChange = 0;
+
+if (_shooter == ACE_player) then {
+ TRACE_2("isPlayer",GVAR(yawChange),GVAR(pitchChange));
+ _yawChange = GVAR(yawChange);
+ _pitchChange = GVAR(pitchChange);
+ TRACE_1("los check",_firedLOS call CBA_fnc_vect2Polar);
+} else {
+ if ((!isNil "_target") && {!isNull _target}) then {
+ _firedLOS = (getPosASL _projectile) vectorFromTo (aimPos _target);
+ (((eyePos _shooter) vectorFromTo (aimPos _target)) call CBA_fnc_vect2Polar) params ["", "_startYaw", "_startPitch"];
+ // Add some random error to AI's velocity prediction:
+ private _random = random [(_shooter skillFinal "aimingAccuracy") min 0.9, 1, 2-((_shooter skillFinal "aimingAccuracy") min 0.9)];
+ (((eyePos _shooter) vectorFromTo ((aimPos _target) vectorAdd ((velocity _target) vectorMultiply (_random)))) call CBA_fnc_vect2Polar) params ["", "_predictedYaw", "_predictedPitch"];
+ _yawChange = ([_predictedYaw - _startYaw] call CBA_fnc_simplifyAngle180);
+ _pitchChange = ([_predictedPitch - _startPitch] call CBA_fnc_simplifyAngle180);
+ TRACE_1("AI",_target);
+ } else {
+ TRACE_1("AI - no target",_target);
+ };
+};
+
+// Limit Max Deflection
+//_yawChange = -10 max _yawChange min 10;
+//_pitchChange = -10 max _pitchChange min 10;
+
+((velocity _projectile) call CBA_fnc_vect2polar) params ["", "_currentYaw", "_currentPitch"];
+((ACE_player weaponDirection (currentWeapon ACE_player)) call CBA_fnc_vect2Polar) params ["", "_yaw", "_pitch"];
+
+TRACE_5("attackProfileStateParams",_firedLOS,_yawChange,_pitchChange,_currentPitch,_currentYaw);
+_navigationParams set [0, _yawChange];
+_navigationParams set [1, _pitchChange];
+_navigationParams set [2, _currentPitch]; // last pitch
+_navigationParams set [3, _currentYaw]; // last yaw
+_navigationParams set [4, _pitch]; // initial pitch
+_navigationParams set [5, 0]; // whether or not to zero out the pitch
+_navigationParams set [6, 0];
+_navigationParams
+
diff --git a/addons/nlaw/functions/fnc_onFired.sqf b/addons/nlaw/functions/fnc_onFired.sqf
index 11b38a1da03..cbaa2cfc0a4 100644
--- a/addons/nlaw/functions/fnc_onFired.sqf
+++ b/addons/nlaw/functions/fnc_onFired.sqf
@@ -19,7 +19,7 @@ params ["_firedEH", "_launchParams", "_flightParams", "_seekerParams", "_statePa
_firedEH params ["_shooter","","","","","","_projectile"];
_launchParams params ["","_targetLaunchParams","","_attackProfile"];
_targetLaunchParams params ["_target"];
-_stateParams params ["", "", "_attackProfileStateParams"];
+_stateParams params ["", "_seekerStateParams", "_attackProfileStateParams"];
// Reset _launchPos origin as projectile's height instead of player's foot
_targetLaunchParams set [2, getPosASL _projectile];
@@ -27,7 +27,7 @@ _targetLaunchParams set [2, getPosASL _projectile];
// Get state params:
TRACE_3("start of attack profile",_attackProfile,_shooter,vectorDir _projectile);
-private _firedLOS = _shooter weaponDirection (currentWeapon _shooter);
+private _firedLOS = vectorDir _projectile;
private _yawChange = 0;
private _pitchChange = 0;
@@ -36,6 +36,23 @@ if (_shooter == ACE_player) then {
_yawChange = GVAR(yawChange);
_pitchChange = GVAR(pitchChange);
TRACE_1("los check",_firedLOS call CBA_fnc_vect2Polar);
+
+ #ifdef DRAW_NLAW_INFO
+ systemChat format ["YAW [%1]", _yawChange];
+ systemChat format ["PITCH [%1]", _pitchChange];
+ GVAR(debug_firedPrediction) = [];
+ private _debugPos = getPosASL _projectile;
+ ((ACE_player weaponDirection (currentWeapon ACE_player)) call CBA_fnc_vect2Polar) params ["", "_debugYaw", "_debugPitch"];
+ private _distance = 0;
+ for "_x" from 0 to 6 step 0.1 do {
+ private _debugAproxVel = linearConversion [0, 1, 5, 40, 170, true];
+ _distance = _distance + _debugAproxVel * 0.1;
+ private _debugYaw = _debugYaw + _yawChange * _x;
+ private _debugPitch = _debugPitch + _pitchChange * _x;
+ private _debugPos = _debugPos vectorAdd ([_distance, _debugYaw, _debugPitch] call CBA_fnc_polar2vect);
+ GVAR(debug_firedPrediction) pushBack ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [0,0,0,1], ASLToAGL _debugPos, 0.5, 0.5, 0, format ["%1", _x], 1, 0.025, "TahomaB"];
+ };
+ #endif
} else {
if ((!isNil "_target") && {!isNull _target}) then {
_firedLOS = (getPosASL _projectile) vectorFromTo (aimPos _target);
@@ -55,6 +72,10 @@ if (_shooter == ACE_player) then {
_yawChange = -10 max _yawChange min 10;
_pitchChange = -10 max _pitchChange min 10;
+_seekerStateParams set [2, _yawChange];
+_seekerStateParams set [3, _pitchChange];
+_seekerStateParams set [4, CBA_missionTime];
+
TRACE_3("attackProfileStateParams",_firedLOS,_yawChange,_pitchChange);
_attackProfileStateParams set [0, CBA_missionTime];
_attackProfileStateParams set [1, _firedLOS];
diff --git a/addons/nlaw/functions/fnc_seeker.sqf b/addons/nlaw/functions/fnc_seeker.sqf
index e5de6d320ca..a77b7ecb3b6 100644
--- a/addons/nlaw/functions/fnc_seeker.sqf
+++ b/addons/nlaw/functions/fnc_seeker.sqf
@@ -16,14 +16,27 @@
*
* Public: No
*/
+#define PITCH_UP_TIME 1
-params ["", "_args", "_seekerStateParams"];
+params ["", "_args", "_seekerStateParams", "", "", "_targetData"];
_args params ["_firedEH", "_launchParams", "", "_seekerParams", "_stateParams"];
_firedEH params ["","","","","","","_projectile"];
_launchParams params ["", "_targetLaunchParams", "", "_attackProfile"];
_targetLaunchParams params ["", "", "_launchPos"];
+_stateParams params ["", "", "", "", "_navigationParams"];
-if (_attackProfile == QGVAR(directAttack)) exitWith {[0,0,0]};
+if (_attackProfile == QGVAR(directAttack)) exitWith {
+ _navigationParams set [5, 1];
+ [0,0,0]
+};
+
+_seekerStateParams params ["", "", "", "_originalPitchRate", "_startTime"];
+_navigationParams params ["", "_pitchRate"];
+
+// pitch up for the first second of flight to begin an over-fly trajectory
+private _pitchChange = linearConversion [0, PITCH_UP_TIME, CBA_missionTime - _startTime, 2, 0, true];
+_navigationParams set [1, _originalPitchRate + _pitchChange];
+_navigationParams set [5, ((CBA_missionTime - _startTime) min PITCH_UP_TIME) / PITCH_UP_TIME];
private _projPos = getPosASL _projectile;
@@ -49,7 +62,7 @@ if ((_projPos distance _launchPos) >= 20) then {
// This represents a position that the missile was at between the last frame and now
private _virtualPos = _lastPos vectorAdd (_vectorDir vectorMultiply _stepSize);
#ifdef DRAW_NLAW_INFO
- drawLine3D [ASLtoAGL _virtualPos, ASLtoAGL (_virtualPos vectorAdd [0,0,-5]), [1,0,_stepSize/(_frameDistance max 0.1),1]];
+ drawLine3D [ASLToAGL _virtualPos, ASLToAGL (_virtualPos vectorAdd [0,0,-5]), [1,0,_stepSize/(_frameDistance max 0.1),1]];
#endif
// Limit scan to 5 meters directly down (shaped charge jet has a very limited range)
@@ -58,7 +71,7 @@ if ((_projPos distance _launchPos) >= 20) then {
(_res select 0) params ["_targetPos", "", "_target"];
if ((_target isKindOf "Tank") || {_target isKindOf "Car"} || {_target isKindOf "Air"}) exitWith {
TRACE_3("Firing shaped charge down",_target,_targetPos distance _virtualPos,_frameDistance);
- TRACE_2("",_target worldToModel (ASLtoAGL _virtualPos),boundingBoxReal _target);
+ TRACE_2("",_target worldToModel (ASLToAGL _virtualPos),boundingBoxReal _target);
_virtualPos = _virtualPos vectorAdd (_vectorDir vectorMultiply 1.25);
deleteVehicle _projectile;
diff --git a/addons/noradio/stringtable.xml b/addons/noradio/stringtable.xml
index d1cf51f0e6a..d41827ebfad 100644
--- a/addons/noradio/stringtable.xml
+++ b/addons/noradio/stringtable.xml
@@ -12,6 +12,7 @@
Нет рации
No Radio
Pas de radio
+ Sem Rádio
Mute Player
diff --git a/addons/novehicleclanlogo/stringtable.xml b/addons/novehicleclanlogo/stringtable.xml
index 96d463f582d..1e07c85ce8c 100644
--- a/addons/novehicleclanlogo/stringtable.xml
+++ b/addons/novehicleclanlogo/stringtable.xml
@@ -11,6 +11,7 @@
Clan-Logo von Fahrzeugen entfernen
Rimuovi Icone Clan dai veicoli
Retirer les logos de clan des véhicules
+ Remover logo do clã de veículos
Prevents clan logo from being displayed on vehicles controlled by players.
@@ -22,6 +23,7 @@
Verhindert, dass das Clan-Logo auf von Spielern kontrollierten Fahrzeugen angezeigt wird.
Impedisce la visualizzazione di icone clan sui veicoli controllati da giocatori.
Empêche les logos de clan d'être affichés sur les véhicules contrôlés par des joueurs.
+ Previne o logo do clã de ser mostrado em veículos controlados por jogadores.
diff --git a/addons/optics/CfgEventHandlers.hpp b/addons/optics/CfgEventHandlers.hpp
deleted file mode 100644
index f6503c2479b..00000000000
--- a/addons/optics/CfgEventHandlers.hpp
+++ /dev/null
@@ -1,17 +0,0 @@
-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/optics/CfgOpticsEffect.hpp b/addons/optics/CfgOpticsEffect.hpp
deleted file mode 100644
index 30c372fdac4..00000000000
--- a/addons/optics/CfgOpticsEffect.hpp
+++ /dev/null
@@ -1,7 +0,0 @@
-class CfgOpticsEffect {
- class ACE_OpticsRadBlur1 {
- type = "radialblur";
- params[] = {0.015, 0, 0.14, 0.2};
- priority = 950;
- };
-};
diff --git a/addons/optics/CfgPreloadTextures.hpp b/addons/optics/CfgPreloadTextures.hpp
index 1354f91e18e..b4bf27f76ff 100644
--- a/addons/optics/CfgPreloadTextures.hpp
+++ b/addons/optics/CfgPreloadTextures.hpp
@@ -1,49 +1,38 @@
-#define MACRO_PRELOAD \
- GVAR(BodyDay) = "*"; \
- GVAR(BodyNight) = "*"; \
- GVAR(ReticleDay) = "*"; \
- GVAR(ReticleNight) = "*"
-
class PreloadTextures {
class CfgWeapons {
class ACE_optic_Hamr_2D {
- MACRO_PRELOAD;
+ PRELOAD;
};
-
class ACE_optic_Hamr_PIP {
- MACRO_PRELOAD;
+ PRELOAD;
};
class ACE_optic_Arco_2D {
- MACRO_PRELOAD;
+ PRELOAD;
};
-
class ACE_optic_Arco_PIP {
- MACRO_PRELOAD;
+ PRELOAD;
};
class ACE_optic_MRCO_2D {
- MACRO_PRELOAD;
+ PRELOAD;
};
-
class ACE_optic_MRCO_PIP {
- MACRO_PRELOAD;
+ PRELOAD;
};
class ACE_optic_SOS_2D {
- MACRO_PRELOAD;
+ PRELOAD;
};
-
class ACE_optic_SOS_PIP {
- MACRO_PRELOAD;
+ PRELOAD;
};
class ACE_optic_LRPS_2D {
- MACRO_PRELOAD;
+ PRELOAD;
};
-
class ACE_optic_LRPS_PIP {
- MACRO_PRELOAD;
+ PRELOAD;
};
};
};
diff --git a/addons/optics/CfgRscTitles.hpp b/addons/optics/CfgRscTitles.hpp
deleted file mode 100644
index bb01281a22f..00000000000
--- a/addons/optics/CfgRscTitles.hpp
+++ /dev/null
@@ -1,204 +0,0 @@
-class RscOpticsValue;
-class RscMapControl;
-class RscText;
-
-class RscInGameUI {
- class RscUnitInfo;
- class RscWeaponZeroing: RscUnitInfo {
- class CA_Zeroing;
- };
-
- class ACE_RscWeaponZeroing: RscWeaponZeroing {
- controls[] = {"CA_Zeroing", "CA_FOVMode", "ACE_DrawReticleHelper", "ACE_ScriptedReticle"};
-
- class CA_FOVMode: RscOpticsValue { // Idea by Taosenai. Apparently this can be used via isNil check to determine wheter the scope or the kolimator is used
- idc = 154;
- style = 2;
- colorText[] = {0, 0, 0, 0};
- x = 0;
- y = 0;
- w = 0;
- h = 0;
- };
-
- class ACE_DrawReticleHelper: RscMapControl {
- onDraw = QUOTE([ctrlParent (_this select 0)] call DFUNC(onDrawScope));
- idc = -1;
- w = 0;
- h = 0;
- };
-
- class ACE_ScriptedReticle: RscText {
- idc = 1713154;
- style = 48;
- size = 1;
- sizeEx = 0;
- text = QPATHTOF(reticles\ace_shortdot_reticle_1.paa);
- w = 0;
- h = 0;
- };
- };
-
- class ACE_RscWeapon_base: RscWeaponZeroing {
- controls[] = {"CA_Zeroing", "CA_FOVMode", "ACE_DrawReticleHelper", "ReticleDay", "ReticleNight", "BodyNight", "BodyDay", "trippleHeadLeft", "trippleHeadRight"}; // Don't change this order
-
- class CA_FOVMode: RscOpticsValue { // Idea by Taosenai. Apparently this can be used via isNil check to determine wheter the scope or the kolimator is used
- idc = 154;
- style = 2;
- colorText[] = {0, 0, 0, 0};
- x = 0;
- y = 0;
- w = 0;
- h = 0;
- };
-
- class ACE_DrawReticleHelper: RscMapControl {
- onDraw = QUOTE([ctrlParent (_this select 0)] call DFUNC(onDrawScope2D));
- idc = -1;
- w = 0;
- h = 0;
- };
-
- #define SIZEX 0.75/(getResolution select 5)
- class ReticleDay: RscText {
- idc = 1713001;
- style = 48;
- size = 0;
- sizeEx = 1;
- text = "";
- colorText[] = {1, 1, 1, 0};
- colorBackground[] = {0, 0, 0, 0};
- 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 {
- idc = 1713002;
- text = "";
- };
-
- #undef SIZEX
- #define SIZEX 2*0.75/(getResolution select 5)
- class BodyDay: ReticleDay {
- idc = 1713005;
- text = "";
- 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 {
- idc = 1713006;
- text = "";
- };
-
- // These are just black side panels to cover the areas that the optics p3d doesn't cover
- // It will ONLY effect tripple head users as (safezoneX == safeZoneXAbs) for everyone else
- // Reference PR #1156:
- class trippleHeadLeft: RscText {
- idc = 1713010;
- x = "safeZoneXAbs";
- Y = "safezoneY";
- W = "(safezoneX - safeZoneXAbs) * ((getResolution select 4) / (16 / 3))";
- H = "safeZoneH";
- colorBackground[] = {0, 0, 0, 1};
- };
- class trippleHeadRight: trippleHeadLeft {
- idc = 1713011;
- x = "safeZoneXAbs + safeZoneWAbs - (safezoneX - safeZoneXABS) * ((getResolution select 4) / (16 / 3))";
- colorBackground[] = {0, 0, 0, 1};
- };
- };
-
- class ACE_RscWeapon_Hamr: ACE_RscWeapon_base {
- class ReticleDay: ReticleDay {
- text = QPATHTOF(reticles\hamr-reticle65_ca.paa);
- };
-
- class ReticleNight: ReticleNight {
- text = QPATHTOF(reticles\hamr-reticle65Illum_ca.paa);
- };
-
- class BodyDay: BodyDay {
- text = QPATHTOF(reticles\hamr-body_ca.paa);
- };
-
- class BodyNight: BodyNight {
- text = QPATHTOF(reticles\hamr-bodyNight_ca.paa);
- };
- };
-
- class ACE_RscWeapon_Arco: ACE_RscWeapon_base {
- class ReticleDay: ReticleDay {
- text = QPATHTOF(reticles\arco-reticle65_ca.paa);
- };
-
- class ReticleNight: ReticleNight {
- text = QPATHTOF(reticles\arco-reticle65Illum_ca.paa);
- };
-
- class BodyDay: BodyDay {
- text = QPATHTOF(reticles\arco-body_ca.paa);
- };
-
- class BodyNight: BodyNight {
- text = QPATHTOF(reticles\arco-bodyNight_ca.paa);
- };
- };
-
- class ACE_RscWeapon_MRCO: ACE_RscWeapon_base {
- class ReticleDay: ReticleDay {
- text = QPATHTOF(reticles\mrco-reticle556_ca.paa);
- };
-
- class ReticleNight: ReticleNight {
- text = QPATHTOF(reticles\mrco-reticle556Illum_ca.paa);
- };
-
- class BodyDay: BodyDay {
- text = QPATHTOF(reticles\mrco-body_ca.paa);
- };
-
- class BodyNight: BodyNight {
- text = QPATHTOF(reticles\mrco-bodyNight_ca.paa);
- };
- };
-
- class ACE_RscWeapon_SOS: ACE_RscWeapon_base {
- class ReticleDay: ReticleDay {
- text = QPATHTOF(reticles\sos-reticleMLR_ca.paa);
- };
-
- class ReticleNight: ReticleNight {
- text = QPATHTOF(reticles\sos-reticleMLRIllum_ca.paa);
- };
-
- class BodyDay: BodyDay {
- text = QPATHTOF(reticles\sos-body_ca.paa);
- };
-
- class BodyNight: BodyNight {
- text = QPATHTOF(reticles\sos-bodyNight_ca.paa);
- };
- };
-};
-
-/*
-
-_ctrl = (D displayCtrl 1713006);
-
-_sizeX = 1.54 / (getResolution select 5);
-_sizeY = _sizeX * safezoneW / safezoneH;
-
-_ctrl ctrlSetPosition [
- safezoneX + 0.5 * safezoneW - 0.5 * _sizeX,
- safezoneY + 0.5 * safezoneH - 0.5 * _sizeY,
- _sizeX,
- _sizeY
-];
-_ctrl ctrlCommit 0
-
- */
diff --git a/addons/optics/CfgVehicles.hpp b/addons/optics/CfgVehicles.hpp
index eda9a3d930c..41e2d8ab039 100644
--- a/addons/optics/CfgVehicles.hpp
+++ b/addons/optics/CfgVehicles.hpp
@@ -3,16 +3,10 @@ class CfgVehicles {
class ACE_Box_Misc: Box_NATO_Support_F {
class TransportItems {
MACRO_ADDITEM(ACE_optic_Hamr_2D,2);
- MACRO_ADDITEM(ACE_optic_Hamr_PIP,2);
MACRO_ADDITEM(ACE_optic_Arco_2D,2);
- MACRO_ADDITEM(ACE_optic_Arco_PIP,2);
MACRO_ADDITEM(ACE_optic_MRCO_2D,2);
- //MACRO_ADDITEM(ACE_optic_MRCO_PIP,2);
MACRO_ADDITEM(ACE_optic_SOS_2D,2);
- MACRO_ADDITEM(ACE_optic_SOS_PIP,2);
MACRO_ADDITEM(ACE_optic_LRPS_2D,2);
- MACRO_ADDITEM(ACE_optic_LRPS_PIP,2);
- //MACRO_ADDITEM(ACE_optic_DMS,2);
};
};
};
diff --git a/addons/optics/CfgWeapons.hpp b/addons/optics/CfgWeapons.hpp
index 8088a5fcd36..90cccb32866 100644
--- a/addons/optics/CfgWeapons.hpp
+++ b/addons/optics/CfgWeapons.hpp
@@ -1,110 +1,62 @@
class CfgWeapons {
class ItemCore;
class InventoryOpticsItem_Base_F;
- class Default;
-
- class Binocular: Default {
- forceOptics = 0; // Allow using compass with Binocular
- opticsZoomMin = 0.056889; // 5.25x power
- opticsZoomMax = 0.056889; // 9 px/mil
- modelOptics = "\z\ace\addons\optics\models\NWD_M22_5x"; // 7 degrees horizontal field of view
- visionMode[] = {"Normal"}; // Can't use nvgs with binoculars any more than you can with scopes
- // Fix AI using Binocs on short range - #18737
- // minRange = 300; // 300 = uses Rangefinder often (runs a few meters, stops, uses RF, repeats)
- minRange = 500; //500 = seem almost never use it..?
- minRangeProbab = 0.001;
- midRange = 1000;
- midRangeProbab = 0.01;
- maxRange = 5000;
- maxRangeProbab = 0.01;
- };
- // zooming reticle scopes
- class optic_DMS: ItemCore {
+ // HAMR
+ class optic_Hamr: ItemCore {
class ItemInfo: InventoryOpticsItem_Base_F {
class OpticsModes {
- class Snip;
- class Iron;
+ class Hamr2Scope;
+ class Hamr2Collimator;
};
};
};
- /*class ACE_optic_DMS: optic_DMS {
+ class ACE_optic_Hamr_2D: optic_Hamr {
author = ECSTRING(common,ACETeam);
- _generalMacro = "ACE_optic_DMS";
- scope = 1;
- displayName = "LOCALIZE ACE DMS";
- //descriptionShort = "$STR_A3_CFGWEAPONS_ACC_DMS1";
- weaponInfoType = "ACE_RscWeaponZeroing";
+ scope = 2;
+ displayName = CSTRING(hamr);
- class ItemInfo: ItemInfo {
- modelOptics = QPATHTOF(models\ace_shortdot_optics.p3d);
+ class CBA_ScriptedOptic {
+ opticsPPEffects[] = {"CBA_OpticsRadBlur3"};
- class OpticsModes: OpticsModes {
- class Snip: Snip {
- opticsZoomMin = 0.05;
- opticsZoomMax = 0.3;
- opticsZoomInit = 0.3;
- discretefov[] = {};
- modelOptics[] = {};
- };
+ reticleTexture = QPATHTOF(reticles\hamr-reticle65_ca.paa);
+ reticleTextureNight = QPATHTOF(reticles\hamr-reticle65Illum_ca.paa);
+ reticleTextureSize = 6 / 25 * 4; // At 25x using https://github.com/CBATeam/CBA_A3/wiki/Scripted-Optics#debug-reticle, the best choice is 6
- class Iron: Iron {};
- };
- };
- };*/
+ bodyTexture = QPATHTOF(reticles\hamr-body_ca.paa);
+ bodyTextureNight = QPATHTOF(reticles\hamr-bodyNight_ca.paa);
+ bodyTextureSize = 2.2;
- // PIP scopes
- class optic_Hamr: ItemCore {
- class ItemInfo: InventoryOpticsItem_Base_F {
- class OpticsModes {
- class Hamr2Collimator;
- class Hamr2Scope;
- };
+ hideMagnification = 1;
};
- };
-
- class ACE_optic_Hamr_2D: optic_Hamr {
- GVAR(BodyDay) = QPATHTOF(reticles\hamr-body_ca.paa);
- GVAR(BodyNight) = QPATHTOF(reticles\hamr-bodyNight_ca.paa);
- GVAR(ReticleDay) = QPATHTOF(reticles\hamr-reticle65_ca.paa);
- GVAR(ReticleNight) = QPATHTOF(reticles\hamr-reticle65Illum_ca.paa);
-
- author = ECSTRING(common,ACETeam);
- _generalMacro = "ACE_optic_Hamr_2D";
- displayName = CSTRING(hamr);
- weaponInfoType = "ACE_RscWeapon_Hamr";
+ weaponInfoType = "CBA_ScriptedOptic";
class ItemInfo: ItemInfo {
- modelOptics = QPATHTOF(models\ace_optics_reticle90.p3d);
+ modelOptics = "\x\cba\addons\optics\cba_optic_big_90.p3d";
class OpticsModes: OpticsModes {
- class Hamr2Collimator: Hamr2Collimator {};
-
class Hamr2Scope: Hamr2Scope {
useModelOptics = 1;
- opticsZoomInit = 0.0872664626;
- opticsZoomMax = 0.0872664626;
- opticsZoomMin = 0.0872664626;
- opticsPPEffects[] = {"OpticsCHAbera5", "OpticsBlur5", "ACE_OpticsRadBlur1"};
- opticsDisablePeripherialVision = 0;
- visionMode[] = {"Normal", "NVG"};
+ opticsZoomInit = 0.25 / 4;
+ opticsZoomMax = 0.25 / 4;
+ opticsZoomMin = 0.25 / 4;
};
+ class Hamr2Collimator: Hamr2Collimator {};
};
};
};
-
class ACE_optic_Hamr_PIP: ACE_optic_Hamr_2D {
author = ECSTRING(common,ACETeam);
- _generalMacro = "ACE_optic_Hamr_PIP";
- //scopeArsenal = 1;
+ scope = 1;
displayName = CSTRING(hamr_pip);
class ItemInfo: ItemInfo {
- modelOptics = QPATHTOF(models\ace_optics_pip.p3d);
+ modelOptics = "\x\cba\addons\optics\cba_optic_big_pip.p3d";
};
};
+ // ARCO
class optic_Arco: ItemCore {
class ItemInfo: InventoryOpticsItem_Base_F {
class OpticsModes {
@@ -115,95 +67,104 @@ class CfgWeapons {
};
class ACE_optic_Arco_2D: optic_Arco {
- GVAR(BodyDay) = QPATHTOF(reticles\arco-body_ca.paa);
- GVAR(BodyNight) = QPATHTOF(reticles\arco-bodyNight_ca.paa);
- GVAR(ReticleDay) = QPATHTOF(reticles\arco-reticle65_ca.paa);
- GVAR(ReticleNight) = QPATHTOF(reticles\arco-reticle65Illum_ca.paa);
-
author = ECSTRING(common,ACETeam);
- _generalMacro = "ACE_optic_Arco_2D";
+ scope = 2;
displayName = CSTRING(arco);
- weaponInfoType = "ACE_RscWeapon_Arco";
+
+ class CBA_ScriptedOptic {
+ opticsPPEffects[] = {"CBA_OpticsRadBlur3"};
+
+ reticleTexture = QPATHTOF(reticles\arco-reticle65_ca.paa);
+ reticleTextureNight = QPATHTOF(reticles\arco-reticle65Illum_ca.paa);
+ reticleTextureSize = 6.4 / 25 * 4; // At 25x using https://github.com/CBATeam/CBA_A3/wiki/Scripted-Optics#debug-reticle, the best choice is 6.4
+
+ bodyTexture = QPATHTOF(reticles\arco-body_ca.paa);
+ bodyTextureNight = QPATHTOF(reticles\arco-bodyNight_ca.paa);
+ bodyTextureSize = 2.2;
+
+ hideMagnification = 1;
+ };
+ weaponInfoType = "CBA_ScriptedOptic";
class ItemInfo: ItemInfo {
- modelOptics = QPATHTOF(models\ace_optics_reticle90.p3d);
+ modelOptics = "\x\cba\addons\optics\cba_optic_big_90.p3d";
class OpticsModes: OpticsModes {
- class ARCO2collimator: ARCO2collimator {};
class ARCO2scope: ARCO2scope {
useModelOptics = 1;
- opticsZoomInit = 0.0872664626;
- opticsZoomMax = 0.0872664626;
- opticsZoomMin = 0.0872664626;
- opticsPPEffects[] = {"OpticsCHAbera5", "OpticsBlur5", "ACE_OpticsRadBlur1"};
- opticsDisablePeripherialVision = 0;
- visionMode[] = {"Normal"};
+ opticsZoomInit = 0.25 / 4;
+ opticsZoomMax = 0.25 / 4;
+ opticsZoomMin = 0.25 / 4;
};
+ class ARCO2collimator: ARCO2collimator {};
};
};
};
-
class ACE_optic_Arco_PIP: ACE_optic_Arco_2D {
author = ECSTRING(common,ACETeam);
- _generalMacro = "ACE_optic_Arco_PIP";
- //scopeArsenal = 1;
+ scope = 1;
displayName = CSTRING(arco_pip);
class ItemInfo: ItemInfo {
- modelOptics = QPATHTOF(models\ace_optics_pip.p3d);
+ modelOptics = "\x\cba\addons\optics\cba_optic_big_pip.p3d";
};
};
+ // MRCO
class optic_MRCO: ItemCore {
class ItemInfo: InventoryOpticsItem_Base_F {
class OpticsModes {
- class MRCOcq;
class MRCOscope;
+ class MRCOcq;
};
};
};
class ACE_optic_MRCO_2D: optic_MRCO {
- GVAR(BodyDay) = QPATHTOF(reticles\mrco-body_ca.paa);
- GVAR(BodyNight) = QPATHTOF(reticles\mrco-bodyNight_ca.paa);
- GVAR(ReticleDay) = QPATHTOF(reticles\mrco-reticle556_ca.paa);
- GVAR(ReticleNight) = QPATHTOF(reticles\mrco-reticle556Illum_ca.paa);
-
author = ECSTRING(common,ACETeam);
- _generalMacro = "ACE_optic_MRCO_2D";
- displayName = CSTRING(valdada);
- weaponInfoType = "ACE_RscWeapon_MRCO";
+ scope = 2;
+ displayName = CSTRING(mrco);
+
+ class CBA_ScriptedOptic {
+ opticsPPEffects[] = {"CBA_OpticsRadBlur3"};
+
+ reticleTexture = QPATHTOF(reticles\mrco-reticle556_ca.paa);
+ reticleTextureNight = QPATHTOF(reticles\mrco-reticle556Illum_ca.paa);
+ reticleTextureSize = 6.4 / 25 * 4; // At 25x using https://github.com/CBATeam/CBA_A3/wiki/Scripted-Optics#debug-reticle, the best choice is 6.4
+
+ bodyTexture = QPATHTOF(reticles\mrco-body_ca.paa);
+ bodyTextureNight = QPATHTOF(reticles\mrco-bodyNight_ca.paa);
+ bodyTextureSize = 2.2;
+
+ hideMagnification = 1;
+ };
+ weaponInfoType = "CBA_ScriptedOptic";
class ItemInfo: ItemInfo {
- modelOptics = QPATHTOF(models\ace_optics_reticle90.p3d);
+ modelOptics = "\x\cba\addons\optics\cba_optic_big_90.p3d";
class OpticsModes: OpticsModes {
- class MRCOcq: MRCOcq {};
class MRCOscope: MRCOscope {
useModelOptics = 1;
- opticsZoomInit = 0.0872664626;
- opticsZoomMax = 0.0872664626;
- opticsZoomMin = 0.0872664626;
- opticsPPEffects[] = {"OpticsCHAbera5", "OpticsBlur5", "ACE_OpticsRadBlur1"};
- opticsDisablePeripherialVision = 0;
- visionMode[] = {"Normal"};
+ opticsZoomInit = 0.25 / 4;
+ opticsZoomMax = 0.25 / 4;
+ opticsZoomMin = 0.25 / 4;
};
+ class MRCOcq: MRCOcq {};
};
};
};
-
class ACE_optic_MRCO_PIP: ACE_optic_MRCO_2D {
author = ECSTRING(common,ACETeam);
- _generalMacro = "ACE_optic_MRCO_PIP";
scope = 1;
- //scopeArsenal = 1;
- displayName = CSTRING(valdada_pip);
+ displayName = CSTRING(mrco_pip);
class ItemInfo: ItemInfo {
- modelOptics = QPATHTOF(models\ace_optics_pip.p3d);
+ modelOptics = "\x\cba\addons\optics\cba_optic_big_pip.p3d";
};
};
+ // SOS
class optic_SOS: ItemCore {
class ItemInfo: InventoryOpticsItem_Base_F {
class OpticsModes {
@@ -214,49 +175,53 @@ class CfgWeapons {
};
class ACE_optic_SOS_2D: optic_SOS {
- GVAR(BodyDay) = QPATHTOF(reticles\sos-body_ca.paa);
- GVAR(BodyNight) = QPATHTOF(reticles\sos-bodyNight_ca.paa);
- GVAR(ReticleDay) = QPATHTOF(reticles\sos-reticleMLR_ca.paa);
- GVAR(ReticleNight) = QPATHTOF(reticles\sos-reticleMLRIllum_ca.paa);
-
author = ECSTRING(common,ACETeam);
- _generalMacro = "ACE_optic_SOS_2D";
+ scope = 2;
displayName = CSTRING(sos);
- weaponInfoType = "ACE_RscWeapon_SOS";
+
+ class CBA_ScriptedOptic {
+ opticsPPEffects[] = {"CBA_OpticsRadBlur3"};
+
+ reticleTexture = QPATHTOF(reticles\sos-reticleMLR_ca.paa);
+ reticleTextureNight = QPATHTOF(reticles\sos-reticleMLRIllum_ca.paa);
+ reticleTextureSize = 0.76; // At 22x using https://github.com/CBATeam/CBA_A3/wiki/Scripted-Optics#debug-reticle, the best choice is 0.76
+
+ bodyTexture = QPATHTOF(reticles\sos-body_ca.paa);
+ bodyTextureNight = QPATHTOF(reticles\sos-bodyNight_ca.paa);
+ bodyTextureSize = 1.55;
+ };
+ weaponInfoType = "CBA_ScriptedOptic";
class ItemInfo: ItemInfo {
class OpticsModes: OpticsModes {
class Snip: Snip {
- modelOptics[] = {QPATHTOF(models\ace_optics_reticle90.p3d), QPATHTOF(models\ace_optics_reticle90.p3d)};
+ opticsZoomMin = "5.5 call (uiNamespace getVariable 'cba_optics_fnc_setOpticMagnificationHelper')";
+ opticsZoomMax = "2.75 call (uiNamespace getVariable 'cba_optics_fnc_setOpticMagnificationHelper')";
+ opticsZoomInit = "2.75 call (uiNamespace getVariable 'cba_optics_fnc_setOpticMagnificationHelper')";
+ discreteFov[] = {};
+ modelOptics[] = {"\x\cba\addons\optics\cba_optic_big_90.p3d"};
useModelOptics = 1;
- opticsZoomInit = 0.0116;
- opticsZoomMax = 0.0464;
- opticsZoomMin = 0.0116;
- discreteFOV[] = {0.0464, 0.0116};
- opticsPPEffects[] = {"OpticsCHAbera1", "OpticsBlur1", "ACE_OpticsRadBlur1"};
- opticsDisablePeripherialVision = 0;
};
class Iron: Iron {};
};
};
};
-
class ACE_optic_SOS_PIP: ACE_optic_SOS_2D {
author = ECSTRING(common,ACETeam);
- _generalMacro = "ACE_optic_SOS_PIP";
- //scopeArsenal = 1;
+ scope = 1;
displayName = CSTRING(sos_pip);
class ItemInfo: ItemInfo {
class OpticsModes: OpticsModes {
class Snip: Snip {
- modelOptics[] = {QPATHTOF(models\ace_optics_pip.p3d), QPATHTOF(models\ace_optics_pip.p3d)};
+ modelOptics[] = {"\x\cba\addons\optics\cba_optic_big_pip.p3d"};
};
class Iron: Iron {};
};
};
};
+ // LRPS
class optic_LRPS: ItemCore {
class ItemInfo: InventoryOpticsItem_Base_F {
class OpticsModes {
@@ -266,44 +231,64 @@ class CfgWeapons {
};
class ACE_optic_LRPS_2D: optic_LRPS {
- GVAR(BodyDay) = QPATHTOF(reticles\sos-body_ca.paa);
- GVAR(BodyNight) = QPATHTOF(reticles\sos-bodyNight_ca.paa);
- GVAR(ReticleDay) = QPATHTOF(reticles\sos-reticleMLR_ca.paa);
- GVAR(ReticleNight) = QPATHTOF(reticles\sos-reticleMLRIllum_ca.paa);
-
author = ECSTRING(common,ACETeam);
- _generalMacro = "ACE_optic_LRPS_2D";
+ scope = 2;
displayName = CSTRING(lrps);
- weaponInfoType = "ACE_RscWeapon_SOS";
+
+ class CBA_ScriptedOptic {
+ opticsPPEffects[] = {"CBA_OpticsRadBlur3"};
+
+ reticleTexture = QPATHTOF(reticles\sos-reticleMLR_ca.paa);
+ reticleTextureNight = QPATHTOF(reticles\sos-reticleMLRIllum_ca.paa);
+ reticleTextureSize = 0.76; // At 22x using https://github.com/CBATeam/CBA_A3/wiki/Scripted-Optics#debug-reticle, the best choice is 0.76
+
+ bodyTexture = QPATHTOF(reticles\sos-body_ca.paa);
+ bodyTextureNight = QPATHTOF(reticles\sos-bodyNight_ca.paa);
+ bodyTextureSize = 1.55;
+ };
+ weaponInfoType = "CBA_ScriptedOptic";
class ItemInfo: ItemInfo {
class OpticsModes: OpticsModes {
class Snip: Snip {
- modelOptics[] = {QPATHTOF(models\ace_optics_reticle90.p3d), QPATHTOF(models\ace_optics_reticle90.p3d)};
+ opticsZoomMin = "22 call (uiNamespace getVariable 'cba_optics_fnc_setOpticMagnificationHelper')";
+ opticsZoomMax = "5.5 call (uiNamespace getVariable 'cba_optics_fnc_setOpticMagnificationHelper')";
+ opticsZoomInit = "5.5 call (uiNamespace getVariable 'cba_optics_fnc_setOpticMagnificationHelper')";
+ discreteFov[] = {};
+ modelOptics[] = {"\x\cba\addons\optics\cba_optic_big_90.p3d"};
useModelOptics = 1;
- opticsZoomInit = 0.0116;
- opticsZoomMax = 0.0464;
- opticsZoomMin = 0.0116;
- discreteFOV[] = {};
- opticsPPEffects[] = {"OpticsCHAbera1", "OpticsBlur1", "ACE_OpticsRadBlur1"};
- opticsDisablePeripherialVision = 0;
};
};
};
};
-
class ACE_optic_LRPS_PIP: ACE_optic_LRPS_2D {
author = ECSTRING(common,ACETeam);
- _generalMacro = "ACE_optic_LRPS_PIP";
- //scopeArsenal = 1;
+ scope = 1;
displayName = CSTRING(lrps_pip);
class ItemInfo: ItemInfo {
class OpticsModes: OpticsModes {
class Snip: Snip {
- modelOptics[] = {QPATHTOF(models\ace_optics_pip.p3d), QPATHTOF(models\ace_optics_pip.p3d)};
+ modelOptics[] = {"\x\cba\addons\optics\cba_optic_big_pip.p3d"};
};
};
};
};
+
+ // Binocular
+ class Default;
+ class Binocular: Default {
+ opticsZoomInit = 0.056889; // 7x power IRL
+ opticsZoomMin = 0.056889; // but in order to make the stadiametric rangefinder useful, ~4.4x magnification has been set
+ opticsZoomMax = 0.056889; // 9 px/mil
+ modelOptics = "\z\ace\addons\optics\models\NWD_M22_5x"; // 7 degrees horizontal field of view (Steiner M22)
+ // Fix AI using Binocs on short range - #18737
+ // minRange = 300; // 300 = uses Rangefinder often (runs a few meters, stops, uses RF, repeats)
+ minRange = 500; // 500 = seem almost never use it..?
+ minRangeProbab = 0.001;
+ midRange = 1000;
+ midRangeProbab = 0.01;
+ maxRange = 5000;
+ maxRangeProbab = 0.01;
+ };
};
diff --git a/addons/optics/XEH_PREP.hpp b/addons/optics/XEH_PREP.hpp
deleted file mode 100644
index 8eb8eb1eb56..00000000000
--- a/addons/optics/XEH_PREP.hpp
+++ /dev/null
@@ -1,3 +0,0 @@
-PREP(handleFired);
-PREP(onDrawScope);
-PREP(onDrawScope2D);
diff --git a/addons/optics/XEH_postInit.sqf b/addons/optics/XEH_postInit.sqf
deleted file mode 100644
index 1641ee21746..00000000000
--- a/addons/optics/XEH_postInit.sqf
+++ /dev/null
@@ -1,31 +0,0 @@
-// by commy2
-#include "script_component.hpp"
-
-if (!hasInterface) exitWith {};
-
-GVAR(camera) = objNull;
-
-// save control for fired EH
-["ace_infoDisplayChanged", {
- TRACE_1("ace_infoDisplayChanged",_this);
- if (!isNull ((_this select 0) displayCtrl 1713001)) then {
- uiNamespace setVariable [QGVAR(RscWeaponInfo2D), _this select 0];
- };
-}] call CBA_fnc_addEventHandler;
-
-// camera has to be re-created every time another camera is created. Otherwise r2t is either black or transparent..
-["featureCamera", {
- params ["_player", "_featureCamera"];
- TRACE_1("featureCamera",_featureCamera);
- if (_featureCamera isEqualTo "") then {
- // Destroy the camera, and it will be re-created in the onDrawScope2d helper
- if (!isNull GVAR(camera)) then {
- GVAR(camera) cameraEffect ["TERMINATE", "BACK"];
- camDestroy GVAR(camera);
- TRACE_1("destroying pip camera for restart",GVAR(camera));
- };
- };
-}] call CBA_fnc_addPlayerEventHandler;
-
-// Register fire event handler
-["ace_firedPlayer", LINKFUNC(handleFired)] call CBA_fnc_addEventHandler;
diff --git a/addons/optics/XEH_preInit.sqf b/addons/optics/XEH_preInit.sqf
deleted file mode 100644
index b47cf6628db..00000000000
--- a/addons/optics/XEH_preInit.sqf
+++ /dev/null
@@ -1,9 +0,0 @@
-#include "script_component.hpp"
-
-ADDON = false;
-
-PREP_RECOMPILE_START;
-#include "XEH_PREP.hpp"
-PREP_RECOMPILE_END;
-
-ADDON = true;
diff --git a/addons/optics/XEH_preStart.sqf b/addons/optics/XEH_preStart.sqf
deleted file mode 100644
index 022888575ed..00000000000
--- a/addons/optics/XEH_preStart.sqf
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "script_component.hpp"
-
-#include "XEH_PREP.hpp"
diff --git a/addons/optics/config.cpp b/addons/optics/config.cpp
index c1524320c73..8b61425c67b 100644
--- a/addons/optics/config.cpp
+++ b/addons/optics/config.cpp
@@ -10,12 +10,11 @@ class CfgPatches {
"ACE_optic_Arco_2D",
"ACE_optic_Arco_PIP",
"ACE_optic_MRCO_2D",
- //"ACE_optic_MRCO_PIP",
+ "ACE_optic_MRCO_PIP",
"ACE_optic_SOS_2D",
"ACE_optic_SOS_PIP",
"ACE_optic_LRPS_2D",
"ACE_optic_LRPS_PIP"
- //"ACE_optic_DMS"
};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_common"};
@@ -26,12 +25,15 @@ class CfgPatches {
};
};
-#include "CfgEventHandlers.hpp"
-
-#include "CfgOpticsEffect.hpp"
-#include "CfgRscTitles.hpp"
-#include "CfgVehicles.hpp"
-#include "CfgWeapons.hpp"
+#include "CfgPreloadTextures.hpp"
#include "CfgJointRails.hpp"
+#include "CfgWeapons.hpp"
+#include "CfgVehicles.hpp"
-#include "CfgPreloadTextures.hpp"
+class CBA_PIPItems {
+ 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";
+};
diff --git a/addons/optics/functions/fnc_handleFired.sqf b/addons/optics/functions/fnc_handleFired.sqf
deleted file mode 100644
index f36f04d8817..00000000000
--- a/addons/optics/functions/fnc_handleFired.sqf
+++ /dev/null
@@ -1,104 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: Taosenai
- * Adapted By: KoffeinFlummi, commy2
- *
- * Animates the scope when firing. Called from the unified fired EH only for the local player.
- *
- * Arguments:
- * None. Parameters inherited from EFUNC(common,firedEH)
- *
- * Return Value:
- * None
- *
- * Example:
- * call ace_optics_fnc_handleFired
- *
- * Public: No
- */
-
-// IGNORE_PRIVATE_WARNING ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_vehicle", "_gunner", "_turret"];
-TRACE_10("firedEH:",_unit,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile,_vehicle,_gunner,_turret);
-
-disableSerialization;
-
-// Check if compatible scope is used
-private _display = uiNamespace getVariable [QGVAR(RscWeaponInfo2D), displayNull];
-
-if (isNull _display) exitWith {};
-
-// Reduce the reticle movement as the player drops into lower, supported stances.
-private _recoilCoef = switch (true) do {
- case (isWeaponDeployed _unit): {0.1};
- case (isWeaponRested _unit): {0.4};
- default {1};
-};
-
-// Constants which determine how the scope recoils
-
-private _recoilScope = _recoilCoef * linearConversion [0, 1, random 1, SCOPE_RECOIL_MIN, SCOPE_RECOIL_MAX, false];
-
-private _reticleShiftX = _recoilCoef * linearConversion [0, 1, random 1, RETICLE_SHIFT_X_MIN, RETICLE_SHIFT_X_MAX, false];
-private _reticleShiftY = _recoilCoef * linearConversion [0, 1, random 1, RETICLE_SHIFT_Y_MIN, RETICLE_SHIFT_Y_MAX, false];
-
-private _scopeShiftX = _recoilCoef * linearConversion [0, 1, random 1, SCOPE_SHIFT_X_MIN, SCOPE_SHIFT_X_MAX, false];
-private _scopeShiftY = _recoilCoef * linearConversion [0, 1, random 1, SCOPE_SHIFT_Y_MIN, SCOPE_SHIFT_Y_MAX, false];
-
-// Create and commit recoil effect
-
-private _sizeX = (0.75 + _recoilScope) / (getResolution select 5);
-private _sizeY = _sizeX * (4 / 3);
-
-private _positionReticle = [
- safezoneX + 0.5 * safezoneW - 0.5 * (_sizeX + _reticleShiftX),
- safezoneY + 0.5 * safezoneH - 0.5 * (_sizeY + _reticleShiftY),
- _sizeX,
- _sizeY
-];
-
-(_display displayCtrl 1713001) ctrlSetPosition _positionReticle;
-(_display displayCtrl 1713002) ctrlSetPosition _positionReticle;
-
-private _positionBody = [
- safezoneX + 0.5 * safezoneW - 0.5 * (2 * _sizeX + _scopeShiftX),
- safezoneY + 0.5 * safezoneH - 0.5 * (2 * _sizeY + _scopeShiftY),
- 2 * _sizeX,
- 2 * _sizeY
-];
-
-(_display displayCtrl 1713005) ctrlSetPosition _positionBody;
-(_display displayCtrl 1713006) ctrlSetPosition _positionBody;
-
-(_display displayCtrl 1713001) ctrlCommit 0;
-(_display displayCtrl 1713002) ctrlCommit 0;
-(_display displayCtrl 1713005) ctrlCommit 0;
-(_display displayCtrl 1713006) ctrlCommit 0;
-
-// Bring them all back
-_sizeX = 0.75 / (getResolution select 5);
-_sizeY = _sizeX * (4 / 3);
-
-_positionReticle = [
- safezoneX + 0.5 * safezoneW - 0.5 * _sizeX,
- safezoneY + 0.5 * safezoneH - 0.5 * _sizeY,
- _sizeX,
- _sizeY
-];
-
-(_display displayCtrl 1713001) ctrlSetPosition _positionReticle;
-(_display displayCtrl 1713002) ctrlSetPosition _positionReticle;
-
-_positionBody = [
- safezoneX + 0.5 * safezoneW - 0.5 * 2 * _sizeX,
- safezoneY + 0.5 * safezoneH - 0.5 * 2 * _sizeY,
- 2 * _sizeX,
- 2 * _sizeY
-];
-
-(_display displayCtrl 1713005) ctrlSetPosition _positionBody;
-(_display displayCtrl 1713006) ctrlSetPosition _positionBody;
-
-(_display displayCtrl 1713001) ctrlCommit RECENTER_TIME;
-(_display displayCtrl 1713002) ctrlCommit RECENTER_TIME;
-(_display displayCtrl 1713005) ctrlCommit RECENTER_TIME;
-(_display displayCtrl 1713006) ctrlCommit RECENTER_TIME;
diff --git a/addons/optics/functions/fnc_onDrawScope.sqf b/addons/optics/functions/fnc_onDrawScope.sqf
deleted file mode 100644
index 4b1b9e321df..00000000000
--- a/addons/optics/functions/fnc_onDrawScope.sqf
+++ /dev/null
@@ -1,39 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: commy2
- *
- *
- * Arguments:
- * 0: Display
- *
- * Return Value:
- * None
- *
- * Example:
- * [DISPLAY] call ace_optics_fnc_onDrawScope
- *
- * Public: No
- */
-
-disableSerialization;
-
-params ["_display"];
-
-private _control = _display displayCtrl 1713154;
-
-if (!ctrlShown (_display displayCtrl 154)) exitWith {
- _control ctrlShow false;
-};
-
-private _sizeX = (call EFUNC(common,getZoom)) / 4;
-private _sizeY = _sizeX * safezoneW / safezoneH;
-
-_control ctrlSetPosition [
- safezoneX + 0.5 * safezoneW - 0.5 * _sizeX,
- safezoneY + 0.5 * safezoneH - 0.5 * _sizeY,
- _sizeX,
- _sizeY
-];
-
-_control ctrlCommit 0;
-_control ctrlShow true;
diff --git a/addons/optics/functions/fnc_onDrawScope2D.sqf b/addons/optics/functions/fnc_onDrawScope2D.sqf
deleted file mode 100644
index c7fb19c9c13..00000000000
--- a/addons/optics/functions/fnc_onDrawScope2D.sqf
+++ /dev/null
@@ -1,103 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: commy2
- * Helper function for updating the 2d and 3d scope controls
- * Called from a dummy map controls onDraw.
- *
- * Arguments:
- * 0: Display (RscInGameUI for a weapon)
- *
- * Return Value:
- * None
- *
- * Example:
- * [ACE_RscWeapon_Arco's Display] call ace_optics_fnc_onDrawScope2D
- *
- * Public: No
- */
-
-disableSerialization;
-
-params ["_display"];
-
-// @todo, all weapon types
-private _optic = (primaryWeaponItems ACE_player) select 2;
-private _isPIP = (getText (configFile >> "CfgWeapons" >> _optic >> "ItemInfo" >> "modelOptics")) == QPATHTOF(models\ace_optics_pip.p3d);
-
-if (_isPIP) then {
- GVAR(pipLastFrame) = diag_frameno;
- if (isNull GVAR(camera)) then {
- if ((({_x != GVAR(camera)} count allMissionObjects "camera") > 0) || {!isNull curatorCamera}) exitWith {
- TRACE_1("waiting for feature camera to end",GVAR(camera));
- };
-
- // PiP technique by BadBenson
- GVAR(camera) = "camera" camCreate positionCameraToWorld [0, 0, 0];
- GVAR(camera) camSetFov 0.7;
- GVAR(camera) camSetTarget ACE_player;
- GVAR(camera) camCommit 1;
-
- QGVAR(rendertarget0) setPiPEffect [0];
- GVAR(camera) cameraEffect ["INTERNAL", "BACK", QGVAR(rendertarget0)];
-
- TRACE_2("created new pip camera",GVAR(camera),isNull GVAR(camera));
-
- // Start a waitUntil to handle destruction after GVAR(pipLastFrame) is no longer updated
- [{
- (abs (diag_frameno - GVAR(pipLastFrame))) > 1
- }, {
- GVAR(camera) cameraEffect ["TERMINATE", "BACK"];
- camDestroy GVAR(camera);
- TRACE_2("destroyed pip camera",GVAR(camera),isNull GVAR(camera));
- }, []] call CBA_fnc_waitUntilAndExecute;
- };
-};
-
-//If we are not zoomed into the actual scope (not collimator)
-if (!ctrlShown (_display displayCtrl 154)) exitWith {
- (_display displayCtrl 1713001) ctrlShow false;
- (_display displayCtrl 1713002) ctrlShow false;
- (_display displayCtrl 1713005) ctrlShow false;
- (_display displayCtrl 1713006) ctrlShow false;
- (_display displayCtrl 1713010) ctrlShow false;
- (_display displayCtrl 1713011) ctrlShow false;
-};
-
-if (_isPIP) then {
- GVAR(camera) setPosATL positionCameraToWorld [0, 0, 0.4];
- GVAR(camera) camPrepareTarget positionCameraToWorld [0, 0, 50];
- GVAR(camera) camCommitPrepared 0;
-
- // @todo, check if that needs to be done at all
- if (cameraView == "GUNNER") then {
- GVAR(camera) camsetFOV 0.7;
- GVAR(camera) camcommit 0;
- } else {
- GVAR(camera) camsetFOV 0.01;
- GVAR(camera) camcommit 0;
- };
-};
-
-// Calculate lighting
-private _dayOpacity = call EFUNC(common,ambientBrightness);
-private _nightOpacity = parseNumber (_dayOpacity == 1);
-
-// Apply lighting and make layers visible
-(_display displayCtrl 1713001) ctrlSetTextColor [1, 1, 1, 1];
-(_display displayCtrl 1713002) ctrlSetTextColor [1, 1, 1, parseNumber (_dayOpacity < 0.5)];
-(_display displayCtrl 1713005) ctrlSetTextColor [1, 1, 1, _dayOpacity];
-(_display displayCtrl 1713006) ctrlSetTextColor [1, 1, 1, _nightOpacity];
-
-/*
-(_display displayCtrl 1713001) ctrlCommit 0;
-(_display displayCtrl 1713002) ctrlCommit 0;
-(_display displayCtrl 1713005) ctrlCommit 0;
-(_display displayCtrl 1713006) ctrlCommit 0;
- */
-
-(_display displayCtrl 1713001) ctrlShow true;
-(_display displayCtrl 1713002) ctrlShow true;
-(_display displayCtrl 1713005) ctrlShow true;
-(_display displayCtrl 1713006) ctrlShow true;
-(_display displayCtrl 1713010) ctrlShow _isPIP;
-(_display displayCtrl 1713011) ctrlShow _isPIP;
diff --git a/addons/optics/models/ace_optics_empty.p3d b/addons/optics/models/ace_optics_empty.p3d
deleted file mode 100644
index 89a29d7d8ce..00000000000
Binary files a/addons/optics/models/ace_optics_empty.p3d and /dev/null differ
diff --git a/addons/optics/models/ace_optics_pip.p3d b/addons/optics/models/ace_optics_pip.p3d
deleted file mode 100644
index 9ec67652942..00000000000
Binary files a/addons/optics/models/ace_optics_pip.p3d and /dev/null differ
diff --git a/addons/optics/models/ace_optics_reticle100.p3d b/addons/optics/models/ace_optics_reticle100.p3d
deleted file mode 100644
index b5f58cfd1c8..00000000000
Binary files a/addons/optics/models/ace_optics_reticle100.p3d and /dev/null differ
diff --git a/addons/optics/models/ace_optics_reticle70.p3d b/addons/optics/models/ace_optics_reticle70.p3d
deleted file mode 100644
index 5aa9e8613a8..00000000000
Binary files a/addons/optics/models/ace_optics_reticle70.p3d and /dev/null differ
diff --git a/addons/optics/models/ace_optics_reticle80.p3d b/addons/optics/models/ace_optics_reticle80.p3d
deleted file mode 100644
index 55cf2330321..00000000000
Binary files a/addons/optics/models/ace_optics_reticle80.p3d and /dev/null differ
diff --git a/addons/optics/models/ace_optics_reticle90.p3d b/addons/optics/models/ace_optics_reticle90.p3d
deleted file mode 100644
index 30dc511df99..00000000000
Binary files a/addons/optics/models/ace_optics_reticle90.p3d and /dev/null differ
diff --git a/addons/optics/models/ace_shortdot_optics.p3d b/addons/optics/models/ace_shortdot_optics.p3d
deleted file mode 100644
index 47b82be4b71..00000000000
Binary files a/addons/optics/models/ace_shortdot_optics.p3d and /dev/null differ
diff --git a/addons/optics/reticles/ace_shortdot_reticle_1.paa b/addons/optics/reticles/ace_shortdot_reticle_1.paa
deleted file mode 100644
index 6c3d23668ae..00000000000
Binary files a/addons/optics/reticles/ace_shortdot_reticle_1.paa and /dev/null differ
diff --git a/addons/optics/reticles/ace_shortdot_reticle_2.paa b/addons/optics/reticles/ace_shortdot_reticle_2.paa
deleted file mode 100644
index beb7a651c93..00000000000
Binary files a/addons/optics/reticles/ace_shortdot_reticle_2.paa and /dev/null differ
diff --git a/addons/optics/reticles/black.rvmat b/addons/optics/reticles/black.rvmat
deleted file mode 100644
index 431d76689f5..00000000000
--- a/addons/optics/reticles/black.rvmat
+++ /dev/null
@@ -1,8 +0,0 @@
-ambient[]={0,0,0,0.89999998};
-diffuse[]={0,0,0,0.89999998};
-forcedDiffuse[]={0,0,0,1};
-emmisive[]={0,0,0,1};
-specular[]={0,0,0,0};
-specularPower=1;
-PixelShaderID="Normal";
-VertexShaderID="Basic";
diff --git a/addons/optics/reticles/em.rvmat b/addons/optics/reticles/em.rvmat
deleted file mode 100644
index a491df4b9a7..00000000000
--- a/addons/optics/reticles/em.rvmat
+++ /dev/null
@@ -1,20 +0,0 @@
-ambient[]={1,1,1,1};
-diffuse[]={1,1,1,1};
-forcedDiffuse[]={0,0,0,0};
-emmisive[]={1,1,1,1};
-specular[]={1,0.99956858,1,1};
-specularPower=1;
-PixelShaderID="Normal";
-VertexShaderID="Basic";
-class Stage1
-{
- 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};
- };
-};
diff --git a/addons/optics/reticles/scopeblack-100_ca.paa b/addons/optics/reticles/scopeblack-100_ca.paa
deleted file mode 100644
index d0232dc0ccd..00000000000
Binary files a/addons/optics/reticles/scopeblack-100_ca.paa and /dev/null differ
diff --git a/addons/optics/reticles/scopeblack-70_ca.paa b/addons/optics/reticles/scopeblack-70_ca.paa
deleted file mode 100644
index 62b06d7f844..00000000000
Binary files a/addons/optics/reticles/scopeblack-70_ca.paa and /dev/null differ
diff --git a/addons/optics/reticles/scopeblack-80_ca.paa b/addons/optics/reticles/scopeblack-80_ca.paa
deleted file mode 100644
index f74e3e41f1b..00000000000
Binary files a/addons/optics/reticles/scopeblack-80_ca.paa and /dev/null differ
diff --git a/addons/optics/reticles/scopeblack-90_ca.paa b/addons/optics/reticles/scopeblack-90_ca.paa
deleted file mode 100644
index 2240dcc5fe0..00000000000
Binary files a/addons/optics/reticles/scopeblack-90_ca.paa and /dev/null differ
diff --git a/addons/optics/script_component.hpp b/addons/optics/script_component.hpp
index 6cc168aea0c..e57cd984b0b 100644
--- a/addons/optics/script_component.hpp
+++ b/addons/optics/script_component.hpp
@@ -16,17 +16,10 @@
#include "\z\ace\addons\main\script_macros.hpp"
-#define SCOPE_RECOIL_MIN 0.03
-#define SCOPE_RECOIL_MAX 0.032
-
-#define SCOPE_SHIFT_X_MIN 0.04
-#define SCOPE_SHIFT_X_MAX 0.05
-#define SCOPE_SHIFT_Y_MIN -0.02
-#define SCOPE_SHIFT_Y_MAX -0.03
-
-#define RETICLE_SHIFT_X_MIN 0.006
-#define RETICLE_SHIFT_X_MAX 0.011
-#define RETICLE_SHIFT_Y_MIN -0.009
-#define RETICLE_SHIFT_Y_MAX -0.014
-
-#define RECENTER_TIME 0.09
+#define PRELOAD \
+class CBA_ScriptedOptic {\
+ reticleTexture = "*";\
+ reticleTextureNight = "*";\
+ bodyTexture = "*";\
+ bodyTextureNight = "*";\
+}
diff --git a/addons/optics/stringtable.xml b/addons/optics/stringtable.xml
index 85620ac37c7..5433f805092 100644
--- a/addons/optics/stringtable.xml
+++ b/addons/optics/stringtable.xml
@@ -69,7 +69,7 @@
先進步槍戰鬥光學瞄準鏡(擬真版)
ARCO (PIP)
-
+
MRCO (2D)
MRCO (2D)
MRCO (2D)
@@ -86,7 +86,7 @@
多距離戰鬥瞄準鏡(2D)
MRCO (2D)
-
+
MRCO (PIP)
MRCO (PIP)
MRCO (PIP)
diff --git a/addons/optionsmenu/config.cpp b/addons/optionsmenu/config.cpp
index 811b1eecece..0d9977be7a5 100644
--- a/addons/optionsmenu/config.cpp
+++ b/addons/optionsmenu/config.cpp
@@ -29,13 +29,6 @@ class CfgAddons {
#include "gui\mainMenu.hpp"
#include "gui\pauseMenu.hpp"
-class ACE_Extensions {
- class ace_clipboard {
- windows = 1;
- client = 1;
- };
-};
-
class CfgCommands {
allowedHTMLLoadURIs[] += {
"https://ace3.acemod.org/version.html"
diff --git a/addons/optionsmenu/functions/fnc_debugDumpToClipboard.sqf b/addons/optionsmenu/functions/fnc_debugDumpToClipboard.sqf
index 07205dc1952..00d97d20082 100644
--- a/addons/optionsmenu/functions/fnc_debugDumpToClipboard.sqf
+++ b/addons/optionsmenu/functions/fnc_debugDumpToClipboard.sqf
@@ -19,8 +19,7 @@
private _outputText = {
diag_log text (_this select 0);
- "ace_clipboard" callExtension ((_this select 0) + "
-");
+ "ace" callExtension ["clipboard:append", [(_this select 0) + endl]];
};
private _text = format ["~~~~~~~~~ACE Debug~~~~~~~~~
@@ -76,8 +75,8 @@ _text = format ["
{
- _var = missionNamespace getVariable [_x, nil];
- if(!isnil "_var" && {_var isEqualType []} && {(count _var) > MIN_ARRAY_SIZE}) then {
+ private _var = missionNamespace getVariable [_x, nil];
+ if(!isNil "_var" && {_var isEqualType []} && {(count _var) > MIN_ARRAY_SIZE}) then {
_text = format ["%1 - ARRAY SIZE: %2", _x, (count _var)];
[_text] call _outputText;
};
@@ -87,11 +86,11 @@ _text = format ["
private _unit = _x;
{
private _var = _unit getVariable [_x, nil];
- if(!isnil "_var" && {_var isEqualType []} && {(count _var) > MIN_ARRAY_SIZE}) then {
+ if(!isNil "_var" && {_var isEqualType []} && {(count _var) > MIN_ARRAY_SIZE}) then {
_text = format ["%1 on [%2] - ARRAY SIZE: %3", _x, _unit, (count _var)];
[_text] call _outputText;
};
} forEach (allVariables _unit);
} forEach allUnits;
-"ace_clipboard" callExtension "--COMPLETE--";
+"ace" callExtension ["clipboard:complete", []];
diff --git a/addons/optionsmenu/gui/mainMenu.hpp b/addons/optionsmenu/gui/mainMenu.hpp
index 0b26df7017a..9df21dbeb5f 100644
--- a/addons/optionsmenu/gui/mainMenu.hpp
+++ b/addons/optionsmenu/gui/mainMenu.hpp
@@ -22,7 +22,7 @@ class RscDisplayMain: RscStandardDisplay {
class ACE_news_apex: InfoNews {
idc = IDC_MAIN_INFO;
- y = "safezoneY + safezoneH - (3 * 2 + 1) * (pixelH * pixelGrid * 2) - 4 * (4 * pixelH)";
+ y = "safeZoneY + safeZoneH - (3 * 2 + 1) * (pixelH * pixelGrid * 2) - 4 * (4 * pixelH)";
class Controls: Controls {
class Background: Background {};
diff --git a/addons/overheating/CfgWeapons.hpp b/addons/overheating/CfgWeapons.hpp
index 9232fa32492..0b8087cc139 100644
--- a/addons/overheating/CfgWeapons.hpp
+++ b/addons/overheating/CfgWeapons.hpp
@@ -97,17 +97,19 @@ class CfgWeapons {
GVAR(closedBolt) = 1;
GVAR(jamTypesAllowed)[] = {"Fire", "Dud"};
};
+
class ACE_ItemCore;
class CBA_MiscItem_ItemInfo;
- // Deprecated, 3.16.0 Arsenal supports showing magazines as misc items
+ // Deprecated, 3.16.0 Arsenal supports showing magazines as misc. items
+ // However, since base game doesn't support misc. items, it's still needed to filling inventories in the editor
class ACE_SpareBarrel_Item: ACE_ItemCore {
displayName = CSTRING(SpareBarrelName);
author = ECSTRING(common,ACETeam);
- scope = 1;
+ scope = 2;
scopeArsenal = 0;
- descriptionshort = CSTRING(SpareBarrelDescription);
- picture = QUOTE(PATHTOF(UI\spare_barrel_ca.paa));
+ descriptionShort = CSTRING(SpareBarrelDescription);
+ picture = QPATHTOF(UI\spare_barrel_ca.paa);
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 25;
};
diff --git a/addons/overheating/XEH_postInit.sqf b/addons/overheating/XEH_postInit.sqf
index a49030b1adb..223581adb2c 100644
--- a/addons/overheating/XEH_postInit.sqf
+++ b/addons/overheating/XEH_postInit.sqf
@@ -71,7 +71,7 @@ if (hasInterface) then {
["CAManBase", "Reloaded", {
params ["_unit", "_weapon", "_muzzle"];
if (_muzzle == _weapon) then {
- _unit setVariable [format [QGVAR(%1_ammoTemp), _weapon], 0];
+ _unit setVariable [format [QGVAR(%1_ammoTemp), _weapon], ambientTemperature select 0];
};
}] call CBA_fnc_addClassEventHandler;
};
@@ -103,6 +103,7 @@ if (hasInterface) then {
LLSTRING(CoolWeaponWithWaterSource),
QPATHTOEF(field_rations,ui\icon_water_tap.paa),
{
+ //IGNORE_PRIVATE_WARNING ["_player", "_target"];
private _waterSource = _target getVariable [QEGVAR(field_rations,waterSource), objNull];
[_player, _waterSource] call FUNC(coolWeaponWithWaterSource);
},
diff --git a/addons/overheating/functions/fnc_coolWeaponWithWaterSource.sqf b/addons/overheating/functions/fnc_coolWeaponWithWaterSource.sqf
index 67f22a3cc08..18f8b0f31a3 100644
--- a/addons/overheating/functions/fnc_coolWeaponWithWaterSource.sqf
+++ b/addons/overheating/functions/fnc_coolWeaponWithWaterSource.sqf
@@ -37,7 +37,7 @@ private _fnc_onFinish = {
] call CBA_fnc_notify;
};
- [_player, _player, currentWeapon _player] call ace_overheating_fnc_checkTemperature;
+ [_player, _player, currentWeapon _player] call FUNC(checkTemperature);
GVAR(coolingWeaponWithWaterSource) = false;
};
diff --git a/addons/overheating/functions/fnc_getConsumableChildren.sqf b/addons/overheating/functions/fnc_getConsumableChildren.sqf
index 025e9a69397..fea6f897f07 100644
--- a/addons/overheating/functions/fnc_getConsumableChildren.sqf
+++ b/addons/overheating/functions/fnc_getConsumableChildren.sqf
@@ -19,6 +19,7 @@ params ["_unit"];
private _fnc_getActions = {
TRACE_1("Creating overheating consumable item actions",_unit);
+ //IGNORE_PRIVATE_WARNING ["_unit"];
private _actions = [];
private _cfgWeapons = configFile >> "CfgWeapons";
diff --git a/addons/overheating/functions/fnc_getWeaponData.sqf b/addons/overheating/functions/fnc_getWeaponData.sqf
index 8edd86bb1aa..ec68cf67b9d 100644
--- a/addons/overheating/functions/fnc_getWeaponData.sqf
+++ b/addons/overheating/functions/fnc_getWeaponData.sqf
@@ -77,7 +77,7 @@ if (_muzzle == "this") then {
_muzzle = _weapon;
};
-private _reloadTime = getNumber (configfile >> "CfgWeapons" >> _weapon >> (_modes select 0) >> "reloadTime");
+private _reloadTime = getNumber (configFile >> "CfgWeapons" >> _weapon >> (_modes select 0) >> "reloadTime");
private _closedBolt = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(closedBolt));
diff --git a/addons/overheating/functions/fnc_jamWeapon.sqf b/addons/overheating/functions/fnc_jamWeapon.sqf
index 9a5b8b10491..afe6d15e975 100644
--- a/addons/overheating/functions/fnc_jamWeapon.sqf
+++ b/addons/overheating/functions/fnc_jamWeapon.sqf
@@ -80,9 +80,11 @@ if (_unit getVariable [QGVAR(JammingActionID), -1] == -1) then {
private _condition = {
private _unit = _this select 1;
- [_unit] call CBA_fnc_canUseWeapon
- && {currentMuzzle _unit in (_unit getVariable [QGVAR(jammedWeapons), []])}
- && {!(currentMuzzle _unit in (_unit getVariable [QEGVAR(safemode,safedWeapons), []]))}
+ (weaponState _unit) params ["_currentWeapon", "_currentMuzzle"];
+
+ _unit call CBA_fnc_canUseWeapon
+ && {_currentMuzzle in (_unit getVariable [QGVAR(jammedWeapons), []])}
+ && {!(["ace_safemode"] call EFUNC(common,isModLoaded)) || {!([_unit, _currentWeapon, _currentMuzzle] call EFUNC(safemode,getWeaponSafety))}}
};
private _statement = {
diff --git a/addons/overheating/stringtable.xml b/addons/overheating/stringtable.xml
index d5e8ad7ca87..0d3f0dd96eb 100644
--- a/addons/overheating/stringtable.xml
+++ b/addons/overheating/stringtable.xml
@@ -58,6 +58,7 @@
过热系数
과열 계수
Coeficiente de calentamiento
+ Coeficiente de aquecimento
Coefficient for the amount of heat a weapon generates per shot.\nHigher value increases heat.
@@ -70,6 +71,7 @@
武器每次射击产生的热量系数。\n数值越高,热量越高。
매 발사마다 만들어지는 열에 계수를 적용합니다.\n높은 계수는 더 많은 열을 발생시킵니다.
Coeficiente para la cantidad de calor que genera un arma por disparo.\nValores más altos incrementan el calor
+ Coeficiente da quantidade de calor que um armamento gera por disparo.\nValores mais altos potencializam o aquecimento.
Cooling Coefficient
@@ -82,6 +84,7 @@
Коэф. остывания
Coeficiente de enfriado
Coefficient de refroidissement
+ Coeficiente de resfriamento
Coefficient for how quickly a weapon cools down.\nHigher value increases cooling speed.
@@ -94,6 +97,7 @@
Коэффициент скорости остывания орудия.\nЧем больше значение, тем быстрее остывает.
Coeficiente para cómo de rápido se enfría un arma.\nValores más altos incrementan la velocidad de enfriamiento.
Coefficient de rapidité de refroidissement de l'arme.\nUne valeur élevée augmente la vitesse de refroidissement.
+ Coeficiente que determina o quão rápido a arma resfria.\nValores mais altos potencializam o resfriamento.
Suppressor Coefficient
@@ -106,6 +110,7 @@
Коэф. глушителя
Coeficiente del silenciador
Coefficient de suppresion
+ Coeficiente de supressão
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.
diff --git a/addons/overpressure/functions/fnc_firedEHBB.sqf b/addons/overpressure/functions/fnc_firedEHBB.sqf
index 05a761bf068..59b51f28629 100644
--- a/addons/overpressure/functions/fnc_firedEHBB.sqf
+++ b/addons/overpressure/functions/fnc_firedEHBB.sqf
@@ -15,8 +15,8 @@
* Public: No
*/
-//IGNORE_PRIVATE_WARNING ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_vehicle", "_gunner", "_turret"];
-TRACE_10("firedEH:",_unit,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile,_vehicle,_gunner,_turret);
+//IGNORE_PRIVATE_WARNING ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_gunner"];
+TRACE_8("firedEH:",_unit,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile,_gunner);
// Retrieve backblast values
private _bbValues = [_weapon, _ammo, _magazine] call FUNC(getOverPressureValues);
@@ -28,11 +28,11 @@ TRACE_4("cache",_backblastAngle,_backblastRange,_backblastDamage,_offset);
if (_backblastDamage <= 0) exitWith {};
-private _direction = [0, 0, 0] vectorDiff (vectorDir _projectile);
-private _position = ((getPosASL _projectile) vectorAdd (_direction vectorMultiply _offset));
+private _direction = (vectorDir _projectile) vectorMultiply -1;
+private _position = (getPosASL _projectile) vectorAdd (_direction vectorMultiply _offset);
// Damage to others
-private _affected = (ASLtoAGL _position) nearEntities ["CAManBase", _backblastRange];
+private _affected = (ASLToAGL _position) nearEntities ["CAManBase", _backblastRange];
// Let each client handle their own affected units
["ace_overpressure", [_unit, _position, _direction, _weapon, _magazine, _ammo], _affected] call CBA_fnc_targetEvent;
diff --git a/addons/overpressure/functions/fnc_firedEHOP.sqf b/addons/overpressure/functions/fnc_firedEHOP.sqf
index e011098b59e..eb51a055076 100644
--- a/addons/overpressure/functions/fnc_firedEHOP.sqf
+++ b/addons/overpressure/functions/fnc_firedEHOP.sqf
@@ -15,8 +15,8 @@
* Public: No
*/
-//IGNORE_PRIVATE_WARNING ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_vehicle", "_gunner", "_turret"];
-TRACE_10("firedEH:",_unit,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile,_vehicle,_gunner,_turret);
+//IGNORE_PRIVATE_WARNING ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_gunner"];
+TRACE_8("firedEH:",_unit,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile,_gunner);
// Retrieve overpressure values
private _opValues = [_weapon, _ammo, _magazine] call FUNC(getOverPressureValues);
@@ -33,7 +33,7 @@ private _position = getPosASL _projectile;
private _direction = vectorDir _projectile;
// Damage to others
-private _affected = (ASLtoAGL _position) nearEntities ["CAManBase", _dangerZoneRange];
+private _affected = (ASLToAGL _position) nearEntities ["CAManBase", _dangerZoneRange];
// Let each client handle their own affected units
["ace_overpressure", [_unit, _position, _direction, _weapon, _magazine, _ammo], _affected] call CBA_fnc_targetEvent;
diff --git a/addons/overpressure/functions/fnc_overpressureDamage.sqf b/addons/overpressure/functions/fnc_overpressureDamage.sqf
index 12b7a820cab..f727413d4a5 100644
--- a/addons/overpressure/functions/fnc_overpressureDamage.sqf
+++ b/addons/overpressure/functions/fnc_overpressureDamage.sqf
@@ -73,4 +73,4 @@ TRACE_3("cache",_overpressureAngle,_overpressureRange,_overpressureDamage);
#endif
};
};
-} forEach ((ASLtoAGL _posASL) nearEntities ["CAManBase", _overpressureRange]);
+} forEach ((ASLToAGL _posASL) nearEntities ["CAManBase", _overpressureRange]);
diff --git a/addons/overpressure/stringtable.xml b/addons/overpressure/stringtable.xml
index 2ce7615ad45..c8a0aa895d5 100644
--- a/addons/overpressure/stringtable.xml
+++ b/addons/overpressure/stringtable.xml
@@ -52,6 +52,7 @@
Coefficiente distanza di svampata
後方噴射の距離係数
후폭풍 거리 계수
+ Multiplicateur de distance de réflexion
Scales the backblast effect
@@ -60,6 +61,7 @@
Scala l'effetto delle svampate dei lanciarazzi
無反動砲による後方噴射の影響範囲の大きさ
후폭풍 효과의 스케일을 조정합니다
+ Multiplicateur de distance de réflexion
Backblast range
@@ -72,7 +74,7 @@
Дальность реактивной струи
Alcance do Sopro de Disparo
Utóhatás távolsága
- Portée du backblast
+ Portée du souffle
Dosah zpětné tlakové vlny (backblast)
Alcance del cono de fuego
후폭풍 거리
@@ -88,7 +90,7 @@
Угол реактивной струи
Ângulo do Sopro de Disparo
Utóhatás aránya
- Angle du backblast
+ Angle du souffle
Úhel zpětné tlakové vlny (backblast)
Ángulo del cono de fuego
후폭풍 각도
diff --git a/addons/parachute/RscTitles.hpp b/addons/parachute/RscTitles.hpp
index 48cf11bee4d..388115a2a88 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:00";
- x = "0.202094 * safezoneW + safezoneX";
- y = "0.819 * safezoneH + safezoneY";
- w = "0.0380375 * safezoneW";
- h = "0.022 * safezoneH";
+ x = "0.202094 * safeZoneW + safeZoneX";
+ y = "0.819 * safeZoneH + safeZoneY";
+ w = "0.0380375 * safeZoneW";
+ h = "0.022 * safeZoneH";
colorText[] = {0,0,0,1};
};
};
diff --git a/addons/parachute/functions/fnc_cutParachute.sqf b/addons/parachute/functions/fnc_cutParachute.sqf
index c66d9ff0504..604fb201076 100644
--- a/addons/parachute/functions/fnc_cutParachute.sqf
+++ b/addons/parachute/functions/fnc_cutParachute.sqf
@@ -18,6 +18,6 @@
params ["_unit", "_parachute"];
TRACE_2("cutParachute",_unit,_parachute);
-playSound3d ["A3\Sounds_F\characters\parachute\parachute_landing.wss", _unit];
+playSound3D ["A3\Sounds_F\characters\parachute\parachute_landing.wss", _unit];
_unit action ["GetOut", _parachute];
deleteVehicle _parachute;
diff --git a/addons/parachute/stringtable.xml b/addons/parachute/stringtable.xml
index db48a6109cb..b13483dca5e 100644
--- a/addons/parachute/stringtable.xml
+++ b/addons/parachute/stringtable.xml
@@ -146,6 +146,7 @@
开伞失败率
낙하산 펼치기 실패 확률
Probabilidad de fallo de paracaidas
+ Probabilidade de falha do paraquedas
diff --git a/addons/pylons/XEH_postInit.sqf b/addons/pylons/XEH_postInit.sqf
index 3167c0a838a..e1bd05cb53c 100644
--- a/addons/pylons/XEH_postInit.sqf
+++ b/addons/pylons/XEH_postInit.sqf
@@ -2,6 +2,7 @@
GVAR(aircraftWithPylons) = [];
+//IGNORE_PRIVATE_WARNING ["_player", "_target"];
GVAR(loadoutAction) = [ // create action
QGVAR(loadoutAction),
localize LSTRING(ConfigurePylons),
@@ -36,7 +37,7 @@ GVAR(loadoutAction) = [ // create action
[QGVAR(setPylonLoadOutEvent), {
params ["_aircraft", "_pylonIndex", "_pylon", "_turret", "_weaponToRemove"];
TRACE_5("setPylonLoadOutEvent",_aircraft,_pylonIndex,_pylon,_turret,_weaponToRemove);
- _aircraft setPylonLoadOut [_pylonIndex, _pylon, false, _turret];
+ _aircraft setPylonLoadout [_pylonIndex, _pylon, false, _turret];
if (_weaponToRemove != "") then {
{
if (_aircraft turretLocal _x) then {
diff --git a/addons/pylons/functions/fnc_showDialog.sqf b/addons/pylons/functions/fnc_showDialog.sqf
index 9c0faab52d0..7df50c6b2aa 100644
--- a/addons/pylons/functions/fnc_showDialog.sqf
+++ b/addons/pylons/functions/fnc_showDialog.sqf
@@ -73,8 +73,8 @@ GVAR(comboBoxes) = [];
_combo ctrlSetPosition [
(_picturePos select 0) + (_uiPos select 0),
(_picturePos select 1) + (_uiPos select 1),
- 0.1 * safezoneW,
- 0.028 * safezoneH
+ 0.1 * safeZoneW,
+ 0.028 * safeZoneH
];
_combo ctrlCommit 0;
@@ -113,10 +113,10 @@ GVAR(comboBoxes) = [];
[_button, false, _turret] call FUNC(onButtonTurret);
_button ctrlAddEventHandler ["ButtonClick", {[_this select 0, true, []] call FUNC(onButtonTurret)}];
_button ctrlSetPosition [
- (_picturePos select 0) + (_uiPos select 0) - (0.0165 * safezoneW),
+ (_picturePos select 0) + (_uiPos select 0) - (0.0165 * safeZoneW),
(_picturePos select 1) + (_uiPos select 1),
- 0.0165 * safezoneW,
- 0.028 * safezoneH
+ 0.0165 * safeZoneW,
+ 0.028 * safeZoneH
];
_button ctrlCommit 0;
};
diff --git a/addons/pylons/menu.hpp b/addons/pylons/menu.hpp
index 143792e566e..3f238a9da1c 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/quickmount/XEH_postInitClient.sqf b/addons/quickmount/XEH_postInitClient.sqf
index 6dbd38742bc..30f655edd82 100644
--- a/addons/quickmount/XEH_postInitClient.sqf
+++ b/addons/quickmount/XEH_postInitClient.sqf
@@ -4,6 +4,6 @@ if (!hasInterface) exitWith {};
["ACE3 Movement", QGVAR(mount), [LLSTRING(KeybindName), LLSTRING(KeybindDescription)], "", {
if (!dialog) then {
- call FUNC(getInNearest);
+ [] call FUNC(getInNearest);
};
}] call CBA_fnc_addKeybind;
diff --git a/addons/quickmount/config.cpp b/addons/quickmount/config.cpp
index d74d99c0503..846e5f05430 100644
--- a/addons/quickmount/config.cpp
+++ b/addons/quickmount/config.cpp
@@ -2,6 +2,7 @@
class CfgPatches {
class ADDON {
+ name = COMPONENT_NAME;
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
diff --git a/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf b/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf
index c1318e3f747..af698510648 100644
--- a/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf
+++ b/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf
@@ -34,14 +34,14 @@
[ARR_5( \
{!isNull objectParent (_this select 0)}, \
{ \
- LOG_1("moved in after %1 frames",diag_frameno-GVAR(frame)); \
+ LOG_1("moved in after %1 frames",diag_frameNo-GVAR(frame)); \
(_this select 0) enableSimulation true; \
}, \
[ARR_3(_player,_moveBackCode,_moveBackParams)], \
TAKEN_SEAT_TIMEOUT, \
{ \
params [ARR_3("_player","_moveBackCode","_moveBackParams")]; \
- WARNING_1("failed move in after %1 frames",diag_frameno-GVAR(frame)); \
+ WARNING_1("failed move in after %1 frames",diag_frameNo-GVAR(frame)); \
[ARR_2(_player,_moveBackParams)] call _moveBackCode; \
localize "str_mis_state_failed" call EFUNC(common,displayTextStructured); \
_player enableSimulation true; \
@@ -58,10 +58,11 @@
)
#define MOVE_IN_CODE(command) (_this select 0) command (_this select 1)
+//IGNORE_PRIVATE_WARNING ["_player", "_target"];
private _fnc_move = {
(_this select 2) params ["_moveInCode", "_moveInParams", "_currentTurret", "_moveBackCode", "_moveBackParams"];
- TRACE_6("fnc_move params",_moveInCode,_moveInParams,_currentTurret,_moveBackCode,_moveBackParams,call {GVAR(frame)=diag_frameno});
+ TRACE_6("fnc_move params",_moveInCode,_moveInParams,_currentTurret,_moveBackCode,_moveBackParams,call {GVAR(frame)=diag_frameNo});
// workaround getting damage when moveOut while vehicle is moving
// also this helps with arma bug when unit is stuck in wrong anim when move in turret with configured enabledByAnimationSource
@@ -83,7 +84,7 @@ private _fnc_move = {
{params ["_target", "_player", "_currentTurret"]; IS_MOVED_OUT},
{
params ["", "_player", "", "_moveInCode", "_moveInParams", "_moveBackCode", "_moveBackParams"];
- LOG_2("moved out after %1 frames",diag_frameno-GVAR(frame),call {GVAR(frame)=diag_frameno; 0});
+ LOG_2("moved out after %1 frames",diag_frameNo-GVAR(frame),call {GVAR(frame)=diag_frameNo; 0});
[_player, _moveInParams] call _moveInCode;
WAIT_IN_OR_MOVE_BACK;
},
@@ -202,15 +203,15 @@ private _cargoNumber = -1;
if (_vehicle lockedTurret _turretPath) then {breakTo "crewLoop"};
if (_role == "gunner" && {unitIsUAV _vehicle}) then {breakTo "crewLoop"};
private _turretConfig = [_vehicleConfig, _turretPath] call CBA_fnc_getTurret;
- if (!_isInVehicle) then {
- _params = ["GetInTurret", _vehicle, _turretPath];
- _statement = {_player action (_this select 2)};
- } else {
+ if (_isInVehicle) then {
private _gunnerCompartments = (_turretConfig >> "gunnerCompartments") call BIS_fnc_getCfgData;
TO_COMPARTMENT_STRING(_gunnerCompartments);
if (_compartment != _gunnerCompartments) then {breakTo "crewLoop"};
_params = [{MOVE_IN_CODE(moveInTurret)}, [_vehicle, _turretPath], _currentTurret, _moveBackCode, _moveBackParams];
_statement = _fnc_move;
+ } else {
+ _params = ["GetInTurret", _vehicle, _turretPath];
+ _statement = {_player action (_this select 2)};
};
_name = getText (_turretConfig >> "gunnerName");
_icon = switch true do {
diff --git a/addons/rangecard/RscTitles.hpp b/addons/rangecard/RscTitles.hpp
index 720f724be4d..6b8af599752 100644
--- a/addons/rangecard/RscTitles.hpp
+++ b/addons/rangecard/RscTitles.hpp
@@ -73,8 +73,8 @@ class ACE_RangeCard_Dialog {
SizeEX=0.025;
idc=-1;
style=48;
- x="safezoneX";
- y="safezoneY+0.181889";
+ x="safeZoneX";
+ y="safeZoneY+0.181889";
w="1.62727*3/4";
h="1.62727";
colorBackground[]={1,1,1,1};
@@ -84,67 +84,67 @@ class ACE_RangeCard_Dialog {
class CAPTION_TEXT_1: RangeCard_RscText {
idc=770000;
style=ST_LEFT;
- x="safezoneX+0.18";
- y="safezoneY+0.181889+0.0";
+ x="safeZoneX+0.18";
+ y="safeZoneY+0.181889+0.0";
w="0.56*1.62727*3/4";
text=".408 CheyTac - 410 gr Predator Projectiles";
};
class CAPTION_TEXT_2: CAPTION_TEXT_1 {
idc=770001;
SizeEx=0.022;
- y="safezoneY+0.181889+0.03";
+ y="safeZoneY+0.181889+0.03";
text="Drop Tables for B.P.: 1013.25mb; Corrected for MVV at Air/Ammo Temperatures -15-35 °C";
};
class CAPTION_TEXT_3: CAPTION_TEXT_2 {
idc=770002;
- y="safezoneY+0.181889+0.06";
+ y="safeZoneY+0.181889+0.06";
text="CheyTac Intervention - 29'' 1:13'' twist (M-200)";
};
class ZERO_RANGE_TEXT: RangeCard_RscText {
idc=77003;
style=ST_LEFT;
SizeEx=0.028;
- x="safezoneX+0.885";
- y="safezoneY+0.181889+0.01";
+ x="safeZoneX+0.885";
+ y="safeZoneY+0.181889+0.01";
w="0.125*1.62727*3/4";
text="100m ZERO";
};
class BAROMETRIC_PRESSURE_TEXT: ZERO_RANGE_TEXT {
idc=77004;
colorText[]={1,0,0,0.8};
- y="safezoneY+0.181889+0.05";
+ y="safeZoneY+0.181889+0.05";
text="B.P.: 1013.25mb";
};
class TARGET_RANGE_TEXT_1: RangeCard_RscText {
idc=770010;
colorText[]={1,1,1,1};
- x="safezoneX+0.185";
- y="safezoneY+0.181889+0.098";
+ x="safeZoneX+0.185";
+ y="safeZoneY+0.181889+0.098";
text="Target";
};
class TARGET_RANGE_TEXT_2: TARGET_RANGE_TEXT_1 {
idc=770011;
SizeEx=0.03;
- y="safezoneY+0.181889+0.125";
+ y="safeZoneY+0.181889+0.125";
text="Range";
};
class TARGET_RANGE_TEXT_3: TARGET_RANGE_TEXT_1 {
idc=770012;
- y="safezoneY+0.181889+0.152";
+ y="safeZoneY+0.181889+0.152";
text="(m)";
};
class BULLET_DROP_TEXT_1: RangeCard_RscText {
idc=770013;
- x="safezoneX+0.25";
- y="safezoneY+0.181889+0.095";
+ x="safeZoneX+0.25";
+ y="safeZoneY+0.181889+0.095";
w="0.405*1.62727*3/4";
text="Bullet Drop (MRADs)";
};
class WIND_LEAD_CAPTION_LIST: RangeCard_RscListNBox {
idc=770100;
sizeEx=0.021;
- x="safezoneX+0.728";
- y="safezoneY+0.181889+0.091";
+ x="safeZoneX+0.728";
+ y="safeZoneY+0.181889+0.091";
w="0.25*1.62727*3/4";
h="0.0909445";
columns[]={"0.03/2", "0.985/2"};
@@ -153,8 +153,8 @@ class ACE_RangeCard_Dialog {
};
class TEMPERATURE_CAPTION_LIST_1: RangeCard_RscListNBox {
idc=770200;
- x="safezoneX+0.24";
- y="safezoneY+0.181889+0.125";
+ x="safeZoneX+0.24";
+ 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"};
@@ -163,8 +163,8 @@ class ACE_RangeCard_Dialog {
};
class TEMPERATURE_CAPTION_LIST_2: RangeCard_RscListNBox {
idc=770300;
- x="safezoneX+0.728";
- y="safezoneY+0.181889+0.15";
+ x="safeZoneX+0.728";
+ 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"};
@@ -173,8 +173,8 @@ class ACE_RangeCard_Dialog {
};
class RANGE_CARD_DATA: RangeCard_RscListNBox {
idc=770400;
- x="safezoneX+0.182";
- y="safezoneY+0.181889+0.194";
+ x="safeZoneX+0.182";
+ 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",
@@ -185,13 +185,13 @@ class ACE_RangeCard_Dialog {
class FOOTNOTE_TEXT_1: CAPTION_TEXT_1 {
idc=770020;
SizeEx=0.022;
- y="safezoneY+1.72431";
+ y="safeZoneY+1.72431";
w="0.705*1.62727*3/4";
text="For best results keep ammunition at ambient air temperature. Tables calculated for the above listed barrel";
};
class FOOTNOTE_TEXT_2: FOOTNOTE_TEXT_1 {
idc=770021;
- y="safezoneY+1.72431+0.024";
+ y="safeZoneY+1.72431+0.024";
text="and load with optic mounted 1.5'' above line of bore.";
};
};
diff --git a/addons/rangecard/config.cpp b/addons/rangecard/config.cpp
index f300fb1a308..56ebec629da 100644
--- a/addons/rangecard/config.cpp
+++ b/addons/rangecard/config.cpp
@@ -6,7 +6,7 @@ class CfgPatches {
units[] = {"ACE_Item_RangeCard"};
weapons[] = {"ACE_RangeCard"};
requiredVersion = REQUIRED_VERSION;
- requiredAddons[] = {"ACE_Advanced_Ballistics","ace_scopes"};
+ requiredAddons[] = {"ace_advanced_ballistics", "ace_scopes"};
author = ECSTRING(common,ACETeam);
authors[] = {"Ruthberg"};
url = ECSTRING(main,URL);
diff --git a/addons/rangecard/functions/fnc_calculateRangeCard.sqf b/addons/rangecard/functions/fnc_calculateRangeCard.sqf
index d2347b84944..c16b202539e 100644
--- a/addons/rangecard/functions/fnc_calculateRangeCard.sqf
+++ b/addons/rangecard/functions/fnc_calculateRangeCard.sqf
@@ -65,7 +65,7 @@ private _n = 0;
private _range = 0;
if (_useABConfig) then {
- _bc = parseNumber(("ace_advanced_ballistics" callExtension format["atmosphericCorrection:%1:%2:%3:%4:%5", _bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel]));
+ _bc = parseNumber (("ace" callExtension ["ballistics:atmospheric_correction", [_bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel]]) select 0);
};
private _airFrictionCoef = 1;
@@ -83,8 +83,8 @@ _bulletPos set [1, 0];
_bulletPos set [2, -(_boreHeight / 100)];
_bulletVelocity set [0, 0];
-_bulletVelocity set [1, Cos(_scopeBaseAngle) * _muzzleVelocity];
-_bulletVelocity set [2, Sin(_scopeBaseAngle) * _muzzleVelocity];
+_bulletVelocity set [1, cos(_scopeBaseAngle) * _muzzleVelocity];
+_bulletVelocity set [2, sin(_scopeBaseAngle) * _muzzleVelocity];
while {_TOF < 6 && (_bulletPos select 1) < _targetRange} do {
_bulletSpeed = vectorMagnitude _bulletVelocity;
@@ -99,7 +99,7 @@ while {_TOF < 6 && (_bulletPos select 1) < _targetRange} do {
_trueSpeed = vectorMagnitude _trueVelocity;
if (_useABConfig) then {
- private _drag = parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3:%4", _dragModel, _bc, _trueSpeed, _temperature]));
+ private _drag = parseNumber (("ace" callExtension ["ballistics:retard", [_dragModel, _bc, _trueSpeed, _temperature]]) select 0);
_bulletAccel = (vectorNormalized _trueVelocity) vectorMultiply (-1 * _drag);
} else {
_bulletAccel = _trueVelocity vectorMultiply (_trueSpeed * _airFriction * _airFrictionCoef);
@@ -123,21 +123,21 @@ while {_TOF < 6 && (_bulletPos select 1) < _targetRange} do {
_tz = (_lastBulletPos select 2) + (_range - (_lastBulletPos select 1)) * ((_bulletPos select 2) - (_lastBulletPos select 2)) / ((_bulletPos select 1) - (_lastBulletPos select 1));
_elevation = - atan(_tz / _range);
_windage = - atan(_tx / _range);
- _lead = (_targetSpeed * _TOF) / (Tan(MRAD_TO_DEG(1)) * _range);
+ _lead = (_targetSpeed * _TOF) / (tan(MRAD_TO_DEG(1)) * _range);
};
- private _elevationString = Str(round(-DEG_TO_MRAD(_elevation) * 10) / 10);
+ private _elevationString = str(round(-DEG_TO_MRAD(_elevation) * 10) / 10);
if (_elevationString == "0") then {
_elevationString = "-0.0";
};
if (_elevationString find "." == -1) then {
_elevationString = _elevationString + ".0";
};
- private _windageString = Str(round(DEG_TO_MRAD(_windage) * 10) / 10);
+ private _windageString = str(round(DEG_TO_MRAD(_windage) * 10) / 10);
if (_windageString find "." == -1) then {
_windageString = _windageString + ".0";
};
- private _leadString = Str(round(_lead * 10) / 10);
+ private _leadString = str(round(_lead * 10) / 10);
if (_leadString find "." == -1) then {
_leadString = _leadString + ".0";
};
diff --git a/addons/rangecard/functions/fnc_updateRangeCard.sqf b/addons/rangecard/functions/fnc_updateRangeCard.sqf
index c2c86738444..76b679accf5 100644
--- a/addons/rangecard/functions/fnc_updateRangeCard.sqf
+++ b/addons/rangecard/functions/fnc_updateRangeCard.sqf
@@ -42,7 +42,7 @@ for "_row" from 0 to 49 do {
_control ctrlSetTextColor [0, 0, 0, 1];
};
_control ctrlCommit 0;
- _control ctrlSetText Str(100 + _row * 50);
+ _control ctrlSetText str(100 + _row * 50);
GVAR(controls) pushBack _control;
};
for "_column" from 0 to 8 do {
@@ -161,11 +161,9 @@ if (_isABenabled) then {
private _cacheEntry = missionNamespace getVariable format [QGVAR(%1_%2_%3_%4_%5_%6_%7), _zeroRange, _boreHeight, _ammoClass, _weaponClass, _isABenabled, _useBarrelLengthInfluence, _useAmmoTemperatureInfluence];
if (isNil "_cacheEntry") then {
private _scopeBaseAngle = if (!_isABenabled) then {
- private _zeroAngle = "ace_advanced_ballistics" callExtension format ["calcZero:%1:%2:%3:%4", _zeroRange, _muzzleVelocity, _airFriction, _boreHeight];
- (parseNumber _zeroAngle)
+ parseNumber (("ace" callExtension ["ballistics:zero_vanilla", [_zeroRange, _muzzleVelocity, _airFriction, _boreHeight]]) select 0)
} else {
- private _zeroAngle = "ace_advanced_ballistics" callExtension format ["calcZeroAB:%1:%2:%3:%4:%5:%6:%7:%8:%9", _zeroRange, _muzzleVelocity, _boreHeight, EGVAR(scopes,zeroReferenceTemperature), EGVAR(scopes,zeroReferenceBarometricPressure), EGVAR(scopes,zeroReferenceHumidity), _bc, _dragModel, _atmosphereModel];
- (parseNumber _zeroAngle)
+ parseNumber (("ace" callExtension ["ballistics:zero_advanced", [_zeroRange, _muzzleVelocity, _boreHeight, EGVAR(scopes,zeroReferenceTemperature), EGVAR(scopes,zeroReferenceBarometricPressure), EGVAR(scopes,zeroReferenceHumidity), _bc, _dragModel, _atmosphereModel]]) select 0)
};
if (_useAmmoTemperatureInfluence) then {
{
diff --git a/addons/realisticnames/CfgMagazines.hpp b/addons/realisticnames/CfgMagazines.hpp
index be7ce2b2a51..dc5beec603c 100644
--- a/addons/realisticnames/CfgMagazines.hpp
+++ b/addons/realisticnames/CfgMagazines.hpp
@@ -390,12 +390,6 @@ class CfgMagazines {
class DemoCharge_Remote_Mag: SatchelCharge_Remote_Mag {
displayName = CSTRING(DemoCharge_Name);
};
- class ACE_SatchelCharge_Remote_Mag_Throwable: CA_Magazine {
- displayName = CSTRING(SatchelChargeThrowable_Name);
- };
- class ACE_DemoCharge_Remote_Mag_Throwable: ACE_SatchelCharge_Remote_Mag_Throwable {
- displayName = CSTRING(DemoChargeThrowable_Name);
- };
// hand grenades
class HandGrenade: CA_Magazine {
diff --git a/addons/realisticnames/CfgVehicles.hpp b/addons/realisticnames/CfgVehicles.hpp
index 29ac412957f..ba95cf147d5 100644
--- a/addons/realisticnames/CfgVehicles.hpp
+++ b/addons/realisticnames/CfgVehicles.hpp
@@ -1,6 +1,5 @@
-
class CfgVehicles {
- // static weapons
+ // Static weapons
class StaticMGWeapon;
class HMG_01_base_F: StaticMGWeapon {
displayName = CSTRING(HMG_01_Name);
@@ -61,7 +60,7 @@ class CfgVehicles {
displayName = CSTRING(MRAP_01_hmg_Name);
};
- // punisher
+ // Punisher
class MRAP_02_base_F;
class O_MRAP_02_F: MRAP_02_base_F {
displayName = CSTRING(MRAP_02_Name);
@@ -86,7 +85,7 @@ class CfgVehicles {
displayName = CSTRING(MRAP_02_gmg_Name);
};
- // strider
+ // Strider
class MRAP_03_base_F;
class I_MRAP_03_F: MRAP_03_base_F {
displayName = CSTRING(MRAP_03_Name);
@@ -102,7 +101,7 @@ class CfgVehicles {
displayName = CSTRING(MRAP_03_gmg_Name);
};
- // merkava derivates
+ // Merkava derivates
class MBT_01_base_F;
class B_MBT_01_base_F: MBT_01_base_F {};
@@ -124,7 +123,7 @@ class CfgVehicles {
class B_MBT_01_mlrs_base_F: MBT_01_mlrs_base_F {};
class B_MBT_01_mlrs_F: B_MBT_01_mlrs_base_F {
- displayName = CSTRING(MBT_01_mlrs_Name); // Fictional name, (probably wrong) hebrew translation of storm.
+ displayName = CSTRING(MBT_01_mlrs_Name); // Fictional name, (probably wrong) hebrew translation of storm
};
// T100 derivates
@@ -142,20 +141,20 @@ class CfgVehicles {
displayName = CSTRING(MBT_02_arty_Name);
};
- // leopard sg
+ // Leopard 2 SG
class I_MBT_03_base_F;
class I_MBT_03_cannon_F: I_MBT_03_base_F {
displayName = CSTRING(MBT_03_cannon_Name);
};
- // tracked apcs
+ // Tracked apcs
class B_APC_Tracked_01_base_F;
class B_APC_Tracked_01_rcws_F: B_APC_Tracked_01_base_F {
displayName = CSTRING(APC_Tracked_01_rcws_Name);
};
class B_APC_Tracked_01_AA_F: B_APC_Tracked_01_base_F {
- displayName = CSTRING(APC_Tracked_01_AA_Name); // Fictional name, (probably wrong) hebrew translation of cheetah.
+ displayName = CSTRING(APC_Tracked_01_AA_Name); // Fictional name, (probably wrong) hebrew translation of cheetah
};
class B_APC_Tracked_01_CRV_F: B_APC_Tracked_01_base_F {
@@ -176,7 +175,7 @@ class CfgVehicles {
displayName = CSTRING(APC_tracked_03_cannon_Name);
};
- // wheeled apcs
+ // Wheeled apcs
class B_APC_Wheeled_01_base_F;
class B_APC_Wheeled_01_cannon_F: B_APC_Wheeled_01_base_F {
displayName = CSTRING(APC_Wheeled_01_cannon_Name);
@@ -199,7 +198,7 @@ class CfgVehicles {
displayName = CSTRING(APC_Wheeled_03_cannon_Name);
};
- // trucks
+ // Trucks
class Truck_01_base_F;
class B_Truck_01_transport_F: Truck_01_base_F {
displayName = CSTRING(Truck_01_transport_Name);
@@ -317,7 +316,7 @@ class CfgVehicles {
displayName = CSTRING(Truck_03_medical_Name);
};
- // helicopters
+ // Helicopters
class Heli_Attack_01_base_F;
class B_Heli_Attack_01_F: Heli_Attack_01_base_F {
displayName = CSTRING(Heli_Attack_01_Name);
@@ -398,7 +397,7 @@ class CfgVehicles {
displayName = CSTRING(Heli_Transport_02_Name);
};
- // planes
+ // Planes
class Plane_CAS_01_base_F;
class B_Plane_CAS_01_F: Plane_CAS_01_base_F {
displayName = CSTRING(Plane_CAS_01_Name);
@@ -438,7 +437,7 @@ class CfgVehicles {
displayName = CSTRING(Plane_Fighter_04_Name);
};
- // uavs
+ // UAVs
class UAV_02_base_F;
class B_UAV_02_F: UAV_02_base_F {
displayName = CSTRING(UAV_02_Name);
@@ -472,104 +471,93 @@ class CfgVehicles {
displayName = CSTRING(UAV_02_Name);
};
- // pistols
- class Pistol_Base_F;
- class Weapon_hgun_P07_F: Pistol_Base_F {
- displayName = CSTRING(hgun_P07_Name);
- };
-
- class Weapon_hgun_Rook40_F: Pistol_Base_F {
- displayName = CSTRING(hgun_Rook40_Name);
- };
-
- class Weapon_hgun_ACPC2_F: Pistol_Base_F {
- displayName = CSTRING(hgun_ACPC2_Name);
- };
-
- class Weapon_hgun_Pistol_heavy_01_F: Pistol_Base_F {
- displayName = CSTRING(hgun_Pistol_heavy_01_Name);
- };
-
- class Weapon_hgun_Pistol_heavy_02_F: Pistol_Base_F {
- displayName = CSTRING(hgun_Pistol_heavy_02_Name);
- };
-
- class Weapon_hgun_Pistol_Signal_F: Pistol_Base_F {
- displayName = CSTRING(hgun_Pistol_Signal_Name);
- };
-
- // rocket launchers
- class Launcher_Base_F;
- class Weapon_launch_NLAW_F: Launcher_Base_F {
- displayName = CSTRING(launch_NLAW_Name);
- };
-
- class Weapon_launch_RPG32_F: Launcher_Base_F {
- displayName = CSTRING(launch_RPG32_Name);
- };
-
- /*class Weapon_launch_Titan_F: Launcher_Base_F {
- displayName = CSTRING(launch_Titan_Name);
- };
-
- class Weapon_launch_Titan_short_F: Launcher_Base_F {
- displayName = CSTRING(launch_Titan_short_Name);
- };
-
- class Weapon_launch_B_Titan_F: Launcher_Base_F {
- displayName = CSTRING(launch_Titan_Name);
- };*/
- //class Weapon_launch_I_Titan_F: Weapon_launch_B_Titan_F {};
- //class Weapon_launch_O_Titan_F: Weapon_launch_B_Titan_F {};
-
- /*class Weapon_launch_launch_B_Titan_short_F: Launcher_Base_F {
- displayName = CSTRING(launch_Titan_short_Name);
- };*/
- //class Weapon_launch_I_Titan_short_F: Weapon_launch_launch_B_Titan_short_F {};
- //class Weapon_launch_O_Titan_short_F: Weapon_launch_launch_B_Titan_short_F {};
+ #include "CfgVehiclesAttachments.hpp"
- // rifles
+ // Assault rifles
// MX
class Weapon_Base_F;
class Weapon_arifle_MX_F: Weapon_Base_F {
displayName = CSTRING(arifle_MX_Name);
};
+ class Weapon_arifle_MX_Black_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MX_Black_Name);
+ };
+ class Weapon_arifle_MX_khk_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MX_Khaki_Name);
+ };
class Weapon_arifle_MXC_F: Weapon_Base_F {
displayName = CSTRING(arifle_MXC_Name);
};
+ class Weapon_arifle_MXC_Black_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MXC_Black_Name);
+ };
+ class Weapon_arifle_MXC_khk_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MXC_Khaki_Name);
+ };
class Weapon_arifle_MX_GL_F: Weapon_Base_F {
displayName = CSTRING(arifle_MX_GL_Name);
};
+ class Weapon_arifle_MX_GL_Black_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MX_GL_Black_Name);
+ };
+ class Weapon_arifle_MX_GL_khk_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MX_GL_Khaki_Name);
+ };
class Weapon_arifle_MX_SW_F: Weapon_Base_F {
displayName = CSTRING(arifle_MX_SW_Name);
};
+ class Weapon_arifle_MX_SW_Black_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MX_SW_Black_Name);
+ };
+ class Weapon_arifle_MX_SW_khk_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MX_SW_Khaki_Name);
+ };
class Weapon_arifle_MXM_F: Weapon_Base_F {
displayName = CSTRING(arifle_MXM_Name);
};
+ class Weapon_arifle_MXM_Black_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MXM_Black_Name);
+ };
+ class Weapon_arifle_MXM_khk_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MXM_Khaki_Name);
+ };
// Katiba
class Weapon_arifle_Katiba_F: Weapon_Base_F {
displayName = CSTRING(arifle_Katiba_Name);
};
-
class Weapon_arifle_Katiba_C_F: Weapon_Base_F {
displayName = CSTRING(arifle_Katiba_C_Name);
};
-
class Weapon_arifle_Katiba_GL_F: Weapon_Base_F {
displayName = CSTRING(arifle_Katiba_GL_Name);
};
+ // SDAR
+ class Weapon_arifle_SDAR_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_SDAR_Name);
+ };
+
+ // TAR-21
+ class Weapon_arifle_TRG21_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_TRG21_Name);
+ };
+ class Weapon_arifle_TRG20_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_TRG20_Name);
+ };
+ class Weapon_arifle_TRG21_GL_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_TRG21_GL_Name);
+ };
+
// F2000
class Weapon_arifle_Mk20_F: Weapon_Base_F {
displayName = CSTRING(arifle_Mk20_Name);
};
-
class Weapon_arifle_Mk20_plain_F: Weapon_Base_F {
displayName = CSTRING(arifle_Mk20_plain_Name);
};
@@ -577,7 +565,6 @@ class CfgVehicles {
class Weapon_arifle_Mk20C_F: Weapon_Base_F {
displayName = CSTRING(arifle_Mk20C_Name);
};
-
class Weapon_arifle_Mk20C_plain_F: Weapon_Base_F {
displayName = CSTRING(arifle_Mk20C_plain_Name);
};
@@ -585,46 +572,102 @@ class CfgVehicles {
class Weapon_arifle_Mk20_GL_F: Weapon_Base_F {
displayName = CSTRING(arifle_Mk20_GL_Name);
};
-
class Weapon_arifle_Mk20_GL_plain_F: Weapon_Base_F {
displayName = CSTRING(arifle_Mk20_GL_plain_Name);
};
- // TAR-21
- class Weapon_arifle_TRG21_F: Weapon_Base_F {
- displayName = CSTRING(arifle_TRG21_Name);
+ // P90 (1.86)
+ class Weapon_SMG_03_TR_black: Weapon_Base_F {
+ displayName = CSTRING(PS90_TR_Black_Name);
};
-
- class Weapon_arifle_TRG20_F: Weapon_Base_F {
- displayName = CSTRING(arifle_TRG20_Name);
+ class Weapon_SMG_03_TR_khaki: Weapon_Base_F {
+ displayName = CSTRING(PS90_TR_Khaki_Name);
};
-
- class Weapon_arifle_TRG21_GL_F: Weapon_Base_F {
- displayName = CSTRING(arifle_TRG21_GL_Name);
+ class Weapon_SMG_03_TR_camo: Weapon_Base_F {
+ displayName = CSTRING(PS90_TR_Camo_Name);
+ };
+ class Weapon_SMG_03_TR_hex: Weapon_Base_F {
+ displayName = CSTRING(PS90_TR_Hex_Name);
+ };
+ class Weapon_SMG_03_black: Weapon_Base_F {
+ displayName = CSTRING(PS90_Black_Name);
+ };
+ class Weapon_SMG_03_khaki: Weapon_Base_F {
+ displayName = CSTRING(PS90_Khaki_Name);
+ };
+ class Weapon_SMG_03_camo: Weapon_Base_F {
+ displayName = CSTRING(PS90_Camo_Name);
+ };
+ class Weapon_SMG_03_hex: Weapon_Base_F {
+ displayName = CSTRING(PS90_Hex_Name);
+ };
+ class Weapon_SMG_03C_TR_black: Weapon_Base_F {
+ displayName = CSTRING(P90_TR_Black_Name);
+ };
+ class Weapon_SMG_03C_TR_khaki: Weapon_Base_F {
+ displayName = CSTRING(P90_TR_Khaki_Name);
+ };
+ class Weapon_SMG_03C_TR_camo: Weapon_Base_F {
+ displayName = CSTRING(P90_TR_Camo_Name);
+ };
+ class Weapon_SMG_03C_TR_hex: Weapon_Base_F {
+ displayName = CSTRING(P90_TR_Hex_Name);
+ };
+ class Weapon_SMG_03C_black: Weapon_Base_F {
+ displayName = CSTRING(P90_Black_Name);
+ };
+ class Weapon_SMG_03C_khaki: Weapon_Base_F {
+ displayName = CSTRING(P90_Khaki_Name);
+ };
+ class Weapon_SMG_03C_camo: Weapon_Base_F {
+ displayName = CSTRING(P90_Camo_Name);
+ };
+ class Weapon_SMG_03C_hex: Weapon_Base_F {
+ displayName = CSTRING(P90_Hex_Name);
};
- // sub machine guns
+ // Vector
class Weapon_SMG_01_F: Weapon_Base_F {
displayName = CSTRING(SMG_01_Name);
};
+ // Scorpion
class Weapon_SMG_02_F: Weapon_Base_F {
displayName = CSTRING(SMG_02_Name);
};
- class Weapon_SMG_05_F: Weapon_Base_F {
- displayName = CSTRING(SMG_05);
- };
-
+ // CPW
class Weapon_hgun_PDW2000_F: Weapon_Base_F {
displayName = CSTRING(hgun_PDW2000_Name);
};
- class Weapon_arifle_SDAR_F: Weapon_Base_F {
- displayName = CSTRING(arifle_SDAR_Name);
+ // Pistols
+ class Pistol_Base_F;
+ class Weapon_hgun_P07_F: Pistol_Base_F {
+ displayName = CSTRING(hgun_P07_Name);
+ };
+
+ class Weapon_hgun_Rook40_F: Pistol_Base_F {
+ displayName = CSTRING(hgun_Rook40_Name);
+ };
+
+ class Weapon_hgun_ACPC2_F: Pistol_Base_F {
+ displayName = CSTRING(hgun_ACPC2_Name);
+ };
+
+ class Weapon_hgun_Pistol_heavy_01_F: Pistol_Base_F {
+ displayName = CSTRING(hgun_Pistol_heavy_01_Name);
+ };
+
+ class Weapon_hgun_Pistol_heavy_02_F: Pistol_Base_F {
+ displayName = CSTRING(hgun_Pistol_heavy_02_Name);
+ };
+
+ class Weapon_hgun_Pistol_Signal_F: Pistol_Base_F {
+ displayName = CSTRING(hgun_Pistol_Signal_Name);
};
- // machine guns
+ // Machine guns
class Weapon_LMG_Mk200_F: Weapon_Base_F {
displayName = CSTRING(LMG_Mk200_Name);
};
@@ -633,40 +676,73 @@ class CfgVehicles {
displayName = CSTRING(LMG_Zafir_Name);
};
- // sniper rifles
+ // Sniper rifles
class Weapon_srifle_EBR_F: Weapon_Base_F {
displayName = CSTRING(srifle_EBR_Name);
};
+ class Weapon_srifle_LRR_F: Weapon_Base_F {
+ displayName = CSTRING(srifle_LRR_Name);
+ };
+ class Weapon_srifle_LRR_camo_F: Weapon_Base_F {
+ displayName = CSTRING(srifle_LRR_camo_Name);
+ };
+
class Weapon_srifle_GM6_F: Weapon_Base_F {
displayName = CSTRING(srifle_GM6_Name);
};
-
class Weapon_srifle_GM6_camo_F: Weapon_Base_F {
displayName = CSTRING(srifle_GM6_camo_Name);
};
- class Weapon_srifle_LRR_F: Weapon_Base_F {
- displayName = CSTRING(srifle_LRR_Name);
+ class Weapon_srifle_DMR_01_F: Weapon_Base_F {
+ displayName = CSTRING(srifle_DMR_01_Name);
};
- class Weapon_srifle_LRR_camo_F: Weapon_Base_F {
- displayName = CSTRING(srifle_LRR_camo_Name);
+ // Rocket launchers
+ class Launcher_Base_F;
+ class Weapon_launch_RPG32_F: Launcher_Base_F {
+ displayName = CSTRING(launch_RPG32_Name);
};
- class Weapon_srifle_DMR_01_F: Weapon_Base_F {
- displayName = CSTRING(srifle_DMR_01_Name);
+ class Weapon_launch_NLAW_F: Launcher_Base_F {
+ displayName = CSTRING(launch_NLAW_Name);
};
- // marksmen
- /*class Weapon_srifle_DMR_02_F: Weapon_Base_F {
- displayName = CSTRING(srifle_DMR_02);
+ /*class Weapon_launch_Titan_F: Launcher_Base_F {
+ displayName = CSTRING(launch_Titan_Name);
+ };
+
+ class Weapon_launch_Titan_short_F: Launcher_Base_F {
+ displayName = CSTRING(launch_Titan_short_Name);
+ };
+
+ class Weapon_launch_B_Titan_F: Launcher_Base_F {
+ displayName = CSTRING(launch_Titan_Name);
+ };*/
+ //class Weapon_launch_I_Titan_F: Weapon_launch_B_Titan_F {};
+ //class Weapon_launch_O_Titan_F: Weapon_launch_B_Titan_F {};
+
+ /*class Weapon_launch_launch_B_Titan_short_F: Launcher_Base_F {
+ displayName = CSTRING(launch_Titan_short_Name);
+ };*/
+ //class Weapon_launch_I_Titan_short_F: Weapon_launch_launch_B_Titan_short_F {};
+ //class Weapon_launch_O_Titan_short_F: Weapon_launch_launch_B_Titan_short_F {};
+
+ class Weapon_launch_O_Vorona_brown_F: Launcher_Base_F {
+ displayName = CSTRING(launch_Vorona_brown);
+ };
+ class Weapon_launch_O_Vorona_green_F: Launcher_Base_F {
+ displayName = CSTRING(launch_Vorona_green);
};
+ // Marksmen marksman
+ class Weapon_srifle_DMR_02_F: Weapon_Base_F {
+ displayName = CSTRING(srifle_DMR_02);
+ };
class Weapon_srifle_DMR_02_camo_F: Weapon_Base_F {
displayName = CSTRING(srifle_DMR_02_camo);
};
-
class Weapon_srifle_DMR_02_sniper_F: Weapon_Base_F {
displayName = CSTRING(srifle_DMR_02_sniper);
};
@@ -674,19 +750,15 @@ class CfgVehicles {
class Weapon_srifle_DMR_03_F: Weapon_Base_F {
displayName = CSTRING(srifle_DMR_03);
};
-
class Weapon_srifle_DMR_03_khaki_F: Weapon_Base_F {
displayName = CSTRING(srifle_DMR_03_khaki);
};
-
class Weapon_srifle_DMR_03_tan_F: Weapon_Base_F {
displayName = CSTRING(srifle_DMR_03_tan);
};
-
class Weapon_srifle_DMR_03_multicam_F: Weapon_Base_F {
displayName = CSTRING(srifle_DMR_03_multicam);
};
-
class Weapon_srifle_DMR_03_woodland_F: Weapon_Base_F {
displayName = CSTRING(srifle_DMR_03_woodland);
};
@@ -694,7 +766,6 @@ class CfgVehicles {
class Weapon_srifle_DMR_04_F: Weapon_Base_F {
displayName = CSTRING(srifle_DMR_04);
};
-
class Weapon_srifle_DMR_04_Tan_F: Weapon_Base_F {
displayName = CSTRING(srifle_DMR_04_Tan);
};
@@ -702,11 +773,9 @@ class CfgVehicles {
class Weapon_srifle_DMR_05_blk_F: Weapon_Base_F {
displayName = CSTRING(srifle_DMR_05_blk);
};
-
class Weapon_srifle_DMR_05_hex_F: Weapon_Base_F {
displayName = CSTRING(srifle_DMR_05_hex);
};
-
class Weapon_srifle_DMR_05_tan_f: Weapon_Base_F {
displayName = CSTRING(srifle_DMR_05_tan);
};
@@ -714,11 +783,11 @@ class CfgVehicles {
class Weapon_srifle_DMR_06_camo_F: Weapon_Base_F {
displayName = CSTRING(srifle_DMR_06_camo);
};
-
class Weapon_srifle_DMR_06_olive_F: Weapon_Base_F {
displayName = CSTRING(srifle_DMR_06_olive);
};
+ // Marksmen MGs
class Weapon_MMG_01_hex_F: Weapon_Base_F {
displayName = CSTRING(MMG_01_hex);
};
@@ -737,14 +806,58 @@ class CfgVehicles {
class Weapon_MMG_02_sand_F: Weapon_Base_F {
displayName = CSTRING(MMG_02_sand);
- };*/
+ };
- //attachments
+ // Tanks DLC
- class Item_Base_F;
+ // Rooikat 120 (Rhino MGS)
+ class AFV_Wheeled_01_base_F;
+ class B_AFV_Wheeled_01_cannon_F: AFV_Wheeled_01_base_F {
+ displayName = CSTRING(afv_wheeled_01);
+ };
+ class B_T_AFV_Wheeled_01_cannon_F: AFV_Wheeled_01_base_F {
+ displayName = CSTRING(afv_wheeled_01);
+ };
+ class AFV_Wheeled_01_up_base_F;
+ class B_AFV_Wheeled_01_up_cannon_F: AFV_Wheeled_01_up_base_F {
+ displayName = CSTRING(afv_wheeled_01_up);
+ };
+ class B_T_AFV_Wheeled_01_up_cannon_F: AFV_Wheeled_01_up_base_F {
+ displayName = CSTRING(afv_wheeled_01_up);
+ };
+
+ // T-14 Armata (T-140 Angara)
+ class MBT_04_cannon_base_F;
+ class O_MBT_04_cannon_F: MBT_04_cannon_base_F {
+ displayName = CSTRING(MBT_04_cannon);
+ };
+ class O_T_MBT_04_cannon_F: MBT_04_cannon_base_F {
+ displayName = CSTRING(MBT_04_cannon);
+ };
+ class MBT_04_command_base_F; // Keep "K" designation for command variant.
+ class O_MBT_04_command_F: MBT_04_command_base_F {
+ displayName = CSTRING(MBT_04_command);
+ };
+ class O_T_MBT_04_command_F: MBT_04_command_base_F {
+ displayName = CSTRING(MBT_04_command);
+ };
- class Item_acc_flashlight: Item_Base_F {
- displayName="UTG Defender 126";
+ // Wiesel 2 (AWC 302 Nyx)
+ class LT_01_AA_base_F;
+ class I_LT_01_AA_F: LT_01_AA_base_F {
+ displayName = CSTRING(LT_01_AA);
+ };
+ class LT_01_AT_base_F;
+ class I_LT_01_AT_F: LT_01_AT_base_F {
+ displayName = CSTRING(LT_01_AT);
+ };
+ class LT_01_cannon_base_F;
+ class I_LT_01_cannon_F: LT_01_cannon_base_F {
+ displayName = CSTRING(LT_01_cannon);
+ };
+ class LT_01_scout_base_F;
+ class I_LT_01_scout_F: LT_01_scout_base_F {
+ displayName = CSTRING(LT_01_scout);
};
// APEX/Tanoa
@@ -815,54 +928,266 @@ class CfgVehicles {
displayName = CSTRING(lsv_02_at);
};
- // Rooikat 120 (Rhino MGS)
- class AFV_Wheeled_01_base_F;
- class B_AFV_Wheeled_01_cannon_F: AFV_Wheeled_01_base_F {
- displayName = CSTRING(afv_wheeled_01);
+ // Type 115
+ class Weapon_arifle_ARX_blk_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_arx_blk_Name);
};
- class B_T_AFV_Wheeled_01_cannon_F: AFV_Wheeled_01_base_F {
- displayName = CSTRING(afv_wheeled_01);
+ class Weapon_arifle_ARX_ghex_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_arx_ghex_Name);
};
- class AFV_Wheeled_01_up_base_F;
- class B_AFV_Wheeled_01_up_cannon_F: AFV_Wheeled_01_up_base_F {
- displayName = CSTRING(afv_wheeled_01_up);
+ class Weapon_arifle_ARX_hex_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_arx_hex_Name);
};
- class B_T_AFV_Wheeled_01_up_cannon_F: AFV_Wheeled_01_up_base_F {
- displayName = CSTRING(afv_wheeled_01_up);
+
+ // QBZ-95 and variants
+ class Weapon_arifle_CTAR_blk_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_CTAR_blk);
+ };
+ class Weapon_arifle_CTAR_ghex_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_CTAR_ghex);
+ };
+ class Weapon_arifle_CTAR_hex_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_CTAR_hex);
};
- // T-14 Armata (T-140 Angara)
- class MBT_04_cannon_base_F;
- class O_MBT_04_cannon_F: MBT_04_cannon_base_F {
- displayName = CSTRING(MBT_04_cannon);
+ class Weapon_arifle_CTAR_GL_blk_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_CTAR_GL_blk);
};
- class O_T_MBT_04_cannon_F: MBT_04_cannon_base_F {
- displayName = CSTRING(MBT_04_cannon);
+ class Weapon_arifle_CTAR_GL_ghex_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_CTAR_GL_ghex);
};
- class MBT_04_command_base_F; // Keep "K" designation for command variant.
- class O_MBT_04_command_F: MBT_04_command_base_F {
- displayName = CSTRING(MBT_04_command);
+ class Weapon_arifle_CTAR_GL_hex_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_CTAR_GL_hex);
};
- class O_T_MBT_04_command_F: MBT_04_command_base_F {
- displayName = CSTRING(MBT_04_command);
+
+ class Weapon_arifle_CTARS_blk_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_CTARS_blk);
+ };
+ class Weapon_arifle_CTARS_ghex_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_CTARS_ghex);
+ };
+ class Weapon_arifle_CTARS_hex_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_CTARS_hex);
};
- // Wiesel 2 (AWC 302 Nyx)
- class LT_01_AA_base_F;
- class I_LT_01_AA_F: LT_01_AA_base_F {
- displayName = CSTRING(LT_01_AA);
+ // QBU-88
+ class Weapon_srifle_DMR_07_blk_F: Weapon_Base_F {
+ displayName = CSTRING(srifle_DMR_07_blk);
};
- class LT_01_AT_base_F;
- class I_LT_01_AT_F: LT_01_AT_base_F {
- displayName = CSTRING(LT_01_AT);
+ class Weapon_srifle_DMR_07_ghex_F: Weapon_Base_F {
+ displayName = CSTRING(srifle_DMR_07_ghex);
};
- class LT_01_cannon_base_F;
- class I_LT_01_cannon_F: LT_01_cannon_base_F {
- displayName = CSTRING(LT_01_cannon);
+ class Weapon_srifle_DMR_07_hex_F: Weapon_Base_F {
+ displayName = CSTRING(srifle_DMR_07_hex);
};
- class LT_01_scout_base_F;
- class I_LT_01_scout_F: LT_01_scout_base_F {
- displayName = CSTRING(LT_01_scout);
+
+ // GM6
+ class Weapon_srifle_GM6_ghex_F: Weapon_Base_F {
+ displayName = CSTRING(srifle_GM6_ghex);
+ };
+
+ // M249
+ class Weapon_LMG_03_F: Weapon_Base_F {
+ displayName = CSTRING(LMG_03);
+ };
+
+ // Intervention
+ class Weapon_srifle_LRR_tna_F: Weapon_Base_F {
+ displayName = CSTRING(srifle_LRR_tna);
+ };
+
+ // MP5
+ class Weapon_SMG_05_F: Weapon_Base_F {
+ displayName = CSTRING(SMG_05);
+ };
+
+ // HK416 and variants
+ class Weapon_arifle_SPAR_01_blk_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_SPAR_01_blk);
+ };
+ class Weapon_arifle_SPAR_01_khk_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_SPAR_01_khk);
+ };
+ class Weapon_arifle_SPAR_01_snd_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_SPAR_01_snd);
+ };
+
+ class Weapon_arifle_SPAR_01_GL_blk_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_SPAR_01_GL_blk);
+ };
+ class Weapon_arifle_SPAR_01_GL_khk_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_SPAR_01_GL_khk);
+ };
+ class Weapon_arifle_SPAR_01_GL_snd_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_SPAR_01_GL_snd);
+ };
+
+ class Weapon_arifle_SPAR_02_blk_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_SPAR_02_blk);
+ };
+ class Weapon_arifle_SPAR_02_khk_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_SPAR_02_khk);
+ };
+ class Weapon_arifle_SPAR_02_snd_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_SPAR_02_snd);
+ };
+
+ class Weapon_arifle_SPAR_03_blk_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_SPAR_03_blk);
+ };
+ class Weapon_arifle_SPAR_03_khk_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_SPAR_03_khk);
+ };
+ class Weapon_arifle_SPAR_03_snd_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_SPAR_03_snd);
+ };
+
+ // RPG-32
+ class Weapon_launch_RPG32_ghex_F: Launcher_Base_F {
+ displayName = CSTRING(launch_RPG32_ghex);
+ };
+
+ // P99
+ class Weapon_hgun_P07_khk_F: Pistol_Base_F {
+ displayName = CSTRING(hgun_P07_khk);
+ };
+ class Weapon_hgun_P07_blk_F: Pistol_Base_F {
+ displayName = CSTRING(hgun_P07_blk);
+ };
+
+ // Makarov
+ class Weapon_hgun_Pistol_01_F: Pistol_Base_F {
+ displayName = CSTRING(hgun_Pistol_01);
+ };
+
+ // AKM
+ class Weapon_arifle_AKM_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_AKM);
+ };
+
+ // AKSU
+ class Weapon_arifle_AKS_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_AKS);
};
+ // Contact/Livonia
+
+ // CZ 581 Shotgun
+ class Weapon_sgun_HunterShotgun_01_F: Weapon_Base_F {
+ displayName = CSTRING(sgun_huntershotgun_01_Name);
+ };
+ class Weapon_sgun_HunterShotgun_01_sawedoff_F: Weapon_Base_F {
+ displayName = CSTRING(sgun_huntershotgun_sawedoff_01_Name);
+ };
+
+ // FNX-45 (Green)
+ class Weapon_hgun_Pistol_heavy_01_green_F: Pistol_Base_F {
+ displayName = CSTRING(hgun_Pistol_heavy_01_green_Name);
+ };
+
+ // RPG-32 (Green)
+ class Weapon_launch_RPG32_green_F: Launcher_Base_F {
+ displayName = CSTRING(launch_RPG32_green_Name);
+ };
+
+ // AK15 variants
+ class Weapon_arifle_AK12_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_AK12);
+ };
+ class Weapon_arifle_AK12_lush_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_AK12_lush);
+ };
+ class Weapon_arifle_AK12_arid_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_AK12_arid);
+ };
+
+ class Weapon_arifle_AK12_GL_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_AK12_GL);
+ };
+ class Weapon_arifle_AK12_GL_lush_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_AK12_GL_lush);
+ };
+ class Weapon_arifle_AK12_GL_arid_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_AK12_GL_arid);
+ };
+
+ class Weapon_arifle_AK12U_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_AK12U);
+ };
+ class Weapon_arifle_AK12U_lush_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_AK12U_lush);
+ };
+ class Weapon_arifle_AK12U_arid_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_AK12U_arid);
+ };
+
+ class Weapon_arifle_RPK12_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_RPK12);
+ };
+ class Weapon_arifle_RPK12_lush_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_RPK12_lush);
+ };
+ class Weapon_arifle_RPK12_arid_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_RPK12_arid);
+ };
+
+ // M14 (Classic)
+ class Weapon_srifle_DMR_06_hunter_F: Weapon_Base_F {
+ displayName = CSTRING(srifle_DMR_06_hunter);
+ };
+
+ // Stoner 99 LMG (Black)
+ class Weapon_LMG_Mk200_black_F: Weapon_Base_F {
+ displayName = CSTRING(LMG_Mk200_black);
+ };
+
+ // MSBS Grot variants
+ class Weapon_arifle_MSBS65_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MSBS65);
+ };
+ class Weapon_arifle_MSBS65_black_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MSBS65_black);
+ };
+ class Weapon_arifle_MSBS65_camo_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MSBS65_camo);
+ };
+ class Weapon_arifle_MSBS65_sand_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MSBS65_sand);
+ };
+ class Weapon_arifle_MSBS65_GL_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MSBS65_GL);
+ };
+ class Weapon_arifle_MSBS65_GL_black_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MSBS65_GL_black);
+ };
+ class Weapon_arifle_MSBS65_GL_camo_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MSBS65_GL_camo);
+ };
+ class Weapon_arifle_MSBS65_GL_sand_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MSBS65_GL_sand);
+ };
+ class Weapon_arifle_MSBS65_Mark_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MSBS65_Mark);
+ };
+ class Weapon_arifle_MSBS65_Mark_black_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MSBS65_Mark_black);
+ };
+ class Weapon_arifle_MSBS65_Mark_camo_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MSBS65_Mark_camo);
+ };
+ class Weapon_arifle_MSBS65_Mark_sand_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MSBS65_Mark_sand);
+ };
+ class Weapon_arifle_MSBS65_UBS_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MSBS65_UBS);
+ };
+ class Weapon_arifle_MSBS65_UBS_black_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MSBS65_UBS_black);
+ };
+ class Weapon_arifle_MSBS65_UBS_camo_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MSBS65_UBS_camo);
+ };
+ class Weapon_arifle_MSBS65_UBS_sand_F: Weapon_Base_F {
+ displayName = CSTRING(arifle_MSBS65_UBS_sand);
+ };
};
diff --git a/addons/realisticnames/CfgVehiclesAttachments.hpp b/addons/realisticnames/CfgVehiclesAttachments.hpp
new file mode 100644
index 00000000000..54e6206fe3a
--- /dev/null
+++ b/addons/realisticnames/CfgVehiclesAttachments.hpp
@@ -0,0 +1,146 @@
+// Attachments
+class Item_Base_F;
+class Item_acc_flashlight: Item_Base_F {
+ displayName = CSTRING(flashlight_Name);
+};
+
+class Item_optic_MRD: Item_Base_F {
+ displayName = CSTRING(optic_mrd_Name);
+};
+class Item_optic_MRD_black: Item_Base_F {
+ displayName = CSTRING(optic_mrd_black_Name);
+};
+
+class Item_optic_Hamr: Item_Base_F {
+ displayName = CSTRING(optic_hamr);
+};
+class Item_optic_Hamr_khk_F: Item_Base_F {
+ displayName = CSTRING(optic_hamr_khk);
+};
+
+class Item_optic_Arco: Item_Base_F {
+ displayName = CSTRING(optic_arco);
+};
+class Item_optic_Arco_blk_F: Item_Base_F {
+ displayName = CSTRING(optic_arco_blk);
+};
+class Item_optic_Arco_ghex_F: Item_Base_F {
+ displayName = CSTRING(optic_arco_ghex);
+};
+class Item_optic_Arco_lush_F: Item_Base_F {
+ displayName = CSTRING(optic_arco_lush);
+};
+class Item_optic_Arco_arid_F: Item_Base_F {
+ displayName = CSTRING(optic_arco_arid);
+};
+class Item_optic_Arco_AK_blk_F: Item_Base_F {
+ displayName = CSTRING(optic_arco_ak_blk);
+};
+class Item_optic_Arco_AK_lush_F: Item_Base_F {
+ displayName = CSTRING(optic_arco_ak_lush);
+};
+class Item_optic_Arco_AK_arid_F: Item_Base_F {
+ displayName = CSTRING(optic_arco_ak_arid);
+};
+
+class Item_optic_ERCO_blk_f: Item_Base_F {
+ displayName = CSTRING(optic_erco_blk);
+};
+class Item_optic_ERCO_khk_f: Item_Base_F {
+ displayName = CSTRING(optic_erco_khk);
+};
+class Item_optic_ERCO_snd_f: Item_Base_F {
+ displayName = CSTRING(optic_erco_snd);
+};
+
+class Item_optic_LRPS: Item_Base_F {
+ displayName = CSTRING(optic_lrps);
+};
+class Item_optic_LRPS_ghex_F: Item_Base_F {
+ displayName = CSTRING(optic_lrps_ghex);
+};
+class Item_optic_LRPS_tna_F: Item_Base_F {
+ displayName = CSTRING(optic_lrps_tna);
+};
+
+class Item_optic_AMS: Item_Base_F {
+ displayName = CSTRING(optic_ams);
+};
+class Item_optic_AMS_khk: Item_Base_F {
+ displayName = CSTRING(optic_ams_khk);
+};
+class Item_optic_AMS_snd: Item_Base_F {
+ displayName = CSTRING(optic_ams_snd);
+};
+
+class Item_optic_KHS_blk: Item_Base_F {
+ displayName = CSTRING(optic_khs_blk);
+};
+class Item_optic_KHS_hex: Item_Base_F {
+ displayName = CSTRING(optic_khs_hex);
+};
+class Item_optic_KHS_old: Item_Base_F {
+ displayName = CSTRING(optic_khs_old);
+};
+class Item_optic_KHS_tan: Item_Base_F {
+ displayName = CSTRING(optic_khs_tan);
+};
+
+class Item_optic_DMS: Item_Base_F {
+ displayName = CSTRING(optic_dms);
+};
+class Item_optic_DMS_ghex_F: Item_Base_F {
+ displayName = CSTRING(optic_dms_ghex);
+};
+class Item_optic_DMS_weathered_F: Item_Base_F {
+ displayName = CSTRING(optic_dms_weathered);
+};
+class Item_optic_DMS_weathered_Kir_F: Item_Base_F {
+ displayName = CSTRING(optic_dms_weathered_kir);
+};
+
+class Item_optic_holosight: Item_Base_F {
+ displayName = CSTRING(optic_holosight);
+};
+class Item_optic_Holosight_blk_F: Item_Base_F {
+ displayName = CSTRING(optic_holosight_blk);
+};
+class Item_optic_Holosight_khk_F: Item_Base_F {
+ displayName = CSTRING(optic_holosight_khk);
+};
+class Item_optic_Holosight_lush_F: Item_Base_F {
+ displayName = CSTRING(optic_holosight_lush);
+};
+class Item_optic_Holosight_arid_F: Item_Base_F {
+ displayName = CSTRING(optic_holosight_arid);
+};
+class Item_optic_Holosight_smg: Item_Base_F {
+ displayName = CSTRING(optic_holosight_smg);
+};
+class Item_optic_Holosight_smg_blk_F: Item_Base_F {
+ displayName = CSTRING(optic_holosight_smg_blk);
+};
+class Item_optic_Holosight_smg_khk_F: Item_Base_F {
+ displayName = CSTRING(optic_holosight_smg_khk);
+};
+
+class Item_optic_MRCO: Item_Base_F {
+ displayName = CSTRING(optic_MRCO);
+};
+
+class Item_optic_Yorris: Item_Base_F {
+ displayName = CSTRING(optic_Yorris);
+};
+
+class Item_optic_ACO: Item_Base_F {
+ displayName = CSTRING(optic_ACO);
+};
+class Item_optic_ACO_grn: Item_Base_F {
+ displayName = CSTRING(optic_ACO_grn);
+};
+class Item_optic_ACO_smg: Item_Base_F {
+ displayName = CSTRING(optic_ACO_smg);
+};
+class Item_optic_ACO_grn_smg: Item_Base_F {
+ displayName = CSTRING(optic_ACO_grn_smg);
+};
diff --git a/addons/realisticnames/CfgWeapons.hpp b/addons/realisticnames/CfgWeapons.hpp
index 5b0e33e98c9..c515cf08fc7 100644
--- a/addons/realisticnames/CfgWeapons.hpp
+++ b/addons/realisticnames/CfgWeapons.hpp
@@ -2,8 +2,9 @@ class Mode_SemiAuto;
class Mode_FullAuto;
class CfgWeapons {
- #include "Attachments.hpp"
- // assault rifles
+ #include "CfgWeaponsAttachments.hpp"
+
+ // Assault rifles
// MX
class arifle_MX_Base_F;
@@ -176,13 +177,13 @@ class CfgWeapons {
displayName = CSTRING(SMG_02_Name);
};
- // PDW 2000
+ // CPW
class pdw2000_base_F;
class hgun_pdw2000_F: pdw2000_base_F {
displayName = CSTRING(hgun_PDW2000_Name);
};
- // pistols
+ // Pistols
class Pistol_Base_F;
class hgun_P07_F: Pistol_Base_F {
displayName = CSTRING(hgun_P07_Name);
@@ -208,7 +209,7 @@ class CfgWeapons {
displayName = CSTRING(hgun_Pistol_Signal_Name);
};
- // machine guns
+ // Machine guns
class Rifle_Long_Base_F;
class LMG_Mk200_F: Rifle_Long_Base_F {
displayName = CSTRING(LMG_Mk200_Name);
@@ -218,7 +219,7 @@ class CfgWeapons {
displayName = CSTRING(LMG_Zafir_Name);
};
- // sniper rifles
+ // Sniper rifles
class EBR_base_F;
class srifle_EBR_F: EBR_base_F {
displayName = CSTRING(srifle_EBR_Name);
@@ -245,7 +246,7 @@ class CfgWeapons {
displayName = CSTRING(srifle_DMR_01_Name);
};
- // launchers
+ // Launchers
class Launcher_Base_F;
class launch_RPG32_F: Launcher_Base_F {
displayName = CSTRING(launch_RPG32_Name);
@@ -270,42 +271,35 @@ class CfgWeapons {
displayName = CSTRING(launch_Vorona_green);
};
- // marksmen marksman
+ // Marksmen marksman
class DMR_02_base_F: Rifle_Long_Base_F {
displayName = CSTRING(DMR_02); //MAR-10 .338;
};
-
class srifle_DMR_02_F: DMR_02_base_F {
displayName = CSTRING(srifle_DMR_02); //MAR-10 .338 (Black);
};
-
class srifle_DMR_02_camo_F: srifle_DMR_02_F {
displayName = CSTRING(srifle_DMR_02_camo); //MAR-10 .338 (Camo);
};
-
class srifle_DMR_02_sniper_F: srifle_DMR_02_F {
displayName = CSTRING(srifle_DMR_02_sniper); //MAR-10 .338 (Sand);
};
+
class DMR_03_base_F: Rifle_Long_Base_F {
displayName = CSTRING(DMR_03); //Mk-I EMR 7.62 mm;
};
-
class srifle_DMR_03_F: DMR_03_base_F {
displayName = CSTRING(srifle_DMR_03); //Mk-I EMR 7.62 mm (Black);
};
-
class srifle_DMR_03_khaki_F: srifle_DMR_03_F {
displayName = CSTRING(srifle_DMR_03_khaki); //Mk-I EMR 7.62 mm (Khaki);
};
-
class srifle_DMR_03_tan_F: srifle_DMR_03_F {
displayName = CSTRING(srifle_DMR_03_tan); //Mk-I EMR 7.62 mm (Sand);
};
-
class srifle_DMR_03_multicam_F: srifle_DMR_03_F {
displayName = CSTRING(srifle_DMR_03_multicam); //Mk-I EMR 7.62 mm (Camo);
};
-
class srifle_DMR_03_woodland_F: srifle_DMR_03_F {
displayName = CSTRING(srifle_DMR_03_woodland); //Mk-I EMR 7.62 mm (Woodland);
};
@@ -313,11 +307,9 @@ class CfgWeapons {
class DMR_04_base_F: Rifle_Long_Base_F {
displayName = CSTRING(DMR_04); //ASP-1 Kir 12.7 mm;
};
-
class srifle_DMR_04_F: DMR_04_base_F {
displayName = CSTRING(srifle_DMR_04); //ASP-1 Kir 12.7 mm (Black);
};
-
class srifle_DMR_04_Tan_F: srifle_DMR_04_F {
displayName = CSTRING(srifle_DMR_04_Tan); //ASP-1 Kir 12.7 mm (Tan);
};
@@ -325,31 +317,27 @@ class CfgWeapons {
class DMR_05_base_F: Rifle_Long_Base_F {
displayName = CSTRING(DMR_05); //Cyrus 9.3 mm;
};
-
class srifle_DMR_05_blk_F: DMR_05_base_F {
displayName = CSTRING(srifle_DMR_05_blk); //Cyrus 9.3 mm (Black)
};
-
class srifle_DMR_05_hex_F: srifle_DMR_05_blk_F {
displayName = CSTRING(srifle_DMR_05_hex); //Cyrus 9.3 mm (Hex);
};
-
class srifle_DMR_05_tan_f: srifle_DMR_05_blk_F {
displayName = CSTRING(srifle_DMR_05_tan); //Cyrus 9.3 mm (Tan);
};
+
class DMR_06_base_F: Rifle_Long_Base_F {
displayName = CSTRING(DMR_06); //Mk14 7.62 mm;
};
-
class srifle_DMR_06_camo_F: DMR_06_base_F {
displayName = CSTRING(srifle_DMR_06_camo); //Mk14 7.62 mm (Camo)
};
-
class srifle_DMR_06_olive_F: srifle_DMR_06_camo_F {
displayName = CSTRING(srifle_DMR_06_olive); //Mk14 7.62 mm (Olive);
};
- // marksmen mgs
+ // Marksmen MGs
class MMG_01_base_F: Rifle_Long_Base_F {
displayName = CSTRING(MMG_01); //Navid 9.3 mm;
};
@@ -377,15 +365,12 @@ class CfgWeapons {
displayName = CSTRING(MMG_02_sand); //SPMG .338 (Sand);
};
- // vehicle weapons
+ // Vehicle weapons
- // gatlings
+ // Gatlings
class CannonCore;
class gatling_20mm: CannonCore {
- //displayName = "";
- class manual: CannonCore {
- //displayName = "";
- };
+ class manual;
};
class Twin_Cannon_20mm: gatling_20mm {
displayName = "Plamen PL-20";
@@ -415,7 +400,7 @@ class CfgWeapons {
};
};
- // missiles
+ // Missiles
class RocketPods;
class Missile_AA_04_Plane_CAS_01_F: RocketPods {
displayName = "AIM-9 Sidewinder";
@@ -438,7 +423,7 @@ class CfgWeapons {
displayName = CSTRING(missiles_vorona);
};
- // rockets
+ // Rockets
class Rocket_04_HE_Plane_CAS_01_F: RocketPods {
displayName = "Hydra 70";
class Burst: RocketPods {
@@ -469,7 +454,7 @@ class CfgWeapons {
};
};
- // more missiles
+ // More missiles
class missiles_DAR: RocketPods {
displayName = "Hydra 70";
class Burst: RocketPods {
@@ -492,17 +477,17 @@ class CfgWeapons {
displayName = "AIM-120A AMRAAM";
};
- class missiles_SCALPEL: RocketPods { // according to zGuba, this is what it's based on
+ class missiles_SCALPEL: RocketPods { // According to zGuba, this is what it's based on
displayName = "9K121 Vikhr";
};
- // bomb
+ // Bomb
class Bomb_04_Plane_CAS_01_F;
class Bomb_03_Plane_CAS_02_F: Bomb_04_Plane_CAS_01_F {
displayName = "FAB-250M-54";
};
- // machine guns
+ // Machine guns
class MGunCore;
class M134_minigun: MGunCore {
displayName = "2x M134 Minigun";
@@ -532,11 +517,6 @@ class CfgWeapons {
};
};
- class HMG_127_APC: HMG_127 {};
- class ACE_HMG_127_KORD: HMG_127_APC {
- displayName = "6P49 Kord";
- };
-
class HMG_01: HMG_127 {
displayName = "XM312";
};
@@ -551,7 +531,7 @@ class CfgWeapons {
};
};
- // grenade launchers
+ // Grenade launchers
class GMG_F;
class GMG_20mm: GMG_F {
displayName = "XM307";
@@ -567,7 +547,7 @@ class CfgWeapons {
};
};
- // autocannons
+ // Autocannons
class autocannon_35mm: CannonCore {
displayName = "GDF-001";
class manual: CannonCore {
@@ -575,7 +555,7 @@ class CfgWeapons {
};
};
- // aa missiles
+ // AA missiles
class missiles_titan: MissileLauncher {
displayName = "Mini-Spike";
};
@@ -584,17 +564,17 @@ class CfgWeapons {
displayName = "FIM-92F";
};
- // mortar
+ // Nortar
class mortar_155mm_AMOS: CannonCore {
displayName = "L/52";
};
- // artillery rockets
+ // Artillery rockets
class rockets_230mm_GAT: RocketPods {
displayName = "M269";
};
- // tank guns
+ // Tank guns
class cannon_120mm: CannonCore {
class player;
displayName = "MG251";
@@ -605,10 +585,6 @@ class CfgWeapons {
class player: player {};
};
- class ACE_cannon_120mm_GT12: cannon_120mm {
- displayName = "GT12";
- };
-
class cannon_105mm: CannonCore {
displayName = "M68";
class player: Mode_SemiAuto {
@@ -624,28 +600,12 @@ class CfgWeapons {
displayName = "2A82-1M";
};
- // coax machine guns
+ // Coax machine guns
class LMG_coax: LMG_RCWS {
displayName = "PKT";
};
- class LMG_coax_ext: LMG_coax {};
- class ACE_LMG_coax_ext_MAG58: LMG_coax_ext {
- displayName = "MAG 58M";
- };
- class ACE_LMG_coax_MAG58_mem3: LMG_coax {
- displayName = "MAG 58M";
- };
- class ACE_LMG_coax_L94A1_mem3: LMG_coax {
- displayName = "L94A1";
- };
- class ACE_LMG_coax_ext_MG3: LMG_coax_ext {
- displayName = "Rheinmetall MG3";
- };
- class ACE_LMG_coax_DenelMG4: LMG_coax {
- displayName = "Denel MG4";
- };
- // more autocannons
+ // More autocannons
class autocannon_Base_F;
class autocannon_40mm_CTWS: autocannon_Base_F {
displayName = "Mk44 Bushmaster II";
@@ -694,20 +654,6 @@ class CfgWeapons {
displayName = "2A42";
};
- class cannon_20mm: autocannon_Base_F {
- class AP: autocannon_Base_F {};
- class HE: autocannon_Base_F {};
- };
- class ACE_cannon_20mm_Rh202: cannon_20mm {
- displayName = "MK20 Rh 202";
- class AP: AP {
- displayName = "MK20 Rh 202";
- };
- class HE: HE {
- displayName = "MK20 Rh 202";
- };
- };
-
// APEX/Tanoa
// Type 115
diff --git a/addons/realisticnames/Attachments.hpp b/addons/realisticnames/CfgWeaponsAttachments.hpp
similarity index 84%
rename from addons/realisticnames/Attachments.hpp
rename to addons/realisticnames/CfgWeaponsAttachments.hpp
index a861bb4a043..c23559b7028 100644
--- a/addons/realisticnames/Attachments.hpp
+++ b/addons/realisticnames/CfgWeaponsAttachments.hpp
@@ -1,7 +1,5 @@
-//attachments
-
+// Attachments
class ItemCore;
-
class acc_flashlight: ItemCore {
displayName = CSTRING(flashlight_Name);
};
@@ -19,12 +17,6 @@ class optic_Hamr: ItemCore {
class optic_Hamr_khk_F: optic_Hamr {
displayName = CSTRING(optic_hamr_khk);
};
-class ACE_optic_Hamr_2D: optic_Hamr {
- displayName = CSTRING(optic_hamr_2d);
-};
-class ACE_optic_Hamr_PIP: ACE_optic_Hamr_2D {
- displayName = CSTRING(optic_hamr_pip);
-};
class optic_Arco: ItemCore {
displayName = CSTRING(optic_arco);
@@ -35,12 +27,6 @@ class optic_Arco_blk_F: optic_Arco {
class optic_Arco_ghex_F: optic_Arco {
displayName = CSTRING(optic_arco_ghex);
};
-class ACE_optic_Arco_2D: optic_Arco {
- displayName = CSTRING(optic_arco_2d);
-};
-class ACE_optic_Arco_PIP: ACE_optic_Arco_2D {
- displayName = CSTRING(optic_arco_pip);
-};
class optic_Arco_lush_F: optic_Arco {
displayName = CSTRING(optic_arco_lush);
};
@@ -76,12 +62,6 @@ class optic_LRPS_ghex_F: optic_LRPS {
class optic_LRPS_tna_F: optic_LRPS {
displayName = CSTRING(optic_lrps_tna);
};
-class ACE_optic_LRPS_2D: optic_LRPS {
- displayName = CSTRING(optic_lrps_2d);
-};
-class ACE_optic_LRPS_PIP: ACE_optic_LRPS_2D {
- displayName = CSTRING(optic_lrps_pip);
-};
class optic_AMS_base;
class optic_AMS: optic_AMS_base {
@@ -149,12 +129,6 @@ class optic_Holosight_smg_khk_F: optic_Holosight_smg {
class optic_MRCO: ItemCore {
displayName = CSTRING(optic_MRCO);
};
-class ACE_optic_MRCO_2D: optic_MRCO {
- displayName = CSTRING(optic_MRCO_2d);
-};
-class ACE_optic_MRCO_PIP: ACE_optic_MRCO_2D {
- displayName = CSTRING(optic_MRCO_pip);
-};
class optic_Yorris: ItemCore {
displayName = CSTRING(optic_Yorris);
diff --git a/addons/realisticnames/compat_explosives/CfgMagazines.hpp b/addons/realisticnames/compat_explosives/CfgMagazines.hpp
new file mode 100644
index 00000000000..41a19345dbe
--- /dev/null
+++ b/addons/realisticnames/compat_explosives/CfgMagazines.hpp
@@ -0,0 +1,9 @@
+class CfgMagazines {
+ class CA_Magazine;
+ class ACE_SatchelCharge_Remote_Mag_Throwable: CA_Magazine {
+ displayName = CSTRING(SatchelChargeThrowable_Name);
+ };
+ class ACE_DemoCharge_Remote_Mag_Throwable: ACE_SatchelCharge_Remote_Mag_Throwable {
+ displayName = CSTRING(DemoChargeThrowable_Name);
+ };
+};
diff --git a/addons/realisticnames/compat_explosives/CfgVehicles.hpp b/addons/realisticnames/compat_explosives/CfgVehicles.hpp
new file mode 100644
index 00000000000..e22068161a8
--- /dev/null
+++ b/addons/realisticnames/compat_explosives/CfgVehicles.hpp
@@ -0,0 +1,29 @@
+class CfgVehicles {
+ class ACE_Explosives_Place;
+ class ACE_Explosives_Place_DemoCharge: ACE_Explosives_Place {
+ displayName = CSTRING(DemoCharge_Name);
+ };
+ class ACE_Explosives_Place_APERSBoundingMine: ACE_Explosives_Place {
+ displayName = CSTRING(APERSBoundingMine_Name);
+ };
+ class ACE_Explosives_Place_APERSMine: ACE_Explosives_Place {
+ displayName = CSTRING(APERSMine_Name);
+ };
+ class ACE_Explosives_Place_APERSTripwireMine: ACE_Explosives_Place {
+ displayName = CSTRING(APERSTripwireMine_Name);
+ };
+ class ACE_Explosives_Place_ATMine: ACE_Explosives_Place {
+ displayName = CSTRING(ATMine_Name);
+ };
+ class ACE_Explosives_Place_Claymore: ACE_Explosives_Place {
+ displayName = CSTRING(Claymore_Name);
+ };
+ class ACE_Explosives_Place_SatchelCharge: ACE_Explosives_Place {
+ displayName = CSTRING(SatchelCharge_Name);
+ };
+
+ // Orange DLC
+ class ACE_Explosives_Place_SLAM: ACE_Explosives_Place {
+ displayName = CSTRING(SLAM_Name);
+ };
+};
diff --git a/addons/realisticnames/compat_explosives/config.cpp b/addons/realisticnames/compat_explosives/config.cpp
new file mode 100644
index 00000000000..208bc7e791f
--- /dev/null
+++ b/addons/realisticnames/compat_explosives/config.cpp
@@ -0,0 +1,22 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {QUOTE(ADDON), "ace_explosives"};
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ // this prevents any patched class from requiring this addon
+ addonRootClass = "A3_Characters_F";
+ };
+};
+
+#include "CfgMagazines.hpp"
+#include "CfgVehicles.hpp"
diff --git a/addons/realisticnames/compat_explosives/script_component.hpp b/addons/realisticnames/compat_explosives/script_component.hpp
new file mode 100644
index 00000000000..a697aad7f3b
--- /dev/null
+++ b/addons/realisticnames/compat_explosives/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT explosives
+#define SUBCOMPONENT_BEAUTIFIED Explosives
+#include "..\script_component.hpp"
diff --git a/addons/realisticnames/compat_optics/CfgWeapons.hpp b/addons/realisticnames/compat_optics/CfgWeapons.hpp
new file mode 100644
index 00000000000..6ffd6484b2c
--- /dev/null
+++ b/addons/realisticnames/compat_optics/CfgWeapons.hpp
@@ -0,0 +1,33 @@
+class CfgWeapons {
+ class optic_Hamr;
+ class ACE_optic_Hamr_2D: optic_Hamr {
+ displayName = CSTRING(optic_hamr_2d);
+ };
+ class ACE_optic_Hamr_PIP: ACE_optic_Hamr_2D {
+ displayName = CSTRING(optic_hamr_pip);
+ };
+
+ class optic_Arco;
+ class ACE_optic_Arco_2D: optic_Arco {
+ displayName = CSTRING(optic_arco_2d);
+ };
+ class ACE_optic_Arco_PIP: ACE_optic_Arco_2D {
+ displayName = CSTRING(optic_arco_pip);
+ };
+
+ class optic_LRPS;
+ class ACE_optic_LRPS_2D: optic_LRPS {
+ displayName = CSTRING(optic_lrps_2d);
+ };
+ class ACE_optic_LRPS_PIP: ACE_optic_LRPS_2D {
+ displayName = CSTRING(optic_lrps_pip);
+ };
+
+ class optic_MRCO;
+ class ACE_optic_MRCO_2D: optic_MRCO {
+ displayName = CSTRING(optic_MRCO_2d);
+ };
+ class ACE_optic_MRCO_PIP: ACE_optic_MRCO_2D {
+ displayName = CSTRING(optic_MRCO_pip);
+ };
+};
diff --git a/addons/realisticnames/compat_optics/config.cpp b/addons/realisticnames/compat_optics/config.cpp
new file mode 100644
index 00000000000..32d2795dd96
--- /dev/null
+++ b/addons/realisticnames/compat_optics/config.cpp
@@ -0,0 +1,21 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {QUOTE(ADDON), "ace_optics"};
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ // this prevents any patched class from requiring this addon
+ addonRootClass = "A3_Characters_F";
+ };
+};
+
+#include "CfgWeapons.hpp"
diff --git a/addons/realisticnames/compat_optics/script_component.hpp b/addons/realisticnames/compat_optics/script_component.hpp
new file mode 100644
index 00000000000..b90538fc4e2
--- /dev/null
+++ b/addons/realisticnames/compat_optics/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT optics
+#define SUBCOMPONENT_BEAUTIFIED Optics
+#include "..\script_component.hpp"
diff --git a/addons/realisticnames/compat_vehicles/CfgWeapons.hpp b/addons/realisticnames/compat_vehicles/CfgWeapons.hpp
new file mode 100644
index 00000000000..c49ae26bcb4
--- /dev/null
+++ b/addons/realisticnames/compat_vehicles/CfgWeapons.hpp
@@ -0,0 +1,45 @@
+class CfgWeapons {
+ class HMG_127_APC;
+ class ACE_HMG_127_KORD: HMG_127_APC {
+ displayName = "6P49 Kord";
+ };
+
+ class cannon_120mm;
+ class ACE_cannon_120mm_GT12: cannon_120mm {
+ displayName = "GT12";
+ };
+
+ class LMG_coax_ext;
+ class ACE_LMG_coax_ext_MG3: LMG_coax_ext {
+ displayName = "Rheinmetall MG3";
+ };
+ class ACE_LMG_coax_ext_MAG58: LMG_coax_ext {
+ displayName = "MAG 58M";
+ };
+
+ class LMG_coax;
+ class ACE_LMG_coax_MAG58_mem3: LMG_coax {
+ displayName = "MAG 58M";
+ };
+ class ACE_LMG_coax_L94A1_mem3: LMG_coax {
+ displayName = "L94A1";
+ };
+ class ACE_LMG_coax_DenelMG4: LMG_coax {
+ displayName = "Denel MG4";
+ };
+
+ class autocannon_Base_F;
+ class cannon_20mm: autocannon_Base_F {
+ class AP: autocannon_Base_F {};
+ class HE: autocannon_Base_F {};
+ };
+ class ACE_cannon_20mm_Rh202: cannon_20mm {
+ displayName = "MK20 Rh 202";
+ class AP: AP {
+ displayName = "MK20 Rh 202";
+ };
+ class HE: HE {
+ displayName = "MK20 Rh 202";
+ };
+ };
+};
diff --git a/addons/realisticnames/compat_vehicles/config.cpp b/addons/realisticnames/compat_vehicles/config.cpp
new file mode 100644
index 00000000000..846c92a0eec
--- /dev/null
+++ b/addons/realisticnames/compat_vehicles/config.cpp
@@ -0,0 +1,21 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {QUOTE(ADDON), "ace_vehicles"};
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ // this prevents any patched class from requiring this addon
+ addonRootClass = "A3_Characters_F";
+ };
+};
+
+#include "CfgWeapons.hpp"
diff --git a/addons/realisticnames/compat_vehicles/script_component.hpp b/addons/realisticnames/compat_vehicles/script_component.hpp
new file mode 100644
index 00000000000..17370c415fd
--- /dev/null
+++ b/addons/realisticnames/compat_vehicles/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT vehicles
+#define SUBCOMPONENT_BEAUTIFIED Vehicles
+#include "..\script_component.hpp"
diff --git a/addons/realisticnames/dev_dumpPylon.sqf b/addons/realisticnames/dev_dumpPylon.sqf
index df0d7ea4a56..4bb10a84fb6 100644
--- a/addons/realisticnames/dev_dumpPylon.sqf
+++ b/addons/realisticnames/dev_dumpPylon.sqf
@@ -22,7 +22,7 @@ private _magazines = configProperties [configFile >> "CfgMagazines", "isClass _x
diag_log text format ['class %1;', configName inheritsFrom _x];
diag_log text format ['class %1: %2 {', configName _x, configName inheritsFrom _x];
diag_log text format ['displayName = "%1"; [vanilla: %2 - %3]', _weaponName, _pylonMagName, _pylonWeapon];
- diag_log text format ['};', configName _x, configName inheritsFrom _x, _weaponName, _pylonMagName];
+ diag_log text format ['};'];
};
};
};
diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml
index af864f64df0..0a2b57f0ff1 100644
--- a/addons/realisticnames/stringtable.xml
+++ b/addons/realisticnames/stringtable.xml
@@ -30,7 +30,7 @@
XM312A
XM312A
XM312A
- XM312A 무인중기관총
+ XM312A 무인 중기관총
XM312A重機槍
XM312A
XM312A
@@ -166,7 +166,7 @@
YABHON-R3 (CAS)
YABHON-R3 (CAS)
YABHON-R3 (CAS)
- YABHON-R3 무인기 (근접지원)
+ YABHON-R3 무인기 (근접항공지원)
"亞伯罕-R3型"空中無人載具 (近空支援)
"联合"-R3(近空支援)
YABHON-R3 (CAS)
@@ -706,6 +706,7 @@
카마즈 급수
KamAS Wasser
KamAZ Acqua
+ KamAZ Eau
KamAZ MRL
@@ -854,7 +855,7 @@
Otokar ARMA
Otokar ARMA
オトカ アルマ
- 오토카르 아르마 APC
+ 오토카 아르마 APC
"奧托卡—阿爾默"裝甲運兵車
奥托卡尔 "阿玛"
Otokar ARMA
@@ -1160,7 +1161,7 @@
L-159 ALCA (Légitámogató)
L-159 ALCA (CAS)
L-159 ALCA (CAS)
- L-159 ALCA (근접지원)
+ L-159 ALCA (근접항공지원)
L-159先進輕型戰鬥機 (近空支援)
L-159 ALCA(近空支援)
L-159 ALCA (CAS)
@@ -1324,7 +1325,7 @@
Demoliční nálož M183
M183 Charge de démolition
M183 комплектный подрывной заряд
- M183 Sacola de Demolição
+ M183 Conjunto de Carga de Demolição
M183 romboló töltet
M183 Carica da Demolizioni
M183 梱包爆薬
@@ -1345,6 +1346,7 @@
M183 Geballte Sprengladung (Werfbar)
M183 炸药包(可投掷)
M183 폭파 장약 (투척)
+ M183 Carga de Demolição (Arremessável)
M112 Demolition Block
@@ -1375,6 +1377,7 @@
M112 Sprengladung (Werfbar)
M112 塑性炸药(可投掷)
M112 폭파 장약 (투척)
+ M112 Carga de Demolição (Arremessável)
M67 Fragmentation Grenade
@@ -1672,6 +1675,7 @@
CZ 581
CZ 581
CZ 581
+ CZ 581
CZ 581 (Sawed-Off)
@@ -1681,6 +1685,7 @@
CZ 581 (소드오프)
CZ 581 (Abgesägt)
CZ 581 (Canne mozze)
+ CZ 581 (canon scié)
FNX-45 Tactical (Green)
@@ -2731,7 +2736,7 @@
ASP-1 Kir (Tan)
ASP-1 Kir (Žlutohnědá)
- ASP-1 Kir (Tan)
+ ASP-1 Kir (Marron)
ASP-1 Kir (Tan)
ASP-1 Kir (пустынный)
ASP-1 Kir (Hellbraun)
@@ -3091,6 +3096,7 @@
115식 보총 (검정)
Type 115 (Schwarz)
Type 115 (Nero)
+ Type 115 (Noir)
Type 115 (Green Hex)
@@ -3100,6 +3106,7 @@
115식 보총 (초록육각)
Type 115 (Hex Grün)
Type 115 (Hex Verde)
+ Type 115 (Hew Vert)
Type 115 (Hex)
@@ -3109,6 +3116,7 @@
115식 보총 (육각)
Type 115 (Hex)
Type 115 (Hex)
+ Type 115 (Hex)
QBZ-95-1 (Black)
@@ -3902,6 +3910,7 @@
UTG 디펜더 126
UTG Defender 126
UTG Defender 126
+ UTG Defender 126
EOTech MRDS
@@ -3911,6 +3920,7 @@
이오텍 MRDS
EOTech MRDS
EOTech MRDS
+ EOTech MRDS
EOTech MRDS (Black)
@@ -3920,6 +3930,7 @@
이오텍 MRDS (검정)
EOTech MRDS (Schwarz)
EOTech MRDS (Nero)
+ EOTech MRDS (Noir)
Leupold Mark 4 HAMR
@@ -4076,6 +4087,7 @@
엘칸 스펙터OS (초목)
ELCAN SpecterOS (обильная растительность)
ELCAN SpecterOS (Exuberante)
+ ELCAN SpecterOS (Exuberante)
ELCAN SpecterOS (Arid)
@@ -4088,6 +4100,7 @@
엘칸 스펙터OS (건조)
ELCAN SpecterOS (сухая местность)
ELCAN SpecterOS (Árido)
+ ELCAN SpecterOS (Árido)
ELCAN SpecterOS 7.62 (Black)
@@ -4100,6 +4113,7 @@
엘칸 스펙터OS 7.62 (검정)
ELCAN SpecterOS 7.62 (чёрный)
ELCAN SpecterOS 7.62 (Negro)
+ ELCAN SpecterOS 7.62 (Preto)
ELCAN SpecterOS 7.62 (Lush)
@@ -4112,6 +4126,7 @@
엘칸 스펙터OS 7.62 (초목)
ELCAN SpecterOS 7.62 (обильная растительность)
ELCAN SpecterOS 7.62 (Exuberante)
+ ELCAN SpecterOS 7.62 (Exuberante)
ELCAN SpecterOS 7.62 (Arid)
@@ -4124,6 +4139,7 @@
엘칸 스펙터OS 7.62 (건조)
ELCAN SpecterOS 7.62 (сухая местность)
ELCAN SpecterOS 7.62 (Árido)
+ ELCAN SpecterOS 7.62 (Árido)
SIG BRAVO4 / ROMEO3 (Black)
@@ -4408,6 +4424,7 @@
버리스 XTR II (낡음)
Burris XTR II (старый)
Burris XTR II (Viejo)
+ Burris XTR II (Velho)
Burris XTR II (ASP-1 Kir)
@@ -4420,6 +4437,7 @@
버리스 XTR II (ASP-1 키르용)
Burris XTR II (ASP-1 Kir)
Burris XTR II (ASP-1 Kir)
+ Burris XTR II (ASP-1 Kir)
EOTech XPS3 (Tan)
@@ -4480,6 +4498,7 @@
이오텍 XPS3 (초목)
EOTech XPS3 (обильная растительность)
EOTech XPS3 (Exuberante)
+ EOTech XPS3 (Exuberante)
EOTech XPS3 (Arid)
@@ -4492,6 +4511,7 @@
이오텍 XPS3 (건조)
EOTech XPS3 (сухая местность)
EOTech XPS3 (Árido)
+ EOTech XPS3 (Árido)
EOTech XPS3 SMG (Tan)
diff --git a/addons/realisticweights/config.cpp b/addons/realisticweights/config.cpp
index 91c1ea00aa9..ebd919fc49b 100644
--- a/addons/realisticweights/config.cpp
+++ b/addons/realisticweights/config.cpp
@@ -2,6 +2,7 @@
class CfgPatches {
class ADDON {
+ name = COMPONENT_NAME;
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
diff --git a/addons/realisticweights/script_component.hpp b/addons/realisticweights/script_component.hpp
index fcdb3450689..bf7173a3e70 100644
--- a/addons/realisticweights/script_component.hpp
+++ b/addons/realisticweights/script_component.hpp
@@ -1,4 +1,5 @@
#define COMPONENT realisticweights
+#define COMPONENT_BEAUTIFIED Realistic Weights
#include "\z\ace\addons\main\script_mod.hpp"
// #define DEBUG_MODE_FULL
diff --git a/addons/rearm/functions/fnc_canRearm.sqf b/addons/rearm/functions/fnc_canRearm.sqf
index 8d2b0b58e50..34bb3727536 100644
--- a/addons/rearm/functions/fnc_canRearm.sqf
+++ b/addons/rearm/functions/fnc_canRearm.sqf
@@ -22,7 +22,7 @@ if (!alive _vehicle) exitWith {false};
if (GVAR(level) == 0 || {isNull _unit} || {!(_unit isKindOf "CAManBase")} || {!local _unit} || {_vehicle distance _unit > REARM_ACTION_DISTANCE} || {_vehicle getVariable [QGVAR(disabled), false]}) exitWith {false};
private _dummy = _unit getVariable [QGVAR(dummy), objNull];
-if (isNull _dummy) exitwith {false};
+if (isNull _dummy) exitWith {false};
private _magazineClass = _dummy getVariable QGVAR(magazineClass);
if (isNil "_magazineClass") exitWith {false};
diff --git a/addons/rearm/functions/fnc_dropAmmo.sqf b/addons/rearm/functions/fnc_dropAmmo.sqf
index af4b74ee775..ba89c9cd917 100644
--- a/addons/rearm/functions/fnc_dropAmmo.sqf
+++ b/addons/rearm/functions/fnc_dropAmmo.sqf
@@ -38,8 +38,8 @@ if (_actionID != -1) then {
_unit removeAction _actionID;
_unit setVariable [QGVAR(ReleaseActionID), nil];
};
-[_unit, "forceWalk", "ACE_rearm", false] call EFUNC(common,statusEffect_set);
-[_unit, "blockThrow", "ACE_rearm", false] call EFUNC(common,statusEffect_set);
+[_unit, "forceWalk", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
+[_unit, "blockThrow", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
if (_unholster) then {
REARM_UNHOLSTER_WEAPON
diff --git a/addons/rearm/functions/fnc_grabAmmo.sqf b/addons/rearm/functions/fnc_grabAmmo.sqf
index d3554853092..b7f87a69ba4 100644
--- a/addons/rearm/functions/fnc_grabAmmo.sqf
+++ b/addons/rearm/functions/fnc_grabAmmo.sqf
@@ -19,8 +19,8 @@
params ["_dummy", "_unit"];
REARM_HOLSTER_WEAPON;
-[_unit, "forceWalk", "ACE_rearm", true] call EFUNC(common,statusEffect_set);
-[_unit, "blockThrow", "ACE_rearm", true] call EFUNC(common,statusEffect_set);
+[_unit, "forceWalk", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
+[_unit, "blockThrow", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
[
TIME_PROGRESSBAR(5),
@@ -35,7 +35,7 @@ REARM_HOLSTER_WEAPON;
_unit removeAction _actionID;
};
_actionID = _unit addAction [
- format ["%1", localize ELSTRING(dragging,Drop)],
+ format ["%1", LELSTRING(common,Drop)],
'(_this select 0) call FUNC(dropAmmo)',
nil,
20,
diff --git a/addons/rearm/functions/fnc_rearm.sqf b/addons/rearm/functions/fnc_rearm.sqf
index 81f467a5ca8..52c00a54c0e 100644
--- a/addons/rearm/functions/fnc_rearm.sqf
+++ b/addons/rearm/functions/fnc_rearm.sqf
@@ -20,9 +20,9 @@ params ["_target", "_unit"];
TRACE_2("rearm",_target,_unit);
private _attachedDummy = _unit getVariable [QGVAR(dummy), objNull];
-if (isNull _attachedDummy) exitwith {ERROR_1("attachedDummy null",_attachedDummy);};
+if (isNull _attachedDummy) exitWith {ERROR_1("attachedDummy null %1",_attachedDummy);};
private _magazineClass = _attachedDummy getVariable QGVAR(magazineClass);
-if (isNil "_magazineClass") exitWith {ERROR_1("magazineClass nil",_attachedDummy);};
+if (isNil "_magazineClass") exitWith {ERROR_1("magazineClass nil %1",_attachedDummy);};
([_magazineClass] call FUNC(getCaliber)) params ["_cal", "_idx"];
@@ -45,6 +45,7 @@ private _magazineDisplayName = _magazineClass call FUNC(getMagazineName);
"",
format [localize LSTRING(RearmAction), getText(configOf _target >> "displayName"), _magazineDisplayName],
{
+ //IGNORE_PRIVATE_WARNING ["_player"];
param [0] params ["_target", "_unit"];
_player distance _target <= GVAR(distance);
},
diff --git a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf
index f41dff6ea9c..ace43baf8f9 100644
--- a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf
+++ b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf
@@ -31,7 +31,7 @@ if (_pylon > 0) exitWith {
// Fill magazine completely
if (_turretPath isEqualTo [-1]) then {_turretPath = [];}; // Convert back to pylon turret format
TRACE_3("",_pylon,_magazineClass,_rounds);
- _vehicle setPylonLoadOut [_pylon, _magazineClass, true, _turretPath];
+ _vehicle setPylonLoadout [_pylon, _magazineClass, true, _turretPath];
[QEGVAR(common,displayTextStructured), [[LSTRING(Hint_RearmedTriple), _rounds,
getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"),
getText(configOf _vehicle >> "displayName")], 3, _unit], [_unit]] call CBA_fnc_targetEvent;
@@ -41,7 +41,7 @@ if (_pylon > 0) exitWith {
private _currentCount = _vehicle ammoOnPylon _pylon;
private _newCount = ((_currentCount max 0) + _numRounds) min _rounds;
TRACE_3("",_pylon,_magazineClass,_newCount);
- _vehicle setPylonLoadOut [_pylon, _magazineClass, true, _turretPath];
+ _vehicle setPylonLoadout [_pylon, _magazineClass, true, _turretPath];
_vehicle setAmmoOnPylon [_pylon, _newCount];
[QEGVAR(common,displayTextStructured), [[LSTRING(Hint_RearmedTriple), _numRounds,
getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"),
diff --git a/addons/rearm/functions/fnc_storeAmmo.sqf b/addons/rearm/functions/fnc_storeAmmo.sqf
index e9f57369f3d..1d08d289be4 100644
--- a/addons/rearm/functions/fnc_storeAmmo.sqf
+++ b/addons/rearm/functions/fnc_storeAmmo.sqf
@@ -19,7 +19,7 @@
params ["_truck", "_unit"];
private _attachedDummy = _unit getVariable [QGVAR(dummy), objNull];
-if (isNull _attachedDummy) exitwith {};
+if (isNull _attachedDummy) exitWith {};
private _magazineClass = _attachedDummy getVariable [QGVAR(magazineClass), "#noVar"];
diff --git a/addons/rearm/functions/fnc_takeSuccess.sqf b/addons/rearm/functions/fnc_takeSuccess.sqf
index 717d549b86c..214713c80d6 100644
--- a/addons/rearm/functions/fnc_takeSuccess.sqf
+++ b/addons/rearm/functions/fnc_takeSuccess.sqf
@@ -36,13 +36,13 @@ if (_vehicle == _unit) exitWith {
[_unit, _magazineClass, _rounds] call EFUNC(csw,reload_handleReturnAmmo);
};
-[_unit, "forceWalk", "ACE_rearm", true] call EFUNC(common,statusEffect_set);
-[_unit, "blockThrow", "ACE_rearm", true] call EFUNC(common,statusEffect_set);
+[_unit, "forceWalk", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
+[_unit, "blockThrow", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
private _dummy = [_unit, _magazineClass] call FUNC(createDummy);
[_dummy, _unit] call FUNC(pickUpAmmo);
private _actionID = _unit addAction [
- format ["%1", localize ELSTRING(dragging,Drop)],
+ format ["%1", LELSTRING(common,Drop)],
'(_this select 0) call FUNC(dropAmmo)',
nil,
20,
diff --git a/addons/rearm/script_component.hpp b/addons/rearm/script_component.hpp
index 1cc6379ff7b..4bcff331d68 100644
--- a/addons/rearm/script_component.hpp
+++ b/addons/rearm/script_component.hpp
@@ -35,7 +35,7 @@
_unit action ["SwitchWeapon", _unit, _unit, 299];
#define REARM_UNHOLSTER_WEAPON \
- _weaponSelect = _unit getVariable QGVAR(selectedWeaponOnRearm); \
+ private _weaponSelect = _unit getVariable QGVAR(selectedWeaponOnRearm); \
if (!isNil "_weaponSelect") then { \
TRACE_2("REARM_UNHOLSTER_WEAPON",_unit,_weaponSelect); \
_unit selectWeapon _weaponSelect; \
diff --git a/addons/recoil/$PBOPREFIX$ b/addons/recoil/$PBOPREFIX$
index 1ab9ffa5e1f..efd38b75edf 100644
--- a/addons/recoil/$PBOPREFIX$
+++ b/addons/recoil/$PBOPREFIX$
@@ -1 +1 @@
-z\ace\addons\recoil
\ No newline at end of file
+z\ace\addons\recoil
diff --git a/addons/recoil/CfgEventHandlers.hpp b/addons/recoil/CfgEventHandlers.hpp
index 6c29240403a..f6503c2479b 100644
--- a/addons/recoil/CfgEventHandlers.hpp
+++ b/addons/recoil/CfgEventHandlers.hpp
@@ -1,4 +1,3 @@
-
class Extended_PreStart_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_preStart));
diff --git a/addons/recoil/CfgMoves.hpp b/addons/recoil/CfgMoves.hpp
index 29bca9c81ab..aca9d93f3cd 100644
--- a/addons/recoil/CfgMoves.hpp
+++ b/addons/recoil/CfgMoves.hpp
@@ -1,4 +1,3 @@
-
// Completely disable BI's camshake on fire.
#define ACE_CAMSHAKEFIRE_BASE 0
#define ACE_CAMSHAKEFIRE_LESS 0
diff --git a/addons/recoil/CfgRecoils.hpp b/addons/recoil/CfgRecoils.hpp
index c6482937ae2..b8d181e5664 100644
--- a/addons/recoil/CfgRecoils.hpp
+++ b/addons/recoil/CfgRecoils.hpp
@@ -1,4 +1,3 @@
-
#define KICKBACK 1.4
#define MUZZLETEMP 1.2
@@ -15,28 +14,28 @@ class CfgRecoils {
// 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[] = {
- QUOTE(0*MUZZLERIGHT_POS),
- QUOTE(0.4*MUZZLECLIMB_POS),
- QUOTE(0.5*MUZZLERIGHT_MAG),
- QUOTE(0.6*MUZZLECLIMB_MAG)
+ 0*MUZZLERIGHT_POS,
+ 0.4*MUZZLECLIMB_POS,
+ 0.5*MUZZLERIGHT_MAG,
+ 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[] = {
- QUOTE(0.05*KICKBACK),
- QUOTE(0.1*KICKBACK)
+ 0.05*KICKBACK,
+ 0.1*KICKBACK
};
- permanent = QUOTE(0.1*MUZZLEPERM);
- temporary = QUOTE(0.01*MUZZLETEMP);
+ permanent = 0.1*MUZZLEPERM;
+ temporary = 0.01*MUZZLETEMP;
};
class recoil_default: Default {
muzzleOuter[] = {
- QUOTE(0.3*MUZZLERIGHT_POS),
- QUOTE(1*MUZZLECLIMB_POS),
- QUOTE(0.3*MUZZLERIGHT_MAG),
- QUOTE(0.2*MUZZLECLIMB_MAG)
+ 0.3*MUZZLERIGHT_POS,
+ 1*MUZZLECLIMB_POS,
+ 0.3*MUZZLERIGHT_MAG,
+ 0.2*MUZZLECLIMB_MAG
};
muzzleInner[] = {0,
0,
@@ -44,528 +43,529 @@ class CfgRecoils {
0.1
};
kickBack[] = {
- QUOTE(0.03*KICKBACK),
- QUOTE(0.06*KICKBACK)
+ 0.03*KICKBACK,
+ 0.06*KICKBACK
};
- permanent = QUOTE(0.1*MUZZLEPERM);
- temporary = QUOTE(0.01*MUZZLETEMP);
+ permanent = 0.1*MUZZLEPERM;
+ temporary = 0.01*MUZZLETEMP;
};
class recoil_mk20: recoil_default {
muzzleOuter[] = {
- QUOTE(0.2*MUZZLERIGHT_POS),
- QUOTE(0.6*MUZZLECLIMB_POS),
- QUOTE(0.2*MUZZLERIGHT_MAG),
- QUOTE(0.2*MUZZLECLIMB_MAG)
+ 0.2*MUZZLERIGHT_POS,
+ 0.6*MUZZLECLIMB_POS,
+ 0.2*MUZZLERIGHT_MAG,
+ 0.2*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.01*KICKBACK),
- QUOTE(0.03*KICKBACK)
+ 0.01*KICKBACK,
+ 0.03*KICKBACK
};
- temporary = QUOTE(0.01*MUZZLETEMP);
+ temporary = 0.01*MUZZLETEMP;
};
class recoil_mk20c: recoil_default {
muzzleOuter[] = {
- QUOTE(0.2*MUZZLERIGHT_POS),
- QUOTE(0.8*MUZZLECLIMB_POS),
- QUOTE(0.3*MUZZLERIGHT_MAG),
- QUOTE(0.2*MUZZLECLIMB_MAG)
+ 0.2*MUZZLERIGHT_POS,
+ 0.8*MUZZLECLIMB_POS,
+ 0.3*MUZZLERIGHT_MAG,
+ 0.2*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.02*KICKBACK),
- QUOTE(0.04*KICKBACK)
+ 0.02*KICKBACK,
+ 0.04*KICKBACK
};
- temporary = QUOTE(0.015*MUZZLETEMP);
+ temporary = 0.015*MUZZLETEMP;
};
class recoil_trg20: recoil_default {
muzzleOuter[] = {
- QUOTE(0.2*MUZZLERIGHT_POS),
- QUOTE(1*MUZZLECLIMB_POS),
- QUOTE(0.3*MUZZLERIGHT_MAG),
- QUOTE(0.3*MUZZLECLIMB_MAG)
+ 0.2*MUZZLERIGHT_POS,
+ 1*MUZZLECLIMB_POS,
+ 0.3*MUZZLERIGHT_MAG,
+ 0.3*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.02*KICKBACK),
- QUOTE(0.04*KICKBACK)
+ 0.02*KICKBACK,
+ 0.04*KICKBACK
};
- temporary = QUOTE(0.015*MUZZLETEMP);
+ temporary = 0.015*MUZZLETEMP;
};
class recoil_trg21: recoil_default {
muzzleOuter[] = {
- QUOTE(0.2*MUZZLERIGHT_POS),
- QUOTE(0.8*MUZZLECLIMB_POS),
- QUOTE(0.3*MUZZLERIGHT_MAG),
- QUOTE(0.2*MUZZLECLIMB_MAG)
+ 0.2*MUZZLERIGHT_POS,
+ 0.8*MUZZLECLIMB_POS,
+ 0.3*MUZZLERIGHT_MAG,
+ 0.2*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.01*KICKBACK),
- QUOTE(0.03*KICKBACK)
+ 0.01*KICKBACK,
+ 0.03*KICKBACK
};
- temporary = QUOTE(0.01*MUZZLETEMP);
+ temporary = 0.01*MUZZLETEMP;
};
class recoil_mx: recoil_default {
muzzleOuter[] = {
- QUOTE(0.3*MUZZLERIGHT_POS),
- QUOTE(1*MUZZLECLIMB_POS),
- QUOTE(0.4*MUZZLERIGHT_MAG),
- QUOTE(0.3*MUZZLECLIMB_MAG)
+ 0.3*MUZZLERIGHT_POS,
+ 1*MUZZLECLIMB_POS,
+ 0.4*MUZZLERIGHT_MAG,
+ 0.3*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.02*KICKBACK),
- QUOTE(0.04*KICKBACK)
+ 0.02*KICKBACK,
+ 0.04*KICKBACK
};
- temporary = QUOTE(0.01*MUZZLETEMP);
+ temporary = 0.01*MUZZLETEMP;
};
class recoil_mxc: recoil_default {
muzzleOuter[] = {
- QUOTE(0.3*MUZZLERIGHT_POS),
- QUOTE(1.2*MUZZLECLIMB_POS),
- QUOTE(0.4*MUZZLERIGHT_MAG),
- QUOTE(0.3*MUZZLECLIMB_MAG)
+ 0.3*MUZZLERIGHT_POS,
+ 1.2*MUZZLECLIMB_POS,
+ 0.4*MUZZLERIGHT_MAG,
+ 0.3*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.03*KICKBACK),
- QUOTE(0.06*KICKBACK)
+ 0.03*KICKBACK,
+ 0.06*KICKBACK
};
- temporary = QUOTE(0.015*MUZZLETEMP);
+ temporary = 0.015*MUZZLETEMP;
};
class recoil_sw: recoil_default {
muzzleOuter[] = {
- QUOTE(0.3*MUZZLERIGHT_POS),
- QUOTE(0.8*MUZZLECLIMB_POS),
- QUOTE(0.5*MUZZLERIGHT_MAG),
- QUOTE(0.2*MUZZLECLIMB_MAG)
+ 0.3*MUZZLERIGHT_POS,
+ 0.8*MUZZLECLIMB_POS,
+ 0.5*MUZZLERIGHT_MAG,
+ 0.2*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.02*KICKBACK),
- QUOTE(0.04*KICKBACK)
+ 0.02*KICKBACK,
+ 0.04*KICKBACK
};
- temporary = QUOTE(0.01*MUZZLETEMP); //0.005*MUZZLETEMP;
+ temporary = 0.01*MUZZLETEMP; //0.005*MUZZLETEMP;
};
class recoil_mxm: recoil_default {
muzzleOuter[] = {
- QUOTE(0.3*MUZZLERIGHT_POS),
- QUOTE(0.8*MUZZLECLIMB_POS),
- QUOTE(0.4*MUZZLERIGHT_MAG),
- QUOTE(0.3*MUZZLECLIMB_MAG)
+ 0.3*MUZZLERIGHT_POS,
+ 0.8*MUZZLECLIMB_POS,
+ 0.4*MUZZLERIGHT_MAG,
+ 0.3*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.02*KICKBACK),
- QUOTE(0.04*KICKBACK)
+ 0.02*KICKBACK,
+ 0.04*KICKBACK
};
- temporary = QUOTE(0.01*MUZZLETEMP);
+ temporary = 0.01*MUZZLETEMP;
};
class recoil_ktb: recoil_default {
muzzleOuter[] = {
- QUOTE(0.3*MUZZLERIGHT_POS),
- QUOTE(1*MUZZLECLIMB_POS),
- QUOTE(0.3*MUZZLERIGHT_MAG),
- QUOTE(0.3*MUZZLECLIMB_MAG)
+ 0.3*MUZZLERIGHT_POS,
+ 1*MUZZLECLIMB_POS,
+ 0.3*MUZZLERIGHT_MAG,
+ 0.3*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.02*KICKBACK),
- QUOTE(0.04*KICKBACK)
+ 0.02*KICKBACK,
+ 0.04*KICKBACK
};
- temporary = QUOTE(0.01*MUZZLETEMP);
+ temporary = 0.01*MUZZLETEMP;
};
class recoil_ktbc: recoil_default {
muzzleOuter[] = {
- QUOTE(0.3*MUZZLERIGHT_POS),
- QUOTE(1.2*MUZZLECLIMB_POS),
- QUOTE(0.3*MUZZLERIGHT_MAG),
- QUOTE(0.3*MUZZLECLIMB_MAG)
+ 0.3*MUZZLERIGHT_POS,
+ 1.2*MUZZLECLIMB_POS,
+ 0.3*MUZZLERIGHT_MAG,
+ 0.3*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.03*KICKBACK),
- QUOTE(0.06*KICKBACK)
+ 0.03*KICKBACK,
+ 0.06*KICKBACK
};
- temporary = QUOTE(0.015*MUZZLETEMP);
+ temporary = 0.015*MUZZLETEMP;
};
class recoil_smg_01: recoil_default {
muzzleOuter[] = {
- QUOTE(0.1*MUZZLERIGHT_POS),
- QUOTE(0.8*MUZZLECLIMB_POS),
- QUOTE(0.3*MUZZLERIGHT_MAG),
- QUOTE(0.2*MUZZLECLIMB_MAG)
+ 0.1*MUZZLERIGHT_POS,
+ 0.8*MUZZLECLIMB_POS,
+ 0.3*MUZZLERIGHT_MAG,
+ 0.2*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.01*KICKBACK),
- QUOTE(0.03*KICKBACK)
+ 0.01*KICKBACK,
+ 0.03*KICKBACK
};
- temporary = QUOTE(0.015*MUZZLETEMP);
+ temporary = 0.015*MUZZLETEMP;
};
class recoil_smg_02: recoil_default {
muzzleOuter[] = {
- QUOTE(0.1*MUZZLERIGHT_POS),
- QUOTE(0.6*MUZZLECLIMB_POS),
- QUOTE(0.2*MUZZLERIGHT_MAG),
- QUOTE(0.2*MUZZLECLIMB_MAG)
+ 0.1*MUZZLERIGHT_POS,
+ 0.6*MUZZLECLIMB_POS,
+ 0.2*MUZZLERIGHT_MAG,
+ 0.2*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.01*KICKBACK),
- QUOTE(0.02*KICKBACK)
+ 0.01*KICKBACK,
+ 0.02*KICKBACK
};
- temporary = QUOTE(0.01*MUZZLETEMP);
+ temporary = 0.01*MUZZLETEMP;
};
class recoil_pdw: recoil_default {
muzzleOuter[] = {
- QUOTE(0.2*MUZZLERIGHT_POS),
- QUOTE(1*MUZZLECLIMB_POS),
- QUOTE(0.3*MUZZLERIGHT_MAG),
- QUOTE(0.3*MUZZLECLIMB_MAG)
+ 0.2*MUZZLERIGHT_POS,
+ 1*MUZZLECLIMB_POS,
+ 0.3*MUZZLERIGHT_MAG,
+ 0.3*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.02*KICKBACK),
- QUOTE(0.04*KICKBACK)
+ 0.02*KICKBACK,
+ 0.04*KICKBACK
};
- temporary = QUOTE(0.02*MUZZLETEMP);
+ temporary = 0.02*MUZZLETEMP;
};
class recoil_sdar: recoil_default {
muzzleOuter[] = {
- QUOTE(0.2*MUZZLERIGHT_POS),
- QUOTE(1*MUZZLECLIMB_POS),
- QUOTE(0.3*MUZZLERIGHT_MAG),
- QUOTE(0.3*MUZZLECLIMB_MAG)
+ 0.2*MUZZLERIGHT_POS,
+ 1*MUZZLECLIMB_POS,
+ 0.3*MUZZLERIGHT_MAG,
+ 0.3*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.02*KICKBACK),
- QUOTE(0.04*KICKBACK)
+ 0.02*KICKBACK,
+ 0.04*KICKBACK
};
- temporary = QUOTE(0.01*MUZZLETEMP);
+ temporary = 0.01*MUZZLETEMP;
};
class recoil_pistol_p07: recoil_default {
muzzleOuter[] = {
- QUOTE(0.2*MUZZLERIGHT_POS),
- QUOTE(1*MUZZLECLIMB_POS),
- QUOTE(0.2*MUZZLERIGHT_MAG),
- QUOTE(0.3*MUZZLECLIMB_MAG)
+ 0.2*MUZZLERIGHT_POS,
+ 1*MUZZLECLIMB_POS,
+ 0.2*MUZZLERIGHT_MAG,
+ 0.3*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.03*KICKBACK),
- QUOTE(0.06*KICKBACK)
+ 0.03*KICKBACK,
+ 0.06*KICKBACK
};
- temporary = QUOTE(0.03*MUZZLETEMP);
+ temporary = 0.03*MUZZLETEMP;
};
class recoil_pistol_rook40: recoil_default {
muzzleOuter[] = {
- QUOTE(0.2*MUZZLERIGHT_POS),
- QUOTE(1*MUZZLECLIMB_POS),
- QUOTE(0.2*MUZZLERIGHT_MAG),
- QUOTE(0.3*MUZZLECLIMB_MAG)
+ 0.2*MUZZLERIGHT_POS,
+ 1*MUZZLECLIMB_POS,
+ 0.2*MUZZLERIGHT_MAG,
+ 0.3*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.03*KICKBACK),
- QUOTE(0.06*KICKBACK)
+ 0.03*KICKBACK,
+ 0.06*KICKBACK
};
- temporary = QUOTE(0.02*MUZZLETEMP);
+ temporary = 0.02*MUZZLETEMP;
};
class recoil_pistol_acpc2: recoil_default {
muzzleOuter[] = {
- QUOTE(0.2*MUZZLERIGHT_POS),
- QUOTE(1.5*MUZZLECLIMB_POS),
- QUOTE(0.2*MUZZLERIGHT_MAG),
- QUOTE(0.3*MUZZLECLIMB_MAG)
+ 0.2*MUZZLERIGHT_POS,
+ 1.5*MUZZLECLIMB_POS,
+ 0.2*MUZZLERIGHT_MAG,
+ 0.3*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.04*KICKBACK),
- QUOTE(0.08*KICKBACK)
+ 0.04*KICKBACK,
+ 0.08*KICKBACK
};
- temporary = QUOTE(0.04*MUZZLETEMP);
+ temporary = 0.04*MUZZLETEMP;
};
class recoil_pistol_4five: recoil_default {
muzzleOuter[] = {
- QUOTE(0.2*MUZZLERIGHT_POS),
- QUOTE(1.5*MUZZLECLIMB_POS),
- QUOTE(0.2*MUZZLERIGHT_MAG),
- QUOTE(0.3*MUZZLECLIMB_MAG)
+ 0.2*MUZZLERIGHT_POS,
+ 1.5*MUZZLECLIMB_POS,
+ 0.2*MUZZLERIGHT_MAG,
+ 0.3*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.04*KICKBACK),
- QUOTE(0.08*KICKBACK)
+ 0.04*KICKBACK,
+ 0.08*KICKBACK
};
- temporary = QUOTE(0.06*MUZZLETEMP);
+ temporary = 0.06*MUZZLETEMP;
};
class recoil_pistol_zubr: recoil_default {
muzzleOuter[] = {
- QUOTE(0.2*MUZZLERIGHT_POS),
- QUOTE(1.5*MUZZLECLIMB_POS),
- QUOTE(0.2*MUZZLERIGHT_MAG),
- QUOTE(0.3*MUZZLECLIMB_MAG)
+ 0.2*MUZZLERIGHT_POS,
+ 1.5*MUZZLECLIMB_POS,
+ 0.2*MUZZLERIGHT_MAG,
+ 0.3*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.04*KICKBACK),
- QUOTE(0.08*KICKBACK)
+ 0.04*KICKBACK,
+ 0.08*KICKBACK
};
- temporary = QUOTE(0.08*MUZZLETEMP);
+ temporary = 0.08*MUZZLETEMP;
};
class recoil_pistol_signal: recoil_default {
muzzleOuter[] = {
- QUOTE(0.2*MUZZLERIGHT_POS),
- QUOTE(1.5*MUZZLECLIMB_POS),
- QUOTE(0.2*MUZZLERIGHT_MAG),
- QUOTE(0.3*MUZZLECLIMB_MAG)
+ 0.2*MUZZLERIGHT_POS,
+ 1.5*MUZZLECLIMB_POS,
+ 0.2*MUZZLERIGHT_MAG,
+ 0.3*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.02*KICKBACK),
- QUOTE(0.04*KICKBACK)
+ 0.02*KICKBACK,
+ 0.04*KICKBACK
};
- temporary = QUOTE(0.02*MUZZLETEMP);
+ temporary = 0.02*MUZZLETEMP;
};
class recoil_rpg: recoil_default {
muzzleOuter[] = {
- QUOTE(2*MUZZLERIGHT_POS),
- QUOTE(3*MUZZLECLIMB_POS),
- QUOTE(1*MUZZLERIGHT_MAG),
- QUOTE(0.5*MUZZLECLIMB_MAG)
+ 0.0*MUZZLERIGHT_POS,
+ 0.1*MUZZLECLIMB_POS,
+ 0.3*MUZZLERIGHT_MAG,
+ 0.5*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.08*KICKBACK),
- QUOTE(0.1*KICKBACK)
+ 0.0*KICKBACK,
+ 0.08*KICKBACK
};
- temporary = QUOTE(0.1*MUZZLETEMP);
+ permanent = 1.0*MUZZLEPERM;
+ temporary = 0.05*MUZZLETEMP;
};
class recoil_nlaw: recoil_default {
muzzleOuter[] = {
- QUOTE(2*MUZZLERIGHT_POS),
- QUOTE(3*MUZZLECLIMB_POS),
- QUOTE(1*MUZZLERIGHT_MAG),
- QUOTE(0.5*MUZZLECLIMB_MAG)
+ 2*MUZZLERIGHT_POS,
+ 3*MUZZLECLIMB_POS,
+ 1*MUZZLERIGHT_MAG,
+ 0.5*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.06*KICKBACK),
- QUOTE(0.08*KICKBACK)
+ 0.06*KICKBACK,
+ 0.08*KICKBACK
};
- temporary = QUOTE(0.08*MUZZLETEMP);
+ temporary = 0.08*MUZZLETEMP;
};
class recoil_titan_long: recoil_default {
muzzleOuter[] = {
- QUOTE(2*MUZZLERIGHT_POS),
- QUOTE(3*MUZZLECLIMB_POS),
- QUOTE(1*MUZZLERIGHT_MAG),
- QUOTE(0.5*MUZZLECLIMB_MAG)
+ 2*MUZZLERIGHT_POS,
+ 3*MUZZLECLIMB_POS,
+ 1*MUZZLERIGHT_MAG,
+ 0.5*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.1*KICKBACK),
- QUOTE(0.12*KICKBACK)
+ 0.1*KICKBACK,
+ 0.12*KICKBACK
};
- temporary = QUOTE(0.15*MUZZLETEMP);
+ temporary = 0.15*MUZZLETEMP;
};
class recoil_titan_short: recoil_default {
muzzleOuter[] = {
- QUOTE(2*MUZZLERIGHT_POS),
- QUOTE(3*MUZZLECLIMB_POS),
- QUOTE(1*MUZZLERIGHT_MAG),
- QUOTE(0.5*MUZZLECLIMB_MAG)
+ 2*MUZZLERIGHT_POS,
+ 3*MUZZLECLIMB_POS,
+ 1*MUZZLERIGHT_MAG,
+ 0.5*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.1*KICKBACK),
- QUOTE(0.12*KICKBACK)
+ 0.1*KICKBACK,
+ 0.12*KICKBACK
};
- temporary = QUOTE(0.12*MUZZLETEMP);
+ temporary = 0.12*MUZZLETEMP;
};
class recoil_mk200: recoil_default {
muzzleOuter[] = {
- QUOTE(0.4*MUZZLERIGHT_POS),
- QUOTE(0.6*MUZZLECLIMB_POS),
- QUOTE(0.6*MUZZLERIGHT_MAG),
- QUOTE(0.2*MUZZLECLIMB_MAG)
+ 0.4*MUZZLERIGHT_POS,
+ 0.6*MUZZLECLIMB_POS,
+ 0.6*MUZZLERIGHT_MAG,
+ 0.2*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.03*KICKBACK),
- QUOTE(0.06*KICKBACK)
+ 0.03*KICKBACK,
+ 0.06*KICKBACK
};
- temporary = QUOTE(0.01*MUZZLETEMP); //0.005*MUZZLETEMP;
+ temporary = 0.01*MUZZLETEMP; //0.005*MUZZLETEMP;
};
class recoil_zafir: recoil_default {
muzzleOuter[] = {
- QUOTE(0.5*MUZZLERIGHT_POS),
- QUOTE(1*MUZZLECLIMB_POS),
- QUOTE(0.7*MUZZLERIGHT_MAG),
- QUOTE(0.3*MUZZLECLIMB_MAG)
+ 0.5*MUZZLERIGHT_POS,
+ 1*MUZZLECLIMB_POS,
+ 0.7*MUZZLERIGHT_MAG,
+ 0.3*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.02*KICKBACK),
- QUOTE(0.08*KICKBACK)
+ 0.02*KICKBACK,
+ 0.08*KICKBACK
};
- temporary = QUOTE(0.01*MUZZLETEMP); //0.005*MUZZLETEMP;
+ temporary = 0.01*MUZZLETEMP; //0.005*MUZZLETEMP;
};
class recoil_m320: recoil_default {
muzzleOuter[] = {
- QUOTE(1*MUZZLERIGHT_POS),
- QUOTE(3*MUZZLECLIMB_POS),
- QUOTE(0.5*MUZZLERIGHT_MAG),
- QUOTE(0.6*MUZZLECLIMB_MAG)
+ 1*MUZZLERIGHT_POS,
+ 3*MUZZLECLIMB_POS,
+ 0.5*MUZZLERIGHT_MAG,
+ 0.6*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.08*KICKBACK),
- QUOTE(0.1*KICKBACK)
+ 0.08*KICKBACK,
+ 0.1*KICKBACK
};
- temporary = QUOTE(0.02*MUZZLETEMP);
+ temporary = 0.02*MUZZLETEMP;
};
class recoil_gm6: recoil_default {
muzzleOuter[] = {
- QUOTE(1.4*MUZZLERIGHT_POS),
- QUOTE(3.5*MUZZLECLIMB_POS),
- QUOTE(0.7*MUZZLERIGHT_MAG),
- QUOTE(0.8*MUZZLECLIMB_MAG)
+ 1.4*MUZZLERIGHT_POS,
+ 3.5*MUZZLECLIMB_POS,
+ 0.7*MUZZLERIGHT_MAG,
+ 0.8*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.1*KICKBACK),
- QUOTE(0.12*KICKBACK)
+ 0.1*KICKBACK,
+ 0.12*KICKBACK
};
- temporary = QUOTE(0.025*MUZZLETEMP);
+ temporary = 0.025*MUZZLETEMP;
};
class recoil_ebr: recoil_default {
muzzleOuter[] = {
- QUOTE(0.4*MUZZLERIGHT_POS),
- QUOTE(1.5*MUZZLECLIMB_POS),
- QUOTE(0.6*MUZZLERIGHT_MAG),
- QUOTE(0.4*MUZZLECLIMB_MAG)
+ 0.4*MUZZLERIGHT_POS,
+ 1.5*MUZZLECLIMB_POS,
+ 0.6*MUZZLERIGHT_MAG,
+ 0.4*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.04*KICKBACK),
- QUOTE(0.07*KICKBACK)
+ 0.04*KICKBACK,
+ 0.07*KICKBACK
};
- temporary = QUOTE(0.01*MUZZLETEMP);
+ temporary = 0.01*MUZZLETEMP;
};
class recoil_dmr_01: recoil_default {
muzzleOuter[] = {
- QUOTE(0.5*MUZZLERIGHT_POS),
- QUOTE(2*MUZZLECLIMB_POS),
- QUOTE(0.5*MUZZLERIGHT_MAG),
- QUOTE(0.5*MUZZLECLIMB_MAG)
+ 0.5*MUZZLERIGHT_POS,
+ 2*MUZZLECLIMB_POS,
+ 0.5*MUZZLERIGHT_MAG,
+ 0.5*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.03*KICKBACK),
- QUOTE(0.08*KICKBACK)
+ 0.03*KICKBACK,
+ 0.08*KICKBACK
};
- temporary = QUOTE(0.015*MUZZLETEMP);
+ temporary = 0.015*MUZZLETEMP;
};
class recoil_dmr_02: recoil_default {
muzzleOuter[] = {
- QUOTE(0.5*MUZZLERIGHT_POS),
- QUOTE(2.5*MUZZLECLIMB_POS),
- QUOTE(0.6*MUZZLERIGHT_MAG),
- QUOTE(0.5*MUZZLECLIMB_MAG)
+ 0.5*MUZZLERIGHT_POS,
+ 2.5*MUZZLECLIMB_POS,
+ 0.6*MUZZLERIGHT_MAG,
+ 0.5*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.06*KICKBACK),
- QUOTE(0.08*KICKBACK)
+ 0.06*KICKBACK,
+ 0.08*KICKBACK
};
- temporary = QUOTE(0.01*MUZZLETEMP);
+ temporary = 0.01*MUZZLETEMP;
};
class recoil_dmr_03: recoil_default {
muzzleOuter[] = {
- QUOTE(0.3*MUZZLERIGHT_POS),
- QUOTE(1.5*MUZZLECLIMB_POS),
- QUOTE(0.5*MUZZLERIGHT_MAG),
- QUOTE(0.4*MUZZLECLIMB_MAG)
+ 0.3*MUZZLERIGHT_POS,
+ 1.5*MUZZLECLIMB_POS,
+ 0.5*MUZZLERIGHT_MAG,
+ 0.4*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.03*KICKBACK),
- QUOTE(0.06*KICKBACK)
+ 0.03*KICKBACK,
+ 0.06*KICKBACK
};
- temporary = QUOTE(0.005*MUZZLETEMP);
+ temporary = 0.005*MUZZLETEMP;
};
class recoil_dmr_04: recoil_default {
muzzleOuter[] = {
- QUOTE(0.4*MUZZLERIGHT_POS),
- QUOTE(1.5*MUZZLECLIMB_POS),
- QUOTE(0.5*MUZZLERIGHT_MAG),
- QUOTE(0.4*MUZZLECLIMB_MAG)
+ 0.4*MUZZLERIGHT_POS,
+ 1.5*MUZZLECLIMB_POS,
+ 0.5*MUZZLERIGHT_MAG,
+ 0.4*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.02*KICKBACK),
- QUOTE(0.04*KICKBACK)
+ 0.02*KICKBACK,
+ 0.04*KICKBACK
};
- temporary = QUOTE(0.015*MUZZLETEMP);
+ temporary = 0.015*MUZZLETEMP;
};
class recoil_dmr_05: recoil_default {
muzzleOuter[] = {
- QUOTE(0.5*MUZZLERIGHT_POS),
- QUOTE(2.5*MUZZLECLIMB_POS),
- QUOTE(0.8*MUZZLERIGHT_MAG),
- QUOTE(0.6*MUZZLECLIMB_MAG)
+ 0.5*MUZZLERIGHT_POS,
+ 2.5*MUZZLECLIMB_POS,
+ 0.8*MUZZLERIGHT_MAG,
+ 0.6*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.08*KICKBACK),
- QUOTE(0.1*KICKBACK)
+ 0.08*KICKBACK,
+ 0.1*KICKBACK
};
- temporary = QUOTE(0.01*MUZZLETEMP);
+ temporary = 0.01*MUZZLETEMP;
};
class recoil_dmr_06: recoil_default {
muzzleOuter[] = {
- QUOTE(0.5*MUZZLERIGHT_POS),
- QUOTE(2*MUZZLECLIMB_POS),
- QUOTE(0.7*MUZZLERIGHT_MAG),
- QUOTE(0.5*MUZZLECLIMB_MAG)
+ 0.5*MUZZLERIGHT_POS,
+ 2*MUZZLECLIMB_POS,
+ 0.7*MUZZLERIGHT_MAG,
+ 0.5*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.05*KICKBACK),
- QUOTE(0.1*KICKBACK)
+ 0.05*KICKBACK,
+ 0.1*KICKBACK
};
- temporary = QUOTE(0.01*MUZZLETEMP);
+ temporary = 0.01*MUZZLETEMP;
};
class recoil_mmg_01: recoil_default {
muzzleOuter[] = {
- QUOTE(0.6*MUZZLERIGHT_POS),
- QUOTE(1.5*MUZZLECLIMB_POS),
- QUOTE(0.8*MUZZLERIGHT_MAG),
- QUOTE(0.3*MUZZLECLIMB_MAG)
+ 0.6*MUZZLERIGHT_POS,
+ 1.5*MUZZLECLIMB_POS,
+ 0.8*MUZZLERIGHT_MAG,
+ 0.3*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.02*KICKBACK),
- QUOTE(0.08*KICKBACK)
+ 0.02*KICKBACK,
+ 0.08*KICKBACK
};
- temporary = QUOTE(0.01*MUZZLETEMP); //0.005*MUZZLETEMP;
+ temporary = 0.01*MUZZLETEMP; //0.005*MUZZLETEMP;
};
class recoil_mmg_02: recoil_default {
muzzleOuter[] = {
- QUOTE(0.5*MUZZLERIGHT_POS),
- QUOTE(1.5*MUZZLECLIMB_POS),
- QUOTE(0.6*MUZZLERIGHT_MAG),
- QUOTE(0.4*MUZZLECLIMB_MAG)
+ 0.5*MUZZLERIGHT_POS,
+ 1.5*MUZZLECLIMB_POS,
+ 0.6*MUZZLERIGHT_MAG,
+ 0.4*MUZZLECLIMB_MAG
};
kickBack[] = {
- QUOTE(0.04*KICKBACK),
- QUOTE(0.08*KICKBACK)
+ 0.04*KICKBACK,
+ 0.08*KICKBACK
};
- temporary = QUOTE(0.01*MUZZLETEMP); //0.005*MUZZLETEMP;
+ temporary = 0.01*MUZZLETEMP; //0.005*MUZZLETEMP;
};
};
diff --git a/addons/recoil/XEH_PREP.hpp b/addons/recoil/XEH_PREP.hpp
index 9e34c47492b..90c7c9cccf8 100644
--- a/addons/recoil/XEH_PREP.hpp
+++ b/addons/recoil/XEH_PREP.hpp
@@ -1,2 +1 @@
-
PREP(camshake);
diff --git a/addons/recoil/XEH_preInit.sqf b/addons/recoil/XEH_preInit.sqf
index ffd1bfc414d..1566a79fd48 100644
--- a/addons/recoil/XEH_preInit.sqf
+++ b/addons/recoil/XEH_preInit.sqf
@@ -7,4 +7,6 @@ PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;
+GVAR(recoilCache) = createHashMap;
+
ADDON = true;
diff --git a/addons/recoil/functions/fnc_camshake.sqf b/addons/recoil/functions/fnc_camshake.sqf
index d68da81db75..9c6e78608f8 100644
--- a/addons/recoil/functions/fnc_camshake.sqf
+++ b/addons/recoil/functions/fnc_camshake.sqf
@@ -1,17 +1,17 @@
#include "..\script_component.hpp"
/*
- * Author: Orginal by Ryan Schultz, edited by KoffeinFlummi, commy2
+ * Author: Original by Ryan Schultz, edited by KoffeinFlummi, commy2
* Adds camera shake when firing. Called from the unified fired EH only for the local player.
* From TMR: Small Arms
*
* Arguments:
- * None. Parameters inherited from EFUNC(common,firedEH)
+ * Parameters inherited from EFUNC(common,firedEH)
*
* Return Value:
* None
*
* Example:
- * [player, (currentWeapon player), (currentMuzzle player)] call ace_recoil_fnc_camshake;
+ * [player, currentWeapon player, currentMuzzle player] call ace_recoil_fnc_camshake
*
* Public: No
*/
@@ -28,20 +28,19 @@ if (toLowerANSI _weapon in ["throw", "put"]) exitWith {};
private _powerMod = ([0, -0.1, -0.1, 0, -0.2] select (["STAND", "CROUCH", "PRONE", "UNDEFINED", ""] find stance _unit)) + ([0, -1, 0, -1] select (["INTERNAL", "EXTERNAL", "GUNNER", "GROUP"] find cameraView));
-// to get camshake read kickback
-private _recoil = missionNamespace getVariable format [QGVAR(%1-%2), _weapon, _muzzle];
-
-if (isNil "_recoil") then {
+// Get camshake read kickback
+private _recoil = GVAR(recoilCache) getOrDefaultCall [_weapon + _muzzle, {
private _config = configFile >> "CfgWeapons" >> _weapon;
- if (_muzzle == _weapon) then {
- _recoil = getText (_config >> "recoil")
+ private _recoil = if (_muzzle == _weapon) then {
+ getText (_config >> "recoil")
} else {
- _recoil = getText (_config >> _muzzle >> "recoil")
+ getText (_config >> _muzzle >> "recoil")
};
if (isClass (configFile >> "CfgRecoils" >> _recoil)) then {
_recoil = getArray (configFile >> "CfgRecoils" >> _recoil >> "kickBack");
+
if (count _recoil < 2) then {
_recoil = [0, 0];
};
@@ -51,17 +50,20 @@ if (isNil "_recoil") then {
TRACE_3("Caching Recoil config",_weapon,_muzzle,_recoil);
- // parse numbers
- _recoil set [0, call compile format ["%1", _recoil select 0]];
- _recoil set [1, call compile format ["%1", _recoil select 1]];
+ // Ensure format is correct
+ _recoil resize [2, 0];
- missionNamespace setVariable [format [QGVAR(%1-%2), _weapon, _muzzle], _recoil];
-};
+ // Parse numbers
+ _recoil apply { if (_x isEqualType 0) then { _x } else { call compile format ["%1", _x] } } // return
+}, true];
private _powerCoef = RECOIL_COEF * linearConversion [0, 1, random 1, _recoil select 0, _recoil select 1, false];
if (isWeaponRested _unit) then {_powerMod = _powerMod - 0.07};
if (isWeaponDeployed _unit) then {_powerMod = _powerMod - 0.11};
+if (_weapon isEqualTo secondaryWeapon _unit) then {
+ _powerCoef = _powerCoef + 25.0;
+};
private _camshake = [
_powerCoef * (BASE_POWER + _powerMod) max 0,
diff --git a/addons/refuel/CfgVehicles.hpp b/addons/refuel/CfgVehicles.hpp
index 44575a141d7..dbbcaf04d1c 100644
--- a/addons/refuel/CfgVehicles.hpp
+++ b/addons/refuel/CfgVehicles.hpp
@@ -238,6 +238,20 @@ class CfgVehicles {
// Patria = LAV
GVAR(fuelCapacity) = 269;
};
+ class APC_Wheeled_02_base_F: Wheeled_APC_F {
+ class EGVAR(interaction,anims);
+ };
+ class APC_Wheeled_02_base_v2_F: APC_Wheeled_02_base_F {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class showCanisters {
+ phase = 0;
+ positions[] = {{-1.188, -3.87, -0.769}, {1.638, -3.87, -0.769}};
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ name = CSTRING(TakeFuelCanister);
+ text = CSTRING(TakeFuelCanisterAction);
+ };
+ };
+ };
class Truck_F: Car_F {
GVAR(fuelCapacity) = 400;
@@ -308,12 +322,14 @@ class CfgVehicles {
class MBT_01_base_F: Tank_F {
// Merkava IV
GVAR(fuelCapacity) = 1400;
+ class EGVAR(interaction,anims);
};
class MBT_02_base_F: Tank_F {
// T100 Black Eagle
// Assuming T80
GVAR(fuelCapacity) = 1100;
+ class EGVAR(interaction,anims);
};
class MBT_03_base_F: Tank_F {
@@ -324,11 +340,37 @@ class CfgVehicles {
class MBT_01_arty_base_F: MBT_01_base_F {
// Assuming similar 2S3
GVAR(fuelCapacity) = 830;
+
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class showCanisters {
+ phase = 0;
+ // Rotate interactions with turret rotation
+ positions[] = {
+ "[0, -2.5, 0] vectorAdd ([[1.6, -2.4, -0.3], [0, 0, 1], deg (_target animationPhase 'MainTurret')] call CBA_fnc_vectRotate3D)",
+ "[0, -2.5, 0] vectorAdd ([[1.8, 0.55, -0.7], [0, 0, 1], deg (_target animationPhase 'MainTurret')] call CBA_fnc_vectRotate3D)",
+ "[0, -2.5, 0] vectorAdd ([[-1.8, 0.55, -0.7], [0, 0, 1], deg (_target animationPhase 'MainTurret')] call CBA_fnc_vectRotate3D)"
+ };
+ items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F", "Land_CanisterFuel_F"};
+ name = CSTRING(TakeFuelCanister);
+ text = CSTRING(TakeFuelCanisterAction);
+ };
+ };
};
class MBT_02_arty_base_F: MBT_02_base_F {
// Assuming similar 2S3
GVAR(fuelCapacity) = 830;
+
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class showCanisters {
+ phase = 0;
+ // Rotate interactions with turret rotation
+ positions[] = {"[0, -2.1, 0] vectorAdd ([[1.6, -2.65, -0.3], [0, 0, 1], deg (_target animationPhase 'MainTurret')] call CBA_fnc_vectRotate3D)"};
+ items[] = {"Land_CanisterFuel_F"};
+ name = CSTRING(TakeFuelCanister);
+ text = CSTRING(TakeFuelCanisterAction);
+ };
+ };
};
class Heli_Light_02_base_F: Helicopter_Base_H {
diff --git a/addons/refuel/XEH_postInit.sqf b/addons/refuel/XEH_postInit.sqf
index d007266e5ff..4edd18de148 100644
--- a/addons/refuel/XEH_postInit.sqf
+++ b/addons/refuel/XEH_postInit.sqf
@@ -66,6 +66,7 @@
["MouseButtonDown", LINKFUNC(onMouseButtonDown)] call CBA_fnc_addDisplayHandler;
+ //IGNORE_PRIVATE_WARNING ["_player", "_target"];
GVAR(mainAction) = [
QGVAR(Refuel),
localize LSTRING(Refuel),
diff --git a/addons/refuel/dev/exportTerrainRefuelPositions.sqf b/addons/refuel/dev/exportTerrainRefuelPositions.sqf
index c7f9abfb2fd..8064736ad9c 100644
--- a/addons/refuel/dev/exportTerrainRefuelPositions.sqf
+++ b/addons/refuel/dev/exportTerrainRefuelPositions.sqf
@@ -69,7 +69,7 @@ if (_checkCount != _totalCount) then {
// export text
private _nl = toString [10];
private _multipleBasePumps = 1 < count _basePumps;
-private _output = [format [" %1[] = { /* %2 */", worldName, getText (configfile >> "CfgWorlds" >> worldName >> "description")]];
+private _output = [format [" %1[] = { /* %2 */", worldName, getText (configFile >> "CfgWorlds" >> worldName >> "description")]];
{
if (_forEachIndex > 0) then {_output pushBack ","};
_x params ["_class", "_positions"];
diff --git a/addons/refuel/functions/fnc_connectNozzleAction.sqf b/addons/refuel/functions/fnc_connectNozzleAction.sqf
index 502e1dc3a41..1a022b6e768 100644
--- a/addons/refuel/functions/fnc_connectNozzleAction.sqf
+++ b/addons/refuel/functions/fnc_connectNozzleAction.sqf
@@ -62,7 +62,7 @@ if (_bestPosASL isEqualTo []) exitWith {
//Move it out slightly, for visibility sake (better to look a little funny than be embedded//sunk in the hull and be useless)
_bestPosASL = _bestPosASL vectorAdd ((_bestPosASL vectorFromTo _startingPosASL) vectorMultiply 0.05);
-private _attachPosModel = _sink worldToModel (ASLtoAGL _bestPosASL);
+private _attachPosModel = _sink worldToModel (ASLToAGL _bestPosASL);
[
GVAR(progressDuration),
diff --git a/addons/refuel/functions/fnc_handleDisconnect.sqf b/addons/refuel/functions/fnc_handleDisconnect.sqf
index cf4b37cce9a..3aa1831a186 100644
--- a/addons/refuel/functions/fnc_handleDisconnect.sqf
+++ b/addons/refuel/functions/fnc_handleDisconnect.sqf
@@ -24,4 +24,4 @@ private _nozzle = _unit getVariable [QGVAR(nozzle), objNull];
if (isNull _nozzle) exitWith {};
[_unit, _nozzle] call FUNC(dropNozzle);
-[_unit, "forceWalk", "ACE_refuel", false] call EFUNC(common,statusEffect_set);
+[_unit, "forceWalk", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
diff --git a/addons/refuel/functions/fnc_makeJerryCan.sqf b/addons/refuel/functions/fnc_makeJerryCan.sqf
index 31a91a30d7b..29b5dd98fcd 100644
--- a/addons/refuel/functions/fnc_makeJerryCan.sqf
+++ b/addons/refuel/functions/fnc_makeJerryCan.sqf
@@ -38,6 +38,8 @@ if (isServer) then {
[QGVAR(jerryCanInitalized), [_target]] call CBA_fnc_globalevent;
};
+//IGNORE_PRIVATE_WARNING ["_player", "_target"];
+
// Main Action
private _action = [QGVAR(Refuel),
localize LSTRING(Refuel),
diff --git a/addons/refuel/functions/fnc_returnNozzle.sqf b/addons/refuel/functions/fnc_returnNozzle.sqf
index ea84f6a5180..eba836ed8a1 100644
--- a/addons/refuel/functions/fnc_returnNozzle.sqf
+++ b/addons/refuel/functions/fnc_returnNozzle.sqf
@@ -43,12 +43,12 @@ 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);
+ [_source, "blockEngine", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
},
"",
localize LSTRING(ReturnAction),
diff --git a/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf b/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf
index 611fa85e909..da47bc3c725 100644
--- a/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf
+++ b/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf
@@ -23,8 +23,8 @@
#define END_PFH \
_unit setVariable [QGVAR(hint), nil]; \
call EFUNC(interaction,hideMouseHint); \
- [_unit, "forceWalk", "ACE_refuel", false] call EFUNC(common,statusEffect_set); \
- [_unit, "blockThrow", "ACE_refuel", false] call EFUNC(common,statusEffect_set); \
+ [_unit, "forceWalk", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set); \
+ [_unit, "blockThrow", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set); \
[_idPFH] call CBA_fnc_removePerFrameHandler;
params ["_unit", "_nozzle"];
@@ -89,7 +89,7 @@ TRACE_2("start",_unit,_nozzle);
};
private _hintLMB = "";
- private _hintRMB = localize ELSTRING(dragging,Drop);
+ private _hintRMB = LELSTRING(common,Drop);
getCursorObjectParams params ["_cursorObject", "", "_distance"];
if (!isNull _cursorObject && {_distance < REFUEL_NOZZLE_ACTION_DISTANCE}) then {
diff --git a/addons/refuel/functions/fnc_takeNozzle.sqf b/addons/refuel/functions/fnc_takeNozzle.sqf
index cd8f8b4eb4e..51db8789e5d 100644
--- a/addons/refuel/functions/fnc_takeNozzle.sqf
+++ b/addons/refuel/functions/fnc_takeNozzle.sqf
@@ -80,7 +80,7 @@ params [
_nozzle setVariable [QGVAR(attachPos), _attachPos, true];
_nozzle setVariable [QGVAR(source), _source, true];
- [_source, "blockEngine", "ACE_Refuel", true] call EFUNC(common,statusEffect_set);
+ [_source, "blockEngine", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
_source setVariable [QGVAR(isConnected), true, true];
_source setVariable [QGVAR(ownedNozzle), _nozzle, true];
@@ -100,8 +100,8 @@ params [
_unit call EFUNC(common,fixLoweredRifleAnimation);
_unit action ["SwitchWeapon", _unit, _unit, 299];
- [_unit, "forceWalk", "ACE_refuel", true] call EFUNC(common,statusEffect_set);
- [_unit, "blockThrow", "ACE_refuel", true] call EFUNC(common,statusEffect_set);
+ [_unit, "forceWalk", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
+ [_unit, "blockThrow", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
[_unit, _nozzle] call FUNC(startNozzleInHandsPFH);
},
diff --git a/addons/reload/functions/fnc_canCheckAmmo.sqf b/addons/reload/functions/fnc_canCheckAmmo.sqf
index 96b9f88d501..829e57e2569 100644
--- a/addons/reload/functions/fnc_canCheckAmmo.sqf
+++ b/addons/reload/functions/fnc_canCheckAmmo.sqf
@@ -4,23 +4,24 @@
* Check if a unit can check the ammo of the target.
*
* Arguments:
- * 0: Unit equipped with the weapon
+ * 0: Unit equipped with the weapon/CSW to check
+ * 1: Unit checking ammo
*
* Return Value:
* Can check ammo
*
* Example:
- * [cursorObject] call ace_reload_fnc_canCheckAmmo
+ * [cursorObject, player] call ace_reload_fnc_canCheckAmmo
*
* Public: No
*/
-params ["_target"];
+params ["_target", "_player"];
// Static weapons
if (_target isKindOf "StaticWeapon") exitWith {
// No check ammo action on destroyed static weapons
- if (!alive _target) exitWith {false};
+ if (!alive _target || {!([_player, _target] call EFUNC(interaction,canInteractWithVehicleCrew))}) exitWith {false};
if (currentMagazine _target != "") exitWith {true};
diff --git a/addons/reload/functions/fnc_checkAmmo.sqf b/addons/reload/functions/fnc_checkAmmo.sqf
index f558d917699..8039c9527ca 100644
--- a/addons/reload/functions/fnc_checkAmmo.sqf
+++ b/addons/reload/functions/fnc_checkAmmo.sqf
@@ -23,7 +23,7 @@ if (_unit == _target) then {
_target = vehicle _target;
};
- [_unit, "Gear", 1] call EFUNC(common,doGesture);
+ [_unit, "reloadMagazine", 0] call EFUNC(common,doGesture);
};
[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 68e176587ad..7e38ee65f87 100644
--- a/addons/reload/functions/fnc_displayAmmo.sqf
+++ b/addons/reload/functions/fnc_displayAmmo.sqf
@@ -122,7 +122,7 @@ if (_isStaticWeapon) then {
_loadedName = parseText format ["%1", _loadedName];
- private _text = composeText [_loadedName, linebreak, _ammoBarsStructuredText];
+ private _text = composeText [_loadedName, lineBreak, _ammoBarsStructuredText];
[_text] call EFUNC(common,displayTextStructured);
} else {
if (_magazine != "") then {
diff --git a/addons/reload/stringtable.xml b/addons/reload/stringtable.xml
index 2f0c6c60c1f..ec860ff46a1 100644
--- a/addons/reload/stringtable.xml
+++ b/addons/reload/stringtable.xml
@@ -107,7 +107,7 @@
Gurt anhängen
Töltényheveder összekötése
Combina nastro
- Ligar cintos de munição
+ Conectar cintos de munição
ベルトを繋げる
탄띠 연결
连接弹链
@@ -123,7 +123,7 @@
Gurt anhängen...
Töltényheveder összekötése folyamatban...
Combinando nastro...
- Ligando cintos...
+ Conectando cintos...
ベルトを繋げています・・・
탄띠 연결 중...
正在连接弹链...
@@ -139,6 +139,7 @@
탄띠가 연결되었습니다
Ремень был пристегнут
Cinta enganchada
+ Cinto conectado
Belt could not be linked
@@ -150,6 +151,7 @@
탄띠를 연결할 수 없습니다
Ремень не удалось пристегнуть
La cinta no ha podido ser enganchada
+ Cinto não pôde ser conectado
diff --git a/addons/reloadlaunchers/stringtable.xml b/addons/reloadlaunchers/stringtable.xml
index b55ccde1705..6324a97b552 100644
--- a/addons/reloadlaunchers/stringtable.xml
+++ b/addons/reloadlaunchers/stringtable.xml
@@ -11,6 +11,7 @@
Affichage de notifications lors d'une rechargement par un ami
Отображает уведомления о загрузке помощника
Mostrar notificaciones para recarga de compañero
+ Mostrar notificações para Carregamento de Companheiro
Displays notifications when an assistant loads a gunner's launcher.
@@ -22,6 +23,7 @@
Affiche une notofication lorsqu'un assistant recharge l'arme du tireur.
Отображает уведомления, когда помощник загружает пусковую установку стрелка.
Mostrar notificaciones cuando un asistente recarga el lanzador del tirador.
+ Notifica quando um assistente carrega o lançador do atirador
Load launcher
@@ -50,6 +52,7 @@
%1이(가) 당신의 발사기를 장전했습니다.
%1 загружает Вашу установку
%1 está cargando tu lanzador
+ %1 está carregando seu lançador
%1 stopped loading your launcher
@@ -61,6 +64,7 @@
%1이(가) 당신의 발사기 장전을 멈췄습니다.
%1 прекратил загружать Вашу установку
%1 paró de cargar tu lanzador
+ %1 parou de carregar seu lançador
Loading launcher...
@@ -123,6 +127,7 @@
발사기를 장전할 수 없습니다.
Не удалось загрузить пусковую установку
El lanzador no ha podido ser cargado
+ O lançador não pôde ser carregado
Buddy Loading
@@ -134,6 +139,7 @@
バディローディング
Перезарядка помощником
Cargado de Compañero
+ Carregamento de Companheiro
diff --git a/addons/repair/CfgVehicles.hpp b/addons/repair/CfgVehicles.hpp
index ce74737b766..89d3cd83133 100644
--- a/addons/repair/CfgVehicles.hpp
+++ b/addons/repair/CfgVehicles.hpp
@@ -429,9 +429,34 @@ class CfgVehicles {
GVAR(hitpointPositions)[] = {{"HitTurret", {0,-2,0}}};
};
+ class Tank_F;
+ class APC_Tracked_02_base_F: Tank_F {
+ class EGVAR(interaction,anims) {
+ class showTracks {
+ phase = 0;
+ selections[] = {"vhc_tracks"};
+ positions[] = {"private _pos = _target selectionPosition 'vhc_tracks'; _pos set [0, -(_pos select 0)]; _pos"}; // Mirror position to other side of vehicle
+ items[] = {"ACE_Track", "ACE_Track", "ACE_Track"};
+ name = CSTRING(RemoveTrack);
+ text = CSTRING(RemovingTrack);
+ };
+ };
+ };
+
class Car_F: Car {
class HitPoints;
};
+ class Offroad_02_base_F: Car_F {
+ class EGVAR(interaction,anims) {
+ class hideSpareWheel {
+ positions[] = {"_target selectionPosition ['spare_wheel', 'ViewGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = CSTRING(RemoveWheel);
+ text = CSTRING(RemovingWheel);
+ };
+ };
+ };
+
class Truck_F: Car_F {
class HitPoints: HitPoints {
class HitLBWheel;
@@ -449,10 +474,45 @@ class CfgVehicles {
};
};
+ class Truck_01_viv_base_F;
+ class Truck_01_cargo_base_F: Truck_01_viv_base_F {
+ class EGVAR(interaction,anims) {
+ class Tyre1_hide {
+ positions[] = {"_target selectionPosition ['tyre1_hide', 'ViewGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = CSTRING(RemoveWheel);
+ text = CSTRING(RemovingWheel);
+ distance = 2.5;
+ };
+ };
+ };
+ class Truck_01_flatbed_base_F: Truck_01_viv_base_F {
+ class EGVAR(interaction,anims) {
+ class Tyre1_hide {
+ positions[] = {"_target selectionPosition ['tyre1_hide', 'ViewGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = CSTRING(RemoveWheel);
+ text = CSTRING(RemovingWheel);
+ distance = 2.5;
+ };
+ };
+ };
+
class Quadbike_01_base_F: Car_F {
GVAR(hitpointPositions)[] = { {"HitEngine", {0, 0.5, -0.7}}, {"HitFuel", {0, 0, -0.5}} };
};
class Hatchback_01_base_F: Car_F {
GVAR(hitpointPositions)[] = {{"HitBody", {0, 0.7, -0.5}}, {"HitFuel", {0, -1.75, -0.75}}};
};
+
+ class Van_02_base_F: Truck_F {
+ class EGVAR(interaction,anims) {
+ class spare_tyre_hide {
+ positions[] = {"_target selectionPosition ['spare_tyre', 'ViewGeometry', 'AveragePoint']"};
+ items[] = {"ACE_Wheel"};
+ name = CSTRING(RemoveWheel);
+ text = CSTRING(RemovingWheel);
+ };
+ };
+ };
};
diff --git a/addons/repair/functions/fnc_addRepairActions.sqf b/addons/repair/functions/fnc_addRepairActions.sqf
index 16711d7b8a1..095df261aaa 100644
--- a/addons/repair/functions/fnc_addRepairActions.sqf
+++ b/addons/repair/functions/fnc_addRepairActions.sqf
@@ -66,11 +66,11 @@ private _turretPaths = ((fullCrew [_vehicle, "gunner", true]) + (fullCrew [_vehi
TRACE_3("Adding Wheel Actions",_hitpoint,_forEachIndex,_selection);
// An action to replace the wheel is required
- _name = format ["Replace_%1_%2", _forEachIndex, _hitpoint];
- _text = localize LSTRING(ReplaceWheel);
- _condition = {[_this select 1, _this select 0, _this select 2 select 0, "ReplaceWheel"] call DFUNC(canRepair)};
- _statement = {[_this select 1, _this select 0, _this select 2 select 0, "ReplaceWheel"] call DFUNC(repair)};
- _action = [_name, _text, _icon, _statement, _condition, {}, [_hitpoint], _position, 2] call EFUNC(interact_menu,createAction);
+ private _name = format ["Replace_%1_%2", _forEachIndex, _hitpoint];
+ private _text = localize LSTRING(ReplaceWheel);
+ private _condition = {[_this select 1, _this select 0, _this select 2 select 0, "ReplaceWheel"] call DFUNC(canRepair)};
+ private _statement = {[_this select 1, _this select 0, _this select 2 select 0, "ReplaceWheel"] call DFUNC(repair)};
+ private _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
@@ -118,6 +118,7 @@ private _turretPaths = ((fullCrew [_vehicle, "gunner", true]) + (fullCrew [_vehi
};
// Find the action position
+ //IGNORE_PRIVATE_WARNING ["_target"];
private _position = compile format ["_target selectionPosition ['%1', 'HitPoints'];", _selection];
{
_x params ["_hit", "_pos"];
diff --git a/addons/repair/functions/fnc_canRepair.sqf b/addons/repair/functions/fnc_canRepair.sqf
index ff61450b12b..4a77383c288 100644
--- a/addons/repair/functions/fnc_canRepair.sqf
+++ b/addons/repair/functions/fnc_canRepair.sqf
@@ -21,7 +21,7 @@
params ["_caller", "_target", "_hitPoint", "_className"];
TRACE_4("params",_caller,_target,_hitPoint,_className);
-private _config = (ConfigFile >> "ACE_Repair" >> "Actions" >> _className);
+private _config = (configFile >> "ACE_Repair" >> "Actions" >> _className);
if !(isClass _config) exitWith {false}; // or go for a default?
// if(isEngineOn _target) exitWith {false}; // Ignore here so action shows, then exit and show warning when selected #3348
diff --git a/addons/repair/functions/fnc_doRepairTrack.sqf b/addons/repair/functions/fnc_doRepairTrack.sqf
index 519a3f78d68..fcd71b59c9a 100644
--- a/addons/repair/functions/fnc_doRepairTrack.sqf
+++ b/addons/repair/functions/fnc_doRepairTrack.sqf
@@ -26,7 +26,7 @@ TRACE_4("params",_unit,_vehicle,_hitPoint,_claimedObjects);
_claimedObjects params [["_track", objNull]];
if ((isNull _track) || {!([_unit, _track, ["isNotDragging", "isNotCarrying", "isNotOnLadder"]] call EFUNC(common,canInteractWith))}) exitWith {
- ERROR_1("Bad Track",_claimedObjects);
+ ERROR_1("Bad Track %1",_claimedObjects);
};
// can't use a destroyed track
diff --git a/addons/repair/functions/fnc_doReplaceTrack.sqf b/addons/repair/functions/fnc_doReplaceTrack.sqf
index a512089c891..899532d96a8 100644
--- a/addons/repair/functions/fnc_doReplaceTrack.sqf
+++ b/addons/repair/functions/fnc_doReplaceTrack.sqf
@@ -26,7 +26,7 @@ TRACE_4("params",_unit,_vehicle,_hitPoint,_claimedObjects);
_claimedObjects params [["_track", objNull]];
if ((isNull _track) || {!([_unit, _track, ["isNotDragging", "isNotCarrying", "isNotOnLadder"]] call EFUNC(common,canInteractWith))}) exitWith {
- ERROR_1("Bad Track",_claimedObjects);
+ ERROR_1("Bad Track %1",_claimedObjects);
};
// get current hitpoint damage
diff --git a/addons/repair/functions/fnc_doReplaceWheel.sqf b/addons/repair/functions/fnc_doReplaceWheel.sqf
index 7ec617127cf..368fe049702 100644
--- a/addons/repair/functions/fnc_doReplaceWheel.sqf
+++ b/addons/repair/functions/fnc_doReplaceWheel.sqf
@@ -26,7 +26,7 @@ TRACE_4("params",_unit,_vehicle,_hitPoint,_claimedObjects);
_claimedObjects params [["_wheel", objNull]];
if ((isNull _wheel) || {!([_unit, _wheel, ["isNotDragging", "isNotCarrying", "isNotOnLadder"]] call EFUNC(common,canInteractWith))}) exitWith {
- WARNING_1("Bad Claimed Wheel",_claimedObjects);
+ WARNING_1("Bad Claimed Wheel %1",_claimedObjects);
};
// get current hitpoint damage
diff --git a/addons/repair/functions/fnc_isInRepairFacility.sqf b/addons/repair/functions/fnc_isInRepairFacility.sqf
index 51cc5424bbd..74d94c5e75a 100644
--- a/addons/repair/functions/fnc_isInRepairFacility.sqf
+++ b/addons/repair/functions/fnc_isInRepairFacility.sqf
@@ -33,6 +33,7 @@ private _checkObject = {
};
private _fnc_check = {
+ //IGNORE_PRIVATE_WARNING ["_unit", "_checkObject", "_x"];
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)}
diff --git a/addons/repair/functions/fnc_isNearRepairVehicle.sqf b/addons/repair/functions/fnc_isNearRepairVehicle.sqf
index d319273e641..13b089bdd90 100644
--- a/addons/repair/functions/fnc_isNearRepairVehicle.sqf
+++ b/addons/repair/functions/fnc_isNearRepairVehicle.sqf
@@ -19,6 +19,7 @@
params ["_unit"];
TRACE_1("params",_unit);
+//IGNORE_PRIVATE_WARNING ["_unit"];
private _fnc_check = {
private _nearObjects = nearestObjects [_unit, ["Air", "LandVehicle", "Slingload_base_F"], 20];
diff --git a/addons/repair/functions/fnc_patchRemovedWheel.sqf b/addons/repair/functions/fnc_patchRemovedWheel.sqf
index b0978013d55..1f1d8e32c68 100644
--- a/addons/repair/functions/fnc_patchRemovedWheel.sqf
+++ b/addons/repair/functions/fnc_patchRemovedWheel.sqf
@@ -23,7 +23,7 @@ params ["_unit", "_target"];
private _wheelDamage = (damage _target) - GVAR(patchWheelMaximumRepair);
[ceil (_wheelDamage / 0.05) * GVAR(patchWheelTime), [_target], {}, {}, LLSTRING(PatchingWheel), {
- params ["_args"];
+ params ["_args", "_elapsedTime", "_totalTime"];
_args params ["_target"];
private _damage = damage _target;
@@ -35,5 +35,4 @@ private _wheelDamage = (damage _target) - GVAR(patchWheelMaximumRepair);
_target setDamage _damage;
_damage > GVAR(patchWheelMaximumRepair)
-}] call ace_common_fnc_progressBar;
-
+}] call EFUNC(common,progressBar);
diff --git a/addons/repair/functions/fnc_repair.sqf b/addons/repair/functions/fnc_repair.sqf
index ccb2e42dfd0..ae4038daf0a 100644
--- a/addons/repair/functions/fnc_repair.sqf
+++ b/addons/repair/functions/fnc_repair.sqf
@@ -21,7 +21,7 @@
params ["_caller", "_target", "_hitPoint", "_className"];
TRACE_4("params",_caller,_target,_hitPoint,_className);
-private _config = (ConfigFile >> "ACE_Repair" >> "Actions" >> _className);
+private _config = (configFile >> "ACE_Repair" >> "Actions" >> _className);
if !(isClass _config) exitWith {false}; // or go for a default?
private _engineerRequired = if (isNumber (_config >> "requiredEngineer")) then {
diff --git a/addons/repair/functions/fnc_repair_failure.sqf b/addons/repair/functions/fnc_repair_failure.sqf
index 37b2c50447c..0c7fcbf9af3 100644
--- a/addons/repair/functions/fnc_repair_failure.sqf
+++ b/addons/repair/functions/fnc_repair_failure.sqf
@@ -59,7 +59,7 @@ if (!isNil "_weaponSelect") then {
// Record specific callback
-private _config = (ConfigFile >> "ACE_Repair" >> "Actions" >> _className);
+private _config = (configFile >> "ACE_Repair" >> "Actions" >> _className);
private _callback = getText (_config >> "callbackFailure");
if (isNil _callback) then {
diff --git a/addons/repair/functions/fnc_repair_success.sqf b/addons/repair/functions/fnc_repair_success.sqf
index 9da2b0c4039..94ffd819e31 100644
--- a/addons/repair/functions/fnc_repair_success.sqf
+++ b/addons/repair/functions/fnc_repair_success.sqf
@@ -54,7 +54,7 @@ if (!isNil "_weaponSelect") then {
} forEach _claimedObjects;
// Record specific callback
-private _config = (ConfigFile >> "ACE_Repair" >> "Actions" >> _className);
+private _config = (configFile >> "ACE_Repair" >> "Actions" >> _className);
private _callback = getText (_config >> "callbackSuccess");
if (isNil _callback) then {
diff --git a/addons/repair/functions/fnc_useItems.sqf b/addons/repair/functions/fnc_useItems.sqf
index edc18bcb16f..784c4a5da2a 100644
--- a/addons/repair/functions/fnc_useItems.sqf
+++ b/addons/repair/functions/fnc_useItems.sqf
@@ -25,14 +25,14 @@ private _itemsUsedBy = [];
if (_x isEqualType []) then {
{
private _itemUsedInfo = [_unit, _x] call FUNC(useItem);
- if (_itemUsedInfo select 0) exitWith { _itemsUsedBy pushback [(_itemUsedInfo select 1), _x]};
+ if (_itemUsedInfo select 0) exitWith { _itemsUsedBy pushBack [(_itemUsedInfo select 1), _x]};
} forEach _x;
};
// handle required item
if (_x isEqualType "") then {
private _itemUsedInfo = [_unit, _x] call FUNC(useItem);
- if (_itemUsedInfo select 0) exitWith { _itemsUsedBy pushback [(_itemUsedInfo select 1), _x]};
+ if (_itemUsedInfo select 0) exitWith { _itemsUsedBy pushBack [(_itemUsedInfo select 1), _x]};
};
} forEach _items;
diff --git a/addons/respawn/functions/fnc_moveRallypoint.sqf b/addons/respawn/functions/fnc_moveRallypoint.sqf
index 3c4d8b6441c..03c29624735 100644
--- a/addons/respawn/functions/fnc_moveRallypoint.sqf
+++ b/addons/respawn/functions/fnc_moveRallypoint.sqf
@@ -39,7 +39,7 @@ _position set [2, 0];
[localize LSTRING(Deploy)] call EFUNC(common,displayTextStructured);
[{
- params ["_rallypoint", "_unit", "_position"];
+ params ["_rallypoint", "_unit", "_position", "_side"];
_rallypoint setPosATL _position;
_unit reveal _rallypoint;
@@ -49,4 +49,4 @@ _position set [2, 0];
["ace_rallypointMoved", [_rallypoint, _side, _position]] call CBA_fnc_globalEvent;
[localize LSTRING(Deployed)] call EFUNC(common,displayTextStructured);
-}, [_rallypoint, _unit, _position], 5] call CBA_fnc_waitAndExecute;
+}, [_rallypoint, _unit, _position, _side], 5] call CBA_fnc_waitAndExecute;
diff --git a/addons/respawn/functions/fnc_updateRallypoint.sqf b/addons/respawn/functions/fnc_updateRallypoint.sqf
index a0e14a4ed29..bedc887b3c2 100644
--- a/addons/respawn/functions/fnc_updateRallypoint.sqf
+++ b/addons/respawn/functions/fnc_updateRallypoint.sqf
@@ -18,7 +18,7 @@
*/
params ["_rallypoint", "_side"];
-private _position = param [2, getpos _rallypoint];
+private _position = param [2, getPos _rallypoint];
if (!hasInterface) exitWith {};
diff --git a/addons/safemode/CfgEventHandlers.hpp b/addons/safemode/CfgEventHandlers.hpp
index 6c29240403a..f6503c2479b 100644
--- a/addons/safemode/CfgEventHandlers.hpp
+++ b/addons/safemode/CfgEventHandlers.hpp
@@ -1,4 +1,3 @@
-
class Extended_PreStart_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_preStart));
diff --git a/addons/safemode/XEH_PREP.hpp b/addons/safemode/XEH_PREP.hpp
index 2f23aa02c9e..499ae808670 100644
--- a/addons/safemode/XEH_PREP.hpp
+++ b/addons/safemode/XEH_PREP.hpp
@@ -1,6 +1,6 @@
-
+PREP(getWeaponSafety);
PREP(lockSafety);
PREP(playChangeFiremodeSound);
PREP(setSafeModeVisual);
-PREP(unlockSafety);
PREP(setWeaponSafety);
+PREP(unlockSafety);
diff --git a/addons/safemode/XEH_postInit.sqf b/addons/safemode/XEH_postInit.sqf
index db922f9b35d..fa6649aa9f1 100644
--- a/addons/safemode/XEH_postInit.sqf
+++ b/addons/safemode/XEH_postInit.sqf
@@ -4,18 +4,42 @@
if (!hasInterface) exitWith {};
-["ACE3 Weapons", QGVAR(safeMode), localize LSTRING(SafeMode), {
+["ACE3 Weapons", QGVAR(safeMode), LLSTRING(SafeMode), {
// Conditions: canInteract
if !([ACE_player, objNull, ["isNotEscorting", "isNotInside", "isNotSwimming"]] call EFUNC(common,canInteractWith)) exitWith {false};
+
+ (weaponState ACE_player) params ["_currentWeapon", "_currentMuzzle"];
+
// Conditions: specific
- if !([ACE_player] call CBA_fnc_canUseWeapon && {currentWeapon ACE_player != binocular ACE_player} && {currentWeapon ACE_player != ""}) exitWith {false};
+ if !(ACE_player call CBA_fnc_canUseWeapon && {_currentWeapon != ""} && {_currentWeapon != binocular ACE_player}) exitWith {false};
+
+ // Statement: Toggle weapon safety
+ [ACE_player, _currentWeapon, _currentMuzzle] call FUNC(lockSafety);
- // Statement
- [ACE_player, currentWeapon ACE_player, currentMuzzle ACE_player] call FUNC(lockSafety);
true
}, {false}, [DIK_GRAVE, [false, true, false]], false] call CBA_fnc_addKeybind;
["unit", {
- private _weaponSafe = currentWeapon ACE_player in (ACE_player getVariable [QGVAR(safedWeapons), []]);
- [!_weaponSafe] call FUNC(setSafeModeVisual);
+ (weaponState ACE_player) params ["_currentWeapon", "_currentMuzzle"];
+
+ private _weaponSafe = [ACE_player, _currentWeapon, _currentMuzzle] call FUNC(getWeaponSafety);
+
+ // Player HUD
+ !_weaponSafe call FUNC(setSafeModeVisual);
}] call CBA_fnc_addPlayerEventHandler;
+
+// Variables are transferred from corpse to new body and EH above triggers on respawn, which desyncs safeties
+// Therefore, clear variables and remove mouse button input blocking upon respawn
+[QUOTE(ADDON), "Respawn", {
+ params ["_unit"];
+
+ _unit setVariable [QGVAR(safedWeapons), nil];
+
+ private _ehID = _unit getVariable QGVAR(actionID);
+
+ if (isNil "_ehID") exitWith {};
+
+ [_unit, "DefaultAction", _ehID] call EFUNC(common,removeActionEventHandler);
+
+ _unit setVariable [QGVAR(actionID), nil];
+}] call EFUNC(common,addPlayerEH);
diff --git a/addons/safemode/functions/fnc_getWeaponSafety.sqf b/addons/safemode/functions/fnc_getWeaponSafety.sqf
new file mode 100644
index 00000000000..b171d974e4d
--- /dev/null
+++ b/addons/safemode/functions/fnc_getWeaponSafety.sqf
@@ -0,0 +1,45 @@
+#include "..\script_component.hpp"
+/*
+ * Author: johnb43
+ * Getter for weapon safety state.
+ *
+ * Arguments:
+ * 0: Unit
+ * 1: Weapon
+ * 2: Muzzle (default: current muzzle of weapon)
+ *
+ * Return Value:
+ * Safety status
+ *
+ * Example:
+ * [ACE_player, currentWeapon ACE_player] call ace_safemode_fnc_getWeaponSafety
+ *
+ * Public: Yes
+ */
+
+params [
+ ["_unit", objNull, [objNull]],
+ ["_weapon", "", [""]],
+ ["_muzzle", nil, [""]]
+];
+
+if (_weapon == "" || {!(_unit hasWeapon _weapon)}) exitWith {false};
+
+// Check if weapon is a binocular
+if ((_weapon call EFUNC(common,getItemType)) select 1 == "binocular") exitWith {false};
+
+// Check for invalid muzzles
+_muzzle = if (isNil "_muzzle") then {
+ // Get current weapon muzzle if not defined
+ (_unit weaponState _weapon) select 1
+} else {
+ // Get config case muzzle names
+ private _muzzles = _weapon call EFUNC(common,getWeaponMuzzles);
+
+ _muzzles param [_muzzles findIf {_x == _muzzle}, ""]
+};
+
+// Weapon is not available
+if (_muzzle == "") exitWith {false};
+
+_muzzle in ((_unit getVariable [QGVAR(safedWeapons), createHashMap]) getOrDefault [_weapon, createHashMap]) // return
diff --git a/addons/safemode/functions/fnc_lockSafety.sqf b/addons/safemode/functions/fnc_lockSafety.sqf
index 6c617c18989..28adb42df91 100644
--- a/addons/safemode/functions/fnc_lockSafety.sqf
+++ b/addons/safemode/functions/fnc_lockSafety.sqf
@@ -1,13 +1,13 @@
#include "..\script_component.hpp"
/*
- * Author: commy2
- * Put weapon on safety, or take it off safety if safety is already put on.
+ * Author: commy2, johnb43
+ * Puts weapon on safety, or take it off safety if safety is already put on.
*
* Arguments:
* 0: Unit
* 1: Weapon
* 2: Muzzle
- * 3: Show hint
+ * 3: Show hint (default: true)
*
* Return Value:
* None
@@ -18,67 +18,74 @@
* Public: No
*/
-params ["_unit", "_weapon", "_muzzle", ["_hint", true, [true]]];
+params ["_unit", "_weapon", "_muzzle", ["_hint", true]];
-private _safedWeapons = _unit getVariable [QGVAR(safedWeapons), []];
+private _safedWeapons = _unit getVariable QGVAR(safedWeapons);
-if (_weapon in _safedWeapons) exitWith {
- _this call FUNC(unlockSafety);
+if (isNil "_safedWeapons") then {
+ _safedWeapons = createHashMap;
+
+ _unit setVariable [QGVAR(safedWeapons), _safedWeapons];
+};
+
+// See if the current weapon has locked muzzles
+private _safedWeaponMuzzles = _safedWeapons getOrDefault [_weapon, createHashMap, true];
+
+// If muzzle is locked, unlock it (toggle)
+if (_muzzle in _safedWeaponMuzzles) exitWith {
+ [_unit, _weapon, _muzzle, _hint] call FUNC(unlockSafety);
};
-_safedWeapons pushBack _weapon;
+private _firemode = (_unit weaponState _muzzle) select 2;
-_unit setVariable [QGVAR(safedWeapons), _safedWeapons];
+// This syntax of selectWeapon doesn't mess with gun lights and lasers
+_unit selectWeapon [_weapon, _muzzle, _firemode];
-if (_unit getVariable [QGVAR(actionID), -1] == -1) then {
+// Store new muzzle & firemode
+_safedWeaponMuzzles set [_muzzle, _firemode];
+
+// Lock muzzle
+if (isNil {_unit getVariable QGVAR(actionID)}) then {
_unit setVariable [QGVAR(actionID), [
_unit, "DefaultAction", {
+ params ["", "_unit"];
+
if (
- [_this select 1] call CBA_fnc_canUseWeapon
- && {
- if (currentMuzzle (_this select 1) in ((_this select 1) getVariable [QGVAR(safedWeapons), []])) then {
- if (inputAction "nextWeapon" > 0) exitWith {
- [_this select 1, currentWeapon (_this select 1), currentMuzzle (_this select 1)] call FUNC(unlockSafety);
+ _unit call CBA_fnc_canUseWeapon && {
+ (weaponState _unit) params ["_currentWeapon", "_currentMuzzle"];
+
+ // Block firing the muzzle in safe mode
+ if (_currentMuzzle in ((_unit getVariable [QGVAR(safedWeapons), createHashMap]) getOrDefault [_currentWeapon, createHashMap])) then {
+ if (inputAction "nextWeapon" > 0 || {inputAction "prevWeapon" > 0}) exitWith {
+ [_unit, _currentWeapon, _currentMuzzle] call FUNC(unlockSafety);
+
false
};
+
true
- } else {false}
+ } else {
+ false
+ }
}
) then {
- // player hud
- [false] call FUNC(setSafeModeVisual);
+ // Player HUD
+ false call FUNC(setSafeModeVisual);
+
true
} else {
- // player hud
- [true] call FUNC(setSafeModeVisual);
+ // Player HUD
+ true call FUNC(setSafeModeVisual);
+
false
};
}, {}
] call EFUNC(common,addActionEventHandler)];
};
-if (_muzzle isEqualType "") then {
- private _laserEnabled = _unit isIRLaserOn _weapon || {_unit isFlashlightOn _weapon};
-
- _unit selectWeapon _muzzle;
-
- if (
- _laserEnabled
- && {
- _muzzle == primaryWeapon _unit // prevent UGL switch
- || {"" == primaryWeapon _unit} // Arma switches to primary weapon if exists
- }
- ) then {
- {_unit action [_x, _unit]} forEach ["GunLightOn", "IRLaserOn"];
- };
-};
-
-// play fire mode selector sound
+// Play fire mode selector sound
[_unit, _weapon, _muzzle] call FUNC(playChangeFiremodeSound);
-// show info box unless disabled
+// Show info box unless disabled
if (_hint) then {
- private _picture = getText (configFile >> "CfgWeapons" >> _weapon >> "picture");
- [localize LSTRING(PutOnSafety), _picture] call EFUNC(common,displayTextPicture);
+ [LLSTRING(PutOnSafety), getText (configFile >> "CfgWeapons" >> _weapon >> "picture")] call EFUNC(common,displayTextPicture);
};
-
diff --git a/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf b/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf
index 257e5864f6b..1edc2363340 100644
--- a/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf
+++ b/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf
@@ -1,7 +1,7 @@
#include "..\script_component.hpp"
/*
* Author: commy2
- * Play weapon firemode change sound.
+ * Plays weapon firemode change sound.
*
* Arguments:
* 0: Unit
@@ -21,21 +21,23 @@ params ["_unit", "_weapon"];
private _sound = getArray (configFile >> "CfgWeapons" >> _weapon >> "changeFiremodeSound");
if (_sound isEqualTo []) exitWith {
- playSound "ACE_Sound_Click";
+ playSoundUI ["ACE_Sound_Click"];
};
-// get position where to play the sound (position of the weapon)
-private _position = _unit modelToWorldVisualWorld (_unit selectionPosition "RightHand");
-
-_sound params ["_filename", ["_volume", 1], ["_soundPitch", 1], ["_distance", 0]];
+_sound params [["_filename", ""], ["_volume", 1], ["_soundPitch", 1], ["_distance", 0]];
if (_filename == "") exitWith {
- playSound "ACE_Sound_Click";
+ playSoundUI ["ACE_Sound_Click"];
};
-// add file extension .wss as default
+// Add file extension .wss as default
if !(toLowerANSI (_filename select [count _filename - 4]) in [".wav", ".ogg", ".wss"]) then {
_filename = format ["%1.wss", _filename];
};
-playSound3D [_filename, objNull, false, _position, _volume, _soundPitch, _distance];
+// Get position where to play the sound (position of the weapon)
+private _position = _unit modelToWorldVisualWorld (_unit selectionPosition "RightHand");
+
+playSound3D [_filename, objNull, insideBuilding _unit >= 0.5, _position, _volume, _soundPitch, _distance];
+
+nil // return
diff --git a/addons/safemode/functions/fnc_setSafeModeVisual.sqf b/addons/safemode/functions/fnc_setSafeModeVisual.sqf
index d62a542b9d7..12b7f864ef3 100644
--- a/addons/safemode/functions/fnc_setSafeModeVisual.sqf
+++ b/addons/safemode/functions/fnc_setSafeModeVisual.sqf
@@ -1,7 +1,7 @@
#include "..\script_component.hpp"
/*
* Author: commy2
- * Show firemode indicator, representing safety lock
+ * Shows firemode indicator, representing safety lock.
*
* Arguments:
* 0: Show firemode
@@ -10,7 +10,7 @@
* None
*
* Example:
- * [true] call ace_safemode_fnc_setSafeModeVisual
+ * true call ace_safemode_fnc_setSafeModeVisual
*
* Public: No
*/
@@ -27,8 +27,8 @@ if (_show) then {
private _config = configFile >> "RscInGameUI" >> "RscUnitInfoSoldier" >> "WeaponInfoControlsGroupLeft" >> "controls" >> "CA_ModeTexture";
_control ctrlSetPosition [getNumber (_config >> "x"), getNumber (_config >> "y"), getNumber (_config >> "w"), getNumber (_config >> "h")];
- _control ctrlCommit 0;
} else {
_control ctrlSetPosition [0, 0, 0, 0];
- _control ctrlCommit 0;
};
+
+_control ctrlCommit 0;
diff --git a/addons/safemode/functions/fnc_setWeaponSafety.sqf b/addons/safemode/functions/fnc_setWeaponSafety.sqf
index d80e1d8c38f..3db0033bf8f 100644
--- a/addons/safemode/functions/fnc_setWeaponSafety.sqf
+++ b/addons/safemode/functions/fnc_setWeaponSafety.sqf
@@ -1,13 +1,14 @@
#include "..\script_component.hpp"
/*
- * Author: Brostrom.A
- * Safe or unsafe the given weapon based on weapon state; locked or unlocked.
+ * Author: Brostrom.A, johnb43
+ * Lock or unlock the given weapon based on weapon state.
*
* Arguments:
* 0: Unit
* 1: Weapon
* 2: State
* 3: Show hint (default: true)
+ * 4: Muzzle (default: current muzzle of weapon)
*
* Return Value:
* None
@@ -22,17 +23,31 @@ params [
["_unit", objNull, [objNull]],
["_weapon", "", [""]],
["_state", true, [true]],
- ["_hint", true, [true]]
+ ["_hint", true, [true]],
+ ["_muzzle", nil, [""]]
];
-if (_weapon == "") exitWith {};
+// Don't allow to set weapon safety if unit doesn't have one (but allow removing safety, in case unit doesn't have weapon anymore)
+if (_weapon == "" || {_state && {!(_unit hasWeapon _weapon)}}) exitWith {};
-private _safedWeapons = _unit getVariable [QGVAR(safedWeapons), []];
+// Check if weapon is a binocular
+if ((_weapon call EFUNC(common,getItemType)) select 1 == "binocular") exitWith {};
-_weapon = configName (configFile >> "CfgWeapons" >> _weapon);
+// Check for invalid muzzles
+_muzzle = if (isNil "_muzzle") then {
+ // Get current weapon muzzle if not defined
+ (_unit weaponState _weapon) select 1
+} else {
+ // Get config case muzzle names
+ private _muzzles = _weapon call EFUNC(common,getWeaponMuzzles);
-private _muzzle = currentMuzzle _unit;
-
-if (_state isNotEqualTo (_weapon in _safedWeapons)) then {
- [_unit, _weapon, _muzzle, _hint] call FUNC(lockSafety);
+ _muzzles param [_muzzles findIf {_x == _muzzle}, ""]
};
+
+// Weapon is not available
+if (_muzzle == "") exitWith {};
+
+// If the weapon is already in the desired state, don't do anything
+if (_state == (_muzzle in ((_unit getVariable [QGVAR(safedWeapons), createHashMap]) getOrDefault [_weapon, createHashMap]))) exitWith {};
+
+[_unit, _weapon, _muzzle, _hint] call FUNC(lockSafety);
diff --git a/addons/safemode/functions/fnc_unlockSafety.sqf b/addons/safemode/functions/fnc_unlockSafety.sqf
index 10372f1a2ef..97716025dc6 100644
--- a/addons/safemode/functions/fnc_unlockSafety.sqf
+++ b/addons/safemode/functions/fnc_unlockSafety.sqf
@@ -1,13 +1,13 @@
#include "..\script_component.hpp"
/*
- * Author: commy2
- * Take weapon of safety lock.
+ * Author: commy2, johnb43
+ * Takes the weapon safety lock off.
*
* Arguments:
* 0: Unit
* 1: Weapon
* 2: Muzzle
- * 3: Show hint
+ * 3: Show hint (default: true)
*
* Return Value:
* None
@@ -18,67 +18,37 @@
* Public: No
*/
-params ["_unit", "_weapon", "_muzzle", ["_hint", true, [true]]];
+params ["_unit", "_weapon", "_muzzle", ["_hint", true]];
-private _safedWeapons = _unit getVariable [QGVAR(safedWeapons), []];
-_safedWeapons deleteAt (_safedWeapons find _weapon);
+private _safedWeaponMuzzles = (_unit getVariable QGVAR(safedWeapons)) get _weapon;
+private _firemode = _safedWeaponMuzzles deleteAt _muzzle;
-_unit setVariable [QGVAR(safedWeapons), _safedWeapons];
+// Remove action if all weapons have removed their safeties
+if (_safedWeaponMuzzles isEqualTo createHashMap) then {
+ (_unit getVariable QGVAR(safedWeapons)) deleteAt _weapon;
-// remove action if all weapons have put their safety on
-if (_safedWeapons isEqualTo []) then {
- [_unit, "DefaultAction", _unit getVariable [QGVAR(actionID), -1]] call EFUNC(common,removeActionEventHandler);
- _unit setVariable [QGVAR(actionID), -1];
-};
-
-private _laserEnabled = _unit isIRLaserOn _weapon || {_unit isFlashlightOn _weapon};
+ private _ehID = _unit getVariable QGVAR(actionID);
-_unit selectWeapon _muzzle;
+ if (!isNil "_ehID" && {(_unit getVariable QGVAR(safedWeapons)) isEqualTo createHashMap}) then {
+ [_unit, "DefaultAction", _ehID] call EFUNC(common,removeActionEventHandler);
-if (
- _laserEnabled
- && {
- _muzzle == primaryWeapon _unit // prevent UGL switch
- || {"" == primaryWeapon _unit} // Arma switches to primary weapon if exists
- }
-) then {
- {_unit action [_x, _unit]} forEach ["GunLightOn", "IRLaserOn"];
+ _unit setVariable [QGVAR(actionID), nil];
+ };
};
-if (inputAction "nextWeapon" > 0) then {
- // switch to the last mode to roll over to first after the default nextWeapon action
- // get weapon modes
- private _modes = [];
- {
- if (getNumber (configFile >> "CfgWeapons" >> _weapon >> _x >> "showToPlayer") == 1) then {
- _modes pushBack _x;
- };
- if (_x == "this") then {
- _modes pushBack _weapon;
- };
- } forEach getArray (configFile >> "CfgWeapons" >> _weapon >> "modes");
+// Let engine handle switching to next firemode/muzzle
+if (inputAction "nextWeapon" == 0 && {inputAction "prevWeapon" == 0}) then {
+ // This syntax of selectWeapon doesn't mess with gun lights and lasers
+ _unit selectWeapon [_weapon, _muzzle, _firemode];
- // select last mode
- private _mode = _modes select (count _modes - 1);
-
- // switch to last mode
- private _index = 0;
- while {
- _index < 299 && {currentMuzzle _unit != _weapon || {currentWeaponMode _unit != _mode}}
- } do {
- _unit action ["SwitchWeapon", _unit, _unit, _index];
- _index = _index + 1;
- };
-} else {
- // play fire mode selector sound
+ // Play fire mode selector sound
[_unit, _weapon, _muzzle] call FUNC(playChangeFiremodeSound);
};
-// player hud
-[true] call FUNC(setSafeModeVisual);
+// Player HUD
+true call FUNC(setSafeModeVisual);
-// show info box unless disabled
+// Show info box unless disabled
if (_hint) then {
- private _picture = getText (configFile >> "CfgWeapons" >> _weapon >> "picture");
- [localize LSTRING(TookOffSafety), _picture] call EFUNC(common,displayTextPicture);
+ [LLSTRING(TookOffSafety), getText (configFile >> "CfgWeapons" >> _weapon >> "picture")] call EFUNC(common,displayTextPicture);
};
diff --git a/addons/sandbag/functions/fnc_deploy.sqf b/addons/sandbag/functions/fnc_deploy.sqf
index 1ef84851128..31818907489 100644
--- a/addons/sandbag/functions/fnc_deploy.sqf
+++ b/addons/sandbag/functions/fnc_deploy.sqf
@@ -18,8 +18,8 @@
params ["_unit"];
// prevent the placing unit from running
-[_unit, "forceWalk", "ACE_Sandbag", true] call EFUNC(common,statusEffect_set);
-[_unit, "blockThrow", "ACE_Sandbag", true] call EFUNC(common,statusEffect_set);
+[_unit, "forceWalk", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
+[_unit, "blockThrow", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
// create the sandbag
private _sandBag = createVehicle ["ACE_SandbagObject_NoGeo", [0, 0, 0], [], 0, "NONE"];
diff --git a/addons/sandbag/functions/fnc_deployCancel.sqf b/addons/sandbag/functions/fnc_deployCancel.sqf
index aa2c2419a39..bccae637e5e 100644
--- a/addons/sandbag/functions/fnc_deployCancel.sqf
+++ b/addons/sandbag/functions/fnc_deployCancel.sqf
@@ -21,8 +21,8 @@ params ["_unit", "_key"];
if (_key != 1 || {GVAR(deployPFH) == -1}) exitWith {};
// enable running again
-[_unit, "forceWalk", "ACE_Sandbag", false] call EFUNC(common,statusEffect_set);
-[_unit, "blockThrow", "ACE_Sandbag", false] call EFUNC(common,statusEffect_set);
+[_unit, "forceWalk", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
+[_unit, "blockThrow", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
// delete placement dummy
deleteVehicle GVAR(sandBag);
diff --git a/addons/sandbag/functions/fnc_deployConfirm.sqf b/addons/sandbag/functions/fnc_deployConfirm.sqf
index 20b821b3b53..ef2aafd97c7 100644
--- a/addons/sandbag/functions/fnc_deployConfirm.sqf
+++ b/addons/sandbag/functions/fnc_deployConfirm.sqf
@@ -18,8 +18,8 @@
params ["_unit"];
// enable running again
-[_unit, "forceWalk", "ACE_Sandbag", false] call EFUNC(common,statusEffect_set);
-[_unit, "blockThrow", "ACE_Sandbag", false] call EFUNC(common,statusEffect_set);
+[_unit, "forceWalk", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
+[_unit, "blockThrow", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
// remove sandbag from inventory
_unit removeItem "ACE_Sandbag_empty";
diff --git a/addons/sandbag/functions/fnc_pickup.sqf b/addons/sandbag/functions/fnc_pickup.sqf
index 2bcc418f4ca..07a6285e685 100644
--- a/addons/sandbag/functions/fnc_pickup.sqf
+++ b/addons/sandbag/functions/fnc_pickup.sqf
@@ -29,7 +29,7 @@ _unit setVariable [QGVAR(isUsingSandbag), true];
if (isNull _sandbag) exitWith {};
- deletevehicle _sandbag;
+ deleteVehicle _sandbag;
// Force physx update
{
diff --git a/addons/scopes/RscTitles.hpp b/addons/scopes/RscTitles.hpp
index c108caaf4d8..5b3002599ea 100644
--- a/addons/scopes/RscTitles.hpp
+++ b/addons/scopes/RscTitles.hpp
@@ -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/functions/fnc_applyScopeAdjustment.sqf b/addons/scopes/functions/fnc_applyScopeAdjustment.sqf
index b813dde9ef8..d356343099d 100644
--- a/addons/scopes/functions/fnc_applyScopeAdjustment.sqf
+++ b/addons/scopes/functions/fnc_applyScopeAdjustment.sqf
@@ -43,6 +43,10 @@ if (cameraView == "GUNNER") then {
_yaw = _yaw + _windageDifference;
[_unit, _pitch, _bank, _yaw] call EFUNC(common,setPitchBankYaw);
};
+
+ if (GVAR(inScopeAdjustment)) then {
+ [] call FUNC(showZeroing);
+ };
} else {
[] call FUNC(showZeroing);
};
diff --git a/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf b/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf
index ab84db7cde1..670a119f839 100644
--- a/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf
+++ b/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf
@@ -36,25 +36,21 @@ if (_initSpeedCoef < 0) then {
_initSpeed = _initSpeed * (-1 * _initSpeedCoef);
};
-private _zeroAngle = "ace_advanced_ballistics" callExtension format ["replicateVanillaZero:%1:%2:%3", _oldZeroRange, _initSpeed, _airFriction];
-private _vanillaZero = parseNumber _zeroAngle;
+private _vanillaZero = parseNumber (("ace" callExtension ["ballistics:replicate_vanilla_zero", [_oldZeroRange, _initSpeed, _airFriction]]) select 0);
#ifdef DISABLE_DISPERSION
_vanillaZero = 0;
#endif
-private _trueZero = if (!_advancedBallistics) then {
- _zeroAngle = "ace_advanced_ballistics" callExtension format ["calcZero:%1:%2:%3:%4", _newZeroRange, _initSpeed, _airFriction, _boreHeight];
- (parseNumber _zeroAngle)
-} else {
+private _trueZero = if (_advancedBallistics) then {
// Get Weapon and Ammo Configurations
private _AmmoCacheEntry = uiNamespace getVariable format[QEGVAR(advanced_ballistics,%1), _ammo];
if (isNil "_AmmoCacheEntry") then {
- _AmmoCacheEntry = _ammo call EFUNC(advanced_ballistics,readAmmoDataFromConfig);
+ _AmmoCacheEntry = _ammo call EFUNC(advanced_ballistics,readAmmoDataFromConfig);
};
private _WeaponCacheEntry = uiNamespace getVariable format[QEGVAR(advanced_ballistics,%1), _weapon];
if (isNil "_WeaponCacheEntry") then {
- _WeaponCacheEntry = _weapon call EFUNC(advanced_ballistics,readWeaponDataFromConfig);
+ _WeaponCacheEntry = _weapon call EFUNC(advanced_ballistics,readWeaponDataFromConfig);
};
_AmmoCacheEntry params ["_airFriction", "_caliber", "_bulletLength", "_bulletMass", "_transonicStabilityCoef", "_dragModel", "_ballisticCoefficients", "_velocityBoundaries", "_atmosphereModel", "_ammoTempMuzzleVelocityShifts", "_muzzleVelocityTable", "_barrelLengthTable", "_muzzleVelocityVariationSD"];
@@ -70,8 +66,21 @@ private _trueZero = if (!_advancedBallistics) then {
_initSpeed = _initSpeed + _ammoTemperatureVelocityShift;
};
- _zeroAngle = "ace_advanced_ballistics" callExtension format ["calcZeroAB:%1:%2:%3:%4:%5:%6:%7:%8:%9", _newZeroRange, _initSpeed, _boreHeight, GVAR(zeroReferenceTemperature), GVAR(zeroReferenceBarometricPressure), GVAR(zeroReferenceHumidity), _ballisticCoefficients select 0, _dragModel, _atmosphereModel];
- (parseNumber _zeroAngle)
+ parseNumber (
+ ("ace" callExtension ["ballistics:zero_advanced", [
+ _newZeroRange,
+ _initSpeed,
+ _boreHeight,
+ GVAR(zeroReferenceTemperature),
+ GVAR(zeroReferenceBarometricPressure),
+ GVAR(zeroReferenceHumidity),
+ _ballisticCoefficients select 0,
+ _dragModel,
+ _atmosphereModel
+ ]]) select 0
+ )
+} else {
+ parseNumber (("ace" callExtension ["ballistics:zero_vanilla", [_newZeroRange, _initSpeed, _airFriction, _boreHeight]]) select 0)
};
private _zeroAngleCorrection = _trueZero - _vanillaZero;
diff --git a/addons/scopes/initSettings.inc.sqf b/addons/scopes/initSettings.inc.sqf
index 40ed62cbcc2..e74bcb4c073 100644
--- a/addons/scopes/initSettings.inc.sqf
+++ b/addons/scopes/initSettings.inc.sqf
@@ -76,18 +76,26 @@ private _category = format ["ACE %1", localize LSTRING(DisplayName)];
true // Needs mission restart
] call CBA_fnc_addSetting;
+[
+ QGVAR(simplifiedZeroing), "CHECKBOX",
+ [LSTRING(simplifiedZeroing_displayName), LSTRING(simplifiedZeroing_description)],
+ _category,
+ false,
+ 1
+] call CBA_fnc_addSetting;
+
[
QGVAR(useLegacyUI), "CHECKBOX",
[LSTRING(useLegacyUI_displayName), LSTRING(useLegacyUI_description)],
_category,
false,
- 0
+ 2
] call CBA_fnc_addSetting;
[
- QGVAR(simplifiedZeroing), "CHECKBOX",
- [LSTRING(simplifiedZeroing_displayName), LSTRING(simplifiedZeroing_description)],
+ QGVAR(inScopeAdjustment), "CHECKBOX",
+ LSTRING(inScopeAdjustment_displayName),
_category,
false,
- 1
+ 0
] call CBA_fnc_addSetting;
diff --git a/addons/scopes/stringtable.xml b/addons/scopes/stringtable.xml
index 9a47f657cc0..f04e5d767ef 100644
--- a/addons/scopes/stringtable.xml
+++ b/addons/scopes/stringtable.xml
@@ -21,7 +21,7 @@
Enable ACE Scope adjustment
Aktiviere das Nullen von Zielfernrohren
ACE スコープ調節を有効化
- ACE 조준경 영점조작 활성화
+ ACE 조준경 영점조절 활성화
Włącz ustawienia celowników optycznych ACE
Activer le réglage ACE des lunettes
Abilita Regolazione Mirino ACE
@@ -337,7 +337,7 @@
Repliziert das Vanilla-Zeroing-System für Zielfernrohre.
バニラ(ゲーム標準)のライフルスコープ用ゼロイン調整システムを再現します。
Replica il sistema di azzeramento vanilla per le ottiche.
- 라이플 스코프용 바닐라 영점조정 시스템을 복제합니다.
+ 라이플 스코프용 바닐라 영점조절 시스템을 복제합니다.
使用原版的歸零系統來取代ACE複雜的歸零模擬。
使用原版的归零系统来取代 ACE 复杂的归零模拟。
Replikuje system zerowania, dla celowników karabinowych, z domyślnej gry.
@@ -347,6 +347,14 @@
Replikuje systém naměřování puškohledů ze základní hry.
Replica en los visores el sistema de homogeneizado de vanilla
+
+ Show adjustment UI in scope
+ Zeige Absehenverstellungs-UI im Zielfernrohr
+ Mostra UI delle manopole nel mirino
+ 調整UIをスコープ内に表示
+ 스코프에 조절 UI 보이기
+ Показать интерфейс настройки в области видимости.
+
Minor adjustment up
Kleine Korrektur hoch
@@ -496,7 +504,7 @@
Nullung zurücksetzen
ゼロイン調節を初期化
Resetta l'azzeramento
- 영점 조정 재설정
+ 영점 조절 재설정
重設歸零
重设归零
Zresetuj wyzerowanie
diff --git a/addons/sitting/functions/fnc_canSit.sqf b/addons/sitting/functions/fnc_canSit.sqf
index 4328234bd90..609bcea6828 100644
--- a/addons/sitting/functions/fnc_canSit.sqf
+++ b/addons/sitting/functions/fnc_canSit.sqf
@@ -21,6 +21,7 @@ params ["_seat", "_player", ["_seatPos", 0]];
// Sitting enabled, not occupied and standing up (or not on a big slope)
XGVAR(enable) &&
+{[_player, _seat] call EFUNC(common,canInteractWith)} &&
{isNil {_player getVariable QGVAR(sittingStatus)}} &&
{
private _seatsClaimed = _seat getVariable [QGVAR(seatsClaimed), []];
diff --git a/addons/sitting/functions/fnc_sit.sqf b/addons/sitting/functions/fnc_sit.sqf
index 033a1f4d2ca..d359083c44a 100644
--- a/addons/sitting/functions/fnc_sit.sqf
+++ b/addons/sitting/functions/fnc_sit.sqf
@@ -56,7 +56,7 @@ TRACE_2("Sit pos and dir",_sitPosition,_sitDirection);
// Set direction and position
_player setDir _sitDirection;
//modelToWorld returns AGL
-_player setPosASL (AGLtoASL (_seat modelToWorld _sitPosition));
+_player setPosASL (AGLToASL (_seat modelToWorld _sitPosition));
// Set variables, save seat object on player
_player setVariable [QGVAR(sittingStatus), [_seat, _actionID, _seatPos]];
diff --git a/addons/smallarms/stringtable.xml b/addons/smallarms/stringtable.xml
index 0b89a38b0d0..f15f1b8c841 100644
--- a/addons/smallarms/stringtable.xml
+++ b/addons/smallarms/stringtable.xml
@@ -12,7 +12,7 @@
17-Schuss-9mm-Magazin
9 mm, 17ks zásobník
Carregador 17Mun. 9 mm
- 9mm 17발 탄창
+ 9mm 17발 들이 탄창
9 mm 17发 弹匣
9mm 17Rnd マガジン
9 mm 17 Merm. Şarjör
@@ -29,7 +29,8 @@
.45 ACP 25 Merm. Şarjör
.45 ACP 25Rnd マガジン
.45 ACP 25发 弹匣
- .45 ACP 25발 탄창
+ .45 ACP 25발 들이 탄창
+ Carregador 25Mun. .45 ACP
.45 ACP 25Rnd Tracers (Green) Mag
@@ -43,7 +44,8 @@
.45 ACP 25 Merm. İzli (Yeşil) Şarjör
.45 ACP 25Rnd トレーサー (緑) マガジン
.45 ACP 25发 弹匣(曳光,绿)
- .45 ACP 25발 예광탄 (초록) 탄창
+ .45 ACP 25발 들이 탄창 (녹색 예광탄)
+ Carregador 25Mun. .45 ACP Traçante (Verde)
.45 ACP 25Rnd Tracers (Red) Mag
@@ -57,7 +59,8 @@
.45 ACP 25 Merm. İzli (Kırmızı) Şarjör
.45 ACP 25Rnd トレーサー (赤) マガジン
.45 ACP 25发 弹匣(曳光,红)
- .45 ACP 25발 예광탄 (빨강) 탄창
+ .45 ACP 25발 들이 탄창 (적색 예광탄)
+ Carregador 25Mun. .45 ACP Traçante (Vermelha)
.45 ACP 25Rnd Tracers (Yellow) Mag
@@ -71,7 +74,8 @@
.45 ACP 25 Merm. İzli (Sarı) Şarjör
.45 ACP 25Rnd トレーサー (黄) マガジン
.45 ACP 25发 弹匣(曳光,黄)
- .45 ACP 25발 예광탄 (노랑) 탄창
+ .45 ACP 25발 들이 탄창 (황색 예광탄)
+ Carregador 25Mun. .45 ACP Traçante (Amarela)
.45 ACP 8Rnd Mag
@@ -85,7 +89,8 @@
.45 ACP 8 Merm. Şarjör
.45 ACP 8Rnd マガジン
.45 ACP 8发 弹匣
- .45 ACP 8발 탄창
+ .45 ACP 8발 들이 탄창
+ Carregador 8Mun. .45 ACP
.45 ACP 15Rnd Mag
@@ -99,7 +104,8 @@
.45 ACP 15 Merm. Şarjör
.45 ACP 15Rnd マガジン
.45 ACP 15发 弹匣
- .45 ACP 15발 탄창
+ .45 ACP 15발 들이 탄창
+ Carregador 15Mun. .45 ACP
diff --git a/addons/spectator/functions/fnc_cam_setVisionMode.sqf b/addons/spectator/functions/fnc_cam_setVisionMode.sqf
index 5bcf8710b6b..eaec12a86d3 100644
--- a/addons/spectator/functions/fnc_cam_setVisionMode.sqf
+++ b/addons/spectator/functions/fnc_cam_setVisionMode.sqf
@@ -29,10 +29,10 @@ if !(_newVision in _visions) then {
if (GVAR(camMode) != MODE_FPS) then {
// 0+ are all thermal vision types
if (_newVision < 0) then {
- false setCamUseTi 0;
+ false setCamUseTI 0;
camUseNVG (_newVision >= VISION_NVG);
} else {
- true setCamUseTi _newVision;
+ true setCamUseTI _newVision;
};
// Give user feedback that vision mode changed
diff --git a/addons/spectator/functions/fnc_cam_tick.sqf b/addons/spectator/functions/fnc_cam_tick.sqf
index 1e7e1b99137..11f257b7d5a 100644
--- a/addons/spectator/functions/fnc_cam_tick.sqf
+++ b/addons/spectator/functions/fnc_cam_tick.sqf
@@ -58,7 +58,9 @@ if (_cameraMode != MODE_FREE) then {
_camTarget = GVAR(camFocus);
// Focus get in / out of vehicle state
-if !(isNull _camTarget) then {
+if (isNull _camTarget) then {
+ GVAR(camTargetInVehicle) = false;
+} else {
private _targetInVeh = GVAR(camTargetInVehicle);
if (GVAR(camHasTarget)) then {
@@ -72,8 +74,6 @@ if !(isNull _camTarget) then {
GVAR(camTargetInVehicle) = false;
};
};
-} else {
- GVAR(camTargetInVehicle) = false;
};
// Camera lights
diff --git a/addons/spectator/functions/fnc_handleFired.sqf b/addons/spectator/functions/fnc_handleFired.sqf
index f8683af947e..9817452386e 100644
--- a/addons/spectator/functions/fnc_handleFired.sqf
+++ b/addons/spectator/functions/fnc_handleFired.sqf
@@ -27,7 +27,7 @@ params [
// Remove the EH when spectator is no longer active or unit is removed
if (isNil QGVAR(entitiesToDraw) || {!(_unit in GVAR(entitiesToDraw))}) exitWith {
- //USES_VARIABLES ["_thisEventHandler"]
+ //IGNORE_PRIVATE_WARNING ["_thisEventHandler"];
_unit removeEventHandler ["Fired", _thisEventHandler];
SETVAR(_unit,GVAR(firedEH),nil);
};
diff --git a/addons/spectator/functions/fnc_setCameraAttributes.sqf b/addons/spectator/functions/fnc_setCameraAttributes.sqf
index f33f23c09a4..48cc4fb0c58 100644
--- a/addons/spectator/functions/fnc_setCameraAttributes.sqf
+++ b/addons/spectator/functions/fnc_setCameraAttributes.sqf
@@ -88,7 +88,7 @@ if (!isNil QGVAR(camera)) then {
// GVARs exits purely for pre-setting of these attributes
if (!isNil "_position") then {
- GVAR(camPos) = ATLtoASL _position;
+ GVAR(camPos) = ATLToASL _position;
};
if (!isNil "_direction") then {
diff --git a/addons/spectator/functions/fnc_ui_handleKeyDown.sqf b/addons/spectator/functions/fnc_ui_handleKeyDown.sqf
index c26a06786d7..59dd418782a 100644
--- a/addons/spectator/functions/fnc_ui_handleKeyDown.sqf
+++ b/addons/spectator/functions/fnc_ui_handleKeyDown.sqf
@@ -108,13 +108,13 @@ if (_key == DIK_L) exitWith {
{ deleteVehicle _x; } forEach GVAR(camLights);
GVAR(camLights) = [];
} else {
- private _cameraLight = "#lightpoint" createvehicleLocal getPosASL GVAR(camera);
+ private _cameraLight = "#lightpoint" createVehicleLocal getPosASL GVAR(camera);
_cameraLight setLightBrightness 2;
_cameraLight setLightAmbient [1,1,1];
_cameraLight setLightColor [0,0,0];
_cameraLight lightAttachObject [GVAR(camera), [0,0,0]];
- private _pointerLight = "#lightpoint" createvehicleLocal getPosASL GVAR(camera);
+ private _pointerLight = "#lightpoint" createVehicleLocal getPosASL GVAR(camera);
_pointerLight setLightBrightness 1;
_pointerLight setLightAmbient [1,1,1];
_pointerLight setLightColor [0,0,0];
diff --git a/addons/spectator/functions/fnc_ui_handleListClick.sqf b/addons/spectator/functions/fnc_ui_handleListClick.sqf
index 600b7e711ce..f81a73f4fd1 100644
--- a/addons/spectator/functions/fnc_ui_handleListClick.sqf
+++ b/addons/spectator/functions/fnc_ui_handleListClick.sqf
@@ -33,7 +33,7 @@ if !(isNull _object) then {
if (_dblClick) then {
// Place camera within ~10m of the object and above ground level
private _pos = getPosASLVisual _object;
- GVAR(camera) setPosASL (AGLtoASL (_pos getPos [1 + random 10, random 360]) vectorAdd [0,0,2 + random 10]);
+ GVAR(camera) setPosASL (AGLToASL (_pos getPos [1 + random 10, random 360]) vectorAdd [0,0,2 + random 10]);
// Reset the focus
[objNull] call FUNC(setFocus);
diff --git a/addons/spectator/functions/fnc_ui_updateHelp.sqf b/addons/spectator/functions/fnc_ui_updateHelp.sqf
index 1ddbbacad91..4a226bf3613 100644
--- a/addons/spectator/functions/fnc_ui_updateHelp.sqf
+++ b/addons/spectator/functions/fnc_ui_updateHelp.sqf
@@ -31,7 +31,7 @@ private _controls = [];
// When not in first person, camera rotation applies
if (_cameraMode != MODE_FPS) then {
- _controls pushback ["[RMB]", localize "STR_A3_Spectator_Helper_CameraRotation"];
+ _controls pushBack ["[RMB]", localize "STR_A3_Spectator_Helper_CameraRotation"];
};
// When in free camera, focus/un-focus with LMB
@@ -52,31 +52,31 @@ if (_hasTarget && {count _availableModes > 1}) then {
};
if (_cameraMode == MODE_FREE) then {
- _controls pushback [
+ _controls pushBack [
format ["[%1/%2]", [DIK_W] call CBA_fnc_localizeKey, [DIK_S] call CBA_fnc_localizeKey],
localize "STR_A3_Spectator_Helper_Movement"
];
- _controls pushback [
+ _controls pushBack [
format ["[%1/%2]", [DIK_A] call CBA_fnc_localizeKey, [DIK_D] call CBA_fnc_localizeKey],
localize "STR_A3_Spectator_Helper_Strafing"
];
- _controls pushback [
+ _controls pushBack [
format ["[%1/%2]", [DIK_Q] call CBA_fnc_localizeKey, [DIK_Z] call CBA_fnc_localizeKey],
localize "STR_A3_Spectator_Helper_Height"
];
} else {
- _controls pushback [
+ _controls pushBack [
format ["[%1]", toUpper ([DIK_RIGHT] call CBA_fnc_localizeKey)],
localize LSTRING(nextUnit)
];
- _controls pushback [
+ _controls pushBack [
format ["[%1]", toUpper ([DIK_LEFT] call CBA_fnc_localizeKey)],
localize LSTRING(prevUnit)
];
};
if (_cameraMode != MODE_FPS) then {
- _controls pushback [
+ _controls pushBack [
format ["[%1]", ([DIK_N] call CBA_fnc_localizeKey)],
localize LSTRING(nextVis)
];
@@ -128,7 +128,7 @@ lnbClear _help;
// Set height based on number of rows
private _newH = (GVAR(uiHelpH) / MAX_CONTROLS_HELP_ENTRIES) * count _controls;
-private _newY = safezoneY + safezoneH - _newH;
+private _newY = safeZoneY + safeZoneH - _newH;
(ctrlPosition _help) params ["_newX","","_newW"];
diff --git a/addons/spectator/functions/fnc_ui_updateIconsToDraw.sqf b/addons/spectator/functions/fnc_ui_updateIconsToDraw.sqf
index 6093467d639..e5a736a7754 100644
--- a/addons/spectator/functions/fnc_ui_updateIconsToDraw.sqf
+++ b/addons/spectator/functions/fnc_ui_updateIconsToDraw.sqf
@@ -89,7 +89,7 @@ private _camPos = AGLToASL positionCameraToWorld [0,0,0];
0,
_heightByDistance,
0,
- groupID _group,
+ groupId _group,
2,
_fontSizeByDistance,
"PuristaMedium",
diff --git a/addons/spectator/functions/fnc_ui_updateListEntities.sqf b/addons/spectator/functions/fnc_ui_updateListEntities.sqf
index 000f9a4b226..969460329c9 100644
--- a/addons/spectator/functions/fnc_ui_updateListEntities.sqf
+++ b/addons/spectator/functions/fnc_ui_updateListEntities.sqf
@@ -54,7 +54,7 @@ private _entities = [true] call FUNC(getTargetEntities);
// Cache the info of the group itself
private _groupTexture = [_group] call FUNC(getGroupIcon);
- private _groupInfo = [_group, str _group, _groupTexture, groupID _group];
+ private _groupInfo = [_group, str _group, _groupTexture, groupId _group];
// Add the group to the correct side
private _side = side _group;
diff --git a/addons/spectator/script_component.hpp b/addons/spectator/script_component.hpp
index b4e7c82ac88..c29c60bdefc 100644
--- a/addons/spectator/script_component.hpp
+++ b/addons/spectator/script_component.hpp
@@ -17,12 +17,12 @@
#include "\z\ace\addons\main\script_macros.hpp"
// UI grid
-#define SIZEX ((safezoneW / safezoneH) min 1.2)
+#define SIZEX ((safeZoneW / safeZoneH) min 1.2)
#define SIZEY (SIZEX / 1.2)
#define W_PART(num) (num * (SIZEX / 40))
#define H_PART(num) (num * (SIZEY / 25))
-#define X_PART(num) (W_PART(num) + (safezoneX + (safezoneW - SIZEX)/2))
-#define Y_PART(num) (H_PART(num) + (safezoneY + (safezoneH - SIZEY)/2))
+#define X_PART(num) (W_PART(num) + (safeZoneX + (safeZoneW - SIZEX)/2))
+#define Y_PART(num) (H_PART(num) + (safeZoneY + (safeZoneH - SIZEY)/2))
// UI/Camera related values
#define SPEED_SLOW 0.1
diff --git a/addons/spectator/ui.hpp b/addons/spectator/ui.hpp
index f61e7749eea..d81887db760 100644
--- a/addons/spectator/ui.hpp
+++ b/addons/spectator/ui.hpp
@@ -82,7 +82,7 @@ class GVAR(display) {
onMouseExit = QUOTE([true] call FUNC(ui_fadeList));
x = "safeZoneX";
- y = "safezoneY";
+ y = "safeZoneY";
w = QUOTE(W_PART(13.5));
h = QUOTE(H_PART(1.5));
@@ -98,7 +98,7 @@ class GVAR(display) {
class CameraTypesGroup: RscControlsGroupNoScrollbars {
idc = IDC_CAM_TYPES;
x = QUOTE(X_PART(15.5));
- y = QUOTE(safezoneY + safezoneH - H_PART(2.38));
+ y = QUOTE(safeZoneY + safeZoneH - H_PART(2.38));
w = QUOTE(W_PART(8.6));
h = 2.6;
class controls {
@@ -245,8 +245,8 @@ class GVAR(display) {
};
class HelpBackground: RscText {
idc = IDC_HELP_BACK;
- x = QUOTE(safezoneX + safezoneW - W_PART(12));
- y = QUOTE(safezoneY + safezoneH - 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};
@@ -256,8 +256,8 @@ class GVAR(display) {
disableOverflow = 0;
rowHeight = QUOTE(H_PART(1));
idc = IDC_HELP;
- x = QUOTE(safezoneX + safezoneW - W_PART(12));
- y = QUOTE(safezoneY + safezoneH - 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));
};
diff --git a/addons/spottingscope/script_component.hpp b/addons/spottingscope/script_component.hpp
index 6b2d95abbd5..cf7b8a835f7 100644
--- a/addons/spottingscope/script_component.hpp
+++ b/addons/spottingscope/script_component.hpp
@@ -16,8 +16,8 @@
#include "\z\ace\addons\main\script_macros.hpp"
-#define POS_X_BASE(size) safezoneX + 0.5 * safezoneW - 0.5 * (size) / (getResolution select 5)
-#define POS_Y_BASE(size) safezoneY + 0.5 * safezoneH - 0.5 * (size) / (getResolution select 5) * 4/3
+#define POS_X_BASE(size) safeZoneX + 0.5 * safeZoneW - 0.5 * (size) / (getResolution select 5)
+#define POS_Y_BASE(size) safeZoneY + 0.5 * safeZoneH - 0.5 * (size) / (getResolution select 5) * 4/3
#define POS_W_BASE(size) (size) / (getResolution select 5)
#define POS_H_BASE(size) (size) / (getResolution select 5) * 4/3
diff --git a/addons/switchunits/functions/fnc_initPlayer.sqf b/addons/switchunits/functions/fnc_initPlayer.sqf
index ffc0f7ad630..ba9c3f77b30 100644
--- a/addons/switchunits/functions/fnc_initPlayer.sqf
+++ b/addons/switchunits/functions/fnc_initPlayer.sqf
@@ -36,7 +36,7 @@ if (vehicle _playerUnit == _playerUnit) then {
removeAllContainers _playerUnit;
_playerUnit linkItem "ItemMap";
- [_playerUnit, "forceWalk", "ACE_SwitchUnits", true] call EFUNC(common,statusEffect_set);
+ [_playerUnit, "forceWalk", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
[] call FUNC(addMapFunction);
};
diff --git a/addons/tacticalladder/functions/fnc_cancelTLdeploy.sqf b/addons/tacticalladder/functions/fnc_cancelTLdeploy.sqf
index 7c05cbbe63b..24013f02d74 100644
--- a/addons/tacticalladder/functions/fnc_cancelTLdeploy.sqf
+++ b/addons/tacticalladder/functions/fnc_cancelTLdeploy.sqf
@@ -23,8 +23,8 @@ params ["_unit", "_key"];
if (_key != 1 || {isNull GVAR(ladder)}) exitWith {};
// enable running again
-[_unit, "forceWalk", "ACE_Ladder", false] call EFUNC(common,statusEffect_set);
-[_unit, "blockThrow", "ACE_Ladder", false] call EFUNC(common,statusEffect_set);
+[_unit, "forceWalk", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
+[_unit, "blockThrow", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
detach GVAR(ladder);
diff --git a/addons/tacticalladder/functions/fnc_confirmTLdeploy.sqf b/addons/tacticalladder/functions/fnc_confirmTLdeploy.sqf
index 9fe13e4e658..8211dc5f9d0 100644
--- a/addons/tacticalladder/functions/fnc_confirmTLdeploy.sqf
+++ b/addons/tacticalladder/functions/fnc_confirmTLdeploy.sqf
@@ -19,8 +19,8 @@
params ["_unit", "_ladder"];
// enable running again
-[_unit, "forceWalk", "ACE_Ladder", false] call EFUNC(common,statusEffect_set);
-[_unit, "blockThrow", "ACE_Ladder", false] call EFUNC(common,statusEffect_set);
+[_unit, "forceWalk", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
+[_unit, "blockThrow", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
private _pos1 = getPosASL _ladder;
private _pos2 = _ladder modelToWorldWorld (_ladder selectionPosition "check2");
diff --git a/addons/tacticalladder/functions/fnc_positionTL.sqf b/addons/tacticalladder/functions/fnc_positionTL.sqf
index 6d6f78f1a34..e9168d75a1a 100644
--- a/addons/tacticalladder/functions/fnc_positionTL.sqf
+++ b/addons/tacticalladder/functions/fnc_positionTL.sqf
@@ -21,8 +21,8 @@
params ["_unit", "_ladder"];
// prevent the placing unit from running
-[_unit, "forceWalk", "ACE_Ladder", true] call EFUNC(common,statusEffect_set);
-[_unit, "blockThrow", "ACE_Ladder", true] call EFUNC(common,statusEffect_set);
+[_unit, "forceWalk", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
+[_unit, "blockThrow", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
{
_ladder animate [_x, 0];
diff --git a/addons/tacticalladder/stringtable.xml b/addons/tacticalladder/stringtable.xml
index a7d33865f96..298c0e3c442 100644
--- a/addons/tacticalladder/stringtable.xml
+++ b/addons/tacticalladder/stringtable.xml
@@ -79,7 +79,7 @@
+Ctrl incliner
+Ctrl per inclinare
+Ctrl で傾ける
- +컨트롤 키 기울이기
+ +컨트롤 키로 기울이기
+Ctrl 倾斜
+Ctrl 傾斜
diff --git a/addons/tagging/functions/fnc_addTagActions.sqf b/addons/tagging/functions/fnc_addTagActions.sqf
index 9c720e1f6c5..79603487408 100644
--- a/addons/tagging/functions/fnc_addTagActions.sqf
+++ b/addons/tagging/functions/fnc_addTagActions.sqf
@@ -19,6 +19,7 @@ params ["_unit"];
private _actions = [];
{
+ //IGNORE_PRIVATE_WARNING ["_player", "_target"];
_actions pushBack [
[
format ["ACE_TagItem_%1", _x],
diff --git a/addons/tagging/functions/fnc_checkTaggable.sqf b/addons/tagging/functions/fnc_checkTaggable.sqf
index ef20062a32d..5f9d162694d 100644
--- a/addons/tagging/functions/fnc_checkTaggable.sqf
+++ b/addons/tagging/functions/fnc_checkTaggable.sqf
@@ -17,6 +17,7 @@
[_this, {
params ["_unit"];
+ //IGNORE_PRIVATE_WARNING ["_unit"];
// Exit if no required item in inventory
if ([_unit, {
diff --git a/addons/tagging/functions/fnc_compileTagAction.sqf b/addons/tagging/functions/fnc_compileTagAction.sqf
index a49de10f47d..3b9e060c5c3 100644
--- a/addons/tagging/functions/fnc_compileTagAction.sqf
+++ b/addons/tagging/functions/fnc_compileTagAction.sqf
@@ -24,6 +24,7 @@ _actions pushBack ([
_displayName,
_icon,
{
+ //IGNORE_PRIVATE_WARNING ["_player", "_target"];
(_this select 2) params ["_class", "_textures", "_materials", "_tagModel"];
(
diff --git a/addons/tagging/functions/fnc_createTag.sqf b/addons/tagging/functions/fnc_createTag.sqf
index 90923cc8034..134e37bcc0a 100644
--- a/addons/tagging/functions/fnc_createTag.sqf
+++ b/addons/tagging/functions/fnc_createTag.sqf
@@ -68,7 +68,7 @@ if (_object getVariable [QGVAR(testVar), false]) then {
if (_selection == "" && _damage >= 1) then {
{
deleteVehicle _x;
- } foreach (_object getVariable [QGVAR(attachedTags), []]);
+ } forEach (_object getVariable [QGVAR(attachedTags), []]);
_object setVariable [QGVAR(attachedTags), []];
};
}];
diff --git a/addons/towing/config.cpp b/addons/towing/config.cpp
index d4d1b5e8540..7c98be1756c 100644
--- a/addons/towing/config.cpp
+++ b/addons/towing/config.cpp
@@ -6,7 +6,7 @@ class CfgPatches {
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
- requiredAddons[] = {"ace_common", "ace_logistics_rope"};
+ requiredAddons[] = {"ace_interaction", "ace_logistics_rope"};
author = ECSTRING(common,ACETeam);
authors[] = {"tcvm"};
url = ECSTRING(main,URL);
@@ -16,4 +16,3 @@ class CfgPatches {
#include "CfgEventHandlers.hpp"
#include "CfgVehicles.hpp"
-
diff --git a/addons/towing/functions/fnc_attachRopePFH.sqf b/addons/towing/functions/fnc_attachRopePFH.sqf
index 37f626e0a92..31def8dcb83 100644
--- a/addons/towing/functions/fnc_attachRopePFH.sqf
+++ b/addons/towing/functions/fnc_attachRopePFH.sqf
@@ -21,7 +21,7 @@ private _viewDirection = getCameraViewDirection _unit;
GVAR(attachHelper) setPosASL (_unit modelToWorldVisualWorld [0, 1, 1.5]);
private _hintLMB = "";
-private _hintRMB = localize ELSTRING(dragging,Drop);
+private _hintRMB = LELSTRING(common,Drop);
private _startPos = eyePos _unit;
private _endPos = _startPos vectorAdd (_viewDirection vectorMultiply TOW_ACTION_DISTANCE);
diff --git a/addons/towing/functions/fnc_towStateMachinePFH.sqf b/addons/towing/functions/fnc_towStateMachinePFH.sqf
index 7b295754fad..ad516f211b6 100644
--- a/addons/towing/functions/fnc_towStateMachinePFH.sqf
+++ b/addons/towing/functions/fnc_towStateMachinePFH.sqf
@@ -70,7 +70,7 @@ switch (_state) do {
// can't use createVehicleLocal because rope can be non-local (like parent) and it must be attached to global vehicle
GVAR(helper) = createVehicle [QGVAR(helper), [0, 0, 0], [], 0, "CAN_COLLIDE"];
GVAR(helper) attachTo [_unit, [0, 0, 0], "LeftHand", true];
- _rope = ropeCreate [_parent, _parent worldToModelVisual ASLtoAGL getPosASLVisual GVAR(attachHelper), GVAR(helper), [0, 0, 0], _length];
+ _rope = ropeCreate [_parent, _parent worldToModelVisual ASLToAGL getPosASLVisual GVAR(attachHelper), GVAR(helper), [0, 0, 0], _length];
_args set [3, _rope];
};
@@ -95,7 +95,7 @@ switch (_state) do {
case TOW_STATE_ATTACH: {
TRACE_3("state attach",GVAR(attachHelper),_parent,_rope);
private _child = GVAR(attachHelper) getVariable [QGVAR(object), objNull];
- private _relativeAttachPos = _child worldToModelVisual ASLtoAGL getPosASLVisual GVAR(attachHelper);
+ private _relativeAttachPos = _child worldToModelVisual ASLToAGL getPosASLVisual GVAR(attachHelper);
TRACE_3("child&pos",_parent,_child,_relativeAttachPos);
@@ -118,7 +118,7 @@ switch (_state) do {
};
private _hookParent = createVehicle [QGVAR(hook), [0, 0, 0], [], 0, "CAN_COLLIDE"];
- _hookParent attachTo [_parent, _parent worldToModelVisual ASLtoAGL getPosASLVisual _rope];
+ _hookParent attachTo [_parent, _parent worldToModelVisual ASLToAGL getPosASLVisual _rope];
private _hook = createVehicle [QGVAR(hook), [0, 0, 0], [], 0, "CAN_COLLIDE"];
_hook attachTo [_child, _relativeAttachPos];
diff --git a/addons/towing/stringtable.xml b/addons/towing/stringtable.xml
index 949d36dd488..7549fb3c8a8 100644
--- a/addons/towing/stringtable.xml
+++ b/addons/towing/stringtable.xml
@@ -12,6 +12,7 @@
牵引
견인
Remolcado
+ Rebocando
Attach Tow Rope
@@ -24,6 +25,7 @@
系上牵引绳
견인줄 부착
Sujetar cuerda de remolcado
+ Fixar corda de reboque
Attaching Cancelled
@@ -36,6 +38,7 @@
取消系上绳索
견인 취소됨
Sujección cancelada
+ Reboque cancelado
Attach Tow Rope (3.2m)
@@ -48,6 +51,7 @@
系上牵引绳(3.2米)
견인줄 부착(3.2M)
Sujetar cuerda de remolcado (3.2m)
+ Fixar corda de reboque (3,2m)
Attach Tow Rope (6.2m)
@@ -60,6 +64,7 @@
系上牵引绳(6.2米)
견인줄 부착(6.2M)
Sujetar cuerda de remolcado (6.2m)
+ Fixar corda de reboque (6,2m)
Attach Tow Rope (12.2m)
@@ -72,6 +77,7 @@
系上牵引绳(12.2米)
견인줄 부착(12.2M)
Sujetar cuerda de remolcado (12.2m)
+ Fixar corda de reboque (12,2m)
Attach Tow Rope (15.2m)
@@ -84,6 +90,7 @@
系上牵引绳(15.2米)
견인줄 부착(15.2M)
Sujetar cuerda de remolcado (15.2m)
+ Fixar corda de reboque (15,2m)
Attach Tow Rope (18.3m)
@@ -96,6 +103,7 @@
系上牵引绳(18.3米)
견인줄 부착(18.2M)
Sujetar cuerda de remolcado (18.3m)
+ Fixar corda de reboque (18,3m)
Attach Tow Rope (27.4m)
@@ -108,6 +116,7 @@
系上牵引绳(27.4米)
견인줄 부착(27.4M)
Sujetar cuerda de remolcado (27.4m)
+ Fixar corda de reboque (27,4m)
Attach Tow Rope (36.6m)
@@ -120,6 +129,7 @@
系上牵引绳(36.6米)
견인줄 부착(36.6M)
Sujetar cuerda de remolcado (36.6m)
+ Fixar corda de reboque (36,6m)
Detach Tow Rope
@@ -132,6 +142,7 @@
解开牵引绳
견인줄 분리
Desmontar cuerda de remolcado
+ Soltar corda de reboque
Add Tow Rope to Vehicle Inventory
@@ -143,6 +154,7 @@
車両のインベントリに牽引ロープを追加する
Abschleppseil zum Fahrzeuginventar hinzufügen
Ajouter une corde à l'inventaire des véhicules
+ Adicionar corda de reboque ao inventário do veículo
diff --git a/addons/trenches/CfgVehicles.hpp b/addons/trenches/CfgVehicles.hpp
index bec66e2e641..554a75149b8 100644
--- a/addons/trenches/CfgVehicles.hpp
+++ b/addons/trenches/CfgVehicles.hpp
@@ -106,4 +106,44 @@ class CfgVehicles {
MACRO_ADDITEM(ACE_EntrenchingTool,50);
};
};
+
+ class Wheeled_APC_F;
+ class APC_Wheeled_02_base_F: Wheeled_APC_F {
+ class EGVAR(interaction,anims);
+ };
+ class APC_Wheeled_02_base_v2_F: APC_Wheeled_02_base_F {
+ class EGVAR(interaction,anims): EGVAR(interaction,anims) {
+ class showTools {
+ phase = 0;
+ positions[] = {{-1.108, -1.47, -0.769}};
+ items[] = {"ACE_EntrenchingTool"};
+ name = CSTRING(EntrenchingToolName);
+ text = CSTRING(EntrenchingToolName);
+ };
+ };
+ };
+ class APC_Wheeled_03_base_F: Wheeled_APC_F {
+ class EGVAR(interaction,anims) {
+ class showTools {
+ phase = 0;
+ positions[] = {{-0.9, -3, -0.5}};
+ items[] = {"ACE_EntrenchingTool"};
+ name = CSTRING(EntrenchingToolName);
+ text = CSTRING(EntrenchingToolName);
+ };
+ };
+ };
+
+ class Tank_F;
+ class LT_01_base_F: Tank_F {
+ class EGVAR(interaction,anims) {
+ class showTools {
+ phase = 0;
+ positions[] = {{0.6, 0, -0.3}};
+ items[] = {"ACE_EntrenchingTool"};
+ name = CSTRING(EntrenchingToolName);
+ text = CSTRING(EntrenchingToolName);
+ };
+ };
+ };
};
diff --git a/addons/trenches/XEH_preInit.sqf b/addons/trenches/XEH_preInit.sqf
index 94decd550af..c8c9a3451f9 100644
--- a/addons/trenches/XEH_preInit.sqf
+++ b/addons/trenches/XEH_preInit.sqf
@@ -8,6 +8,6 @@ PREP_RECOMPILE_END;
#include "initSettings.inc.sqf"
-GVAR(entrenchingTools) = call (uiNamespace getVariable QGVAR(entrenchingTools));
+GVAR(entrenchingTools) = keys (uiNamespace getVariable QGVAR(entrenchingTools));
ADDON = true;
diff --git a/addons/trenches/XEH_preStart.sqf b/addons/trenches/XEH_preStart.sqf
index c966b2c9b6d..05065910397 100644
--- a/addons/trenches/XEH_preStart.sqf
+++ b/addons/trenches/XEH_preStart.sqf
@@ -6,4 +6,4 @@ private _entrenchingTools = (QUOTE(getNumber (_x >> QQGVAR(entrenchingTool)) > 0
_entrenchingTools append (QUOTE(getNumber (_x >> QQGVAR(entrenchingTool)) > 0) configClasses (configFile >> "CfgVehicles") apply {configName _x});
TRACE_1("",_entrenchingTools);
-uiNamespace setVariable [QGVAR(entrenchingTools), compileFinal str _entrenchingTools];
+uiNamespace setVariable [QGVAR(entrenchingTools), compileFinal (_entrenchingTools createHashMapFromArray [])];
diff --git a/addons/trenches/functions/fnc_continueDiggingTrench.sqf b/addons/trenches/functions/fnc_continueDiggingTrench.sqf
index 78047c189e4..e3aadcfd51c 100644
--- a/addons/trenches/functions/fnc_continueDiggingTrench.sqf
+++ b/addons/trenches/functions/fnc_continueDiggingTrench.sqf
@@ -81,7 +81,7 @@ if(_actualProgress == 0) then {
_cutterPos set [2, getTerrainHeightASL _cutterPos];
_trenchGrassCutter setPosASL _cutterPos;
deleteVehicle _trenchGrassCutter;
- } foreach getArray (configOf _trench >> QGVAR(grassCuttingPoints));
+ } forEach getArray (configOf _trench >> QGVAR(grassCuttingPoints));
};
private _progressLeft = (_actualProgress * 10) + 1;
diff --git a/addons/trenches/functions/fnc_hasEntrenchingTool.sqf b/addons/trenches/functions/fnc_hasEntrenchingTool.sqf
index 5a1127d0072..1568801fdb8 100644
--- a/addons/trenches/functions/fnc_hasEntrenchingTool.sqf
+++ b/addons/trenches/functions/fnc_hasEntrenchingTool.sqf
@@ -23,4 +23,4 @@ private _uniqueItems = _unit call EFUNC(common,uniqueItems);
_uniqueItems append weapons _unit;
_uniqueItems pushBack backpack _unit;
-GVAR(entrenchingTools) findIf {_x in _uniqueItems} != -1 // return
+GVAR(entrenchingTools) findAny _uniqueItems != -1 // return
diff --git a/addons/trenches/functions/fnc_placeCancel.sqf b/addons/trenches/functions/fnc_placeCancel.sqf
index a06ecff4590..f3cd20c0beb 100644
--- a/addons/trenches/functions/fnc_placeCancel.sqf
+++ b/addons/trenches/functions/fnc_placeCancel.sqf
@@ -21,8 +21,8 @@ params ["_unit", "_key"];
if (_key != 1 || {GVAR(digPFH) == -1}) exitWith {};
// enable running again
-[_unit, "forceWalk", "ACE_Trenches", false] call EFUNC(common,statusEffect_set);
-[_unit, "blockThrow", "ACE_Trenches", false] call EFUNC(common,statusEffect_set);
+[_unit, "forceWalk", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
+[_unit, "blockThrow", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
// delete placement dummy
deleteVehicle GVAR(trench);
diff --git a/addons/trenches/functions/fnc_placeConfirm.sqf b/addons/trenches/functions/fnc_placeConfirm.sqf
index 03d4791e026..2cfdaf8891e 100644
--- a/addons/trenches/functions/fnc_placeConfirm.sqf
+++ b/addons/trenches/functions/fnc_placeConfirm.sqf
@@ -18,8 +18,8 @@
params ["_unit"];
// enable running again
-[_unit, "forceWalk", "ACE_Trenches", false] call EFUNC(common,statusEffect_set);
-[_unit, "blockThrow", "ACE_Trenches", false] call EFUNC(common,statusEffect_set);
+[_unit, "forceWalk", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
+[_unit, "blockThrow", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
// remove dig pfh
[GVAR(digPFH)] call CBA_fnc_removePerFrameHandler;
@@ -64,7 +64,7 @@ for [{private _ix = -_dx/2},{_ix <= _dx/2},{_ix = _ix + _dx/3}] do {
_pos set [2, getTerrainHeightASL _pos];
_pos2 = +_pos;
_pos2 set [2, getTerrainHeightASL _pos + 1];
- drawLine3D [ASLtoAGL _pos, ASLtoAGL _pos2, [1,1,0,1]];
+ drawLine3D [ASLToAGL _pos, ASLToAGL _pos2, [1,1,0,1]];
#endif
};
};
diff --git a/addons/trenches/functions/fnc_placeTrench.sqf b/addons/trenches/functions/fnc_placeTrench.sqf
index f49aef4a385..285fe278e94 100644
--- a/addons/trenches/functions/fnc_placeTrench.sqf
+++ b/addons/trenches/functions/fnc_placeTrench.sqf
@@ -27,8 +27,8 @@ GVAR(trenchPlacementData) = getArray (configFile >> "CfgVehicles" >> _trenchClas
TRACE_1("",GVAR(trenchPlacementData));
// prevent the placing unit from running
-[_unit, "forceWalk", "ACE_Trenches", true] call EFUNC(common,statusEffect_set);
-[_unit, "blockThrow", "ACE_Trenches", true] call EFUNC(common,statusEffect_set);
+[_unit, "forceWalk", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
+[_unit, "blockThrow", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
// create the trench
private _trench = createVehicle [_noGeoModel, [0, 0, 0], [], 0, "NONE"];
@@ -77,7 +77,7 @@ GVAR(digPFH) = [{
_pos set [2, getTerrainHeightASL _pos];
_pos2 = +_pos;
_pos2 set [2, getTerrainHeightASL _pos + 1];
- drawLine3D [ASLtoAGL _pos, ASLtoAGL _pos2, [1,1,0,1]];
+ drawLine3D [ASLToAGL _pos, ASLToAGL _pos2, [1,1,0,1]];
#endif
};
};
diff --git a/addons/trenches/stringtable.xml b/addons/trenches/stringtable.xml
index 4b47ee6a144..5242603bc28 100644
--- a/addons/trenches/stringtable.xml
+++ b/addons/trenches/stringtable.xml
@@ -237,6 +237,7 @@
Camuffa la trincea
塹壕を偽装
Graben tarnen
+ Camuflar trincheira
Removing Trench
@@ -265,6 +266,7 @@
ACE Trincee
ACE 战壕
ACE 참호
+ ACE Trincheiras
Small Trench Dig Duration
@@ -277,6 +279,7 @@
Trincea piccola - Durata di scavo
小型战壕挖掘时间
소형참호 건설 시간
+ Duração de Escavamento de Trincheira Pequena
Time, in seconds, required to dig a small trench.
@@ -289,6 +292,7 @@
Tempo in secondi per scavare una trincea piccola.
挖一条小型战壕所需的时间(秒)。
소형 참호를 팔 때 필요한 시간을 설정합니다. (초 단위)
+ Tempo, em segundos, necessário para cavar uma trincheira pequena.
Small Trench Remove Duration
@@ -301,6 +305,7 @@
Trincea piccola - Durata di rimozione
小型战壕回填时间
소형참호 제거 시간
+ Duração de Remoção de Trincheira Pequena
Time, in seconds, required to remove a small trench.
@@ -313,6 +318,7 @@
Tempo in secondi per rimuovere una trincea piccola.
回填一条小型战壕所需的时间(秒)。
소형 참호를 제거할때 필요한 시간을 설정합니다. (초 단위)
+ Tempo, em segundos, necessário para remover uma trincheira pequena.
Big Trench Dig Duration
@@ -325,6 +331,7 @@
Trincea grande - Durata di scavo
大型战壕挖掘时间
대형참호 건설 시간
+ Duração de Escavamento de Trincheira Grande
Time, in seconds, required to dig a big trench.
@@ -337,6 +344,7 @@
Tempo in secondi per scavare una trincea grande.
挖一条大型战壕所需的时间(秒)。
대형 참호를 팔때 필요한 시간을 설정합니다. (초 단위)
+ Tempo, em segundos, necessário para cavar uma trincheira grande.
Big Trench Remove Duration
@@ -349,6 +357,7 @@
Trincea grande - Durata di rimozione
大型战壕回填时间
대형참호 제거 시간
+ Duração de Remoção de Trincheira Grande
Time, in seconds, required to remove a big trench.
@@ -361,6 +370,7 @@
Tempo in secondi per rimuovere una trincea grande.
回填一条大型战壕所需的时间(秒)。
대형 참호를 제거할때 필요한 시간을 설정합니다. (초 단위)
+ Tempo, em segundos, necessário para remover uma trincheira grande.
diff --git a/addons/ui/CfgInGameUI.hpp b/addons/ui/CfgInGameUI.hpp
index 8f39984b03c..3e1f28ba204 100644
--- a/addons/ui/CfgInGameUI.hpp
+++ b/addons/ui/CfgInGameUI.hpp
@@ -1,5 +1,5 @@
class CfgInGameUI {
class DefaultAction {
- size = QUOTE(profileNamespace getVariable [ARR_2('GVAR(hideDefaultActionIcon)',(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8))]);
+ size = QUOTE(profileNamespace getVariable [ARR_2('GVAR(hideDefaultActionIcon)',(((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25) * 0.8))]);
};
};
diff --git a/addons/ui/XEH_clientInit.sqf b/addons/ui/XEH_clientInit.sqf
index d9d3fa5717c..5bf28bc58d4 100644
--- a/addons/ui/XEH_clientInit.sqf
+++ b/addons/ui/XEH_clientInit.sqf
@@ -1,4 +1,5 @@
#include "script_component.hpp"
+#include "\a3\ui_f\hpp\defineDIKCodes.inc"
// Exit on Headless
if (!hasInterface) exitWith {};
@@ -48,3 +49,24 @@ GVAR(elementsSet) = createHashMap;
}] call CBA_fnc_addEventHandler;
[QUOTE(ADDON), "AnimChanged", LINKFUNC(onAnimChanged), true] call EFUNC(common,addPlayerEH);
+
+
+["ACE3 Common", QGVAR(hideHud), localize LSTRING(hideHud), {
+ GVAR(hideHud) = !(missionNamespace getVariable [QGVAR(hideHud), false]);
+ [QGVAR(hideHud), [GVAR(hideHud)]] call CBA_fnc_localEvent;
+
+ private _mask = [];
+ if (GVAR(hideHud)) then { _mask resize [10, false] };
+ [QGVAR(hideHud), _mask] call EFUNC(common,showHud);
+
+ if (missionNamespace getVariable [QGVAR(hideHud_hideChat), true]) then {
+ showChat !GVAR(hideHud);
+ };
+
+ if (!isNil "diwako_dui_main_toggled_off") then {
+ diwako_dui_main_toggled_off = GVAR(hideHud); // ref https://github.com/diwako/diwako_dui/wiki/Hiding-DUI-for-cutscenes
+ };
+ true
+},
+{false},
+[DIK_F12, [false, true, false]], false] call CBA_fnc_addKeybind; // ctrl+f12
diff --git a/addons/ui/stringtable.xml b/addons/ui/stringtable.xml
index 2578f58c6d0..1f9698d6561 100644
--- a/addons/ui/stringtable.xml
+++ b/addons/ui/stringtable.xml
@@ -168,6 +168,7 @@
Filigrana per versione in fase di sviluppo
开发建设水印
개발용 빌드 워터마크
+ Marca d'agua de versão de desenvolvimento
Weapon Name
@@ -680,6 +681,7 @@
启用移动速度指示器
이동 속도 표시기 활성화
Habilitar indicador de velocidad de movimiento
+ Habilitar indicador de velocidade de movimento
Enables movement speed indicator for player character.
@@ -692,6 +694,7 @@
为玩家角色启用移动速度指示器。
플레이어 캐릭터를 위한 이동속도 표시기를 활성화합니다.
Habilita el indicador de velocidad de movimiento para el personaje del jugador.
+ Habilita o indicador de velocidade de movimento do personagem do jogador.
Hide Default Action Icon
@@ -704,6 +707,7 @@
Standardaktionssymbol ausblenden
Masquer l'icône d'action par défaut
Nascondi Icona dell'Interazione Standard
+ Esconder ícone padrão de ação
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.
@@ -716,6 +720,14 @@
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.
Cache l'icône qui s'affiche automatiquement lorsque quelque chose est devant le curseur. Nécessite un redémarrage du jeu.\nAvertissement : l'action n'est pas supprimée ! Il est recommandé d'annuler l'affectation du bouton 'Utiliser l'action par défaut' afin d'éviter des interactions indésirables.
Nasconde l'icona mostrata in automatico quando qualcosa è davanti al cursore. La modifica richiede un riavvio del gioco.\nAttenzione: Non rimuovere l'azione stessa! È consigliato rimuovere solo il tasto dall'assegnazione 'Usa Azione Standard' per impedire interazioni non volute.
+ Esconde o ícone mostrado automaticamente quando algo está a frente do cursor. É preciso reiniciar o jogo.\nAviso: Não remove a ação em si! É recomendado desvincular a tecla de "Usar ação padrão" para previnir interações indesejadas.
+
+
+ Hide all UI
+ 全てのUIを隠す
+ Cacher toute l'interface utilisateur.
+ Скрыть весь интерфейс
+ 모든 UI 숨기기
diff --git a/addons/vector/RscInGameUI.hpp b/addons/vector/RscInGameUI.hpp
index 7e2f7057650..b7a6f25022b 100644
--- a/addons/vector/RscInGameUI.hpp
+++ b/addons/vector/RscInGameUI.hpp
@@ -51,88 +51,88 @@ class RscInGameUI {
class ACE_ScriptedDisplayControlsGroup: RscControlsGroupNoScrollbars {
onLoad = "uiNamespace setVariable ['ACE_dlgVector', ctrlParent (_this select 0)];";
idc = 170;
- x = "safezoneX";
- y = "safezoneY";
- w = "safezoneW";
- h = "safezoneH";
+ x = "safeZoneX";
+ y = "safeZoneY";
+ w = "safeZoneW";
+ h = "safeZoneH";
class controls {
class Center: RscPicture {
idc = IDC_CENTER;
colorText[] = {1,0,0,0.5};
- x = "0.5 - (0.8 / 16 * safezoneW)/2 - safezoneX";
- y = "0.5 - (0.8 / 9 * safezoneH)/2 - safezoneY";
- w = "0.8 / 16 * safezoneW";
- h = "0.8 / 9 * safezoneH";
+ x = "0.5 - (0.8 / 16 * safeZoneW)/2 - safeZoneX";
+ y = "0.5 - (0.8 / 9 * safeZoneH)/2 - safeZoneY";
+ w = "0.8 / 16 * safeZoneW";
+ h = "0.8 / 9 * safeZoneH";
};
class Crosshair: Center {
idc = IDC_CROSSHAIR;
- x = "0.5 - (0.7 / 16 * safezoneW)/2 - safezoneX";
- y = "0.5 - (0.7 / 9 * safezoneH)/2 - safezoneY";
- w = "0.7 / 16 * safezoneW";
- h = "0.7 / 9 * safezoneH";
+ x = "0.5 - (0.7 / 16 * safeZoneW)/2 - safeZoneX";
+ y = "0.5 - (0.7 / 9 * safeZoneH)/2 - safeZoneY";
+ w = "0.7 / 16 * safeZoneW";
+ h = "0.7 / 9 * safeZoneH";
};
class Digit0: Center {
idc = IDC_DIGIT_0;
- x = "(0.54 + 0 * 0.02) * safezoneW";
- y = "0.54 * safezoneH";
- w = "0.5 / 16 * safezoneW";
- h = "0.5 / 9 * safezoneH";
+ x = "(0.54 + 0 * 0.02) * safeZoneW";
+ y = "0.54 * safeZoneH";
+ w = "0.5 / 16 * safeZoneW";
+ h = "0.5 / 9 * safeZoneH";
};
class Digit1: Digit0 {
idc = IDC_DIGIT_1;
- x = "(0.54 + 1 * 0.02) * safezoneW";
+ x = "(0.54 + 1 * 0.02) * safeZoneW";
};
class Digit2: Digit0 {
idc = IDC_DIGIT_2;
- x = "(0.54 + 2 * 0.02) * safezoneW";
+ x = "(0.54 + 2 * 0.02) * safeZoneW";
};
class Digit3: Digit0 {
idc = IDC_DIGIT_3;
- x = "(0.54 + 3 * 0.02) * safezoneW";
+ x = "(0.54 + 3 * 0.02) * safeZoneW";
};
class Digit4: Digit0 {
idc = IDC_DIGIT_4;
- x = "(0.54 + 4 * 0.02) * safezoneW";
+ x = "(0.54 + 4 * 0.02) * safeZoneW";
};
class Digit5: Digit0 {
idc = IDC_DIGIT_5;
- x = "(0.35 + 0 * 0.02) * safezoneW";
+ x = "(0.35 + 0 * 0.02) * safeZoneW";
};
class Digit6: Digit0 {
idc = IDC_DIGIT_6;
- x = "(0.35 + 1 * 0.02) * safezoneW";
+ x = "(0.35 + 1 * 0.02) * safeZoneW";
};
class Digit7: Digit0 {
idc = IDC_DIGIT_7;
- x = "(0.35 + 2 * 0.02) * safezoneW";
+ x = "(0.35 + 2 * 0.02) * safeZoneW";
};
class Digit8: Digit0 {
idc = IDC_DIGIT_8;
- x = "(0.35 + 3 * 0.02) * safezoneW";
+ x = "(0.35 + 3 * 0.02) * safeZoneW";
};
class Digit9: Digit0 {
idc = IDC_DIGIT_9;
- x = "(0.35 + 4 * 0.02) * safezoneW";
+ x = "(0.35 + 4 * 0.02) * safeZoneW";
};
class DigitE1: Digit0 {
idc = IDC_DIGIT_E1;
- x = "(0.39 + 0 * 0.02) * safezoneW";
- y = "0.42 * safezoneH";
+ x = "(0.39 + 0 * 0.02) * safeZoneW";
+ y = "0.42 * safeZoneH";
};
class DigitE2: DigitE1 {
idc = IDC_DIGIT_E2;
- x = "(0.39 + 1 * 0.02) * safezoneW";
+ x = "(0.39 + 1 * 0.02) * safeZoneW";
};
class DigitE3: DigitE1 {
idc = IDC_DIGIT_E3;
- x = "(0.39 + 2 * 0.02) * safezoneW";
+ x = "(0.39 + 2 * 0.02) * safeZoneW";
};
class DigitE4: DigitE1 {
idc = IDC_DIGIT_E4;
- x = "(0.39 + 3 * 0.02) * safezoneW";
+ x = "(0.39 + 3 * 0.02) * safeZoneW";
};
};
};
diff --git a/addons/vehicle_damage/CfgAmmo.hpp b/addons/vehicle_damage/CfgAmmo.hpp
index 408c3e7b157..ad84fbc53cd 100644
--- a/addons/vehicle_damage/CfgAmmo.hpp
+++ b/addons/vehicle_damage/CfgAmmo.hpp
@@ -21,9 +21,6 @@ class CfgAmmo {
class M_Vorona_HEAT;
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);
diff --git a/addons/vehicle_damage/CfgEventHandlers.hpp b/addons/vehicle_damage/CfgEventHandlers.hpp
index 74ffec132ee..f6503c2479b 100644
--- a/addons/vehicle_damage/CfgEventHandlers.hpp
+++ b/addons/vehicle_damage/CfgEventHandlers.hpp
@@ -1,19 +1,17 @@
-
class Extended_PreStart_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_preStart));
};
};
-class Extended_PostInit_EventHandlers {
+class Extended_PreInit_EventHandlers {
class ADDON {
- init = QUOTE(call COMPILE_SCRIPT(XEH_postInit));
+ init = QUOTE(call COMPILE_SCRIPT(XEH_preInit));
};
};
-class Extended_PreInit_EventHandlers {
+class Extended_PostInit_EventHandlers {
class ADDON {
- init = QUOTE(call COMPILE_SCRIPT(XEH_preInit));
+ init = QUOTE(call COMPILE_SCRIPT(XEH_postInit));
};
};
-
diff --git a/addons/vehicle_damage/CfgVehicles.hpp b/addons/vehicle_damage/CfgVehicles.hpp
index 9ea47711ea9..96a6e956e67 100644
--- a/addons/vehicle_damage/CfgVehicles.hpp
+++ b/addons/vehicle_damage/CfgVehicles.hpp
@@ -28,6 +28,7 @@ class CfgVehicles {
GVAR(engineFireProb) = 0.5;
GVAR(detonationDuringFireProb) = 0.2;
GVAR(canHaveFireRing) = 0;
+ EGVAR(cookoff,canHaveFireJet) = 1;
};
class Wheeled_APC_F: Car_F {
GVAR(hullDetonationProb) = 0.2;
@@ -38,6 +39,7 @@ class CfgVehicles {
GVAR(engineFireProb) = 0.5;
GVAR(detonationDuringFireProb) = 0.2;
GVAR(canHaveFireRing) = 0;
+ EGVAR(cookoff,canHaveFireJet) = 1;
};
class APC_Tracked_01_base_F: Tank_F {};
class B_APC_Tracked_01_base_F: APC_Tracked_01_base_F {};
@@ -288,4 +290,3 @@ class CfgVehicles {
GVAR(canHaveFireRing) = 1;
};
};
-
diff --git a/addons/vehicle_damage/XEH_PREP.hpp b/addons/vehicle_damage/XEH_PREP.hpp
index a7eb5198811..20075cbd4af 100644
--- a/addons/vehicle_damage/XEH_PREP.hpp
+++ b/addons/vehicle_damage/XEH_PREP.hpp
@@ -1,14 +1,13 @@
PREP(abandon);
PREP(addEventHandler);
+PREP(blowOffTurret);
PREP(handleBail);
-PREP(handleVehicleDamage);
PREP(handleCookoff);
-PREP(detonate);
-PREP(processHit);
-PREP(handleDetonation);
PREP(handleDamage);
-PREP(knockOut);
-PREP(addDamage);
PREP(handleDamageEjectIfDestroyed);
-PREP(blowOffTurret);
+PREP(handleDetonation);
+PREP(handleVehicleDamage);
+PREP(knockOut);
PREP(medicalDamage);
+PREP(processHit);
+PREP(setDamage);
diff --git a/addons/vehicle_damage/XEH_postInit.sqf b/addons/vehicle_damage/XEH_postInit.sqf
index 9784d335eda..5e15599735e 100644
--- a/addons/vehicle_damage/XEH_postInit.sqf
+++ b/addons/vehicle_damage/XEH_postInit.sqf
@@ -1,53 +1,65 @@
#include "script_component.hpp"
-["ace_settingsInitialized", {
+// Init eject from destroyed vehicles
+// See https://github.com/acemod/ACE3/pull/6330
+// Still valid for Arma 2.16
+{
+ [_x, "Init", {
+ params ["_vehicle"];
+
+ if (!alive _vehicle) exitWith {};
+
+ TRACE_2("ejectIfDestroyed init",_vehicle,typeOf _vehicle);
+
+ _vehicle addEventHandler ["HandleDamage", {call FUNC(handleDamageEjectIfDestroyed)}];
+ }, true, [], true] call CBA_fnc_addClassEventHandler;
+} forEach EJECT_IF_DESTROYED_VEHICLES;
+
+["CBA_settingsInitialized", {
TRACE_1("settings init",GVAR(enabled));
- if (GVAR(enabled)) then {
- [QGVAR(medicalDamage), LINKFUNC(medicalDamage)] call CBA_fnc_addEventHandler;
- [QGVAR(bailOut), {
- params ["_center", "_crewman", "_vehicle"];
- TRACE_3("bailOut",_center,_crewman,_vehicle);
+ if (!GVAR(enabled)) exitWith {};
- if (isPlayer _crewman) exitWith {};
- if (!alive _crewman || {!([_crewman] call EFUNC(common,isAwake))}) exitWith {};
+ [QGVAR(medicalDamage), LINKFUNC(medicalDamage)] call CBA_fnc_addEventHandler;
- unassignVehicle _crewman;
- _crewman leaveVehicle _vehicle;
- doGetOut _crewman;
+ if (isServer) then {
+ // To set source and instigator, setDamage must be executed on the server
+ [QGVAR(setDamage), {(_this select 0) setDamage (_this select 1)}] call CBA_fnc_addEventHandler;
+ };
- private _angle = floor (random 360);
- private _dist = (30 + (random 10));
- private _escape = _center getPos [_dist, _angle];
+ [QGVAR(bailOut), {
+ params ["_vehicle", "_unit"];
- _crewman doMove _escape;
- _crewman setSpeedMode "FULL";
- }] call CBA_fnc_addEventHandler;
+ TRACE_2("bailOut",_vehicle,_unit);
- ["Tank", "init", LINKFUNC(addEventHandler), true, [], true] call CBA_fnc_addClassEventHandler;
- ["Wheeled_APC_F", "init", LINKFUNC(addEventHandler), true, [], true] call CBA_fnc_addClassEventHandler;
+ // Ignore players and the dead
+ if (_unit call EFUNC(common,isPlayer) || {!(_unit call EFUNC(common,isAwake))}) exitWith {};
- if (GVAR(enableCarDamage)) then {
- ["Car", "init", LINKFUNC(addEventHandler), true, [], true] call CBA_fnc_addClassEventHandler;
- };
+ unassignVehicle _unit;
+ _unit leaveVehicle _vehicle;
+ doGetOut _unit;
- // Blow off turret effect
- // TODO: Add blowing-off-turret effect to vehicles that cook-off but aren't destroyed (no catastrophic explosion)
- // The problem is that vehicles are repairable if they haven't been destroyed. So if the turret is gone and vehicle is repaired, how do we handle that?
- ["Tank", "Killed", {
- if (_this select 3 && random 1 < 0.15) then {
- (_this select 0) call FUNC(blowOffTurret);
- };
- }, true, [], true] call CBA_fnc_addClassEventHandler;
- };
+ private _angle = floor (random 360);
+ private _dist = 30 + (random 10);
+ private _escape = _vehicle getPos [_dist, _angle];
+
+ _unit doMove _escape;
+ _unit setSpeedMode "FULL";
+ }] call CBA_fnc_addEventHandler;
+
+ GVAR(vehicleClassesHitPointHash) = createHashMap;
- // init eject from destroyed vehicle
- {
- [_x, "init", {
- params ["_vehicle"];
- if (!alive _vehicle) exitWith {};
- TRACE_2("ejectIfDestroyed init",_vehicle,typeOf _vehicle);
- _vehicle addEventHandler ["HandleDamage", {call FUNC(handleDamageEjectIfDestroyed)}];
- }, true, [], true] call CBA_fnc_addClassEventHandler;
- } forEach EJECT_IF_DESTROYED_VEHICLES;
+ ["Tank", "Init", LINKFUNC(addEventHandler), true, [], true] call CBA_fnc_addClassEventHandler;
+
+ // Wheeled_APC_F inherits from Car
+ [["Wheeled_Apc_F", "Car"] select GVAR(enableCarDamage), "Init", LINKFUNC(addEventHandler), true, [], true] call CBA_fnc_addClassEventHandler;
+
+ // Blow off turret effect
+ // TODO: Add blowing-off-turret effect to vehicles that cook-off but aren't destroyed (no catastrophic explosion)
+ // The problem is that vehicles are repairable if they haven't been destroyed. So if the turret is gone and vehicle is repaired, how do we handle that?
+ ["Tank", "Killed", {
+ if (_this select 3 && random 1 < 0.15) then {
+ (_this select 0) call FUNC(blowOffTurret);
+ };
+ }] call CBA_fnc_addClassEventHandler;
}] call CBA_fnc_addEventHandler;
diff --git a/addons/vehicle_damage/config.cpp b/addons/vehicle_damage/config.cpp
index 6b4f7cf685d..24b2abda5ba 100644
--- a/addons/vehicle_damage/config.cpp
+++ b/addons/vehicle_damage/config.cpp
@@ -7,7 +7,7 @@ class CfgPatches {
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
// ammo/vehicle config defines touch all of these
- requiredAddons[] = { "ace_common", "ace_cookoff" };
+ requiredAddons[] = {"ace_common", "ace_cookoff"};
author = ECSTRING(common,ACETeam);
authors[] = {"tcvm"};
url = ECSTRING(main,URL);
diff --git a/addons/vehicle_damage/functions/fnc_abandon.sqf b/addons/vehicle_damage/functions/fnc_abandon.sqf
index 83b06a80df1..3539e21a976 100644
--- a/addons/vehicle_damage/functions/fnc_abandon.sqf
+++ b/addons/vehicle_damage/functions/fnc_abandon.sqf
@@ -4,29 +4,34 @@
* Forces the AI currently in a vehicle to bail out.
*
* Arguments:
- * 0: The vehicle in which to bail out
+ * 0: Vehicle
*
* Return Value:
* None
*
* Example:
- * [tank2] call ace_vehicle_damage_fnc_abandon;
+ * cursorObject call ace_vehicle_damage_fnc_abandon
*
* Public: No
*/
params ["_vehicle"];
-TRACE_2("abandon",_vehicle,(crew _vehicle) select {alive _x});
-if (_vehicle getVariable [QGVAR(allowCrewInImmobile), false]) exitWith {}; // check for API
+// Check for API
+if (_vehicle getVariable [QGVAR(allowCrewInImmobile), false]) exitWith {
+ TRACE_1("API prevented crew from dismounting",_vehicle);
+};
+
+TRACE_1("abandon",_vehicle);
[{
params ["_vehicle"];
+
_vehicle allowCrewInImmobile false;
- private _center = getPosASL _vehicle;
- TRACE_2("bailing out crew after delay",_vehicle,_center);
+ TRACE_2("bailing out crew after delay",_vehicle,crew _vehicle);
+
{
- [QGVAR(bailOut), [_center, _x, _vehicle], _x] call CBA_fnc_targetEvent;
- } forEach crew _vehicle;
-}, _this, random MAX_CREW_BAILOUT_TIME] call CBA_fnc_waitAndExecute;
+ [QGVAR(bailOut), [_vehicle, _x], _x] call CBA_fnc_targetEvent;
+ } forEach (crew _vehicle);
+}, _vehicle, random MAX_CREW_BAILOUT_TIME] call CBA_fnc_waitAndExecute;
diff --git a/addons/vehicle_damage/functions/fnc_addDamage.sqf b/addons/vehicle_damage/functions/fnc_addDamage.sqf
deleted file mode 100644
index 35475bd36cb..00000000000
--- a/addons/vehicle_damage/functions/fnc_addDamage.sqf
+++ /dev/null
@@ -1,42 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: tcvm
- * Sets vehicle damage based on HitIndex. Failing that it falls back to HitPoint name.
- *
- * Arguments:
- * 0: The vehicle
- * 1: Hit Index
- * 2: Hit Point
- * 3: Damage
- * 4: Whether or not to cap the damage to maximum part damage (default: True)
- *
- * Return Value:
- * None
- *
- * Example:
- * [vehicle player, 234, "HitHull"] call ace_vehicle_damage_fnc_addDamage
- *
- * Public: No
- */
-
-params ["_vehicle", "_hitIndex", "_hitPoint", "_damage", ["_capDamageAtCurret", true]];
-
-private _currentDamage = _vehicle getHitPointDamage _hitPoint;
-if (_capDamageAtCurret && { _damage < _currentDamage }) exitWith {
- TRACE_4("capping damage at current",_capDamageAtCurret,_damage,_currentDamage,_hitPoint);
-};
-
-TRACE_4("adding damage to vehicle",_vehicle,_hitIndex,_hitPoint,_damage);
-if (_hitPoint isEqualTo "#structural") then {
- _hitPoint = "hithull";
- _hitIndex = -1;
-};
-if (_hitIndex >= 0) then {
- _vehicle setHitIndex [_hitIndex, _damage, true];
-} else {
- _vehicle setHitPointDamage [_hitPoint, _damage, true];
-};
-
-if (_hitPoint == "hitengine" && {_damage > 0.9}) then {
- [QEGVAR(cookoff,engineFireServer), _vehicle] call CBA_fnc_serverEvent;
-};
diff --git a/addons/vehicle_damage/functions/fnc_addEventHandler.sqf b/addons/vehicle_damage/functions/fnc_addEventHandler.sqf
index a7e59c75a19..3fdbf9ec20c 100644
--- a/addons/vehicle_damage/functions/fnc_addEventHandler.sqf
+++ b/addons/vehicle_damage/functions/fnc_addEventHandler.sqf
@@ -1,110 +1,137 @@
#include "..\script_component.hpp"
/*
- * Author: tcvm
+ * Author: tcvm, johnb43
* Adds the event handler to a vehicle.
*
* Arguments:
- * 0: The vehicle in which to add the event handler to
+ * 0: Vehicle
*
* Return Value:
* None
*
* Example:
- * [tank2] call ace_vehicle_damage_fnc_addEventHandler;
+ * cursorObject call ace_vehicle_damage_fnc_addEventHandler
*
* Public: No
*/
-params["_vehicle"];
+params ["_vehicle"];
TRACE_2("addEventHandler",_vehicle,GVAR(enabled));
-if !(GVAR(enabled)) exitWith {
+if (!GVAR(enabled)) exitWith {
#ifdef DEBUG_MODE_FULL
- [{ ["Warning: Vehicle Damage not enabled...", 2] call CBA_fnc_notify; }, [], 5] call CBA_fnc_waitAndExecute;
+ [CBA_fnc_notify, ["Warning: Vehicle Damage not enabled", 2], 5] call CBA_fnc_waitAndExecute;
#endif
};
-private _hitpointHash = [[], nil] call CBA_fnc_hashCreate;
+if (!isNil {_vehicle getVariable QGVAR(handleDamage)}) exitWith {};
+
+_vehicle allowCrewInImmobile true;
+
+// No clue why, but for some reason this needs to be exec'd next frame or else it isn't the last event handler in the system.
+// Maybe its overridden somewhere else, but this makes sure it is the last one
+[{
+ params ["_vehicle"];
+
+ if (!isNil {_vehicle getVariable QGVAR(handleDamage)}) exitWith {};
+
+ TRACE_1("added eh",_vehicle);
+
+ _vehicle setVariable [QGVAR(hitHash), createHashMap];
+ _vehicle setVariable [QGVAR(handleDamage), _vehicle addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}]];
+}, _vehicle] call CBA_fnc_execNextFrame;
+
+private _typeOf = typeOf _vehicle;
+
+if (_typeOf in GVAR(vehicleClassesHitPointHash)) exitWith {};
+
+private _hitPointHash = createHashMap;
private _vehicleConfig = configOf _vehicle;
-private _hitpointsConfig = _vehicleConfig >> "HitPoints";
-private _turretConfig = _vehicleConfig >> "Turrets";
-private _eraHitpoints = [_vehicleConfig >> QGVAR(eraHitpoints), "ARRAY", []] call CBA_fnc_getConfigEntry;
-private _slatHitpoints = [_vehicleConfig >> QGVAR(slatHitpoints), "ARRAY", []] call CBA_fnc_getConfigEntry;
+private _hitPointsConfig = _vehicleConfig >> "HitPoints";
// Add hitpoint names to config for quick lookup
{
- _x params ["_hitpoints", "_type"];
+ _x params ["_hitPoints", "_hitArea"];
+
{
- [_hitpointHash, toLowerANSI _x, [_type, _hitpointsConfig >> _x, toLowerANSI _x]] call CBA_fnc_hashSet;
- } forEach _hitpoints;
+ _hitPointHash set [toLowerANSI _x, [_hitArea, abs getNumber (_hitPointsConfig >> _x >> "minimalHit")]];
+ } forEach _hitPoints;
} forEach ALL_HITPOINTS;
-_vehicle setVariable [QGVAR(hitpointHash), _hitpointHash];
-
-// gun and turret hitpoints arent hardcoded anymore - dig through config to find correct names
-private _iterateThroughConfig = {
- params ["_vehicle", "_config", "_iterateThroughConfig", "_hitpointAliases"];
+// Gun and turret hitpoints aren't hardcoded anymore - dig through config to find correct names
+private _fnc_iterateThroughConfig = {
+ params ["_config"];
TRACE_1("checking config",_config);
+
private _configName = toLowerANSI configName _config;
- private _isGun = ([_config >> "isGun", "NUMBER", 0] call CBA_fnc_getConfigEntry) == 1;
- private _isTurret = ([_config >> "isTurret", "NUMBER", 0] call CBA_fnc_getConfigEntry) == 1;
+ private _isGun = getNumber (_config >> "isGun") == 1;
+ private _isTurret = getNumber (_config >> "isTurret") == 1;
private _isEra = _configName in _eraHitpoints;
private _isSlat = _configName in _slatHitpoints;
private _isMisc = false;
- // prevent incompatibilites with old mods
- if (_configName isEqualTo "hitturret") then {
+ // Prevent incompatibilites with old mods
+ if (_configName == "hitturret") then {
_isTurret = true;
};
- if (_configName isEqualTo "hitgun") then {
+
+ if (_configName == "hitgun") then {
_isGun = true;
};
- private _hash = _vehicle getVariable QGVAR(hitpointHash);
{
- _x params ["_hitType", "_hitPoints"];
+ _x params ["_hitArea", "_hitPoints"];
+
if (_configName in _hitPoints) then {
- [_hash, _configName, [_hitType, _config, _configName]] call CBA_fnc_hashSet;
+ _hitPointHash set [_configName, [_hitArea, abs getNumber (_config >> "minimalHit")]];
_isMisc = true;
};
- } forEach _hitpointAliases;
+ } 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 {
- [_hash, _configName, ["gun", _config, _configName]] call CBA_fnc_hashSet;
+ _hitPointHash set [_configName, ["gun", abs getNumber (_config >> "minimalHit")]];
};
if (_isTurret) then {
- [_hash, _configName, ["turret", _config, _configName]] call CBA_fnc_hashSet;
+ _hitPointHash set [_configName, ["turret", abs getNumber (_config >> "minimalHit")]];
};
if (_isEra) then {
- [_hash, _configName, ["era", _config, _configName]] call CBA_fnc_hashSet;
+ _hitPointHash set [_configName, ["era", abs getNumber (_config >> "minimalHit")]];
};
if (_isSlat) then {
- [_hash, _configName, ["slat", _config, _configName]] call CBA_fnc_hashSet;
+ _hitPointHash set [_configName, ["slat", abs getNumber (_config >> "minimalHit")]];
};
- _vehicle setVariable [QGVAR(hitpointHash), _hash];
+
+ TRACE_6("found gun/turret/era/slat/misc",_isGun,_isTurret,_isEra,_isSlat,_isMisc,_hash);
} else {
{
- [_vehicle, _x, _iterateThroughConfig, _hitpointAliases] call _iterateThroughConfig;
+ _x call _fnc_iterateThroughConfig;
} forEach configProperties [_config, "isClass _x", true];
};
};
-private _hitpointAliases = [_vehicleConfig >> QGVAR(hitpointAlias), "ARRAY", []] call CBA_fnc_getConfigEntry;
-TRACE_1("hitpoint alias",_hitpointAliases);
-[_vehicle, _hitpointsConfig, _iterateThroughConfig, _hitpointAliases] call _iterateThroughConfig;
-[_vehicle, _turretConfig, _iterateThroughConfig, _hitpointAliases] call _iterateThroughConfig;
+private _turretConfig = _vehicleConfig >> "Turrets";
+private _eraHitpoints = (getArray (_vehicleConfig >> QGVAR(eraHitpoints))) apply {toLowerANSI _x};
+private _slatHitpoints = (getArray (_vehicleConfig >> QGVAR(slatHitpoints))) apply {toLowerANSI _x};
-_vehicle allowCrewInImmobile true;
-private _eh = _vehicle getVariable [QGVAR(handleDamage), nil];
-if (isNil "_eh") then {
- // no clue why, but for some reason this needs to exec'd next frame or else it isnt the last event handler in the system.
- // Maybe its overridden somewhere else, but this makes sure it is the last one
- [{
- params ["_vehicle"];
- TRACE_1("EH not added yet - added eh now",_vehicle);
- private _hd = _vehicle addEventHandler ["HandleDamage", { _this call FUNC(handleDamage) }];
- _vehicle setVariable [QGVAR(handleDamage), _hd];
- }, [_vehicle]] call CBA_fnc_execNextFrame;
+private _fnc_toLowerCase = {
+ _this apply {
+ if (_x isEqualType []) then {
+ _x call _fnc_toLowerCase
+ } else {
+ toLowerANSI _x
+ };
+ };
};
+
+// Convert areas to lower case
+private _hitPointAliases = (getArray (_vehicleConfig >> QGVAR(hitpointAlias))) call _fnc_toLowerCase;
+
+TRACE_1("hitpoint alias",_hitPointAliases);
+
+_hitPointsConfig call _fnc_iterateThroughConfig;
+_turretConfig call _fnc_iterateThroughConfig;
+
+GVAR(vehicleClassesHitPointHash) set [_typeOf, _hitPointHash];
+
+nil
diff --git a/addons/vehicle_damage/functions/fnc_blowOffTurret.sqf b/addons/vehicle_damage/functions/fnc_blowOffTurret.sqf
index 818fe6f6ef8..9c9e5036da6 100644
--- a/addons/vehicle_damage/functions/fnc_blowOffTurret.sqf
+++ b/addons/vehicle_damage/functions/fnc_blowOffTurret.sqf
@@ -10,7 +10,7 @@
* None
*
* Example:
- * (vehicle player) call ace_vehicle_damage_fnc_blowOffTurret
+ * cursorObject call ace_vehicle_damage_fnc_blowOffTurret
*
* Public: No
*/
@@ -19,6 +19,7 @@
// The sudden change in the model would cause nearby PhysX objects to get stuck
[{
params ["_vehicle"];
+ TRACE_1("blowOffTurret",_vehicle);
(getArray (configOf _vehicle >> QGVAR(turret))) params [["_model", "", [""]], ["_offset", [0, 0, 0], [[]], 3]];
diff --git a/addons/vehicle_damage/functions/fnc_calculatePenetrationInfo.sqf b/addons/vehicle_damage/functions/fnc_calculatePenetrationInfo.sqf
deleted file mode 100644
index 4e847c2d367..00000000000
--- a/addons/vehicle_damage/functions/fnc_calculatePenetrationInfo.sqf
+++ /dev/null
@@ -1,118 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: tcvm
- * Calculates whether or not hit penetrated given armour or not. Only enabled with advanced penetration simulation turned on.
- *
- * Arguments:
- * 0: Source of damage
- * 1: The vehicle
- * 2: Projectile that hit
- * 3: Hitpoint damaged
- *
- * Return Value:
- * None
- *
- * Example:
- * [myVehicle, projectile, 5, 0.663] call ace_vehicle_damage_fnc_calculatePenetrationInfo;
- *
- * Public: No
- */
-
-params ["_source", "_vehicle", "_projectileData", "_hitpointConfig"];
-_projectileData params ["_projectileType", "_projectileConfig"];
-/*
- http://www.longrods.ch/peneq.php
- https://www.scribd.com/doc/267210898/57-mm-APFSDS-2-000-m#download
- 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)
- L = Total length of penetrator in millimeters (always 950mm)
- Lw = Working length of rod in millimeters
- Vt = impact velocity in Kilometers/Second
- 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
- n = -0.2342
-
- Cofficients:
- m = -0.224
- b0 = 0.283
- b1 = 0.0656
-*/
-
-private _enabled = ([_hitpointConfig >> QGVAR(enabled), "NUMBER", 0] call CBA_fnc_getConfigEntry) == 1;
-#define MATERIAL_ARRAY ([[0, 0, 0, 0, 0, 0], "steel", [7850, 500, 1.104, 9874, 0.3598, -0.2342], "tungsten", [19300, 0, 0.994, 134.5, -0.148], "depleted_uranium", [18600, 0, 0.825, 90, -0.0849]])
-private _rodMaterialStr = [_projectileConfig >> QGVAR(material), "STRING", "tungsten"] call CBA_fnc_getConfigEntry;
-private _rodMaterialParams = MATERIAL_ARRAY select (1 + MATERIAL_ARRAY find toLowerANSI _rodMaterial);
-
-if !(_enabled) exitWith { [false, 0, 0, 0, 0] };
-if (_rodMaterialParams isEqualTo [0, 0, 0, 0, 0, 0]) exitWith { [] };
-
-private _tanX = 2 * (0.283 * 0.0656 * (1));
-private _tanh = 1 / (((exp _tanX) - 1) / ((exp _tanX) + 1));
-private _cosm = (cos 0) ^ -0.224;
-private _lw = 950; // technically this would be something else depending on armour slant but this is a good enough aproximation
-
-private _aproximateVelocity = 0;
-
-private _perf_pLw = 0;
-private _pen_pLw = 0;
-if (_rodMaterialStr isEqualTo "steel") then {
- _rodMaterialParams params ["_Pp", "_BHNP", "_a", "_c", "_k", "_n"];
- private _exp = (-_c * 350^_k * _BHNP^_n) / (_Pp * _aproximateVelocity * _aproximateVelocity);
- _pen_pLw = _a * _tanh * sqrt (_Pp / 7840) * exp _exp;
- _perf_pLw = _pen_pLw * _cosm;
-} else {
- _rodMaterialParams params ["_Pp", "_BHNP", "_a", "_c0", "_c1"];
- private _exp = (-(_c0 + _c1 * 350) * 350) / (_Pp * _aproximateVelocity * _aproximateVelocity);
- _pen_pLw = _a * _tanh * _cosm * sqrt (_Pp / 7840) * exp _exp;
- _perf_pLw = _pen_pLw * _cosm;
-};
-
-private _perforationDistance = _lw * _perf_pLw;
-private _penetrationDistance = _lw * _pen_pLw;
-private _hitpointEffectiveArmour = [_hitpointConfig >> QGVAR(thickness), "NUMBER", 0] call CBA_fnc_getConfigEntry;
-private _hitpointEffectiveSlope = [_hitpointConfig >> QGVAR(slope), "NUMBER", 0] call CBA_fnc_getConfigEntry;
-_penetrationDistance = _penetrationDistance * cos (_hitpointEffectiveSlope);
-
-[_penetrationDistance > _hitpointEffectiveArmour, _penetrationDistance - _hitpointEffectiveArmour, _penetrationDistance, _perforationDistance, _hitpointEffectiveArmour]
diff --git a/addons/vehicle_damage/functions/fnc_detonate.sqf b/addons/vehicle_damage/functions/fnc_detonate.sqf
deleted file mode 100644
index 7f0dce28c93..00000000000
--- a/addons/vehicle_damage/functions/fnc_detonate.sqf
+++ /dev/null
@@ -1,27 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: tcvm
- * Detonates vehicle ammo and heavily wounds all inside.
- *
- * Arguments:
- * 0: The vehicle
- * 1: Person who caused detonation (default: objNull)
- *
- * Return Value:
- * None
- *
- * Example:
- * [tank2] call ace_vehicle_damage_fnc_detonate;
- *
- * Public: No
- */
-
-params ["_vehicle", ["_injurer", objNull]];
-
-if (((_vehicle call EFUNC(cookoff,getVehicleAmmo)) select 1) > 0) then {
- {
- [QGVAR(medicalDamage), [_x, _injurer, _injurer], _x] call CBA_fnc_targetEvent;
- } forEach (crew _vehicle);
-};
-
-[QEGVAR(cookoff,detonateAmmunitionServer), [_vehicle, false, _injurer, _injurer]] call CBA_fnc_serverEvent;
diff --git a/addons/vehicle_damage/functions/fnc_handleBail.sqf b/addons/vehicle_damage/functions/fnc_handleBail.sqf
index 97aad2cd321..6c9f23c82bc 100644
--- a/addons/vehicle_damage/functions/fnc_handleBail.sqf
+++ b/addons/vehicle_damage/functions/fnc_handleBail.sqf
@@ -4,64 +4,66 @@
* Handles whether or not the crew should bail.
*
* Arguments:
- * 0: The vehicle
- * 1: Can the vehicle move?
- * 2: Can the vehicle shoot?
+ * 0: Vehicle
*
* Return Value:
* None
*
* Example:
- * [tank1, false, true] call ace_vehicle_damage_fnc_handleBail
+ * cursorObject call ace_vehicle_damage_fnc_handleBail
*
* Public: No
*/
-params ["_vehicle", "_canMove", "_canShoot"];
-private _isCar = (_vehicle isKindOf "Car" && { !(_vehicle isKindOf "Wheeled_APC_F") });
+params ["_vehicle"];
+TRACE_1("handleBail",_vehicle);
-if (_canMove) then {
- _canMove = alive driver _vehicle;
-};
+private _isCar = _vehicle isKindOf "Car" && {!(_vehicle isKindOf "Wheeled_APC_F")};
-if (_canShoot) then {
- _canShoot = alive gunner _vehicle;
-};
+// canFire command is broken, hence the variable
+private _canMove = (_vehicle getVariable [QGVAR(canMove), true]) && {alive driver _vehicle};
+private _canShoot = (_vehicle getVariable [QGVAR(canShoot), true]) && {alive gunner _vehicle};
-_vehicle setVariable[QGVAR(canMove), _canMove];
-_vehicle setVariable[QGVAR(canShoot), _canShoot];
+_vehicle setVariable [QGVAR(canMove), _canMove];
+_vehicle setVariable [QGVAR(canShoot), _canShoot];
private _rand = random 1;
if (_isCar) then {
- if !(_canMove) then {
- [_vehicle] spawn FUNC(abandon);
- LOG_3("[%1] can't move and is bailing and is a car [%2 | %3]",_vehicle,_canMove,_isCar);
+ if (!_canMove) then {
+ _vehicle call FUNC(abandon);
+
+ TRACE_3("car immobile - bailing",_vehicle,_canMove,_isCar);
};
} else {
- if (!_canMove && !_canShoot ) exitWith { // If you can't move and you can't shoot, you better GTFO
- [_vehicle] spawn FUNC(abandon);
- LOG_3("[%1] is a sitting duck and is bailing [%2 | %3]",_vehicle,_canMove,_canShoot);
+ // If you can't move and you can't shoot, you better GTFO
+ if (!_canMove && !_canShoot) exitWith {
+ _vehicle call FUNC(abandon);
+
+ TRACE_3("immobile and can't shoot - bailing",_vehicle,_canMove,_canShoot);
};
- if (!_canShoot && !_isCar) then {
- if (BAILOUT_CHANCE_SHOOT > _rand) then { // 50% chance of bailing out if turret/gun is destroyed
- [_vehicle] spawn FUNC(abandon);
- LOG_4("[%1] Cannot shoot and is bailing with chance [%2] [%3 | %4]",_vehicle,_rand,_canMove,_canShoot);
+ if (!_canShoot) then {
+ // 50% chance of bailing out if turret/gun is disabled
+ if (BAILOUT_CHANCE_SHOOT > _rand) then {
+ _vehicle call FUNC(abandon);
+
+ TRACE_4("can't shoot - bailing",_vehicle,_rand,_canMove,_canShoot);
} else {
_vehicle allowFleeing 1;
- LOG_4("[%1] Cannot shoot and is fleeing with chance [%2] [%3 | %4]",_vehicle,_rand,_canMove,_canShoot);
+
+ TRACE_4("fleeing",_vehicle,_rand,_canMove,_canShoot);
};
};
- if !(_canMove) then {
- if (BAILOUT_CHANCE_MOVE > _rand) then { // 80% Chance of bailing out if engine is destroyed
- [_vehicle] spawn FUNC(abandon);
- LOG_4("[%1] Cannot move and is bailing with chance [%2] [%3 | %4]",_vehicle,_rand,_canMove,_canShoot);
+ if (!_canMove) then {
+ // 80% Chance of bailing out if engine is disabled
+ if (BAILOUT_CHANCE_MOVE > _rand) then {
+ _vehicle call FUNC(abandon);
+
+ TRACE_4("immobile - bailing",_vehicle,_rand,_canMove,_canShoot);
} else {
- LOG_4("[%1] Cannot move and is bunkering with chance [%2] [%3 | %4]",_vehicle,_rand,_canMove,_canShoot);
+ TRACE_4("immobile - bunkering",_vehicle,_rand,_canMove,_canShoot);
};
};
};
-
-
diff --git a/addons/vehicle_damage/functions/fnc_handleCookoff.sqf b/addons/vehicle_damage/functions/fnc_handleCookoff.sqf
index 3e7b83ebb61..4b84e9a76e9 100644
--- a/addons/vehicle_damage/functions/fnc_handleCookoff.sqf
+++ b/addons/vehicle_damage/functions/fnc_handleCookoff.sqf
@@ -1,59 +1,82 @@
#include "..\script_component.hpp"
/*
* Author: tcvm
- * Checks hitpoint damage and determines if a vehicle should cookoff.
+ * Checks hitpoint damage and determines if a vehicle should cook off.
*
* Arguments:
- * 0: The vehicle
+ * 0: Vehicle
* 1: Chance of fire
* 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)
- * 6: Can Jet (default: true)
+ * 3: Source of damage
+ * 4: Person who caused damage
+ * 5: Part of vehicle which got hit (default: "")
+ * 6: Whether or not the vehicle can spawn ring-fire effect (default: false)
+ * 7: Whether or not the vehicle can spawn jet-fire effect (default: true)
*
* Return Value:
- * If cooked off
+ * If vehicle started or already cooking off
*
* Example:
- * [tank2, 0.1, 5] call ace_vehicle_damage_fnc_handleCookoff;
+ * [cursorObject, 0.1, 5, player, player] call ace_vehicle_damage_fnc_handleCookoff
*
* Public: No
*/
-params ["_vehicle", "_chanceOfFire", "_intensity", ["_injurer", objNull], ["_hitPart", ""], ["_canRing", false], ["_canJet", true]];
+params ["_vehicle", "_chanceOfFire", "_intensity", "_source", "_instigator", ["_hitPart", ""], ["_canRing", true], ["_canJet", true]];
+TRACE_8("handleCookoff",_vehicle,_chanceOfFire,_intensity,_source,_instigator,_hitPart,_canRing,_canJet);
// Ignore if the vehicle is already cooking off
-if (_vehicle getVariable [QEGVAR(cookoff,isCookingOff), false]) exitWith {true};
+if (_vehicle getVariable [QEGVAR(cookoff,isCookingOff), false]) exitWith {
+ TRACE_3("already cooking off",_vehicle,_chanceOfFire,_intensity);
+
+ true // return
+};
_chanceOfFire = _chanceOfFire * EGVAR(cookoff,probabilityCoef);
-if (_chanceOfFire >= random 1) exitWith {
- private _configOf = configOf _vehicle;
- private _fireDetonateChance = [_configOf >> QGVAR(detonationDuringFireProb), "number", 0] call CBA_fnc_getConfigEntry;
- if (_canRing) then {
- _canRing = ([_configOf >> QGVAR(canHaveFireRing), "number", 0] call CBA_fnc_getConfigEntry) == 1;
- };
+// Failure to cook off
+if (_chanceOfFire == 0 || {_chanceOfFire < random 1}) exitWith {
+ TRACE_3("no cook-off",_vehicle,_chanceOfFire,_intensity);
+
+ false // return
+};
- if (_canJet) then {
- _canJet = ([_configOf >> QEGVAR(cookoff,canHaveFireJet), "number", 1] call CBA_fnc_getConfigEntry) == 1;
- };
+// Vehicle will cook off
+private _configOf = configOf _vehicle;
+private _fireDetonateChance = getNumber (_configOf >> QGVAR(detonationDuringFireProb));
- private _delayWithSmoke = _chanceOfFire < random 1;
- private _detonateAfterCookoff = (_fireDetonateChance / 4) > random 1;
+if (_canRing) then {
+ _canRing = getNumber (_configOf >> QGVAR(canHaveFireRing)) == 1;
+};
+
+if (_canJet) then {
+ _canJet = getNumber (_configOf >> QEGVAR(cookoff,canHaveFireJet)) == 1;
+};
- private _source = "";
- if (_hitPart == "engine") then {
- _source = ["hit_engine_point", "HitPoints"];
- };
+private _delaySmoke = _chanceOfFire < random 1;
+private _detonateAfterCookoff = (_fireDetonateChance / 4) > random 1;
- [QEGVAR(cookOff,cookOffServer), [_vehicle, _intensity, _injurer, _injurer, _delayWithSmoke, _fireDetonateChance, _detonateAfterCookoff, _source, _canRing, _canJet]] call CBA_fnc_serverEvent;
- 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);
+private _sourceHitpoint = "";
- true
+// Passed to the selectionPosition command in cookoff
+if (_hitPart == "engine") then {
+ private _hitPoints = getAllHitPointsDamage _vehicle;
+
+ if (_hitPoints isEqualTo []) exitWith {};
+
+ // Get hitpoint for engine
+ private _index = (_hitPoints select 0) findIf {_x == "hitengine"};
+
+ if (_index == -1) exitWith {};
+
+ // Get corresponding selection
+ _sourceHitpoint = [(_hitPoints select 1) select _index, "HitPoints", "AveragePoint"];
};
-LOG_2("[%1] No Cook-off - Chance of fire [%2]",_vehicle,_chanceOfFire);
-false
+[QEGVAR(cookOff,cookOffServer), [_vehicle, _intensity, _source, _instigator, _delaySmoke, _fireDetonateChance, _detonateAfterCookoff, _sourceHitpoint, _canRing, _canJet]] call CBA_fnc_serverEvent;
+TRACE_4("cooking-off",_vehicle,_chanceOfFire,_delaySmoke,_detonateAfterCookoff);
+
+// Abandon vehicle
+_vehicle call FUNC(abandon);
+
+true // return
diff --git a/addons/vehicle_damage/functions/fnc_handleDamage.sqf b/addons/vehicle_damage/functions/fnc_handleDamage.sqf
index 51bf1be97da..733d4f23214 100644
--- a/addons/vehicle_damage/functions/fnc_handleDamage.sqf
+++ b/addons/vehicle_damage/functions/fnc_handleDamage.sqf
@@ -4,91 +4,88 @@
* Called by "HandleDamage" event handler. Sets up hit array for this frame's damage.
*
* Arguments:
- * 0: The vehicle
- * 1: Name of selection where unit was damaged (unused)
- * 2: Damage taken
- * 3: Source unit of damage (unused)
+ * 0: Vehicle
+ * 1: Selection
+ * 2: New level of damage
+ * 3: Source of damage
* 4: Projectile that caused damage
- * 5: Hit part index of hit point
- * 6: Instigator of damage (unused)
- * 7: Hit point config name
+ * 5: Hit index
+ * 6: Person who caused damage
+ * 7: Hit point
*
* Return Value:
- * Current or maximum damage of part
+ * Current or maximum damage of part
*
* Example:
- * [myVehicle, projectile, 5, 0.663] call ace_vehicle_damage_fnc_handleDamage;
+ * [cursorObject, "hit_engine_point", 0.5, player, projectile, 1, player, "HitEngine"] call ace_vehicle_damage_fnc_handleDamage
*
* Public: No
*/
-params ["_vehicle", "_hitSelection", "_damage", "", "_projectile", "_hitIndex", "", "_hitPoint"];
-TRACE_6("HandleDamage event inputs",_vehicle,_hitSelection,_damage,_projectile,_hitIndex,_hitPoint);
+params ["_vehicle", "_selection", "_newDamage", "_source", "_projectile", "_hitIndex", "_instigator", "_hitPoint"];
+TRACE_8("handleDamage",_vehicle,_selection,_newDamage,_source,_projectile,_hitIndex,_instigator,_hitPoint);
-private _returnHit = if (_hitSelection isNotEqualTo "") then {
+if (!local _vehicle) exitWith {};
+
+private _currentDamage = if (_selection != "") 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.
- private _hitHash = _vehicle getVariable [QGVAR(hitHash), nil];
- if (isNil "_hitHash") then {
- _hitHash = [[], nil] call CBA_fnc_hashCreate;
- };
- private _currentFrameArray = [_hitHash, diag_frameNo] call CBA_fnc_hashGet;
- if (isNil "_currentFrameArray") then {
- _currentFrameArray = [];
- };
- // if a valid hit, process it
- if !((_hitPoint find "#light") >= 0 || { _damage <= 0 }) then {
- if (_currentFrameArray isEqualTo []) then {
- [{
- params ["_vehicle", "_processingFrame"];
- 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 _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;
- };
-
- [_hitHash, diag_frameNo, _currentFrameArray] call CBA_fnc_hashSet;
- _vehicle setVariable [QGVAR(hitHash), _hitHash];
+ // If an invalid hit, don't process it
+ if (_newDamage <= 0 || {"#light" in _hitPoint}) exitWith {};
+
+ // Set up hit array so we can execute all damage next frame. Always in order of hit done.
+ private _hitHash = _vehicle getVariable QGVAR(hitHash);
+ private _currentFrameArray = _hitHash getOrDefault [diag_frameNo, [], true];
+
+ if (_currentFrameArray isEqualTo []) then {
+ [{
+ params ["_vehicle", "_processingFrame"];
+
+ private _hitHash = _vehicle getVariable QGVAR(hitHash);
+ private _hitArray = _hitHash deleteAt _processingFrame;
+
+ if (_hitArray isEqualTo []) exitWith {};
+
+ TRACE_3("processing data from old frame",diag_frameNo,_processingFrame,_hitArray);
+
+ // Start from newest damage and work backwards
+ {
+ _x params ["_vehicle", "_selection", "_newDamage", "_source", "_projectile", "_hitIndex", "_instigator", "_hitPoint"];
+
+ private _currentDamage = if (_selection != "") then {
+ _vehicle getHitIndex _hitIndex
+ } else {
+ damage _vehicle
+ };
+
+ private _addedDamage = _newDamage - _currentDamage;
+
+ TRACE_1("handleDamage",_currentDamage);
+
+ if !([_vehicle, _hitPoint, _hitIndex, _selection, _addedDamage, _projectile, _source, _instigator] call FUNC(handleVehicleDamage)) exitWith {
+ TRACE_2("cancelling rest of vehicle damage queue",(count (_hitArray#1)) - _forEachIndex,count (_hitArray#1))
+ };
+ } forEachReversed _hitArray;
+ }, [_vehicle, diag_frameNo]] call CBA_fnc_execNextFrame;
};
+
+ _currentFrameArray pushBack _this;
};
-// 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 _criticalDamageIndex = (CRITICAL_HITPOINTS findIf { _x isEqualTo _hitPoint }) + 1;
-if (_criticalDamageIndex > 0) then {
- _returnHit = (_returnHit min (CRITICAL_HITPOINTS select _criticalDamageIndex));
+// 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 _criticalDamageIndex = CRITICAL_HITPOINTS findIf {_x == _hitPoint};
+
+if (_criticalDamageIndex != -1) then {
+ _currentDamage = _currentDamage min (CRITICAL_HITPOINTS_THRESHOLDS select _criticalDamageIndex);
};
-if (_hitPoint isEqualTo "" && _hitIndex < 0) then {
- _returnHit = _returnHit min 0.89;
+if (_hitPoint == "" && {_hitIndex < 0}) then {
+ _currentDamage = _currentDamage min 0.89;
};
-_returnHit
+_currentDamage
diff --git a/addons/vehicle_damage/functions/fnc_handleDamageEjectIfDestroyed.sqf b/addons/vehicle_damage/functions/fnc_handleDamageEjectIfDestroyed.sqf
index fdf6f9c6d3a..8169e140e2c 100644
--- a/addons/vehicle_damage/functions/fnc_handleDamageEjectIfDestroyed.sqf
+++ b/addons/vehicle_damage/functions/fnc_handleDamageEjectIfDestroyed.sqf
@@ -20,7 +20,7 @@ params ["_vehicle", "", "", "", "_ammo"];
if (alive _vehicle) exitWith {};
-TRACE_2("ejectIfDestroyed HDEH",typeOf _vehicle,_this);
+TRACE_2("handleDamageEjectIfDestroyed",typeOf _vehicle,_this);
if (!IS_EXPLOSIVE_AMMO(_ammo)) then {
{
@@ -30,4 +30,5 @@ if (!IS_EXPLOSIVE_AMMO(_ammo)) then {
} forEach crew _vehicle;
};
+//IGNORE_PRIVATE_WARNING ["_thisEventHandler"];
_vehicle removeEventHandler ["HandleDamage", _thisEventHandler];
diff --git a/addons/vehicle_damage/functions/fnc_handleDetonation.sqf b/addons/vehicle_damage/functions/fnc_handleDetonation.sqf
index 8f317323fa7..9fdaa3b0c27 100644
--- a/addons/vehicle_damage/functions/fnc_handleDetonation.sqf
+++ b/addons/vehicle_damage/functions/fnc_handleDetonation.sqf
@@ -1,37 +1,59 @@
#include "..\script_component.hpp"
/*
- * Author: tcvm
- * Checks hitpoint damage and determines if a vehicle should cookoff.
+ * Author: tcvm, johnb43
+ * Checks hitpoint damage and determines if a vehicle should detonate its ammo.
*
* Arguments:
- * 0: The vehicle
+ * 0: Vehicle
* 1: Chance of detonation
- * 2: Vehicle ammo array
- * 3: How much explosive ammo is inside vehicle
- * 4: How much non-explosive ammo inside vehicle
- * 5: Person who instigated damage (default: objNull)
+ * 2: If the vehicle should be knocked out
+ * 3: If the crew should be injured
+ * 4: Source of damage
+ * 5: Person who caused damage
*
* Return Value:
- * Detonated
+ * None
*
* Example:
- * [tank2, 0.5] call ace_vehicle_damage_fnc_handleDetonation;
+ * [cursorObject, 0.5, true, player, player] call ace_vehicle_damage_fnc_handleDetonation
*
* Public: No
*/
-params ["_vehicle", "_chanceOfDetonate", "_vehicleAmmo", "_explosiveAmmoCount", "_nonExplosiveAmmoCount", ["_injurer", objNull]];
-
-private _isKnockedOut = _explosiveAmmoCount > 0;
+params ["_vehicle", "_chanceToDetonate", "_knockOut", "_injureCrew", "_source", "_instigator"];
// Ignore if the vehicle is already detonating ammo
-if (_vehicle getVariable [QEGVAR(cookoff,isAmmoDetonating), false]) exitWith {_isKnockedOut};
+if (_vehicle getVariable [QEGVAR(cookoff,isAmmoDetonating), false]) exitWith {
+ TRACE_2("already detonating",_vehicle,_chanceToDetonate);
+
+ if (_knockOut) then {
+ [_vehicle, _source, _instigator] call FUNC(knockOut);
+ };
+
+ _knockOut // return
+};
+
+// Failure to detonate
+if (_chanceToDetonate == 0 || {_chanceToDetonate < random 1}) exitWith {
+ TRACE_2("no detonation",_vehicle,_chanceToDetonate);
+
+ false // return
+};
+
+// Vehicle will be detonated
+if (_injureCrew) then {
+ {
+ [QGVAR(medicalDamage), [_x, _source, _instigator], _x] call CBA_fnc_targetEvent;
+ } forEach (crew _vehicle);
+};
+
+TRACE_2("detonation",_vehicle,_chanceToDetonate);
+
+// Detonate the vehicle
+[QEGVAR(cookoff,detonateAmmunitionServer), [_vehicle, false, _source, _instigator]] call CBA_fnc_serverEvent;
-if (_chanceOfDetonate >= random 1) exitWith {
- [_vehicle, _injurer, _vehicleAmmo] call FUNC(detonate);
- LOG_2("Detonating [%1] with a chance-to-detonate [%2]",_vehicle,_chanceOfDetonate);
- _isKnockedOut
+if (_knockOut) then {
+ [_vehicle, _source, _instigator] call FUNC(knockOut);
};
-LOG_2("[%1] No Detonation - Chance of detonation [%2]",_vehicle,_chanceOfDetonate);
-false
+_knockOut // return
diff --git a/addons/vehicle_damage/functions/fnc_handleVehicleDamage.sqf b/addons/vehicle_damage/functions/fnc_handleVehicleDamage.sqf
index 02033b83be7..b0540de484f 100644
--- a/addons/vehicle_damage/functions/fnc_handleVehicleDamage.sqf
+++ b/addons/vehicle_damage/functions/fnc_handleVehicleDamage.sqf
@@ -4,96 +4,101 @@
* Process vehicle hit.
*
* Arguments:
- * 0: The vehicle
- * 1: The hitpoint which got hit
- * 2: The index of what got hit
- * 3: The damage that the new part took