Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
45c662e
Update HEMTT to 1.23 and fix check findings
headswe Oct 31, 2026
c73e2d0
Remove BF-888S edits picked up by mistake
headswe Oct 31, 2026
3b88013
Fix SQF command and event name casing
headswe Oct 31, 2026
82dfa28
Fix undefined variables found by HEMTT
headswe Oct 31, 2026
1c1b8f6
acre2: clean up HEMTT lint findings
headswe Oct 31, 2026
755a2bc
acre2: use negative select index
headswe Oct 31, 2026
45cbc9e
acre2: build briefing text with arrays and joinString
headswe Oct 31, 2026
0e73241
adminmenu: fix bugs and clean up HEMTT lint findings
headswe Oct 31, 2026
e0fb0bb
ai: clean up HEMTT lint findings
headswe Oct 31, 2026
d632753
ai: spread wave spawning over frames to stop lag spikes
headswe Oct 31, 2026
6937711
ai: spawn wave vehicles in the same frame as their crew
headswe Oct 31, 2026
f95cb1a
assigngear: clean up HEMTT lint findings
headswe Oct 31, 2026
7819f32
autotest: fix RPT output and clean up lint findings
headswe Oct 31, 2026
d1608a5
briefing: clean up HEMTT lint findings
headswe Oct 31, 2026
d0cf5bb
chat: fix #loadout faction lookup and clean up lint findings
headswe Oct 31, 2026
be4b266
common: replace dead admin messages and BIS_fnc_MP in endMission
headswe Oct 31, 2026
c2eb613
modules: remove macro argument padding
headswe Oct 31, 2026
7e405a5
patrol, respawn, zeus: clean up HEMTT lint findings
headswe Oct 31, 2026
b3f0978
safestart: remove macro argument padding
headswe Oct 31, 2026
15bca4e
teleport: clean up HEMTT lint findings
headswe Oct 31, 2026
68923bd
orbat: fix editor bugs and clean up lint findings
headswe Oct 31, 2026
e1b51b5
spectator: clean up HEMTT lint findings
headswe Oct 31, 2026
8641e28
autotest: use countSide for the group count
headswe Oct 31, 2026
7dfd477
Replace deprecated BIS functions flagged by the a3ref reference
headswe Oct 31, 2026
426ddd3
Add a local launch script and HEMTT launch config
headswe Nov 1, 2026
1fad140
launch: open the TMF template mission in Eden
headswe Nov 1, 2026
aaab8f5
adminmenu: follow CBA's renamed debug console check
headswe Nov 1, 2026
6864a29
spectator: open CBA settings from the Eden menu
headswe Nov 1, 2026
41f0272
spectator: remove the TMF Spectator Settings Eden menu item
headswe Nov 1, 2026
11e8036
common: take the slotting-screen test from feature/add-bf888s
headswe Nov 1, 2026
99948d0
Reword autotest messages and CBA setting descriptions
headswe Nov 1, 2026
1ddd579
launch: drop parameters HEMTT already passes
headswe Nov 1, 2026
4c7314f
adminmenu: give the utility modal its own IDD
headswe Nov 1, 2026
ce69a5a
Keep UIs in proportion on ultrawide screens and tidy UI handlers
headswe Nov 1, 2026
92a8aed
adminmenu: remove unused, corrupt square_ca.paa
headswe Nov 1, 2026
de2c60b
Fix spectator tags config and inline the UI canvas expressions
headswe Nov 3, 2026
f29b4de
Rapify all addon configs
headswe Nov 3, 2026
91769c9
Clear config warnings exposed by rapify
headswe Nov 3, 2026
068e920
safestart: size the banner text boxes to their fonts
headswe Nov 3, 2026
655e40a
Merge dev into claude/project-thread-op72q3
headswe Nov 3, 2026
83f7a3e
Use ACE kill tracker debriefing include
headswe Nov 1, 2026
7c5ce02
Remove TMF lobby slotting group names
headswe Nov 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/workflows/build_pbo.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Setup HEMTT
uses: arma-actions/hemtt@v1
- name: Run HEMTT build
Expand Down
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
.vscode/*
.hemttout/*
releases
releases
.hemttprivatekey
*.biprivatekey
7 changes: 7 additions & 0 deletions .hemtt/launch.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[default]
mission = "tmf_template.vr" # Open the TMF template mission in Eden
workshop = [
"450814997", # CBA_A3
"751965892", # ACRE2
]
# HEMTT already passes -skipIntro -noSplash -showScriptErrors -debug and -filePatching
2 changes: 1 addition & 1 deletion .hemtt/lints.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ options.ignore = [

[sqf.var_all_caps]
options.ignore = [
"SLX_*", "ACE_*"
"SLX_*", "ACE_*", "ACRE_*", "MAIN_IDCS", "EDIT_IDCS", "MOVE_IDCS"
]

[sqf.undefined]
Expand Down
1 change: 1 addition & 0 deletions .hemtt/project.toml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
name = "TMF"
prefix = "tmf"
mainprefix = "x"
[version]
path = "addons/main/script_mod.hpp"
296 changes: 147 additions & 149 deletions addons/acre2/Cfg3DEN.hpp

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion addons/acre2/CfgLoadouts.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -325,4 +325,4 @@ class cfgLoadouts
};
};
};
};
};
5 changes: 0 additions & 5 deletions addons/acre2/addon.toml

This file was deleted.

2 changes: 1 addition & 1 deletion addons/acre2/config.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include "script_component.hpp"

class cfgPatches
class CfgPatches
{
class ADDON
{
Expand Down
4 changes: 2 additions & 2 deletions addons/acre2/display3DEN.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
class ctrlMenuStrip;
class display3DEN
class Display3DEN
{
class Controls
{
Expand All @@ -19,4 +19,4 @@ class display3DEN
};
};
};
};
};
40 changes: 18 additions & 22 deletions addons/acre2/functions/fnc_clientInit.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ if (!alive player) exitWith {};


//Call ACRE API
if (count _languagesToSpeak > 0) then {
if (_languagesToSpeak isNotEqualTo []) then {
_languagesToSpeak call acre_api_fnc_babelSetSpokenLanguages;
[_languagesToSpeak select 0] call acre_api_fnc_babelSetSpeakingLanguage;
};
Expand Down Expand Up @@ -168,19 +168,15 @@ if (!alive player) exitWith {};



private _text = "<br/><font size='16'>RADIO CHANNEL LISTING</font>";
private _textParts = ["<br/><font size='16'>RADIO CHANNEL LISTING</font>"];
{
private _radioSettingsIndex = _forEachIndex;
if (count (_channelsProcessed select _radioSettingsIndex) > 0) then { // If at least one channel is defined.
_text = _text + "<br/>For: ";
_radioFreqInfo = _x;
_radioList = _radioFreqInfo select 0;
_radio = (_radioList select 0);
{
if (_forEachIndex != 0) then {_text = _text + ", "; };
_text = _text + getText (configfile >> "CfgWeapons" >> _x >> "displayName");
} forEach _radioList;
_text = _text + ":<br/>";
private _radioFreqInfo = _x;
private _radioList = _radioFreqInfo select 0;
private _radio = (_radioList select 0);
private _radioNames = _radioList apply {getText (configFile >> "CfgWeapons" >> _x >> "displayName")};
_textParts pushBack format ["<br/>For: %1:<br/>", _radioNames joinString ", "];

{
private _chanNum = _forEachIndex +1;
Expand All @@ -195,13 +191,13 @@ if (!alive player) exitWith {};
};
};
private _channelLine = format["CHN %1 (%2 MHz) - %3 - %4",_chanNum,_frequency,(_x select 0),(_x select 1)];
_defaultRadio = (_x select 2);
if (_x select ((count _x) -1 )) then { // if player is supposet to be on this channel
private _defaultRadio = (_x select 2);
if (_x select -1) then { // if player is supposet to be on this channel
// Match radio to number...
private _radioFndIdx = -1;
{
if (_radioFndIdx != -1) exitWith {};
_radioID = _forEachIndex;
private _radioID = _forEachIndex;
if (!(_radioID in _usedRadioIndexs)) then {
if (_x in _radioList) then {
_radioFndIdx = _radioID;
Expand All @@ -222,18 +218,18 @@ if (!alive player) exitWith {};
} else {
_channelLine = " " +_channelLine + "<br/>";
};
_text = _text + _channelLine;
_textParts pushBack _channelLine;
} forEach (_channelsProcessed select _radioSettingsIndex);
};
} forEach GVAR(radioCoreSettings);

private _myRadiosText = "<br/><br/><font size='16'>MY ASSIGNED RADIOS</font><br/>";
private _myRadiosParts = ["<br/><br/><font size='16'>MY ASSIGNED RADIOS</font><br/>"];
{
_color = [_forEachIndex] call EFUNC(common,numToColor);
_myRadiosText = _myRadiosText + format["<font color='%1'>%2</font><br/>",_color,getText (configfile >> "CfgWeapons" >> _x >> "displayName")];
private _color = [_forEachIndex] call EFUNC(common,numToColor);
_myRadiosParts pushBack format["<font color='%1'>%2</font><br/>",_color,getText (configFile >> "CfgWeapons" >> _x >> "displayName")];
} forEach _radiosToGive;

_text = _ltext + _myRadiosText + _text;
private _text = _ltext + (_myRadiosParts joinString "") + (_textParts joinString "");

//Provide instructions on the page. such as * to denote a channel you are suppose to be on, explain what the colours mean.
player createDiaryRecord ["diary", ["ACRE2", _text]];
Expand All @@ -243,7 +239,7 @@ if (!alive player) exitWith {};
// Uses CBA PFH to have a delay yet ensure code is still run in the unscheduled enviornment.

private _delay = 0;
if (didJip) then { _delay = 3; }; // If jip give more time.
if (didJIP) then { _delay = 3; }; // If jip give more time.

[{
// On finish wait.
Expand Down Expand Up @@ -282,7 +278,7 @@ if (!alive player) exitWith {};
};

//Create addAction to give radio.
private _radioName = getText (configfile >> "CfgWeapons" >> _x >> "displayName");
private _radioName = getText (configFile >> "CfgWeapons" >> _x >> "displayName");
private _actionID = _unit addAction [format ["<t color='#3375D6'>[Radios] Give myself a %1 radio</t>",_radioName],
{
private _radioToGive = (_this select 3) select 0;
Expand Down Expand Up @@ -332,7 +328,7 @@ if (!alive player) exitWith {};
// Give addActions to addRadios.
if (!isNil QGVAR(radioAddActions)) then {
{
private _actionid_action = _unit addAction [format["<t color='#c3d633'>[Radios] Give myself a %1 radio (check your inventory for space)</t>",getText (configfile >> "CfgWeapons" >> _x >> "displayName")],
private _actionid_action = _unit addAction [format["<t color='#c3d633'>[Radios] Give myself a %1 radio (check your inventory for space)</t>",getText (configFile >> "CfgWeapons" >> _x >> "displayName")],
format["if ((_this select 0) canAdd '%1') then { (_this select 0) addItem '%1'; (_this select 0) removeAction (_this select 2); } else { systemChat '[TMF ACRE2] No space for radios'; };",_x],0,0,false,true,"","(_target == _this)"];
[_actionid_action,_unit] spawn {
sleep 300;
Expand Down
6 changes: 3 additions & 3 deletions addons/acre2/functions/fnc_createPresets.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ private _sharedRadioChannelListing = [];
if (!_return) then {
private _radioPresetData = [] call acre_main_fnc_fastHashCreate;//HASH_CREATE;

_channels = [];
private _channels = [];
for "_i" from 0 to 15 do {
private _channel = [] call acre_main_fnc_fastHashCreate;//HASHLIST_CREATEHASH(_channels);
_channel setVariable ["frequencyTX",0];
Expand Down Expand Up @@ -119,7 +119,7 @@ private _sharedRadioChannelListing = [];
if (_i > (count _channelList)) then {
_channelName = "Channel " + str(_i);
} else {
_channelEntry = _channelList select (_i-1);
private _channelEntry = _channelList select (_i-1);
_channelName = (_channelEntry select 0);
if (_channelEntry select 4) then { // Check if this is a shared channel.
_frequency = [_radioSettingIndex, (count GVAR(networksWithRadioChannels)), (_channelEntry select 5)] call _calcChanFreq; // Use 'special preset' and 'special channel' number.
Expand All @@ -134,4 +134,4 @@ private _sharedRadioChannelListing = [];
} forEach GVAR(radioCoreSettings);
} forEach GVAR(networksWithRadioChannels);

tmf_acre2_networksCreated = true;
tmf_acre2_networksCreated = true;
8 changes: 4 additions & 4 deletions addons/acre2/functions/fnc_testBabel.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Author:

private _warnings = [];

if (getmissionconfigvalue ["TMF_AcreBabelEnabled",false]) then {
if (getMissionConfigValue ["TMF_AcreBabelEnabled",false]) then {
LOG("Running Autotest on Babel");
private _babelArray = getMissionConfigValue ["TMF_AcreBabelSettings", []];
if IS_STRING(_babelArray) then {_babelArray = call compile _babelArray};
Expand Down Expand Up @@ -48,15 +48,15 @@ if (getmissionconfigvalue ["TMF_AcreBabelEnabled",false]) then {
if (_unitCond isEqualTo []) then {
// No languages assigned on each level, post warning.
WARNING_1("No languages assigned for %1",_unit);
_warnings pushBack [0,format ["%1 has no Babel languages assigned", _unit]];
_warnings pushBack [0,format ["%1 speaks no Babel language. Assign one in the Eden TMF menu > TMF ACRE2 Settings.", _unit]];
};
} forEach (units _grp);
};
};
} forEach _playerGroups;
if (count _warnings == 0) then {
if (_warnings isEqualTo []) then {
LOG("Babel Autotest finished");
_warnings pushBack [-1,"Babel checks complete"];
_warnings pushBack [-1,"ACRE2 Babel language check done"];
} else {
WARNING_1("Babel Autotest finished with warnings: %1",_warnings);
};
Expand Down
8 changes: 4 additions & 4 deletions addons/acre2/functions/fnc_testNets.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Author:

private _warnings = [];

if (getmissionconfigvalue ["TMF_AcreNetworkEnabled",false]) then {
if (getMissionConfigValue ["TMF_AcreNetworkEnabled",false]) then {
LOG("Running Autotest on Radio Networks");
private _networksArray = getMissionConfigValue ['TMF_AcreSettings', []];
if IS_STRING(_networksArray) then {_networksArray = call compile _networksArray};
Expand Down Expand Up @@ -48,15 +48,15 @@ if (getmissionconfigvalue ["TMF_AcreNetworkEnabled",false]) then {
if (_unitCond isEqualTo -1 || _unitCond > (count (_networksArray # 0)) - 1) then {
// No nets assigned on each level, post warning.
WARNING_1("No Radio Nets assigned for %1",_unit);
_warnings pushBack [0,format ["%1 has no Radio Networks assigned", _unit]];
_warnings pushBack [0,format ["%1 is in no radio network and gets no channels. Assign one in the Eden TMF menu > TMF ACRE2 Settings.", _unit]];
};
} forEach (units _grp);
};
};
} forEach _playerGroups;
if (count _warnings == 0) then {
if (_warnings isEqualTo []) then {
LOG("Radio Net Autotest finished");
_warnings pushBack [-1,"ACRE2 Radio Network checks complete"];
_warnings pushBack [-1,"ACRE2 radio network check done"];
} else {
WARNING_1("Radio Networks Autotest finished with warnings: %1",_warnings);
};
Expand Down
5 changes: 5 additions & 0 deletions addons/acre2/script_component.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
#ifndef TMF_ACRE2_SCRIPT_COMPONENT_HPP
#define TMF_ACRE2_SCRIPT_COMPONENT_HPP

#define COMPONENT acre2

#include "\x\tmf\addons\main\script_mod.hpp"
#include "\x\tmf\addons\main\script_macros.hpp"

#define SPECTATOR_IDC_RADIO_INFO 7076

#endif // TMF_ACRE2_SCRIPT_COMPONENT_HPP
52 changes: 26 additions & 26 deletions addons/acre2/ui_scripts/AcreAddRadioActions.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -11,32 +11,32 @@ switch _mode do {
case "onLoad": {
//Add EH On touch

_ctrlGroup = _params select 0;
private _ctrlGroup = _params select 0;
AcreAddRadioActions_ctrlGroup = _ctrlGroup;

_ctrlGroup ctrladdeventhandler ["setfocus",{with uinamespace do {AcreAddRadioActions_ctrlGroup = _this select 0;};}];
_ctrlGroup ctrladdeventhandler ["killfocus",{with uinamespace do {AcreAddRadioActions_ctrlGroup = nil;};}];
_ctrlGroup ctrlAddEventHandler ["SetFocus",{with uiNamespace do {AcreAddRadioActions_ctrlGroup = _this select 0;};}];
_ctrlGroup ctrlAddEventHandler ["KillFocus",{with uiNamespace do {AcreAddRadioActions_ctrlGroup = nil;};}];

_ctrlList = _ctrlGroup controlsGroupCtrl 101;
_ctrlList ctrladdeventhandler ["lbdblclick",{with uinamespace do {["listModify",[ctrlparentcontrolsgroup (_this select 0),+1],objnull] call AcreAddRadioActions_script;};}];
private _ctrlList = _ctrlGroup controlsGroupCtrl 101;
_ctrlList ctrlAddEventHandler ["LBDblClick",{with uiNamespace do {["listModify",[ctrlParentControlsGroup (_this select 0),+1],objNull] call AcreAddRadioActions_script;};}];

TMF_AcreAddRadioActions_Array = ("TMF_MissionAcre2Attributes" get3DENMissionAttribute "TMF_AcreAddRadioActions");
if (TMF_AcreAddRadioActions_Array isEqualType "") then {
TMF_AcreAddRadioActions_Array = call compile TMF_AcreAddRadioActions_Array;
};

lnbclear _ctrlList;
lnbClear _ctrlList;
_ctrlList lnbSetColumnsPos [0.1,0.2];
{
_weaponCfg = configfile >> "cfgWeapons" >> _x;
_displayName = gettext (_weaponCfg >> "displayName");
_picture = gettext (_weaponCfg >> "picture");
_description = getText (_weaponCfg >> "descriptionShort");
_lnbAdd = _ctrlList lnbaddrow ["",_displayName];
_ctrlList lnbsetdata [[_lnbAdd,0],_x];
_ctrlList lnbsetpicture [[_lnbAdd,0],_picture];
_alpha = if (_x in TMF_AcreAddRadioActions_Array) then {1} else {0.5};
_ctrlList lnbsetcolor [[_lnbAdd,1],[1,1,1,_alpha]];
private _weaponCfg = configFile >> "cfgWeapons" >> _x;
private _displayName = getText (_weaponCfg >> "displayName");
private _picture = getText (_weaponCfg >> "picture");
private _description = getText (_weaponCfg >> "descriptionShort");
private _lnbAdd = _ctrlList lnbAddRow ["",_displayName];
_ctrlList lnbSetData [[_lnbAdd,0],_x];
_ctrlList lnbSetPicture [[_lnbAdd,0],_picture];
private _alpha = [0.5, 1] select (_x in TMF_AcreAddRadioActions_Array);
_ctrlList lnbSetColor [[_lnbAdd,1],[1,1,1,_alpha]];
} forEach ACRE_RADIO_CLASSNAME_ARRAY;
};
case "attributeSave": {
Expand All @@ -52,21 +52,21 @@ switch _mode do {
} else {
TMF_AcreAddRadioActions_Array pushBackUnique _radio;
};
lnbclear _ctrlList;
lnbClear _ctrlList;
_ctrlList lnbSetColumnsPos [0.1,0.2];
{
_weaponCfg = configfile >> "cfgWeapons" >> _x;
_displayName = gettext (_weaponCfg >> "displayName");
_picture = gettext (_weaponCfg >> "picture");
_description = getText (_weaponCfg >> "descriptionShort");
_lnbAdd = _ctrlList lnbaddrow ["",_displayName];
_ctrlList lnbsetdata [[_lnbAdd,0],_x];
_ctrlList lnbsetpicture [[_lnbAdd,0],_picture];
_alpha = if (_x in TMF_AcreAddRadioActions_Array) then {1} else {0.5};
_ctrlList lnbsetcolor [[_lnbAdd,1],[1,1,1,_alpha]];
private _weaponCfg = configFile >> "cfgWeapons" >> _x;
private _displayName = getText (_weaponCfg >> "displayName");
private _picture = getText (_weaponCfg >> "picture");
private _description = getText (_weaponCfg >> "descriptionShort");
private _lnbAdd = _ctrlList lnbAddRow ["",_displayName];
_ctrlList lnbSetData [[_lnbAdd,0],_x];
_ctrlList lnbSetPicture [[_lnbAdd,0],_picture];
private _alpha = [0.5, 1] select (_x in TMF_AcreAddRadioActions_Array);
_ctrlList lnbSetColor [[_lnbAdd,1],[1,1,1,_alpha]];
} forEach ACRE_RADIO_CLASSNAME_ARRAY;
};
case "attributeLoad": {
};

};
};
Loading
Loading