Compare commits

...

69 Commits
emp ... 4.1.0

Author SHA1 Message Date
6c4740dd1f Merge pull request 'develop' (#37) from develop into main
Reviewed-on: #37
2024-03-02 01:08:33 -06:00
hizumi
f128e0fec8 Update on-release.yaml 2024-03-02 01:08:33 -06:00
706794a114 Merge pull request 'Update on-release.yaml' (#36) from develop into main
Reviewed-on: #36
2024-03-02 00:49:54 -06:00
hizumi
ee43868a32 Update on-release.yaml
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 31s
2024-03-02 00:49:41 -06:00
c1aeace994 Merge pull request 'Update on-release.yaml' (#35) from develop into main
Reviewed-on: #35
2024-03-02 00:23:31 -06:00
d9beb44c72 Merge branch 'main' into develop
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 30s
2024-03-02 00:23:08 -06:00
hizumi
44b842ad33 Update on-release.yaml
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 30s
2024-03-02 00:18:05 -06:00
d9b5dd66a8 Merge pull request 'develop' (#34) from develop into main
Reviewed-on: #34
2024-03-01 23:59:30 -06:00
d6549fc040 Merge branch 'main' into develop
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 30s
2024-03-01 23:56:55 -06:00
hizumi
073f5ffd63 Update CHANGELOG.md
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 36s
2024-03-01 23:49:35 -06:00
hizumi
53a8b782e6 Update README.md
newer file structure, release link, and new file purposes
2024-03-01 23:49:25 -06:00
737f1ef7ee skip respawn button log if no last uncon timer registered
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 37s
2024-02-24 19:45:55 -08:00
hizumi
3e4eda2843 Update on-push-devel.yaml
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 32s
2024-02-22 23:23:12 -06:00
hizumi
34c36f58e2 Delete create-testing-snapshot.yaml 2024-02-22 23:20:25 -06:00
1279503743 Delete .gitea/workflows/create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 28s
2024-02-22 23:19:28 -06:00
35dd63cbab Merge pull request 'main' (#33) from main into develop
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 28s
Reviewed-on: hizumi/MissionTemplate#33
2024-02-22 23:16:24 -06:00
3c0124070e Merge branch 'develop' into main 2024-02-22 23:15:09 -06:00
hizumi
77c3b0d67a update workflows with new formatting and urls 2024-02-22 23:12:27 -06:00
hizumi
2a776718c0 add issue templates
Some checks failed
Pack ZGM mission PBO files / Get ZGM mission list (push) Failing after 37s
Pack ZGM mission PBO files / Create PBO files (push) Failing after 13m41s
2024-02-22 22:17:40 -06:00
5d50375256 improve static line protection logic
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 37s
2024-02-22 08:28:18 -08:00
6917db3b7d add missionGroup op for mission type, supply crate updates
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 32s
2024-02-21 16:11:28 -08:00
d2b8e10baf fix uncon respawn button use, add static line protection
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 38s
2024-02-21 08:23:54 -08:00
496fd21830 adds static line jump 5s invincibility
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 39s
2024-02-20 19:51:51 -08:00
f3c95322e9 change respawn button use warning to use ace_killed CBA event
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 41s
2024-02-19 16:11:42 -08:00
7d10d2622d adds leaflet support and missionGroup param for missionProfileNamespace 2024-02-19 16:11:10 -08:00
a20f477ee0 add better custom script support
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 37s
2024-02-19 09:46:06 -08:00
c29e46d5f7 Merge branch 'develop' of https://gitea.iceberg-gaming.com/hizumi/MissionTemplate into develop
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 40s
2024-02-16 19:05:27 -08:00
de074b62f2 make sure last time knocked unconscious variable is visible to all 2024-02-16 19:05:14 -08:00
hizumi
40ee46ea98 Update pack-zgm-pbo-files.yaml
Some checks failed
Pack ZGM mission PBO files / Get ZGM mission list (push) Failing after 5s
Pack ZGM mission PBO files / Create PBO files (push) Failing after 13s
2024-02-15 19:10:48 -06:00
hizumi
10ef37cb80 Update pack-zgm-pbo-files.yaml
Some checks failed
Pack ZGM mission PBO files / Get ZGM mission list (push) Failing after 5s
Pack ZGM mission PBO files / Create PBO files (push) Failing after 7s
2024-02-15 19:09:01 -06:00
hizumi
74b630bfaa Update pack-zgm-pbo-files.yaml
Some checks failed
Pack ZGM mission PBO files / GetMissionList (push) Failing after 4s
Pack ZGM mission PBO files / CreatePboFiles (push) Successful in 2m13s
2024-02-15 18:59:45 -06:00
hizumi
e64b29479d Update pack-zgm-pbo-files.yaml
Some checks failed
Pack ZGM mission PBO files / GetMissionList (push) Successful in 4s
Pack ZGM mission PBO files / CreatePboFiles (push) Failing after 11s
2024-02-15 18:56:15 -06:00
hizumi
d25e67182a Update pack-zgm-pbo-files.yaml
Some checks failed
Pack ZGM mission PBO files / GetMissionList (push) Failing after 3s
Pack ZGM mission PBO files / CreatePboFiles (push) Failing after 17s
2024-02-15 18:50:30 -06:00
hizumi
2218898ff7 Update pack-zgm-pbo-files.yaml
Some checks failed
Pack ZGM mission PBO files / GetMissionList (push) Failing after 1s
Pack ZGM mission PBO files / CreatePboFiles (push) Failing after 2s
2024-02-15 18:49:36 -06:00
hizumi
4976aa51b8 Update pack-zgm-pbo-files.yaml 2024-02-15 18:47:30 -06:00
hizumi
ddf0fe91d4 Update pack-zgm-pbo-files.yaml 2024-02-15 18:46:51 -06:00
hizumi
72bac32219 create release workflow 2024-02-15 18:40:28 -06:00
hizumi
21dbb725ac sync develop workflow 2024-02-15 18:40:13 -06:00
hizumi
57c012195a Update create-testing-snapshot.yaml
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 30s
2024-02-15 18:24:19 -06:00
hizumi
d71ba9e3bd Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 11s
2024-02-15 18:11:41 -06:00
hizumi
32491da46f Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 1s
2024-02-15 18:07:52 -06:00
hizumi
94814b6d07 Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 1s
2024-02-15 18:06:55 -06:00
hizumi
d2a557dda1 Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 1s
2024-02-15 18:04:15 -06:00
hizumi
81f4bb4d48 Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 36s
2024-02-15 17:52:16 -06:00
hizumi
6f5a0ca523 Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 29s
2024-02-15 17:49:13 -06:00
hizumi
4eae553c6d Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 29s
2024-02-15 17:45:05 -06:00
hizumi
3194409192 Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 30s
2024-02-15 17:43:54 -06:00
293a050027 Merge branch 'develop' of https://gitea.iceberg-gaming.com/hizumi/MissionTemplate into develop
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 33s
2024-02-15 15:13:22 -08:00
d2758b7570 adds drawicon3d wrapper from Hizumi and status for vflag use 2024-02-15 15:13:04 -08:00
hizumi
1bdbdd1273 Update create-testing-snapshot.yaml
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 30s
2024-02-15 16:58:17 -06:00
hizumi
d4c01c6554 Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 28s
2024-02-15 16:51:06 -06:00
hizumi
2866153654 Update create-testing-snapshot.yaml
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 29s
2024-02-15 16:40:37 -06:00
hizumi
23dc0656a6 Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 34s
2024-02-15 16:36:07 -06:00
4fb0ea9a15 rework PFH to client module, triageIcons and vehicleFlags point there 2024-02-15 13:54:10 -08:00
ef83d41a32 Merge pull request 'track-unconscious-duration-in-respawn-msg' (#30) from track-unconscious-duration-in-respawn-msg into develop
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 30s
Reviewed-on: hizumi/MissionTemplate#30
Reviewed-by: hizumi <hizumi@noreply.iceberg-gaming.com>
2024-02-14 02:02:05 -06:00
e76da62b7f Merge branch 'develop' into track-unconscious-duration-in-respawn-msg 2024-02-14 01:58:47 -06:00
hizumi
aaad8675a6 Create create-testing-snapshot.yaml
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 33s
move testing workflow to develop branch
2024-02-14 01:56:04 -06:00
c00f1b0e17 Merge pull request 'adds default bases + allows mms to set custom waypoints for microdagr' (#26) from add-microdagr-waypoints into develop
Reviewed-on: hizumi/MissionTemplate#26
Reviewed-by: hizumi <hizumi@noreply.iceberg-gaming.com>
2024-02-14 01:53:08 -06:00
hizumi
8e10819b92 Update create-testing-snapshot.yaml 2024-02-14 01:51:52 -06:00
9f89ec12d5 moves empty group cleanup run on all machines to perf module 2024-02-13 23:13:23 -08:00
e55c9a0751 trial implementation 2024-02-13 20:50:09 -08:00
hizumi
68f35a9b44 Update create-testing-snapshot.yaml
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 31s
add environment diagnostics and update webrequest url to use built in environment variables
2024-02-13 22:46:39 -06:00
hizumi
f11cadbd06 Update create-testing-snapshot.yaml
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 31s
correct api url
2024-02-13 19:58:21 -06:00
hizumi
a00f6cb0da create testing release workflow
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 27s
2024-02-13 19:50:30 -06:00
5114ae334f add basic mission_settings check w notify in 3den preview 2024-02-13 11:02:42 -08:00
296f945ea3 adds default bases + allows mms to set custom waypoints for microdagr 2024-02-12 23:51:07 -08:00
fdcf70b713 revert CfgFunctions to nested include 2024-02-12 19:32:19 -08:00
hizumi
1e5d50828b Update CHANGELOG.md 2024-02-08 19:12:44 -06:00
f8af54aa06 Merge pull request 'develop' (#24) from develop into main
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/24
2024-02-08 19:05:40 -06:00
41 changed files with 1055 additions and 362 deletions

View File

@@ -0,0 +1,37 @@
name: Bug Report
about: File a bug report to help us improve
title: ""
labels: "Kind/Bug"
ref: main
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
- type: textarea
id: what-happened
attributes:
label: Describe the bug!
description: What did you see, and what did you expect to happen.
render: markdown
value: "A bug happened!"
validations:
required: true
- type: textarea
id: reproduce-steps
attributes:
label: How can we reproduce this?
description: "Steps to reproduce the behavior, and attach full log here if needed."
value: |
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
validations:
required: true
- type: textarea
id: logs
attributes:
label: Relevant log output?
description: Please copy and paste any relevant log output. This will be automatically formatted into code.
render: shell

View File

@@ -0,0 +1 @@
blank_issues_enabled: true

View File

@@ -0,0 +1,34 @@
name: Feature Request
about: Suggest an idea for this project
title: ""
labels: "Kind/Feature"
ref: main
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to suggest an idea to us!
- type: textarea
id: feature-description
attributes:
label: Is your feature request related to a problem?
description: A clear and concise description of what the problem is.
render: markdown
value: " I'm always frustrated when [...]"
- type: textarea
id: feature-solution
attributes:
label: Describe the solution you would like.
description: "A clear and concise description of what you want to happen. Context and screenshots welcome!"
value: |
1. Go to '...'
2. Look at '....'
3. Change to '....'
validations:
required: true
- type: textarea
id: feature-references
attributes:
label: Describe the alternatives you have considered.
description: "A clear and concise description of any alternative solutions or features you've considered."
render: markdown

View File

@@ -0,0 +1,71 @@
name: Generate testing snapshot
on:
push:
branches: [develop]
jobs:
Clean:
name: Create testing release
runs-on: windows
steps:
- name: Diagnostics
run: |
echo "repository: ${{ gitea.repository }}"
echo "ref: ${{ gitea.ref }}"
echo "ref_name: ${{ gitea.ref_name }}"
echo "sha: ${{ gitea.sha }}"
echo "api_url: ${{ gitea.api_url }}"
echo "workflow: ${{ gitea.workflow }}"
- name: Checkout framework
uses: actions/checkout@v3
with:
path: MissionFramework
- name: Clean framework
run: |
Remove-Item -Recurse MissionFramework\aaFrameworkUtils
Remove-Item -Recurse MissionFramework\framework\x
Remove-Item -Recurse MissionFramework\.git*
- name: Backup artifacts from runner
uses: actions/upload-artifact@v3
with:
name: framework-test-snapshot
path: MissionFramework
- name: Create archive
run: Compress-Archive MissionFramework framework-test-snapshot.zip
- name: Delete old testing-release release
run: |
$headers = @{
"accept" = "application/json"
"Authorization" = "token ${{ gitea.token }}"
}
Invoke-WebRequest -Uri "${{ gitea.api_url }}/repos/${{ gitea.repository }}/releases/tags/testing-release" -Method Delete -Headers $headers
- name: Delete old testing-release tag
run: |
$headers = @{
"accept" = "application/json"
"Authorization" = "token ${{ gitea.token }}"
}
Invoke-WebRequest -Uri "${{ gitea.api_url }}/repos/${{ gitea.repository }}/tags/testing-release" -Method Delete -Headers $headers
- name: Create new testing-release tag
run: |
$headers = @{
"accept" = "application/json"
"Authorization" = "token ${{ gitea.token }}"
}
Invoke-WebRequest -Uri "${{ gitea.api_url }}/repos/${{ gitea.repository }}/tags" -Method Post -Headers $headers -ContentType "application/json" -Body "{`"message`": `"testing-release`", `"tag_name`": `"testing-release`", `"target`": `"${{ gitea.sha }}`"}"
- name: Create new testing-release
uses: https://gitea.com/actions/gitea-release-action@v1.3.0
with:
tag_name: 'testing-release'
name: 'testing-release'
prerelease: true
files: |-
framework-test-snapshot.zip

View File

@@ -0,0 +1,70 @@
name: Pack Release files
on:
release:
types: [published]
jobs:
DispatchZGMBuild:
name: Dispatch MissionZGM build job
runs-on: windows
steps:
- name: Diagnostics
run: |
echo "repository: ${{ gitea.repository }}"
echo "ref: ${{ gitea.ref }}"
echo "ref_name: ${{ gitea.ref_name }}"
echo "sha: ${{ gitea.sha }}"
echo "api_url: ${{ gitea.api_url }}"
echo "workflow: ${{ gitea.workflow }}"
- name: Publish remote issue
run: |
$headers = @{
"accept" = "application/json"
"Authorization" = "token ${{ secrets.RUNNER_ISSUE_TOKEN }}"
}
$response = Invoke-RestMethod -Uri "${{ gitea.api_url }}/repos/17th-Ranger-Battalion-ORG/MissionsForZGM/issues" -Method Post -Headers $headers -ContentType "application/json" -Body "{`"title`": `"publish-release`"}"
CreateRelease:
name: Publish cleaned template
runs-on: windows
steps:
- name: Diagnostics
run: |
echo "repository: ${{ gitea.repository }}"
echo "ref: ${{ gitea.ref }}"
echo "ref_name: ${{ gitea.ref_name }}"
echo "sha: ${{ gitea.sha }}"
echo "api_url: ${{ gitea.api_url }}"
echo "workflow: ${{ gitea.workflow }}"
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
ref: 'main'
path: release
- name: Prepare template
run: |
mkdir MissionTemplate
cd MissionTemplate
Get-ChildItem ..\release\ | Copy-Item -Recurse
Remove-Item -Recurse aaFrameworkUtils
Remove-Item -Recurse framework\x
Remove-Item -Recurse .git*
Get-ChildItem
- name: Create archive
run: |
cd release
$revision = git rev-parse --short=10 HEAD
$tag = git describe --abbrev=0 --tags
cd ..
Compress-Archive MissionTemplate mission-maker-template-v$tag-$revision.zip
- name: Add archive to release
uses: https://gitea.com/actions/gitea-release-action@v1.3.0
with:
files: |-
mission-maker-template*.zip

View File

@@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project badly attempts [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [4.1.0] - 2024-03-01
### Added
- Added ability for mission maker to use custom leaflets
- Added ability for mission maker to define points of interested to be automatically added as MicroDAGR waypoints
- Added `missionGroup` variable in `description.ext` for backend grouping of mission
- Added custom script support via `CfgFunctions`
- Added 5 second invulnerability on ejection of air vehicle when parachute equipped
### Changed
- Track unconsciousness time
## [4.0.0] - 2024-02-07
Version 4 marks a massive rewrite due in whole to @IndigoFox by updating the internals of the framework into CBA macros and functions.
@@ -14,6 +28,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
- Added various framework utitily functions
- Added ability for mission maker to allow spawning of resupply boxes from arsenal boxes
- Added CBA settings for resupply box spawning
- Added additional vehicle flags
- Addded Zeus module to fill vehicle ace cargo inventory with tracks/tires
### Changed

View File

@@ -2,11 +2,10 @@
The only file which should be pre-existing in your mission folder is `mission.sqm`, once freshly saved from Arma 3's EDEN Editor.
Download the latest mission template zip from the [latest release](https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/releases/latest) and copy its contents to the folder where your mission file lives.
Download the latest mission template zip from the [latest release](https://gitea.iceberg-gaming.com/17th-Ranger-Battalion-ORG/MissionTemplate/releases/latest) and copy its contents to the folder where your mission file lives.
Once copied, the final structure should appear similar to the following:
```markdown
├── aaFrameworkUtils/
```
├── defines/
├── framework/
├── images/
@@ -14,13 +13,17 @@ Once copied, the final structure should appear similar to the following:
├── sounds/
├── textures/
├── CHANGELOG.md
├── custom_leaflets.hpp
├── custom_scripts.hpp
├── CHANGELOG.md
├── description.ext
├── mission_settings.hpp
├── mission.jpg
├── mission.sqm
├── mission_settings.hpp
├── README.md
```
> **Note:** If you're building a mission for use and not actively developing code, the `aaFrameworkUtils` and `framework\x` directories **should be deleted**. *These are for the purposes of development and add size bloat to the mission download when players connect to your mission.*
> **Note:** If you're building a mission for use and not actively developing code, you should download the `mission-maker-template` zip file which is a cleaned version of this framework. The `aaFrameworkUtils` and `framework\x` directories in the source tree are for the purposes of development and would only add size bloat to the mission download when players connect to your mission.
After the requisite configuration file edits have been made, your mission is ready to be packed into a pbo for deployment.
@@ -38,13 +41,21 @@ Almost none of the template files should be edited in anyway as they have been f
The contents of this file must be edited to reflect the naming of your mission for display purposes. All variables are self-documented inside the file to clearly identify the purpose of each piece of required text
The contents of the lower half of the file are where the mission maker is able to add/replace/modify the built in `#ace-fortify` preset
The contents of the lower half of the file contain templated declaration blocks where the mission maker can define custom waypoints to be automatically added to the ACE MicroDAGR, and define/edit the custom built in `#ace-fortify` preset.
## mission.jpg
This file will be displayed the client mission loading screen.
File should remain small *(under 300KiB)* and should optimally be `1024px by 512px` in resolution
## custom_leaflets.hpp
This file contains the temeplate block for declaring custom leaflets to be used within missions.
## custom_scripts.hpp
This file contains an accessbile `CfgFunctions` declaration block for custom functions which require setup in this manner.
## defines/
This directory contains the definition files use by the framework in various places. *Contents should not be edited*
@@ -124,3 +135,4 @@ This directory contains a number of hpp files used to define constants throughou
- Provides an ACE3 interaction menu that allows players to attach and remove flags from vehicles.
- Flags are defined in `defines/VehicleFlags.hpp`.
c

39
custom_leaflets.hpp Normal file
View File

@@ -0,0 +1,39 @@
// This contains custom definitions for leaflets. It is not required to set this up, but you're welcome to if you want to use them.
// To use this, configure one or more of the below. Then use the pylon editor of a drone in EDEN to add the appropriate magazine type (like 1Rnd_Leaflets_Custom_01_F) to the drone. Then, when the drone is flying, do `drone1 fire "1Rnd_Leaflets_Custom_01_F";` to drop the leaflets. The leaflet will then be shown in the world, and can be picked up by players to read the text and see the image.
class Custom_01 // configuration for 1Rnd_Leaflets_Custom_01_F
{
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
texture = "images\leaflets\leaflet_custom_01.paa"; // leaflet texture shown when previewing the leaflet full-screen
};
class Custom_02 // configuration for 1Rnd_Leaflets_Custom_02_F
{
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
texture = "images\leaflets\leaflet_custom_02.paa"; // leaflet texture shown when previewing the leaflet full-screen
};
class Custom_03 // configuration for 1Rnd_Leaflets_Custom_03_F
{
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
texture = "images\leaflets\leaflet_custom_03.paa"; // leaflet texture shown when previewing the leaflet full-screen
};
class Custom_04 // configuration for 1Rnd_Leaflets_Custom_04_F
{
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
texture = "images\leaflets\leaflet_custom_04.paa"; // leaflet texture shown when previewing the leaflet full-screen
};
class Custom_05 // configuration for 1Rnd_Leaflets_Custom_05_F
{
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
texture = "images\leaflets\leaflet_custom_05.paa"; // leaflet texture shown when previewing the leaflet full-screen
};
class Custom_06 // configuration for 1Rnd_Leaflets_Custom_06_F
{
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
texture = "images\leaflets\leaflet_custom_06.paa"; // leaflet texture shown when previewing the leaflet full-screen
};

11
custom_scripts.hpp Normal file
View File

@@ -0,0 +1,11 @@
// This file's contents will be included in the mission's CfgFunctions section, and serves to give you a place to define custom functions from files you've placed in /scripts.
class milsim_scripts {
class functions {
file = "scripts";
// Add your custom functions here, like so:
// class init {postInit = 1;}; // refers to scripts/fn_init.sqf. postInit=1 means it will be run on each machine when they're done loading the mission.
// class customFunction1 {}; // refers to the file scripts/fn_customFunction1.sqf, and is called as milsim_scripts_fnc_customFunction1
// class customFunction2 {}; // refers to the file scripts/fn_customFunction2.sqf, and is called as milsim_scripts_fnc_customFunction2
};
};

View File

@@ -21,18 +21,14 @@ class SupplyCrates {
{"rhsusf_200Rnd_556x45_mixed_soft_pouch_coyote",25},
{"rhsusf_20Rnd_762x51_m993_Mag",25},
{"SmokeShell",12},
{"rhs_mag_m67",12},
{"rhs_mag_m67",24},
{"1Rnd_Smoke_Grenade_shell",24},
{"1Rnd_SmokeRed_Grenade_shell",24},
{"1Rnd_SmokeGreen_Grenade_shell",24},
{"1Rnd_SmokeYellow_Grenade_shell",12},
{"Tier1_30Rnd_556x45_M856A1_EMag",25},
{"Tier1_30Rnd_556x45_Mk318Mod0_EMag",75},
{"ACE_30Rnd_65_Creedmor_mag",25},
{"ACE_30Rnd_556x45_Stanag_M995_AP_mag",75},
{"SMA_30Rnd_762x35_BLK_EPR",25},
{"Tier1_30Rnd_762x35_300BLK_SMK_PMAG",25},
{"SMA_30Rnd_68x43_SPC_FMJ",25},
{"SMA_30Rnd_68x43_SPC_FMJ_Tracer",25},
{"SMA_20Rnd_762x51mm_M80A1_EPR",25},
{"SMA_20Rnd_762x51mm_M80A1_EPR_Tracer",25},
{"SMA_20Rnd_762x51mm_Mk316_Mod_0_Special_Long_Range",25},
@@ -42,8 +38,6 @@ class SupplyCrates {
{"ACE_20Rnd_762x51_M993_AP_Mag",25},
{"rhsusf_20Rnd_762x51_SR25_m993_Mag",25},
{"Tier1_20Rnd_762x51_M993_SR25_Mag",25},
{"Tier1_20Rnd_65x48_Creedmoor_SR25_Mag",25},
{"rhssaf_30rnd_556x45_EPR_G36", 25},
{"DemoCharge_Remote_Mag",16}
};
items[] = {};
@@ -56,13 +50,15 @@ class SupplyCrates {
icon = "\A3\ui_f\data\map\vehicleicons\iconCrateWpns_ca.paa";
backpacks[] = {};
weapons[] = {};
weapons[] = {
{"launch_MRAWS_green_F",2}
};
magazines[] = {
{"MRAWS_HEAT_F",35},
{"MRAWS_HE_F",15},
{"Tier1_250Rnd_762x51_Belt_M993_AP",50},
{"Tier1_30Rnd_556x45_M856A1_EMag",25},
{"Tier1_30Rnd_556x45_Mk318Mod0_EMag",50},
{"ACE_30Rnd_556x45_Stanag_M995_AP_mag",50},
{"Titan_AA",10},
{"Titan_AT",10},
{"200Rnd_65x39_cased_Box_Tracer_Red",50}
@@ -168,12 +164,15 @@ class SupplyCrates {
icon = "\A3\ui_f\data\igui\cfg\simpleTasks\types\scout_ca.paa";
backpacks[] = {};
weapons[] = {};
weapons[] = {
{"rhs_weap_M136",2},
{"twc_2inch_bag",3}
};
magazines[] = {
{"twc_2inch_he_1rnd",70},
{"twc_2inch_smoke_1rnd",15},
{"twc_2inch_illum_1rnd",15},
{"Tier1_30Rnd_556x45_Mk318Mod0_EMag",20}
{"ACE_30Rnd_556x45_Stanag_M995_AP_mag",20}
};
items[] = {};
};

View File

@@ -89,15 +89,16 @@ minPlayerDistance = 500;
//-------------------------------------------BASE SETTINGS---------------------------------------------------------------//
class Params
{
class Params {};
class CfgFunctions {
#include "framework\CfgFunctions.hpp"
#include "custom_scripts.hpp"
};
// CfgFunctions
#include "framework\CfgFunctions.hpp"
class CfgLeaflets {
#include "custom_leaflets.hpp"
};
class CfgDebriefingSections {
class acex_killTracker {

View File

@@ -1,180 +1,188 @@
#include "script_mod.hpp"
class CfgFunctions {
class DOUBLES(PREFIX,init) {
class functions {
file = "framework\init\functions";
class initServer { postInit = 1;};
class initClient { postInit = 1;};
class setDefaults { postInit = 1; };
class addAARChatHandler { postInit = 1; };
class addRespawnChatHandler { postInit = 1; };
};
class DOUBLES(PREFIX,init) {
class functions {
file = "framework\init\functions";
class initServer { postInit = 1;};
class initClient { postInit = 1;};
class setDefaults {};
class addAARChatHandler {};
class addRespawnChatHandler {};
class checkMissionSettings {};
};
class PREFIX {
class ambience {
file = "framework\ambience";
class flakInitVehicle {};
class flakEH {};
};
};
class PREFIX {
class ambience {
file = "framework\ambience";
class flakInitVehicle {};
class flakEH {};
};
};
class DOUBLES(PREFIX,client) {
class functions {
file = "framework\client\functions";
class bindEmptyGroupGarbageCleanup { postInit = 1; };
class bindEventHandlers { postInit = 1; };
class bindVehicleActions { postInit = 1; };
class addZenModules {postInit = 1;};
};
class DOUBLES(PREFIX,client) {
class functions {
file = "framework\client\functions";
class initClient {};
class addDraw3DPFH {};
class addGetNearMenPFH {};
class addMicroDAGRWaypoints {};
class addZenModules {};
class bindEventHandlers {};
class bindVehicleActions {};
class clearPFHCode {};
class logRespawnButtonUse {};
class registerPFHCode {};
class staticLineProtection {};
};
};
class DOUBLES(PREFIX,common) {
class functions {
file = "framework\common\functions";
class addCBASettings { preInit = 1; };
class logMissionInfo {};
class addPlayerInfoToArray {};
class createOrUpdateDiaryRecord {};
class getApprovedAssetsCfg {};
class getBattalionCfg {};
class getNameOfBase {};
class getNearestBase {};
class log {};
class checkPlayerInventory {};
class logSettingChanged {};
class padString {};
class recurseSubclasses {};
};
class DOUBLES(PREFIX,common) {
class functions {
file = "framework\common\functions";
class addCBASettings { preInit = 1; };
class addPlayerInfoToArray {};
class checkPlayerInventory {};
class createOrUpdateDiaryRecord {};
class draw3DIconStatus {};
class getApprovedAssetsCfg {};
class getBattalionCfg {};
class getNameOfBase {};
class getNearestBase {};
class log {};
class logMissionInfo {};
class logSettingChanged {};
class padString {};
class recurseSubclasses {};
};
};
class DOUBLES(PREFIX,fbcb2_assets) {
class functions {
file = "framework\fbcb2_assets\functions";
class addCBASettings {preInit=1;};
class initServer {};
class initClient {};
class getCallsignFromClassname {};
class getCurrentAssetsByBase {};
class getInventory {};
class getMagsForWeapon {};
class getStartingAndCurrentAssets {};
class getStartingAssetsByBase {};
class getVehicleData {};
class getWeaponry {};
class hintAllApprovedAssets {};
class isAssetInRangeOfBase {};
class removeAssetDiaryRecords {};
class removeMarkersOnMap {};
class showMarkersOnMap {};
class updateAssetDiary {};
class updateAssetsByBase {};
};
class DOUBLES(PREFIX,fbcb2_assets) {
class functions {
file = "framework\fbcb2_assets\functions";
class addCBASettings {preInit=1;};
class initServer {};
class initClient {};
class getCallsignFromClassname {};
class getCurrentAssetsByBase {};
class getInventory {};
class getMagsForWeapon {};
class getStartingAndCurrentAssets {};
class getStartingAssetsByBase {};
class getVehicleData {};
class getWeaponry {};
class hintAllApprovedAssets {};
class isAssetInRangeOfBase {};
class removeAssetDiaryRecords {};
class removeMarkersOnMap {};
class showMarkersOnMap {};
class updateAssetDiary {};
class updateAssetsByBase {};
};
};
class DOUBLES(PREFIX,fbcb2_main) {
class functions {
file = "framework\fbcb2_main\functions";
class initClient {};
class addEnvironmentRecord {};
class addFrequenciesRecord {};
class addSignalColorsRecord {};
};
class util {
file = "framework\fbcb2_main\util";
class formatRadioElementForDiary {};
class generateElementFrequencyRecordText {};
};
class DOUBLES(PREFIX,fbcb2_main) {
class functions {
file = "framework\fbcb2_main\functions";
class initClient {};
class addEnvironmentRecord {};
class addFrequenciesRecord {};
class addSignalColorsRecord {};
};
class DOUBLES(PREFIX,mapcopy) {
class functions {
file = "framework\mapcopy\functions";
class addCBASettings {preInit=1;};
class initClient {};
class getMapMarkers {};
class loadMapMarkers {};
class mapMarkerToString {};
class stringToMapMarker {};
};
class util {
file = "framework\fbcb2_main\util";
class formatRadioElementForDiary {};
class generateElementFrequencyRecordText {};
};
};
class DOUBLES(PREFIX,performance) {
class functions {
file = "framework\performance\functions";
class addCBASettings {preInit=1;};
class addDNI_PlayerFPS { postInit = 1; };
// PFHs managed in addCBASettings onChange code
class addClientStatsPFH {};
class calculateClientStats {};
class addServerStatsPFH {};
class calculateServerStats {};
};
class DOUBLES(PREFIX,mapcopy) {
class functions {
file = "framework\mapcopy\functions";
class addCBASettings {preInit=1;};
class initClient {};
class getMapMarkers {};
class loadMapMarkers {};
class mapMarkerToString {};
class stringToMapMarker {};
};
};
class DOUBLES(PREFIX,reinsert) {
class functions {
file = "framework\reinsert\functions";
class addCBASettings {preInit=1;};
};
class server {
file = "framework\reinsert\server";
class initServer {};
class addToQueue {};
class globalShowQueue {};
class removeFromQueue {};
class returnReinsertQueueNotification {};
class validateQueue {};
};
class client {
file = "framework\reinsert\client";
class initClient {};
class addAceSelfActions {};
class addCheckQueueSelfAction {};
class requestShowQueue {};
};
class DOUBLES(PREFIX,performance) {
class functions {
file = "framework\performance\functions";
class addCBASettings {preInit=1;};
class addDNI_PlayerFPS {postInit = 1;};
// PFHs managed in addCBASettings onChange code
class addClientStatsPFH {};
class calculateClientStats {};
class addServerStatsPFH {};
class calculateServerStats {};
class addEmptyGroupCleanupPFH {};
};
};
class DOUBLES(PREFIX,resupply) {
class functions {
file = "framework\resupply\functions";
class addCBASettings {preInit=1;};
class initClient {};
class createBox {};
class getSupplyCratesCfg {};
class addArsenalObjectSpawnBoxActions {};
};
class DOUBLES(PREFIX,reinsert) {
class functions {
file = "framework\reinsert\functions";
class addCBASettings {preInit=1;};
};
class DOUBLES(PREFIX,triageIcons) {
class functions {
file = "framework\triageIcons\functions";
class addCBASettings {preInit=1;};
class initClient {};
class addDrawIconsPFH {};
class addGetEntitiesPFH {};
class updateColors {};
};
class server {
file = "framework\reinsert\server";
class initServer {};
class addToQueue {};
class globalShowQueue {};
class removeFromQueue {};
class returnReinsertQueueNotification {};
class validateQueue {};
};
class DOUBLES(PREFIX,vehicleFlags) {
class functions {
file = "framework\vehicleFlags\functions";
class initClient {};
class getActionsFlagCategories {};
class getVehicleFlagsCfg {};
class isClassExcluded {};
};
class client {
file = "framework\reinsert\client";
class initClient {};
class addAceSelfActions {};
class addCheckQueueSelfAction {};
class requestShowQueue {};
};
};
class DOUBLES(PREFIX,zeus) {
class functions {
file = "framework\zeus\functions";
class initClient {};
class addZenModules {};
};
class DOUBLES(PREFIX,resupply) {
class functions {
file = "framework\resupply\functions";
class addCBASettings {preInit=1;};
class initClient {};
class createBox {};
class getSupplyCratesCfg {};
class addArsenalObjectSpawnBoxActions {};
};
};
class DOUBLES(PREFIX,triageIcons) {
class functions {
file = "framework\triageIcons\functions";
class addCBASettings {preInit=1;};
class initClient {};
class draw3D {};
class updateColors {};
};
};
class DOUBLES(PREFIX,vehicleFlags) {
class functions {
file = "framework\vehicleFlags\functions";
class initClient {};
class addFlagActions {};
class draw3D {};
class getActionsFlagCategories {};
class getVehicleFlagsCfg {};
class isClassExcluded {};
};
};
class DOUBLES(PREFIX,zeus) {
class functions {
file = "framework\zeus\functions";
class initClient {};
class addZenModules {};
};
};

View File

@@ -0,0 +1,10 @@
#include "..\script_component.hpp"
if (!isNil QGVAR(draw3DPFH)) then {
[GVAR(draw3DPFH)] call CBA_fnc_removePerFrameHandler;
};
// add pfh that processes queued code
GVAR(draw3DPFH) = [{
{call _x; true;} count (localNamespace getVariable [QGVAR(pfhCode), []]);
}, 0] call CBA_fnc_addPerFrameHandler;

View File

@@ -0,0 +1,17 @@
#include "..\script_component.hpp"
// subroutine to gather nearest 50 units every 5 seconds and store in GVAR(nearMen)
// cleanup
if (!isNil QGVAR(getNearMenPFH)) then {
[GVAR(getNearMenPFH)] call CBA_fnc_removePerFrameHandler;
};
// add pfh
GVAR(getNearMenPFH) = [{
localNamespace setVariable [
QGVAR(nearMen),
(nearestObjects [player,["Man"],50,false]) select {
!isNull _x &&
player isNotEqualTo _x
}
];
}, 1] call CBA_fnc_addPerFrameHandler;

View File

@@ -0,0 +1,76 @@
#include "..\script_component.hpp"
// adds default base locations to players' microDAGR as waypoints
if (!hasInterface) exitWith {};
[{!isNull player}, {
// add base locations (respawn modules)
{
private _wpName = [_x] call EFUNC(common,getNameOfBase);
private _posASL = getPosASL _x;
[_wpName, _posASL] call ace_microdagr_fnc_deviceAddWaypoint;
} forEach GVARMAIN(baseObjects);
// add custom waypoints from mission_settings.hpp
private _customWaypoints = [missionConfigFile >> "custom_microdagr_waypoints", "ARRAY", []] call CBA_fnc_getConfigEntry;
{
_x params [
["_wpName", ""],
["_pos", [0, 0, 0], [[], ""]],
["_object", "", [""]]
];
private _realPos = nil;
// if pos was provided, process
if (count _pos >= 2) then {
switch (typeName _pos) do {
case "ARRAY": {
// pos is provided as an array
_realPos = _pos select [0, 2];
_realPos set [2, getTerrainHeightASL _realPos];
};
case "STRING": {
// pos is provided as a string
_realPos = [_pos, true] call ACE_common_fnc_getMapPosFromGrid;
_realPos set [2, getTerrainHeightASL _realPos];
};
default {
[
LEVEL_WARNING,
QUOTE(COMPONENT),
format["Invalid position for custom microDAGR waypoint: %1", _wpName],
[["name", _wpName], ["pos", _pos], ["object", _object]]] call EFUNC(common,log);
continue;
};
};
};
// if object was provided, process and override any pos
if (count _object > 0) then {
// object is provided as a string variable name
private _realObject = missionNamespace getVariable _object;
if (isNull _realObject) then {
[
LEVEL_WARNING,
QUOTE(COMPONENT),
format["Invalid object for custom microDAGR waypoint: %1", _wpName],
[["name", _wpName], ["pos", _pos], ["object", _object]]] call EFUNC(common,log);
continue;
};
_realPos = getPosASL (missionNamespace getVariable _object);
};
if (isNil "_realPos") then {
[
LEVEL_WARNING,
QUOTE(COMPONENT),
format["Invalid waypoint position for custom microDAGR waypoint: %1", _wpName],
[["name", _wpName], ["pos", _pos], ["object", _object]]] call EFUNC(common,log);
continue;
};
[_wpName, _realPos] call ace_microdagr_fnc_deviceAddWaypoint;
true;
} count _customWaypoints;
}] call CBA_fnc_waitUntilAndExecute;
nil;

View File

@@ -2,23 +2,6 @@
if ( !hasInterface ) exitWith {};
player addEventHandler["Respawn",
{
params ["_unit", "_corpse"];
private _killer = _corpse getVariable ["ace_medical_causeOfDeath", "#scripted"];
if (_killer == "respawn_button") then {
[
LEVEL_INFO,
QUOTE(COMPONENT),
"RESPAWNED WHILE UNCONSCIOUS",
[_unit] call EFUNC(common,addPlayerInfoToArray)
] remoteExec [QEFUNC(common,log), 2];
// format["%1 was unconscious then clicked the respawn button", name _unit] remoteExec["systemChat", 0];
};
}
];
[
{
params ["_unit", "_object", "_cost"];

View File

@@ -0,0 +1,5 @@
#include "..\script_component.hpp"
localNamespace setVariable [QGVAR(pfhCode), []];
count [];

View File

@@ -0,0 +1,32 @@
#include "..\script_component.hpp"
if (!hasInterface) exitWith {};
call FUNC(addMicroDAGRWaypoints);
call FUNC(addZenModules);
call FUNC(bindEventHandlers);
call FUNC(bindVehicleActions);
// add core getNearMenPFH handler
localNamespace setVariable [QGVAR(nearMen), []];
call FUNC(addGetNearMenPFH);
// add core draw3dPFH handler
localNamespace setVariable [QGVAR(pfhCode), []];
call FUNC(addDraw3DPFH);
// add listener that tracks using the respawn button while unconscious
call FUNC(logRespawnButtonUse);
// add conditional eject-from-vehicle handler to apply temp invincibility when static line jumping
call FUNC(staticLineProtection);
[
LEVEL_DEBUG,
QUOTE(COMPONENT),
"initClient complete",
[]
] call EFUNC(common,log);
localNamespace setVariable [QGVAR(complete), true];
nil;

View File

@@ -0,0 +1,56 @@
#include "..\script_component.hpp"
if ( !hasInterface ) exitWith {};
["ace_killed", {
params ["_unit", "_causeOfDeath", "_killer", "_instigator"];
if (not (local _unit)) exitWith {};
private _causeOfDeath = _unit getVariable ["ace_medical_causeOfDeath", "#scripted"];
if (_causeOfDeath != "respawn_button") exitWith {};
private _timeWentUnconscious = _unit getVariable [QGVARMAIN(lastTimeKnockedOut), -1];
private _durationSpentUnconscious = -1;
if (_timeWentUnconscious isEqualTo -1) exitWith {};
_durationSpentUnconscious = diag_tickTime - _timeWentUnconscious;
[
LEVEL_INFO,
QUOTE(COMPONENT),
"RESPAWNED WHILE UNCONSCIOUS",
[_unit, [
["durationSpentUnconscious", _durationSpentUnconscious]
]] call EFUNC(common,addPlayerInfoToArray)
] remoteExec [QEFUNC(common,log), 2];
// format["%1 was unconscious then clicked the respawn button", name _unit] remoteExec["systemChat", 0];
}] call CBA_fnc_addEventHandler;
["ace_medical_knockOut", { // local event for module & epi event
// systemChat format["ace_medical_knockOut: %1", _this];
private _unit = _this;
if (not (local _unit)) exitWith {};
_this setVariable [QGVARMAIN(lastTimeKnockedOut), diag_tickTime];
}] call CBA_fnc_addEventHandler;
["ace_medical_WakeUp", { // local event for module & epi event
// systemChat format["ace_medical_WakeUp: %1", _this];
private _unit = _this;
if (not (local _unit)) exitWith {};
_this setVariable [QGVARMAIN(lastTimeKnockedOut), nil];
}] call CBA_fnc_addEventHandler;
["ace_unconscious", { // used when applying damage
params ["_unit", "_isUnconscious"];
if (not (local _unit)) exitWith {};
if (_isUnconscious && isNil {_unit getVariable QGVARMAIN(lastTimeKnockedOut)}) then {
// systemChat format["%1 is unconscious", _unit];
_unit setVariable [QGVARMAIN(lastTimeKnockedOut), diag_tickTime];
} else {
// systemChat format["%1 is conscious", _unit];
_unit setVariable [QGVARMAIN(lastTimeKnockedOut), nil];
};
}] call CBA_fnc_addEventHandler;

View File

@@ -0,0 +1,9 @@
#include "..\script_component.hpp"
params [["_code", {}, [{}]]];
private _pfhCode = localNamespace getVariable [QGVAR(pfhCode), []];
_pfhCode pushBack _code;
localNamespace setVariable [QGVAR(pfhCode), _pfhCode];
count _pfhCode;

View File

@@ -0,0 +1,40 @@
#include "..\script_component.hpp"
if ( !hasInterface ) exitWith {};
// Add GetOutMan event handler to grant temporary invincibility to players ejecting from vehicles
// Only for players who have "hooked up" using VS static line
// and are ejecting from a plane or helicopter above 100m
player addEventHandler ["GetOutMan", {
params ["_unit", "_role", "_vehicle", "_turret", "_isEject"];
if (!isEject) exitWith {};
if (isNil {_unit getVariable "VS_Jump"}) exitWith {};
if (
not (_vehicle isKindOf "Plane" || _vehicle isKindOf "Helicopter") ||
((getPosATL _vehicle)#2) < 100
) exitWith {};
// disable damage for the unit to avoid collision damage
_unit allowDamage false;
// tested - vehicle _unit is the _unit, as this EH runs when they have left the vehicle
[
{!isNull (objectParent _this)}, // condition - wait until player re-enters vehicle (chute)
{
// if they enter a chute within 5 seconds, disable chute damage
(vehicle _this) allowDamage false;
// then wait X seconds and re-enable damage for both
[{
_this allowDamage true;
(vehicle _this) allowDamage true;
}, _this, 5] call CBA_fnc_waitAndExecute;
},
_unit, // args
2, // timeout
{ // run on timeout, if for some reason they don't enter a chute
// re-enable damage for unit
_this allowDamage true;
}
] call CBA_fnc_waitUntilAndExecute;
}];

View File

@@ -0,0 +1,54 @@
#include "..\script_component.hpp"
if (!hasInterface) exitWith {};
params [
["_drawTargets", [], [[]]],
["_icon", "", [""]],
["_text", "", [""]],
["_color", [], [[]]]
];
if (count _drawTargets isEqualTo 0) exitWith {};
_cameraPos = positionCameraToWorld [0,0,0];
_cameraPosASL = AGLToASL _cameraPos;
{
_target = _x;
_visible = [objNull, "VIEW"] checkVisibility [_cameraPosASL, eyePos _target];
if ( _visible isEqualTo 0 ) exitWith {};
_objectPos = (_target modelToWorldVisual (_target selectionPosition "pilot"));
_distance = (visiblePosition _target) vectorDiff _cameraPos;
_scale = 0;
_heightOffset = 0;
_heightScaling = 0.012;
if ( _icon isNotEqualTo "") then {
_heightOffset = 0.065;
_scale = 1;
_heightScaling = 0.075;
};
_drawPos = _objectPos vectorAdd [0, 0, (0.18 + _heightOffset) + (vectorMagnitude _distance * _heightScaling)];
drawIcon3D [
_icon,
_color,
_drawPos,
_scale,
_scale,
0,
_text,
2,
0.025
];
true;
} count _drawTargets;
nil

View File

@@ -24,10 +24,10 @@ if (_logLevel < DEBUG_MODE) exitWith {};
private _hash = createHashMapFromArray _data;
// Replace square brackets with round brackets to avoid parsing issues.
_message regexReplace ['(\[)', "("];
_message regexReplace ['(\])', ")"];
[_message, "]", ")"] call CBA_fnc_replace;
[_message, "[", "("] call CBA_fnc_replace;
private _json = [_hash] call CBA_fnc_encodeJSON;
_log = format ["[%1] [%2] [%3] [%4] :: %5", QUOTE(PREFIX), _component, _fnc_scriptNameParent, _message, _json];
private _log = format ["[%1] [%2] [%3] [%4] :: %5", QUOTE(PREFIX), _component, _fnc_scriptNameParent, _message, _json];
diag_log text _log;

View File

@@ -1,5 +1,7 @@
#include "..\script_component.hpp"
if (!hasInterface) exitWith {};
[
"saveaar",
{

View File

@@ -1,17 +1,27 @@
#include "..\script_component.hpp"
if (!hasInterface) exitWith {};
[
"respawn",
{
_clientID = _thisArgs select 0;
player setDamage 1;
private _timeWentUnconscious = player getVariable [QGVARMAIN(lastTimeKnockedOut), -1];
private _durationSpentUnconscious = -1;
if (_timeWentUnconscious > - 1) then {
_durationSpentUnconscious = diag_tickTime - _timeWentUnconscious;
};
// log to server RPT
[
LEVEL_INFO,
QUOTE(COMPONENT),
"CHAT COMMAND RESPAWN",
[player] call EFUNC(common,addPlayerInfoToArray)
[player, [
["durationSpentUnconscious", _durationSpentUnconscious]
]] call EFUNC(common,addPlayerInfoToArray)
] remoteExec [QEFUNC(common,log), 2];
// systemChat to all remote machines

View File

@@ -0,0 +1,41 @@
#include "..\script_component.hpp"
if (!hasInterface || !is3DENPreview) exitWith {};
private _warningText = [];
if (getText(missionConfigFile >> "author") in ["MISSION AUTHOR", ""]) then {
_warningText pushBack "<t font='EtelkaMonospacePro' size='0.7'>mission_settings\author</t> is blank or default!";
};
if (getText(missionConfigFile >> "onLoadName") in ["THIS APPEARS ON TOP OF THE LOADING SCREEN IMAGE", ""]) then {
_warningText pushBack "<t font='EtelkaMonospacePro' size='0.7'>mission_settings\onLoadName</t> is blank or default!";
};
if (getText(missionConfigFile >> "briefingName") in ["THIS IS THE NAME ON THE #MISSIONS LIST", ""]) then {
_warningText pushBack "<t font='EtelkaMonospacePro' size='0.7'>mission_settings\briefingName</t> is blank or default!";
};
if (getText(missionConfigFile >> "overviewText") in ["THIS IS WHERE YOU DESCRIBE THE MISSION IN THE #MISSION LIST", ""]) then {
_warningText pushBack "<t font='EtelkaMonospacePro' size='0.7'>mission_settings\overviewText</t> is blank or default!";
};
if (getText(missionConfigFile >> "missionSeries") in ["MY SERIES NAME", ""]) then {
_warningText pushBack "<t font='EtelkaMonospacePro' size='0.7'>mission_settings\missionSeries</t> is blank or default!";
};
if (count GVARMAIN(baseObjects) isEqualTo 0) then {
_warningText pushBack "No respawn points placed!";
};
if (count _warningText > 0) then {
[{
if (isNull (call BIS_fnc_displayMission)) exitWith {};
(_this#0) spawn {
[_this joinString "<br/>", "Issues found!", true, false] call BIS_fnc_guiMessage;
};
[_this#1] call CBA_fnc_removePerFrameHandler;
}, 1, _warningText] call CBA_fnc_addPerFrameHandler;
};
nil;

View File

@@ -1,19 +1,17 @@
#include "..\script_component.hpp"
if ( !hasInterface ) exitWith {};
["milsim_logText", {
params [["_strArray", [""], [[]]]];
{
diag_log text _x;
} forEach _strArray;
}] call CBA_fnc_addEventHandler;
if (!hasInterface) exitWith {};
// make sure the server has finished init
waitUntil {!isNil QGVARMAIN(complete)};
["InitializePlayer", [player, true]] call BIS_fnc_dynamicGroups;
// run primary init functions
call FUNC(addAARChatHandler);
call FUNC(addRespawnChatHandler);
call FUNC(setDefaults);
// Initialize a holder for managing local diary records
// store records in format:
// [subject, [
@@ -23,6 +21,7 @@ EGVAR(common,diaryRecords) = createHashMap;
// initialize other modules
call EFUNC(client,initClient);
call EFUNC(mapcopy,initClient);
call EFUNC(reinsert,initClient);
call EFUNC(resupply,initClient);
@@ -33,6 +32,8 @@ call EFUNC(fbcb2_main,initClient);
call EFUNC(fbcb2_assets,initClient);
call FUNC(checkMissionSettings);
[
LEVEL_DEBUG,
QUOTE(COMPONENT),

View File

@@ -9,16 +9,6 @@ publicVariable QGVARMAIN(baseObjects);
// Initializes the Dynamic Groups framework and groups
["Initialize", [true]] call BIS_fnc_dynamicGroups;
if (isDedicated) then {
["milsim_logText", {
params [["_strArray", [""], [[]]]];
{
diag_log text _x;
} forEach _strArray;
}] call CBA_fnc_addEventHandler;
};
// initialize other modules
call EFUNC(common,logMissionInfo);
call EFUNC(fbcb2_assets,initServer);

View File

@@ -1,5 +1,7 @@
#include "..\script_component.hpp"
if (!hasInterface) exitWith {};
enableSaving[false, false];
enableRadio false;

View File

@@ -10,6 +10,9 @@ private _mapCopyAction =
"\a3\ui_f\data\igui\cfg\actions\talk_ca.paa",
{
params ["_target", "_player", "_params"];
if (!isPlayer _target) exitWith {
format["%1 is not a player", name _target] call CBA_fnc_notify;
};
format["Copying map markers from %1", name _target] call CBA_fnc_notify;
[QGVAR(mapCopyRequest), _this, _target] call CBA_fnc_targetEvent;
},

View File

@@ -1,5 +1,27 @@
#include "..\script_component.hpp"
[
QGVAR(emptyGroupCleanup_enable),
"CHECKBOX",
"Empty Group Cleanup Enabled",
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)],
true,
true,
{
params ["_value"];
[
QGVAR(emptyGroupCleanup_enable),
_value
] call EFUNC(common,logSettingChanged);
if (!isNull (missionNamespace getVariable [QGVAR(emptyGroupCleanupPFH), locationNull])) then {
deleteLocation GVAR(emptyGroupCleanupPFH);
};
call FUNC(addEmptyGroupCleanupPFH);
}
] call CBA_fnc_addSetting;
//---------------------
// Server CPS
//---------------------

View File

@@ -7,7 +7,7 @@
[]
] call EFUNC(common,log);
_emptyGroupPFH = [
GVAR(emptyGroupCleanupPFH) = [
{
{
if (local _x) then {
@@ -19,7 +19,7 @@ _emptyGroupPFH = [
},
300,
[],
{
{ // on creation
[
LEVEL_INFO,
QUOTE(COMPONENT),
@@ -27,15 +27,16 @@ _emptyGroupPFH = [
[]
] call EFUNC(common,log);
},
{ [
{ // on deletion
[
LEVEL_INFO,
QUOTE(COMPONENT),
"Empty group deletion PFH unloaded",
[]
] call EFUNC(common,log);
},
{ true },
{ false },
{ (missionNamespace getVariable [QGVAR(emptyGroupCleanup_enable), false]) },
{ not (missionNamespace getVariable [QGVAR(emptyGroupCleanup_enable), false]) },
[]
] call CBA_fnc_createPerFrameHandlerObject;

View File

@@ -1,18 +0,0 @@
#include "..\script_component.hpp"
// subroutine to gather nearest 50 units every 5 seconds and store in GVAR(drawTargets)
// cleanup
if (!isNil QGVAR(getEntitiesPFH)) then {
[GVAR(getEntitiesPFH)] call CBA_fnc_removePerFrameHandler;
};
// add pfh
GVAR(getEntitiesPFH) = [{
GVAR(drawTargets) = (
(allUnits + allDeadMen) select {
_x isKindOf "CAManBase" &&
player distance _x < 50 &&
!isNull _x &&
player isNotEqualTo _x
}
);
}, 10] call CBA_fnc_addPerFrameHandler;

View File

@@ -1,6 +1,6 @@
/*
milsim_fnc_addMedicalOverlayPFH
milsim_triageIcons_fnc_draw3D
Author: IndigoFox
@@ -14,30 +14,20 @@ Description:
#include "..\script_component.hpp"
if (!hasInterface) exitWith {};
// Per-frame handler to draw icons
// cleanup
if (!isNil QGVAR(drawIconsPfh)) then {
[GVAR(drawIconsPfh)] call CBA_fnc_removePerFrameHandler;
};
// add pfh
GVAR(drawIconsPfh) = [{
// adds codeblock to common array to be processed per frame
private _code = {
// if disabled, skip processing
if (!GVAR(setting_enabled)) exitWith {false};
// if no targets, skip processing
if (count GVAR(drawTargets) == 0) exitWith {false};
// if the player doesn't have medical perms, skip processing
if !([player] call ace_medical_treatment_fnc_isMedic) exitWith {false};
{
private _unit = _x;
// distance within X meters
if (player distance _unit > GVAR(setting_drawRange)) then {continue};
// check unit not null, not conscious, and not in a vehicle
if (
!(_unit getVariable ["ACE_isUnconscious", false]) ||
!isNull (objectParent _unit)
) then {continue};
// color based on triage level
private _triageLevel = _unit getVariable ["ace_medical_triageLevel", 4];
if (_triageLevel == -1) then {continue};
@@ -57,6 +47,17 @@ GVAR(drawIconsPfh) = [{
true // outline
// further params optional, omitted
];
} forEach GVAR(drawTargets);
}, 0, []] call CBA_fnc_addPerFrameHandler;
true;
} count (
(localNamespace getVariable [QEGVAR(client,nearMen), []]) select {
// is unconscious and is NOT in vehicle and is within draw range
(_x getVariable ["ACE_isUnconscious", false]) &&
isNull (objectParent _x) &&
player distance _x <= GVAR(setting_drawRange)
}
);
};
// add codeblock to common array
[_code] call EFUNC(client,registerPFHCode);

View File

@@ -1,7 +1,8 @@
#include "..\script_component.hpp"
// List of units to draw icons for
GVAR(drawTargets) = [];
if (!hasInterface) exitWith {};
call FUNC(draw3D);
[
LEVEL_DEBUG,

View File

@@ -0,0 +1,103 @@
#include "..\script_component.hpp"
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
if (!isClass _vehicleFlagsCfg) exitWith {
["WARNING: Vehicle Flags: Vehicle Flags config not found. Vehicle Flags will not be available."] call BIS_fnc_error;
};
private _baseClassesToApplyActionsFor =
(_vehicleFlagsCfg >> "baseClassesToApplyActionsFor") call BIS_fnc_getCfgDataArray;
private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_returnChildren;
{ // forEach _baseClassesToApplyActionsFor
private _parentClass = _x;
////////////////////////////////////////////////////////////////////////
// create the root action
////////////////////////////////////////////////////////////////////////
private _rootActionID = QGVAR(SetVehicleFlagAction);
private _flagRootAction = [
_rootActionID, // id
"Set Vehicle Flag", // displayed title
"\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
{
params ["_target", "_player", "_params"];
// set broadcasted variable of self to indicate we're looking at flags
_player setVariable [QGVAR(inFlagMenu), true, true];
[{_this setVariable [QGVAR(inFlagMenu), false, true];}, _player, 3] call CBA_fnc_waitAndExecute;
true
}, // statement
{
params ["_target", "_player", "_params"];
// _params params ["_parentActionID", "_flagCategories"];
// check if vehicle is excluded
private _excluded = [typeOf _target] call FUNC(isClassExcluded);
if (_excluded || !alive _target) exitWith {false};
true;
}, // condition
{
////////////////////////////////////////////////////////////////////////
// create the flag category actions (with nested flag actions)
////////////////////////////////////////////////////////////////////////
params ["_target", "_player", "_params"];
_params params ["_rootActionID"];
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
if (isNull _vehicleFlagsCfg) exitWith {[]};
private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_returnChildren;
// return category child actions with individual flag actions nested as children
[_rootActionID, _flagCategoryCfgs] call FUNC(getActionsFlagCategories);
}, // child code
[_rootActionID], // params
nil, // position
4, // distance
[false, false, false, true, false], // other params - run on hover is true
nil // modifier function code
] call ace_interact_menu_fnc_createAction;
////////////////////////////////////////////////////////////////////////
// add root action to add flags
////////////////////////////////////////////////////////////////////////
[
_parentClass, // parent classname
0, // action 0 or self-action 1
["ACE_MainActions"], // parent
_flagRootAction, // action
true // apply to child classes
] call ace_interact_menu_fnc_addActionToClass;
////////////////////////////////////////////////////////////////////////
// add action to remove flag under the root action
////////////////////////////////////////////////////////////////////////
// create action
private _removeFlagAction = [
_rootActionID + "_removeflag", // id
"Remove Flag", // displayed title
"\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
{
params ["_target", "_player", "_params"];
_target forceFlagTexture "";
}, // statement
{
params ["_target", "_player", "_params"];
alive _target && getForcedFlagTexture _target != "";
}, // condition
nil // child code
] call ace_interact_menu_fnc_createAction;
// add the action to the vehicle
// in this class event handler, this#0 will be the vehicle
[
_parentClass, // parent classname
0, // action 0 or self-action 1
["ACE_MainActions", _rootActionID], // parent
_removeFlagAction, // action
true // apply to child classes
] call ace_interact_menu_fnc_addActionToClass;
} forEach _baseClassesToApplyActionsFor;

View File

@@ -0,0 +1,24 @@
#include "..\script_component.hpp"
// we'll use this to display status if nearby players are in the flag menu
// adds codeblock to common array to be processed per frame
private _code = {
private _unitsToDraw = (localNamespace getVariable [QEGVAR(client,nearMen), []]) select {
(_x getVariable [QGVAR(inFlagMenu), false]) && {
// distance within X meters
player distance _x <= 15 ||
// check unit not in a vehicle
isNull (objectParent _x)
}
};
[
_unitsToDraw,
"",
"Setting vehicle flag...",
[0.9, 0.9, 0.9, 1]
] call EFUNC(common,draw3dIconStatus);
};
// add codeblock to common array
[_code] call EFUNC(client,registerPFHCode);

View File

@@ -2,101 +2,8 @@
if (!hasInterface) exitWith {};
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
if (!isClass _vehicleFlagsCfg) exitWith {
["WARNING: Vehicle Flags: Vehicle Flags config not found. Vehicle Flags will not be available."] call BIS_fnc_error;
};
private _baseClassesToApplyActionsFor =
(_vehicleFlagsCfg >> "baseClassesToApplyActionsFor") call BIS_fnc_getCfgDataArray;
private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_returnChildren;
{ // forEach _baseClassesToApplyActionsFor
private _parentClass = _x;
////////////////////////////////////////////////////////////////////////
// create the root action
////////////////////////////////////////////////////////////////////////
private _rootActionID = QGVAR(SetVehicleFlagAction);
private _flagRootAction = [
_rootActionID, // id
"Set Vehicle Flag", // displayed title
"\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
{true}, // statement
{
params ["_target", "_player", "_params"];
// _params params ["_parentActionID", "_flagCategories"];
// check if vehicle is excluded
private _excluded = [typeOf _target] call FUNC(isClassExcluded);
if (_excluded || !alive _target) exitWith {false};
true;
}, // condition
{
////////////////////////////////////////////////////////////////////////
// create the flag category actions (with nested flag actions)
////////////////////////////////////////////////////////////////////////
params ["_target", "_player", "_params"];
_params params ["_rootActionID"];
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
if (isNull _vehicleFlagsCfg) exitWith {[]};
private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_returnChildren;
// return category child actions with individual flag actions nested as children
[_rootActionID, _flagCategoryCfgs] call FUNC(getActionsFlagCategories);
}, // child code
[_rootActionID], // params
nil, // position
4, // distance
[false, false, false, false, false], // other params
nil // modifier function code
] call ace_interact_menu_fnc_createAction;
////////////////////////////////////////////////////////////////////////
// add root action to add flags
////////////////////////////////////////////////////////////////////////
[
_parentClass, // parent classname
0, // action 0 or self-action 1
["ACE_MainActions"], // parent
_flagRootAction, // action
true // apply to child classes
] call ace_interact_menu_fnc_addActionToClass;
////////////////////////////////////////////////////////////////////////
// add action to remove flag under the root action
////////////////////////////////////////////////////////////////////////
// create action
private _removeFlagAction = [
_rootActionID + "_removeflag", // id
"Remove Flag", // displayed title
"\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
{
params ["_target", "_player", "_params"];
_target forceFlagTexture "";
}, // statement
{
params ["_target", "_player", "_params"];
alive _target && getForcedFlagTexture _target != "";
}, // condition
nil // child code
] call ace_interact_menu_fnc_createAction;
// add the action to the vehicle
// in this class event handler, this#0 will be the vehicle
[
_parentClass, // parent classname
0, // action 0 or self-action 1
["ACE_MainActions", _rootActionID], // parent
_removeFlagAction, // action
true // apply to child classes
] call ace_interact_menu_fnc_addActionToClass;
} forEach _baseClassesToApplyActionsFor;
call FUNC(addFlagActions);
call FUNC(draw3D);
[
LEVEL_DEBUG,

2
images/leaflets/.gitkeep Normal file
View File

@@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 KiB

View File

@@ -1,4 +1,4 @@
author = "MISSION AUTHOR";
author = "MISSION AUTHOR";
onLoadName = "THIS APPEARS ON TOP OF THE LOADING SCREEN IMAGE";
loadScreen = "mission.jpg";
onLoadMission = "THIS APPEARS BELOW THE LOADING SCREEN IMAGE";
@@ -9,8 +9,28 @@ overviewText = "THIS IS WHERE YOU DESCRIBE THE MISSION IN THE #MISSION LIST";
// The name for the series of missions of your campaign. Used for organizational and search purposes
missionSeries = "MY SERIES NAME";
// activate via #ace-fortify west base 2000
// What kind of mission is this? (Use only one)
missionGroup = "17thSaturdayOp";
// missionGroup = "17thFridayOp";
// missionGroup = "17thWednesdayOp";
// missionGroup = "17thFTX";
// missionGroup = "17thTraining";
// Add waypoints to players' MicroDAGR devices
// respawn locations (bases) are added by default, don't put them here
custom_microdagr_waypoints[] = {
// the first element is the waypoint name
// the second element is the position of the waypoint - you may use a string for map grid (up to 10 digit) or an array for {X, Y} coordinates
// the third element is optional - provide the variable name of an object if you want to use its initial position instead
// {"WAYPOINT NAME", {POSITION <[x,y]>}, OBJECT <objNull>},
// EXAMPLES:
// {"KAVALA HOSPITAL", {1234.56, 7890.12}, ""},
// {"CAMP TEMPEST", "03421460, ""},
// {"MY CUSTOM OBJECT", {}, "myCustomObject"}
};
// activate via #ace-fortify west base 2000
class ACEX_Fortify_Presets {
class base {
displayName = "Ken Custom";