From dcd91276b682dba0a0982103de86c1ea8ecc2fc8 Mon Sep 17 00:00:00 2001 From: 3Mydlo3 Date: Fri, 13 Dec 2024 12:59:18 +0100 Subject: [PATCH] Initial commit --- .editorconfig | 15 + .gitattributes | 10 + .github/CODEOWNERS | 3 + .github/PULL_REQUEST_TEMPLATE.md | 9 + .github/labels.json | 43 ++ .github/release-drafter.yml | 33 ++ .github/workflows/arma.yml | 53 +++ .github/workflows/labels.yml | 11 + .github/workflows/release-drafter.yml | 16 + .github/workflows/release.yml | 70 ++++ .github/workflows/rust.yml | 23 ++ .gitignore | 15 + .hemtt/hooks/pre_build/set_version.rhai | 14 + .hemtt/project.toml | 90 +++++ .vscode/launch.json | 15 + .vscode/settings.json | 61 +++ .vscode/tasks.json | 14 + AUTHORS.txt | 14 + LICENSE | 369 ++++++++++++++++++ README.md | 58 +++ addons/common/$PBOPREFIX$ | 1 + addons/common/CfgEventHandlers.hpp | 15 + addons/common/XEH_PREP.hpp | 2 + addons/common/XEH_postInit.sqf | 1 + addons/common/XEH_preInit.sqf | 8 + addons/common/XEH_preStart.sqf | 2 + addons/common/config.cpp | 17 + addons/common/functions/fnc_isEmptyString.sqf | 22 ++ addons/common/functions/fnc_systemChat.sqf | 24 ++ addons/common/functions/script_component.hpp | 1 + addons/common/script_component.hpp | 18 + addons/common/stringtable.xml | 17 + addons/main/$PBOPREFIX$ | 1 + addons/main/CfgEden.hpp | 11 + addons/main/CfgModuleCategories.hpp | 12 + addons/main/DisplayEden.hpp | 22 ++ addons/main/README.md | 7 + addons/main/config.cpp | 19 + addons/main/script_component.hpp | 14 + addons/main/script_debug.hpp | 24 ++ addons/main/script_macros.hpp | 31 ++ addons/main/script_mod.hpp | 16 + addons/main/script_version.hpp | 3 + addons/main/stringtable.xml | 18 + addons/main/ui/logo_sm_ca.paa | Bin 0 -> 49205 bytes build.bat | 3 + hemtt.toml | 49 +++ meta.cpp | 2 + mod.cpp | 11 + 49 files changed, 1307 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/CODEOWNERS create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/labels.json create mode 100644 .github/release-drafter.yml create mode 100644 .github/workflows/arma.yml create mode 100644 .github/workflows/labels.yml create mode 100644 .github/workflows/release-drafter.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/rust.yml create mode 100644 .gitignore create mode 100644 .hemtt/hooks/pre_build/set_version.rhai create mode 100644 .hemtt/project.toml create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 AUTHORS.txt create mode 100644 LICENSE create mode 100644 README.md create mode 100644 addons/common/$PBOPREFIX$ create mode 100644 addons/common/CfgEventHandlers.hpp create mode 100644 addons/common/XEH_PREP.hpp create mode 100644 addons/common/XEH_postInit.sqf create mode 100644 addons/common/XEH_preInit.sqf create mode 100644 addons/common/XEH_preStart.sqf create mode 100644 addons/common/config.cpp create mode 100644 addons/common/functions/fnc_isEmptyString.sqf create mode 100644 addons/common/functions/fnc_systemChat.sqf create mode 100644 addons/common/functions/script_component.hpp create mode 100644 addons/common/script_component.hpp create mode 100644 addons/common/stringtable.xml create mode 100644 addons/main/$PBOPREFIX$ create mode 100644 addons/main/CfgEden.hpp create mode 100644 addons/main/CfgModuleCategories.hpp create mode 100644 addons/main/DisplayEden.hpp create mode 100644 addons/main/README.md create mode 100644 addons/main/config.cpp create mode 100644 addons/main/script_component.hpp create mode 100644 addons/main/script_debug.hpp create mode 100644 addons/main/script_macros.hpp create mode 100644 addons/main/script_mod.hpp create mode 100644 addons/main/script_version.hpp create mode 100644 addons/main/stringtable.xml create mode 100644 addons/main/ui/logo_sm_ca.paa create mode 100644 build.bat create mode 100644 hemtt.toml create mode 100644 meta.cpp create mode 100644 mod.cpp diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..3d67324 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[$PBOPREFIX$] +insert_final_newline = false diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..0823608 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,10 @@ +* text=auto +*.png binary +*.jpg binary +*.paa binary + +# Change GitHub language categorisation +*.cpp linguist-language=SQF +*.hpp linguist-language=SQF +*.inc linguist-language=SQF +include/* linguist-vendored diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..e417650 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,3 @@ +# https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners +# +* @ArmaForces/sqf-devs diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..4b7aa51 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,9 @@ +**When merged this pull request will:** +- Describe what this pull request will do +- Each change in a separate line + + diff --git a/.github/labels.json b/.github/labels.json new file mode 100644 index 0000000..b736b8d --- /dev/null +++ b/.github/labels.json @@ -0,0 +1,43 @@ +[ + { + "name": "bug", + "color": "#d73a4a", + "description": "Something isn't working" + }, + { + "name": "bugfix", + "color": "#5e7f03", + "description": "Fix for a bug" + }, + { + "name": "documentation", + "color": "#0075ca", + "description": "Improvements or additions to documentation" + }, + { + "name": "duplicate", + "color": "#cfd3d7", + "description": "This issue or pull request already exists" + }, + { + "name": "feature", + "color": "#21c2c4", + "description": "New feature or request" + }, + { + "name": "enhancement", + "color": "#a2eeef", + "description": "Fixes and improvements for existing feature" + }, + { + "name": "cleanup", + "color": "#00ffcc", + "description": "Code cleanup for existing feature" + }, + { + "name": "ignore changelog", + "color": "#fff", + "description": "Do not add to changelog" + } +] + diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml new file mode 100644 index 0000000..c8dfa9c --- /dev/null +++ b/.github/release-drafter.yml @@ -0,0 +1,33 @@ +branches: + - master + +name-template: 'v$NEXT_PATCH_VERSION' +tag-template: 'v$NEXT_PATCH_VERSION' + +categories: + - title: '**ADDED:**' + labels: + - feature + - title: '**FIXED:**' + labels: + - bugfix + - title: '**CHANGED:**' + labels: + - cleanup + - enhancement + +exclude-labels: + - 'ignore changelog' + +change-template: '- $TITLE (#$NUMBER)' +template: | + _ArmaForces NEW_MOD_PRETTY release._ + + ## Change Log Summary + + $CHANGES + +replacers: + # Category titles + - search: '/\#\# (\*\*(ADDED|FIXED|CHANGED):\*\*)/g' + replace: '$1' diff --git a/.github/workflows/arma.yml b/.github/workflows/arma.yml new file mode 100644 index 0000000..a39bd54 --- /dev/null +++ b/.github/workflows/arma.yml @@ -0,0 +1,53 @@ +name: Arma + +on: + push: + branches: + - master + pull_request: + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - name: Checkout the source code + uses: actions/checkout@master + - name: Validate SQF + run: python3 tools/sqf_validator.py + - name: Validate Return Types + run: python3 tools/return_checker.py + - name: Validate Config + run: python3 tools/config_style_checker.py + - name: Validate Stringtables + run: python3 tools/stringtable_validator.py + - name: Check for BOM + uses: arma-actions/bom-check@master + + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout the source code + uses: actions/checkout@master + - name: Lint (sqflint) + uses: arma-actions/sqflint@master + continue-on-error: true # No failure due to many false-positives + + build: + runs-on: windows-2022 + steps: + - name: Checkout the source code + uses: actions/checkout@master + - name: Pull Arma3Tools + run: | + echo ${{ secrets.CR_PAT }} | docker login -u ${{ secrets.CR_USER }} --password-stdin ghcr.io + docker pull ghcr.io/armaforces/arma3tools:v2 + - name: Build using HEMTT + run: | + docker run -v "$(pwd):c:/workdir" -e CI=$True ghcr.io/armaforces/arma3tools:v2 hemtt release + + - uses: actions/upload-artifact@v2 + with: + name: armaforces_NEW_MOD_SNAKE + path: | + releases/*.zip + !releases/NEW_MOD_ABBR-latest.zip diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml new file mode 100644 index 0000000..4be2b7a --- /dev/null +++ b/.github/workflows/labels.yml @@ -0,0 +1,11 @@ +on: issues +name: Create Default Labels +jobs: + labels: + name: Default Labels Action + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: lannonbr/issue-label-manager-action@2.0.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml new file mode 100644 index 0000000..9093115 --- /dev/null +++ b/.github/workflows/release-drafter.yml @@ -0,0 +1,16 @@ +name: Release Drafter + +on: + push: + branches: + - master + +jobs: + draft: + runs-on: ubuntu-latest + steps: + - name: Release Drafter + if: github.repository == 'ArmaForces/NEW_MOD_PRETTY' + uses: release-drafter/release-drafter@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..3ccf593 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,70 @@ +name: Release + +on: + release: + types: + - published + +jobs: + build_addon: + runs-on: windows-2022 + steps: + - name: Set VERSION env + run: echo VERSION=${GITHUB_REF:11} >> $GITHUB_ENV + + - uses: actions/checkout@v2 + + - name: Pull Arma3Tools + run: | + echo ${{ secrets.CR_PAT }} | docker login -u ${{ secrets.CR_USER }} --password-stdin ghcr.io + docker pull ghcr.io/armaforces/arma3tools:v2 + + - name: Build using HEMTT + run: | + docker run -v "$(pwd):c:/workdir" -e CI=$True ghcr.io/armaforces/arma3tools:v2 hemtt release + + - uses: actions/upload-artifact@v2 + with: + name: hemttout + path: .hemttout/ + if-no-files-found: error + retention-days: 1 + + - uses: actions/upload-artifact@v2 + with: + name: releases + path: releases/ + if-no-files-found: error + retention-days: 7 + + release_addon: + runs-on: ubuntu-latest + needs: build_addon + steps: + - name: Set VERSION env + run: echo VERSION=${GITHUB_REF:11} >> $GITHUB_ENV + + # Upload to GitHub + - uses: actions/download-artifact@v2 + with: + name: releases + path: releases + - uses: softprops/action-gh-release@v1 + with: + files: 'releases/NEW_MOD_ABBR-${{ env.VERSION }}-*.zip' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # Upload to Steam Workshop + - uses: actions/download-artifact@v2 + with: + name: hemttout + path: .hemttout + - uses: arma-actions/workshop-upload@v1 + with: + itemId: '1934142795' # Id of item to update + contentPath: '.hemttout/release' + changelog: 'https://github.com/ArmaForces/NEW_MOD_PRETTY/releases/tag/v${{ env.VERSION }}' + env: + STEAM_USERNAME: ${{ secrets.STEAM_USERNAME }} + STEAM_PASSWORD: ${{ secrets.STEAM_PASSWORD }} diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml new file mode 100644 index 0000000..fac656b --- /dev/null +++ b/.github/workflows/rust.yml @@ -0,0 +1,23 @@ +name: Rust Checks + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + fmt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: rustfmt + run: cd extension && cargo fmt -- --check + clippy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: clippy + run: | + rustup -q component add clippy + cd extension && cargo clippy --all-features -- -D warnings diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..25afacd --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# Build output +/.hemttout/ + +# Releases +/releases/ + +hemtt +hemtt.exe +.hemtt/local +symbols/* + +# Bikey +*.biprivatekey + +extension/target/ diff --git a/.hemtt/hooks/pre_build/set_version.rhai b/.hemtt/hooks/pre_build/set_version.rhai new file mode 100644 index 0000000..f26f229 --- /dev/null +++ b/.hemtt/hooks/pre_build/set_version.rhai @@ -0,0 +1,14 @@ + +let modCpp = HEMTT_VFS + .join("mod.cpp") + .open_file() + .read() +; + +modCpp.replace("0.0.0", HEMTT.project().version().to_string_short()); + +HEMTT_VFS + .join("mod.cpp") + .create_file() + .write(modCpp) +; diff --git a/.hemtt/project.toml b/.hemtt/project.toml new file mode 100644 index 0000000..ba33dfb --- /dev/null +++ b/.hemtt/project.toml @@ -0,0 +1,90 @@ + +name = "ArmaForces NEW_MOD_PRETTY" +mainprefix = "z" +prefix = "NEW_MOD_ABBR" + +[files] +include = [ + "LICENSE", + "mod.cpp", + "README.md", + "armaforces_NEW_MOD_SNAKE_x64.dll", +] + +exclude = ["*.psd", "*.png", "*.tga"] + +[properties] +author = "ArmaForces" + +[version] +path = "addons/main/script_version.hpp" + +# Unused in HEMTT v1.11 or higher, kept for backwards compatibility +[asc] +exclude = [ + ".inc.sqf", +] + +[hemtt.launch.default] +workshop = [ + "450814997", # CBA_A3 + "2369477168", # ADT +] +parameters = [ + "-name=dev", + "-window", +] + +[hemtt.launch.ace] +workshop = [ + "450814997", # CBA_A3 + "2369477168", # ADT + "463939057", # ACE +# "766491311", # KKA3 ACE Extension +] +parameters = [ + "-name=dev", +] + +[hemtt.launch.cup] +workshop = [ + "450814997", # CBA_A3 + "2369477168", # ADT + "583496184", # CUP Terrains - Core + "583544987", # CUP Terrains - Maps +] +parameters = [ + "-name=dev", + "-window", +] + +[hemtt.launch.vn] +workshop = [ + "450814997", # CBA_A3 + "2369477168", # ADT +] +parameters = [ + "-name=dev", + "-window", +] +dlc = [ + "S.O.G. Prairie Fire", +] + +[hemtt.launch.ww2] +workshop = [ + "450814997", # CBA_A3 + "2369477168", # ADT +] +parameters = [ + "-name=dev", + "-window", +] +dlc = [ + "Spearhead 1944", +] + +[hemtt.launch.gm] +dlc = [ + "Global Mobilization", +] diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..5d22a4a --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "ADE", + "type": "sqf", + "request": "launch", + "missionRoot": "${workspaceFolder}", + "scriptPrefix": "z\\NEW_MOD_ABBR" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..edd1b06 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,61 @@ +{ + "sqf.enableCBA": true, + "sqf.enableACE3": true, + "files.associations": { + "*.hpp": "ext" + }, + "sqflint.ignoredVariables": [ + "_input0", + "_thisArgs", + "_thisId", + "_thisType", + "cba_disposable_replaceDisposableLauncher", + "cba_disposable_NormalLaunchers", + ], + "sqflint.exclude": [], + "psi-header.lang-config": [ + { + "license": "Custom", + "language": "sqf", + "rootDirFileName": "hemtt.toml", + "beforeHeader": ["#include \"script_component.hpp\""], + "begin": "/*", + "prefix": " *", + "end": " */", + "blankLinesAfter": 1, + "forceToTop": true + } + ], + "sqflint.includePrefixes": { + // Dokan PBO\P drive + "\\A3\\": "P:/a3/", + "\\a3\\": "P:/a3/", + "\\x\\": "P:/x/", + "\\z\\": "P:/z/", + }, + "psi-header.changes-tracking": { + "include": ["sqf"], + "autoHeader": "manualSave" + }, + "psi-header.templates": [ + { + "language": "sqf", + "template": [ + " Author: ", + " Function description", + "", + " Arguments:", + " 0: Objects ", + " 1: All ", + "", + " Return Value:", + " None", + "", + " Example:", + " [[bob, ted], false] call NEW_MOD_ABBR_main_fnc_example", + "", + " Public: No" + ] + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..7fd5bec --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,14 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "HEMTT Build", + "type": "shell", + "command": "hemtt build", + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} diff --git a/AUTHORS.txt b/AUTHORS.txt new file mode 100644 index 0000000..264d1e9 --- /dev/null +++ b/AUTHORS.txt @@ -0,0 +1,14 @@ +# ArmaForces NEW_MOD_PRETTY CONTRIBUTOR LIST +# If you contributed, but are not listed here, +# contact one of the Core Team members. +# +# Feel free to add yourself to this when creating +# a pull request. + +# CORE TEAM +3Mydlo3 +veteran29 + +# CONTRIBUTORS +Jonpas +mharis001 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4c9b736 --- /dev/null +++ b/LICENSE @@ -0,0 +1,369 @@ +ArmaForces NEW_MOD_PRETTY for Arma 3 +Copyright (C) 2019 veteran29 + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Additionally to the conditions of the GPL, you are granted the right to +redistribute any combination of the .pbo-files of the finished product +without having to share your source code, as long as you do not modify the +source code of the individual modules. + +When publishing a derivative of this product you may not use a name that +might create the impression that your version is an official release. + +Some folders of this project may contain a separate LICENSE or LICENSE.md +or LICENSES.md file. Should that be the case, everything in that folder +and all subfolders is subject to that license instead. + + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..80410a9 --- /dev/null +++ b/README.md @@ -0,0 +1,58 @@ +

+ +

+

+ + ArmaForces NEW_MOD_PRETTY Issues + + + ArmaForces NEW_MOD_PRETTY License + + + + +

+

Requires the latest version of CBA.

+ +**ArmaForces NEW_MOD_PRETTY** is a collaborative effort by the members of ArmaForces, polish Arma 3 community. + +Main purpose of this addon is to bend and adjust Arma 3 game features to the Group gameplay needs and style. + +The mod is on the same foundation as the ACE3 mod, using its framework, systems, tools and standards. It is entirely **open-source** and licensed under the GNU General Public License ([GPLv2](https://github.com/ArmaForces/NEW_MOD_PRETTY/blob/master/LICENSE)). + +Huge appreciation and thanks to [ACE3 Team](http://ace3mod.com/team.html) for their open-source nature and permission to use their systems. + +**Replace `NEW_MOD_PRETTY`, `NEW_MOD_SNAKE`, `NEW_MOD_ABBR` and `NEW_MOD_ABBR_CAPS` with name of your mod like in examples below.** + +- `Mods`, `mods`, `afm`, `AFM` +- `Mission Framework`, `mission_framework`, `afmf`, `AFMF` + +## Setup + +### Requirements + +- Arma 3 +- Arma 3 Tools (available on Steam) +- Run Arma 3 and Arma 3 Tools directly from Steam once to install registry entries (and again after every update) +- [HEMTT](https://github.com/synixebrett/HEMTT) binary placed in project root or globally installed + - `hemtt` (Linux) or `hemtt.exe` (Windows) or `setup.exe` (Windows global install) + +### Procedure + +_Replace `hemtt` with `hemtt.exe` on Windows._ + +- Open terminal (Linux) or command line (Windows) +- Run `$ hemtt build` to create a development build (add `-f` to overwrite already built addons) +- Run `$ hemtt build --release` to create a release build (add `-f` to overwrite already built release) +- Run `$ hemtt clean` to clean build files + +**Windows Helpers:** +- Double-click `build.bat` to create a development build + +### Recommended tools + +It's recommended to use [Visual Studio Code](https://) editor with following plugins to ensure equal development environment for all contributors: +- [EditorConfig](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) +- [SQFLint](https://marketplace.visualstudio.com/items?itemName=skacekachna.sqflint) +- [SQF Langauge](https://marketplace.visualstudio.com/items?itemName=Armitxes.sqf) +- [psioniq File Header](https://marketplace.visualstudio.com/items?itemName=psioniq.psi-header) diff --git a/addons/common/$PBOPREFIX$ b/addons/common/$PBOPREFIX$ new file mode 100644 index 0000000..e78271e --- /dev/null +++ b/addons/common/$PBOPREFIX$ @@ -0,0 +1 @@ +z\NEW_MOD_ABBR\addons\common \ No newline at end of file diff --git a/addons/common/CfgEventHandlers.hpp b/addons/common/CfgEventHandlers.hpp new file mode 100644 index 0000000..2a3f71f --- /dev/null +++ b/addons/common/CfgEventHandlers.hpp @@ -0,0 +1,15 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/addons/common/XEH_PREP.hpp b/addons/common/XEH_PREP.hpp new file mode 100644 index 0000000..cde2f95 --- /dev/null +++ b/addons/common/XEH_PREP.hpp @@ -0,0 +1,2 @@ +PREP(isEmptyString); +PREP(systemChat); diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/addons/common/XEH_postInit.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf new file mode 100644 index 0000000..ecb5d0c --- /dev/null +++ b/addons/common/XEH_preInit.sqf @@ -0,0 +1,8 @@ +#include "script_component.hpp" +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +ADDON = true; diff --git a/addons/common/XEH_preStart.sqf b/addons/common/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/addons/common/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/addons/common/config.cpp b/addons/common/config.cpp new file mode 100644 index 0000000..c45ea42 --- /dev/null +++ b/addons/common/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "NEW_MOD_ABBR_main" + }; + author = "ArmaForces"; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/addons/common/functions/fnc_isEmptyString.sqf b/addons/common/functions/fnc_isEmptyString.sqf new file mode 100644 index 0000000..49d9672 --- /dev/null +++ b/addons/common/functions/fnc_isEmptyString.sqf @@ -0,0 +1,22 @@ +#include "script_component.hpp" +/* + * Author: 3Mydlo3 + * Example function checking if string is empty. + * + * Arguments: + * 0: String to check + * + * Return Value: + * True if string is null or empty + * + * Example: + * [nil] call NEW_MOD_ABBR_common_fnc_isEmptyString + * + * Public: No + */ + +params [["_string", ""]]; + +if (_string isEqualTo "") exitWith { true }; + +false diff --git a/addons/common/functions/fnc_systemChat.sqf b/addons/common/functions/fnc_systemChat.sqf new file mode 100644 index 0000000..8754298 --- /dev/null +++ b/addons/common/functions/fnc_systemChat.sqf @@ -0,0 +1,24 @@ +#include "script_component.hpp" +/* + * Author: 3Mydlo3 + * Example function printing sytemChat message. + * + * Arguments: + * 0: Actual message + * + * Return Value: + * True if message was printed + * + * Example: + * ["Test message"] call NEW_MOD_ABBR_common_fnc_systemChat + * + * Public: No + */ + +params [["_message", ""]]; + +if (_message call FUNC(isEmptyString)) exitWith { false }; + +sytemChat _message; + +true diff --git a/addons/common/functions/script_component.hpp b/addons/common/functions/script_component.hpp new file mode 100644 index 0000000..f94dd0a --- /dev/null +++ b/addons/common/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\NEW_MOD_ABBR\addons\common\script_component.hpp" diff --git a/addons/common/script_component.hpp b/addons/common/script_component.hpp new file mode 100644 index 0000000..f591412 --- /dev/null +++ b/addons/common/script_component.hpp @@ -0,0 +1,18 @@ +#define COMPONENT common +#include "\z\NEW_MOD_ABBR\addons\main\script_mod.hpp" + +#include "\a3\ui_f\hpp\defineCommonGrids.inc" +#include "\a3\ui_f\hpp\defineResincl.inc" +#include "\a3\ui_f\hpp\defineResinclDesign.inc" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE + +#ifdef DEBUG_ENABLED_COMMON + #define DEBUG_MODE_FULL +#endif + #ifdef DEBUG_SETTINGS_COMMON + #define DEBUG_SETTINGS DEBUG_SETTINGS_COMMON +#endif + +#include "\z\NEW_MOD_ABBR\addons\main\script_macros.hpp" diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml new file mode 100644 index 0000000..d16a9f0 --- /dev/null +++ b/addons/common/stringtable.xml @@ -0,0 +1,17 @@ + + + + + ArmaForces - Common + ArmaForces - Common + + + Enable component + Włącz komponent + + + Controls whether this component is active. + Pozwala kontrolować czy komponent jest włączony. + + + diff --git a/addons/main/$PBOPREFIX$ b/addons/main/$PBOPREFIX$ new file mode 100644 index 0000000..8b84e6d --- /dev/null +++ b/addons/main/$PBOPREFIX$ @@ -0,0 +1 @@ +z\NEW_MOD_ABBR\addons\main \ No newline at end of file diff --git a/addons/main/CfgEden.hpp b/addons/main/CfgEden.hpp new file mode 100644 index 0000000..a8a162e --- /dev/null +++ b/addons/main/CfgEden.hpp @@ -0,0 +1,11 @@ +class Cfg3DEN { + class Object { + class AttributeCategories { + class PREFIX { + displayName = CSTRING(Attributes); + collapsed = 1; + class Attributes {}; + }; + }; + }; +}; diff --git a/addons/main/CfgModuleCategories.hpp b/addons/main/CfgModuleCategories.hpp new file mode 100644 index 0000000..5fca03b --- /dev/null +++ b/addons/main/CfgModuleCategories.hpp @@ -0,0 +1,12 @@ +class CfgFactionClasses { + class NO_CATEGORY; + class PREFIX: NO_CATEGORY { + displayName = CSTRING(Category); + }; +}; + +class CfgVehicleClasses { + class PREFIX##_Vehicles { + displayName = CSTRING(Category); + }; +}; diff --git a/addons/main/DisplayEden.hpp b/addons/main/DisplayEden.hpp new file mode 100644 index 0000000..908134d --- /dev/null +++ b/addons/main/DisplayEden.hpp @@ -0,0 +1,22 @@ +class CtrlMenuStrip; +class Display3DEN { + class Controls { + class MenuStrip: CtrlMenuStrip { + class Items { + items[] += {QUOTE(PREFIX)}; + class PREFIX { + text = CSTRING(Toolbar); + items[] += { + QGVAR(Wiki) + }; + }; + class GVAR(Wiki) { + text = CSTRING(ToolbarWiki); + picture = "\a3\3DEN\Data\Controls\ctrlMenu\link_ca.paa"; + weblink = "https://wiki.armaforces.com/"; + opensNewWindow = 1; + }; + }; + }; + }; +}; diff --git a/addons/main/README.md b/addons/main/README.md new file mode 100644 index 0000000..778c5aa --- /dev/null +++ b/addons/main/README.md @@ -0,0 +1,7 @@ +## Main + +Base for other components. Provides CBA Macros framework, editor categories and similar. + +### Authors + +- [veteran29](http://github.com/veteran29) diff --git a/addons/main/config.cpp b/addons/main/config.cpp new file mode 100644 index 0000000..2c86d83 --- /dev/null +++ b/addons/main/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "cba_main" + }; + author = "ArmaForces"; + VERSION_CONFIG; + }; +}; + +#include "CfgEden.hpp" +#include "CfgModuleCategories.hpp" +#include "DisplayEden.hpp" diff --git a/addons/main/script_component.hpp b/addons/main/script_component.hpp new file mode 100644 index 0000000..6d4db29 --- /dev/null +++ b/addons/main/script_component.hpp @@ -0,0 +1,14 @@ +#define COMPONENT main +#include "\z\NEW_MOD_ABBR\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE + +#ifdef DEBUG_ENABLED_MAIN + #define DEBUG_MODE_FULL +#endif + #ifdef DEBUG_SETTINGS_MAIN + #define DEBUG_SETTINGS DEBUG_SETTINGS_MAIN +#endif + +#include "\z\NEW_MOD_ABBR\addons\main\script_macros.hpp" diff --git a/addons/main/script_debug.hpp b/addons/main/script_debug.hpp new file mode 100644 index 0000000..13974f4 --- /dev/null +++ b/addons/main/script_debug.hpp @@ -0,0 +1,24 @@ + +/** + Fast Recompiling via function +**/ +// #define DISABLE_COMPILE_CACHE +// To Use: [] call NEW_MOD_ABBR_CAPS_PREP_RECOMPILE; + +#ifdef DISABLE_COMPILE_CACHE + #define LINKFUNC(x) {_this call FUNC(x)} + #define PREP_RECOMPILE_ADD_BUTTON \ + if (isNil 'PREFIX##_PREP_RECOMPILE_BUTTON') then {\ + [] spawn {\ + INFO('Adding Recompilation button');\ + [['Recomp. PREFIX', 'Recompile functions of PREFIX'], {call PREFIX##_PREP_RECOMPILE}] call EFUNC(debug_console,addButton);\ + };\ + PREFIX##_PREP_RECOMPILE_BUTTON = true;\ + } + #define PREP_RECOMPILE_START if (isNil 'PREFIX##_PREP_RECOMPILE') then {PREFIX##_RECOMPILES = []; PREFIX##_PREP_RECOMPILE = {{call _x} forEach PREFIX##_RECOMPILES;}}; private _recomp = {INFO('Compiling'); + #define PREP_RECOMPILE_END }; call _recomp; PREFIX##_RECOMPILES pushBack _recomp; PREP_RECOMPILE_ADD_BUTTON; +#else + #define LINKFUNC(x) FUNC(x) + #define PREP_RECOMPILE_START ; + #define PREP_RECOMPILE_END ; +#endif diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp new file mode 100644 index 0000000..5f3a56a --- /dev/null +++ b/addons/main/script_macros.hpp @@ -0,0 +1,31 @@ +#include "\x\cba\addons\main\script_macros_common.hpp" +#define DFUNC(module) TRIPLES(ADDON,fnc,module) +#ifdef DISABLE_COMPILE_CACHE + #undef PREP + #define PREP(fncName) DFUNC(fncName) = compile preprocessFileLineNumbers QPATHTOF(functions\DOUBLES(fnc,fncName).sqf) +#else + #undef PREP + #define PREP(fncName) [QPATHTOF(functions\DOUBLES(fnc,fncName).sqf), QFUNC(fncName)] call CBA_fnc_compileFunction +#endif + +// ACE3 reference macros +#define ACE_PREFIX ace + +#define ACEGVAR(module,var) TRIPLES(ACE_PREFIX,module,var) +#define QACEGVAR(module,var) QUOTE(ACEGVAR(module,var)) + +#define ACEFUNC(module,function) TRIPLES(DOUBLES(ACE_PREFIX,module),fnc,function) +#define QACEFUNC(module,function) QUOTE(ACEFUNC(module,function)) + +#define ACELSTRING(module,string) QUOTE(TRIPLES(STR,DOUBLES(ACE_PREFIX,module),string)) +#define ACECSTRING(module,string) QUOTE(TRIPLES($STR,DOUBLES(ACE_PREFIX,module),string)) + +// NEW_MOD_ABBR_CAPS macros +#define IS_MOD_LOADED(modclass) (isClass (configFile >> "CfgPatches" >> #modclass)) + +// Extension macros +#define EXT "armaforces_NEW_MOD_SNAKE" +#define EXT_LOG "armaforces_NEW_MOD_SNAKE_log" + +// NEW_MOD_ABBR_CAPS Debug macros +#include "\z\NEW_MOD_ABBR\addons\main\script_debug.hpp" diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp new file mode 100644 index 0000000..c043876 --- /dev/null +++ b/addons/main/script_mod.hpp @@ -0,0 +1,16 @@ +#define MAINPREFIX z +#define PREFIX NEW_MOD_ABBR + +#include "script_version.hpp" + +#define VERSION MAJOR.MINOR +#define VERSION_STR MAJOR.MINOR.PATCH +#define VERSION_AR MAJOR,MINOR,PATCH + +#define REQUIRED_VERSION 2.14 + +#ifdef COMPONENT_BEAUTIFIED + #define COMPONENT_NAME QUOTE(NEW_MOD_ABBR_CAPS - COMPONENT_BEAUTIFIED) +#else + #define COMPONENT_NAME QUOTE(NEW_MOD_ABBR_CAPS - COMPONENT) +#endif diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp new file mode 100644 index 0000000..960a5de --- /dev/null +++ b/addons/main/script_version.hpp @@ -0,0 +1,3 @@ +#define MAJOR 1 +#define MINOR 17 +#define PATCH 0 diff --git a/addons/main/stringtable.xml b/addons/main/stringtable.xml new file mode 100644 index 0000000..8a76018 --- /dev/null +++ b/addons/main/stringtable.xml @@ -0,0 +1,18 @@ + + + + + ArmaForces Attributes + Atrybuty ArmaForces + + + ArmaForces + + + ArmaForces + + + Wiki + + + diff --git a/addons/main/ui/logo_sm_ca.paa b/addons/main/ui/logo_sm_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..37d7faf8c192c828b450d0d40fbf9eae4a1f8721 GIT binary patch literal 49205 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 W&%Y&qR4@*O4AowCIAE;d_ul{rUnfie literal 0 HcmV?d00001 diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..3392b5b --- /dev/null +++ b/build.bat @@ -0,0 +1,3 @@ +@echo off +hemtt.exe build +pause diff --git a/hemtt.toml b/hemtt.toml new file mode 100644 index 0000000..df016ea --- /dev/null +++ b/hemtt.toml @@ -0,0 +1,49 @@ +name = "ArmaForces NEW_MOD_PRETTY" +prefix = "NEW_MOD_ABBR" +author = "ArmaForces" +files = [ + "LICENSE", + "mod.cpp", + "README.md", + "armaforces_NEW_MOD_SNAKE_x64.dll", +] + +exclude = ["*.psd", "*.png", "*.tga"] + +modname = "armaforces_NEW_MOD_SNAKE" +key_name = "armaforces_NEW_MOD_SNAKE_{{version}}" +authority = "armaforces_NEW_MOD_SNAKE_{{version}}" + +releasebuild = [ + "!set_version", + "@zip", + "!publish" +] + +[header_exts] +version = "{{git \"id 8\"}}" + +[scripts.extension] + show_output = true + steps_windows = [ + "cd extension && cargo build --release", + "copy extension\\target\\release\\armaforces_NEW_MOD_SNAKE.dll armaforces_NEW_MOD_SNAKE_x64.dll" + ] + steps_linux = [ + "echo \"Unable to build extension on Linux\"" + ] + +[scripts.set_version] + steps_windows = [ + "powershell ./tools/Set-Version.ps1 {{version}} '@armaforces_NEW_MOD_SNAKE'" + ] + steps_linux = [ + "sed -i 's/0.0.0/{{version}}/' ./releases/{{version}}/@armaforces_NEW_MOD_SNAKE/mod.cpp" + ] + # show_output = true + +[scripts.publish] + steps_windows = [ + "powershell ./tools/Publish.ps1 {{version}} 1934142795 '@armaforces_NEW_MOD_SNAKE'" + ] + show_output = true diff --git a/meta.cpp b/meta.cpp new file mode 100644 index 0000000..7f8d960 --- /dev/null +++ b/meta.cpp @@ -0,0 +1,2 @@ +protocol = 1; +publishedid = 1934142795; diff --git a/mod.cpp b/mod.cpp new file mode 100644 index 0000000..4526f6b --- /dev/null +++ b/mod.cpp @@ -0,0 +1,11 @@ +name = "ArmaForces NEW_MOD_PRETTY - 0.0.0"; +dir = "@armaforces_NEW_MOD_SNAKE"; +author = "ArmaForces"; +url = "https://github.com/armaforces/NEW_MOD_SNAKE/"; +action = "https://armaforces.com/"; +actionName = "Website"; +logo = "\z\NEW_MOD_ABBR\addons\main\ui\logo_sm_ca.paa"; +logoOver = "\z\NEW_MOD_ABBR_CAPS\addons\main\ui\logo_sm_ca.paa"; +overviewPicture = "\z\NEW_MOD_ABBR_CAPS\addons\main\ui\logo_sm_ca.paa"; +tooltip = "ArmaForces NEW_MOD_PRETTY"; +description = "ArmaForces in-house NEW_MOD_SNAKE developed by community members.";