From b132e3922d0a3e35e1c34172c87ee93739cd0938 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Mon, 20 Nov 2023 19:07:11 +0200 Subject: [PATCH 001/228] update gitignore --- .gitignore | 31 ++++++++++++++++++++++++++----- addons/MSP/eh list.txt | 2 ++ addons/Respawn/eh list.txt | 5 +++++ 3 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 addons/MSP/eh list.txt create mode 100644 addons/Respawn/eh list.txt diff --git a/.gitignore b/.gitignore index 3944887..77dd7b2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,27 @@ +.bak +.bikey +.hemttout +.lnk +.md +.txt +.vscode/* +@* +*.biprivatekey +*.cache *.pbo -*.bak -*.lnk -*.bikey -*.txt -*.md +*.sqfc +*.swo +*.swp +*.zip +ArmaScriptCompiler.exe +CHANGELOG.md +extensions/vcproj32/* +extensions/vcproj64/* +hemtt +hemtt.exe +release/* +releases/* +sqfvm.exe +texHeaders.bin +Thumbs.db +tools/temp \ No newline at end of file diff --git a/addons/MSP/eh list.txt b/addons/MSP/eh list.txt new file mode 100644 index 0000000..a55c722 --- /dev/null +++ b/addons/MSP/eh list.txt @@ -0,0 +1,2 @@ +EH Name | locality | params +Tun_msp_EH_contestedUpdate- global - new status, enemy count, enemy count min, Friendly count \ No newline at end of file diff --git a/addons/Respawn/eh list.txt b/addons/Respawn/eh list.txt new file mode 100644 index 0000000..6fedc20 --- /dev/null +++ b/addons/Respawn/eh list.txt @@ -0,0 +1,5 @@ +EH Name | locality | params +Tun_respawn_EH_gearAdded - local- unit +Tun_respawn_EH_moveRespawns - Server - side string (["west"]), units moved +Tun_respawn_EH_unitTeleported - local - unit, destination pos +Tun_respawn_EH_unitRespawned - local - unit \ No newline at end of file From da6ba9acad792e8c7dcb5de6412fdaf5fd24a19a Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Mon, 20 Nov 2023 19:13:33 +0200 Subject: [PATCH 002/228] rename data rename --- data | 1 + 1 file changed, 1 insertion(+) create mode 100644 data diff --git a/data b/data new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/data @@ -0,0 +1 @@ + From f8bf1e8903d2b6fdf94890490d8696e1ad9956c0 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Mon, 20 Nov 2023 19:20:53 +0200 Subject: [PATCH 003/228] case sensitivy --- addons/{Main => main}/Stringtable.xml | 0 addons/{Main => main}/XEH_postInit.sqf | 0 addons/{Main => main}/XEH_preInit.sqf | 0 addons/{Main => main}/XEH_prep.sqf | 0 addons/{Main => main}/config.cpp | 0 addons/{Main => main}/functions/fnc_briefingNotes.sqf | 0 addons/{MSP => main}/functions/script_component.hpp | 0 addons/{Main => main}/script_component.hpp | 0 addons/{MSP => msp}/XEH_postInit.sqf | 0 addons/{MSP => msp}/XEH_preInit.sqf | 0 addons/{MSP => msp}/XEH_preStart.sqf | 0 addons/{MSP => msp}/XEH_prep.sqf | 0 addons/{MSP => msp}/config.cpp | 0 addons/{MSP => msp}/eh list.txt | 0 addons/{MSP => msp}/functions/fnc_ace_actions.sqf | 0 addons/{MSP => msp}/functions/fnc_add_EH.sqf | 0 addons/{MSP => msp}/functions/fnc_briefingNotes.sqf | 0 addons/{MSP => msp}/functions/fnc_contestedCheck.sqf | 0 addons/{MSP => msp}/functions/fnc_create_msp_props.sqf | 0 addons/{MSP => msp}/functions/fnc_init_contested.sqf | 0 addons/{MSP => msp}/functions/fnc_initate_msp_action.sqf | 0 addons/{MSP => msp}/functions/fnc_update_status.sqf | 0 addons/{MSP => msp}/functions/fnc_whoToNotify.sqf | 0 addons/{MSP => msp}/functions/pohja.sqf | 0 addons/{Main => msp}/functions/script_component.hpp | 0 addons/{MSP => msp}/script_component.hpp | 0 addons/{Respawn => respawn}/TP_dialog.hpp | 0 addons/{Respawn => respawn}/XEH_postInit.sqf | 0 addons/{Respawn => respawn}/XEH_preInit.sqf | 0 addons/{Respawn => respawn}/XEH_preStart.sqf | 0 addons/{Respawn => respawn}/XEH_prep.sqf | 0 addons/{Respawn => respawn}/config.cpp | 0 addons/{Respawn => respawn}/eh list.txt | 0 addons/{Respawn => respawn}/functions/fnc_addActionsPlayer.sqf | 0 .../functions/fnc_addCheckTicketCountAction.sqf | 0 addons/{Respawn => respawn}/functions/fnc_addCustomTeleporter.sqf | 0 addons/{Respawn => respawn}/functions/fnc_addGear.sqf | 0 addons/{Respawn => respawn}/functions/fnc_addMainAction.sqf | 0 addons/{Respawn => respawn}/functions/fnc_addTeleportAction.sqf | 0 addons/{Respawn => respawn}/functions/fnc_blackscreen.sqf | 0 addons/{Respawn => respawn}/functions/fnc_checkTicketCount.sqf | 0 addons/{Respawn => respawn}/functions/fnc_createLocalMarker.sqf | 0 addons/{Respawn => respawn}/functions/fnc_delayed_respawn.sqf | 0 addons/{Respawn => respawn}/functions/fnc_force_Respawn.sqf | 0 addons/{Respawn => respawn}/functions/fnc_getOffSet.sqf | 0 addons/{Respawn => respawn}/functions/fnc_getParentAction.sqf | 0 .../{Respawn => respawn}/functions/fnc_getTicketCountPlayer.sqf | 0 addons/{Respawn => respawn}/functions/fnc_killJIP.sqf | 0 addons/{Respawn => respawn}/functions/fnc_killed.sqf | 0 addons/{Respawn => respawn}/functions/fnc_marker_update.sqf | 0 addons/{Respawn => respawn}/functions/fnc_module_respawnpos.sqf | 0 addons/{Respawn => respawn}/functions/fnc_module_teleporter.sqf | 0 addons/{Respawn => respawn}/functions/fnc_module_waitingarea.sqf | 0 addons/{Respawn => respawn}/functions/fnc_moveRespawns.sqf | 0 addons/{Respawn => respawn}/functions/fnc_openTeleportMenu.sqf | 0 addons/{Respawn => respawn}/functions/fnc_radioSettings_tfar.sqf | 0 addons/{Respawn => respawn}/functions/fnc_removegear.sqf | 0 addons/{Respawn => respawn}/functions/fnc_savegear.sqf | 0 addons/{Respawn => respawn}/functions/fnc_startSpectator.sqf | 0 addons/{Respawn => respawn}/functions/fnc_teleport.sqf | 0 addons/{Respawn => respawn}/functions/fnc_teleportButton.sqf | 0 .../{Respawn => respawn}/functions/fnc_teleportOnLBSelChanged.sqf | 0 addons/{Respawn => respawn}/functions/fnc_ticketCounterPlayer.sqf | 0 addons/{Respawn => respawn}/functions/fnc_ticketCounterSide.sqf | 0 addons/{Respawn => respawn}/functions/fnc_timer.sqf | 0 .../functions/fnc_updatePlayerTicketCount.sqf | 0 .../functions/fnc_updateWaitingRespawnList.sqf | 0 .../{Respawn => respawn}/functions/fnc_update_respawn_point.sqf | 0 addons/{Respawn => respawn}/functions/fnc_waitingArea.sqf | 0 addons/{Respawn => respawn}/functions/pohja.sqf | 0 addons/{Respawn => respawn}/functions/script_component.hpp | 0 addons/{Respawn => respawn}/script_component.hpp | 0 72 files changed, 0 insertions(+), 0 deletions(-) rename addons/{Main => main}/Stringtable.xml (100%) rename addons/{Main => main}/XEH_postInit.sqf (100%) rename addons/{Main => main}/XEH_preInit.sqf (100%) rename addons/{Main => main}/XEH_prep.sqf (100%) rename addons/{Main => main}/config.cpp (100%) rename addons/{Main => main}/functions/fnc_briefingNotes.sqf (100%) rename addons/{MSP => main}/functions/script_component.hpp (100%) rename addons/{Main => main}/script_component.hpp (100%) rename addons/{MSP => msp}/XEH_postInit.sqf (100%) rename addons/{MSP => msp}/XEH_preInit.sqf (100%) rename addons/{MSP => msp}/XEH_preStart.sqf (100%) rename addons/{MSP => msp}/XEH_prep.sqf (100%) rename addons/{MSP => msp}/config.cpp (100%) rename addons/{MSP => msp}/eh list.txt (100%) rename addons/{MSP => msp}/functions/fnc_ace_actions.sqf (100%) rename addons/{MSP => msp}/functions/fnc_add_EH.sqf (100%) rename addons/{MSP => msp}/functions/fnc_briefingNotes.sqf (100%) rename addons/{MSP => msp}/functions/fnc_contestedCheck.sqf (100%) rename addons/{MSP => msp}/functions/fnc_create_msp_props.sqf (100%) rename addons/{MSP => msp}/functions/fnc_init_contested.sqf (100%) rename addons/{MSP => msp}/functions/fnc_initate_msp_action.sqf (100%) rename addons/{MSP => msp}/functions/fnc_update_status.sqf (100%) rename addons/{MSP => msp}/functions/fnc_whoToNotify.sqf (100%) rename addons/{MSP => msp}/functions/pohja.sqf (100%) rename addons/{Main => msp}/functions/script_component.hpp (100%) rename addons/{MSP => msp}/script_component.hpp (100%) rename addons/{Respawn => respawn}/TP_dialog.hpp (100%) rename addons/{Respawn => respawn}/XEH_postInit.sqf (100%) rename addons/{Respawn => respawn}/XEH_preInit.sqf (100%) rename addons/{Respawn => respawn}/XEH_preStart.sqf (100%) rename addons/{Respawn => respawn}/XEH_prep.sqf (100%) rename addons/{Respawn => respawn}/config.cpp (100%) rename addons/{Respawn => respawn}/eh list.txt (100%) rename addons/{Respawn => respawn}/functions/fnc_addActionsPlayer.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_addCheckTicketCountAction.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_addCustomTeleporter.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_addGear.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_addMainAction.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_addTeleportAction.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_blackscreen.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_checkTicketCount.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_createLocalMarker.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_delayed_respawn.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_force_Respawn.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_getOffSet.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_getParentAction.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_getTicketCountPlayer.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_killJIP.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_killed.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_marker_update.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_module_respawnpos.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_module_teleporter.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_module_waitingarea.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_moveRespawns.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_openTeleportMenu.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_radioSettings_tfar.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_removegear.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_savegear.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_startSpectator.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_teleport.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_teleportButton.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_teleportOnLBSelChanged.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_ticketCounterPlayer.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_ticketCounterSide.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_timer.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_updatePlayerTicketCount.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_updateWaitingRespawnList.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_update_respawn_point.sqf (100%) rename addons/{Respawn => respawn}/functions/fnc_waitingArea.sqf (100%) rename addons/{Respawn => respawn}/functions/pohja.sqf (100%) rename addons/{Respawn => respawn}/functions/script_component.hpp (100%) rename addons/{Respawn => respawn}/script_component.hpp (100%) diff --git a/addons/Main/Stringtable.xml b/addons/main/Stringtable.xml similarity index 100% rename from addons/Main/Stringtable.xml rename to addons/main/Stringtable.xml diff --git a/addons/Main/XEH_postInit.sqf b/addons/main/XEH_postInit.sqf similarity index 100% rename from addons/Main/XEH_postInit.sqf rename to addons/main/XEH_postInit.sqf diff --git a/addons/Main/XEH_preInit.sqf b/addons/main/XEH_preInit.sqf similarity index 100% rename from addons/Main/XEH_preInit.sqf rename to addons/main/XEH_preInit.sqf diff --git a/addons/Main/XEH_prep.sqf b/addons/main/XEH_prep.sqf similarity index 100% rename from addons/Main/XEH_prep.sqf rename to addons/main/XEH_prep.sqf diff --git a/addons/Main/config.cpp b/addons/main/config.cpp similarity index 100% rename from addons/Main/config.cpp rename to addons/main/config.cpp diff --git a/addons/Main/functions/fnc_briefingNotes.sqf b/addons/main/functions/fnc_briefingNotes.sqf similarity index 100% rename from addons/Main/functions/fnc_briefingNotes.sqf rename to addons/main/functions/fnc_briefingNotes.sqf diff --git a/addons/MSP/functions/script_component.hpp b/addons/main/functions/script_component.hpp similarity index 100% rename from addons/MSP/functions/script_component.hpp rename to addons/main/functions/script_component.hpp diff --git a/addons/Main/script_component.hpp b/addons/main/script_component.hpp similarity index 100% rename from addons/Main/script_component.hpp rename to addons/main/script_component.hpp diff --git a/addons/MSP/XEH_postInit.sqf b/addons/msp/XEH_postInit.sqf similarity index 100% rename from addons/MSP/XEH_postInit.sqf rename to addons/msp/XEH_postInit.sqf diff --git a/addons/MSP/XEH_preInit.sqf b/addons/msp/XEH_preInit.sqf similarity index 100% rename from addons/MSP/XEH_preInit.sqf rename to addons/msp/XEH_preInit.sqf diff --git a/addons/MSP/XEH_preStart.sqf b/addons/msp/XEH_preStart.sqf similarity index 100% rename from addons/MSP/XEH_preStart.sqf rename to addons/msp/XEH_preStart.sqf diff --git a/addons/MSP/XEH_prep.sqf b/addons/msp/XEH_prep.sqf similarity index 100% rename from addons/MSP/XEH_prep.sqf rename to addons/msp/XEH_prep.sqf diff --git a/addons/MSP/config.cpp b/addons/msp/config.cpp similarity index 100% rename from addons/MSP/config.cpp rename to addons/msp/config.cpp diff --git a/addons/MSP/eh list.txt b/addons/msp/eh list.txt similarity index 100% rename from addons/MSP/eh list.txt rename to addons/msp/eh list.txt diff --git a/addons/MSP/functions/fnc_ace_actions.sqf b/addons/msp/functions/fnc_ace_actions.sqf similarity index 100% rename from addons/MSP/functions/fnc_ace_actions.sqf rename to addons/msp/functions/fnc_ace_actions.sqf diff --git a/addons/MSP/functions/fnc_add_EH.sqf b/addons/msp/functions/fnc_add_EH.sqf similarity index 100% rename from addons/MSP/functions/fnc_add_EH.sqf rename to addons/msp/functions/fnc_add_EH.sqf diff --git a/addons/MSP/functions/fnc_briefingNotes.sqf b/addons/msp/functions/fnc_briefingNotes.sqf similarity index 100% rename from addons/MSP/functions/fnc_briefingNotes.sqf rename to addons/msp/functions/fnc_briefingNotes.sqf diff --git a/addons/MSP/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf similarity index 100% rename from addons/MSP/functions/fnc_contestedCheck.sqf rename to addons/msp/functions/fnc_contestedCheck.sqf diff --git a/addons/MSP/functions/fnc_create_msp_props.sqf b/addons/msp/functions/fnc_create_msp_props.sqf similarity index 100% rename from addons/MSP/functions/fnc_create_msp_props.sqf rename to addons/msp/functions/fnc_create_msp_props.sqf diff --git a/addons/MSP/functions/fnc_init_contested.sqf b/addons/msp/functions/fnc_init_contested.sqf similarity index 100% rename from addons/MSP/functions/fnc_init_contested.sqf rename to addons/msp/functions/fnc_init_contested.sqf diff --git a/addons/MSP/functions/fnc_initate_msp_action.sqf b/addons/msp/functions/fnc_initate_msp_action.sqf similarity index 100% rename from addons/MSP/functions/fnc_initate_msp_action.sqf rename to addons/msp/functions/fnc_initate_msp_action.sqf diff --git a/addons/MSP/functions/fnc_update_status.sqf b/addons/msp/functions/fnc_update_status.sqf similarity index 100% rename from addons/MSP/functions/fnc_update_status.sqf rename to addons/msp/functions/fnc_update_status.sqf diff --git a/addons/MSP/functions/fnc_whoToNotify.sqf b/addons/msp/functions/fnc_whoToNotify.sqf similarity index 100% rename from addons/MSP/functions/fnc_whoToNotify.sqf rename to addons/msp/functions/fnc_whoToNotify.sqf diff --git a/addons/MSP/functions/pohja.sqf b/addons/msp/functions/pohja.sqf similarity index 100% rename from addons/MSP/functions/pohja.sqf rename to addons/msp/functions/pohja.sqf diff --git a/addons/Main/functions/script_component.hpp b/addons/msp/functions/script_component.hpp similarity index 100% rename from addons/Main/functions/script_component.hpp rename to addons/msp/functions/script_component.hpp diff --git a/addons/MSP/script_component.hpp b/addons/msp/script_component.hpp similarity index 100% rename from addons/MSP/script_component.hpp rename to addons/msp/script_component.hpp diff --git a/addons/Respawn/TP_dialog.hpp b/addons/respawn/TP_dialog.hpp similarity index 100% rename from addons/Respawn/TP_dialog.hpp rename to addons/respawn/TP_dialog.hpp diff --git a/addons/Respawn/XEH_postInit.sqf b/addons/respawn/XEH_postInit.sqf similarity index 100% rename from addons/Respawn/XEH_postInit.sqf rename to addons/respawn/XEH_postInit.sqf diff --git a/addons/Respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf similarity index 100% rename from addons/Respawn/XEH_preInit.sqf rename to addons/respawn/XEH_preInit.sqf diff --git a/addons/Respawn/XEH_preStart.sqf b/addons/respawn/XEH_preStart.sqf similarity index 100% rename from addons/Respawn/XEH_preStart.sqf rename to addons/respawn/XEH_preStart.sqf diff --git a/addons/Respawn/XEH_prep.sqf b/addons/respawn/XEH_prep.sqf similarity index 100% rename from addons/Respawn/XEH_prep.sqf rename to addons/respawn/XEH_prep.sqf diff --git a/addons/Respawn/config.cpp b/addons/respawn/config.cpp similarity index 100% rename from addons/Respawn/config.cpp rename to addons/respawn/config.cpp diff --git a/addons/Respawn/eh list.txt b/addons/respawn/eh list.txt similarity index 100% rename from addons/Respawn/eh list.txt rename to addons/respawn/eh list.txt diff --git a/addons/Respawn/functions/fnc_addActionsPlayer.sqf b/addons/respawn/functions/fnc_addActionsPlayer.sqf similarity index 100% rename from addons/Respawn/functions/fnc_addActionsPlayer.sqf rename to addons/respawn/functions/fnc_addActionsPlayer.sqf diff --git a/addons/Respawn/functions/fnc_addCheckTicketCountAction.sqf b/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf similarity index 100% rename from addons/Respawn/functions/fnc_addCheckTicketCountAction.sqf rename to addons/respawn/functions/fnc_addCheckTicketCountAction.sqf diff --git a/addons/Respawn/functions/fnc_addCustomTeleporter.sqf b/addons/respawn/functions/fnc_addCustomTeleporter.sqf similarity index 100% rename from addons/Respawn/functions/fnc_addCustomTeleporter.sqf rename to addons/respawn/functions/fnc_addCustomTeleporter.sqf diff --git a/addons/Respawn/functions/fnc_addGear.sqf b/addons/respawn/functions/fnc_addGear.sqf similarity index 100% rename from addons/Respawn/functions/fnc_addGear.sqf rename to addons/respawn/functions/fnc_addGear.sqf diff --git a/addons/Respawn/functions/fnc_addMainAction.sqf b/addons/respawn/functions/fnc_addMainAction.sqf similarity index 100% rename from addons/Respawn/functions/fnc_addMainAction.sqf rename to addons/respawn/functions/fnc_addMainAction.sqf diff --git a/addons/Respawn/functions/fnc_addTeleportAction.sqf b/addons/respawn/functions/fnc_addTeleportAction.sqf similarity index 100% rename from addons/Respawn/functions/fnc_addTeleportAction.sqf rename to addons/respawn/functions/fnc_addTeleportAction.sqf diff --git a/addons/Respawn/functions/fnc_blackscreen.sqf b/addons/respawn/functions/fnc_blackscreen.sqf similarity index 100% rename from addons/Respawn/functions/fnc_blackscreen.sqf rename to addons/respawn/functions/fnc_blackscreen.sqf diff --git a/addons/Respawn/functions/fnc_checkTicketCount.sqf b/addons/respawn/functions/fnc_checkTicketCount.sqf similarity index 100% rename from addons/Respawn/functions/fnc_checkTicketCount.sqf rename to addons/respawn/functions/fnc_checkTicketCount.sqf diff --git a/addons/Respawn/functions/fnc_createLocalMarker.sqf b/addons/respawn/functions/fnc_createLocalMarker.sqf similarity index 100% rename from addons/Respawn/functions/fnc_createLocalMarker.sqf rename to addons/respawn/functions/fnc_createLocalMarker.sqf diff --git a/addons/Respawn/functions/fnc_delayed_respawn.sqf b/addons/respawn/functions/fnc_delayed_respawn.sqf similarity index 100% rename from addons/Respawn/functions/fnc_delayed_respawn.sqf rename to addons/respawn/functions/fnc_delayed_respawn.sqf diff --git a/addons/Respawn/functions/fnc_force_Respawn.sqf b/addons/respawn/functions/fnc_force_Respawn.sqf similarity index 100% rename from addons/Respawn/functions/fnc_force_Respawn.sqf rename to addons/respawn/functions/fnc_force_Respawn.sqf diff --git a/addons/Respawn/functions/fnc_getOffSet.sqf b/addons/respawn/functions/fnc_getOffSet.sqf similarity index 100% rename from addons/Respawn/functions/fnc_getOffSet.sqf rename to addons/respawn/functions/fnc_getOffSet.sqf diff --git a/addons/Respawn/functions/fnc_getParentAction.sqf b/addons/respawn/functions/fnc_getParentAction.sqf similarity index 100% rename from addons/Respawn/functions/fnc_getParentAction.sqf rename to addons/respawn/functions/fnc_getParentAction.sqf diff --git a/addons/Respawn/functions/fnc_getTicketCountPlayer.sqf b/addons/respawn/functions/fnc_getTicketCountPlayer.sqf similarity index 100% rename from addons/Respawn/functions/fnc_getTicketCountPlayer.sqf rename to addons/respawn/functions/fnc_getTicketCountPlayer.sqf diff --git a/addons/Respawn/functions/fnc_killJIP.sqf b/addons/respawn/functions/fnc_killJIP.sqf similarity index 100% rename from addons/Respawn/functions/fnc_killJIP.sqf rename to addons/respawn/functions/fnc_killJIP.sqf diff --git a/addons/Respawn/functions/fnc_killed.sqf b/addons/respawn/functions/fnc_killed.sqf similarity index 100% rename from addons/Respawn/functions/fnc_killed.sqf rename to addons/respawn/functions/fnc_killed.sqf diff --git a/addons/Respawn/functions/fnc_marker_update.sqf b/addons/respawn/functions/fnc_marker_update.sqf similarity index 100% rename from addons/Respawn/functions/fnc_marker_update.sqf rename to addons/respawn/functions/fnc_marker_update.sqf diff --git a/addons/Respawn/functions/fnc_module_respawnpos.sqf b/addons/respawn/functions/fnc_module_respawnpos.sqf similarity index 100% rename from addons/Respawn/functions/fnc_module_respawnpos.sqf rename to addons/respawn/functions/fnc_module_respawnpos.sqf diff --git a/addons/Respawn/functions/fnc_module_teleporter.sqf b/addons/respawn/functions/fnc_module_teleporter.sqf similarity index 100% rename from addons/Respawn/functions/fnc_module_teleporter.sqf rename to addons/respawn/functions/fnc_module_teleporter.sqf diff --git a/addons/Respawn/functions/fnc_module_waitingarea.sqf b/addons/respawn/functions/fnc_module_waitingarea.sqf similarity index 100% rename from addons/Respawn/functions/fnc_module_waitingarea.sqf rename to addons/respawn/functions/fnc_module_waitingarea.sqf diff --git a/addons/Respawn/functions/fnc_moveRespawns.sqf b/addons/respawn/functions/fnc_moveRespawns.sqf similarity index 100% rename from addons/Respawn/functions/fnc_moveRespawns.sqf rename to addons/respawn/functions/fnc_moveRespawns.sqf diff --git a/addons/Respawn/functions/fnc_openTeleportMenu.sqf b/addons/respawn/functions/fnc_openTeleportMenu.sqf similarity index 100% rename from addons/Respawn/functions/fnc_openTeleportMenu.sqf rename to addons/respawn/functions/fnc_openTeleportMenu.sqf diff --git a/addons/Respawn/functions/fnc_radioSettings_tfar.sqf b/addons/respawn/functions/fnc_radioSettings_tfar.sqf similarity index 100% rename from addons/Respawn/functions/fnc_radioSettings_tfar.sqf rename to addons/respawn/functions/fnc_radioSettings_tfar.sqf diff --git a/addons/Respawn/functions/fnc_removegear.sqf b/addons/respawn/functions/fnc_removegear.sqf similarity index 100% rename from addons/Respawn/functions/fnc_removegear.sqf rename to addons/respawn/functions/fnc_removegear.sqf diff --git a/addons/Respawn/functions/fnc_savegear.sqf b/addons/respawn/functions/fnc_savegear.sqf similarity index 100% rename from addons/Respawn/functions/fnc_savegear.sqf rename to addons/respawn/functions/fnc_savegear.sqf diff --git a/addons/Respawn/functions/fnc_startSpectator.sqf b/addons/respawn/functions/fnc_startSpectator.sqf similarity index 100% rename from addons/Respawn/functions/fnc_startSpectator.sqf rename to addons/respawn/functions/fnc_startSpectator.sqf diff --git a/addons/Respawn/functions/fnc_teleport.sqf b/addons/respawn/functions/fnc_teleport.sqf similarity index 100% rename from addons/Respawn/functions/fnc_teleport.sqf rename to addons/respawn/functions/fnc_teleport.sqf diff --git a/addons/Respawn/functions/fnc_teleportButton.sqf b/addons/respawn/functions/fnc_teleportButton.sqf similarity index 100% rename from addons/Respawn/functions/fnc_teleportButton.sqf rename to addons/respawn/functions/fnc_teleportButton.sqf diff --git a/addons/Respawn/functions/fnc_teleportOnLBSelChanged.sqf b/addons/respawn/functions/fnc_teleportOnLBSelChanged.sqf similarity index 100% rename from addons/Respawn/functions/fnc_teleportOnLBSelChanged.sqf rename to addons/respawn/functions/fnc_teleportOnLBSelChanged.sqf diff --git a/addons/Respawn/functions/fnc_ticketCounterPlayer.sqf b/addons/respawn/functions/fnc_ticketCounterPlayer.sqf similarity index 100% rename from addons/Respawn/functions/fnc_ticketCounterPlayer.sqf rename to addons/respawn/functions/fnc_ticketCounterPlayer.sqf diff --git a/addons/Respawn/functions/fnc_ticketCounterSide.sqf b/addons/respawn/functions/fnc_ticketCounterSide.sqf similarity index 100% rename from addons/Respawn/functions/fnc_ticketCounterSide.sqf rename to addons/respawn/functions/fnc_ticketCounterSide.sqf diff --git a/addons/Respawn/functions/fnc_timer.sqf b/addons/respawn/functions/fnc_timer.sqf similarity index 100% rename from addons/Respawn/functions/fnc_timer.sqf rename to addons/respawn/functions/fnc_timer.sqf diff --git a/addons/Respawn/functions/fnc_updatePlayerTicketCount.sqf b/addons/respawn/functions/fnc_updatePlayerTicketCount.sqf similarity index 100% rename from addons/Respawn/functions/fnc_updatePlayerTicketCount.sqf rename to addons/respawn/functions/fnc_updatePlayerTicketCount.sqf diff --git a/addons/Respawn/functions/fnc_updateWaitingRespawnList.sqf b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf similarity index 100% rename from addons/Respawn/functions/fnc_updateWaitingRespawnList.sqf rename to addons/respawn/functions/fnc_updateWaitingRespawnList.sqf diff --git a/addons/Respawn/functions/fnc_update_respawn_point.sqf b/addons/respawn/functions/fnc_update_respawn_point.sqf similarity index 100% rename from addons/Respawn/functions/fnc_update_respawn_point.sqf rename to addons/respawn/functions/fnc_update_respawn_point.sqf diff --git a/addons/Respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf similarity index 100% rename from addons/Respawn/functions/fnc_waitingArea.sqf rename to addons/respawn/functions/fnc_waitingArea.sqf diff --git a/addons/Respawn/functions/pohja.sqf b/addons/respawn/functions/pohja.sqf similarity index 100% rename from addons/Respawn/functions/pohja.sqf rename to addons/respawn/functions/pohja.sqf diff --git a/addons/Respawn/functions/script_component.hpp b/addons/respawn/functions/script_component.hpp similarity index 100% rename from addons/Respawn/functions/script_component.hpp rename to addons/respawn/functions/script_component.hpp diff --git a/addons/Respawn/script_component.hpp b/addons/respawn/script_component.hpp similarity index 100% rename from addons/Respawn/script_component.hpp rename to addons/respawn/script_component.hpp From db6283a1a94441bea59e73a3cde33d58313ee475 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Mon, 20 Nov 2023 19:21:13 +0200 Subject: [PATCH 004/228] asd --- data | 1 - 1 file changed, 1 deletion(-) delete mode 100644 data diff --git a/data b/data deleted file mode 100644 index 8b13789..0000000 --- a/data +++ /dev/null @@ -1 +0,0 @@ - From f7f2dc9737f525c1415c2a5b6ae9d06af06d74a1 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Mon, 20 Nov 2023 19:21:31 +0200 Subject: [PATCH 005/228] case sensitive --- {Data => data}/afilogo.paa | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename {Data => data}/afilogo.paa (100%) diff --git a/Data/afilogo.paa b/data/afilogo.paa similarity index 100% rename from Data/afilogo.paa rename to data/afilogo.paa From 45d8bf8e64da72acb94bc86bc763634f630d920a Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 27 Dec 2023 22:15:21 +0200 Subject: [PATCH 006/228] initial hemtt version --- .hemtt/hooks/pre_build/01_set_version.rhai | 4 + .hemtt/project.toml | 36 + addons/main/$PBOPREFIX$ | 1 + addons/main/Stringtable.xml | 1538 ++------ addons/main/XEH_postInit.sqf | 9 - addons/main/XEH_preInit.sqf | 508 --- addons/main/config.cpp | 49 +- addons/main/functions/fnc_briefingNotes.sqf | 139 - addons/main/functions/script_component.hpp | 1 - addons/main/script_component.hpp | 31 +- addons/main/script_macros.hpp | 13 + addons/main/script_mod.hpp | 15 + addons/main/script_version.hpp | 4 + addons/msp/$PBOPREFIX$ | 1 + addons/msp/CfgEventHandlers.hpp | 20 + addons/msp/{XEH_prep.sqf => XEH_PREP.hpp} | 5 +- addons/msp/XEH_postInit.sqf | 14 +- addons/msp/XEH_postInit_client.sqf | 8 + addons/msp/XEH_postInit_server.sqf | 3 + addons/msp/XEH_preInit.sqf | 218 +- addons/msp/XEH_preInit_server.sqf | 49 + addons/msp/XEH_preStart.sqf | 3 +- addons/msp/config.cpp | 35 +- addons/msp/eh list.txt | 2 +- addons/msp/functions/fnc_ace_actions.sqf | 35 +- addons/msp/functions/fnc_add_EH.sqf | 10 +- addons/msp/functions/fnc_briefingNotes.sqf | 53 +- addons/msp/functions/fnc_contestedCheck.sqf | 8 +- addons/msp/functions/fnc_create_msp_props.sqf | 4 +- addons/msp/functions/fnc_init_contested.sqf | 6 +- .../msp/functions/fnc_initate_msp_action.sqf | 8 +- addons/msp/functions/fnc_update_status.sqf | 8 +- addons/msp/functions/fnc_whoToNotify.sqf | 4 +- addons/msp/functions/pohja.sqf | 4 +- addons/msp/script_component.hpp | 18 +- addons/respawn/$PBOPREFIX$ | 1 + addons/respawn/CfgEventHandlers.hpp | 20 + addons/respawn/TP_dialog.hpp | 18 +- addons/respawn/{XEH_prep.sqf => XEH_PREP.hpp} | 40 +- addons/respawn/XEH_postInit.sqf | 124 +- addons/respawn/XEH_postInit_client.sqf | 57 + addons/respawn/XEH_postInit_server.sqf | 72 + addons/respawn/XEH_preInit.sqf | 322 +- addons/respawn/XEH_preInit_server.sqf | 3 + addons/respawn/XEH_preStart.sqf | 3 +- addons/respawn/config.cpp | 149 +- addons/respawn/eh list.txt | 8 +- .../functions/fnc_addActionsPlayer.sqf | 12 +- .../fnc_addCheckTicketCountAction.sqf | 8 +- .../functions/fnc_addCustomTeleporter.sqf | 6 +- addons/respawn/functions/fnc_addGear.sqf | 4 +- .../respawn/functions/fnc_addMainAction.sqf | 12 +- .../functions/fnc_addTeleportAction.sqf | 8 +- addons/respawn/functions/fnc_blackscreen.sqf | 4 +- .../respawn/functions/fnc_briefingNotes.sqf | 111 + .../functions/fnc_checkTicketCount.sqf | 8 +- .../functions/fnc_createLocalMarker.sqf | 4 +- .../respawn/functions/fnc_delayed_respawn.sqf | 4 +- .../respawn/functions/fnc_force_Respawn.sqf | 4 +- addons/respawn/functions/fnc_getOffSet.sqf | 4 +- .../respawn/functions/fnc_getParentAction.sqf | 4 +- .../functions/fnc_getTicketCountPlayer.sqf | 6 +- addons/respawn/functions/fnc_killJIP.sqf | 4 +- addons/respawn/functions/fnc_killed.sqf | 8 +- .../respawn/functions/fnc_marker_update.sqf | 12 +- .../functions/fnc_module_respawnpos.sqf | 16 +- .../functions/fnc_module_teleporter.sqf | 6 +- .../functions/fnc_module_waitingarea.sqf | 14 +- addons/respawn/functions/fnc_moveRespawns.sqf | 6 +- .../functions/fnc_openTeleportMenu.sqf | 4 +- .../functions/fnc_radioSettings_tfar.sqf | 4 +- addons/respawn/functions/fnc_removegear.sqf | 4 +- addons/respawn/functions/fnc_savegear.sqf | 4 +- .../respawn/functions/fnc_startSpectator.sqf | 4 +- addons/respawn/functions/fnc_teleport.sqf | 4 +- .../respawn/functions/fnc_teleportButton.sqf | 8 +- .../functions/fnc_teleportOnLBSelChanged.sqf | 4 +- .../functions/fnc_ticketCounterPlayer.sqf | 6 +- .../functions/fnc_ticketCounterSide.sqf | 4 +- addons/respawn/functions/fnc_timer.sqf | 8 +- .../functions/fnc_updatePlayerTicketCount.sqf | 4 +- .../fnc_updateWaitingRespawnList.sqf | 4 +- .../functions/fnc_update_respawn_point.sqf | 4 +- addons/respawn/functions/fnc_waitingArea.sqf | 10 +- addons/respawn/functions/pohja.sqf | 4 +- addons/respawn/script_component.hpp | 18 +- build.bat | 3 + build_dev.bat | 3 + build_release.bat | 3 + buld_test.bat | 3 + data/afilogo.paa | Bin 22016 -> 295244 bytes include/a3/ui_f/$PBOPREFIX$ | 1 + include/a3/ui_f/hpp/defineCommonColors.inc | 316 ++ include/a3/ui_f/hpp/defineCommonGrids.inc | 464 +++ include/a3/ui_f/hpp/defineDIKCodes.inc | 190 + include/a3/ui_f/hpp/defineResincl.inc | 3185 +++++++++++++++++ include/a3/ui_f/hpp/defineResinclDesign.inc | 1063 ++++++ .../ui_f_curator/ui/defineResinclDesign.inc | 624 ++++ include/x/cba/addons/main/$PBOPREFIX$ | 1 + .../cba/addons/main/script_macros_common.hpp | 1833 ++++++++++ include/x/cba/addons/xeh/$PBOPREFIX$ | 1 + include/x/cba/addons/xeh/script_xeh.hpp | 118 + include/z/ace/addons/main/script_debug.hpp | 58 + include/z/ace/addons/main/script_macros.hpp | 168 + mod.cpp | 27 + template/addon_template/$PBOPREFIX$ | 1 + template/addon_template/CfgEventHandlers.hpp | 19 + template/addon_template/XEH_PREP.hpp | 1 + .../addon_template/XEH_postInit.sqf | 1 - .../addon_template/XEH_postInit_client.sqf | 4 + template/addon_template/XEH_preInit.sqf | 8 + .../addon_template/XEH_preInit_server.sqf | 2 + template/addon_template/XEH_preStart.sqf | 2 + template/addon_template/config.cpp | 17 + .../functions/fnc_printAddonSetupReminder.sqf | 5 + .../functions/script_component.hpp | 1 + template/addon_template/script_component.hpp | 15 + 117 files changed, 9685 insertions(+), 2496 deletions(-) create mode 100644 .hemtt/hooks/pre_build/01_set_version.rhai create mode 100644 .hemtt/project.toml create mode 100644 addons/main/$PBOPREFIX$ delete mode 100644 addons/main/XEH_postInit.sqf delete mode 100644 addons/main/XEH_preInit.sqf delete mode 100644 addons/main/functions/fnc_briefingNotes.sqf delete mode 100644 addons/main/functions/script_component.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/msp/$PBOPREFIX$ create mode 100644 addons/msp/CfgEventHandlers.hpp rename addons/msp/{XEH_prep.sqf => XEH_PREP.hpp} (74%) create mode 100644 addons/msp/XEH_postInit_client.sqf create mode 100644 addons/msp/XEH_postInit_server.sqf create mode 100644 addons/msp/XEH_preInit_server.sqf create mode 100644 addons/respawn/$PBOPREFIX$ create mode 100644 addons/respawn/CfgEventHandlers.hpp rename addons/respawn/{XEH_prep.sqf => XEH_PREP.hpp} (96%) create mode 100644 addons/respawn/XEH_postInit_client.sqf create mode 100644 addons/respawn/XEH_postInit_server.sqf create mode 100644 addons/respawn/XEH_preInit_server.sqf create mode 100644 addons/respawn/functions/fnc_briefingNotes.sqf create mode 100644 build.bat create mode 100644 build_dev.bat create mode 100644 build_release.bat create mode 100644 buld_test.bat create mode 100644 include/a3/ui_f/$PBOPREFIX$ create mode 100644 include/a3/ui_f/hpp/defineCommonColors.inc create mode 100644 include/a3/ui_f/hpp/defineCommonGrids.inc create mode 100644 include/a3/ui_f/hpp/defineDIKCodes.inc create mode 100644 include/a3/ui_f/hpp/defineResincl.inc create mode 100644 include/a3/ui_f/hpp/defineResinclDesign.inc create mode 100644 include/a3/ui_f/ui_f_curator/ui/defineResinclDesign.inc create mode 100644 include/x/cba/addons/main/$PBOPREFIX$ create mode 100644 include/x/cba/addons/main/script_macros_common.hpp create mode 100644 include/x/cba/addons/xeh/$PBOPREFIX$ create mode 100644 include/x/cba/addons/xeh/script_xeh.hpp create mode 100644 include/z/ace/addons/main/script_debug.hpp create mode 100644 include/z/ace/addons/main/script_macros.hpp create mode 100644 mod.cpp create mode 100644 template/addon_template/$PBOPREFIX$ create mode 100644 template/addon_template/CfgEventHandlers.hpp create mode 100644 template/addon_template/XEH_PREP.hpp rename addons/main/XEH_prep.sqf => template/addon_template/XEH_postInit.sqf (61%) create mode 100644 template/addon_template/XEH_postInit_client.sqf create mode 100644 template/addon_template/XEH_preInit.sqf create mode 100644 template/addon_template/XEH_preInit_server.sqf create mode 100644 template/addon_template/XEH_preStart.sqf create mode 100644 template/addon_template/config.cpp create mode 100644 template/addon_template/functions/fnc_printAddonSetupReminder.sqf create mode 100644 template/addon_template/functions/script_component.hpp create mode 100644 template/addon_template/script_component.hpp diff --git a/.hemtt/hooks/pre_build/01_set_version.rhai b/.hemtt/hooks/pre_build/01_set_version.rhai new file mode 100644 index 0000000..6c653a5 --- /dev/null +++ b/.hemtt/hooks/pre_build/01_set_version.rhai @@ -0,0 +1,4 @@ +let modcpp = HEMTT_VFS.join("mod.cpp").open_file().read(); +modcpp.replace("0.0.0", HEMTT.project().version().to_string_short()); +HEMTT_VFS.join("mod.cpp").create_file().write(modcpp); +print("mod.cpp version set"); diff --git a/.hemtt/project.toml b/.hemtt/project.toml new file mode 100644 index 0000000..21e96e5 --- /dev/null +++ b/.hemtt/project.toml @@ -0,0 +1,36 @@ +name = "Tun Respawn" +prefix = "tunres" +author = "Tuntematon" +mainprefix = "x" + +[files] +include = [ + "mod.cpp", + "data/**", +] + +[version] +git_hash = 0 + +[binarize] +enabled = true + +[lint.sqf] +enabled = true + +[hemtt.launch.default] +workshop = [ + "450814997", # CBA + "463939057", # ACE + "894678801", # TFAR +] +parameters = [ + "-skipIntro", # These parameters are passed to the Arma 3 executable + "-noSplash", # They do not need to be added to your list + "-showScriptErrors", # You can add additional parameters here + "-debug", + "-filePatching", +] + +[hemtt.release] +folder = "Tun_Respawn_System" \ No newline at end of file diff --git a/addons/main/$PBOPREFIX$ b/addons/main/$PBOPREFIX$ new file mode 100644 index 0000000..1f9e591 --- /dev/null +++ b/addons/main/$PBOPREFIX$ @@ -0,0 +1 @@ +x\tunres\addons\main diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index 56afe37..226f0b7 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -2,1615 +2,567 @@ - + Time between respawn waves (minutes) Time between respawn waves (minutes) - Time between respawn waves (minutes) - Time between respawn waves (minutes) - Time between respawn waves (minutes) - Time between respawn waves (minutes) - Time between respawn waves (minutes) - Time between respawn waves (minutes) - Time between respawn waves (minutes) - Time between respawn waves (minutes) - - + + Time after JIP are killed and moved to respawn (minutes) Time after JIP are killed and moved to respawn (minutes) - Time after JIP are killed and moved to respawn (minutes) - Time after JIP are killed and moved to respawn (minutes) - Time after JIP are killed and moved to respawn (minutes) - Time after JIP are killed and moved to respawn (minutes) - Time after JIP are killed and moved to respawn (minutes) - Time after JIP are killed and moved to respawn (minutes) - Time after JIP are killed and moved to respawn (minutes) - Time after JIP are killed and moved to respawn (minutes) - - + + Enable kill JIP system Enable kill JIP system - Enable kill JIP system - Enable kill JIP system - Enable kill JIP system - Enable kill JIP system - Enable kill JIP system - Enable kill JIP system - Enable kill JIP system - Enable kill JIP system - - + + Ticket count for either for whole side or each player in that side. Ticket count for either for whole side or each player in that side. - Ticket count for either for whole side or each player in that side. - Ticket count for either for whole side or each player in that side. - Ticket count for either for whole side or each player in that side. - Ticket count for either for whole side or each player in that side. - Ticket count for either for whole side or each player in that side. - Ticket count for either for whole side or each player in that side. - Ticket count for either for whole side or each player in that side. - Ticket count for either for whole side or each player in that side. - - - "SQF Gearscript": Needs two variables set "Tun_Respawn_Role" which works as parameter and "Tun_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using Tun_Respawn_fnc_savegear function. - "SQF Gearscript": Needs two variables set "Tun_Respawn_Role" which works as parameter and "Tun_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using Tun_Respawn_fnc_savegear function. - "SQF Gearscript": Needs two variables set "Tun_Respawn_Role" which works as parameter and "Tun_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using Tun_Respawn_fnc_savegear function. - "SQF Gearscript": Needs two variables set "Tun_Respawn_Role" which works as parameter and "Tun_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using Tun_Respawn_fnc_savegear function. - "SQF Gearscript": Needs two variables set "Tun_Respawn_Role" which works as parameter and "Tun_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using Tun_Respawn_fnc_savegear function. - "SQF Gearscript": Needs two variables set "Tun_Respawn_Role" which works as parameter and "Tun_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using Tun_Respawn_fnc_savegear function. - "SQF Gearscript": Needs two variables set "Tun_Respawn_Role" which works as parameter and "Tun_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using Tun_Respawn_fnc_savegear function. - "SQF Gearscript": Needs two variables set "Tun_Respawn_Role" which works as parameter and "Tun_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using Tun_Respawn_fnc_savegear function. - "SQF Gearscript": Needs two variables set "Tun_Respawn_Role" which works as parameter and "Tun_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using Tun_Respawn_fnc_savegear function. - "SQF Gearscript": Needs two variables set "Tun_Respawn_Role" which works as parameter and "Tun_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using Tun_Respawn_fnc_savegear function. - - + + + "SQF Gearscript": Needs two variables set "tunres_Respawn_Role" which works as parameter and "tunres_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using tunres_Respawn_fnc_savegear function. + "SQF Gearscript": Needs two variables set "tunres_Respawn_Role" which works as parameter and "tunres_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using tunres_Respawn_fnc_savegear function. + + "Default" : Endless waves. "Side tickets": Side shares ticket pool. . "Player tickets": Each player has own ticket pool "Default" : Endless waves. "Side tickets": Side shares ticket pool. . "Player tickets": Each player has own ticket pool - "Default" : Endless waves. "Side tickets": Side shares ticket pool. . "Player tickets": Each player has own ticket pool - "Default" : Endless waves. "Side tickets": Side shares ticket pool. . "Player tickets": Each player has own ticket pool - "Default" : Endless waves. "Side tickets": Side shares ticket pool. . "Player tickets": Each player has own ticket pool - "Default" : Endless waves. "Side tickets": Side shares ticket pool. . "Player tickets": Each player has own ticket pool - "Default" : Endless waves. "Side tickets": Side shares ticket pool. . "Player tickets": Each player has own ticket pool - "Default" : Endless waves. "Side tickets": Side shares ticket pool. . "Player tickets": Each player has own ticket pool - "Default" : Endless waves. "Side tickets": Side shares ticket pool. . "Player tickets": Each player has own ticket pool - "Default" : Endless waves. "Side tickets": Side shares ticket pool. . "Player tickets": Each player has own ticket pool - - + + Enable this cameramode for spectators Enable this cameramode for spectators - Enable this cameramode for spectators - Enable this cameramode for spectators - Enable this cameramode for spectators - Enable this cameramode for spectators - Enable this cameramode for spectators - Enable this cameramode for spectators - Enable this cameramode for spectators - Enable this cameramode for spectators - - + + TUN - Respawn System TUN - Respawn System - TUN - Respawn System - TUN - Respawn System - TUN - Respawn System - TUN - Respawn System - TUN - Respawn System - TUN - Respawn System - TUN - Respawn System - TUN - Respawn System - - + + Briefing notes Briefing notes - Briefing notes - Briefing notes - Briefing notes - Briefing notes - Briefing notes - Briefing notes - Briefing notes - Briefing notes - - + + Wave times Wave times - Wave times - Wave times - Wave times - Wave times - Wave times - Wave times - Wave times - Wave times - - + + Check tickets Check tickets - Check tickets - Check tickets - Check tickets - Check tickets - Check tickets - Check tickets - Check tickets - Check tickets - - + + Spectator camera modes Spectator camera modes - Spectator camera modes - Spectator camera modes - Spectator camera modes - Spectator camera modes - Spectator camera modes - Spectator camera modes - Spectator camera modes - Spectator camera modes - - + + Tickets Tickets - Tickets - Tickets - Tickets - Tickets - Tickets - Tickets - Tickets - Tickets - - + + Main Settings Main Settings - Main Settings - Main Settings - Main Settings - Main Settings - Main Settings - Main Settings - Main Settings - Main Settings - - + + Enable Respawn System Enable Respawn System - Enable Respawn System - Enable Respawn System - Enable Respawn System - Enable Respawn System - Enable Respawn System - Enable Respawn System - Enable Respawn System - Enable Respawn System - - + + Enable Respawn System for mission. Enable Respawn System for mission. - Enable Respawn System for mission. - Enable Respawn System for mission. - Enable Respawn System for mission. - Enable Respawn System for mission. - Enable Respawn System for mission. - Enable Respawn System for mission. - Enable Respawn System for mission. - Enable Respawn System for mission. - - + + Allow checking remaining tickets from this place Allow checking remaining tickets from this place - Allow checking remaining tickets from this place - Allow checking remaining tickets from this place - Allow checking remaining tickets from this place - Allow checking remaining tickets from this place - Allow checking remaining tickets from this place - Allow checking remaining tickets from this place - Allow checking remaining tickets from this place - Allow checking remaining tickets from this place - - + + Only forced respawn waves. No timer! Only forced respawn waves. No timer! - Only forced respawn waves. No timer! - Only forced respawn waves. No timer! - Only forced respawn waves. No timer! - Only forced respawn waves. No timer! - Only forced respawn waves. No timer! - Only forced respawn waves. No timer! - Only forced respawn waves. No timer! - Only forced respawn waves. No timer! - - + + If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. - If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. - If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. - If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. - If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. - If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. - If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. - If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. - If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. - - + + Range for waitingarea. Default 100m Range for waitingarea. Default 100m - Range for waitingarea. Default 100m - Range for waitingarea. Default 100m - Range for waitingarea. Default 100m - Range for waitingarea. Default 100m - Range for waitingarea. Default 100m - Range for waitingarea. Default 100m - Range for waitingarea. Default 100m - Range for waitingarea. Default 100m - + You are respawning! Standby. You are respawning! Standby. - You are respawning! Standby. - You are respawning! Standby. - You are respawning! Standby. - You are respawning! Standby. - You are respawning! Standby. - You are respawning! Standby. - You are respawning! Standby. - You are respawning! Standby. - - + + Remaining time until respawn Remaining time until respawn - Remaining time until respawn - Remaining time until respawn - Remaining time until respawn - Remaining time until respawn - Remaining time until respawn - Remaining time until respawn - Remaining time until respawn - Remaining time until respawn - - + + Respawn is currently disabled. Respawn is currently disabled. - Respawn is currently disabled. - Respawn is currently disabled. - Respawn is currently disabled. - Respawn is currently disabled. - Respawn is currently disabled. - Respawn is currently disabled. - Respawn is currently disabled. - Respawn is currently disabled. - - + + Mission is using only forced waves. Mission is using only forced waves. - Mission is using only forced waves. - Mission is using only forced waves. - Mission is using only forced waves. - Mission is using only forced waves. - Mission is using only forced waves. - Mission is using only forced waves. - Mission is using only forced waves. - Mission is using only forced waves. - - + + Remaining ticket count is: Remaining ticket count is: - Remaining ticket count is: - Remaining ticket count is: - Remaining ticket count is: - Remaining ticket count is: - Remaining ticket count is: - Remaining ticket count is: - Remaining ticket count is: - Remaining ticket count is: - - + + Check remaining tickets Check remaining tickets - Check remaining tickets - Check remaining tickets - Check remaining tickets - Check remaining tickets - Check remaining tickets - Check remaining tickets - Check remaining tickets - Check remaining tickets - + You are being teleported to: You are being teleported to: - You are being teleported to: - You are being teleported to: - You are being teleported to: - You are being teleported to: - You are being teleported to: - You are being teleported to: - You are being teleported to: - You are being teleported to: - - + + This teleport point is disabled This teleport point is disabled - This teleport point is disabled - This teleport point is disabled - This teleport point is disabled - This teleport point is disabled - This teleport point is disabled - This teleport point is disabled - This teleport point is disabled - This teleport point is disabled - - + + Open teleportmenu Open teleportmenu - Open teleportmenu - Open teleportmenu - Open teleportmenu - Open teleportmenu - Open teleportmenu - Open teleportmenu - Open teleportmenu - Open teleportmenu - - + + <t color='#FF0000'>Open teleportmenu</t> <t color='#FF0000'>Open teleportmenu</t> - <t color='#FF0000'>Open teleportmenu</t> - <t color='#FF0000'>Open teleportmenu</t> - <t color='#FF0000'>Open teleportmenu</t> - <t color='#FF0000'>Open teleportmenu</t> - <t color='#FF0000'>Open teleportmenu</t> - <t color='#FF0000'>Open teleportmenu</t> - <t color='#FF0000'>Open teleportmenu</t> - <t color='#FF0000'>Open teleportmenu</t> - - + + Main Base Main Base - Main Base - Main Base - Main Base - Main Base - Main Base - Main Base - Main Base - Main Base - + Put this module where you want respawn point to be for this side. Put this module where you want respawn point to be for this side. - Put this module where you want respawn point to be for this side. - Put this module where you want respawn point to be for this side. - Put this module where you want respawn point to be for this side. - Put this module where you want respawn point to be for this side. - Put this module where you want respawn point to be for this side. - Put this module where you want respawn point to be for this side. - Put this module where you want respawn point to be for this side. - Put this module where you want respawn point to be for this side. - - + + Spawn Point Spawn Point - Spawn Point - Spawn Point - Spawn Point - Spawn Point - Spawn Point - Spawn Point - Spawn Point - Spawn Point - - + + Choose side for this spawn point Choose side for this spawn point - Choose side for this spawn point - Choose side for this spawn point - Choose side for this spawn point - Choose side for this spawn point - Choose side for this spawn point - Choose side for this spawn point - Choose side for this spawn point - Choose side for this spawn point - - + + Tun Respawn Tun Respawn - Tun Respawn - Tun Respawn - Tun Respawn - Tun Respawn - Tun Respawn - Tun Respawn - Tun Respawn - Tun Respawn - - + + Respawn Position module do not have side set Respawn Position module do not have side set - Respawn Position module do not have side set - Respawn Position module do not have side set - Respawn Position module do not have side set - Respawn Position module do not have side set - Respawn Position module do not have side set - Respawn Position module do not have side set - Respawn Position module do not have side set - Respawn Position module do not have side set - - + + There is already "%1" marker. You either have multiple respawn point modules with same settings or marker named that. Either way, remove it. There is already "%1" marker. You either have multiple respawn point modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple respawn point modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple respawn point modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple respawn point modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple respawn point modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple respawn point modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple respawn point modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple respawn point modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple respawn point modules with same settings or marker named that. Either way, remove it. - + Teleport point Teleport point - Teleport point - Teleport point - Teleport point - Teleport point - Teleport point - Teleport point - Teleport point - Teleport point - - + + Teleport network point. Teleport network point. - Teleport network point. - Teleport network point. - Teleport network point. - Teleport network point. - Teleport network point. - Teleport network point. - Teleport network point. - Teleport network point. - - + + Marker icon, must be in non string format. Default: hd_start Marker icon, must be in non string format. Default: hd_start - Marker icon, must be in non string format. Default: hd_start - Marker icon, must be in non string format. Default: hd_start - Marker icon, must be in non string format. Default: hd_start - Marker icon, must be in non string format. Default: hd_start - Marker icon, must be in non string format. Default: hd_start - Marker icon, must be in non string format. Default: hd_start - Marker icon, must be in non string format. Default: hd_start - Marker icon, must be in non string format. Default: hd_start - - + + Create marker for this teleport, for enabled sides. Create marker for this teleport, for enabled sides. - Create marker for this teleport, for enabled sides. - Create marker for this teleport, for enabled sides. - Create marker for this teleport, for enabled sides. - Create marker for this teleport, for enabled sides. - Create marker for this teleport, for enabled sides. - Create marker for this teleport, for enabled sides. - Create marker for this teleport, for enabled sides. - Create marker for this teleport, for enabled sides. - - + + When enabled, will use ace interaction. Otherwise will use addaction. When enabled, will use ace interaction. Otherwise will use addaction. - When enabled, will use ace interaction. Otherwise will use addaction. - When enabled, will use ace interaction. Otherwise will use addaction. - When enabled, will use ace interaction. Otherwise will use addaction. - When enabled, will use ace interaction. Otherwise will use addaction. - When enabled, will use ace interaction. Otherwise will use addaction. - When enabled, will use ace interaction. Otherwise will use addaction. - When enabled, will use ace interaction. Otherwise will use addaction. - When enabled, will use ace interaction. Otherwise will use addaction. - - + + Name for teleport location Name for teleport location - Name for teleport location - Name for teleport location - Name for teleport location - Name for teleport location - Name for teleport location - Name for teleport location - Name for teleport location - Name for teleport location - - + + Condition to enable/disable opening teleport menu. Must return true or flase. Default: true Condition to enable/disable opening teleport menu. Must return true or flase. Default: true - Condition to enable/disable opening teleport menu. Must return true or flase. Default: true - Condition to enable/disable opening teleport menu. Must return true or flase. Default: true - Condition to enable/disable opening teleport menu. Must return true or flase. Default: true - Condition to enable/disable opening teleport menu. Must return true or flase. Default: true - Condition to enable/disable opening teleport menu. Must return true or flase. Default: true - Condition to enable/disable opening teleport menu. Must return true or flase. Default: true - Condition to enable/disable opening teleport menu. Must return true or flase. Default: true - Condition to enable/disable opening teleport menu. Must return true or flase. Default: true - - + + Conditio to enable/disable TP location. (Code) Default: True Conditio to enable/disable TP location. (Code) Default: True - Conditio to enable/disable TP location. (Code) Default: True - Conditio to enable/disable TP location. (Code) Default: True - Conditio to enable/disable TP location. (Code) Default: True - Conditio to enable/disable TP location. (Code) Default: True - Conditio to enable/disable TP location. (Code) Default: True - Conditio to enable/disable TP location. (Code) Default: True - Conditio to enable/disable TP location. (Code) Default: True - Conditio to enable/disable TP location. (Code) Default: True - - + + Is this side allowed to use this teleportter. Is this side allowed to use this teleportter. - Is this side allowed to use this teleportter. - Is this side allowed to use this teleportter. - Is this side allowed to use this teleportter. - Is this side allowed to use this teleportter. - Is this side allowed to use this teleportter. - Is this side allowed to use this teleportter. - Is this side allowed to use this teleportter. - Is this side allowed to use this teleportter. - - + + Classname for object where action to teleport is. Non string format: Land_Sleeping_bag_blue_folded_F Classname for object where action to teleport is. Non string format: Land_Sleeping_bag_blue_folded_F - Classname for object where action to teleport is. Non string format: Land_Sleeping_bag_blue_folded_F - Classname for object where action to teleport is. Non string format: Land_Sleeping_bag_blue_folded_F - Classname for object where action to teleport is. Non string format: Land_Sleeping_bag_blue_folded_F - Classname for object where action to teleport is. Non string format: Land_Sleeping_bag_blue_folded_F - Classname for object where action to teleport is. Non string format: Land_Sleeping_bag_blue_folded_F - Classname for object where action to teleport is. Non string format: Land_Sleeping_bag_blue_folded_F - Classname for object where action to teleport is. Non string format: Land_Sleeping_bag_blue_folded_F - Classname for object where action to teleport is. Non string format: Land_Sleeping_bag_blue_folded_F - + There is already "%1" marker. You either have multiple Waiting Area modules with same settings or marker named that. Either way, remove it. There is already "%1" marker. You either have multiple Waiting Area modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple Waiting Area modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple Waiting Area modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple Waiting Area modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple Waiting Area modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple Waiting Area modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple Waiting Area modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple Waiting Area modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple Waiting Area modules with same settings or marker named that. Either way, remove it. - - + + Waiting area module do not have side set Waiting area module do not have side set - Waiting area module do not have side set - Waiting area module do not have side set - Waiting area module do not have side set - Waiting area module do not have side set - Waiting area module do not have side set - Waiting area module do not have side set - Waiting area module do not have side set - Waiting area module do not have side set - - + + Respawn Waiting Area Respawn Waiting Area - Respawn Waiting Area - Respawn Waiting Area - Respawn Waiting Area - Respawn Waiting Area - Respawn Waiting Area - Respawn Waiting Area - Respawn Waiting Area - Respawn Waiting Area - - + + Put this module where you want respawn waiting area to be for this side. Put this module where you want respawn waiting area to be for this side. - Put this module where you want respawn waiting area to be for this side. - Put this module where you want respawn waiting area to be for this side. - Put this module where you want respawn waiting area to be for this side. - Put this module where you want respawn waiting area to be for this side. - Put this module where you want respawn waiting area to be for this side. - Put this module where you want respawn waiting area to be for this side. - Put this module where you want respawn waiting area to be for this side. - Put this module where you want respawn waiting area to be for this side. - - + + Choose side for this waiting area Choose side for this waiting area - Choose side for this waiting area - Choose side for this waiting area - Choose side for this waiting area - Choose side for this waiting area - Choose side for this waiting area - Choose side for this waiting area - Choose side for this waiting area - Choose side for this waiting area - + Teleport network Teleport network - Teleport network - Teleport network - Teleport network - Teleport network - Teleport network - Teleport network - Teleport network - Teleport network - - + + Teleport Teleport - Teleport - Teleport - Teleport - Teleport - Teleport - Teleport - Teleport - Teleport - + Show tickets Show tickets - Show tickets - Show tickets - Show tickets - Show tickets - Show tickets - Show tickets - Show tickets - Show tickets - - + + Enable briefing notes Enable briefing notes - Enable briefing notes - Enable briefing notes - Enable briefing notes - Enable briefing notes - Enable briefing notes - Enable briefing notes - Enable briefing notes - Enable briefing notes - - + + Create briefing tab where all these settings are show. Create briefing tab where all these settings are show. - Create briefing tab where all these settings are show. - Create briefing tab where all these settings are show. - Create briefing tab where all these settings are show. - Create briefing tab where all these settings are show. - Create briefing tab where all these settings are show. - Create briefing tab where all these settings are show. - Create briefing tab where all these settings are show. - Create briefing tab where all these settings are show. - - + + Show respawn type Show respawn type - Show respawn type - Show respawn type - Show respawn type - Show respawn type - Show respawn type - Show respawn type - Show respawn type - Show respawn type - - + + Show respawn wave time Show respawn wave time - Show respawn wave time - Show respawn wave time - Show respawn wave time - Show respawn wave time - Show respawn wave time - Show respawn wave time - Show respawn wave time - Show respawn wave time - - + + When enabled, wave interval time will be shown in briefing notes. When enabled, wave interval time will be shown in briefing notes. - When enabled, wave interval time will be shown in briefing notes. - When enabled, wave interval time will be shown in briefing notes. - When enabled, wave interval time will be shown in briefing notes. - When enabled, wave interval time will be shown in briefing notes. - When enabled, wave interval time will be shown in briefing notes. - When enabled, wave interval time will be shown in briefing notes. - When enabled, wave interval time will be shown in briefing notes. - When enabled, wave interval time will be shown in briefing notes. - - + + When enabled, starting ticket count will be shown in briefing notes. When enabled, starting ticket count will be shown in briefing notes. - When enabled, starting ticket count will be shown in briefing notes. - When enabled, starting ticket count will be shown in briefing notes. - When enabled, starting ticket count will be shown in briefing notes. - When enabled, starting ticket count will be shown in briefing notes. - When enabled, starting ticket count will be shown in briefing notes. - When enabled, starting ticket count will be shown in briefing notes. - When enabled, starting ticket count will be shown in briefing notes. - When enabled, starting ticket count will be shown in briefing notes. - - + + When enabled, respawn type will be shown in briefing notes. When enabled, respawn type will be shown in briefing notes. - When enabled, respawn type will be shown in briefing notes. - When enabled, respawn type will be shown in briefing notes. - When enabled, respawn type will be shown in briefing notes. - When enabled, respawn type will be shown in briefing notes. - When enabled, respawn type will be shown in briefing notes. - When enabled, respawn type will be shown in briefing notes. - When enabled, respawn type will be shown in briefing notes. - When enabled, respawn type will be shown in briefing notes. - - + + Show this side for all. Own side is aways shown, if show tickets is enabled. Also it that is disabled, none of the sides tickets are shown. Show this side for all. Own side is aways shown, if show tickets is enabled. Also it that is disabled, none of the sides tickets are shown. - Show this side for all. Own side is aways shown, if show tickets is enabled. Also it that is disabled, none of the sides tickets are shown. - Show this side for all. Own side is aways shown, if show tickets is enabled. Also it that is disabled, none of the sides tickets are shown. - Show this side for all. Own side is aways shown, if show tickets is enabled. Also it that is disabled, none of the sides tickets are shown. - Show this side for all. Own side is aways shown, if show tickets is enabled. Also it that is disabled, none of the sides tickets are shown. - Show this side for all. Own side is aways shown, if show tickets is enabled. Also it that is disabled, none of the sides tickets are shown. - Show this side for all. Own side is aways shown, if show tickets is enabled. Also it that is disabled, none of the sides tickets are shown. - Show this side for all. Own side is aways shown, if show tickets is enabled. Also it that is disabled, none of the sides tickets are shown. - Show this side for all. Own side is aways shown, if show tickets is enabled. Also it that is disabled, none of the sides tickets are shown. - - + + Show west data to all Show west data to all - Show west data to all - Show west data to all - Show west data to all - Show west data to all - Show west data to all - Show west data to all - Show west data to all - Show west data to all - - + + Show east data to all Show east data to all - Show east data to all - Show east data to all - Show east data to all - Show east data to all - Show east data to all - Show east data to all - Show east data to all - Show east data to all - - + + Show resistance data to all Show resistance data to all - Show resistance data to all - Show resistance data to all - Show resistance data to all - Show resistance data to all - Show resistance data to all - Show resistance data to all - Show resistance data to all - Show resistance data to all - - + + Show civilian data to all Show civilian data to all - Show civilian data to all - Show civilian data to all - Show civilian data to all - Show civilian data to all - Show civilian data to all - Show civilian data to all - Show civilian data to all - Show civilian data to all - - + + Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - - + + Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - - + + Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each player</font>. Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each player</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each player</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each player</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each player</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each player</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each player</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each player</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each player</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each player</font>. - - + + Mission uses only forced respawn waves. So no respawn timer. Mission uses only forced respawn waves. So no respawn timer. - Mission uses only forced respawn waves. So no respawn timer. - Mission uses only forced respawn waves. So no respawn timer. - Mission uses only forced respawn waves. So no respawn timer. - Mission uses only forced respawn waves. So no respawn timer. - Mission uses only forced respawn waves. So no respawn timer. - Mission uses only forced respawn waves. So no respawn timer. - Mission uses only forced respawn waves. So no respawn timer. - Mission uses only forced respawn waves. So no respawn timer. - - + + %1<br/><br/>JIP players will be killed and move to respawn after <font face='PuristaBold' size='14'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. %1<br/><br/>JIP players will be killed and move to respawn after <font face='PuristaBold' size='14'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. - %1<br/><br/>JIP players will be killed and move to respawn after <font face='PuristaBold' size='14'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. - %1<br/><br/>JIP players will be killed and move to respawn after <font face='PuristaBold' size='14'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. - %1<br/><br/>JIP players will be killed and move to respawn after <font face='PuristaBold' size='14'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. - %1<br/><br/>JIP players will be killed and move to respawn after <font face='PuristaBold' size='14'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. - %1<br/><br/>JIP players will be killed and move to respawn after <font face='PuristaBold' size='14'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. - %1<br/><br/>JIP players will be killed and move to respawn after <font face='PuristaBold' size='14'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. - %1<br/><br/>JIP players will be killed and move to respawn after <font face='PuristaBold' size='14'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. - %1<br/><br/>JIP players will be killed and move to respawn after <font face='PuristaBold' size='14'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. - - + + JIP players are not killed and moved to respawn when they join game. JIP players are not killed and moved to respawn when they join game. - JIP players are not killed and moved to respawn when they join game. - JIP players are not killed and moved to respawn when they join game. - JIP players are not killed and moved to respawn when they join game. - JIP players are not killed and moved to respawn when they join game. - JIP players are not killed and moved to respawn when they join game. - JIP players are not killed and moved to respawn when they join game. - JIP players are not killed and moved to respawn when they join game. - JIP players are not killed and moved to respawn when they join game. - - + + %1<br/><br/>When MSP has been deployed, it will report enemies every <font face='PuristaBold' size='14'>%2s</font>, if there is any inside <font face='PuristaBold' size='14'>%3</font> meter radius. %1<br/><br/>When MSP has been deployed, it will report enemies every <font face='PuristaBold' size='14'>%2s</font>, if there is any inside <font face='PuristaBold' size='14'>%3</font> meter radius. - %1<br/><br/>When MSP has been deployed, it will report enemies every <font face='PuristaBold' size='14'>%2s</font>, if there is any inside <font face='PuristaBold' size='14'>%3</font> meter radius. - %1<br/><br/>When MSP has been deployed, it will report enemies every <font face='PuristaBold' size='14'>%2s</font>, if there is any inside <font face='PuristaBold' size='14'>%3</font> meter radius. - %1<br/><br/>When MSP has been deployed, it will report enemies every <font face='PuristaBold' size='14'>%2s</font>, if there is any inside <font face='PuristaBold' size='14'>%3</font> meter radius. - %1<br/><br/>When MSP has been deployed, it will report enemies every <font face='PuristaBold' size='14'>%2s</font>, if there is any inside <font face='PuristaBold' size='14'>%3</font> meter radius. - %1<br/><br/>When MSP has been deployed, it will report enemies every <font face='PuristaBold' size='14'>%2s</font>, if there is any inside <font face='PuristaBold' size='14'>%3</font> meter radius. - %1<br/><br/>When MSP has been deployed, it will report enemies every <font face='PuristaBold' size='14'>%2s</font>, if there is any inside <font face='PuristaBold' size='14'>%3</font> meter radius. - %1<br/><br/>When MSP has been deployed, it will report enemies every <font face='PuristaBold' size='14'>%2s</font>, if there is any inside <font face='PuristaBold' size='14'>%3</font> meter radius. - %1<br/><br/>When MSP has been deployed, it will report enemies every <font face='PuristaBold' size='14'>%2s</font>, if there is any inside <font face='PuristaBold' size='14'>%3</font> meter radius. - - + + Reporting enemies near MSP is disabled. Reporting enemies near MSP is disabled. - Reporting enemies near MSP is disabled. - Reporting enemies near MSP is disabled. - Reporting enemies near MSP is disabled. - Reporting enemies near MSP is disabled. - Reporting enemies near MSP is disabled. - Reporting enemies near MSP is disabled. - Reporting enemies near MSP is disabled. - Reporting enemies near MSP is disabled. - - + + %1<br/><br/>MSP contested status is updated every <font face='PuristaBold' size='14'>%2s</font>.<br/>It will get contested if there is more enemis inside <font face='PuristaBold' size='14'>%3m</font> radius or even one enemy is <font face='PuristaBold' size='14'>%4m</font> away from it. %1<br/><br/>MSP contested status is updated every <font face='PuristaBold' size='14'>%2s</font>.<br/>It will get contested if there is more enemis inside <font face='PuristaBold' size='14'>%3m</font> radius or even one enemy is <font face='PuristaBold' size='14'>%4m</font> away from it. - %1<br/><br/>MSP contested status is updated every <font face='PuristaBold' size='14'>%2s</font>.<br/>It will get contested if there is more enemis inside <font face='PuristaBold' size='14'>%3m</font> radius or even one enemy is <font face='PuristaBold' size='14'>%4m</font> away from it. - %1<br/><br/>MSP contested status is updated every <font face='PuristaBold' size='14'>%2s</font>.<br/>It will get contested if there is more enemis inside <font face='PuristaBold' size='14'>%3m</font> radius or even one enemy is <font face='PuristaBold' size='14'>%4m</font> away from it. - %1<br/><br/>MSP contested status is updated every <font face='PuristaBold' size='14'>%2s</font>.<br/>It will get contested if there is more enemis inside <font face='PuristaBold' size='14'>%3m</font> radius or even one enemy is <font face='PuristaBold' size='14'>%4m</font> away from it. - %1<br/><br/>MSP contested status is updated every <font face='PuristaBold' size='14'>%2s</font>.<br/>It will get contested if there is more enemis inside <font face='PuristaBold' size='14'>%3m</font> radius or even one enemy is <font face='PuristaBold' size='14'>%4m</font> away from it. - %1<br/><br/>MSP contested status is updated every <font face='PuristaBold' size='14'>%2s</font>.<br/>It will get contested if there is more enemis inside <font face='PuristaBold' size='14'>%3m</font> radius or even one enemy is <font face='PuristaBold' size='14'>%4m</font> away from it. - %1<br/><br/>MSP contested status is updated every <font face='PuristaBold' size='14'>%2s</font>.<br/>It will get contested if there is more enemis inside <font face='PuristaBold' size='14'>%3m</font> radius or even one enemy is <font face='PuristaBold' size='14'>%4m</font> away from it. - %1<br/><br/>MSP contested status is updated every <font face='PuristaBold' size='14'>%2s</font>.<br/>It will get contested if there is more enemis inside <font face='PuristaBold' size='14'>%3m</font> radius or even one enemy is <font face='PuristaBold' size='14'>%4m</font> away from it. - %1<br/><br/>MSP contested status is updated every <font face='PuristaBold' size='14'>%2s</font>.<br/>It will get contested if there is more enemis inside <font face='PuristaBold' size='14'>%3m</font> radius or even one enemy is <font face='PuristaBold' size='14'>%4m</font> away from it. - - + + %1<br/><br/>MSP vehicle is <font face='PuristaBold' size='14'>%2</font> %1<br/><br/>MSP vehicle is <font face='PuristaBold' size='14'>%2</font> - %1<br/><br/>MSP vehicle is <font face='PuristaBold' size='14'>%2</font> - %1<br/><br/>MSP vehicle is <font face='PuristaBold' size='14'>%2</font> - %1<br/><br/>MSP vehicle is <font face='PuristaBold' size='14'>%2</font> - %1<br/><br/>MSP vehicle is <font face='PuristaBold' size='14'>%2</font> - %1<br/><br/>MSP vehicle is <font face='PuristaBold' size='14'>%2</font> - %1<br/><br/>MSP vehicle is <font face='PuristaBold' size='14'>%2</font> - %1<br/><br/>MSP vehicle is <font face='PuristaBold' size='14'>%2</font> - %1<br/><br/>MSP vehicle is <font face='PuristaBold' size='14'>%2</font> - - + + %1<br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn on.</font> <br/>If there is <font face='PuristaBold' size='14'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font face='PuristaBold' size='14'>you will skip it.</font> %1<br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn on.</font> <br/>If there is <font face='PuristaBold' size='14'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font face='PuristaBold' size='14'>you will skip it.</font> - %1<br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn on.</font> <br/>If there is <font face='PuristaBold' size='14'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font face='PuristaBold' size='14'>you will skip it.</font> - %1<br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn on.</font> <br/>If there is <font face='PuristaBold' size='14'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font face='PuristaBold' size='14'>you will skip it.</font> - %1<br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn on.</font> <br/>If there is <font face='PuristaBold' size='14'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font face='PuristaBold' size='14'>you will skip it.</font> - %1<br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn on.</font> <br/>If there is <font face='PuristaBold' size='14'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font face='PuristaBold' size='14'>you will skip it.</font> - %1<br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn on.</font> <br/>If there is <font face='PuristaBold' size='14'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font face='PuristaBold' size='14'>you will skip it.</font> - %1<br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn on.</font> <br/>If there is <font face='PuristaBold' size='14'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font face='PuristaBold' size='14'>you will skip it.</font> - %1<br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn on.</font> <br/>If there is <font face='PuristaBold' size='14'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font face='PuristaBold' size='14'>you will skip it.</font> - %1<br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn on.</font> <br/>If there is <font face='PuristaBold' size='14'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font face='PuristaBold' size='14'>you will skip it.</font> - - + + <br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn off.</font> <br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn off.</font> - <br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn off.</font> - <br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn off.</font> - <br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn off.</font> - <br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn off.</font> - <br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn off.</font> - <br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn off.</font> - <br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn off.</font> - <br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn off.</font> - - + + Mobile Spawn Point (MSP) has been <font face='PuristaBold' size='14'>enabled</font> to this mission for your side. Mobile Spawn Point (MSP) has been <font face='PuristaBold' size='14'>enabled</font> to this mission for your side. - Mobile Spawn Point (MSP) has been <font face='PuristaBold' size='14'>enabled</font> to this mission for your side. - Mobile Spawn Point (MSP) has been <font face='PuristaBold' size='14'>enabled</font> to this mission for your side. - Mobile Spawn Point (MSP) has been <font face='PuristaBold' size='14'>enabled</font> to this mission for your side. - Mobile Spawn Point (MSP) has been <font face='PuristaBold' size='14'>enabled</font> to this mission for your side. - Mobile Spawn Point (MSP) has been <font face='PuristaBold' size='14'>enabled</font> to this mission for your side. - Mobile Spawn Point (MSP) has been <font face='PuristaBold' size='14'>enabled</font> to this mission for your side. - Mobile Spawn Point (MSP) has been <font face='PuristaBold' size='14'>enabled</font> to this mission for your side. - Mobile Spawn Point (MSP) has been <font face='PuristaBold' size='14'>enabled</font> to this mission for your side. - - + + Mobile Spawn Point (MSP) has been enabled for this mission, but <font face='PuristaBold' size='14'>your side does not have MSP.</font> Mobile Spawn Point (MSP) has been enabled for this mission, but <font face='PuristaBold' size='14'>your side does not have MSP.</font> - Mobile Spawn Point (MSP) has been enabled for this mission, but <font face='PuristaBold' size='14'>your side does not have MSP.</font> - Mobile Spawn Point (MSP) has been enabled for this mission, but <font face='PuristaBold' size='14'>your side does not have MSP.</font> - Mobile Spawn Point (MSP) has been enabled for this mission, but <font face='PuristaBold' size='14'>your side does not have MSP.</font> - Mobile Spawn Point (MSP) has been enabled for this mission, but <font face='PuristaBold' size='14'>your side does not have MSP.</font> - Mobile Spawn Point (MSP) has been enabled for this mission, but <font face='PuristaBold' size='14'>your side does not have MSP.</font> - Mobile Spawn Point (MSP) has been enabled for this mission, but <font face='PuristaBold' size='14'>your side does not have MSP.</font> - Mobile Spawn Point (MSP) has been enabled for this mission, but <font face='PuristaBold' size='14'>your side does not have MSP.</font> - Mobile Spawn Point (MSP) has been enabled for this mission, but <font face='PuristaBold' size='14'>your side does not have MSP.</font> - - + + <br/><br/>If there is MSP or custom teleport points in this mission, you can accses teleport menu always from Main Base and uncontested MSP using ace action menu. Custom teleport points might have different conditions and uses either vanilla action menu or ace action menu. <br/><br/>If there is MSP or custom teleport points in this mission, you can accses teleport menu always from Main Base and uncontested MSP using ace action menu. Custom teleport points might have different conditions and uses either vanilla action menu or ace action menu. - <br/><br/>If there is MSP or custom teleport points in this mission, you can accses teleport menu always from Main Base and uncontested MSP using ace action menu. Custom teleport points might have different conditions and uses either vanilla action menu or ace action menu. - <br/><br/>If there is MSP or custom teleport points in this mission, you can accses teleport menu always from Main Base and uncontested MSP using ace action menu. Custom teleport points might have different conditions and uses either vanilla action menu or ace action menu. - <br/><br/>If there is MSP or custom teleport points in this mission, you can accses teleport menu always from Main Base and uncontested MSP using ace action menu. Custom teleport points might have different conditions and uses either vanilla action menu or ace action menu. - <br/><br/>If there is MSP or custom teleport points in this mission, you can accses teleport menu always from Main Base and uncontested MSP using ace action menu. Custom teleport points might have different conditions and uses either vanilla action menu or ace action menu. - <br/><br/>If there is MSP or custom teleport points in this mission, you can accses teleport menu always from Main Base and uncontested MSP using ace action menu. Custom teleport points might have different conditions and uses either vanilla action menu or ace action menu. - <br/><br/>If there is MSP or custom teleport points in this mission, you can accses teleport menu always from Main Base and uncontested MSP using ace action menu. Custom teleport points might have different conditions and uses either vanilla action menu or ace action menu. - <br/><br/>If there is MSP or custom teleport points in this mission, you can accses teleport menu always from Main Base and uncontested MSP using ace action menu. Custom teleport points might have different conditions and uses either vanilla action menu or ace action menu. - <br/><br/>If there is MSP or custom teleport points in this mission, you can accses teleport menu always from Main Base and uncontested MSP using ace action menu. Custom teleport points might have different conditions and uses either vanilla action menu or ace action menu. - + Default Default - Default - Default - Default - Default - Default - Default - Default - Default - - + + Side tickets Side tickets - Side tickets - Side tickets - Side tickets - Side tickets - Side tickets - Side tickets - Side tickets - Side tickets - - + + Player tickets Player tickets - Player tickets - Player tickets - Player tickets - Player tickets - Player tickets - Player tickets - Player tickets - Player tickets - + TUN - Mobile Spawn Point TUN - Mobile Spawn Point - TUN - Mobile Spawn Point - TUN - Mobile Spawn Point - TUN - Mobile Spawn Point - TUN - Mobile Spawn Point - TUN - Mobile Spawn Point - TUN - Mobile Spawn Point - TUN - Mobile Spawn Point - TUN - Mobile Spawn Point - - + + Progress Bar Progress Bar - Progress Bar - Progress Bar - Progress Bar - Progress Bar - Progress Bar - Progress Bar - Progress Bar - Progress Bar - - + + Time that it takes to setup MSP (seconds) Setup Time - Setup Time - Setup Time - Setup Time - Setup Time - Setup Time - Setup Time - Setup Time - Setup Time - - + + Packing Time Packing Time - Packing Time - Packing Time - Packing Time - Packing Time - Packing Time - Packing Time - Packing Time - Packing Time - - + + Setup Time Setup Time - Setup Time - Setup Time - Setup Time - Setup Time - Setup Time - Setup Time - Setup Time - Setup Time - - + + Time that it takes to deploy MSP (seconds) Time that it takes to deploy MSP (seconds) - Time that it takes to deploy MSP (seconds) - Time that it takes to deploy MSP (seconds) - Time that it takes to deploy MSP (seconds) - Time that it takes to deploy MSP (seconds) - Time that it takes to deploy MSP (seconds) - Time that it takes to deploy MSP (seconds) - Time that it takes to deploy MSP (seconds) - Time that it takes to deploy MSP (seconds) - - + + Time that it takes to pack MSP (seconds) Time that it takes to pack MSP (seconds) - Time that it takes to pack MSP (seconds) - Time that it takes to pack MSP (seconds) - Time that it takes to pack MSP (seconds) - Time that it takes to pack MSP (seconds) - Time that it takes to pack MSP (seconds) - Time that it takes to pack MSP (seconds) - Time that it takes to pack MSP (seconds) - Time that it takes to pack MSP (seconds) - - + + Enable MSP Enable MSP - Enable MSP - Enable MSP - Enable MSP - Enable MSP - Enable MSP - Enable MSP - Enable MSP - Enable MSP - - + + Check tickets from msp Check tickets from msp - Check tickets from msp - Check tickets from msp - Check tickets from msp - Check tickets from msp - Check tickets from msp - Check tickets from msp - Check tickets from msp - Check tickets from msp - - + + Enable MSP system Enable MSP system - Enable MSP system - Enable MSP system - Enable MSP system - Enable MSP system - Enable MSP system - Enable MSP system - Enable MSP system - Enable MSP system - + Setting up MSP Setting up MSP - Setting up MSP - Setting up MSP - Setting up MSP - Setting up MSP - Setting up MSP - Setting up MSP - Setting up MSP - Setting up MSP - - + + Packing MSP Packing MSP - Packing MSP - Packing MSP - Packing MSP - Packing MSP - Packing MSP - Packing MSP - Packing MSP - Packing MSP - + [['MSP has been contested!'], ['Respawn position has been updated.']] [['MSP has been contested!'], ['Respawn position has been updated.']] - [['MSP has been contested!'], ['Respawn position has been updated.']] - [['MSP has been contested!'], ['Respawn position has been updated.']] - [['MSP has been contested!'], ['Respawn position has been updated.']] - [['MSP has been contested!'], ['Respawn position has been updated.']] - [['MSP has been contested!'], ['Respawn position has been updated.']] - [['MSP has been contested!'], ['Respawn position has been updated.']] - [['MSP has been contested!'], ['Respawn position has been updated.']] - [['MSP has been contested!'], ['Respawn position has been updated.']] - - + + [['MSP has been secured!'], ['Respawn position has been updated.']] [['MSP has been secured!'], ['Respawn position has been updated.']] - [['MSP has been secured!'], ['Respawn position has been updated.']] - [['MSP has been secured!'], ['Respawn position has been updated.']] - [['MSP has been secured!'], ['Respawn position has been updated.']] - [['MSP has been secured!'], ['Respawn position has been updated.']] - [['MSP has been secured!'], ['Respawn position has been updated.']] - [['MSP has been secured!'], ['Respawn position has been updated.']] - [['MSP has been secured!'], ['Respawn position has been updated.']] - [['MSP has been secured!'], ['Respawn position has been updated.']] - - + + Enemies spotted near MSP! Enemies spotted near MSP! - Enemies spotted near MSP! - Enemies spotted near MSP! - Enemies spotted near MSP! - Enemies spotted near MSP! - Enemies spotted near MSP! - Enemies spotted near MSP! - Enemies spotted near MSP! - Enemies spotted near MSP! - + [['MSP has been deployed!'], ['Respawn position has been updated.']] [['MSP has been deployed!'], ['Respawn position has been updated.']] - [['MSP has been deployed!'], ['Respawn position has been updated.']] - [['MSP has been deployed!'], ['Respawn position has been updated.']] - [['MSP has been deployed!'], ['Respawn position has been updated.']] - [['MSP has been deployed!'], ['Respawn position has been updated.']] - [['MSP has been deployed!'], ['Respawn position has been updated.']] - [['MSP has been deployed!'], ['Respawn position has been updated.']] - [['MSP has been deployed!'], ['Respawn position has been updated.']] - [['MSP has been deployed!'], ['Respawn position has been updated.']] - - + + [['MSP has been packed!'], ['Respawn position has been updated.']] [['MSP has been packed!'], ['Respawn position has been updated.']] - [['MSP has been packed!'], ['Respawn position has been updated.']] - [['MSP has been packed!'], ['Respawn position has been updated.']] - [['MSP has been packed!'], ['Respawn position has been updated.']] - [['MSP has been packed!'], ['Respawn position has been updated.']] - [['MSP has been packed!'], ['Respawn position has been updated.']] - [['MSP has been packed!'], ['Respawn position has been updated.']] - [['MSP has been packed!'], ['Respawn position has been updated.']] - [['MSP has been packed!'], ['Respawn position has been updated.']] - + MSP Classname MSP Classname - MSP Classname - MSP Classname - MSP Classname - MSP Classname - MSP Classname - MSP Classname - MSP Classname - MSP Classname - - + + West MSP Classname West MSP Classname - West MSP Classname - West MSP Classname - West MSP Classname - West MSP Classname - West MSP Classname - West MSP Classname - West MSP Classname - West MSP Classname - - + + East MSP Classname East MSP Classname - East MSP Classname - East MSP Classname - East MSP Classname - East MSP Classname - East MSP Classname - East MSP Classname - East MSP Classname - East MSP Classname - - + + Resistance MSP Classname Resistance MSP Classname - Resistance MSP Classname - Resistance MSP Classname - Resistance MSP Classname - Resistance MSP Classname - Resistance MSP Classname - Resistance MSP Classname - Resistance MSP Classname - Resistance MSP Classname - - + + Civilian MSP Classname Civilian MSP Classname - Civilian MSP Classname - Civilian MSP Classname - Civilian MSP Classname - Civilian MSP Classname - Civilian MSP Classname - Civilian MSP Classname - Civilian MSP Classname - Civilian MSP Classname - - + + Put vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use non-string version of classname like: B_MRAP_01_F. Only one type of vehicle is supported currently Put vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use non-string version of classname like: B_MRAP_01_F. Only one type of vehicle is supported currently - Put vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use non-string version of classname like: B_MRAP_01_F. Only one type of vehicle is supported currently - Put vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use non-string version of classname like: B_MRAP_01_F. Only one type of vehicle is supported currently - Put vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use non-string version of classname like: B_MRAP_01_F. Only one type of vehicle is supported currently - Put vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use non-string version of classname like: B_MRAP_01_F. Only one type of vehicle is supported currently - Put vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use non-string version of classname like: B_MRAP_01_F. Only one type of vehicle is supported currently - Put vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use non-string version of classname like: B_MRAP_01_F. Only one type of vehicle is supported currently - Put vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use non-string version of classname like: B_MRAP_01_F. Only one type of vehicle is supported currently - Put vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use non-string version of classname like: B_MRAP_01_F. Only one type of vehicle is supported currently - + When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) - When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) - When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) - When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) - When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) - When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) - When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) - When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) - When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) - - + + Interval for when server updates the contested status for MSP Interval for when server updates the contested status for MSP - Interval for when server updates the contested status for MSP - Interval for when server updates the contested status for MSP - Interval for when server updates the contested status for MSP - Interval for when server updates the contested status for MSP - Interval for when server updates the contested status for MSP - Interval for when server updates the contested status for MSP - Interval for when server updates the contested status for MSP - Interval for when server updates the contested status for MSP - - + + Radius where there needs to be more enemies than allies to disable MSP (meters) Radius where there needs to be more enemies than allies to disable MSP (meters) - Radius where there needs to be more enemies than allies to disable MSP (meters) - Radius where there needs to be more enemies than allies to disable MSP (meters) - Radius where there needs to be more enemies than allies to disable MSP (meters) - Radius where there needs to be more enemies than allies to disable MSP (meters) - Radius where there needs to be more enemies than allies to disable MSP (meters) - Radius where there needs to be more enemies than allies to disable MSP (meters) - Radius where there needs to be more enemies than allies to disable MSP (meters) - Radius where there needs to be more enemies than allies to disable MSP (meters) - - + + Min Contested Radius Min Contested Radius - Min Contested Radius - Min Contested Radius - Min Contested Radius - Min Contested Radius - Min Contested Radius - Min Contested Radius - Min Contested Radius - Min Contested Radius - - + + Max Contested Radius Max Contested Radius - Max Contested Radius - Max Contested Radius - Max Contested Radius - Max Contested Radius - Max Contested Radius - Max Contested Radius - Max Contested Radius - Max Contested Radius - - + + Contested Check Interval Contested Check Interval - Contested Check Interval - Contested Check Interval - Contested Check Interval - Contested Check Interval - Contested Check Interval - Contested Check Interval - Contested Check Interval - Contested Check Interval - - + + Contested Contested - Contested - Contested - Contested - Contested - Contested - Contested - Contested - Contested - + Range from MSP where enemies are reported (meters) Range from MSP where enemies are reported (meters) - Range from MSP where enemies are reported (meters) - Range from MSP where enemies are reported (meters) - Range from MSP where enemies are reported (meters) - Range from MSP where enemies are reported (meters) - Range from MSP where enemies are reported (meters) - Range from MSP where enemies are reported (meters) - Range from MSP where enemies are reported (meters) - Range from MSP where enemies are reported (meters) - - + + Interval when server check if there is enemies near MSP Interval when server check if there is enemies near MSP - Interval when server check if there is enemies near MSP - Interval when server check if there is enemies near MSP - Interval when server check if there is enemies near MSP - Interval when server check if there is enemies near MSP - Interval when server check if there is enemies near MSP - Interval when server check if there is enemies near MSP - Interval when server check if there is enemies near MSP - Interval when server check if there is enemies near MSP - - + + %1<br/><br/>Enable Report Enemies near MSP %1<br/><br/>Enable Report Enemies near MSP - %1<br/><br/>Enable Report Enemies near MSP - %1<br/><br/>Enable Report Enemies near MSP - %1<br/><br/>Enable Report Enemies near MSP - %1<br/><br/>Enable Report Enemies near MSP - %1<br/><br/>Enable Report Enemies near MSP - %1<br/><br/>Enable Report Enemies near MSP - %1<br/><br/>Enable Report Enemies near MSP - %1<br/><br/>Enable Report Enemies near MSP - - + + Report Enemies Interval Report Enemies Interval - Report Enemies Interval - Report Enemies Interval - Report Enemies Interval - Report Enemies Interval - Report Enemies Interval - Report Enemies Interval - Report Enemies Interval - Report Enemies Interval - - + + Report Enemies Range Report Enemies Range - Report Enemies Range - Report Enemies Range - Report Enemies Range - Report Enemies Range - Report Enemies Range - Report Enemies Range - Report Enemies Range - Report Enemies Range - - + + Report Enemies Report Enemies - Report Enemies - Report Enemies - Report Enemies - Report Enemies - Report Enemies - Report Enemies - Report Enemies - Report Enemies - + Mobile spawn point Mobile spawn point - Mobile spawn point - Mobile spawn point - Mobile spawn point - Mobile spawn point - Mobile spawn point - Mobile spawn point - Mobile spawn point - Mobile spawn point - - + + MSP has been destroyed! MSP has been destroyed! - MSP has been destroyed! - MSP has been destroyed! - MSP has been destroyed! - MSP has been destroyed! - MSP has been destroyed! - MSP has been destroyed! - MSP has been destroyed! - MSP has been destroyed! - + Remaining time until respawn: %1 Remaining time until respawn: %1 - Remaining time until respawn: %1 - Remaining time until respawn: %1 - Remaining time until respawn: %1 - Remaining time until respawn: %1 - Remaining time until respawn: %1 - Remaining time until respawn: %1 - Remaining time until respawn: %1 - Remaining time until respawn: %1 - + Who gets notification from MSP setup/pack? Who gets notification from MSP setup/pack? - Who gets notification from MSP setup/pack? - Who gets notification from MSP setup/pack? - Who gets notification from MSP setup/pack? - Who gets notification from MSP setup/pack? - Who gets notification from MSP setup/pack? - Who gets notification from MSP setup/pack? - Who gets notification from MSP setup/pack? - Who gets notification from MSP setup/pack? - - + + Who gets notification when MSP contested? Who gets notification when MSP contested? - Who gets notification when MSP contested? - Who gets notification when MSP contested? - Who gets notification when MSP contested? - Who gets notification when MSP contested? - Who gets notification when MSP contested? - Who gets notification when MSP contested? - Who gets notification when MSP contested? - Who gets notification when MSP contested? - - + + Who gets notification when there is enemies near MSP? Who gets notification when there is enemies near MSP? - Who gets notification when there is enemies near MSP? - Who gets notification when there is enemies near MSP? - Who gets notification when there is enemies near MSP? - Who gets notification when there is enemies near MSP? - Who gets notification when there is enemies near MSP? - Who gets notification when there is enemies near MSP? - Who gets notification when there is enemies near MSP? - Who gets notification when there is enemies near MSP? - - + + When MSP is setup or packed up, who whil recive notification from it. Default: Group Leader When MSP is setup or packed up, who whil recive notification from it. Default: Group Leader - When MSP is setup or packed up, who whil recive notification from it. Default: Group Leader - When MSP is setup or packed up, who whil recive notification from it. Default: Group Leader - When MSP is setup or packed up, who whil recive notification from it. Default: Group Leader - When MSP is setup or packed up, who whil recive notification from it. Default: Group Leader - When MSP is setup or packed up, who whil recive notification from it. Default: Group Leader - When MSP is setup or packed up, who whil recive notification from it. Default: Group Leader - When MSP is setup or packed up, who whil recive notification from it. Default: Group Leader - When MSP is setup or packed up, who whil recive notification from it. Default: Group Leader - - + + When MSP is contested, who whil recive notification from it. Default: Group Leader When MSP is contested, who whil recive notification from it. Default: Group Leader - When MSP is contested, who whil recive notification from it. Default: Group Leader - When MSP is contested, who whil recive notification from it. Default: Group Leader - When MSP is contested, who whil recive notification from it. Default: Group Leader - When MSP is contested, who whil recive notification from it. Default: Group Leader - When MSP is contested, who whil recive notification from it. Default: Group Leader - When MSP is contested, who whil recive notification from it. Default: Group Leader - When MSP is contested, who whil recive notification from it. Default: Group Leader - When MSP is contested, who whil recive notification from it. Default: Group Leader - - + + When there is enemies near MSP, who whil recive notification from it. Default: Group Leader When there is enemies near MSP, who whil recive notification from it. Default: Group Leader - When there is enemies near MSP, who whil recive notification from it. Default: Group Leader - When there is enemies near MSP, who whil recive notification from it. Default: Group Leader - When there is enemies near MSP, who whil recive notification from it. Default: Group Leader - When there is enemies near MSP, who whil recive notification from it. Default: Group Leader - When there is enemies near MSP, who whil recive notification from it. Default: Group Leader - When there is enemies near MSP, who whil recive notification from it. Default: Group Leader - When there is enemies near MSP, who whil recive notification from it. Default: Group Leader - When there is enemies near MSP, who whil recive notification from it. Default: Group Leader - - + + Notifications Notifications - Notifications - Notifications - Notifications - Notifications - Notifications - Notifications - Notifications - Notifications diff --git a/addons/main/XEH_postInit.sqf b/addons/main/XEH_postInit.sqf deleted file mode 100644 index e9017ce..0000000 --- a/addons/main/XEH_postInit.sqf +++ /dev/null @@ -1,9 +0,0 @@ -#include "script_component.hpp" - -if (hasInterface) then { - [{!isNull player && GVAR(cbaSettingsDone)}, { - if (EGVAR(respawn,briefingEnable)) then { - [] call FUNC(briefingNotes); - }; - }] call CBA_fnc_waitUntilAndExecute; -}; \ No newline at end of file diff --git a/addons/main/XEH_preInit.sqf b/addons/main/XEH_preInit.sqf deleted file mode 100644 index 848fd7c..0000000 --- a/addons/main/XEH_preInit.sqf +++ /dev/null @@ -1,508 +0,0 @@ -#include "script_component.hpp" -#include "XEH_prep.sqf" - - -//Main settings -[ - QEGVAR(respawn,enable), // Unique setting name. Matches resulting variable name - "CHECKBOX", // Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" - ["STR_Tun_Respawn_CBA_Enable" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_tooltip_Enable" call BIS_fnc_localize], // Display name or display name + tooltip (optional, default: same as setting name) - "STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, // Category for the settings menu + optional sub-category - false, // Extra properties of the setting depending of _settingType. - 1, // 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) - {}, // Script to execute when setting is changed. (optional) - true //Setting will be marked as needing mission restart after being changed. (optional, default false) -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,killJIP), - "CHECKBOX", - ["Kill JIP", "STR_Tun_Respawn_CBA_tooltip_killjip" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_generic" call BIS_fnc_localize], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,killJIP_time), - "SLIDER", - ["Kill JIP Time", "STR_Tun_Respawn_CBA_tooltip_killjip_time" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_generic" call BIS_fnc_localize], - [1, 300, 20, 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,respawn_type), - "LIST", - ["Respawn Type", "STR_Tun_Respawn_CBA_tooltip_respawntypes" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_generic" call BIS_fnc_localize], - [[localize "STR_Tun_Respawn_Type_Default", localize "STR_Tun_Respawn_Type_Sidetickets", localize "STR_Tun_Respawn_Type_Playertickets"], [localize "STR_Tun_Respawn_Type_Default", localize "STR_Tun_Respawn_Type_Sidetickets", localize "STR_Tun_Respawn_Type_Playertickets"], 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,gearscriptType), - "LIST", - ["Gearscript type", "STR_Tun_Respawn_CBA_tooltip_gearscript" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_generic" call BIS_fnc_localize], - [["SQF Gearscript", "Potato Tool", "Save gear"], ["SQF Gearscript", "Potato Tool", "Save gear"], 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,forced_respawn), - "CHECKBOX", - ["Only Forced Waves", "STR_Tun_Respawn_CBA_tooltip_forceRespawn" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_generic" call BIS_fnc_localize], - false, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,delayed_respawn), - "SLIDER", - ["Delayed respawn", "STR_Tun_Respawn_CBA_tooltip_delayed_respawn" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_generic" call BIS_fnc_localize], - [0, 100, 0, 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,waiting_area_range), - "SLIDER", - ["Waiting Area Range", "STR_Tun_Respawn_CBA_tooltip_waiting_area_range" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_generic" call BIS_fnc_localize], - [30, 300, 100, 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -//Wave times -[ - QEGVAR(respawn,time_west), - "SLIDER", - ["West", "STR_Tun_Respawn_CBA_tooltip_time" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_time" call BIS_fnc_localize], - [1, 60, 15, 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,time_east), - "SLIDER", - ["East", "STR_Tun_Respawn_CBA_tooltip_time" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_time" call BIS_fnc_localize], - [1, 60, 15, 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,time_guer), - "SLIDER", - ["Resistance", "STR_Tun_Respawn_CBA_tooltip_time" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_time" call BIS_fnc_localize], - [1, 60, 15, 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,time_civ), - "SLIDER", - ["Civilian", "STR_Tun_Respawn_CBA_tooltip_time" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_time" call BIS_fnc_localize], - [1, 60, 15, 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -//Spectator camera modes -[ - QEGVAR(respawn,spectate_Cameramode_1st), - "CHECKBOX", - ["1st", "STR_Tun_Respawn_CBA_tooltip_specta_modes" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_spectate_cameramode" call BIS_fnc_localize], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,spectate_Cameramode_3th), - "CHECKBOX", - ["3th", "STR_Tun_Respawn_CBA_tooltip_specta_modes" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_spectate_cameramode" call BIS_fnc_localize], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,spectate_Cameramode_free), - "CHECKBOX", - ["Free", "STR_Tun_Respawn_CBA_tooltip_specta_modes" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_spectate_cameramode" call BIS_fnc_localize], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -//Ticket count -[ - QEGVAR(respawn,tickets_west), - "SLIDER", - ["West", "STR_Tun_Respawn_CBA_tooltip_ticket" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_ticketcount" call BIS_fnc_localize], - [0, 1000, 0, 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,tickets_east), - "SLIDER", - ["East", "STR_Tun_Respawn_CBA_tooltip_ticket" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_ticketcount" call BIS_fnc_localize], - [0, 1000, 0, 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,tickets_guer), - "SLIDER", - ["Resistance", "STR_Tun_Respawn_CBA_tooltip_ticket" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_ticketcount" call BIS_fnc_localize], - [0, 1000, 0, 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,tickets_civ), - "SLIDER", - ["Civilian", "STR_Tun_Respawn_CBA_tooltip_ticket" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_ticketcount" call BIS_fnc_localize], - [0, 1000, 0, 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,allowCheckTicketsBase), - "CHECKBOX", - ["Main base", "STR_Tun_Respawn_CBA_tooltip_CheckTickets" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_checkTickets" call BIS_fnc_localize], - false, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -//Briefing notes -[ - QEGVAR(respawn,briefingEnable), - "CHECKBOX", - ["STR_Tun_Respawn_CBA_Briefing_Enable" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Briefing_Enable_tooltip" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,briefingEnableShowRespawnType), - "CHECKBOX", - ["STR_Tun_Respawn_CBA_Briefing_Enable_ShowRespawType" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Briefing_Enable_ShowRespawType_tooltip" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,briefingEnableShowTickets), - "CHECKBOX", - ["STR_Tun_Respawn_CBA_Briefing_Enable_ShowTickets" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Briefing_Enable_ShowTickets_tooltip" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,briefingEnableShowTime), - "CHECKBOX", - ["STR_Tun_Respawn_CBA_Briefing_Enable_ShowTime" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Briefing_Enable_ShowTime_tooltip" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,briefingEnableShowOtherSidesDataWest), - "CHECKBOX", - ["STR_Tun_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_West" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,briefingEnableShowOtherSidesDataEast), - "CHECKBOX", - ["STR_Tun_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_East" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,briefingEnableShowOtherSidesDataResistance), - "CHECKBOX", - ["STR_Tun_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_Resistance" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(respawn,briefingEnableShowOtherSidesDataCivilian), - "CHECKBOX", - ["STR_Tun_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_Civilian" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip" call BIS_fnc_localize], - ["STR_Tun_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], - false, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -//////////////////// -/////////MSP//////// -//////////////////// -[ - QEGVAR(msp,enable), - "CHECKBOX", - ["STR_Tun_MSP_CBA_Enable" call BIS_fnc_localize, "STR_Tun_MSP_CBA_tooltip_Enable" call BIS_fnc_localize], - "STR_Tun_MSP_CBA_Category_main" call BIS_fnc_localize, - false, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(msp,allowCheckTicketsMSP), - "CHECKBOX", - ["STR_Tun_MSP_CBA_allowCheckTicketsMSP" call BIS_fnc_localize, "STR_Tun_Respawn_CBA_tooltip_CheckTickets" call BIS_fnc_localize], - "STR_Tun_MSP_CBA_Category_main" call BIS_fnc_localize, - false, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(msp,report_enemies), - "CHECKBOX", - ["STR_Tun_MSP_CBA_report_enemies" call BIS_fnc_localize, "STR_Tun_MSP_CBA_tooltip_report_enemies" call BIS_fnc_localize], - ["STR_Tun_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_MSP_CBA_Category_contested" call BIS_fnc_localize], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(msp,report_enemies_interval), - "SLIDER", - ["STR_Tun_MSP_CBA_report_enemies_intervala" call BIS_fnc_localize, "STR_Tun_MSP_CBA_tooltip_report_enemies_interval" call BIS_fnc_localize], - ["STR_Tun_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_MSP_CBA_Category_contested" call BIS_fnc_localize], - [1, 600, 30, 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(msp,report_enemies_range), - "SLIDER", - ["STR_Tun_MSP_CBA_report_enemies_range" call BIS_fnc_localize, "STR_Tun_MSP_CBA_tooltip_report_enemies_range" call BIS_fnc_localize], - ["STR_Tun_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_MSP_CBA_Category_contested" call BIS_fnc_localize], - [0, 5000, 500, 0], - 1, - {}, - false -] call CBA_Settings_fnc_init; - -[ - QEGVAR(msp,contested_radius_max), - "SLIDER", - ["STR_Tun_MSP_CBA_contested_radius_max" call BIS_fnc_localize, "STR_Tun_MSP_CBA_tooltip_contested_max" call BIS_fnc_localize], - ["STR_Tun_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_MSP_CBA_Category_contested" call BIS_fnc_localize], - [0, 5000, 500, 0], - 1, - {}, - false -] call CBA_Settings_fnc_init; - -[ - QEGVAR(msp,contested_radius_min), - "SLIDER", - ["STR_Tun_MSP_CBA_contested_radius_min" call BIS_fnc_localize, "STR_Tun_MSP_CBA_tooltip_contested_min" call BIS_fnc_localize], - ["STR_Tun_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_MSP_CBA_Category_contested" call BIS_fnc_localize], - [0, 5000, 200, 0], - 1, - {}, - false -] call CBA_Settings_fnc_init; - -[ - QEGVAR(msp,contested_check_interval), - "SLIDER", - ["STR_Tun_MSP_CBA_contested_check_interval" call BIS_fnc_localize, "STR_Tun_MSP_CBA_tooltip_contested_check_interval" call BIS_fnc_localize], - ["STR_Tun_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_MSP_CBA_Category_contested" call BIS_fnc_localize], - [1, 600, 30, 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(msp,progresbar_time_setup), - "SLIDER", - ["STR_Tun_MSP_CBA_setup_progresbar" call BIS_fnc_localize, "STR_Tun_MSP_CBA_tooltip_setup_progresbar" call BIS_fnc_localize], - ["STR_Tun_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_MSP_CBA_Category_progres" call BIS_fnc_localize], - [0, 60, 5, 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(msp,progresbar_time_pack), - "SLIDER", - ["STR_Tun_MSP_CBA_pack_progresbar" call BIS_fnc_localize, "STR_Tun_MSP_CBA_tooltip_pack_progresbar" call BIS_fnc_localize], - ["STR_Tun_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_MSP_CBA_Category_progres" call BIS_fnc_localize], - [0, 60, 5, 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(msp,clasnames_east), - "EDITBOX", - ["STR_Tun_MSP_CBA_classname_east" call BIS_fnc_localize, "STR_Tun_MSP_CBA_tooltip_classname" call BIS_fnc_localize], - ["STR_Tun_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_MSP_CBA_classname" call BIS_fnc_localize], - "O_Truck_03_transport_F", - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(msp,clasnames_west), - "EDITBOX", - ["STR_Tun_MSP_CBA_classname_west" call BIS_fnc_localize, "STR_Tun_MSP_CBA_tooltip_classname" call BIS_fnc_localize], - ["STR_Tun_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_MSP_CBA_classname" call BIS_fnc_localize], - "B_Truck_01_transport_F", - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(msp,clasnames_resistance), - "EDITBOX", - ["STR_Tun_MSP_CBA_classname_resistance" call BIS_fnc_localize, "STR_Tun_MSP_CBA_tooltip_classname" call BIS_fnc_localize], - ["STR_Tun_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_MSP_CBA_classname" call BIS_fnc_localize], - "I_Truck_02_transport_F", - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(msp,clasnames_civilian), - "EDITBOX", - ["STR_Tun_MSP_CBA_classname_civilian" call BIS_fnc_localize, "STR_Tun_MSP_CBA_tooltip_classname" call BIS_fnc_localize], - ["STR_Tun_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_MSP_CBA_classname" call BIS_fnc_localize], - "C_Truck_02_transport_F", - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(msp,setupNotification), - "LIST", - ["STR_Tun_MSP_CBA_whoGetsSetUpNotification" call BIS_fnc_localize, "STR_Tun_MSP_CBA_whoGetsSetUpNotification_Tooltip" call BIS_fnc_localize], - ["STR_Tun_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_MSP_CBA_notificationCategory" call BIS_fnc_localize], - [[0, 1], ["Group Leaders", "Side"], 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(msp,contestedNotification), - "LIST", - ["STR_Tun_MSP_CBA_whoGetsContestedNotification" call BIS_fnc_localize, "STR_Tun_MSP_CBA_whoGetsContestedNotification_Tooltip" call BIS_fnc_localize], - ["STR_Tun_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_MSP_CBA_notificationCategory" call BIS_fnc_localize], - [[0, 1], ["Group Leaders", "Side"], 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QEGVAR(msp,reportEnemiesNotification), - "LIST", - ["STR_Tun_MSP_CBA_whoGetsReportEnemiesNotification" call BIS_fnc_localize, "STR_Tun_MSP_CBA_whoGetsReportEnemies_Tooltip" call BIS_fnc_localize], - ["STR_Tun_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_Tun_MSP_CBA_notificationCategory" call BIS_fnc_localize], - [[0, 1], ["Group Leaders", "Side"], 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -GVAR(cbaSettingsDone) = true; \ No newline at end of file diff --git a/addons/main/config.cpp b/addons/main/config.cpp index 732518c..a84dca2 100644 --- a/addons/main/config.cpp +++ b/addons/main/config.cpp @@ -1,29 +1,46 @@ #include "script_component.hpp" -class CfgPatches -{ - class Tun_Main - { +// information on this addon specifically +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; units[] = {}; weapons[] = {}; - requiredVersion = 1.94; - requiredAddons[] = {"cba_main","cba_xeh","cba_settings","A3_Data_F","A3_Structures_F_Mil_Flags"}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"cba_main","cba_xeh","cba_settings","ace_common","ace_main","A3_Data_F","A3_Structures_F_Mil_Flags"}; author = "Tuntematon"; - authorUrl = "https://armafinland.fi/"; + authorUrl = "https://github.com/tuntematonjr/Tun-Respawn-System"; + VERSION_CONFIG; }; }; -class Extended_PreInit_EventHandlers { - class Tun_Main { - init = QUOTE( call COMPILE_FILE(XEH_preInit) ); - }; -}; +// information on the whole mod (only needed once) +class CfgMods { + class PREFIX { + dir = "@tun_respawn_system"; + name = "Tun Respawn System"; + + author = "Tuntematon"; // probably shown somewhere in the mods menu, but probably ignored by CBA/HEMTT -class Extended_PostInit_EventHandlers { - class Tun_Main { - init = QUOTE(call COMPILE_FILE(XEH_postInit)); + picture = "data\afilogo.paa"; // Picture displayed from the expansions menu. Optimal size is 2048x1024 + hideName = "false"; // Hide the extension name in main menu and extension menu + hidePicture = "false"; // Hide the extension picture in the extension menu + + action = "https://github.com/tuntematonjr/Tun-Respawn-System"; // Website URL, that can accessed from the expansions menu + actionName = "Github"; // label of button/tooltip in extension menu + description = "It's unclear where this will show"; // Probably in context with action + + // Color used for DLC stripes and backgrounds (RGBA) + dlcColor[] = + { + 1, + 0.0, + 0.86, + 1 + }; }; }; +// Configs go here class CfgVehicles { @@ -31,7 +48,7 @@ class CfgVehicles class FlagCarrier : FlagCarrierCore { class ACE_Actions { - class Tun_respawn_BaseAceAction { + class tunres_respawn_BaseAceAction { displayName = "Main"; condition = "true"; statement = "true"; diff --git a/addons/main/functions/fnc_briefingNotes.sqf b/addons/main/functions/fnc_briefingNotes.sqf deleted file mode 100644 index 7475671..0000000 --- a/addons/main/functions/fnc_briefingNotes.sqf +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Author: [Tuntematon] - * [Description] - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * ["something", player] call Tun_Main_fnc_briefingNotes - */ -#include "script_component.hpp" - -if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (IE zeus) - -private _text = "Respawn settings
"; - -if (EGVAR(respawn,briefingEnableShowRespawnType)) then { - if ( EGVAR(respawn,forced_respawn) ) then { - _text = format ["%1
%2",_text, localize "STR_Tun_Respawn_Briefing_onlyForcedWaves"]; - }; - switch (EGVAR(respawn,respawn_type)) do { - case localize "STR_Tun_Respawn_Type_Sidetickets": { - _text = format ["
%1
%2",_text, localize "STR_Tun_Respawn_Briefing_sidetickets"]; - }; - case localize "STR_Tun_Respawn_Type_Default": { - _text = format ["
%1
%2",_text, localize "STR_Tun_Respawn_Briefing_default"]; - }; - case localize "STR_Tun_Respawn_Type_Playertickets": { - _text = format ["
%1
%2",_text, localize "STR_Tun_Respawn_Briefing_playertickets"]; - }; - default { }; - }; -}; - -if (EGVAR(respawn,briefingEnableShowTime)) then { - _text = format ["%1

Wave interval",_text]; - if (playerSide isEqualTo west || EGVAR(respawn,briefingEnableShowOtherSidesDataWest)) then { - _text = format ["%1
For West is %2min",_text, EGVAR(respawn,time_west)]; - }; - - if (playerSide isEqualTo east || EGVAR(respawn,briefingEnableShowOtherSidesDataEast)) then { - _text = format ["%1
For East is %2min",_text, EGVAR(respawn,time_east)]; - }; - - if (playerSide isEqualTo resistance || EGVAR(respawn,briefingEnableShowOtherSidesDataResistance)) then { - _text = format ["%1
For Resistance is %2min",_text, EGVAR(respawn,time_guer)]; - }; - - if (playerSide isEqualTo civilian || EGVAR(respawn,briefingEnableShowOtherSidesDataCivilian)) then { - _text = format ["%1
For Civilian is %2min",_text, EGVAR(respawn,time_civ)]; - }; - - private _delayedRespawn = EGVAR(respawn,delayed_respawn); - if (_delayedRespawn > 0) then { - private _respawnTime = switch (playerSide) do { - case west: { EGVAR(respawn,time_west) }; - case east: { EGVAR(respawn,time_west) }; - case resistance: { EGVAR(respawn,time_west) }; - case civilian: { EGVAR(respawn,time_west) }; - }; - - _respawnTime = _respawnTime * 60; - private _delayedTime = [(_respawnTime * (_delayedRespawn /100)), "M:SS"] call CBA_fnc_formatElapsedTime; - _respawnTime = [_respawnTime, "M:SS"] call CBA_fnc_formatElapsedTime; - _text = format [localize "STR_Tun_Respawn_Briefing_DelayedRespawn",_text, _delayedTime, _delayedRespawn, _respawnTime, "%"]; - } else { - _text = _text + localize "STR_Tun_Respawn_Briefing_DelayedRespawnOff"; - - }; -}; - -if (EGVAR(respawn,briefingEnableShowTickets) && { EGVAR(respawn,briefingEnableShowRespawnType) isNotEqualTo localize "STR_Tun_Respawn_Type_Default"}) then { - _text = format ["%1

Tickets",_text]; - if (playerSide isEqualTo west || EGVAR(respawn,briefingEnableShowOtherSidesDataWest)) then { - _text = format ["%1
Ticket count: %2 (West)",_text, EGVAR(respawn,tickets_west)]; - }; - - if (playerSide isEqualTo east || EGVAR(respawn,briefingEnableShowOtherSidesDataEast)) then { - _text = format ["%1
Ticket count: %2 (East)",_text, EGVAR(respawn,tickets_east)]; - }; - - if (playerSide isEqualTo resistance || EGVAR(respawn,briefingEnableShowOtherSidesDataResistance)) then { - _text = format ["%1
Ticket count: %2 (Resistance)",_text, EGVAR(respawn,tickets_guer)]; - }; - - if (playerSide isEqualTo civilian || EGVAR(respawn,briefingEnableShowOtherSidesDataCivilian)) then { - _text = format ["%1
Ticket count: %2 (Civilian)",_text, EGVAR(respawn,tickets_civ)]; - }; - - if (EGVAR(respawn,allowCheckTicketsBase)) then { - _text = format ["%1
You can check remaining tickets from mainbase (flagpole, using ace actions).",_text]; - }; - - if (EGVAR(msp,allowCheckTicketsMSP)) then { - _text = format ["%1
You can check remaining tickets from MSP (using ace actions).",_text]; - }; -}; - -if (EGVAR(respawn,killJIP)) then { - _text = format [localize "STR_Tun_Respawn_Briefing_killJipEnabled",_text, EGVAR(respawn,killJIP_time)]; -} else { - _text = format ["%1

%2",_text, localize "STR_Tun_Respawn_Briefing_killJipDisabled"]; -}; - -private _vehicle = switch (playerSide) do { - case west: { EGVAR(msp,clasnames_west) }; - case east: { EGVAR(msp,clasnames_east) }; - case resistance: { EGVAR(msp,clasnames_resistance) }; - case civilian: { EGVAR(msp,clasnames_civilian) }; - default { "No side" }; -}; - -if (EGVAR(msp,enable)) then { - _text = format ["%1

MSP settings
",_text]; - if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { - _text = format ["%1
%2",_text, localize "STR_Tun_Respawn_Briefing_MspEnabled"]; - if (EGVAR(msp,report_enemies)) then { - _text = format [localize "STR_Tun_Respawn_Briefing_reportEnemiesEnabled",_text, EGVAR(msp,report_enemies_interval), EGVAR(msp,report_enemies_range)]; - } else { - _text = format ["%1
%2",_text, localize "STR_Tun_Respawn_Briefing_reportEnemiesDisabled"]; - }; - - _text = format [localize "STR_Tun_Respawn_Briefing_ContestedCheck",_text, EGVAR(msp,contested_check_interval), EGVAR(msp,contested_radius_max), EGVAR(msp,contested_radius_min)]; - _text = format [localize "STR_Tun_Respawn_Briefing_MspVehicle",_text, getText (configFile >> "CfgVehicles" >> _vehicle >> "displayName")]; - } else { - _text = format ["%1
%2",_text, localize "STR_Tun_Respawn_Briefing_MspDisabled"]; - }; -}; - -_text = _text + localize "STR_Tun_Respawn_Briefing_teleportNetwork"; -_text = format ["%1

Powered By TuntematonEngine v%2.%3.%4", _text, MAJOR, MINOR, PATCHLVL]; - -player createDiaryRecord ["Diary",["Respawn info",_text]]; -player createDiarySubject ["Respawn info","Tun - Respawn info"]; -player createDiaryRecord ["Respawn info",["Tun - Respawn info",_text]]; - diff --git a/addons/main/functions/script_component.hpp b/addons/main/functions/script_component.hpp deleted file mode 100644 index 4e2d473..0000000 --- a/addons/main/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "..\script_component.hpp" \ No newline at end of file diff --git a/addons/main/script_component.hpp b/addons/main/script_component.hpp index 03b9b13..abc4a4e 100644 --- a/addons/main/script_component.hpp +++ b/addons/main/script_component.hpp @@ -1,23 +1,14 @@ -#define COMPONENT Main -#define PREFIX Tun +#define COMPONENT main +#include "\x\tunres\addons\main\script_mod.hpp" -#define MAJOR 1 -#define MINOR 7 -#define PATCHLVL 6 -#define BUILD 15052023 +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE -#define VERSION MAJOR.MINOR.PATCHLVL.BUILD -#define VERSION_AR MAJOR,MINOR,PATCHLVL,BUILD +#ifdef DEBUG_ENABLED_MAIN + #define DEBUG_MODE_FULL +#endif + #ifdef DEBUG_SETTINGS_MAIN + #define DEBUG_SETTINGS DEBUG_SETTINGS_MAIN +#endif -// MINIMAL required version for the Mod. Components can specify others.. -#define REQUIRED_VERSION 2.06 - -#define DEBUG_MODE_FULL - -#include "\z\ace\addons\main\script_macros.hpp" - -// Default versioning level -#define DEFAULT_VERSIONING_LEVEL 2 - -//AAR update macro -#define AAR_UPDATE(OBJ,VARNAME,VALUE) if ( !isnil "afi_aar2" ) then { [OBJ, VARNAME, VALUE] call afi_aar2_fnc_addcustomdata; }; \ No newline at end of file +#include "\x\tunres\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp new file mode 100644 index 0000000..6de0f89 --- /dev/null +++ b/addons/main/script_macros.hpp @@ -0,0 +1,13 @@ +#include "\z\ace\addons\main\script_macros.hpp" + +#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 + + +//AAR update macro +#define AAR_UPDATE(OBJ,VARNAME,VALUE) if ( !isnil "afi_aar2" ) then { [OBJ, VARNAME, VALUE] call afi_aar2_fnc_addcustomdata; }; \ No newline at end of file diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp new file mode 100644 index 0000000..cbb2861 --- /dev/null +++ b/addons/main/script_mod.hpp @@ -0,0 +1,15 @@ +#define MAINPREFIX x +#define PREFIX main + +#include "script_version.hpp" + +#define VERSION MAJOR.MINOR +#define VERSION_AR MAJOR,MINOR,PATCH,BUILD + +#define REQUIRED_VERSION 2.14 + +#ifdef COMPONENT_BEAUTIFIED + #define COMPONENT_NAME QUOTE(tunres - COMPONENT_BEAUTIFIED) +#else + #define COMPONENT_NAME QUOTE(tunres - COMPONENT) +#endif diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp new file mode 100644 index 0000000..cb62fcf --- /dev/null +++ b/addons/main/script_version.hpp @@ -0,0 +1,4 @@ +#define MAJOR 1 +#define MINOR 8 +#define PATCH 0 +#define BUILD 0 \ No newline at end of file diff --git a/addons/msp/$PBOPREFIX$ b/addons/msp/$PBOPREFIX$ new file mode 100644 index 0000000..9c4fcc5 --- /dev/null +++ b/addons/msp/$PBOPREFIX$ @@ -0,0 +1 @@ +x\tunres\addons\msp diff --git a/addons/msp/CfgEventHandlers.hpp b/addons/msp/CfgEventHandlers.hpp new file mode 100644 index 0000000..1a24e14 --- /dev/null +++ b/addons/msp/CfgEventHandlers.hpp @@ -0,0 +1,20 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + serverInit = QUOTE(call COMPILE_FILE(XEH_preInit_server)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + clientInit = QUOTE(call COMPILE_FILE(XEH_postInit_client)); + serverInit = QUOTE(call COMPILE_FILE(XEH_postInit_server)); + }; +}; \ No newline at end of file diff --git a/addons/msp/XEH_prep.sqf b/addons/msp/XEH_PREP.hpp similarity index 74% rename from addons/msp/XEH_prep.sqf rename to addons/msp/XEH_PREP.hpp index 1ca834b..8f43e04 100644 --- a/addons/msp/XEH_prep.sqf +++ b/addons/msp/XEH_PREP.hpp @@ -1,5 +1,3 @@ -#include "script_component.hpp" - PREP(ace_actions); PREP(add_EH); PREP(contestedCheck); @@ -7,4 +5,5 @@ PREP(create_msp_props); PREP(init_contested); PREP(initate_msp_action); PREP(update_status); -PREP(whoToNotify); \ No newline at end of file +PREP(whoToNotify); +PREP(briefingNotes); \ No newline at end of file diff --git a/addons/msp/XEH_postInit.sqf b/addons/msp/XEH_postInit.sqf index c53e075..9242705 100644 --- a/addons/msp/XEH_postInit.sqf +++ b/addons/msp/XEH_postInit.sqf @@ -1,14 +1,6 @@ #include "script_component.hpp" -if !(GVAR(enable) && Tun_respawn_enable) exitWith { INFO("TUN Mobile Respawn Point Disabled"); }; -INFO("TUN Mobile Respawn Point Enabled"); - -[] call FUNC(add_EH); -if (isServer) then { - [] call FUNC(init_contested); - -}; +if !(GVAR(enable)) exitWith { INFO("TUN Mobile Respawn Point Disabled"); }; +INFO("TUN Mobile Respawn Point Enabled"); -if (hasInterface && {playerSide isNotEqualTo sideLogic}) then { - [] call FUNC(ace_actions); -}; \ No newline at end of file +[] call FUNC(add_EH); \ No newline at end of file diff --git a/addons/msp/XEH_postInit_client.sqf b/addons/msp/XEH_postInit_client.sqf new file mode 100644 index 0000000..5969f00 --- /dev/null +++ b/addons/msp/XEH_postInit_client.sqf @@ -0,0 +1,8 @@ +#include "script_component.hpp" + +[{!isNull player && +ADDON +}, { + [] call FUNC(briefingNotes); + [] call FUNC(ace_actions); +}] call CBA_fnc_waitUntilAndExecute; \ No newline at end of file diff --git a/addons/msp/XEH_postInit_server.sqf b/addons/msp/XEH_postInit_server.sqf new file mode 100644 index 0000000..0edc09d --- /dev/null +++ b/addons/msp/XEH_postInit_server.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +[] call FUNC(init_contested); \ No newline at end of file diff --git a/addons/msp/XEH_preInit.sqf b/addons/msp/XEH_preInit.sqf index 570adcc..1df5539 100644 --- a/addons/msp/XEH_preInit.sqf +++ b/addons/msp/XEH_preInit.sqf @@ -1,51 +1,195 @@ #include "script_component.hpp" -#include "XEH_prep.sqf" +ADDON = false; -if (isServer) then { - missionNamespace setVariable [QGVAR(disableContestedCheck), false, true]; +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; - missionNamespace setVariable [QGVAR(contested_east), false, true]; - missionNamespace setVariable [QGVAR(contested_west), false, true]; - missionNamespace setVariable [QGVAR(contested_guer), false, true]; - missionNamespace setVariable [QGVAR(contested_civ), false, true]; +[ + QGVAR(enable), + "CHECKBOX", + ["STR_tunres_MSP_CBA_Enable" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_Enable" call BIS_fnc_localize], + "STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, + false, + 1, + {}, + true +] call CBA_Settings_fnc_init; - missionNamespace setVariable [QGVAR(status_east), false, true]; - missionNamespace setVariable [QGVAR(status_west), false, true]; - missionNamespace setVariable [QGVAR(status_guer), false, true]; - missionNamespace setVariable [QGVAR(status_civ), false, true]; +[ + QGVAR(allowCheckTicketsMSP), + "CHECKBOX", + ["STR_tunres_MSP_CBA_allowCheckTicketsMSP" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_tooltip_CheckTickets" call BIS_fnc_localize], + "STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, + false, + 1, + {}, + true +] call CBA_Settings_fnc_init; - missionNamespace setVariable [QGVAR(vehicle_east), objNull, true]; - missionNamespace setVariable [QGVAR(vehicle_west), objNull, true]; - missionNamespace setVariable [QGVAR(vehicle_guer), objNull, true]; - missionNamespace setVariable [QGVAR(vehicle_civ), objNull, true]; +[ + QGVAR(report_enemies), + "CHECKBOX", + ["STR_tunres_MSP_CBA_report_enemies" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_report_enemies" call BIS_fnc_localize], + ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_contested" call BIS_fnc_localize], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; - missionNamespace setVariable [QGVAR(nearUnitsEast), [], true]; - missionNamespace setVariable [QGVAR(nearUnitsEastMin), [], true]; +[ + QGVAR(report_enemies_interval), + "SLIDER", + ["STR_tunres_MSP_CBA_report_enemies_intervala" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_report_enemies_interval" call BIS_fnc_localize], + ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_contested" call BIS_fnc_localize], + [1, 600, 30, 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; - missionNamespace setVariable [QGVAR(nearUnitsWest), [], true]; - missionNamespace setVariable [QGVAR(nearUnitsWestMin), [], true]; +[ + QGVAR(report_enemies_range), + "SLIDER", + ["STR_tunres_MSP_CBA_report_enemies_range" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_report_enemies_range" call BIS_fnc_localize], + ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_contested" call BIS_fnc_localize], + [0, 5000, 500, 0], + 1, + {}, + false +] call CBA_Settings_fnc_init; - missionNamespace setVariable [QGVAR(nearUnitsGuer), [], true]; - missionNamespace setVariable [QGVAR(nearUnitsGuerMin), [], true]; +[ + QGVAR(contested_radius_max), + "SLIDER", + ["STR_tunres_MSP_CBA_contested_radius_max" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_contested_max" call BIS_fnc_localize], + ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_contested" call BIS_fnc_localize], + [0, 5000, 500, 0], + 1, + {}, + false +] call CBA_Settings_fnc_init; - missionNamespace setVariable [QGVAR(nearUnitsCiv), [], true]; - missionNamespace setVariable [QGVAR(nearUnitsCivMin), [], true]; +[ + QGVAR(contested_radius_min), + "SLIDER", + ["STR_tunres_MSP_CBA_contested_radius_min" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_contested_min" call BIS_fnc_localize], + ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_contested" call BIS_fnc_localize], + [0, 5000, 200, 0], + 1, + {}, + false +] call CBA_Settings_fnc_init; - missionNamespace setVariable [QGVAR(enemyCountEast), 0, true]; - missionNamespace setVariable [QGVAR(enemyCountMinEast), 0, true]; - missionNamespace setVariable [QGVAR(friendlyCountEast), 0, true]; +[ + QGVAR(contested_check_interval), + "SLIDER", + ["STR_tunres_MSP_CBA_contested_check_interval" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_contested_check_interval" call BIS_fnc_localize], + ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_contested" call BIS_fnc_localize], + [1, 600, 30, 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; - missionNamespace setVariable [QGVAR(enemyCountWest), 0, true]; - missionNamespace setVariable [QGVAR(enemyCountMinWest), 0, true]; - missionNamespace setVariable [QGVAR(friendlyCountWest), 0, true]; +[ + QGVAR(progresbar_time_setup), + "SLIDER", + ["STR_tunres_MSP_CBA_setup_progresbar" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_setup_progresbar" call BIS_fnc_localize], + ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_progres" call BIS_fnc_localize], + [0, 60, 5, 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; - missionNamespace setVariable [QGVAR(enemyCountGuer), 0, true]; - missionNamespace setVariable [QGVAR(enemyCountMinGuer), 0, true]; - missionNamespace setVariable [QGVAR(friendlyCountGuer), 0, true]; +[ + QGVAR(progresbar_time_pack), + "SLIDER", + ["STR_tunres_MSP_CBA_pack_progresbar" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_pack_progresbar" call BIS_fnc_localize], + ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_progres" call BIS_fnc_localize], + [0, 60, 5, 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; - missionNamespace setVariable [QGVAR(enemyCountCiv), 0, true]; - missionNamespace setVariable [QGVAR(enemyCountMinCiv), 0, true]; - missionNamespace setVariable [QGVAR(friendlyCountCiv), 0, true]; +[ + QGVAR(clasnames_east), + "EDITBOX", + ["STR_tunres_MSP_CBA_classname_east" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_classname" call BIS_fnc_localize], + ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_classname" call BIS_fnc_localize], + "O_Truck_03_transport_F", + 1, + {}, + true +] call CBA_Settings_fnc_init; - GVAR(contestedCheckHash) = createHashMap;; -}; \ No newline at end of file +[ + QGVAR(clasnames_west), + "EDITBOX", + ["STR_tunres_MSP_CBA_classname_west" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_classname" call BIS_fnc_localize], + ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_classname" call BIS_fnc_localize], + "B_Truck_01_transport_F", + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(clasnames_resistance), + "EDITBOX", + ["STR_tunres_MSP_CBA_classname_resistance" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_classname" call BIS_fnc_localize], + ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_classname" call BIS_fnc_localize], + "I_Truck_02_transport_F", + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(clasnames_civilian), + "EDITBOX", + ["STR_tunres_MSP_CBA_classname_civilian" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_classname" call BIS_fnc_localize], + ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_classname" call BIS_fnc_localize], + "C_Truck_02_transport_F", + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(setupNotification), + "LIST", + ["STR_tunres_MSP_CBA_whoGetsSetUpNotification" call BIS_fnc_localize, "STR_tunres_MSP_CBA_whoGetsSetUpNotification_Tooltip" call BIS_fnc_localize], + ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_notificationCategory" call BIS_fnc_localize], + [[0, 1], ["Group Leaders", "Side"], 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedNotification), + "LIST", + ["STR_tunres_MSP_CBA_whoGetsContestedNotification" call BIS_fnc_localize, "STR_tunres_MSP_CBA_whoGetsContestedNotification_Tooltip" call BIS_fnc_localize], + ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_notificationCategory" call BIS_fnc_localize], + [[0, 1], ["Group Leaders", "Side"], 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesNotification), + "LIST", + ["STR_tunres_MSP_CBA_whoGetsReportEnemiesNotification" call BIS_fnc_localize, "STR_tunres_MSP_CBA_whoGetsReportEnemies_Tooltip" call BIS_fnc_localize], + ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_notificationCategory" call BIS_fnc_localize], + [[0, 1], ["Group Leaders", "Side"], 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +ADDON = true; \ No newline at end of file diff --git a/addons/msp/XEH_preInit_server.sqf b/addons/msp/XEH_preInit_server.sqf new file mode 100644 index 0000000..8a6f256 --- /dev/null +++ b/addons/msp/XEH_preInit_server.sqf @@ -0,0 +1,49 @@ +#include "script_component.hpp" +//only executed on server + +missionNamespace setVariable [QGVAR(disableContestedCheck), false, true]; + +missionNamespace setVariable [QGVAR(contested_east), false, true]; +missionNamespace setVariable [QGVAR(contested_west), false, true]; +missionNamespace setVariable [QGVAR(contested_guer), false, true]; +missionNamespace setVariable [QGVAR(contested_civ), false, true]; + +missionNamespace setVariable [QGVAR(status_east), false, true]; +missionNamespace setVariable [QGVAR(status_west), false, true]; +missionNamespace setVariable [QGVAR(status_guer), false, true]; +missionNamespace setVariable [QGVAR(status_civ), false, true]; + +missionNamespace setVariable [QGVAR(vehicle_east), objNull, true]; +missionNamespace setVariable [QGVAR(vehicle_west), objNull, true]; +missionNamespace setVariable [QGVAR(vehicle_guer), objNull, true]; +missionNamespace setVariable [QGVAR(vehicle_civ), objNull, true]; + +missionNamespace setVariable [QGVAR(nearUnitsEast), [], true]; +missionNamespace setVariable [QGVAR(nearUnitsEastMin), [], true]; + +missionNamespace setVariable [QGVAR(nearUnitsWest), [], true]; +missionNamespace setVariable [QGVAR(nearUnitsWestMin), [], true]; + +missionNamespace setVariable [QGVAR(nearUnitsGuer), [], true]; +missionNamespace setVariable [QGVAR(nearUnitsGuerMin), [], true]; + +missionNamespace setVariable [QGVAR(nearUnitsCiv), [], true]; +missionNamespace setVariable [QGVAR(nearUnitsCivMin), [], true]; + +missionNamespace setVariable [QGVAR(enemyCountEast), 0, true]; +missionNamespace setVariable [QGVAR(enemyCountMinEast), 0, true]; +missionNamespace setVariable [QGVAR(friendlyCountEast), 0, true]; + +missionNamespace setVariable [QGVAR(enemyCountWest), 0, true]; +missionNamespace setVariable [QGVAR(enemyCountMinWest), 0, true]; +missionNamespace setVariable [QGVAR(friendlyCountWest), 0, true]; + +missionNamespace setVariable [QGVAR(enemyCountGuer), 0, true]; +missionNamespace setVariable [QGVAR(enemyCountMinGuer), 0, true]; +missionNamespace setVariable [QGVAR(friendlyCountGuer), 0, true]; + +missionNamespace setVariable [QGVAR(enemyCountCiv), 0, true]; +missionNamespace setVariable [QGVAR(enemyCountMinCiv), 0, true]; +missionNamespace setVariable [QGVAR(friendlyCountCiv), 0, true]; + +GVAR(contestedCheckHash) = createHashMap; \ No newline at end of file diff --git a/addons/msp/XEH_preStart.sqf b/addons/msp/XEH_preStart.sqf index 0825483..a51262a 100644 --- a/addons/msp/XEH_preStart.sqf +++ b/addons/msp/XEH_preStart.sqf @@ -1 +1,2 @@ -#include "XEH_prep.sqf" \ No newline at end of file +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/addons/msp/config.cpp b/addons/msp/config.cpp index f39f0f3..e934973 100644 --- a/addons/msp/config.cpp +++ b/addons/msp/config.cpp @@ -1,32 +1,17 @@ #include "script_component.hpp" -class CfgPatches -{ - class tun_msp - { +// information on this addon specifically +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; units[] = {}; weapons[] = {}; - requiredVersion = 1.94; - requiredAddons[] = {"cba_main","cba_xeh","Tun_Respawn","Tun_Main","ace_interaction","ace_interact_menu"}; - author[] = {"Tuntematon"}; - authorUrl = "https://armafinland.fi/"; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"TunRes_main", "cba_main","cba_xeh","tunres_Respawn","ace_interaction","ace_interact_menu"}; + authors[] = {"Tuntematon"}; // sub array of authors, considered for the specific addon, can be removed or left empty {} + VERSION_CONFIG; }; }; -class Extended_PostInit_EventHandlers { - class tun_msp { - init = QUOTE(call COMPILE_FILE(XEH_postInit)); - }; -}; - -class Extended_PreInit_EventHandlers { - class tun_msp { - init = QUOTE( call COMPILE_FILE(XEH_preInit) ); - }; -}; - -class Extended_PreStart_EventHandlers { - class tun_msp { - init = QUOTE( call COMPILE_FILE(XEH_preStart) ); - }; -}; \ No newline at end of file +// configs go here +#include "CfgEventHandlers.hpp" diff --git a/addons/msp/eh list.txt b/addons/msp/eh list.txt index a55c722..1131ee3 100644 --- a/addons/msp/eh list.txt +++ b/addons/msp/eh list.txt @@ -1,2 +1,2 @@ EH Name | locality | params -Tun_msp_EH_contestedUpdate- global - new status, enemy count, enemy count min, Friendly count \ No newline at end of file +tunres_msp_EH_contestedUpdate- global - new status, enemy count, enemy count min, Friendly count \ No newline at end of file diff --git a/addons/msp/functions/fnc_ace_actions.sqf b/addons/msp/functions/fnc_ace_actions.sqf index 1c5ac93..1a7f6a4 100644 --- a/addons/msp/functions/fnc_ace_actions.sqf +++ b/addons/msp/functions/fnc_ace_actions.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Create ace actions to MSP vehicles @@ -10,9 +10,10 @@ * None * * Example: - * [] call Tun_MSP_fnc_ace_actions + * [] call tunres_MSP_fnc_ace_actions */ #include "script_component.hpp" +if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (IE zeus) private _vehicle = switch (playerSide) do { @@ -37,7 +38,7 @@ private _vehicle = switch (playerSide) do { }; }; -private _actionMain = ["Tun_respawnAction", "Respawn Actions", "\a3\Modules_F_Curator\Data\portraitRespawnTickets_ca.paa", {true}, {true}] call ace_interact_menu_fnc_createAction; +private _actionMain = ["tunres_respawnAction", "Respawn Actions", "\a3\Modules_F_Curator\Data\portraitRespawnTickets_ca.paa", {true}, {true}] call ace_interact_menu_fnc_createAction; [_vehicle, 0, ["ACE_MainActions"], _actionMain] call ace_interact_menu_fnc_addActionToClass; //check that class exist @@ -53,32 +54,32 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { //remaining time for respawn. private _timer_action = { - _wait_time = ((missionNamespace getVariable format ["Tun_Respawn_wait_time_%1", playerSide]) - cba_missiontime); - format ["STR_Tun_MSP_remaining_time" call BIS_fnc_localize, [_wait_time] call CBA_fnc_formatElapsedTime] call CBA_fnc_notify; + _wait_time = ((missionNamespace getVariable format ["tunres_Respawn_wait_time_%1", playerSide]) - cba_missiontime); + format ["STR_tunres_MSP_remaining_time" call BIS_fnc_localize, [_wait_time] call CBA_fnc_formatElapsedTime] call CBA_fnc_notify; }; private _timer_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; _chekTime = ["Check Respawn Time", "Check Respawn Time", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", _timer_action, _timer_condition] call ace_interact_menu_fnc_createAction; //Ace inteaction [_vehicle, 1, ["ACE_SelfActions"], _createMSP] call ace_interact_menu_fnc_addActionToClass; - [_vehicle, 0, ["ACE_MainActions","Tun_respawnAction"], _removeMSP] call ace_interact_menu_fnc_addActionToClass; - [_vehicle, 0, ["ACE_MainActions","Tun_respawnAction"], _chekTime] call ace_interact_menu_fnc_addActionToClass; + [_vehicle, 0, ["ACE_MainActions","tunres_respawnAction"], _removeMSP] call ace_interact_menu_fnc_addActionToClass; + [_vehicle, 0, ["ACE_MainActions","tunres_respawnAction"], _chekTime] call ace_interact_menu_fnc_addActionToClass; //TP. I hate this system already. [_vehicle, "InitPost", { params ["_entity"]; private _variable = switch (playerSide) do { - case west: { "tun_msp_vehicle_west" }; - case east: { "tun_msp_vehicle_east" }; - case resistance: { "tun_msp_vehicle_guer" }; - case civilian: { "tun_msp_vehicle_civ" }; + case west: { "tunres_msp_vehicle_west" }; + case east: { "tunres_msp_vehicle_east" }; + case resistance: { "tunres_msp_vehicle_guer" }; + case civilian: { "tunres_msp_vehicle_civ" }; }; - private _menu_condition = "alive _target && {_target getVariable ['tun_msp_isMSP', false]} && {!(_target getVariable ['tun_msp_isContested', false])}"; - private _tp_conditionText = " private _msp = missionNamespace getVariable ['%1', objNull]; private _status = _msp getVariable ['tun_msp_isContested', false]; (_target isNotEqualTo _msp && _obj getVariable ['tun_msp_isMSP', false] && !_status) "; + private _menu_condition = "alive _target && {_target getVariable ['tunres_msp_isMSP', false]} && {!(_target getVariable ['tunres_msp_isContested', false])}"; + private _tp_conditionText = " private _msp = missionNamespace getVariable ['%1', objNull]; private _status = _msp getVariable ['tunres_msp_isContested', false]; (_target isNotEqualTo _msp && _obj getVariable ['tunres_msp_isMSP', false] && !_status) "; _tp_conditionText = format [_tp_conditionText, _variable]; - [_entity, _tp_conditionText, "STR_Tun_MSP_TpText" call BIS_fnc_localize, false, nil, [playerSide], true, _menu_condition, false, ["ACE_MainActions","Tun_respawnAction"]] call Tun_Respawn_fnc_addCustomTeleporter; + [_entity, _tp_conditionText, "STR_tunres_MSP_TpText" call BIS_fnc_localize, false, nil, [playerSide], true, _menu_condition, false, ["ACE_MainActions","tunres_respawnAction"]] call tunres_Respawn_fnc_addCustomTeleporter; }, false, [], true] call CBA_fnc_addClassEventHandler; @@ -87,10 +88,10 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { [playerSide] call EFUNC(respawn,checkTicketCount); }; private _remaining_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; - _remainingTickets = ["STR_Tun_Respawn_CheckTickets" call BIS_fnc_localize, "STR_Tun_Respawn_CheckTickets" call BIS_fnc_localize, "\a3\modules_f_curator\data\portraitmissionname_ca.paa", _remaining_action, _remaining_condition] call ace_interact_menu_fnc_createAction; - [_vehicle, 0, ["ACE_MainActions","Tun_respawnAction"], _remainingTickets] call ace_interact_menu_fnc_addActionToClass; + _remainingTickets = ["STR_tunres_Respawn_CheckTickets" call BIS_fnc_localize, "STR_tunres_Respawn_CheckTickets" call BIS_fnc_localize, "\a3\modules_f_curator\data\portraitmissionname_ca.paa", _remaining_action, _remaining_condition] call ace_interact_menu_fnc_createAction; + [_vehicle, 0, ["ACE_MainActions","tunres_respawnAction"], _remainingTickets] call ace_interact_menu_fnc_addActionToClass; }; } else { - private _errorText = format ["(Tun_MSP_fnc_ace_actions) Tried to add following classname as MSP: %1. But it does not exist",_vehicle]; + private _errorText = format ["(tunres_MSP_fnc_ace_actions) Tried to add following classname as MSP: %1. But it does not exist",_vehicle]; ERROR(_errorText); }; diff --git a/addons/msp/functions/fnc_add_EH.sqf b/addons/msp/functions/fnc_add_EH.sqf index 0efe4c8..290e7cd 100644 --- a/addons/msp/functions/fnc_add_EH.sqf +++ b/addons/msp/functions/fnc_add_EH.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Add init EH and killed EH to MSP @@ -10,7 +10,7 @@ * None * * Example: - * [] call Tun_MSP_fnc_add_eh + * [] call tunres_MSP_fnc_add_eh */ #include "script_component.hpp" @@ -82,9 +82,9 @@ //Do marker update - [_side, false] remoteExecCall ["Tun_respawn_fnc_update_respawn_point", 2]; + [_side, false] remoteExecCall ["tunres_respawn_fnc_update_respawn_point", 2]; - ("STR_Tun_MSP_destroyed" call BIS_fnc_localize) remoteExecCall ["CBA_fnc_notify", _side]; + ("STR_tunres_MSP_destroyed" call BIS_fnc_localize) remoteExecCall ["CBA_fnc_notify", _side]; }; }; @@ -94,7 +94,7 @@ [_vehicle, "Deleted", _mspLostEhCode, true, [], true] call CBA_fnc_addClassEventHandler; } else { if (isServer) then { - private _errorText = format ["(Tun_MSP_fnc_ace_actions) Tried to add following classname as MSP: %1. But it does not exist",_vehicle]; + private _errorText = format ["(tunres_MSP_fnc_ace_actions) Tried to add following classname as MSP: %1. But it does not exist",_vehicle]; ERROR(_errorText); }; }; diff --git a/addons/msp/functions/fnc_briefingNotes.sqf b/addons/msp/functions/fnc_briefingNotes.sqf index a125cb0..aebd14d 100644 --- a/addons/msp/functions/fnc_briefingNotes.sqf +++ b/addons/msp/functions/fnc_briefingNotes.sqf @@ -1,4 +1,4 @@ -/* + /* * Author: [Tuntematon] * [Description] * @@ -9,36 +9,45 @@ * None * * Example: - * [] call Tun_Respawn_fnc_briefingNotes + * ["something", player] call tunres_Main_fnc_briefingNotes */ #include "script_component.hpp" -private _text = "MSP settings
"; +if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (IE zeus) -_text = format ["%1
- Tickets can be checked from MSP: %2",_text, GVAR(allowCheckTicketsMSP)]; +private _vehicle = switch (playerSide) do { + case west: { GVAR(clasnames_west) }; + case east: { GVAR(clasnames_east) }; + case resistance: { GVAR(clasnames_resistance) }; + case civilian: { GVAR(clasnames_civilian) }; + default { "No side" }; +}; -_text = format ["%1

Report enemies
",_text]; -_text = format ["%1
- Report enemies: %2",_text, GVAR(report_enemies)]; -if (GVAR(report_enemies)) then { - _text = format ["%1
- Report enemies interval: %2",_text, GVAR(report_enemies_interval)]; - _text = format ["%1
-%2",_text, "STR_Tun_MSP_CBA_tooltip_report_enemies_interval" call BIS_fnc_localize]; +private _text = format ["%1

MSP settings
",_text]; +if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { - _text = format ["%1
- Report enemies range: %2",_text, GVAR(report_enemies_range)]; - _text = format ["%1
-%2",_text, "STR_Tun_MSP_CBA_tooltip_report_enemies_range" call BIS_fnc_localize]; -}; + _text = format ["%1
%2",_text, localize "STR_tunres_Respawn_Briefing_MspEnabled"]; -_text = format ["%1

Contested settings
",_text]; -_text = format ["%1
- Contested check interval: %2",_text, GVAR(contested_check_interval)]; -_text = format ["%1
-%2",_text, "STR_Tun_MSP_CBA_tooltip_contested_check_interval" call BIS_fnc_localize]; + if (GVAR(report_enemies)) then { + _text = format [localize "STR_tunres_Respawn_Briefing_reportEnemiesEnabled",_text, GVAR(report_enemies_interval), GVAR(report_enemies_range)]; + } else { + _text = format ["%1
%2",_text, localize "STR_tunres_Respawn_Briefing_reportEnemiesDisabled"]; + }; -_text = format ["%1
- Contested range max: %2",_text, GVAR(contested_radius_max)]; -_text = format ["%1
-%2",_text, "STR_Tun_MSP_CBA_tooltip_contested_max" call BIS_fnc_localize]; + if (GVAR(allowCheckTicketsMSP)) then { + _text = format ["%1
You can check remaining tickets from MSP (using ace actions).",_text]; + }; -_text = format ["%1
- Contested range min: %2",_text, GVAR(contested_radius_min)]; -_text = format ["%1
-%2",_text, "STR_Tun_MSP_CBA_tooltip_contested_min" call BIS_fnc_localize]; + _text = format [localize "STR_tunres_Respawn_Briefing_ContestedCheck",_text, GVAR(contested_check_interval), GVAR(contested_radius_max), GVAR(contested_radius_min)]; + _text = format [localize "STR_tunres_Respawn_Briefing_MspVehicle",_text, getText (configFile >> "CfgVehicles" >> _vehicle >> "displayName")]; +} else { + _text = format ["%1
%2",_text, localize "STR_tunres_Respawn_Briefing_MspDisabled"]; +}; _text = format ["%1

Powered By TuntematonEngine v%2.%3.%4", _text, MAJOR, MINOR, PATCHLVL]; -player createDiaryRecord ["Diary",["Respawn info",_text]]; -player createDiarySubject ["Respawn info","Tun - Respawn info"]; -player createDiaryRecord ["Respawn info",["Tun - Respawn info",_text]]; \ No newline at end of file +//player createDiaryRecord ["Diary",["Respawn info",_text]]; +if !(player diarySubjectExists "Respawn info") then { + player createDiarySubject ["Respawn info","Tun - Respawn info"]; +}; +player createDiaryRecord ["Respawn info",["Tun - MSP info", _text]]; \ No newline at end of file diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index fe7005c..b80bdf4 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * @@ -8,7 +8,7 @@ * None * * Example: - * [] call Tun_MSP_fnc_contestedCheck + * [] call tunres_MSP_fnc_contestedCheck */ // private _result = diag_codePerformance [{ #include "script_component.hpp" @@ -64,10 +64,10 @@ private _allunits = allUnits select {(side _x) in [west,east,resistance,civilian if (count _whoToNotify > 0 ) then { if (_isContested) then { [_side, false] call EFUNC(respawn,update_respawn_point); - (call compile ("STR_Tun_MSP_FNC_Contested_hint" call BIS_fnc_localize)) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; + (call compile ("STR_tunres_MSP_FNC_Contested_hint" call BIS_fnc_localize)) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; } else { [_side, true, (getPos _msp) ] call EFUNC(respawn,update_respawn_point); - (call compile ("STR_Tun_MSP_FNC_secured_hint" call BIS_fnc_localize)) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; + (call compile ("STR_tunres_MSP_FNC_secured_hint" call BIS_fnc_localize)) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; }; }; }; diff --git a/addons/msp/functions/fnc_create_msp_props.sqf b/addons/msp/functions/fnc_create_msp_props.sqf index a6ae522..10808a6 100644 --- a/addons/msp/functions/fnc_create_msp_props.sqf +++ b/addons/msp/functions/fnc_create_msp_props.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Create props around MSP. This is placeholder for now. @@ -10,7 +10,7 @@ * None * * Example: - * [_msp] call Tun_MSP_fnc_create_msp_props + * [_msp] call tunres_MSP_fnc_create_msp_props */ #include "script_component.hpp" diff --git a/addons/msp/functions/fnc_init_contested.sqf b/addons/msp/functions/fnc_init_contested.sqf index 6b83b6e..6de60a2 100644 --- a/addons/msp/functions/fnc_init_contested.sqf +++ b/addons/msp/functions/fnc_init_contested.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Notify if ther is enemies inside max radius @@ -12,7 +12,7 @@ * None * * Example: - * [] call Tun_MSP_fnc_init_contested + * [] call tunres_MSP_fnc_init_contested */ #include "script_component.hpp" @@ -34,7 +34,7 @@ if (_enemyCount > 0 && !_isContested) then { private _whoToNotify = [_side] call FUNC(whoToNotify); if (count _whoToNotify > 0 ) then { - ("STR_Tun_MSP_FNC_enemies_near" call BIS_fnc_localize) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; + ("STR_tunres_MSP_FNC_enemies_near" call BIS_fnc_localize) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; }; }; }; diff --git a/addons/msp/functions/fnc_initate_msp_action.sqf b/addons/msp/functions/fnc_initate_msp_action.sqf index acae23d..8897500 100644 --- a/addons/msp/functions/fnc_initate_msp_action.sqf +++ b/addons/msp/functions/fnc_initate_msp_action.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Initate ace action from MSP. Either to setup or pack it. @@ -11,7 +11,7 @@ * None * * Example: - * [msp, true] call Tun_MSP_fnc_initate_msp_action + * [msp, true] call tunres_MSP_fnc_initate_msp_action */ #include "script_component.hpp" @@ -21,11 +21,11 @@ private ["_text", "_time", "_conditio"]; private _statusvar = format ["%1_%2", QGVAR(status), playerSide]; if (_setup) then { - _text = "STR_Tun_MSP_fnc_initate_msp_action_setting" call BIS_fnc_localize; + _text = "STR_tunres_MSP_fnc_initate_msp_action_setting" call BIS_fnc_localize; _conditio = { !(missionNamespace getVariable (_this select 0 select 1)) }; _time = GVAR(progresbar_time_setup); } else { - _text = "STR_Tun_MSP_fnc_initate_msp_action_packing" call BIS_fnc_localize; + _text = "STR_tunres_MSP_fnc_initate_msp_action_packing" call BIS_fnc_localize; _conditio = { missionNamespace getVariable (_this select 0 select 1) }; _time = GVAR(progresbar_time_pack); }; diff --git a/addons/msp/functions/fnc_update_status.sqf b/addons/msp/functions/fnc_update_status.sqf index db636cf..e3f6709 100644 --- a/addons/msp/functions/fnc_update_status.sqf +++ b/addons/msp/functions/fnc_update_status.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * @@ -11,7 +11,7 @@ * none * * Example: - * [msp, true] call Tun_MSP_fnc_update_status + * [msp, true] call tunres_MSP_fnc_update_status */ #include "script_component.hpp" @@ -26,7 +26,7 @@ AAR_UPDATE(_msp,"Is active MSP", _setup); if (_setup) then { if (count _whoToNotify > 0 ) then { - (call compile ("STR_Tun_MSP_FNC_setup_notification" call BIS_fnc_localize)) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; + (call compile ("STR_tunres_MSP_FNC_setup_notification" call BIS_fnc_localize)) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; }; [_msp] remoteExecCall [QFUNC(create_msp_props), 2]; @@ -44,7 +44,7 @@ if (_setup) then { } else { if (count _whoToNotify > 0 ) then { - (call compile ("STR_Tun_MSP_FNC_pack_notification" call BIS_fnc_localize)) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; + (call compile ("STR_tunres_MSP_FNC_pack_notification" call BIS_fnc_localize)) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; }; //Delete props { diff --git a/addons/msp/functions/fnc_whoToNotify.sqf b/addons/msp/functions/fnc_whoToNotify.sqf index 52dd8b4..2488fe7 100644 --- a/addons/msp/functions/fnc_whoToNotify.sqf +++ b/addons/msp/functions/fnc_whoToNotify.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * @@ -9,7 +9,7 @@ * The return array who gets notification * * Example: - * [west] call Tun_MSP_fnc_whoToNotify + * [west] call tunres_MSP_fnc_whoToNotify */ #include "script_component.hpp" params [["_side", nil, [west]]]; diff --git a/addons/msp/functions/pohja.sqf b/addons/msp/functions/pohja.sqf index 160c98f..d5935f3 100644 --- a/addons/msp/functions/pohja.sqf +++ b/addons/msp/functions/pohja.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * @@ -14,7 +14,7 @@ * The return value * * Example: - * ["something", player] call Tun_MSP_fnc_imanexample + * ["something", player] call tunres_MSP_fnc_imanexample * * Public: [Yes/No] */ diff --git a/addons/msp/script_component.hpp b/addons/msp/script_component.hpp index 82796a2..3c2a33a 100644 --- a/addons/msp/script_component.hpp +++ b/addons/msp/script_component.hpp @@ -1,3 +1,15 @@ -#include "\x\tun\addons\Main\script_component.hpp" -#undef COMPONENT -#define COMPONENT msp \ No newline at end of file +#define COMPONENT msp +#define COMPONENT_BEAUTIFIED MSP +#include "\x\tunres\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +#define DISABLE_COMPILE_CACHE + +#ifdef DEBUG_ENABLED_MSP + #define DEBUG_MODE_FULL +#endif + #ifdef DEBUG_SETTINGS_MSP + #define DEBUG_SETTINGS DEBUG_SETTINGS_MSP +#endif + +#include "\x\tunres\addons\main\script_macros.hpp" diff --git a/addons/respawn/$PBOPREFIX$ b/addons/respawn/$PBOPREFIX$ new file mode 100644 index 0000000..71258ff --- /dev/null +++ b/addons/respawn/$PBOPREFIX$ @@ -0,0 +1 @@ +x\tunres\addons\respawn diff --git a/addons/respawn/CfgEventHandlers.hpp b/addons/respawn/CfgEventHandlers.hpp new file mode 100644 index 0000000..1a24e14 --- /dev/null +++ b/addons/respawn/CfgEventHandlers.hpp @@ -0,0 +1,20 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + serverInit = QUOTE(call COMPILE_FILE(XEH_preInit_server)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + clientInit = QUOTE(call COMPILE_FILE(XEH_postInit_client)); + serverInit = QUOTE(call COMPILE_FILE(XEH_postInit_server)); + }; +}; \ No newline at end of file diff --git a/addons/respawn/TP_dialog.hpp b/addons/respawn/TP_dialog.hpp index 7390357..f17fff4 100644 --- a/addons/respawn/TP_dialog.hpp +++ b/addons/respawn/TP_dialog.hpp @@ -32,7 +32,7 @@ class TP_Dialog class ControlsBackground { - class tun_respawn_tp_background + class tunres_respawn_tp_background { type = 0; idc = -1; @@ -51,31 +51,31 @@ class TP_Dialog }; class Controls { - class tun_respawn_tp_list : RscListBox + class tunres_respawn_tp_list : RscListBox { idc = 300001; x = safeZoneX + safeZoneW * 0.325; y = safeZoneY + safeZoneH * 0.275; w = safeZoneW * 0.175; h = safeZoneH * 0.425; - onLBSelChanged = "params ['_control', '_selectedIndex']; [_control, _selectedIndex] call Tun_Respawn_fnc_teleportOnLBSelChanged"; + onLBSelChanged = "params ['_control', '_selectedIndex']; [_control, _selectedIndex] call tunres_Respawn_fnc_teleportOnLBSelChanged"; }; - class tun_respawn_tp_button : RscButton + class tunres_respawn_tp_button : RscButton { idc = 300002; x = safeZoneX + safeZoneW * 0.625; y = safeZoneY + safeZoneH * 0.67592593; w = safeZoneW * 0.05; h = safeZoneH * 0.05; - text = "$STR_Tun_Respawn_tp_dialog_button"; - action = "[] call Tun_Respawn_fnc_teleportButton"; + text = "$STR_tunres_Respawn_tp_dialog_button"; + action = "[] call tunres_Respawn_fnc_teleportButton"; SizeEx = GUI_TEXT_SIZE_SMALL; colorBackground[] = GUI_USER_COLORBACKGROUND; colorFocused[] = GUI_USER_COLORBACKGROUND; colorFocused2[] = GUI_USER_COLORBACKGROUND; }; - class tun_respawn_tp_header : RscText + class tunres_respawn_tp_header : RscText { idc = -1; x = safeZoneX + safeZoneW * 0.50520834; @@ -83,7 +83,7 @@ class TP_Dialog w = safeZoneW * 0.1796875; h = safeZoneH * 0.08611112; style = 2; - text = "$STR_Tun_Respawn_tp_dialog_header"; + text = "$STR_tunres_Respawn_tp_dialog_header"; colorBackground[] = GUI_USER_COLORBACKGROUND; colorText[] = {1,1,1,1}; font = "TahomaB"; @@ -91,7 +91,7 @@ class TP_Dialog shadow = 2; }; - class tun_respawn_tp_minimap : RscMapControl + class tunres_respawn_tp_minimap : RscMapControl { idc = 300003; x = safeZoneX + safeZoneW * 0.51875; diff --git a/addons/respawn/XEH_prep.sqf b/addons/respawn/XEH_PREP.hpp similarity index 96% rename from addons/respawn/XEH_prep.sqf rename to addons/respawn/XEH_PREP.hpp index 9b081d8..12bf03c 100644 --- a/addons/respawn/XEH_prep.sqf +++ b/addons/respawn/XEH_PREP.hpp @@ -1,39 +1,37 @@ -#include "script_component.hpp" - +PREP(addActionsPlayer); +PREP(addCheckTicketCountAction); +PREP(addCustomTeleporter); PREP(addGear); +PREP(addMainAction); +PREP(addTeleportAction); PREP(blackscreen); +PREP(checkTicketCount); +PREP(createLocalMarker); PREP(delayed_respawn); PREP(force_Respawn); +PREP(getOffSet); +PREP(getParentAction); +PREP(getTicketCountPlayer); PREP(killed); PREP(killJIP); PREP(marker_update); PREP(module_respawnpos); +PREP(module_teleporter); PREP(module_waitingarea); PREP(moveRespawns); +PREP(openTeleportMenu); +PREP(radioSettings_tfar); PREP(removegear); PREP(savegear); PREP(startSpectator); -PREP(ticketCounterSide); -PREP(timer); -PREP(waitingArea); -PREP(update_respawn_point); PREP(teleport); -PREP(radioSettings_tfar); -PREP(module_teleporter); -PREP(openTeleportMenu); PREP(teleportButton); PREP(teleportOnLBSelChanged); -PREP(addCustomTeleporter); -PREP(addTeleportAction); -PREP(checkTicketCount); -PREP(addCheckTicketCountAction); -PREP(updateWaitingRespawnList); PREP(ticketCounterPlayer); -PREP(getTicketCountPlayer); +PREP(ticketCounterSide); +PREP(timer); +PREP(update_respawn_point); PREP(updatePlayerTicketCount); -PREP(createLocalMarker); -PREP(getParentAction); -PREP(getOffSet); -PREP(addMainAction); -PREP(addActionsPlayer); - +PREP(updateWaitingRespawnList); +PREP(waitingArea); +PREP(briefingNotes); \ No newline at end of file diff --git a/addons/respawn/XEH_postInit.sqf b/addons/respawn/XEH_postInit.sqf index 51b1241..4c4489e 100644 --- a/addons/respawn/XEH_postInit.sqf +++ b/addons/respawn/XEH_postInit.sqf @@ -1,125 +1,3 @@ #include "script_component.hpp" if !(GVAR(enable)) exitWith { INFO("TUN Respawn Disabled"); }; -INFO("TUN Respawn Enabled"); - - -if (hasInterface && playerSide isNotEqualTo sideLogic) then { - [{!isNull player }, { - - if (GVAR(gearscriptType) isEqualTo "Save gear") then { - [] call FUNC(savegear); - }; - - private _conditio = { - private _return = false; - - { - private _obj = _x; - if (player distance2D _obj < 15) then { - private _menuOpenConditio = _obj getVariable QGVAR(teleportConditio); - if (call compile _menuOpenConditio) then { - _return = true; - GVAR(selfTPmenuOpenObj) = _obj; - break; - }; - }; - } forEach GVAR(teleportPoints); - _return - }; - - private _action = ["TpMenu","STR_Tun_Respawn_TeleportMenu" call BIS_fnc_localize,"\a3\3den\data\cfg3den\history\changeattributes_ca.paa",{ [GVAR(selfTPmenuOpenObj)] call FUNC(openTeleportMenu) }, _conditio] call ace_interact_menu_fnc_createAction; - [(typeOf player), 1, ["ACE_SelfActions"], _action] call ace_interact_menu_fnc_addActionToClass; - - //Add respawn eh - [player, "Respawn", { - [] call FUNC(removegear); - player setVariable [QGVAR(waiting_respawn), true, true]; - [] call FUNC(waitingArea); - }] call CBA_fnc_addBISEventHandler; - - // Add killed EH - [player, "killed", { - [] call FUNC(killed); - }] call CBA_fnc_addBISEventHandler; - }] call CBA_fnc_waitUntilAndExecute; - - addMissionEventHandler ["Map", { - params ["_mapIsOpened", "_mapIsForced"]; - [] call FUNC(marker_update); - }]; - - [] call FUNC(killJIP); - [] call FUNC(marker_update); - [] call FUNC(radioSettings_tfar); -}; - -if (isServer) then { - - if (GVAR(respawn_type) isEqualTo localize "STR_Tun_Respawn_Type_Playertickets") then { - GVAR(PlayerTicektsHash) = createHashMap; - GVAR(tickets_west), GVAR(tickets_east), GVAR(tickets_guer), GVAR(tickets_civ); - AAR_UPDATE("west","Player tickets", GVAR(tickets_west)); - AAR_UPDATE("east","Player tickets", GVAR(tickets_east)); - AAR_UPDATE("guer","Player tickets", GVAR(tickets_guer)); - AAR_UPDATE("civ","Player tickets", GVAR(tickets_civ)); - }; - - if (GVAR(respawn_type) isNotEqualTo localize "STR_Tun_Respawn_Type_Default") then { - // if player disconnect add its uid to list so when he come back. No ticket is used. Only used if Kill jip is enabled - addMissionEventHandler ["PlayerDisconnected", { - if (GVAR(respawn_type) isEqualTo "default") exitWith { }; - params ["_id", "_uid", "_name", "_jip", "_owner"]; - - if (cba_missiontime > (GVAR(killJIP_time) * 60) && GVAR(killJIP)) then { - GVAR(disconnected_players) pushBackUnique _uid; - }; - }]; - }; - - //clean bodies during briefing && safestart - addMissionEventHandler ["HandleDisconnect", { - params ["_unit", "_id", "_uid", "_name"]; - if (cba_missiontime < (GVAR(killJIP_time) * 60) || missionNamespace getVariable [QGVAR(waiting_respawn),false]) then { - deleteVehicle _unit; - }; - false; - }]; - - //AAR times - if ( !isnil "afi_aar2" ) then { - [{cba_missiontime > 10}, { - if (GVAR(respawn_type) isEqualTo localize "STR_Tun_Respawn_Type_Sidetickets") then { - AAR_UPDATE("west","Side tickets", GVAR(tickets_west)); - AAR_UPDATE("east","Side tickets", GVAR(tickets_east)); - AAR_UPDATE("guer","Side tickets", GVAR(tickets_guer)); - AAR_UPDATE("civ","Side tickets", GVAR(tickets_civ)); - }; - - if (missionNamespace getVariable ["afi_aar2", false]) then { - [{ - - if (GVAR(enabled_west)) then { - _time = round (GVAR(wait_time_west) - cba_missiontime); - AAR_UPDATE("west","Next respawn wave", _time); - }; - - if (GVAR(enabled_east)) then { - _time = round (GVAR(wait_time_east) - cba_missiontime); - AAR_UPDATE("east","Next respawn wave", _time); - }; - - if (GVAR(enabled_guer)) then { - _time = round (GVAR(wait_time_guer) - cba_missiontime); - AAR_UPDATE("guer","Next respawn wave", _time); - }; - - if (GVAR(enabled_civ)) then { - _time = round (GVAR(wait_time_civ) - cba_missiontime); - AAR_UPDATE("civ","Next respawn wave", _time); - }; - - }, 10] call CBA_fnc_addPerFrameHandler; - }; - }] call CBA_fnc_waitUntilAndExecute; - }; -}; \ No newline at end of file +INFO("TUN Respawn Enabled"); \ No newline at end of file diff --git a/addons/respawn/XEH_postInit_client.sqf b/addons/respawn/XEH_postInit_client.sqf new file mode 100644 index 0000000..9d88348 --- /dev/null +++ b/addons/respawn/XEH_postInit_client.sqf @@ -0,0 +1,57 @@ +#include "script_component.hpp" + +[{!isNull player && +ADDON +}, { + [] call FUNC(briefingNotes); +}] call CBA_fnc_waitUntilAndExecute; + +if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (IE zeus) + +[{!isNull player }, { + + if (GVAR(gearscriptType) isEqualTo "Save gear") then { + [] call FUNC(savegear); + }; + + private _conditio = { + private _return = false; + + { + private _obj = _x; + if (player distance2D _obj < 15) then { + private _menuOpenConditio = _obj getVariable QGVAR(teleportConditio); + if (call compile _menuOpenConditio) then { + _return = true; + GVAR(selfTPmenuOpenObj) = _obj; + break; + }; + }; + } forEach GVAR(teleportPoints); + _return + }; + + private _action = ["TpMenu","STR_tunres_Respawn_TeleportMenu" call BIS_fnc_localize,"\a3\3den\data\cfg3den\history\changeattributes_ca.paa",{ [GVAR(selfTPmenuOpenObj)] call FUNC(openTeleportMenu) }, _conditio] call ace_interact_menu_fnc_createAction; + [(typeOf player), 1, ["ACE_SelfActions"], _action] call ace_interact_menu_fnc_addActionToClass; + + //Add respawn eh + [player, "Respawn", { + [] call FUNC(removegear); + player setVariable [QGVAR(waiting_respawn), true, true]; + [] call FUNC(waitingArea); + }] call CBA_fnc_addBISEventHandler; + + // Add killed EH + [player, "killed", { + [] call FUNC(killed); + }] call CBA_fnc_addBISEventHandler; +}] call CBA_fnc_waitUntilAndExecute; + +addMissionEventHandler ["Map", { + params ["_mapIsOpened", "_mapIsForced"]; + [] call FUNC(marker_update); +}]; + +[] call FUNC(killJIP); +[] call FUNC(marker_update); +[] call FUNC(radioSettings_tfar); diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf new file mode 100644 index 0000000..e53e2c8 --- /dev/null +++ b/addons/respawn/XEH_postInit_server.sqf @@ -0,0 +1,72 @@ +#include "script_component.hpp" + +if (isServer) then { + + if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Playertickets") then { + GVAR(PlayerTicektsHash) = createHashMap; + GVAR(tickets_west), GVAR(tickets_east), GVAR(tickets_guer), GVAR(tickets_civ); + AAR_UPDATE("west","Player tickets", GVAR(tickets_west)); + AAR_UPDATE("east","Player tickets", GVAR(tickets_east)); + AAR_UPDATE("guer","Player tickets", GVAR(tickets_guer)); + AAR_UPDATE("civ","Player tickets", GVAR(tickets_civ)); + }; + + if (GVAR(respawn_type) isNotEqualTo localize "STR_tunres_Respawn_Type_Default") then { + // if player disconnect add its uid to list so when he come back. No ticket is used. Only used if Kill jip is enabled + addMissionEventHandler ["PlayerDisconnected", { + if (GVAR(respawn_type) isEqualTo "default") exitWith { }; + params ["_id", "_uid", "_name", "_jip", "_owner"]; + + if (cba_missiontime > (GVAR(killJIP_time) * 60) && GVAR(killJIP)) then { + GVAR(disconnected_players) pushBackUnique _uid; + }; + }]; + }; + + //clean bodies during briefing && safestart + addMissionEventHandler ["HandleDisconnect", { + params ["_unit", "_id", "_uid", "_name"]; + if (cba_missiontime < (GVAR(killJIP_time) * 60) || _unit getVariable [QGVAR(waiting_respawn),false]) then { + deleteVehicle _unit; + }; + false; + }]; + + //AAR times + if ( !isnil "afi_aar2" ) then { + [{cba_missiontime > 10}, { + if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Sidetickets") then { + AAR_UPDATE("west","Side tickets", GVAR(tickets_west)); + AAR_UPDATE("east","Side tickets", GVAR(tickets_east)); + AAR_UPDATE("guer","Side tickets", GVAR(tickets_guer)); + AAR_UPDATE("civ","Side tickets", GVAR(tickets_civ)); + }; + + if (missionNamespace getVariable ["afi_aar2", false]) then { + [{ + + if (GVAR(enabled_west)) then { + _time = round (GVAR(wait_time_west) - cba_missiontime); + AAR_UPDATE("west","Next respawn wave", _time); + }; + + if (GVAR(enabled_east)) then { + _time = round (GVAR(wait_time_east) - cba_missiontime); + AAR_UPDATE("east","Next respawn wave", _time); + }; + + if (GVAR(enabled_guer)) then { + _time = round (GVAR(wait_time_guer) - cba_missiontime); + AAR_UPDATE("guer","Next respawn wave", _time); + }; + + if (GVAR(enabled_civ)) then { + _time = round (GVAR(wait_time_civ) - cba_missiontime); + AAR_UPDATE("civ","Next respawn wave", _time); + }; + + }, 10] call CBA_fnc_addPerFrameHandler; + }; + }] call CBA_fnc_waitUntilAndExecute; + }; +}; \ No newline at end of file diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index 7b042f0..7acdca1 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -1,5 +1,9 @@ #include "script_component.hpp" -#include "XEH_prep.sqf" +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; //Remaining time for wave. ISNILS(GVAR(wait_time_west),0); @@ -42,6 +46,316 @@ ISNILS(GVAR(endRespawns),false); GVAR(selfTPmenuOpenObj) = objNull; -if (isServer) then { - GVAR(respawnPointsHash) = createHashMap -}; \ No newline at end of file +[ + QGVAR(enable), // Unique setting name. Matches resulting variable name + "CHECKBOX", // Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" + ["STR_tunres_Respawn_CBA_Enable" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_tooltip_Enable" call BIS_fnc_localize], // Display name or display name + tooltip (optional, default: same as setting name) + "STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, // Category for the settings menu + optional sub-category + false, // Extra properties of the setting depending of _settingType. + 1, // 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) + {}, // Script to execute when setting is changed. (optional) + true //Setting will be marked as needing mission restart after being changed. (optional, default false) +] call CBA_Settings_fnc_init; + +[ + QGVAR(killJIP), + "CHECKBOX", + ["Kill JIP", "STR_tunres_Respawn_CBA_tooltip_killjip" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_generic" call BIS_fnc_localize], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(killJIP_time), + "SLIDER", + ["Kill JIP Time", "STR_tunres_Respawn_CBA_tooltip_killjip_time" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_generic" call BIS_fnc_localize], + [1, 300, 20, 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(respawn_type), + "LIST", + ["Respawn Type", "STR_tunres_Respawn_CBA_tooltip_respawntypes" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_generic" call BIS_fnc_localize], + [[localize "STR_tunres_Respawn_Type_Default", localize "STR_tunres_Respawn_Type_Sidetickets", localize "STR_tunres_Respawn_Type_Playertickets"], [localize "STR_tunres_Respawn_Type_Default", localize "STR_tunres_Respawn_Type_Sidetickets", localize "STR_tunres_Respawn_Type_Playertickets"], 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(gearscriptType), + "LIST", + ["Gearscript type", "STR_tunres_Respawn_CBA_tooltip_gearscript" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_generic" call BIS_fnc_localize], + [["SQF Gearscript", "Potato Tool", "Save gear"], ["SQF Gearscript", "Potato Tool", "Save gear"], 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(forced_respawn), + "CHECKBOX", + ["Only Forced Waves", "STR_tunres_Respawn_CBA_tooltip_forceRespawn" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_generic" call BIS_fnc_localize], + false, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(delayed_respawn), + "SLIDER", + ["Delayed respawn", "STR_tunres_Respawn_CBA_tooltip_delayed_respawn" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_generic" call BIS_fnc_localize], + [0, 100, 0, 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(waiting_area_range), + "SLIDER", + ["Waiting Area Range", "STR_tunres_Respawn_CBA_tooltip_waiting_area_range" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_generic" call BIS_fnc_localize], + [30, 300, 100, 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +//Wave times +[ + QGVAR(time_west), + "SLIDER", + ["West", "STR_tunres_Respawn_CBA_tooltip_time" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_time" call BIS_fnc_localize], + [1, 60, 15, 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(time_east), + "SLIDER", + ["East", "STR_tunres_Respawn_CBA_tooltip_time" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_time" call BIS_fnc_localize], + [1, 60, 15, 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(time_guer), + "SLIDER", + ["Resistance", "STR_tunres_Respawn_CBA_tooltip_time" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_time" call BIS_fnc_localize], + [1, 60, 15, 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(time_civ), + "SLIDER", + ["Civilian", "STR_tunres_Respawn_CBA_tooltip_time" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_time" call BIS_fnc_localize], + [1, 60, 15, 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +//Spectator camera modes +[ + QGVAR(spectate_Cameramode_1st), + "CHECKBOX", + ["1st", "STR_tunres_Respawn_CBA_tooltip_specta_modes" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_spectate_cameramode" call BIS_fnc_localize], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(spectate_Cameramode_3th), + "CHECKBOX", + ["3th", "STR_tunres_Respawn_CBA_tooltip_specta_modes" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_spectate_cameramode" call BIS_fnc_localize], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(spectate_Cameramode_free), + "CHECKBOX", + ["Free", "STR_tunres_Respawn_CBA_tooltip_specta_modes" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_spectate_cameramode" call BIS_fnc_localize], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +//Ticket count +[ + QGVAR(tickets_west), + "SLIDER", + ["West", "STR_tunres_Respawn_CBA_tooltip_ticket" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_ticketcount" call BIS_fnc_localize], + [0, 1000, 0, 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(tickets_east), + "SLIDER", + ["East", "STR_tunres_Respawn_CBA_tooltip_ticket" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_ticketcount" call BIS_fnc_localize], + [0, 1000, 0, 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(tickets_guer), + "SLIDER", + ["Resistance", "STR_tunres_Respawn_CBA_tooltip_ticket" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_ticketcount" call BIS_fnc_localize], + [0, 1000, 0, 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(tickets_civ), + "SLIDER", + ["Civilian", "STR_tunres_Respawn_CBA_tooltip_ticket" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_ticketcount" call BIS_fnc_localize], + [0, 1000, 0, 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(allowCheckTicketsBase), + "CHECKBOX", + ["Main base", "STR_tunres_Respawn_CBA_tooltip_CheckTickets" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_checkTickets" call BIS_fnc_localize], + false, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +//Briefing notes +[ + QGVAR(briefingEnable), + "CHECKBOX", + ["STR_tunres_Respawn_CBA_Briefing_Enable" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Briefing_Enable_tooltip" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(briefingEnableShowRespawnType), + "CHECKBOX", + ["STR_tunres_Respawn_CBA_Briefing_Enable_ShowRespawType" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Briefing_Enable_ShowRespawType_tooltip" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(briefingEnableShowTickets), + "CHECKBOX", + ["STR_tunres_Respawn_CBA_Briefing_Enable_ShowTickets" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTickets_tooltip" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(briefingEnableShowTime), + "CHECKBOX", + ["STR_tunres_Respawn_CBA_Briefing_Enable_ShowTime" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTime_tooltip" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(briefingEnableShowOtherSidesDataWest), + "CHECKBOX", + ["STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_West" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(briefingEnableShowOtherSidesDataEast), + "CHECKBOX", + ["STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_East" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(briefingEnableShowOtherSidesDataResistance), + "CHECKBOX", + ["STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_Resistance" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(briefingEnableShowOtherSidesDataCivilian), + "CHECKBOX", + ["STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_Civilian" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip" call BIS_fnc_localize], + ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], + false, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +ADDON = true; diff --git a/addons/respawn/XEH_preInit_server.sqf b/addons/respawn/XEH_preInit_server.sqf new file mode 100644 index 0000000..f8a3298 --- /dev/null +++ b/addons/respawn/XEH_preInit_server.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +GVAR(respawnPointsHash) = createHashMap; \ No newline at end of file diff --git a/addons/respawn/XEH_preStart.sqf b/addons/respawn/XEH_preStart.sqf index 0825483..a51262a 100644 --- a/addons/respawn/XEH_preStart.sqf +++ b/addons/respawn/XEH_preStart.sqf @@ -1 +1,2 @@ -#include "XEH_prep.sqf" \ No newline at end of file +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/addons/respawn/config.cpp b/addons/respawn/config.cpp index 2b2635d..16a7feb 100644 --- a/addons/respawn/config.cpp +++ b/addons/respawn/config.cpp @@ -1,48 +1,30 @@ #include "script_component.hpp" -#include "TP_dialog.hpp" -class CfgPatches -{ - class Tun_Respawn - { - units[] = {"Tun_Respawn_Module_waitingarea", "Tun_Respawn_Module_Respawn_point"}; +// information on this addon specifically +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {QGVAR(Module_waitingarea), QGVAR(Module_Respawn_point), QGVAR(tunres_Respawn_Module_teleportPoint)}; weapons[] = {}; - requiredVersion = 1.94; - requiredAddons[] = {"A3_Modules_F","3DEN","cba_main","cba_xeh","Tun_Main","ace_interaction","ace_interact_menu"}; - author = "Tuntematon"; - authorUrl = "https://armafinland.fi/"; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"tunres_main","A3_Modules_F","3DEN","cba_main","cba_xeh","ace_interaction","ace_interact_menu"}; + authors[] = {"Tuntematon"}; // sub array of authors, considered for the specific addon, can be removed or left empty {} + VERSION_CONFIG; }; }; +// configs go here +#include "CfgEventHandlers.hpp" + class CfgFactionClasses { class NO_CATEGORY; - class Tun_Respawn : NO_CATEGORY + class tunres_Respawn : NO_CATEGORY { - displayName = $STR_Tun_Respawn_Module_category; - }; -}; - - -class Extended_PostInit_EventHandlers { - class Tun_Respawn { - init = QUOTE(call COMPILE_FILE(XEH_postInit)); + displayName = "$STR_tunres_Respawn_Module_category"; }; }; -class Extended_PreInit_EventHandlers { - class Tun_Respawn { - init = QUOTE( call COMPILE_FILE(XEH_preInit) ); - }; -}; - -class Extended_PreStart_EventHandlers { - class Tun_Respawn { - init = QUOTE( call COMPILE_FILE(XEH_preStart) ); - }; -}; - - class CfgVehicles { class Logic; @@ -64,13 +46,14 @@ class CfgVehicles class AnyBrain; }; }; - class Tun_Respawn_Module_waitingarea: Module_F + + class GVAR(Module_waitingarea): Module_F { scope = 2; // Editor visibility; 2 will show it in the menu, 1 will hide it. scopeCurator = 1; - displayName = $STR_Tun_Respawn_Module_DisplayName_WaitingArea; // Name displayed in the menu + displayName = "$STR_tunres_Respawn_Module_DisplayName_WaitingArea"; // Name displayed in the menu icon = "\a3\modules_f_curator\data\portraitcountdown_ca.paa"; // Map icon. Delete this entry to use the default icon - category = "Tun_Respawn"; + category = "tunres_Respawn"; // Name of function triggered once conditions are met function = QFUNC(module_waitingarea); @@ -90,9 +73,9 @@ class CfgVehicles { class respawn_side: Combo { - property = "Tun_respawn_module_waiting_area_side"; + property = QGVAR(module_waiting_area_side); displayName = "Side"; // Argument label - tooltip = $STR_Tun_Respawn_Module_tooltip_WaitingArea; // Tooltip description + tooltip = "$STR_tunres_Respawn_Module_tooltip_WaitingArea"; // Tooltip description typeName = "STRING"; // Value type, can be "NUMBER", "STRING" or "BOOL" defaultValue = "0"; // Default attribute value. WARNING: This is an expression, and its returned value will be used (50 in this case) class Values @@ -108,14 +91,14 @@ class CfgVehicles }; class ModuleDescription: ModuleDescription { - description = $STR_Tun_Respawn_Module_Description_Waitingarea; // Short description, will be formatted as structured text + description = "$STR_tunres_Respawn_Module_Description_Waitingarea"; // Short description, will be formatted as structured text sync[] = {}; // Array of synced entities (can contain base classes) }; }; - class Tun_Respawn_Module_Respawn_point: Tun_Respawn_Module_waitingarea + class GVAR(Module_Respawn_point): GVAR(Module_waitingarea) { - displayName = $STR_Tun_Respawn_Module_DisplayName_SpawnPoint; // Name displayed in the menu + displayName = "$STR_tunres_Respawn_Module_DisplayName_SpawnPoint"; // Name displayed in the menu icon = "\a3\modules_f\data\portraitrespawn_ca.paa"; // Name of function triggered once conditions are met function = QFUNC(module_respawnpos); @@ -124,32 +107,32 @@ class CfgVehicles { class respawn_side: Combo { - property = "Tun_respawn_module_respawn_point_side"; + property = QGVAR(module_respawn_point_side); displayName = "Side"; // Argument label - tooltip = $STR_Tun_Respawn_Module_tooltip_SpawnPoint; // Tooltip description + tooltip = "$STR_tunres_Respawn_Module_tooltip_SpawnPoint"; // Tooltip description typeName = "STRING"; // Value type, can be "NUMBER", "STRING" or "BOOL" defaultValue = "0"; // Default attribute value. WARNING: This is an expression, and its returned value will be used (50 in this case) class Values { class none {name = "none"; value = "none";}; // Listbox item - class west {name = "west"; value = "tun_respawn_west";}; - class east {name = "east"; value = "tun_respawn_east";}; - class resistance {name = "resistance"; value = "tun_respawn_guerrila";}; - class civilian {name = "civilian"; value = "tun_respawn_civilian";}; + class west {name = "west"; value = "tunres_respawn_west";}; + class east {name = "east"; value = "tunres_respawn_east";}; + class resistance {name = "resistance"; value = "tunres_respawn_guerrila";}; + class civilian {name = "civilian"; value = "tunres_respawn_civilian";}; }; }; class ModuleDescription: ModuleDescription{}; }; class ModuleDescription: ModuleDescription { - description = $STR_Tun_Respawn_Module_Description_Spawn_Point; // Short description, will be formatted as structured text + description = "$STR_tunres_Respawn_Module_Description_Spawn_Point"; // Short description, will be formatted as structured text sync[] = {}; // Array of synced entities (can contain base classes) }; }; - class Tun_Respawn_Module_teleportPoint: Tun_Respawn_Module_waitingarea + class GVAR(tunres_Respawn_Module_teleportPoint): GVAR(Module_waitingarea) { - displayName = $STR_Tun_Respawn_Module_DisplayName_teleportPoint; // Name displayed in the menu + displayName = "$STR_tunres_Respawn_Module_DisplayName_teleportPoint"; // Name displayed in the menu // 0 for server only execution, 1 for global execution, 2 for persistent global execution isGlobal = 2; // 1 for module waiting until all synced triggers are activated @@ -161,110 +144,110 @@ class CfgVehicles class Attributes: AttributesBase { - class tun_respawn_teleportPointOBJ: Edit + class GVAR(teleportPointOBJ): Edit { - property = "tun_respawn_teleportPointOBJ"; + property = QGVAR(teleportPointOBJ); displayName = "Teleport point object"; - tooltip = $STR_Tun_Respawn_Module_tooltip_teleportPointOBJ; + tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportPointOBJ"; typeName = "STRING"; // Default text filled in the input box // Because it is an expression, to return a String one must have a string within a string defaultValue = """Land_Sleeping_bag_blue_folded_F"""; }; - class tun_respawn_teleportConditio: Edit + class GVAR(teleportConditio): Edit { - property = "tun_respawn_teleportConditio"; + property = QGVAR(teleportConditio); displayName = "Teleport conditio"; - tooltip = $STR_Tun_Respawn_Module_tooltip_teleportConditio; + tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportConditio"; typeName = "STRING"; // Default text filled in the input box // Because it is an expression, to return a String one must have a string within a string defaultValue = "true"; }; - class tun_respawn_teleportName: Edit + class GVAR(teleportName): Edit { - property = "tun_respawn_teleportName"; + property = QGVAR(teleportName); displayName = "Teleport name"; - tooltip = $STR_Tun_Respawn_Module_tooltip_teleportName; + tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportName"; typeName = "STRING"; // Default text filled in the input box // Because it is an expression, to return a String one must have a string within a string defaultValue = """Name"""; }; - class tun_respawn_teleportCreateMarker: Checkbox + class GVAR(teleportCreateMarker): Checkbox { - property = "tun_respawn_teleportCreateMarker"; + property = QGVAR(teleportCreateMarker); displayName = "Create Marker"; typeName = "BOOL"; - tooltip = $STR_Tun_Respawn_Module_tooltip_teleportCreateMarker; + tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportCreateMarker"; defaultValue = "true"; }; - class tun_respawn_teleportMarkerIcon: Edit + class GVAR(teleportMarkerIcone): Edit { - property = "tun_respawn_teleportMarkerIcone"; + property = QGVAR(teleportMarkerIcone); displayName = "Marker Icon"; - tooltip = $STR_Tun_Respawn_Module_tooltip_teleportMarkerIcone; + tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportMarkerIcone"; typeName = "STRING"; // Default text filled in the input box // Because it is an expression, to return a String one must have a string within a string defaultValue = """hd_start"""; }; - class tun_respawn_teleportMenuOpenConditio: Edit + class GVAR(teleportMenuOpenConditio): Edit { - property = "tun_respawn_teleportMenuOpenConditio"; + property = QGVAR(teleportMenuOpenConditio); displayName = "Menu open conditio"; typeName = "STRING"; - tooltip = $STR_Tun_Respawn_Module_tooltip_teleportMenuOpenConditio; + tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportMenuOpenConditio"; defaultValue = """true"""; }; - class tun_respawn_teleportUseAceAction: Checkbox + class GVAR(teleportUseAceAction): Checkbox { - property = "tun_respawn_teleportUseAceAction"; + property = QGVAR(teleportUseAceAction); displayName = "Use Ace Actions"; typeName = "BOOL"; - tooltip = $STR_Tun_Respawn_Module_tooltip_teleportUseAceAction; + tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportUseAceAction"; defaultValue = "true"; }; - class tun_respawn_teleportCheckTickets: Checkbox + class GVAR(teleportCheckTickets): Checkbox { - property = "tun_respawn_teleportCheckTickets"; + property = QGVAR(teleportCheckTickets); displayName = "Allow Check Tickets"; typeName = "BOOL"; - //tooltip = $STR_Tun_Respawn_Module_tooltip_teleportCreateMarker; + //tooltip = $STR_tunres_Respawn_Module_tooltip_teleportCreateMarker; defaultValue = "true"; }; - class tun_respawn_teleportEnableWest: Checkbox + class GVAR(teleportEnableWest): Checkbox { - property = "tun_respawn_teleportEnableWest"; + property = QGVAR(teleportEnableWest); displayName = "Enable West"; typeName = "BOOL"; - tooltip = $STR_Tun_Respawn_Module_tooltip_teleportEnableSides; + tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportEnableSides"; defaultValue = "false"; }; - class tun_respawn_teleportEnableEast: GVAR(teleportEnableWest) + class GVAR(teleportEnableEast): GVAR(teleportEnableWest) { - property = "tun_respawn_teleportEnableEast"; + property = QGVAR(teleportEnableEast); displayName = "Enable East"; }; - class tun_respawn_teleportEnableResistance: GVAR(teleportEnableWest) + class GVAR(teleportEnableResistance): GVAR(teleportEnableWest) { - property = "tun_respawn_teleportEnableResistance"; + property = QGVAR(teleportEnableResistance); displayName = "Enable Resistance"; }; - class tun_respawn_teleportEnableCivilian: GVAR(teleportEnableWest) + class GVAR(teleportEnableCivilian): GVAR(teleportEnableWest) { - property = "tun_respawn_teleportEnableCivilian"; + property = QGVAR(teleportEnableCivilian); displayName = "Enable Civilian"; }; @@ -272,7 +255,7 @@ class CfgVehicles }; class ModuleDescription: ModuleDescription { - description = $STR_Tun_Respawn_Module_Description_Spawn_Point; // Short description, will be formatted as structured text + description = "$STR_tunres_Respawn_Module_Description_Spawn_Point"; // Short description, will be formatted as structured text position = 1; // Position is taken into effect direction = 0; // Direction is taken into effect optional = 1; // Synced entity is optional diff --git a/addons/respawn/eh list.txt b/addons/respawn/eh list.txt index 6fedc20..234487c 100644 --- a/addons/respawn/eh list.txt +++ b/addons/respawn/eh list.txt @@ -1,5 +1,5 @@ EH Name | locality | params -Tun_respawn_EH_gearAdded - local- unit -Tun_respawn_EH_moveRespawns - Server - side string (["west"]), units moved -Tun_respawn_EH_unitTeleported - local - unit, destination pos -Tun_respawn_EH_unitRespawned - local - unit \ No newline at end of file +tunres_respawn_EH_gearAdded - local- unit +tunres_respawn_EH_moveRespawns - Server - side string (["west"]), units moved +tunres_respawn_EH_unitTeleported - local - unit, destination pos +tunres_respawn_EH_unitRespawned - local - unit \ No newline at end of file diff --git a/addons/respawn/functions/fnc_addActionsPlayer.sqf b/addons/respawn/functions/fnc_addActionsPlayer.sqf index c6b542e..cc185e6 100644 --- a/addons/respawn/functions/fnc_addActionsPlayer.sqf +++ b/addons/respawn/functions/fnc_addActionsPlayer.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * @@ -9,7 +9,7 @@ * None * * Example: - * [flagPole] call Tun_Respawn_fnc_addActionsPlayer + * [flagPole] call tunres_Respawn_fnc_addActionsPlayer */ #include "script_component.hpp" @@ -22,8 +22,8 @@ if (GVAR(allowCheckTicketsBase)) then { }; private _timer_action = { - _wait_time = ((missionNamespace getVariable format ["Tun_Respawn_wait_time_%1", playerSide]) - cba_missiontime); - format ["STR_Tun_MSP_remaining_time" call BIS_fnc_localize, [_wait_time] call CBA_fnc_formatElapsedTime] call CBA_fnc_notify; + _wait_time = ((missionNamespace getVariable format ["tunres_Respawn_wait_time_%1", playerSide]) - cba_missiontime); + format ["STR_tunres_MSP_remaining_time" call BIS_fnc_localize, [_wait_time] call CBA_fnc_formatElapsedTime] call CBA_fnc_notify; }; //private _timer_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; @@ -31,5 +31,5 @@ private _chekTime = ["Check Respawn Time", "Check Respawn Time", "\a3\modules_f_ [_object, 0, _actionPath, _chekTime] call ace_interact_menu_fnc_addActionToObject; // Add tp action -private _conditio = "count (missionNamespace getVariable ['tun_respawn_teleportPoints', []]) > 1" ; -[_object, "true", "STR_Tun_Respawn_MainBaseText" call BIS_fnc_localize, false, nil, [playerSide], true, _conditio, false, _actionPath] call FUNC(addCustomTeleporter); \ No newline at end of file +private _conditio = "count (missionNamespace getVariable ['tunres_respawn_teleportPoints', []]) > 1" ; +[_object, "true", "STR_tunres_Respawn_MainBaseText" call BIS_fnc_localize, false, nil, [playerSide], true, _conditio, false, _actionPath] call FUNC(addCustomTeleporter); \ No newline at end of file diff --git a/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf b/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf index 10aaa00..5a269c2 100644 --- a/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf +++ b/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Add action to check how many tickets left. @@ -8,7 +8,7 @@ * 1: Use ace action (default: true) "Optional" * * Example: - * [object, true] call Tun_Respawn_fnc_addCheckTicketCountAction + * [object, true] call tunres_Respawn_fnc_addCheckTicketCountAction */ #include "script_component.hpp" if (isDedicated) exitWith { }; @@ -19,9 +19,9 @@ params [ ["_object", objNull, [objNull]], ["_parrenPath", ["ACE_MainActions"], [[]]]]; if (_useAceAction) then { - private _action = ["CheckTickets", "STR_Tun_Respawn_CheckTickets" call BIS_fnc_localize,"\a3\modules_f_curator\data\portraitmissionname_ca.paa",{ [playerSide] call FUNC(checkTicketCount); }, {true}, nil, nil, _offset] call ace_interact_menu_fnc_createAction; + private _action = ["CheckTickets", "STR_tunres_Respawn_CheckTickets" call BIS_fnc_localize,"\a3\modules_f_curator\data\portraitmissionname_ca.paa",{ [playerSide] call FUNC(checkTicketCount); }, {true}, nil, nil, _offset] call ace_interact_menu_fnc_createAction; [_object, 0, _parrenPath, _action] call ace_interact_menu_fnc_addActionToObject; } else { - _object addAction ["STR_Tun_Respawn_CheckTickets" call BIS_fnc_localize, { [playerSide] call FUNC(checkTicketCount) }, [], 10, true, true, "", "true", 10]; + _object addAction ["STR_tunres_Respawn_CheckTickets" call BIS_fnc_localize, { [playerSide] call FUNC(checkTicketCount) }, [], 10, true, true, "", "true", 10]; }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_addCustomTeleporter.sqf b/addons/respawn/functions/fnc_addCustomTeleporter.sqf index 652246f..3e9322a 100644 --- a/addons/respawn/functions/fnc_addCustomTeleporter.sqf +++ b/addons/respawn/functions/fnc_addCustomTeleporter.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * @@ -17,7 +17,7 @@ * none * * Example: - * [this, "true", "TP 1", true, "hd_start", [west, resistance], true, "true", true] call Tun_Respawn_fnc_addCustomTeleporter + * [this, "true", "TP 1", true, "hd_start", [west, resistance], true, "true", true] call tunres_Respawn_fnc_addCustomTeleporter */ if (hasInterface) then { #include "script_component.hpp" @@ -45,7 +45,7 @@ GVAR(teleportPoints) pushBackUnique _obj; if (_createMarker) then { - private _markerName = format["tun_respawn_%1",_name]; + private _markerName = format["tunres_respawn_%1",_name]; private _marker = [_markerName, getpos _obj, "ICON", [1, 1], "TYPE:", _markerIcon, "TEXT:", _name] call CBA_fnc_createMarker; _obj setVariable [QGVAR(markerName), _marker]; }; diff --git a/addons/respawn/functions/fnc_addGear.sqf b/addons/respawn/functions/fnc_addGear.sqf index 241d3bc..b9f4b64 100644 --- a/addons/respawn/functions/fnc_addGear.sqf +++ b/addons/respawn/functions/fnc_addGear.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Give player its original gear. @@ -10,7 +10,7 @@ * none * * Example: - * [] call TUN_Respawn_addGear + * [] call tunres_Respawn_addGear */ #include "script_component.hpp" if (isDedicated) exitWith { }; diff --git a/addons/respawn/functions/fnc_addMainAction.sqf b/addons/respawn/functions/fnc_addMainAction.sqf index 0e7b323..a1873ae 100644 --- a/addons/respawn/functions/fnc_addMainAction.sqf +++ b/addons/respawn/functions/fnc_addMainAction.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon & Nurmi] * [Description] * @@ -9,7 +9,7 @@ * The return value * * Example: - * [OBJECT] call Tun_Respawn_fnc_addMainAction + * [OBJECT] call tunres_Respawn_fnc_addMainAction */ #include "script_component.hpp" @@ -20,15 +20,15 @@ private _parentAction = [_object] call FUNC(getParentAction); if (count _parentAction isEqualTo 0) then { private _offSet = [_object] call FUNC(getOffSet); - _parentAction = ["Tun_respawn_BaseAceAction"]; - private _actionBase = ["Tun_respawn_BaseAceAction", "Main", "", {true}, {true}, nil, nil, _offSet, 8] call ace_interact_menu_fnc_createAction; + _parentAction = ["tunres_respawn_BaseAceAction"]; + private _actionBase = ["tunres_respawn_BaseAceAction", "Main", "", {true}, {true}, nil, nil, _offSet, 8] call ace_interact_menu_fnc_createAction; [_object, 0, [], _actionBase] call ace_interact_menu_fnc_addActionToObject; }; -private _actionPath = _parentAction + ["Tun_respawnAction"]; +private _actionPath = _parentAction + ["tunres_respawnAction"]; //Add main action -private _actionMain = ["Tun_respawnAction", "Respawn Actions", "\a3\modules_f\data\portraitrespawn_ca.paa", {true}, {true}] call ace_interact_menu_fnc_createAction; +private _actionMain = ["tunres_respawnAction", "Respawn Actions", "\a3\modules_f\data\portraitrespawn_ca.paa", {true}, {true}] call ace_interact_menu_fnc_createAction; [_object, 0, _parentAction, _actionMain] call ace_interact_menu_fnc_addActionToObject; _actionPath \ No newline at end of file diff --git a/addons/respawn/functions/fnc_addTeleportAction.sqf b/addons/respawn/functions/fnc_addTeleportAction.sqf index 5c457d2..72d3a78 100644 --- a/addons/respawn/functions/fnc_addTeleportAction.sqf +++ b/addons/respawn/functions/fnc_addTeleportAction.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Add action to TP object @@ -14,7 +14,7 @@ * The return true when done * * Example: - * _flag, true, nil, ["Tun_baseAction"] call Tun_Respawn_fnc_addTeleportAction + * _flag, true, nil, ["tunres_baseAction"] call tunres_Respawn_fnc_addTeleportAction */ #include "script_component.hpp" params ["_obj", "_menuOpenConditio", "_useAceAction", "_actionPath"]; @@ -24,13 +24,13 @@ if (_useAceAction) then { _statement = { params ["_obj", "_menuOpenConditio", "_actionPath"]; _menuOpenConditio = compile _menuOpenConditio; - private _action = ["TpMenu", "STR_Tun_Respawn_TeleportMenu" call BIS_fnc_localize,"\a3\3den\data\cfg3den\history\changeattributes_ca.paa",{ [_target] call FUNC(openTeleportMenu) }, _menuOpenConditio] call ace_interact_menu_fnc_createAction; + private _action = ["TpMenu", "STR_tunres_Respawn_TeleportMenu" call BIS_fnc_localize,"\a3\3den\data\cfg3den\history\changeattributes_ca.paa",{ [_target] call FUNC(openTeleportMenu) }, _menuOpenConditio] call ace_interact_menu_fnc_createAction; [_obj, 0, _actionPath, _action] call ace_interact_menu_fnc_addActionToObject; }; } else { _statement = { params ["_obj", "_menuOpenConditio"]; - _obj addAction ["STR_Tun_Respawn_TeleportMenuVanilla" call BIS_fnc_localize, { [_this select 0] call FUNC(openTeleportMenu) }, [], 10, true, true, "", _menuOpenConditio, 10] + _obj addAction ["STR_tunres_Respawn_TeleportMenuVanilla" call BIS_fnc_localize, { [_this select 0] call FUNC(openTeleportMenu) }, [], 10, true, true, "", _menuOpenConditio, 10] }; }; diff --git a/addons/respawn/functions/fnc_blackscreen.sqf b/addons/respawn/functions/fnc_blackscreen.sqf index c7e85b6..2701d47 100644 --- a/addons/respawn/functions/fnc_blackscreen.sqf +++ b/addons/respawn/functions/fnc_blackscreen.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Create black screen and text. Disables player moving during that time. @@ -12,7 +12,7 @@ * None * * Example: - * ["Hi World", 15] call TUN_Respawn_fnc_blackscreen + * ["Hi World", 15] call tunres_Respawn_fnc_blackscreen */ #include "script_component.hpp" params [["_text",""],["_duration", 10]]; diff --git a/addons/respawn/functions/fnc_briefingNotes.sqf b/addons/respawn/functions/fnc_briefingNotes.sqf new file mode 100644 index 0000000..ff66100 --- /dev/null +++ b/addons/respawn/functions/fnc_briefingNotes.sqf @@ -0,0 +1,111 @@ + /* + * Author: [Tuntematon] + * [Description] + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * ["something", player] call tunres_Main_fnc_briefingNotes + */ +#include "script_component.hpp" + +if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (IE zeus) + +private _text = "Respawn settings
"; + +if (GVAR(briefingEnableShowRespawnType)) then { + if ( GVAR(forced_respawn) ) then { + _text = format ["%1
%2",_text, localize "STR_tunres_Respawn_Briefing_onlyForcedWaves"]; + }; + switch (GVAR(respawn_type)) do { + case localize "STR_tunres_Respawn_Type_Sidetickets": { + _text = format ["
%1
%2",_text, localize "STR_tunres_Respawn_Briefing_sidetickets"]; + }; + case localize "STR_tunres_Respawn_Type_Default": { + _text = format ["
%1
%2",_text, localize "STR_tunres_Respawn_Briefing_default"]; + }; + case localize "STR_tunres_Respawn_Type_Playertickets": { + _text = format ["
%1
%2",_text, localize "STR_tunres_Respawn_Briefing_playertickets"]; + }; + default { }; + }; +}; + +if (GVAR(briefingEnableShowTime)) then { + _text = format ["%1

Wave interval",_text]; + if (playerSide isEqualTo west || GVAR(briefingEnableShowOtherSidesDataWest)) then { + _text = format ["%1
For West is %2min",_text, GVAR(time_west)]; + }; + + if (playerSide isEqualTo east || GVAR(briefingEnableShowOtherSidesDataEast)) then { + _text = format ["%1
For East is %2min",_text, GVAR(time_east)]; + }; + + if (playerSide isEqualTo resistance || GVAR(briefingEnableShowOtherSidesDataResistance)) then { + _text = format ["%1
For Resistance is %2min",_text, GVAR(time_guer)]; + }; + + if (playerSide isEqualTo civilian || GVAR(briefingEnableShowOtherSidesDataCivilian)) then { + _text = format ["%1
For Civilian is %2min",_text, GVAR(time_civ)]; + }; + + private _delayedRespawn = GVAR(delayed_respawn); + if (_delayedRespawn > 0) then { + private _respawnTime = switch (playerSide) do { + case west: { GVAR(time_west) }; + case east: { GVAR(time_west) }; + case resistance: { GVAR(time_west) }; + case civilian: { GVAR(time_west) }; + }; + + _respawnTime = _respawnTime * 60; + private _delayedTime = [(_respawnTime * (_delayedRespawn / 100)), "M:SS"] call CBA_fnc_formatElapsedTime; + _respawnTime = [_respawnTime, "M:SS"] call CBA_fnc_formatElapsedTime; + _text = format [localize "STR_tunres_Respawn_Briefing_DelayedRespawn",_text, _delayedTime, _delayedRespawn, _respawnTime, "%"]; + } else { + _text = _text + localize "STR_tunres_Respawn_Briefing_DelayedRespawnOff"; + + }; +}; + +if (GVAR(briefingEnableShowTickets) && { GVAR(briefingEnableShowRespawnType) isNotEqualTo localize "STR_tunres_Respawn_Type_Default"}) then { + _text = format ["%1

Tickets",_text]; + if (playerSide isEqualTo west || GVAR(briefingEnableShowOtherSidesDataWest)) then { + _text = format ["%1
Ticket count: %2 (West)",_text, GVAR(tickets_west)]; + }; + + if (playerSide isEqualTo east || GVAR(briefingEnableShowOtherSidesDataEast)) then { + _text = format ["%1
Ticket count: %2 (East)",_text, GVAR(tickets_east)]; + }; + + if (playerSide isEqualTo resistance || GVAR(briefingEnableShowOtherSidesDataResistance)) then { + _text = format ["%1
Ticket count: %2 (Resistance)",_text, GVAR(tickets_guer)]; + }; + + if (playerSide isEqualTo civilian || GVAR(briefingEnableShowOtherSidesDataCivilian)) then { + _text = format ["%1
Ticket count: %2 (Civilian)",_text, GVAR(tickets_civ)]; + }; + + if (GVAR(allowCheckTicketsBase)) then { + _text = format ["%1
You can check remaining tickets from mainbase (flagpole, using ace actions).",_text]; + }; +}; + +if (GVAR(killJIP)) then { + _text = format [localize "STR_tunres_Respawn_Briefing_killJipEnabled",_text, GVAR(killJIP_time)]; +} else { + _text = format ["%1

%2",_text, localize "STR_tunres_Respawn_Briefing_killJipDisabled"]; +}; + +_text = _text + localize "STR_tunres_Respawn_Briefing_teleportNetwork"; +_text = format ["%1

Powered By TuntematonEngine v%2.%3.%4", _text, MAJOR, MINOR, PATCHLVL]; + +//player createDiaryRecord ["Diary",["Respawn info",_text]]; +if !(player diarySubjectExists "Respawn info") then { + player createDiarySubject ["Respawn info","Tun - Respawn info"]; +}; +player createDiaryRecord ["Respawn info",["Tun - Respawn info", _text]]; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_checkTicketCount.sqf b/addons/respawn/functions/fnc_checkTicketCount.sqf index 6b0af02..a7c1d1c 100644 --- a/addons/respawn/functions/fnc_checkTicketCount.sqf +++ b/addons/respawn/functions/fnc_checkTicketCount.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Run for clints and show how many tickets left. @@ -9,13 +9,13 @@ * None * * Example: - * [west] call Tun_Respawn_fnc_checkTicketCount + * [west] call tunres_Respawn_fnc_checkTicketCount */ #include "script_component.hpp" if (isDedicated) exitWith { }; params [["_side", nil, [west]]]; -if (GVAR(respawn_type) isEqualTo localize "STR_Tun_Respawn_Type_Sidetickets") then { +if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Sidetickets") then { _ticetCount = switch (_side) do { case west: { GVAR(tickets_west) }; case east: { GVAR(tickets_east) }; @@ -23,7 +23,7 @@ if (GVAR(respawn_type) isEqualTo localize "STR_Tun_Respawn_Type_Sidetickets") t case civilian: { GVAR(tickets_civ) }; default { "No side" }; }; - _text = format["%1 %2","STR_Tun_Respawn_RemainingTicketsText" call BIS_fnc_localize, _ticetCount]; + _text = format["%1 %2","STR_tunres_Respawn_RemainingTicketsText" call BIS_fnc_localize, _ticetCount]; _text call CBA_fnc_notify; } else { [playerSide, player, true] remoteExecCall [QFUNC(getTicketCountPlayer),2]; diff --git a/addons/respawn/functions/fnc_createLocalMarker.sqf b/addons/respawn/functions/fnc_createLocalMarker.sqf index 1e19894..ec62156 100644 --- a/addons/respawn/functions/fnc_createLocalMarker.sqf +++ b/addons/respawn/functions/fnc_createLocalMarker.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * @@ -14,7 +14,7 @@ * The return value * * Example: - * ["something", player] call Tun_Respawn_fnc_createLocalMarker + * ["something", player] call tunres_Respawn_fnc_createLocalMarker */ #include "script_component.hpp" params ["_name", "_pos", "_text", "_icon", "_color", ["_alpha", 0]]; diff --git a/addons/respawn/functions/fnc_delayed_respawn.sqf b/addons/respawn/functions/fnc_delayed_respawn.sqf index 7516984..3c4c9b3 100644 --- a/addons/respawn/functions/fnc_delayed_respawn.sqf +++ b/addons/respawn/functions/fnc_delayed_respawn.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20 (min) and this is set to 50 (%) and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. @@ -10,7 +10,7 @@ * The return value * * Example: - * [] call Tun_Respawn_fnc_delayed_respawn + * [] call tunres_Respawn_fnc_delayed_respawn */ #include "script_component.hpp" params ["_unit", "_side"]; diff --git a/addons/respawn/functions/fnc_force_Respawn.sqf b/addons/respawn/functions/fnc_force_Respawn.sqf index 3835cc5..622d98e 100644 --- a/addons/respawn/functions/fnc_force_Respawn.sqf +++ b/addons/respawn/functions/fnc_force_Respawn.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Force respawn wave @@ -11,7 +11,7 @@ * None * * Example: - * [west, false] call Tun_Respawn_fnc_force_Respawn + * [west, false] call tunres_Respawn_fnc_force_Respawn */ #include "script_component.hpp" diff --git a/addons/respawn/functions/fnc_getOffSet.sqf b/addons/respawn/functions/fnc_getOffSet.sqf index 29d0146..a28aae0 100644 --- a/addons/respawn/functions/fnc_getOffSet.sqf +++ b/addons/respawn/functions/fnc_getOffSet.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Nurmi] * [Description] * @@ -9,7 +9,7 @@ * Object hight in model coordinates, if object is higher than 1.8[m] defult value is used (1.6[m]) * * Example: - * [Object] call Tun_Respawn_fnc_getOffSet + * [Object] call tunres_Respawn_fnc_getOffSet */ #include "script_component.hpp" diff --git a/addons/respawn/functions/fnc_getParentAction.sqf b/addons/respawn/functions/fnc_getParentAction.sqf index 61708e6..a9cec01 100644 --- a/addons/respawn/functions/fnc_getParentAction.sqf +++ b/addons/respawn/functions/fnc_getParentAction.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Nurmi & Tuntematon] * [Description] * @@ -9,7 +9,7 @@ * Parent Action Path in array, if no parent action exists empty array is returned * * Example: - * [Object] call Tun_Respawn_fnc_getParentAction + * [Object] call tunres_Respawn_fnc_getParentAction */ #include "script_component.hpp" diff --git a/addons/respawn/functions/fnc_getTicketCountPlayer.sqf b/addons/respawn/functions/fnc_getTicketCountPlayer.sqf index 12c6102..7929425 100644 --- a/addons/respawn/functions/fnc_getTicketCountPlayer.sqf +++ b/addons/respawn/functions/fnc_getTicketCountPlayer.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Count side tickest @@ -11,7 +11,7 @@ * None * * Example: - * [side, player, true] call TUN_Respawn_fnc_getTicketCountPlayer + * [side, player, true] call tunres_Respawn_fnc_getTicketCountPlayer */ #include "script_component.hpp" params [["_side", nil, [west]], ["_player", objNull, [objNull]], ["_doHint", false, [true]]]; @@ -28,7 +28,7 @@ if (_remainingTickets isEqualTo -10) then { }; if (_doHint) then { - private _text = format["%1 %2","STR_Tun_Respawn_RemainingTicketsText" call BIS_fnc_localize, str _remainingTickets]; + private _text = format["%1 %2","STR_tunres_Respawn_RemainingTicketsText" call BIS_fnc_localize, str _remainingTickets]; _text remoteExecCall ["CBA_fnc_notify", _player]; }; diff --git a/addons/respawn/functions/fnc_killJIP.sqf b/addons/respawn/functions/fnc_killJIP.sqf index 3cbc52a..dde9d1d 100644 --- a/addons/respawn/functions/fnc_killJIP.sqf +++ b/addons/respawn/functions/fnc_killJIP.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Kill jip after time. Set in CBA settings @@ -10,7 +10,7 @@ * Nones * * Example: - * [] call TUN_Respawn_fnc_killJIP + * [] call tunres_Respawn_fnc_killJIP */ #include "script_component.hpp" if (!hasInterface) exitWith { }; diff --git a/addons/respawn/functions/fnc_killed.sqf b/addons/respawn/functions/fnc_killed.sqf index 2c03af6..ab28c56 100644 --- a/addons/respawn/functions/fnc_killed.sqf +++ b/addons/respawn/functions/fnc_killed.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Depending what respawn style is chosen. Chose fnc acording that. @@ -10,7 +10,7 @@ * None * * Example: - * [] call TUN_Respawn_fnc_killed + * [] call tunres_Respawn_fnc_killed */ #include "script_component.hpp" @@ -23,11 +23,11 @@ if (GVAR(endRespawns)) exitWith { }; switch (GVAR(respawn_type)) do { - case localize "STR_Tun_Respawn_Type_Sidetickets": { + case localize "STR_tunres_Respawn_Type_Sidetickets": { [playerSide, player] remoteExecCall [QFUNC(ticketCounterSide),2]; }; - case localize "STR_Tun_Respawn_Type_Playertickets": { + case localize "STR_tunres_Respawn_Type_Playertickets": { [playerSide, player] remoteExecCall [QFUNC(ticketCounterPlayer),2]; }; diff --git a/addons/respawn/functions/fnc_marker_update.sqf b/addons/respawn/functions/fnc_marker_update.sqf index aa08f59..f85d36e 100644 --- a/addons/respawn/functions/fnc_marker_update.sqf +++ b/addons/respawn/functions/fnc_marker_update.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Update all marker alphas. If in waiting area, makes respawn marker BIG! @@ -10,7 +10,7 @@ * None * * Example: - * [] call Tun_Respawn_fnc_marker_update + * [] call tunres_Respawn_fnc_marker_update */ #include "script_component.hpp" @@ -18,19 +18,19 @@ if (!hasInterface) exitWith { }; if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (IE zeus) private _currentRespawnPos = switch (playerSide) do { case west: { - "tun_respawn_west" + "tunres_respawn_west" }; case east: { - "tun_respawn_east"; + "tunres_respawn_east"; }; case resistance: { - "tun_respawn_guerrila" + "tunres_respawn_guerrila" }; case civilian: { - "tun_respawn_civilian" + "tunres_respawn_civilian" }; }; diff --git a/addons/respawn/functions/fnc_module_respawnpos.sqf b/addons/respawn/functions/fnc_module_respawnpos.sqf index 19aaf96..f496757 100644 --- a/addons/respawn/functions/fnc_module_respawnpos.sqf +++ b/addons/respawn/functions/fnc_module_respawnpos.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Module fnc to create markers @@ -10,7 +10,7 @@ * The return true when done * * Example: - * [Logic] call Tun_Respawn_fnc_module_respawnpos + * [Logic] call tunres_Respawn_fnc_module_respawnpos */ #include "script_component.hpp" @@ -20,7 +20,7 @@ private _logic = param [0,objNull,[objNull]]; private _markername = _logic getVariable ["respawn_side","none"]; private _pos = getPos _logic; -if (_markername isEqualTo "none") exitWith { hint "STR_Tun_Respawn_Module_RespanPos_novalue" call BIS_fnc_localize; false }; // Exit if no side +if (_markername isEqualTo "none") exitWith { hint "STR_tunres_Respawn_Module_RespanPos_novalue" call BIS_fnc_localize; false }; // Exit if no side private _marker = ""; if (getMarkerColor _markername isEqualTo "") then { @@ -28,14 +28,14 @@ if (getMarkerColor _markername isEqualTo "") then { _marker setMarkerType "Empty"; } else { - hint format [("STR_Tun_Respawn_Module_RespanPos_MultipleMarkers" call BIS_fnc_localize), _markername]; + hint format [("STR_tunres_Respawn_Module_RespanPos_MultipleMarkers" call BIS_fnc_localize), _markername]; }; private ["_side", "_color"]; private _flag = objNull; switch (_markername) do { - case "tun_respawn_west": { + case "tunres_respawn_west": { missionNamespace setVariable [QGVAR(enabled_west),true, true]; _flag = "Flag_Blue_F" createVehicle _pos; GVAR(flag_west_spawn) = _flag; @@ -44,7 +44,7 @@ switch (_markername) do { _color = "ColorWEST"; }; - case "tun_respawn_east": { + case "tunres_respawn_east": { missionNamespace setVariable [QGVAR(enabled_east),true, true]; _flag = "Flag_Red_F" createVehicle _pos; GVAR(flag_east_spawn) = _flag; @@ -53,7 +53,7 @@ switch (_markername) do { _color = "ColorEAST"; }; - case "tun_respawn_guerrila": { + case "tunres_respawn_guerrila": { missionNamespace setVariable [QGVAR(enabled_guer),true, true]; _flag = "Flag_Green_F" createVehicle _pos; GVAR(flag_guerrila_spawn) = _flag; @@ -62,7 +62,7 @@ switch (_markername) do { _color = "ColorGUER"; }; - case "tun_respawn_civilian": { + case "tunres_respawn_civilian": { missionNamespace setVariable [QGVAR(enabled_civ),true, true]; _flag = "Flag_White_F" createVehicle _pos; GVAR(flag_civilian_spawn) = _flag; diff --git a/addons/respawn/functions/fnc_module_teleporter.sqf b/addons/respawn/functions/fnc_module_teleporter.sqf index a59056c..b4cdb35 100644 --- a/addons/respawn/functions/fnc_module_teleporter.sqf +++ b/addons/respawn/functions/fnc_module_teleporter.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * @@ -9,7 +9,7 @@ * The return true when done * * Example: - * [Logic]call Tun_Respawn_fnc_module_teleporter + * [Logic]call tunres_Respawn_fnc_module_teleporter */ #include "script_component.hpp" @@ -42,7 +42,7 @@ if (hasInterface) then { private _useAceAction = _logic getVariable QGVAR(teleportUseAceAction); private _name = _logic getVariable QGVAR(teleportName); private _markerIcon = _logic getVariable [QGVAR(teleportMarkerIcon), "hd_start"]; - private _allowCheckTickets = _logic getVariable [QGVAR(tun_respawn_teleportCheckTickets), false]; + private _allowCheckTickets = _logic getVariable [QGVAR(tunres_respawn_teleportCheckTickets), false]; private _actionPath = []; diff --git a/addons/respawn/functions/fnc_module_waitingarea.sqf b/addons/respawn/functions/fnc_module_waitingarea.sqf index 52aa9e2..ee5d4df 100644 --- a/addons/respawn/functions/fnc_module_waitingarea.sqf +++ b/addons/respawn/functions/fnc_module_waitingarea.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Module fnc to create markers @@ -10,7 +10,7 @@ * The return true when done * * Example: - * [Logic] call Tun_Respawn_fnc_module_waitingarea + * [Logic] call tunres_Respawn_fnc_module_waitingarea */ #include "script_component.hpp" @@ -20,14 +20,18 @@ _logic = param [0,objNull,[objNull]]; _markername = _logic getVariable ["respawn_side","none"]; -if (_markername isEqualTo "none") exitWith { hint ("STR_Tun_Respawn_Module_WaitingArea_novalue" call BIS_fnc_localize); false }; // Exit if no side - +if (_markername isEqualTo "none") exitWith { // Exit if no side + private _errorText = localize "STR_tunres_Respawn_Module_WaitingArea_novalue"; + ERROR_MSG(_errorText); + false +}; if (getMarkerColor _markername isEqualTo "") then { _marker = [_markername, getPos _logic, "icon", [1, 1], "PERSIST", "TYPE:", "Empty"] call CBA_fnc_createMarker; _marker setMarkerAlpha 0; } else { - hint format [( "STR_Tun_Respawn_Module_WaitingArea_MultipleMarkers" call BIS_fnc_localize), _markername]; + private _errorText = format [(localize "STR_tunres_Respawn_Module_WaitingArea_MultipleMarkers"), _markername]; + ERROR_MSG(_errorText); }; _pos = getPos _logic; diff --git a/addons/respawn/functions/fnc_moveRespawns.sqf b/addons/respawn/functions/fnc_moveRespawns.sqf index 3ac1629..e1c2176 100644 --- a/addons/respawn/functions/fnc_moveRespawns.sqf +++ b/addons/respawn/functions/fnc_moveRespawns.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Move respawns and give gear @@ -10,7 +10,7 @@ * The return true when done * * Example: - * ["side"] call Tun_Respawn_fnc_moveRespawns + * ["side"] call tunres_Respawn_fnc_moveRespawns */ #include "script_component.hpp" params ["_side", ["_forceAll", false, [false]]]; @@ -110,7 +110,7 @@ if (count _waitingRespawn > 0) then { }; _unit setVariable [QGVAR(waiting_respawn), false, true]; - private _text = "STR_Tun_Respawn_FNC_moveRespawns" call BIS_fnc_localize; + private _text = "STR_tunres_Respawn_FNC_moveRespawns" call BIS_fnc_localize; [_unit, _respawn_position, _text, 20] call FUNC(teleport); remoteExecCall [QFUNC(addGear), _unit]; [QGVAR(EH_unitRespawned), [_unit], _unit] call CBA_fnc_localEvent; diff --git a/addons/respawn/functions/fnc_openTeleportMenu.sqf b/addons/respawn/functions/fnc_openTeleportMenu.sqf index 63d6232..dfea2e0 100644 --- a/addons/respawn/functions/fnc_openTeleportMenu.sqf +++ b/addons/respawn/functions/fnc_openTeleportMenu.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * @@ -9,7 +9,7 @@ * None * * Example: - * [OBJ] call Tun_Respawn_fnc_openTeleportMenu + * [OBJ] call tunres_Respawn_fnc_openTeleportMenu */ #include "script_component.hpp" params ["_target"]; diff --git a/addons/respawn/functions/fnc_radioSettings_tfar.sqf b/addons/respawn/functions/fnc_radioSettings_tfar.sqf index 7789103..3546fa0 100644 --- a/addons/respawn/functions/fnc_radioSettings_tfar.sqf +++ b/addons/respawn/functions/fnc_radioSettings_tfar.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [ gruppe-adler ] * https://github.com/gruppe-adler/TvT_Template.VR/blob/master/functions/linearSD/fn_transferRadiosAcrossRespawn.sqf * [Description] @@ -10,7 +10,7 @@ * None * * Example: - * [] call Tun_Respawn_fnc_radioSettings_tfar + * [] call tunres_Respawn_fnc_radioSettings_tfar */ #include "script_component.hpp" diff --git a/addons/respawn/functions/fnc_removegear.sqf b/addons/respawn/functions/fnc_removegear.sqf index 0c91135..6d9a13f 100644 --- a/addons/respawn/functions/fnc_removegear.sqf +++ b/addons/respawn/functions/fnc_removegear.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Remove gear @@ -10,7 +10,7 @@ * none * * Example: - * [] call TUN_Respawn_fnc_removegear + * [] call tunres_Respawn_fnc_removegear */ #include "script_component.hpp" diff --git a/addons/respawn/functions/fnc_savegear.sqf b/addons/respawn/functions/fnc_savegear.sqf index b5d2dc8..fc6f87a 100644 --- a/addons/respawn/functions/fnc_savegear.sqf +++ b/addons/respawn/functions/fnc_savegear.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Save gear @@ -10,7 +10,7 @@ * None * * Example: - * [] call Tun_Respawn_fnc_savegear + * [] call tunres_Respawn_fnc_savegear */ #include "script_component.hpp" diff --git a/addons/respawn/functions/fnc_startSpectator.sqf b/addons/respawn/functions/fnc_startSpectator.sqf index 0f84974..e11231e 100644 --- a/addons/respawn/functions/fnc_startSpectator.sqf +++ b/addons/respawn/functions/fnc_startSpectator.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Start spectator @@ -10,7 +10,7 @@ * None * * Example: - * [] call TUN_Respawn_fnc_startSpectator + * [] call tunres_Respawn_fnc_startSpectator */ #include "script_component.hpp" diff --git a/addons/respawn/functions/fnc_teleport.sqf b/addons/respawn/functions/fnc_teleport.sqf index e0d2fac..5ff98fe 100644 --- a/addons/respawn/functions/fnc_teleport.sqf +++ b/addons/respawn/functions/fnc_teleport.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * @@ -12,7 +12,7 @@ * The return true when done * * Example: - * [_unit, _destination, _text, _range] call Tun_Respawn_fnc_teleport + * [_unit, _destination, _text, _range] call tunres_Respawn_fnc_teleport */ #include "script_component.hpp" diff --git a/addons/respawn/functions/fnc_teleportButton.sqf b/addons/respawn/functions/fnc_teleportButton.sqf index 0e46c42..084e61d 100644 --- a/addons/respawn/functions/fnc_teleportButton.sqf +++ b/addons/respawn/functions/fnc_teleportButton.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * @@ -9,7 +9,7 @@ * The return value * * Example: - * [] call Tun_Respawn_fnc_teleportButton + * [] call tunres_Respawn_fnc_teleportButton */ #include "script_component.hpp" @@ -29,12 +29,12 @@ private _teleportConditio = call compile (_teleportConditioText); private _teleportName = _obj getVariable [QGVAR(teleportName), "TP"]; private _destination = getpos _obj; -private _text = format["%1 %2", "STR_Tun_Respawn_Teleporting" call BIS_fnc_localize, _teleportName]; +private _text = format["%1 %2", "STR_tunres_Respawn_Teleporting" call BIS_fnc_localize, _teleportName]; if (_teleportConditio) then { closeDialog 2; GVAR(tpMenuOpenedFrom) = objNull; [player, _destination, _text, 10] call FUNC(teleport); } else { - ("STR_Tun_Respawn_Teleport_Disabled" call BIS_fnc_localize) call CBA_fnc_notify; + ("STR_tunres_Respawn_Teleport_Disabled" call BIS_fnc_localize) call CBA_fnc_notify; }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_teleportOnLBSelChanged.sqf b/addons/respawn/functions/fnc_teleportOnLBSelChanged.sqf index 7805c19..ff27d5b 100644 --- a/addons/respawn/functions/fnc_teleportOnLBSelChanged.sqf +++ b/addons/respawn/functions/fnc_teleportOnLBSelChanged.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * @@ -14,7 +14,7 @@ * The return value * * Example: - * ["something", player] call Tun_Respawn_fnc_teleportOnLBSelChanged + * ["something", player] call tunres_Respawn_fnc_teleportOnLBSelChanged * * Public: [Yes/No] */ diff --git a/addons/respawn/functions/fnc_ticketCounterPlayer.sqf b/addons/respawn/functions/fnc_ticketCounterPlayer.sqf index e805fd0..8fe7627 100644 --- a/addons/respawn/functions/fnc_ticketCounterPlayer.sqf +++ b/addons/respawn/functions/fnc_ticketCounterPlayer.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Count side tickest @@ -11,7 +11,7 @@ * None * * Example: - * [side, player] call TUN_Respawn_fnc_ticketCounterPlayer + * [side, player] call tunres_Respawn_fnc_ticketCounterPlayer */ #include "script_component.hpp" params ["_side","_player"]; @@ -31,7 +31,7 @@ if ( _remainingTickets > 0 ) then { _hash set [_playerUID, _remainingTickets]; }; [5] remoteExecCall ["setPlayerRespawnTime", _player]; - private _text = format["%1 %2","STR_Tun_Respawn_RemainingTicketsText" call BIS_fnc_localize, str _remainingTickets]; + private _text = format["%1 %2","STR_tunres_Respawn_RemainingTicketsText" call BIS_fnc_localize, str _remainingTickets]; _text remoteExecCall ["CBA_fnc_notify", _player]; } else { diff --git a/addons/respawn/functions/fnc_ticketCounterSide.sqf b/addons/respawn/functions/fnc_ticketCounterSide.sqf index 5431d2e..21f20d8 100644 --- a/addons/respawn/functions/fnc_ticketCounterSide.sqf +++ b/addons/respawn/functions/fnc_ticketCounterSide.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Count side tickest @@ -11,7 +11,7 @@ * None * * Example: - * [side, player] call TUN_Respawn_fnc_ticketCounterSide + * [side, player] call tunres_Respawn_fnc_ticketCounterSide */ #include "script_component.hpp" params ["_side","_player"]; diff --git a/addons/respawn/functions/fnc_timer.sqf b/addons/respawn/functions/fnc_timer.sqf index 74663a6..da23fa4 100644 --- a/addons/respawn/functions/fnc_timer.sqf +++ b/addons/respawn/functions/fnc_timer.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Timer @@ -10,7 +10,7 @@ * None * * Example: - * ["west"] call TUN_Respawn_fnc_timer + * ["west"] call tunres_Respawn_fnc_timer */ #include "script_component.hpp" params ["_side"]; @@ -56,8 +56,8 @@ switch (_side) do { if !( _side in GVAR(timer_running) ) then { GVAR(timer_running) pushBack _side; [{ missionNamespace getVariable (_this select 2) && { cba_missiontime >= missionNamespace getVariable (_this select 1) } }, { - if (Tun_MSP_enable) then { - [] call Tun_MSP_fnc_contestedCheck; + if (tunres_MSP_enable) then { + [] call tunres_MSP_fnc_contestedCheck; }; private _side = _this select 0; REM(GVAR(timer_running), _side); diff --git a/addons/respawn/functions/fnc_updatePlayerTicketCount.sqf b/addons/respawn/functions/fnc_updatePlayerTicketCount.sqf index 27a18c1..04f29f1 100644 --- a/addons/respawn/functions/fnc_updatePlayerTicketCount.sqf +++ b/addons/respawn/functions/fnc_updatePlayerTicketCount.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * @@ -10,7 +10,7 @@ * The return true when done * * Example: - * [player, 10] call Tun_Respawn_fnc_updatePlayerTicketCount + * [player, 10] call tunres_Respawn_fnc_updatePlayerTicketCount */ #include "script_component.hpp" if (!isServer) exitWith { }; diff --git a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf index f621db1..6b57914 100644 --- a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf +++ b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * @@ -10,7 +10,7 @@ * none * * Example: - * [player] call Tun_Respawn_fnc_updateWaitingRespawnList + * [player] call tunres_Respawn_fnc_updateWaitingRespawnList */ #include "script_component.hpp" params [["_player", nil, [objNull]], ["_addPlayer", nil, [false]], ["_side", nil, [west]]]; diff --git a/addons/respawn/functions/fnc_update_respawn_point.sqf b/addons/respawn/functions/fnc_update_respawn_point.sqf index d82accd..2b838d0 100644 --- a/addons/respawn/functions/fnc_update_respawn_point.sqf +++ b/addons/respawn/functions/fnc_update_respawn_point.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * @@ -11,7 +11,7 @@ * None * * Example: - * [west, true] call Tun_respawn_fnc_update_respawn_point + * [west, true] call tunres_respawn_fnc_update_respawn_point */ #include "script_component.hpp" diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index a0458f0..589db40 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * Initate waiting area loop @@ -10,7 +10,7 @@ * The return value * * Example: - * [] call TUN_Respawn_fnc_waitingArea + * [] call tunres_Respawn_fnc_waitingArea */ #include "script_component.hpp" private ["_respawn_waitingarea"]; @@ -53,13 +53,13 @@ switch (playerSide) do { }; - private _text = format ["%1", "STR_Tun_Respawn_FNC_only_forced_waves" call BIS_fnc_localize]; + private _text = format ["%1", "STR_tunres_Respawn_FNC_only_forced_waves" call BIS_fnc_localize]; if (_wait_time >= 0 && { (missionNamespace getVariable [format ["%1_%2", QGVAR(allow_respawn), playerSide], true]) }) then { - _text = format ["%2
%1
", ([_wait_time] call CBA_fnc_formatElapsedTime), "STR_Tun_Respawn_FNC_remaining_time" call BIS_fnc_localize]; + _text = format ["%2
%1
", ([_wait_time] call CBA_fnc_formatElapsedTime), "STR_tunres_Respawn_FNC_remaining_time" call BIS_fnc_localize]; } else { if (player getvariable [QGVAR(waiting_respawn), true] && { !(GVAR(forced_respawn)) }) then { - _text = format ["%1", "STR_Tun_Respawn_FNC_RespawnDisabled" call BIS_fnc_localize]; + _text = format ["%1", "STR_tunres_Respawn_FNC_RespawnDisabled" call BIS_fnc_localize]; }; }; diff --git a/addons/respawn/functions/pohja.sqf b/addons/respawn/functions/pohja.sqf index 58c3653..c6f56eb 100644 --- a/addons/respawn/functions/pohja.sqf +++ b/addons/respawn/functions/pohja.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: [Tuntematon] * [Description] * @@ -14,7 +14,7 @@ * The return value * * Example: - * ["something", player] call Tun_Respawn_fnc_imanexample + * ["something", player] call tunres_Respawn_fnc_imanexample * * Public: [Yes/No] */ diff --git a/addons/respawn/script_component.hpp b/addons/respawn/script_component.hpp index e979c80..7edd963 100644 --- a/addons/respawn/script_component.hpp +++ b/addons/respawn/script_component.hpp @@ -1,3 +1,15 @@ -#include "\x\tun\addons\Main\script_component.hpp" -#undef COMPONENT -#define COMPONENT respawn \ No newline at end of file +#define COMPONENT respawn +#define COMPONENT_BEAUTIFIED Respawn +#include "\x\tunres\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE + +#ifdef DEBUG_ENABLED_RESPAWN + #define DEBUG_MODE_FULL +#endif + #ifdef DEBUG_SETTINGS_RESPAWN + #define DEBUG_SETTINGS DEBUG_SETTINGS_RESPAWN +#endif + +#include "\x\tunres\addons\main\script_macros.hpp" diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..7ad855a --- /dev/null +++ b/build.bat @@ -0,0 +1,3 @@ +@echo off +hemtt build --no-bin -vv +pause diff --git a/build_dev.bat b/build_dev.bat new file mode 100644 index 0000000..895ee7d --- /dev/null +++ b/build_dev.bat @@ -0,0 +1,3 @@ +@echo off +hemtt dev -v +pause diff --git a/build_release.bat b/build_release.bat new file mode 100644 index 0000000..a45dc46 --- /dev/null +++ b/build_release.bat @@ -0,0 +1,3 @@ +@echo off +hemtt.exe release --no-bin -vv +pause diff --git a/buld_test.bat b/buld_test.bat new file mode 100644 index 0000000..96b1793 --- /dev/null +++ b/buld_test.bat @@ -0,0 +1,3 @@ +@echo off +hemtt launch +pause \ No newline at end of file diff --git a/data/afilogo.paa b/data/afilogo.paa index f14831fc5bc5509e27c67572cfe302d4d8ada718..6eae6152316bae8bd341f88b22c2899efca61766 100644 GIT binary patch literal 295244 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Ξ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

&pIv0c2Ph#)D0T+Zs$ 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 literal 22016 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 | on UK/Germany keyboards */ +#define DIK_F11 0x57 +#define DIK_F12 0x58 + +#define DIK_F13 0x64 /* (NEC PC98) */ +#define DIK_F14 0x65 /* (NEC PC98) */ +#define DIK_F15 0x66 /* (NEC PC98) */ + +#define DIK_KANA 0x70 /* (Japanese keyboard) */ +#define DIK_ABNT_C1 0x73 /* / ? on Portugese (Brazilian) keyboards */ +#define DIK_CONVERT 0x79 /* (Japanese keyboard) */ +#define DIK_NOCONVERT 0x7B /* (Japanese keyboard) */ +#define DIK_YEN 0x7D /* (Japanese keyboard) */ +#define DIK_ABNT_C2 0x7E /* Numpad . on Portugese (Brazilian) keyboards */ +#define DIK_NUMPADEQUALS 0x8D /* = on numeric keypad (NEC PC98) */ +#define DIK_PREVTRACK 0x90 /* Previous Track (DIK_CIRCUMFLEX on Japanese keyboard) */ +#define DIK_AT 0x91 /* (NEC PC98) */ +#define DIK_COLON 0x92 /* (NEC PC98) */ +#define DIK_UNDERLINE 0x93 /* (NEC PC98) */ +#define DIK_KANJI 0x94 /* (Japanese keyboard) */ +#define DIK_STOP 0x95 /* (NEC PC98) */ +#define DIK_AX 0x96 /* (Japan AX) */ +#define DIK_UNLABELED 0x97 /* (J3100) */ +#define DIK_NEXTTRACK 0x99 /* Next Track */ +#define DIK_NUMPADENTER 0x9C /* Enter on numeric keypad */ +#define DIK_RCONTROL 0x9D +#define DIK_MUTE 0xA0 /* Mute */ +#define DIK_CALCULATOR 0xA1 /* Calculator */ +#define DIK_PLAYPAUSE 0xA2 /* Play / Pause */ +#define DIK_MEDIASTOP 0xA4 /* Media Stop */ +#define DIK_VOLUMEDOWN 0xAE /* Volume - */ +#define DIK_VOLUMEUP 0xB0 /* Volume + */ +#define DIK_WEBHOME 0xB2 /* Web home */ +#define DIK_NUMPADCOMMA 0xB3 /* , on numeric keypad (NEC PC98) */ +#define DIK_DIVIDE 0xB5 /* / on numeric keypad */ +#define DIK_SYSRQ 0xB7 +#define DIK_RMENU 0xB8 /* right Alt */ +#define DIK_PAUSE 0xC5 /* Pause */ +#define DIK_HOME 0xC7 /* Home on arrow keypad */ +#define DIK_UP 0xC8 /* UpArrow on arrow keypad */ +#define DIK_PRIOR 0xC9 /* PgUp on arrow keypad */ +#define DIK_LEFT 0xCB /* LeftArrow on arrow keypad */ +#define DIK_RIGHT 0xCD /* RightArrow on arrow keypad */ +#define DIK_END 0xCF /* End on arrow keypad */ +#define DIK_DOWN 0xD0 /* DownArrow on arrow keypad */ +#define DIK_NEXT 0xD1 /* PgDn on arrow keypad */ +#define DIK_INSERT 0xD2 /* Insert on arrow keypad */ +#define DIK_DELETE 0xD3 /* Delete on arrow keypad */ +#define DIK_LWIN 0xDB /* Left Windows key */ +#define DIK_RWIN 0xDC /* Right Windows key */ +#define DIK_APPS 0xDD /* AppMenu key */ +#define DIK_POWER 0xDE /* System Power */ +#define DIK_SLEEP 0xDF /* System Sleep */ +#define DIK_WAKE 0xE3 /* System Wake */ +#define DIK_WEBSEARCH 0xE5 /* Web Search */ +#define DIK_WEBFAVORITES 0xE6 /* Web Favorites */ +#define DIK_WEBREFRESH 0xE7 /* Web Refresh */ +#define DIK_WEBSTOP 0xE8 /* Web Stop */ +#define DIK_WEBFORWARD 0xE9 /* Web Forward */ +#define DIK_WEBBACK 0xEA /* Web Back */ +#define DIK_MYCOMPUTER 0xEB /* My Computer */ +#define DIK_MAIL 0xEC /* Mail */ +#define DIK_MEDIASELECT 0xED /* Media Select */ + +/* + * Alternate names for keys, to facilitate transition from DOS. + */ +#define DIK_BACKSPACE DIK_BACK /* backspace */ +#define DIK_NUMPADSTAR DIK_MULTIPLY /* * on numeric keypad */ +#define DIK_LALT DIK_LMENU /* left Alt */ +#define DIK_CAPSLOCK DIK_CAPITAL /* CapsLock */ +#define DIK_NUMPADMINUS DIK_SUBTRACT /* - on numeric keypad */ +#define DIK_NUMPADPLUS DIK_ADD /* + on numeric keypad */ +#define DIK_NUMPADPERIOD DIK_DECIMAL /* . on numeric keypad */ +#define DIK_NUMPADSLASH DIK_DIVIDE /* / on numeric keypad */ +#define DIK_RALT DIK_RMENU /* right Alt */ +#define DIK_UPARROW DIK_UP /* UpArrow on arrow keypad */ +#define DIK_PGUP DIK_PRIOR /* PgUp on arrow keypad */ +#define DIK_LEFTARROW DIK_LEFT /* LeftArrow on arrow keypad */ +#define DIK_RIGHTARROW DIK_RIGHT /* RightArrow on arrow keypad */ +#define DIK_DOWNARROW DIK_DOWN /* DownArrow on arrow keypad */ +#define DIK_PGDN DIK_NEXT /* PgDn on arrow keypad */ + +/* + * Alternate names for keys originally not used on US keyboards. + */ +#define DIK_CIRCUMFLEX DIK_PREVTRACK /* Japanese keyboard */ + + +/* + * Combination keys + */ +#define INPUT_CTRL_OFFSET 512 +#define INPUT_SHIFT_OFFSET 1024 +#define INPUT_ALT_OFFSET 2048 + + +#endif /* DIK_ESCAPE */ + diff --git a/include/a3/ui_f/hpp/defineResincl.inc b/include/a3/ui_f/hpp/defineResincl.inc new file mode 100644 index 0000000..e10f4c2 --- /dev/null +++ b/include/a3/ui_f/hpp/defineResincl.inc @@ -0,0 +1,3185 @@ +#ifndef _RESINCL_HPP +#define _RESINCL_HPP + +/*******************/ +/* Tactical menu */ +/*******************/ + +// Menu commands + // main menu +#define CMD_SEPARATOR -1 +#define CMD_NOTHING -2 +#define CMD_HIDE_MENU -3 +#define CMD_BACK -4 +// Custom menu command +#define CMD_EXECUTE -5 + +#ifdef _CONFIG +enum +{ +// note: this CMD should be if possible organized as is menu +// (items from the same menu together) +// this makes searching much easier + +//main menu level +CMD_GETIN, +CMD_GETOUT, +CMD_ACTION, + +// move submenu + +// other commands +CMD_ADVANCE, +CMD_STAY_BACK, +CMD_FLANK_LEFT, +CMD_FLANK_RIGHT, +CMD_NEXT_WAYPOINT, +CMD_HIDE, +CMD_JOIN, +CMD_STOP, +CMD_EXPECT, +CMD_MOVE, + + // formations +CMD_FORM_COLUMN, +CMD_FORM_STAGCOL, +CMD_FORM_WEDGE, +CMD_FORM_ECHLEFT, +CMD_FORM_ECHRIGHT, +CMD_FORM_VEE, +CMD_FORM_LINE, +CMD_FORM_DIAMOND, +CMD_FORM_FILE, + +// engage +CMD_ENGAGE, +CMD_LOOSE_FORM, +CMD_KEEP_FORM, + +CMD_HOLD_FIRE, +CMD_OPEN_FIRE, +CMD_FIRE, + +// status +CMD_WATCH, +CMD_WATCH_AROUND, +CMD_WATCH_AUTO, +CMD_WATCH_DIR, + +// combat modes +CMD_STEALTH, +CMD_COMBAT, +CMD_AWARE, +CMD_SAFE, + +// heal +CMD_HEALBLEEDING, +CMD_HEAL, +CMD_HEAL_SELF, +CMD_REPAIR_VEHICLE, +CMD_CARRY, +CMD_DROP_CARRIED, +CMD_PUTIN, +CMD_UNLOADFROM, + +// swiming and diving +CMD_KEEP_DEPTH_RELATIVE_UP, +CMD_KEEP_DEPTH_RELATIVE_DOWN, +CMD_KEEP_DEPTH_LEADER, +CMD_KEEP_DEPTH_UNDERSURFACE, +CMD_KEEP_DEPTH_ABOVESURFACE, +CMD_KEEP_DEPTH_BOTTOM, + +//suppress fire +CMD_SUPPRESS, + +CMD_POS_UP, +CMD_POS_MIDDLE, +CMD_POS_DOWN, +CMD_POS_AUTO, + // teams +CMD_TEAM_MAIN, +CMD_TEAM_RED, +CMD_TEAM_GREEN, +CMD_TEAM_BLUE, +CMD_TEAM_YELLOW, +CMD_ASSIGN_MAIN, +CMD_ASSIGN_RED, +CMD_ASSIGN_GREEN, +CMD_ASSIGN_BLUE, +CMD_ASSIGN_YELLOW, +CMD_TEAM_DISSOLVE, + +// radio +CMD_RADIO_ALPHA, +CMD_RADIO_BRAVO, +CMD_RADIO_CHARLIE, +CMD_RADIO_DELTA, +CMD_RADIO_ECHO, +CMD_RADIO_FOXTROT, +CMD_RADIO_GOLF, +CMD_RADIO_HOTEL, +CMD_RADIO_INDIA, +CMD_RADIO_JULIET, + +// reply commands + +CMD_REPLY_DONE, +CMD_REPLY_FAIL, +CMD_REPLY_COPY, +CMD_REPLY_REPEAT, +CMD_REPLY_WHERE_ARE_YOU, +CMD_REPORT, +CMD_REPLY_ENGAGING, +CMD_REPLY_UNDER_FIRE, +CMD_REPLY_HIT, +CMD_REPLY_ONE_LESS, +CMD_REPLY_FIREREADY, +CMD_REPLY_FIRENOTREADY, +CMD_REPLY_KILLED, +CMD_REPLY_AMMO_LOW, +CMD_REPLY_FUEL_LOW, +CMD_REPLY_INJURED, +CMD_REPLY_OUT_OF_FAKs, + +CMD_SUPPORT_MEDIC, +CMD_SUPPORT_AMBULANCE, +CMD_SUPPORT_REPAIR, +CMD_SUPPORT_REARM, +CMD_SUPPORT_REFUEL, +CMD_SUPPORT_DONE, + +CMD_RADIO_CUSTOM, +CMD_RADIO_CUSTOM_1, +CMD_RADIO_CUSTOM_2, +CMD_RADIO_CUSTOM_3, +CMD_RADIO_CUSTOM_4, +CMD_RADIO_CUSTOM_5, +CMD_RADIO_CUSTOM_6, +CMD_RADIO_CUSTOM_7, +CMD_RADIO_CUSTOM_8, +CMD_RADIO_CUSTOM_9, +CMD_RADIO_CUSTOM_0, + +CMD_UNIT_1, +CMD_UNIT_2, +CMD_UNIT_3, +CMD_UNIT_4, +CMD_UNIT_5, +CMD_UNIT_6, +CMD_UNIT_7, +CMD_UNIT_8, +CMD_UNIT_9, +CMD_UNIT_10, +CMD_UNIT_11, +CMD_UNIT_12, +CMD_UNITS_ALL, + +CMD_MY_VEHICLE, + +CMD_SELECT_MAIN, +CMD_SELECT_RED, +CMD_SELECT_GREEN, +CMD_SELECT_BLUE, +CMD_SELECT_YELLOW, + +CMD_VEHICLE_1, +CMD_VEHICLE_2, +CMD_VEHICLE_3, +CMD_VEHICLE_4, +CMD_VEHICLE_5, +CMD_VEHICLE_6, +CMD_VEHICLE_7, +CMD_VEHICLE_8, +CMD_VEHICLE_9, +CMD_VEHICLE_10, +CMD_VEHICLE_11, +CMD_VEHICLE_12, + +CMD_SINGLE_UNITS, + +CMD_MP_CHANNEL_GLOBAL, +CMD_MP_CHANNEL_SIDE, +CMD_MP_CHANNEL_COMMAND, +CMD_MP_CHANNEL_GROUP, +CMD_MP_CHANNEL_VEHICLE, + +CMD_CONVERSATION, + +// Context sensitive commands +CMD_MOVE_AUTO, +CMD_STOP_AUTO, +CMD_WATCH_CTX, +CMD_GETIN_AUTO, +CMD_REARM_AUTO, +CMD_ATTACK_AUTO, +CMD_FIRE_AT_POSITION_AUTO, +CMD_SELECT_AUTO, +CMD_SELECT_AUTO_ADD, +CMD_DESELECT_AUTO, +CMD_JOIN_AUTO, +CMD_OPEN_FIRE_AUTO, +CMD_HOLD_FIRE_AUTO, +CMD_COMPLEX_COMMAND, +CMD_DISABLE_MINE, + +CMD_SELECT_UNIT_FROM_BAR, +CMD_DESELECT_UNIT_FROM_BAR, +CMD_SELECT_VEHICLE_FROM_BAR, +CMD_DESELECT_VEHICLE_FROM_BAR, +CMD_SELECT_TEAM_FROM_BAR, +CMD_DESELECT_TEAM_FROM_BAR, + +CMD_JOIN_ALL, + +CMD_SWITCH_TO_LEADER, +CMD_SWITCH_TO_SELECTED, + +CMD_NOTARGET, + +CMD_HC_SELECT_AUTO, +CMD_HC_SELECT_AUTO_ADD, +CMD_HC_DESELECT_AUTO, +CMD_HC_SELECT_UNIT_FROM_BAR, +CMD_HC_DESELECT_UNIT_FROM_BAR, +CMD_HC_SELECT_TEAM_FROM_BAR, +CMD_HC_DESELECT_TEAM_FROM_BAR, +CMD_OPENPARACHUTE, +CMD_TAKE_BACKPACK, +CMD_ASSEMBLE_WEAPON, +CMD_DISASSEMBLE_WEAPON, +CMD_ENGAGE_AUTO, +CMD_FIRE_AUTO, +CMD_FIRE_AT_POSITION_AMMO // same as CMD_FIRE_AT_POSITION_AUTO but with custom magazine +}; + +/// In-game UI hiding animation type +enum HideType +{ + HTNone, // no animation + HTFade, // fade in / fade out + HTMoveLeft, // move from / to the left + HTMoveRight // move from / to the right +}; + +enum +{ + SPTPlain, + SPTPercents +}; + +#endif + + +/*******************/ +/* Controls */ +/*******************/ + +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUTBUTTON 16 +#define CT_HITZONES 17 +#define CT_CONTROLS_TABLE 19 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_LISTNBOX 102 +#define CT_ITEMSLOT 103 +#define CT_CHECKBOX 77 +#define CT_VEHICLE_DIRECTION 105 + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0C + +#define ST_TYPE 0xF0 +#define ST_SINGLE 0x00 +#define ST_MULTI 0x10 +#define ST_TITLE_BAR 0x20 +#define ST_PICTURE 0x30 +#define ST_FRAME 0x40 +#define ST_BACKGROUND 0x50 +#define ST_GROUP_BOX 0x60 +#define ST_GROUP_BOX2 0x70 +#define ST_HUD_BACKGROUND 0x80 +#define ST_TILE_PICTURE 0x90 +#define ST_WITH_RECT 0xA0 +#define ST_LINE 0xB0 +#define ST_UPPERCASE 0xC0 +#define ST_LOWERCASE 0xD0 + +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 + +#define ST_TITLE ST_TITLE_BAR + ST_CENTER + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 + +#define SL_TEXTURES 0x10 + +// progress bar +#define ST_VERTICAL 0x01 +#define ST_HORIZONTAL 0 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 + +// Tree styles +#define TR_SHOWROOT 1 +#define TR_AUTOCOLLAPSE 2 + +// MessageBox styles +#define MB_BUTTON_OK 1 +#define MB_BUTTON_CANCEL 2 +#define MB_BUTTON_USER 4 +#define MB_ERROR_DIALOG 8 + +// Xbox buttons +#define KEY_XINPUT 0x00050000 + +#define KEY_XBOX_A KEY_XINPUT + 0 +#define KEY_XBOX_B KEY_XINPUT + 1 +#define KEY_XBOX_X KEY_XINPUT + 2 +#define KEY_XBOX_Y KEY_XINPUT + 3 +#define KEY_XBOX_Up KEY_XINPUT + 4 +#define KEY_XBOX_Down KEY_XINPUT + 5 +#define KEY_XBOX_Left KEY_XINPUT + 6 +#define KEY_XBOX_Right KEY_XINPUT + 7 +#define KEY_XBOX_Start KEY_XINPUT + 8 +#define KEY_XBOX_Back KEY_XINPUT + 9 +#define KEY_XBOX_LeftBumper KEY_XINPUT + 10 +#define KEY_XBOX_RightBumper KEY_XINPUT + 11 +#define KEY_XBOX_LeftTrigger KEY_XINPUT + 12 +#define KEY_XBOX_RightTrigger KEY_XINPUT + 13 +#define KEY_XBOX_LeftThumb KEY_XINPUT + 14 +#define KEY_XBOX_RightThumb KEY_XINPUT + 15 +#define KEY_XBOX_LeftThumbXRight KEY_XINPUT + 16 +#define KEY_XBOX_LeftThumbYUp KEY_XINPUT + 17 +#define KEY_XBOX_RightThumbXRight KEY_XINPUT + 18 +#define KEY_XBOX_RightThumbYUp KEY_XINPUT + 19 +#define KEY_XBOX_LeftThumbXLeft KEY_XINPUT + 20 +#define KEY_XBOX_LeftThumbYDown KEY_XINPUT + 21 +#define KEY_XBOX_RightThumbXLeft KEY_XINPUT + 22 +#define KEY_XBOX_RightThumbYDown KEY_XINPUT + 23 + +// Predefined controls +#define IDC_OK 1 +#define IDC_CANCEL 2 +#define IDC_AUTOCANCEL 3 +#define IDC_ABORT 4 +#define IDC_RESTART 5 +#define IDC_USER_BUTTON 6 +#define IDC_EXIT_TO_MAIN 7 + +// my own control window for tests +#define IDC_MY_FIRST_LISTBOX 110 +#define IDC_MY_FIRST_BUTTON 111 +#define IDC_MY_FIRST_SLIDER 112 + +#define IDC_MAP 51 +#define IDC_WEATHER 52 +#define IDC_POSITION 53 +#define IDC_TIME 54 +#define IDC_DATE 55 +#define IDC_BRIEFING 56 +#define IDC_MAP_NOTES 57 +#define IDC_MAP_PLAN 58 +#define IDC_MAP_TEAM_SWITCH 59 +#define IDC_MAP_GROUP 60 +//#define IDC_MAP_BRIEFING 61 +//#define IDC_MAP_DEBRIEFING 62 +#define IDC_RADIO_ALPHA 63 +#define IDC_RADIO_BRAVO 64 +#define IDC_RADIO_CHARLIE 65 +#define IDC_RADIO_DELTA 66 +#define IDC_RADIO_ECHO 67 +#define IDC_RADIO_FOXTROT 68 +#define IDC_RADIO_GOLF 69 +#define IDC_RADIO_HOTEL 70 +#define IDC_RADIO_INDIA 71 +#define IDC_RADIO_JULIET 72 +#define IDC_MAP_NAME 73 +#define IDC_WARRANT 74 +#define IDC_GPS 75 + +#define IDC_NOTEPAD_PICTURE 76 + +#define IDC_GPS_ALT 77 +#define IDC_GPS_HEADING 78 + +// - diary topics (used in multiple displays - diary, map, briefing, debriefing) +#define IDC_DIARY_TOPIC_MAP 80 +#define IDC_DIARY_TOPIC_1 81 +#define IDC_DIARY_TOPIC_2 82 +#define IDC_DIARY_TOPIC_3 83 +#define IDC_DIARY_TOPIC_4 84 +#define IDC_DIARY_TOPIC_5 85 +#define IDC_DIARY_TOPIC_6 86 +#define IDC_DIARY_TOPIC_7 87 +#define IDC_DIARY_TOPIC_8 88 +#define IDC_DIARY_TOPIC_9 89 + +#define IDC_HSLIDER 98 +#define IDC_VSLIDER 99 + +#define IDC_ARTILLERY_MAP 500 +#define IDC_ARTILLERY_MAP_FIRE 501 + +#define IDC_ARTILLERY_MAP_NAME 502 +#define IDC_ARTILLERY_MAP_ID 503 +#define IDC_ARTILLERY_MAP_GRID 504 +#define IDC_ARTILLERY_MAP_DIST 505 +#define IDC_ARTILLERY_MAP_MIN 506 +#define IDC_ARTILLERY_MAP_MAX 507 +#define IDC_ARTILLERY_MAP_DIR 508 +#define IDC_ARTILLERY_MAP_ALT 509 +#define IDC_ARTILLERY_MAP_MODE 510 +#define IDC_ARTILLERY_MAP_AMMO 511 +#define IDC_ARTILLERY_MAP_SHELLS 512 +#define IDC_ARTILLERY_MAP_SPREAD 513 +#define IDC_ARTILLERY_MAP_ETA 514 +#define IDC_ARTILLERY_MAP_AMMOCOUNT 515 +#define IDC_ARTILLERY_MAP_WARNING 516 +#define IDC_ARTILLERY_MAP_AIMABOVE 517 + +#define IDC_DIARY_TOPIC_LIST 1001 +#define IDC_DIARY_TOPIC_LISTINDEX 1002 +#define IDC_DIARY_TOPIC_HTML 1003 +#define IDC_DIARY_TOPIC_ADD_RECORD 1004 +#define IDC_DIARY_TOPIC_HTML_GROUP 1013 + +#define IDC_DIARY_PLAYER_NAME 111 +#define IDC_DIARY_MISSION_NAME 112 +#define IDC_DIARY_CURRENT_TASK 113 +#define IDC_DIARY_PLAYER_RANK 116 +//VON/chat muting in Diary +#define IDC_DIARY_PLAYERS_BUTTON 117 +#define IDC_DIARY_PLAYERS_SORT 118 +#define IDC_DIARY_MUTE_ALL 119 + +#define IDC_DIARY_TOPIC_BACKGROUND 1021 +#define IDC_DIARY_SUBTOPIC_BACKGROUND 1022 +#define IDC_DIARY_CONTENT_BACKGROUND 1023 + +//IDCs for marker color and icon. +//Are directly connected to RscMapControl, namely its idcMarkerColor and idcMarkerIcon parameters. +//Engine searches for the parameters in any display where RscMapControl is used, that's why they got more uncommon IDCs. +#define IDC_DIARY_MARKER_COLOR 1090 +#define IDC_DIARY_MARKER_ICON 1091 + + +// Instances of display +#define IDD_MAIN 0 +#define IDD_GAME 1 +#define IDD_SINGLE_MISSION 2 +#define IDD_OPTIONS 3 +#define IDD_CONFIGURE 4 +#define IDD_OPTIONS_VIDEO 5 +#define IDD_OPTIONS_AUDIO 6 +#define IDD_MULTIPLAYER 8 +#define IDD_LOAD_AAR 9 +#define IDD_MAIN_MAP 12 +#define IDD_SAVE 13 +#define IDD_END 14 +#define IDD_SERVER 17 +#define IDD_CLIENT 18 +#define IDD_IP_ADDRESS 19 +#define IDD_SERVER_SETUP 20 +#define IDD_CLIENT_SETUP 21 +#define IDD_CLIENT_WAIT 22 +#define IDD_CHAT 24 +#define IDD_CUSTOM_ARCADE 25 +#define IDD_ARCADE_MAP 26 +#define IDD_ARCADE_UNIT 27 +#define IDD_ARCADE_WAYPOINT 28 +#define IDD_TEMPLATE_SAVE 29 +#define IDD_TEMPLATE_LOAD 30 +#define IDD_LOGIN 31 +#define IDD_INTEL 32 +#define IDD_CAMPAIGN 33 +#define IDD_CREDITS 34 +#define IDD_INTEL_GETREADY 37 +#define IDD_ARCADE_GROUP 40 +#define IDD_ARCADE_SENSOR 41 +#define IDD_NEW_USER 42 +#define IDD_CAMPAIGN_LOAD 43 +#define IDD_ARCADE_EFFECTS 44 +#define IDD_ARCADE_MARKER 45 +#define IDD_MISSION 46 +#define IDD_INTRO 47 +#define IDD_OUTRO 48 +#define IDD_INTERRUPT 49 +#define IDD_DEBRIEFING 50 +#define IDD_SELECT_ISLAND 51 +#define IDD_SERVER_GET_READY 52 +#define IDD_CLIENT_GET_READY 53 +#define IDD_INSERT_MARKER 54 +#define IDD_VOICE_CHAT 55 +#define IDD_DEBUG 56 +#define IDD_HINTC 57 +#define IDD_MISSION_END 58 +#define IDD_SERVER_SIDE 59 +#define IDD_CLIENT_SIDE 60 +#define IDD_MULTIPLAYER_ROLE 61 +#define IDD_AWARD 62 +#define IDD_CHANNEL 63 +#define IDD_PASSWORD 64 +#define IDD_MP_PLAYERS 65 +#define IDD_REVERT 66 +#define IDD_PORT 69 +#define IDD_MP_SETUP 70 +#define IDD_FILTER 71 +#define IDD_HINTC_EX 72 +#define IDD_SELECT_PROFILE 73 +#define IDD_CAMPAIGN_SELECT 74 +#define IDD_PROFILE 75 +#define IDD_PROFILE_NAME 76 +#define IDD_PROFILE_FACE 77 +#define IDD_PROFILE_VOICE 78 +#define IDD_PROFILE_CONTROLLER 79 +#define IDD_PROFILE_AUDIO 80 +#define IDD_PROFILE_VIDEO 81 +#define IDD_PROFILE_LIVE 82 +#define IDD_MP_TYPE 83 +#define IDD_MP_PASSCODE 84 +#define IDD_OPTIMATCH_FILTER 86 +#define IDD_QUICKMATCH 87 +#define IDD_FRIENDS 88 +#define IDD_FRIENDS_OPTIONS 89 +#define IDD_XWIZARD_TEMPLATE 90 +#define IDD_XWIZARD_INTEL 91 +#define IDD_XWIZARD_NAME 92 +#define IDD_XWIZARD_ISLAND 93 +#define IDD_XWIZARD_WEATHER 94 +#define IDD_XWIZARD_TIME 95 +#define IDD_XWIZARD_UNIT 96 +#define IDD_XWIZARD_MAP 97 +#define IDD_XWIZARD_UNIT_SELECT 98 +#define IDD_XWIZARD_UNIT_SELECT_CUSTOM 99 +#define IDD_XWIZARD_WAYPOINT 100 +#define IDD_DOWNLOAD_CONTENT 101 +#define IDD_DOWNLOAD_CONTENT_DETAILS 102 +#define IDD_XPLAYERS 103 +#define IDD_XPLAYERS_ACTIONS 104 +#define IDD_XPLAYERS_FEEDBACK 105 +#define IDD_GEAR 106 +#define IDD_EQUIP 555 +#define IDD_DOWNLOAD_CONTENT_INSTALL 108 +#define IDD_SERVER_SETTINGS 109 +#define IDD_SERVER_ADVANCED 110 +#define IDD_SERVER_SELECT_PLAYER 112 +#define IDD_DEDICATED_SERVER 114 +#define IDD_FRIEND_MISSIONS 115 +#define IDD_LIVE_STATS 116 +#define IDD_LIVE_STATS_BOARD 117 +#define IDD_NETWORK_CONDITIONS 118 +#define IDD_SEND_VOICE_MAIL 119 +#define IDD_RECEIVE_VOICE_MAIL 120 +#define IDD_SELECT_ISLAND_NEW 351 + +#define IDD_EDIT_OBJECT 121 +#define IDD_MISSION_LOAD 122 +#define IDD_MISSION_SAVE 123 + +#define IDD_EDIT_DIARY_RECORD 125 + +#define IDD_SERVER_VOTED 126 +#define IDD_DEDICATED_SERVER_SETTINGS 127 + +#define IDD_MISSION_EDITOR 128 + +#define IDD_DIARY 129 + +#define IDD_TEAM_SWITCH 130 + +#define IDD_CONFIGURE_ACTION 131 + +#define IDD_HOST_SETTINGS 132 + +#define IDD_MINIMAP 133 +#define IDD_OVERLAY_CREATE 134 +#define IDD_OVERLAY_LOAD 135 + +#define IDD_ESRB 136 + +#define IDD_MISSION_EDITOR_REALTIME 137 + +//TODO: Has to be checked by Pete! +#define IDD_EDIT_BRIEFING 138 +#define IDD_LIVE 139 + +#define IDD_LASE 141 + +#define IDD_LAYER_LOAD 142 + +#define IDD_CONTROLS 143 +#define IDD_INTERRUPT_REVERT 144 + +#define IDD_PERFORMANCE 145 +#define IDD_XWIZARD_PARAMS 146 +#define IDD_XWIZARD_PARAMETER 147 + +#define IDD_CONFIGURE_JOYSTICKS 148 +#define IDD_CAPTURE 149 +#define IDD_CUSTOMIZE_CONTROLLER 150 +#define IDD_GAMEOPTIONS 151 + +//new editor dialog +#define IDD_ARCADE_MODULES 153 +#define IDD_SELECT_SAVE 154 +#define IDD_DSINTERFACE 155 +#define IDD_ADDON_ACTIONS 156 + +// PhysX debug window +#define IDD_PHYSX_DEBUG 157 + +// mod launcher dialog +#define IDD_MOD_LAUNCHER 157 +#define IDD_NEW_MOD 158 + +// joystick schemes mapping dialog +#define IDD_JOYSTICK_SCHEMES 159 + +//AV Terminal dialog - MUF +#define IDD_AV_TERMINAL 160 +//Field Manual +#define IDD_FIELD_MANUAL 162 +//Dialogue for controls scheme selection +#define IDD_CONTROLS_SCHEME 163 +//Dialogue for choosing layout of mission editor. NOTE: 161-163 are already in use, see A3\Ui_f\hpp\defineResincl.inc +#define IDD_EDITOR_LAYOUT 164 +//Dialogue for publishing mission on Steam. +#define IDD_PUBLISH_MISSION 165 +//Dialogue for selecting tags for mission on Steam. +#define IDD_PUBLISH_MISSION_TAGS 166 +//Dialogue for selecting file from the hard drive +#define IDD_FILE_SELECT_DIALOG 167 +//Idd reserved for debriefing 168 +#define IDD_DLC_VEHICLEMSGBOX 169 +#define IDD_DLC_PURCHASENOTIFICATION 170 +#define IDD_BOOTCAMPMSGBOX 171 +#define IDD_COMMUNITY_GUIDE 172 +#define IDD_SLING_LOAD_ASSISTANT 173 +#define IDD_DLC_CONTENTBROWSER 174 +#define IDD_MP_SCORE_TABLE 175 +#define IDD_CAMPAIGN_MP 176 +#define IDD_MP_QUICK_PLAY 177 +#define IDD_MP_SERVER_SEARCH 178 +#define IDD_MP_SERVER_FOUND 179 +#define IDD_KEYMAPMSGBOX 180 + +// MessageBoxes +#define IDD_MSG_DELETEPLAYER 200 +#define IDD_MSG_DELETEGAME 201 +#define IDD_MSG_CLEARTEMPLATE 202 +#define IDD_MSG_EXITTEMPLATE 203 +#define IDD_MSG_LAUNCHGAME 204 // ADDED IN PATCH 1.04 + +#define IDD_MSG_NEWACCOUNT 205 + +#define IDD_MSG_FRIENDS_REMOVE 206 +#define IDD_MSG_FRIENDS_BLOCK 207 +#define IDD_MSG_FRIENDS_INVITE 208 + +#define IDD_MSG_DELETEMISSION 209 + +#define IDD_MSG_XONLINE_CONNECTION_FAILED 210 +#define IDD_MSG_XONLINE_UPDATE_REQUIRED 211 +#define IDD_MSG_XONLINE_SERVER_BUSY 212 +#define IDD_MSG_XONLINE_REQUIRED_MSG 213 +#define IDD_MSG_XONLINE_RECOMMENDED_MSG 214 +#define IDD_MSG_XONLINE_INVALID_USER 215 +#define IDD_MSG_XONLINE_WRONG_PASSCODE 216 + +#define IDD_MSG_CANCEL_SUBSCRIPTION 217 +#define IDD_MSG_SUBSCRIBE 218 +#define IDD_MSG_PURCHASE 219 +#define IDD_MSG_INSTALL_ABORT 220 +#define IDD_MSG_INSTALL_RESULT 221 + +#define IDD_MSG_DECLINE_INVITATION 222 +#define IDD_MSG_REVOKE_INVITATION 223 +#define IDD_MSG_BLOCK_REQUEST 224 +#define IDD_MSG_DECLINE_REQUEST 225 +#define IDD_MSG_CANCEL_REQUEST 226 +#define IDD_MSG_KICK_OFF 227 +#define IDD_MSG_TERMINATE_SESSION 228 +#define IDD_MSG_NETWORK_CONDITIONS 229 + +#define IDD_MSG_STATS_NOT_UPLOADED 230 + +#define IDD_MSG_LOAD_FAILED 231 +#define IDD_MSG_DELETESAVE 232 + +#define IDD_MSG_DISK_FULL 233 + +#define IDD_MSG_RESTART_MISSION 234 +#define IDD_MSG_SAVE_MISSION 235 +#define IDD_MSG_SIGN_OUT 236 +#define IDD_MSG_LOAD_MISSION 237 +#define IDD_MSG_NEGATIVE_FEEDBACK 238 +#define IDD_MSG_PENDING_INVITATION 239 +#define IDD_MSG_HOST_SESSION 240 +#define IDD_MSG_ROLES_LOST 241 +#define IDD_MSG_ACCEPT_INVITATION 242 +#define IDD_MSG_MP_PLAYER_COUNT 243 +#define IDD_MSG_GAME_JOIN 244 +#define IDD_MSG_EDITOR_WIZARD_NONAME_MISSION 245 + +#define IDD_MSG_RESTART_NEEDED 246 + +// new editor +#define IDD_MSG_COMMIT_OVERLAY 247 +#define IDD_MSG_CLEAR_OVERLAY 248 +#define IDD_MSG_LOAD_OVERLAY 249 +#define IDD_MSG_EXIT_OVERLAY 250 +#define IDD_MSG_CREATE_OVERLAY 251 +#define IDD_MSG_CLOSE_OVERLAY 252 +#define IDD_MSG_LOAD_AAR 253 +#define IDD_MSG_CLEAR_MISSION 254 +#define IDD_MSG_RETRY_MISSION 255 +#define IDD_MSG_DELETE_DIARY_RECORD 256 + +// XBOX 360 profile and save messages +#define IDD_MSG_XBOX_NO_SIGN_IN 257 +#define IDD_MSG_XBOX_NO_STORAGE 258 +#define IDD_MSG_XBOX_STORAGE_CHANGED 259 +#define IDD_MSG_XBOX_SAVE_FAILED 260 +#define IDD_MSG_XBOX_NO_STORAGE_ON_INVITE 261 + +#define IDD_OPTIONS_AUDIO_ADJUST_MIC 262 + +//MUF-MessageBox for restarting mission editor during layout change +#define IDD_MSG_RESTART_EDITOR 263 + +#define IDD_PROGRESS_MESSAGE 264 + +//Message box for confirming deleting published mission +#define IDD_MSG_DELETE_STEAM_MISSION 265 +//Message box for confirming updating published mission +#define IDD_MSG_UPDATE_STEAM_MISSION 266 +//Message box for confirming saving current mission before the publish dialog is opened +#define IDD_MSG_SAVE_MISSION_BEFORE_PUBLISH 267 +//Message box for asking user to agree with Battleye licence. +#define IDD_MSG_BATTLEYE_LICENCE 268 +#define IDD_MSG_UPNP_ACTIVATION 269 +//#define IDD_MSG_ACCOUNT_LOGIN_GUIDE 270 - Reserved + +// InGameUI +#define IDD_UNITINFO 300 +#define IDD_HINT 301 +#define IDD_TASKHINT 302 +#define IDD_STANCEINFO 303 +#define IDD_AVCAMERA 304 +#define IDD_STAMINA_BAR 305 + +//Custom Info +#define IDD_CUSTOMINFO 310 +#define IDD_CUSTOMINFO_MINIMAP 311 +#define IDD_CUSTOMINFO_SLA 312 +#define IDD_CUSTOMINFO_CREW 313 +#define IDD_CUSTOMINFO_SENS 314 +#define IDD_CUSTOMINFO_FEEDUAV 315 +#define IDD_CUSTOMINFO_FEEDDRIVER 316 +#define IDD_CUSTOMINFO_FEEDPRIMARYGUNNER 317 +#define IDD_CUSTOMINFO_FEEDCOMMANDER 318 +#define IDD_CUSTOMINFO_FEEDMISSILE 319 +#define IDD_CUSTOMINFO_MINEDETECT 320 + + +// Futura ui +#define IDD_FUTURAGEAR 602 +// FUTURA GEAR controls +#define IDC_FG_PRIMARY 610 +#define IDC_FG_SECONDARY 611 +#define IDC_FG_HANDGUN 612 + +// prefix 620 means slot items +//--- +#define IDC_FG_MAP 6211 +#define IDC_FG_COMPASS 6212 +#define IDC_FG_WATCH 6213 +#define IDC_FG_RADIO 6214 +#define IDC_FG_GPS 6215 + +#define IDC_FG_GOGGLES 6216 +#define IDC_FG_HMD 6217 +#define IDC_FG_BINOC 6238 + +#define IDC_FG_BACKPACK2 6239 +#define IDC_FG_HEADGEAR 6240 + +// prefix 630 means slot container items(uniform, vest, backpack) +#define IDC_FG_UNIFORM_SLOT 6301 +#define IDC_FG_VEST_SLOT 6302 +#define IDC_FG_BACKPACK_SLOT 6303 +/// containers load +#define IDC_FG_UNIFORM_LOAD 6304 +#define IDC_FG_VEST_LOAD 6305 +#define IDC_FG_BACKPACK_LOAD 6306 +#define IDC_FG_GROUND_LOAD 6307 +#define IDC_FG_TOTAL_LOAD 6308 +//--- +#define IDC_FG_MAGAZINES 618 +// primary +#define IDC_FG_PW_MUZZLE 620 +#define IDC_FG_PW_OPTICS 621 +#define IDC_FG_PW_FLASHLIGHT 622 +#define IDC_FG_PW_MAGAZINE 623 +// secondary +#define IDC_FG_SW_MUZZLE 624 +#define IDC_FG_SW_OPTICS 625 +#define IDC_FG_SW_FLASHLIGHT 626 +#define IDC_FG_SW_MAGAZINE 627 +// handgun +#define IDC_FG_HG_MUZZLE 628 +#define IDC_FG_HG_OPTICS 629 +#define IDC_FG_HG_FLASHLIGHT 630 +#define IDC_FG_HG_MAGAZINE 631 + +#define IDC_FG_GROUND_ITEMS 632 +#define IDC_FG_CHOSEN_CONTAINER 640 +#define IDC_FG_PW_UNDERBARREL 641 +#define IDC_FG_SW_UNDERBARREL 642 +#define IDC_FG_HG_UNDERBARREL 643 +#define IDC_FG_PW_MAGAZINE_GL 644 +// #define IDC_FG_BACKPACK_ITEMS 633 +// #define IDC_FG_ITEMS 619 + +// new inventory + +// filter +#define IDC_FG_GROUND_FILTER 6554 + +// images which will painted over containers during DnD state +#define IDC_FG_GROUND_MARKER 6385 +#define IDC_FG_CONTAINER_MARKER 6325 +#define IDC_FG_CHOSEN_MARKER 6405 + +#define IDC_FG_VEST_CONTAINER 638 +#define IDC_FG_UNIFORM_CONTAINER 633 +#define IDC_FG_BACKPACK_CONTAINER 619 + +#define IDC_FG_VEST_TAB 6381 +#define IDC_FG_VEST_TEXT 6382 +#define IDC_FG_UNIFORM_TAB 6331 +#define IDC_FG_UNIFORM_TEXT 6332 +#define IDC_FG_BACKPACK_TAB 6191 +#define IDC_FG_BACKPACK_TEXT 6192 + +#define IDC_FG_CHOSEN_TAB 6401 +#define IDC_FG_CHOSEN_TEXT 6402 +#define IDC_FG_GROUND_TAB 6321 +#define IDC_FG_GROUND_TEXT 6322 +#define IDC_DLC_TEMPLATE_LOGO 100 +#define IDC_DLC_TEMPLATE_BACKGROUND 101 +/////////////// + +/// weight info +#define IDC_FG_GROUND_WEIGHT 634 +#define IDC_FG_BACKPACK_WEIGHT 635 +#define IDC_FG_ITEMS_WEIGHT 636 + +/// player info +#define IDC_FG_TOTAL_WEIGHT 637 +////// + +// Arcade Sites +#define IDD_ARCADE_SITE 700 + +#define IDC_AS_AZIMUT 701 +#define IDC_AS_AZIMUT_PICTURE 702 + +// ---- combos +#define IDC_AS_SIDE 703 +#define IDC_AS_FACTION 704 +#define IDC_AS_CLASS 705 +#define IDC_AS_SITETYPE 706 +#define IDC_AS_REPAIRABLE 707 +#define IDC_AS_FASTTRAVEL 708 +#define IDC_AS_STORAGE 709 +// ---- flags +#define IDC_AS_FLGEQUIP 710 +#define IDC_AS_FLGFOOD 711 +#define IDC_AS_FLGARMORED 712 +#define IDC_AS_FLGFUEL 713 +#define IDC_AS_FLGWEAPON 714 +// ---- strings +#define IDC_AS_NAME 715 +#define IDC_AS_DESC 716 +#define IDC_AS_INIT 717 +#define IDC_AS_CONDITION 718 +#define IDC_AS_RADIUS 719 +// ---- sliders +#define IDC_AS_HEALTH 720 +#define IDC_AS_MOOD 721 +#define IDC_AS_PRESENCE 722 + +#define IDC_AS_ARGUMENTS 733 +//////////////////////////////////////// + +// Virtual keyboard +#define IDC_VK_SHIFT 1001 +#define IDC_VK_CAPSLOCK 1002 +#define IDC_VK_SYMBOLS 1003 +#define IDC_VK_ACCENTS 1004 +#define IDC_VK_BACKSPACE 1005 +#define IDC_VK_LEFT 1006 +#define IDC_VK_RIGHT 1007 +#define IDC_VK_BASE 1010 + +// Main display controls +#define IDC_MAIN_GAME 101 +#define IDC_MAIN_OPTIONS 102 +#define IDC_MAIN_TRAINING 103 +#define IDC_MAIN_CUSTOM 104 +#define IDC_MAIN_MULTIPLAYER 105 +#define IDC_MAIN_QUIT 106 +#define IDC_MAIN_CREDITS 107 +#define IDC_MAIN_ARCADE 108 +#define IDC_MAIN_PLAYER 109 +#define IDC_MAIN_RANK 110 +#define IDC_MAIN_ISLAND 111 +#define IDC_MAIN_DATE 112 +#define IDC_MAIN_MISSION 113 +#define IDC_MAIN_CONTINUE 114 +#define IDC_MAIN_EDITOR 115 +#define IDC_MAIN_BOOK 116 +#define IDC_MAIN_SINGLE 117 +#define IDC_MAIN_VERSION 118 +#define IDC_MAIN_SINGLE_PROFILES 119 +#define IDC_MAIN_CAMPAIGN_PROFILES 120 +#define IDC_MAIN_MP_PROFILES 121 +#define IDC_MAIN_SETTINGS_PROFILES 122 +#define IDC_MAIN_SYSTEM_LINK 123 +#define IDC_MAIN_CUSTOM_PROFILES 124 +#define IDC_MAIN_SIGN_IN_STATUS 125 +#define IDC_MAIN_PLAYER_LABEL 126 +#define IDC_MAIN_PLAYER_NAME 127 +#define IDC_MAIN_CONTROLS 128 +#define IDC_MAIN_PLAYER_ID 129 +#define IDC_MAIN_PLAYER_COLOR 130 +#define IDC_MAIN_SERVICE_ID_LABEL 131 +#define IDC_MAIN_NICKNAME_LABEL 132 +#define IDC_MAIN_NICKNAME_BG 133 +#define IDC_MAIN_LOAD 134 +#define IDC_MAIN_SAVE 135 +#define IDC_MAIN_AAR 136 +#define IDC_MAIN_ACHIEVEMENTS 137 +#define IDC_MAIN_SINGLEPLAYER 138 +#define IDC_MAIN_MOD_LIST 139 +#define IDC_MAIN_MOD_LAUNCHER 140 +#define IDC_MAIN_MOD_ICONS 141 +#define IDC_SP_EDITOR 142 +#define IDC_MAIN_FIELD_MANUAL 143 +#define IDC_MAIN_DLC_ICONS 144 +#define IDC_MAIN_DLC_OWNED_ICONS 145 +#define IDC_MAIN_DLC_ICONS_BACK 146 +#define IDC_MAIN_MOD_ICONS_BACK 147 +#define IDC_MAIN_DLC_OWNED_ICONS_BACK 148 +#define IDC_MAIN_BOOTCAMP_CAMPAIGN 149 +#define IDC_MAIN_BOOTCAMP_SHOWCASES 150 +#define IDC_MAIN_BOOTCAMP_CHALLENGES 151 +#define IDC_MAIN_BOOTCAMP_VRTRAINING 152 +#define IDC_MAIN_QUICKPLAY 154 +#define IDC_MAIN_UNIT 155 + +#define IDC_MAIN_CARDAS_CUDL 199 // muj vlastni cudl + +#define IDC_MAIN_VIDEOCONTROL 3335 + +#define IDC_MAIN_TAB_LOGIN 9001 +#define IDC_MAIN_TAB_LIBRARY 9002 +#define IDC_MAIN_TAB_SINGLE 9003 +#define IDC_MAIN_TAB_MULTIPLAYER 9004 +#define IDC_MAIN_TAB_OPTIONS 9005 +#define IDC_MAIN_TAB_CONTROLS 9006 +#define IDC_MAIN_TAB_EDITOR 9007 +#define IDC_MAIN_TAB_QUIT 9008 +#define IDC_MAIN_TAB_AAR 9011 + +#define IDC_BUILD_VERSION 9009 +#define IDC_BUILD_DATE 9010 + +// Single player display controls +#define IDC_SP_TRAINING 101 +//#define IDC_SP_EDITOR 102 +#define IDC_SP_MISSION 103 +#define IDC_SP_CAMPAIGN 104 + +// Select profile display controls +#define IDC_PROFILES_LIST 101 +#define IDC_PROFILES_HEAD 102 +#define IDC_PROFILES_TITLE 103 +#define IDC_PROFILES_CONTROLLER 104 +#define IDC_PROFILES_DIFFICULTY 105 +#define IDC_PROFILES_MISSION 106 +#define IDC_PROFILES_LIVE 107 +#define IDC_PROFILES_MISSION_TEXT 108 +#define IDC_PROFILES_SIGN_IN_STATUS 109 +#define IDC_PROFILES_EDIT 110 +#define IDC_PROFILES_DELETE 111 + +// Edit profile display controls +#define IDC_PROFILE_NAME 101 +#define IDC_PROFILE_FACE 102 +#define IDC_PROFILE_VOICE 103 +#define IDC_PROFILE_CONTROLLER 104 +#define IDC_PROFILE_AUDIO 105 +#define IDC_PROFILE_VIDEO 106 +#define IDC_PROFILE_HEAD 108 +#define IDC_PROFILE_SUM_NAME 109 +#define IDC_PROFILE_SUM_CONTROLLER 110 +#define IDC_PROFILE_SUM_LIVE 111 +#define IDC_PROFILE_VOICE_MASK 112 +#define IDC_PROFILE_SIGN_IN_STATUS 113 +#define IDC_PROFILE_CREDITS 114 +#define IDC_PROFILE_STORAGE_DEVICE 115 + +// Edit profile name display controls +#define IDC_PROFILE_NAME_PREVIEW 101 + +// Edit profile face +#define IDC_PROF_FACE_FACE 101 +#define IDC_PROF_FACE_GLASSES 102 +#define IDC_PROF_FACE_HEAD 103 + +// Edit profile voice +#define IDC_PROF_VOICE_SPEAKER 101 +#define IDC_PROF_VOICE_PITCH_TITLE 102 +#define IDC_PROF_VOICE_PITCH_VALUE 103 +#define IDC_PROF_VOICE_PITCH 104 +#define IDC_PROF_VOICE_MASK 105 +#define IDC_PROF_VOICE_THROUGH_SPEAKERS 106 +#define IDC_PROF_VOICE_HEAD 107 +#define IDC_PROF_VOICE_DEFAULT 108 + +// Edit profile controller +#define IDC_PROF_CONTR_VEHICLE 101 +#define IDC_PROF_CONTR_TYPE 102 +#define IDC_PROF_CONTR_IMAGE 103 +#define IDC_PROF_CONTR_SCHEME 104 +#define IDC_PROF_CONTR_SENSITIVITY 105 +#define IDC_PROF_CONTR_A 200 +#define IDC_PROF_CONTR_B 201 +#define IDC_PROF_CONTR_Y 202 +#define IDC_PROF_CONTR_X 203 +#define IDC_PROF_CONTR_WHITE 204 +#define IDC_PROF_CONTR_BLACK 205 +#define IDC_PROF_CONTR_LEFT 206 +#define IDC_PROF_CONTR_RIGHT 207 +#define IDC_PROF_CONTR_UP 208 +#define IDC_PROF_CONTR_DOWN 209 +#define IDC_PROF_CONTR_BACK 210 +#define IDC_PROF_CONTR_START 211 +#define IDC_PROF_CONTR_LEFT_THUMB 212 +#define IDC_PROF_CONTR_LEFT_THUMB_MOVE_X 213 +#define IDC_PROF_CONTR_LEFT_THUMB_MOVE_Y 214 +#define IDC_PROF_CONTR_RIGHT_THUMB 215 +#define IDC_PROF_CONTR_RIGHT_THUMB_MOVE_X 216 +#define IDC_PROF_CONTR_RIGHT_THUMB_MOVE_Y 217 +#define IDC_PROF_CONTR_LEFT_TRIGGER 218 +#define IDC_PROF_CONTR_RIGHT_TRIGGER 219 +#define IDC_PROF_CONTR_LEFT_THUMB_MOVE 220 +#define IDC_PROF_CONTR_RIGHT_THUMB_MOVE 221 +#define IDC_PROF_CONTR_DPAD 222 +#define IDC_PROF_CONTR_NEXT_SCHEME 223 +#define IDC_PROF_CONTR_PREV_SCHEME 224 +#define IDC_PROF_CONTR_Y_AXIS 225 +#define IDC_PROF_CONTR_VIBRATIONS 226 + +// Controller buttons +// #define IDC_CONTROLLER_BUTTONS 101 + +// Edit profile audio options +#define IDC_PROF_AUDIO_MUSIC_TITLE 101 +#define IDC_PROF_AUDIO_MUSIC_VALUE 102 +#define IDC_PROF_AUDIO_MUSIC 103 +#define IDC_PROF_AUDIO_RADIO_TITLE 104 +#define IDC_PROF_AUDIO_RADIO_VALUE 105 +#define IDC_PROF_AUDIO_RADIO 106 +#define IDC_PROF_AUDIO_EFFECT_TITLE 107 +#define IDC_PROF_AUDIO_EFFECT_VALUE 108 +#define IDC_PROF_AUDIO_EFFECT 109 +#define IDC_PROF_AUDIO_DEFAULT 110 + +// Edit profile video options +#define IDC_PROF_VIDEO_BRIGHT 101 +#define IDC_PROF_VIDEO_BRIGHT_TITLE 102 +#define IDC_PROF_VIDEO_BRIGHT_VALUE 103 +#define IDC_PROF_VIDEO_GAMMA 104 +#define IDC_PROF_VIDEO_GAMMA_TITLE 105 +#define IDC_PROF_VIDEO_GAMMA_VALUE 106 +#define IDC_PROF_VIDEO_SUBTITLES 107 +#define IDC_PROF_VIDEO_RADIO 108 +#define IDC_PROF_VIDEO_DEFAULT 109 + +// Select profile an Xbox live account display controls +#define IDC_PROFILE_LIVE_ACCOUNTS 101 +#define IDC_PROFILE_LIVE_CREATE 102 + +// Select difficulty dialog +#define IDC_DIFF_LIST 108 +#define IDC_DIFF_DESC 102 + +// Single mission display controls +#define IDC_SINGLE_MISSION 101 +#define IDC_SINGLE_OVERVIEW 102 +#define IDC_SINGLE_MISSION_PAD 103 +#define IDC_SINGLE_DIFF 104 +#define IDC_SINGLE_LOAD 105 +#define IDC_SINGLE_TITLE 106 +#define IDC_SINGLE_DELETE 107 +#define IDC_SINGLE_COPY 108 +#define IDC_SINGLE_EDIT 109 +#define IDC_SINGLE_NAME 110 +#define IDC_SINGLE_AUTHOR 111 +#define IDC_SINGLE_PICTURE 112 +#define IDC_SINGLE_DESCRIPTION 113 +#define IDC_SINGLE_LOADING_PICTURE 114 +#define IDC_SINGLE_SHOW_MISSION_WORKSHOP 115 +#define IDC_SINGLE_SHOW_GAME_WORKSHOP 116 +#define IDC_SINGLE_SHOW_GAME_OR_MISSION_WORKSHOP 117 +#define IDC_SINGLE_MISSION_SORT_COMBO 118 +#define IDC_SINGLE_MISSION_SORT_ORDER 119 +#define IDC_SINGLE_MISSION_BUY_DLC 120 +#define IDC_SINGLE_MISSION_DLCSTRIPE 121 +#define IDC_SINGLE_MISSION_DLCICON 122 + +// Xbox style mission wizard +#define IDC_XWIZ_TEMPLATE 101 +#define IDC_XWIZ_TEMPLATE_OVERVIEW 102 + +#define IDC_XWIZ_NAME 101 +#define IDC_XWIZ_ISLAND 102 +#define IDC_XWIZ_WEATHER 103 +#define IDC_XWIZ_TIME 104 +#define IDC_XWIZ_SUM_NAME 105 +#define IDC_XWIZ_SUM_TIME 106 +#define IDC_XWIZ_SUM_TEMPLATE 107 +#define IDC_XWIZ_SUM_ISLAND 108 +#define IDC_XWIZ_SUM_WEATHER 109 +#define IDC_XWIZ_SUM_WEATHER_FORECAST 110 +#define IDC_XWIZ_UNIT 111 +#define IDC_XWIZ_MAP 112 +#define IDC_XWIZ_SUM_DATE 113 +#define IDC_XWIZ_PARAM 114 +#define IDC_XWIZ_SAVE 115 + +#define IDC_XWIZ_UNITS 101 +#define IDC_XWIZ_UNITS_OVERVIEW 102 + +#define IDC_XWIZ_PARAMS 101 +#define IDC_XWIZ_PARAMS_TITLES 102 +#define IDC_XWIZ_PARAMS_VALUES 103 +#define IDC_EDIT 104 +#define IDD_XWIZARD_PARAMETER_TITLE 105 + +#define IDC_XWIZ_UNIT_SELECT 101 +#define IDC_XWIZ_UNIT_SELECT_TITLE 102 + +#define IDC_XWIZ_UNIT_CLASS 101 +#define IDC_XWIZ_UNIT_TYPE 102 +#define IDC_XWIZ_UNIT_COUNT 103 +#define IDC_XWIZ_UNIT_SIDE 104 +#define IDC_XWIZ_UNIT_SELECT_CUSTOM_TITLE 105 + +#define IDC_XWIZ_WP_TYPE 101 +#define IDC_XWIZ_WP_BEHAVIOUR 102 +#define IDC_XWIZ_WP_FORMATION 103 +#define IDC_XWIZ_WP_COMBAT_MODE 104 + +#define IDC_XWIZ_ISLAND_LIST 101 +#define IDC_XWIZ_ISLAND_MAP 102 +#define IDC_XWIZ_ISLAND_SHOTS 103 + +#define IDC_XWIZ_WEATHER_TITLE 101 +#define IDC_XWIZ_WEATHER_VALUE 102 +#define IDC_XWIZ_WEATHER_FORECAST_TITLE 103 +#define IDC_XWIZ_WEATHER_FORECAST_VALUE 104 +#define IDC_XWIZ_FOG_TITLE 105 +#define IDC_XWIZ_FOG_VALUE 106 +#define IDC_XWIZ_FOG_FORECAST_TITLE 107 +#define IDC_XWIZ_FOG_FORECAST_VALUE 108 +#define IDC_XWIZ_VIEW_DISTANCE_TITLE 109 +#define IDC_XWIZ_VIEW_DISTANCE_VALUE 110 + +#define IDC_XWIZ_TIME_HOUR 101 +#define IDC_XWIZ_TIME_MINUTE 102 +#define IDC_XWIZ_TIME_DAY 103 +#define IDC_XWIZ_TIME_MONTH 104 +#define IDC_XWIZ_TIME_YEAR 105 + +#define IDC_XWIZ_MAP_POINTS 101 +#define IDC_XWIZ_MAP_DELETE 102 +#define IDC_XWIZ_MAP_EDIT 103 +#define IDC_XWIZ_MAP_INSERT_WP 104 +#define IDC_XWIZ_MAP_NOTEPAD 105 +#define IDC_XWIZ_MAP_MOVE 106 + +// Select campaign display +#define IDC_CAMPAIGNS_LIST 101 +#define IDC_CAMPAIGNS_CAMPAIGN 102 +#define IDC_CAMPAIGNS_DESCRIPTION 103 + +// Campaign display +#define IDC_CAMPAIGN_HISTORY 101 +#define IDC_CAMPAIGN_REPLAY 102 +#define IDC_CAMPAIGN_DIFF 103 +#define IDC_CAMPAIGN_NAME 104 +#define IDC_CAMPAIGN_AUTHOR 105 +#define IDC_CAMPAIGN_PICTURE 106 +#define IDC_CAMPAIGN_DESCRIPTION 107 +#define IDC_CAMPAIGN_TEXT_ESTDEPLOY 108 +#define IDC_CAMPAIGN_RELEASEDATE 109 +#define IDC_CAMPAIGN_BUY_DLC 110 +#define IDC_CAMPAIGN_DLCSTRIPE 111 +#define IDC_CAMPAIGN_DLCICON 112 + +// MP campaign display +#define IDC_CAMPAIGN_MP_LIST 101 +#define IDC_CAMPAIGN_MP_TITLE 102 +#define IDC_CAMPAIGN_MP_NAME 103 +#define IDC_CAMPAIGN_MP_AUTHOR 104 +#define IDC_CAMPAIGN_MP_PICTURE 105 +#define IDC_CAMPAIGN_MP_DESCRIPTION 106 +#define IDC_CAMPAIGN_MP_PLAY 107 +#define IDC_CAMPAIGN_MP_HOST 108 +#define IDC_CAMPAIGN_MP_JOIN 109 +#define IDC_CAMPAIGN_MP_BUY_DLC 110 + +// Revert display +#define IDC_REVERT_BOOK 101 +#define IDC_REVERT_TITLE 102 +#define IDC_REVERT_QUESTION 103 + +// Game display controls +#define IDC_GAME_SELECT 301 +#define IDC_SIDE_NAME 101 + +// Options display controls +#define IDC_OPTIONS_VIDEO 301 +#define IDC_OPTIONS_AUDIO 302 +#define IDC_OPTIONS_CONFIGURE 303 +#define IDC_OPTIONS_DIFFICULTY 304 +#define IDC_OPTIONS_NOTEBOOK 305 +#define IDC_OPTIONS_CREDITS 306 +#define IDC_OPTIONS_GAMEOPTIONS 307 + +#define IDC_OPTIONS_OBJECT_VISIBILITY_VALUE 308 +#define IDC_OPTIONS_OBJECT_VISIBILITY_SLIDER 309 +#define IDC_OPTIONS_VISIBILITY_TEXT 310 +#define IDC_OPTIONS_SHADOW_VISIBILITY_VALUE 311 +#define IDC_OPTIONS_SHADOW_VISIBILITY_SLIDER 312 +#define IDC_OPTIONS_SHADOW_VISIBILIT_TEXT 313 +#define IDC_OPTIONS_TRAFFIC_VISIBILITY_VALUE 314 +#define IDC_OPTIONS_TRAFFIC_VISIBILITY_SLIDER 315 +#define IDC_OPTIONS_PIP_VISIBILITY_VALUE 316 +#define IDC_OPTIONS_PIP_VISIBILITY_SLIDER 317 + +#define IDC_OPTIONS_PIP_VALUE 334 +#define IDC_OPTIONS_SW_VALUE 335 +#define IDC_OPTIONS_FXAA_VALUE 336 +#define IDC_OPTIONS_WATER_SS_REFLECTIONS_VALUE 337 + +#define IDC_OPTIONS_QUALITY_VALUE 101 +#define IDC_OPTIONS_QUALITY_SLIDER 102 +#define IDC_OPTIONS_VISIBILITY_VALUE 103 +#define IDC_OPTIONS_VISIBILITY_SLIDER 104 + +#define IDC_OPTIONS_DRAWDISTANCE_VALUE 1336 +#define IDC_OPTIONS_DRAWDISTANCE_SLIDER 1337 + +#define IDC_OPTIONS_RATE_VALUE 105 +#define IDC_OPTIONS_RATE_SLIDER 106 +#define IDC_OPTIONS_TEXTURES_VALUE 107 +#define IDC_OPTIONS_TEXTURES_SLIDER 108 +#define IDC_OPTIONS_GAMMA_VALUE 109 +#define IDC_OPTIONS_GAMMA_SLIDER 110 +#define IDC_OPTIONS_BRIGHT_VALUE 111 +#define IDC_OPTIONS_BRIGHT_SLIDER 112 +#define IDC_OPTIONS_RESOLUTION 113 +#define IDC_OPTIONS_DISPLAY_MODE 1131 +#define IDC_OPTIONS_REFRESH 114 +#define IDC_OPTIONS_OBJSHADOWS 115 +//#define IDC_OPTIONS_VEHSHADOWS 116 +//#define IDC_OPTIONS_CLOUDLETS 117 +//#define IDC_OPTIONS_HWTL 118 +#define IDC_OPTIONS_BLOOD 119 +//#define IDC_OPTIONS_MULTITEXTURING 120 +#define IDC_OPTIONS_WBUFFER 121 +#define IDC_OPTIONS_BLOOD_TEXT 122 +#define IDC_OPTIONS_TERRAIN 123 +#define IDC_OPTIONS_LIFESTATE 199 +#define IDC_OPTIONS_TUTORIAL_HINTS 140 + +#define IDC_OBJECTS_DETAIL 124 +#define IDC_TEXTURE_DETAIL 125 +#define IDC_QUALITY_PREFERENCE 126 +#define IDC_SHADING_DETAIL 127 +#define IDC_SHADOW_DETAIL 128 + +#define IDC_OPTIONS_VIDEO_DEFAULT 129 +#define IDC_OPTIONS_VIDEO_AUTODETECT 1291 + +#define IDC_ANISO_DETAIL 130 +#define IDC_HDR_DETAIL 131 +#define IDC_POSTPROCESS_EFFECTS 132 +#define IDC_FSAA_DETAIL 133 +#define IDC_ASPECT_RATIO 134 +#define IDC_ATOC_DETAIL 1300 +#define IDC_PPAA_DETAIL 1301 + +#define IDC_OPTIONS_PP_SSAO 1310 +#define IDC_OPTIONS_PP_BLOOM_SLIDER 1311 +#define IDC_OPTIONS_PP_BLOOM_VALUE 1312 +#define IDC_OPTIONS_PP_ROTBLUR_SLIDER 1313 +#define IDC_OPTIONS_PP_ROTBLUR_VALUE 1314 +#define IDC_OPTIONS_PP_RADIALBLUR_SLIDER 1315 +#define IDC_OPTIONS_PP_RADIALBLUR_VALUE 1316 +#define IDC_OPTIONS_PP_DOF_SLIDER 1317 +#define IDC_OPTIONS_PP_DOF_VALUE 1318 +#define IDC_OPTIONS_PP_CAUSTICS 1319 +#define IDC_OPTIONS_PP_SHARPEN_SLIDER 1320 +#define IDC_OPTIONS_PP_SHARPEN_VALUE 1321 +#define IDC_OPTIONS_PP_COLOR_CORRECTIONS 1322 +#define IDC_OPTIONS_PP_BRIGHTNESS_SLIDER 1323 +#define IDC_OPTIONS_PP_BRIGHTNESS_VALUE 1324 +#define IDC_OPTIONS_PP_CONTRAST_SLIDER 1325 +#define IDC_OPTIONS_PP_CONTRAST_VALUE 1326 +#define IDC_OPTIONS_PP_SATURATION_SLIDER 1327 +#define IDC_OPTIONS_PP_SATURATION_VALUE 1328 + +#define IDC_OPTIONS_VIDEO_FPS_TEXT 1400 +#define IDC_OPTIONS_VIDEO_PERF_WARNING 1401 + + +#define IDC_OPTIONS_LANGUAGE 135 + +#define IDC_OPTIONS_IGUISIZE 136 +#define IDC_OPTIONS_IGUISIZE_LABEL 1014 +#define IDC_OPTIONS_IGUISIZE_TEXT 137 +#define IDC_OPTIONS_HEADBOB 138 + +#define IDC_VRAM_VALUE 139 + +#define IDC_VSYNC_VALUE 140 +#define IDC_OPTIONS_IMPERIALUNITS 141 +#define IDC_OPTIONS_VEHICLEFREELOOK 142 +#define IDC_OPTIONS_STREAM_FRIENDLY 143 +#define IDC_OPTIONS_ADAPTIVE_CROSSHAIR 144 +#define IDC_OPTIONS_INSTRUCTOR_FIGURE 145 +#define IDC_OPTIONS_ENABLE_RTD 146 +#define IDC_OPTIONS_ALLOW_FULL_RTD_HUD 147 +#define IDC_OPTIONS_ALLOW_ROUGH_LANDING_RTD 148 +#define IDC_OPTIONS_WIND_INFLUENCE_DYN_RTD 149 +#define IDC_OPTIONS_AUTO_TRIM_RTD 150 +#define IDC_OPTIONS_STRESS_DAMAGE_RTD 151 + +#define IDC_PARTICLES_EFFECTS 143 +#define IDC_OPTIONS_DYNAMIC_LIGHTS 144 + +#define IDC_OPTIONS_SLIDER_FILLRATE 1234 +#define IDC_OPTIONS_VALUE_FILLRATE 1236 + + +#define IDC_OPTIONS_MUSIC_VALUE 101 +#define IDC_OPTIONS_MUSIC_SLIDER 102 +#define IDC_OPTIONS_EFFECTS_VALUE 103 +#define IDC_OPTIONS_EFFECTS_SLIDER 104 +#define IDC_OPTIONS_VOICES_VALUE 105 +#define IDC_OPTIONS_VOICES_SLIDER 106 +#define IDC_OPTIONS_SAMPLING 107 +#define IDC_OPTIONS_HWACC 108 +#define IDC_OPTIONS_EAX 109 +#define IDC_OPTIONS_SINGLE_VOICE 110 +#define IDC_OPTIONS_AUDIO_DEFAULT 111 +#define IDC_OPTIONS_PLAYER_VOICE 112 +#define IDC_OPTIONS_VON_VALUE 113 +#define IDC_OPTIONS_VON_SLIDER 114 +//samples setting was replaced by audio output device +#define IDC_OPTIONS_SAMPLES_VALUE 115 +#define IDC_OPTIONS_SAMPLES_SLIDER 116 + +#define IDC_OPTIONS_AUDIO_OUTPUT_REFRESH 115 +#define IDC_OPTIONS_AUDIO_OUTPUT_COMBO 116 + +#define IDC_OPTIONS_MIC_SENS_SLIDER 117 +#define IDC_OPTIONS_MIC_ADJUST 118 + +#define IDC_OPTIONS_MAPDUCKING_VALUE 119 +#define IDC_OPTIONS_MAPDUCKING_SLIDER 120 + +// microphone adjustment +#define IDC_OPTIONS_MIC_PROGRESS_BAR 1001 +#define IDC_OPTIONS_MIC_PROGRESS 1002 + +#define IDC_OPTIONS_SUBTITLES 102 +#define IDC_OPTIONS_RADIO 103 + +#define IDC_DIFF_AI_LEVEL_TEXT 1510 +#define IDC_DIFF_AI_LEVEL 1511 +#define IDC_DIFF_AI_SKILL_LABEL 1512 +#define IDC_DIFF_AI_SKILL_SLIDER 1513 +#define IDC_DIFF_AI_SKILL_VALUE 1514 +#define IDC_DIFF_AI_PRECISION_LABEL 1515 +#define IDC_DIFF_AI_PRECISION_SLIDER 1516 +#define IDC_DIFF_AI_PRECISION_VALUE 1517 +#define IDC_DIFF_PICTURE 1518 +#define IDC_DIFF_DESCRIPTION 1519 +#define IDC_DIFF_OPTIONS_GROUP 1520 +#define IDC_DIFF_REDUCED_DAMAGE 1521 +#define IDC_DIFF_GROUP_INDICATORS 1522 +#define IDC_DIFF_FRIENDLY_TAG 1523 +#define IDC_DIFF_ENEMY_TAG 1524 +#define IDC_DIFF_MINES 1525 +#define IDC_DIFF_COMMANDS 1526 +#define IDC_DIFF_WAYPOINTS 1527 +#define IDC_DIFF_WEAPON_INFO 1528 +#define IDC_DIFF_STANCE_INDICATOR 1529 +#define IDC_DIFF_STAMINA_BAR 1530 +#define IDC_DIFF_CROSSHAIR 1531 +#define IDC_DIFF_VISION_AID 1532 +#define IDC_DIFF_THIRD_PERSON 1533 +#define IDC_DIFF_CAMERA_SHAKE 1534 +#define IDC_DIFF_SCORE_TABLE 1535 +#define IDC_DIFF_KILLED_BY 1536 +#define IDC_DIFF_VON_ID 1537 +#define IDC_DIFF_EXTENDED_MAP_FRIENDLY 1538 +#define IDC_DIFF_AUTO_REPORT 1539 +#define IDC_DIFF_MULTIPLE_SAVES 1540 +// #define IDC_DIFF_SQUAD_RADAR 1541 +#define IDC_DIFF_TACTICAL_PING 1542 +#define IDC_DIFF_EXTENDED_MAP_ENEMY 1543 +#define IDC_DIFF_EXTENDED_MAP_MINES 1544 +#define IDC_DIFF_MINIMAP_ALLOWED 1545 +#define IDC_DIFF_EXTENDED_MAP_PING 1546 + +// Configure display controls +#define IDC_CONFIG_DEFAULT 101 +#define IDC_CONFIG_KEYS 102 +#define IDC_CONFIG_XAXIS 103 +#define IDC_CONFIG_YAXIS 104 +#define IDC_CONFIG_YREVERSED 105 +#define IDC_CONFIG_JOYSTICK 106 +#define IDC_CONFIG_BUTTONS 107 +#define IDC_CONFIG_CONTROLS_PAGE 108 +#define IDC_CONFIG_FLOATING_ZONE 109 +#define IDC_CONFIG_MOUSE_FILTERING 110 +#define IDC_CONFIG_GEARBOX_MODE 112 +#define IDC_CONFIG_MOUSE_ACCELERATION 113 +#define IDC_CONFIG_KEY_PRESETS 114 + +// dialog for selecting default controls preset +#define IDC_CONFIG_DEFAULTCONTROLS_LIST 101 + +// Multiplayer type display controls +#define IDC_MP_TYPE_RANKED_MATCH 101 +#define IDC_MP_TYPE_PLAYER_MATCH 102 +#define IDC_MP_TYPE_SYSTEM_LINK 103 +#define IDC_MP_TYPE_FRIENDS 104 +#define IDC_MP_TYPE_DOWNLOAD 105 +#define IDC_MP_TYPE_INFO 106 +#define IDC_MP_TYPE_STATS 107 +#define IDC_MP_TYPE_SIGN_OUT 108 +#define IDC_MP_TYPE_DEDICATED_SERVER 109 +#define IDC_MP_TYPE_SERVER 110 +#define IDC_MP_TYPE_APPEAR_OFFLINE 111 + +// Xbox Live display controls +#define IDC_LIVE_QUICK_MATCH 101 +#define IDC_LIVE_CUSTOM_MATCH 102 +#define IDC_LIVE_CREATE_MATCH 103 + +// Friends dialog +#define IDC_FRIENDS_LIST 101 +#define IDC_FRIENDS_STATUS 102 + +// Friends options dialog +#define IDC_FRIENDS_PLAYER 101 +#define IDC_FRIENDS_GAME_INVITE 102 +#define IDC_FRIENDS_GAME_CANCEL 103 +#define IDC_FRIENDS_GAME_ACCEPT 104 +#define IDC_FRIENDS_GAME_DECLINE 105 +#define IDC_FRIENDS_GAME_JOIN 106 +#define IDC_FRIENDS_ACCEPT 107 +#define IDC_FRIENDS_DECLINE 108 +#define IDC_FRIENDS_STOP 109 +#define IDC_FRIENDS_CANCEL 110 +#define IDC_FRIENDS_REMOVE 111 +#define IDC_FRIENDS_VOICE 112 +#define IDC_FRIENDS_FEEDBACK 113 +#define IDC_FRIENDS_GAME_INVITE_VOICE 114 +#define IDC_FRIENDS_PLAY_MESSAGE 115 +#define IDC_FRIENDS_MISSIONS 152 +#define IDC_MULTI_BATTLEYE_FILTER 154 +#define IDC_MULTI_EXPANSIONS_FILTER 155 + +// Send voice mail dialog +#define IDC_SVM_TITLE 101 +#define IDC_SVM_PLAYER 102 +#define IDC_SVM_RECORD 103 +#define IDC_SVM_PLAY 104 +#define IDC_SVM_SEND 105 +#define IDC_SVM_PROGRESS 106 +#define IDC_SVM_TIME 107 + +// Receive voice mail dialog +#define IDC_RVM_TITLE 101 +#define IDC_RVM_PLAYER 102 +#define IDC_RVM_PLAY 103 +#define IDC_RVM_FEEDBACK 104 +#define IDC_RVM_PROGRESS 105 +#define IDC_RVM_TIME 106 + +// Xbox players dialog +#define IDC_XPLAYERS_LIST 101 +#define IDC_XPLAYERS_STATUS 102 +#define IDC_XPLAYERS_DISABLE_VOICE 103 +#define IDC_XPLAYERS_ENABLE_VOICE 104 +#define IDC_XPLAYERS_KICKOFF 105 + +// Xbox players options dialog +#define IDC_XPLAYERS_PLAYER 101 +#define IDC_XPLAYERS_ASK 102 +#define IDC_XPLAYERS_MUTE 103 +#define IDC_XPLAYERS_FEEDBACK 104 +#define IDC_XPLAYERS_CANCEL 105 +#define IDC_XPLAYERS_ASK_VOICE 107 + +// Feedback dialog +#define IDC_FEEDBACK_PLAYER 101 +#define IDC_FEEDBACK_DATE 102 +#define IDC_FEEDBACK_GREAT_SESSION 103 +#define IDC_FEEDBACK_GOOD_ATTITUDE 104 +#define IDC_FEEDBACK_BAD_NAME 105 +#define IDC_FEEDBACK_CURSING 106 +#define IDC_FEEDBACK_SCREAM 107 +#define IDC_FEEDBACK_CHEAT 108 +#define IDC_FEEDBACK_THREAT 109 +#define IDC_FEEDBACK_MSG_HARASSING 110 +#define IDC_FEEDBACK_MSG_OFFENSIVE 111 +#define IDC_FEEDBACK_MSG_SPAM 112 + +// Download content display controls +#define IDC_DOWNLOAD_CONTENT_LIST 101 + +#define IDC_DOWNLOAD_CONTENT_TITLE 101 +#define IDC_DOWNLOAD_CONTENT_TERMS 102 +#define IDC_DOWNLOAD_CONTENT_PICTURE 103 +#define IDC_DOWNLOAD_CONTENT_SHOW_PRICE 104 + +#define IDC_DOWNLOAD_CONTENT_PRICE_TITLE 101 +#define IDC_DOWNLOAD_CONTENT_PRICE 102 +#define IDC_DOWNLOAD_CONTENT_PRICE_QUESTION 103 + +#define IDC_INSTALL_CONTENT_PROGRESS 101 +#define IDC_INSTALL_CONTENT_NAME 102 +#define IDC_INSTALL_CONTENT_TIME 103 + +// Multiplayer passcode display controls +#define IDC_MP_PASSCODE_FIRST 101 + +// Multiplayer display controls +#define IDC_MULTI_TITLE 101 +#define IDC_MULTI_SESSIONS 102 +//#define IDC_MULTI_REMOTE 103 //Renamed to IDC_MULTI_TAB_DIRECT_CONNECT +//#define IDC_MULTI_NEW 104 //Renamed to IDC_MULTI_TAB_HOST_SERVER +#define IDC_MULTI_JOIN 105 +#define IDC_MULTI_NOTEBOOK 106 +#define IDC_MULTI_PASSWORD 107 +#define IDC_MULTI_PORT 108 +#define IDC_MULTI_SERVER_ICON 111 +#define IDC_MULTI_SERVER_COLUMN 112 +#define IDC_MULTI_MISSION_ICON 113 +#define IDC_MULTI_MISSION_COLUMN 114 +#define IDC_MULTI_STATE_ICON 115 +#define IDC_MULTI_STATE_COLUMN 116 +#define IDC_MULTI_PLAYERS_ICON 117 +#define IDC_MULTI_PLAYERS_COLUMN 118 +#define IDC_MULTI_PING_ICON 119 +#define IDC_MULTI_PING_COLUMN 120 +#define IDC_MULTI_PROGRESS 121 +#define IDC_MULTI_INTERNET 122 +#define IDC_MULTI_REFRESH 123 +#define IDC_MULTI_FILTER 124 +#define IDC_MULTI_SERVER_FILTER 125 +#define IDC_MULTI_MISSION_FILTER 126 +#define IDC_MULTI_PLAYERS_FILTER 127 +#define IDC_MULTI_PING_FILTER 128 +#define IDC_MP_HOST 129 +#define IDC_MP_TYPE 130 +#define IDC_MP_MISSION 131 +#define IDC_MP_ISLAND 132 +#define IDC_MP_STATE 133 +#define IDC_MP_TIMELEFT 134 +#define IDC_MP_SLOTS_PUBLIC 135 +#define IDC_MP_SLOTS_PRIVATE 136 +#define IDC_MP_NO_SESSION 137 +#define IDC_MP_DIFFICULTY 138 +#define IDC_MP_LANGUAGE 139 +#define IDC_MULTI_GAMETYPE_ICON 140 +#define IDC_MULTI_GAMETYPE_COLUMN 141 +#define IDC_MP_PING 142 +#define IDC_MP_PASSWORD 143 +#define IDC_MP_PLATFORM 144 +#define IDC_MP_COUNTRY 145 +#define IDC_MP_VERSION 146 +#define IDC_MP_VERSION_REQUIRED 147 +#define IDC_MP_MODS 148 +#define IDC_MP_PLAYERS_ROW 149 +#define IDC_MULTI_PASSWORDED_FILTER 150 +#define IDC_MULTI_FULL_FILTER 151 +#define IDC_MULTI_TYPE_FILTER 152 +#define IDC_MP_NEXT_SESSION 153 +#define IDC_MULTI_BATTLEYE_FILTER 154 +#define IDC_MULTI_EXPANSIONS_FILTER 155 +#define IDC_MULTI_FAVORITE_COLUMN 156 +#define IDC_MULTI_FAVORITE_ICON 157 +#define IDC_MULTI_SERVER_COUNT 158 +#define IDC_MULTI_TAB_INTERNET 159 +#define IDC_MULTI_TAB_RECENT 160 +#define IDC_MULTI_TAB_LAN 161 +#define IDC_MULTI_TAB_FRIENDS 162 +#define IDC_MULTI_TAB_OFFICIAL 163 //Changed 164 to 163 +#define IDC_MULTI_TAB_QUICK_PLAY 164 //IDC_MULTI_QUICK_PLAY renamed to IDC_MULTI_TAB_OFFICIAL, changed to 164 +#define IDC_MULTI_TAB_SERVERS 165 //IDC_MULTI_SERVERS renamed to IDC_MULTI_TAB_SERVERS, changed to 165 +#define IDC_MULTI_TAB_DIRECT_CONNECT 166 //IDC_MULTI_REMOTE 103 renamed and changed to IDC_MULTI_TAB_DIRECT_CONNECT +#define IDC_MULTI_TAB_HOST_SERVER 167 //IDC_MULTI_NEW 104 renamed and changed to IDC_MULTI_TAB_HOST_SERVER +#define IDC_MULTI_LAUNCHER 168 //Launcher button +#define IDC_MP_FILEPATCHING 169 + +//MP Quick Play dialogue +#define IDC_MP_QUICK_GAME_TYPE 110 +#define IDC_MP_QUICK_MAX_PING 111 +#define IDC_MP_QUICK_BEST_SERVER 112 +#define IDC_MP_QUICK_FIND_SERVER 113 +#define IDC_MP_QUICK_SHOW_SERVERS 114 +#define IDC_MP_QUICK_SHOW_SERVERS 114 +#define IDC_MP_QUICK_MODE_TITLE 115 +#define IDC_MP_QUICK_MODE_PICTURE 116 +#define IDC_MP_QUICK_MODE_DESCRIPTION 117 +#define IDC_MP_QUICK_MODE_BACKGROUND 118 + +//Server Search dialogue +#define IDC_MP_SERVER_SEARCH_STATUS 101 +#define IDC_MP_SERVER_SEARCH_PROGRESS 102 + +//Server Found dialogue +#define IDC_MP_SERVER_FOUND_COUNTDOWN 101 +#define IDC_MP_SERVER_FOUND_MISSION 102 +#define IDC_MP_SERVER_FOUND_GAME_TYPE 103 +#define IDC_MP_SERVER_FOUND_PLAYERS 104 +#define IDC_MP_SERVER_FOUND_BUTTON_NEXT 105 +#define IDC_MP_SERVER_FOUND_BUTTON_JOIN 106 + +#define IDC_OPTIMATCH_FILTER_SPEED 101 +#define IDC_OPTIMATCH_FILTER_TYPE 102 +#define IDC_OPTIMATCH_FILTER_MIN_PLAYERS 103 +#define IDC_OPTIMATCH_FILTER_MAX_PLAYERS 104 +#define IDC_OPTIMATCH_FILTER_LANGUAGE 105 +#define IDC_OPTIMATCH_FILTER_DIFFICULTY 106 + +#define IDC_PASSWORD 101 + +#define IDC_IP_ADDRESS 101 +#define IDC_IP_PORT 102 + +#define IDC_PORT_PORT 101 + +#define IDC_FILTER_SERVER 101 +#define IDC_FILTER_MISSION 102 +#define IDC_FILTER_MAXPING 103 +#define IDC_FILTER_MINPLAYERS 104 +#define IDC_FILTER_MAXPLAYERS 105 +#define IDC_FILTER_FULL 106 +#define IDC_FILTER_PASSWORDED 107 +#define IDC_FILTER_DEFAULT 108 +#define IDC_FILTER_TYPE 109 +#define IDC_FILTER_BATTLEYE 110 +#define IDC_FILTER_EXPANSIONS 111 +#define IDC_FILTER_MONETIZED 112 + +#define IDC_CLIENT_TEXT 101 +#define IDC_CLIENT_PLAYERS 102 +#define IDC_CLIENT_PROGRESS 103 + +#define IDC_SERVER_ISLAND 101 +#define IDC_SERVER_MISSION 102 +#define IDC_SERVER_EDITOR 103 +#define IDC_SERVER_DIFF 104 +#define IDC_SERVER_PLAYERS 105 +#define IDC_SERVER_GAMETYPE 106 +#define IDC_SERVER_SLOTS 107 +#define IDC_SERVER_SLOTS_PRIVATE 108 +#define IDC_SERVER_SLOTS_PUBLIC 109 +#define IDC_SERVER_MIN_PLAYERS 110 +#define IDC_SERVER_MAX_PLAYERS 111 +#define IDC_SERVER_SLOTS_PRIVATE_TITLE 112 +#define IDC_SERVER_SLOTS_PRIVATE_TEXT 112 +#define IDC_SERVER_SLOTS_PUBLIC_TITLE 113 +#define IDC_SERVER_SLOTS_PUBLIC_TEXT 113 +#define IDC_SERVER_SLOTS_PUBLIC_VALUE 114 +#define IDC_SERVER_SLOTS_PRIVATE_VALUE 115 +#define IDC_SERVER_VOTED_MISSIONS 116 +#define IDC_SERVER_PLAYERS_TITLE 117 +#define IDC_SERVER_TIMEOUT 118 +#define IDC_SERVER_VOTED_DIFFICULTY 119 +#define IDC_SERVER_DELETE 120 +#define IDC_SERVER_COPY 121 +#define IDC_SERVER_EDIT 122 +#define IDC_SERVER_LOAD 123 +#define IDC_SERVER_PRIVATE_SLOTS_TITLE 124 +#define IDC_SERVER_PRIVATE_SLOTS_VALUE 125 +#define IDC_SERVER_PRIVATE_SLOTS 126 +#define IDC_SERVER_MAXIMUM_SLOTS_TITLE 127 +#define IDC_SERVER_MAXIMUM_SLOTS 128 +#define IDC_SERVER_MAXIMUM_SLOTS_VALUE 129 +#define IDC_SERVER_MI_OVERVIEW 130 +#define IDC_SERVER_MI_GAMETYPE 131 +#define IDC_SERVER_MI_MAX_PLAYERS 132 +#define IDC_SERVER_MI_RESPAWN 133 +#define IDC_SERVER_MI_MIN_PLAYERS 134 +#define IDC_SERVER_SHOW_MISSION_WORKSHOP 135 +#define IDC_SERVER_SHOW_GAME_WORKSHOP 136 +#define IDC_SERVER_MI_NAME 137 +#define IDC_SERVER_MI_AUTHOR 138 +#define IDC_SERVER_MI_PICTURE 139 +#define IDC_SERVER_MI_DESCRIPTION 140 +#define IDC_SERVER_LOADING_PICTURE 141 +#define IDC_SERVER_GAME_OR_MISSION_WORKSHOP 142 +#define IDC_SERVER_ISLAND_TITLE 143 +#define IDC_SERVER_MISSION_TITLE 144 +#define IDC_SERVER_DIFF_INDICATOR 145 +#define IDC_SERVER_PURCHASE_BUTTON 146 + + +#define IDC_REQUIRED_BATTLEYE 201 + +// _VBS3 +#define IDC_AAR_SERVER 121 +#define IDC_AAR_SERVER_FILES 122 +#define IDC_AAR_DOWNLOADPROGRESS 123 +#define IDC_AAR_DOWNLOADSTART 124 +#define IDC_AAR_DOWNLOADSTOP 125 + +// Host settings dialog +#define IDC_HOST_NAME 101 +#define IDC_HOST_PASSWORD 102 +#define IDC_HOST_MAX_PLAYERS 103 +#define IDC_HOST_PRIVATE 104 +#define IDC_HOST_PORT 105 +#define IDC_HOST_PORT_WARNING 106 +#define IDC_HOST_UPNP 107 + +#define IDC_DED_SERVER_SLOTS_PUBLIC 101 +#define IDC_DED_SERVER_SLOTS_PUBLIC_TITLE 102 +#define IDC_DED_SERVER_SLOTS_PUBLIC_VALUE 103 +#define IDC_DED_SERVER_SLOTS_PRIVATE 104 +#define IDC_DED_SERVER_SLOTS_PRIVATE_TITLE 105 +#define IDC_DED_SERVER_SLOTS_PRIVATE_VALUE 106 + +#define IDC_WIZT_TEMPLATES 101 +#define IDC_WIZT_OVERVIEW 102 +#define IDC_WIZT_NAME 103 + +#define IDC_WIZM_EDIT 101 + +#define IDC_SRVSETUP_PLAYERS 101 +#define IDC_SRVSETUP_UNITS 102 +#define IDC_SRVSETUP_ISLAND 103 +#define IDC_SRVSETUP_NAME 104 +#define IDC_SRVSETUP_DESC 105 +#define IDC_SRVSETUP_ASSIGN 106 +#define IDC_SRVSETUP_UNASSIGN 107 +#define IDC_SRVSETUP_RANDOM 108 +#define IDC_SRVSETUP_PARAM1 109 +#define IDC_SRVSETUP_PARAM1_TEXT 110 +#define IDC_SRVSETUP_PARAM2 111 +#define IDC_SRVSETUP_PARAM2_TEXT 112 + +#define IDC_SRVSIDE_NAME 101 +#define IDC_SRVSIDE_ISLAND 102 +#define IDC_SRVSIDE_POOL 103 +#define IDC_SRVSIDE_WEST 104 +#define IDC_SRVSIDE_EAST 105 +#define IDC_SRVSIDE_RESIST 106 +#define IDC_SRVSIDE_CIVIL 107 +#define IDC_SRVSIDE_WEST_TEXT 108 +#define IDC_SRVSIDE_EAST_TEXT 109 +#define IDC_SRVSIDE_RESIST_TEXT 110 +#define IDC_SRVSIDE_CIVIL_TEXT 111 +#define IDC_SRVSIDE_DEFAULT 112 +#define IDC_SRVSIDE_PARAM1 113 +#define IDC_SRVSIDE_PARAM1_TEXT 114 +#define IDC_SRVSIDE_PARAM2 115 +#define IDC_SRVSIDE_PARAM2_TEXT 116 +#define IDC_SRVSIDE_PLAYERS 117 + +#define IDC_MPROLE_TITLE 101 +#define IDC_MPROLE_NAME 102 +#define IDC_MPROLE_ISLAND 103 +#define IDC_MPROLE_DESC 104 +#define IDC_MPROLE_POOL 105 +#define IDC_MPROLE_POOL_TEXT 106 +#define IDC_MPROLE_ROLES 107 +#define IDC_MPROLE_DEFAULT 108 +#define IDC_MPROLE_ENABLE 109 +#define IDC_MPROLE_SIDES 110 +#define IDC_MPROLE_ENABLE_ALL 111 + +#define IDC_CLIENT_GAME 101 + +#define IDC_CLIENTMAP_START1 101 +#define IDC_CLIENTMAP_START2 102 + +#define IDC_CLIENT_READY_PLAYERS 120 +#define IDC_CLIENT_READY_PLAYERS_TITLE 121 +#define IDC_CLIENT_READY_TIMEOUT 122 + +#define IDC_SERVER_READY_PLAYERS 120 +#define IDC_SERVER_READY_PLAYERS_TITLE 121 + +#define IDC_MP_PLAYERS 101 +#define IDC_MP_PL 102 +#define IDC_MP_PL_NAME 103 +#define IDC_MP_PL_MAIL 104 +#define IDC_MP_PL_ICQ 105 +#define IDC_MP_PL_REMARK 106 +#define IDC_MP_SQ 107 +#define IDC_MP_SQ_NAME 108 +#define IDC_MP_SQ_ID 109 +#define IDC_MP_SQ_MAIL 110 +#define IDC_MP_SQ_WEB 111 +#define IDC_MP_SQ_PICTURE 112 +#define IDC_MP_SQ_TITLE 113 +#define IDC_MP_KICKOFF 114 +#define IDC_MP_BAN 115 +#define IDC_MP_PL_MISSION 116 +#define IDC_MP_PL_ISLAND 117 +#define IDC_MP_PL_TIME 118 +#define IDC_MP_PL_MINPING 119 +#define IDC_MP_PL_AVGPING 120 +#define IDC_MP_PL_MAXPING 121 +#define IDC_MP_PL_MINBAND 122 +#define IDC_MP_PL_AVGBAND 123 +#define IDC_MP_PL_MAXBAND 124 +#define IDC_MP_PL_DESYNC 125 +#define IDC_MP_PL_REST 126 +#define IDC_MP_MUTE 127 + +#define IDC_CLIENT_WAIT_TITLE 130 // is used together with MP_PL + +#define IDC_MPSETUP_NAME 101 +#define IDC_MPSETUP_ISLAND 102 +#define IDC_MPSETUP_DESC 103 +#define IDC_MPSETUP_WEST 104 +#define IDC_MPSETUP_EAST 105 +#define IDC_MPSETUP_GUERRILA 106 +#define IDC_MPSETUP_CIVILIAN 107 +#define IDC_MPSETUP_ROLES_TITLE 108 +#define IDC_MPSETUP_ROLES 109 +#define IDC_MPSETUP_PARAM1_TITLE 110 +#define IDC_MPSETUP_PARAM1 111 +#define IDC_MPSETUP_PARAM2_TITLE 112 +#define IDC_MPSETUP_PARAM2 113 +#define IDC_MPSETUP_POOL 114 +#define IDC_MPSETUP_MESSAGE 115 +#define IDC_MPSETUP_KICK 116 +#define IDC_MPSETUP_ENABLE_ALL 117 +#define IDC_MPSETUP_LOCK 118 +#define IDC_MPSETUP_SIDE 119 +#define IDC_MPSETUP_POOL_TITLE 120 +#define IDC_MPSETUP_TIMEOUT 121 +#define IDC_MPSETUP_PLAYERS 122 +#define IDC_MPSETUP_FRIENDS 123 +#define IDC_MPSETUP_ADVANCED 124 +#define IDC_MPSETUP_GAMERCARD 125 +#define IDC_MPSETUP_PARTYGUI 126 +#define IDC_MPSETUP_ASSIGNROLE 127 +#define IDC_MPSETUP_PARAMS 128 +#define IDC_MPSETUP_DSINTERFACE 129 +#define IDC_MPSETUP_MISSION_WORKSHOP 130 +#define IDC_MPSETUP_LOGIC 131 +#define IDC_MPSETUP_VIRTUAL 132 +#define IDC_MPSETUP_PLAYERS_BUTTON 133 +#define IDC_MPSETUP_PLAYERS_SORT 134 +#define IDC_MPSETUP_PING_BUTTON 135 +#define IDC_MPSETUP_PING_SORT 136 +#define IDC_MPSETUP_MUTE_ALL 137 + +#define IDC_MPSETUP_MSG_MESSAGE 101 +#define IDC_MPSETUP_MSG_PROGRESS 102 +#define IDC_MPSETUP_MSG_TIME 103 + +#define IDC_PROGRESS_MSG_MESSAGE 101 +#define IDC_PROGRESS_MSG_PROGRESS 102 +#define IDC_PROGRESS_MSG_TIME 103 + +#define IDC_SERVER_SETTINGS_PARAM1_TEXT 101 +#define IDC_SERVER_SETTINGS_PARAM1 102 +#define IDC_SERVER_SETTINGS_PARAM2_TEXT 103 +#define IDC_SERVER_SETTINGS_PARAM2 104 +#define IDC_SERVER_SETTINGS_AI 105 +#define IDC_SERVER_SETTINGS_ASSIGN 106 + +#define IDC_SERVER_ADVANCED_ROLES 101 +#define IDC_SERVER_ADVANCED_DISABLE_ALL 102 +#define IDC_SERVER_ADVANCED_AUTOASSIGN 103 + +#define IDC_SERVER_SELECT_PLAYERS 101 + +// Main map display controls +#define IDC_MAP_WATCH 101 +#define IDC_MAP_COMPASS 102 +#define IDC_MAP_WALKIE_TALKIE 103 +#define IDC_MAP_NOTEPAD 104 +#define IDC_MAP_WARRANT 105 +#define IDC_MAP_GPS 106 +#define IDC_MAP_TEXTURES 107 +#define IDC_MAP_BRIEFING_SHOW 108 +#define IDC_MAP_BRIEFING_PAGE 109 +#define IDC_MAP_PREV_MARKER 110 +#define IDC_MAP_NEXT_MARKER 111 +#define IDC_MAP_GEAR 112 + +// Diary display controls +#define IDC_DIARY 101 +#define IDC_DIARY_INDEX 102 +#define IDC_DIARY_PAGE 103 +#define IDC_DIARY_ADD 104 + +// Select island display controls +#define IDC_SELECT_ISLAND 101 +#define IDC_SELECT_ISLAND_NOTEBOOK 102 +#define IDC_SELECT_ISLAND_WIZARD 103 +#define IDC_SELECT_ISLAND_EDITOR 104 +#define IDC_SELECT_ISLAND_EDITOR_OLD 105 +//Redefined in Eden +//IDC_SELECT_ISLAND_EDITOR_OLD 105 +//IDC_SELECT_ISLAND_3DEN 106 +#define IDC_SELECT_ISLAND_BUTTON_PURCHASE 107 + +// Custom arcade display controls +#define IDC_CUST_GAME 101 +#define IDC_CUST_PLAY 102 +#define IDC_CUST_EDIT 103 +#define IDC_CUST_DELETE 104 +#define IDC_CUST_EDIT_2 105 + +#define IDC_MISSION_PARAMS_LABEL 101 +#define IDC_MISSION_PARAMS_COMBO 102 + +#define IDC_ARCMAP_LOAD 101 +#define IDC_ARCMAP_SAVE 102 +#define IDC_ARCMAP_CLEAR 103 +#define IDC_ARCMAP_MODE 104 +#define IDC_ARCMAP_INTEL 105 +#define IDC_ARCMAP_MERGE 106 +#define IDC_ARCMAP_PREVIEW 107 +#define IDC_ARCMAP_CONTINUE 108 +#define IDC_ARCMAP_SECTION 109 +#define IDC_ARCMAP_IDS 111 +#define IDC_ARCMAP_TEXTURES 112 +#define IDC_ARCMAP_MISSION_NAME 113 +#define IDC_ARCMAP_MAP 114 +#define IDC_ARCMAP_BACKGROUND 115 +#define IDC_ARCMAP_LAYOUT 116 +#define IDC_ARCMAP_PUBLISH_MISSION 117 + +#define IDC_ARCUNIT_TITLE 101 +#define IDC_ARCUNIT_SIDE 102 +#define IDC_ARCUNIT_VEHICLE 103 +#define IDC_ARCUNIT_RANK 104 +#define IDC_ARCUNIT_CTRL 105 +#define IDC_ARCUNIT_CLASS 107 +#define IDC_ARCUNIT_HEALTH 108 +#define IDC_ARCUNIT_FUEL 109 +#define IDC_ARCUNIT_AMMO 110 +#define IDC_ARCUNIT_AZIMUT 111 +#define IDC_ARCUNIT_SPECIAL 112 +#define IDC_ARCUNIT_AGE 113 +#define IDC_ARCUNIT_AZIMUT_PICTURE 114 +#define IDC_ARCUNIT_PLACE 115 +#define IDC_ARCUNIT_PRESENCE 116 +#define IDC_ARCUNIT_PRESENCE_COND 117 +#define IDC_ARCUNIT_TEXT 118 +#define IDC_ARCUNIT_LOCK 119 +#define IDC_ARCUNIT_INIT 120 +#define IDC_ARCUNIT_SKILL 121 +#define IDC_ARCUNIT_DESC 122 +#define IDC_ARCUNIT_FACTION 123 +#define IDC_ARCUNIT_ELEVATION 124 +#define IDC_ARCUNIT_EQUIP 125 +#define IDC_ARCUNIT_RADIUS 126 +#define IDC_ARCUNIT_ARGUMENTS 127 +#define IDC_ARCUNIT_CATEGORY 128 +#define IDC_ARCUNIT_SETTINGS 2301 + +#define IDC_ARCGRP_SIDE 101 +#define IDC_ARCGRP_TYPE 102 +#define IDC_ARCGRP_NAME 103 +#define IDC_ARCGRP_AZIMUT 104 +#define IDC_ARCGRP_AZIMUT_PICTURE 105 +#define IDC_ARCGRP_FACTION 106 +#define IDC_ARCGRP_UNITS_LIST 107 + +#define IDC_ARCWP_TITLE 101 +#define IDC_ARCWP_TYPE 102 +#define IDC_ARCWP_SEQ 103 +#define IDC_ARCWP_DESC 104 +#define IDC_ARCWP_SEMAPHORE 105 +#define IDC_ARCWP_FORM 106 +#define IDC_ARCWP_SPEED 107 +#define IDC_ARCWP_COMBAT 108 +#define IDC_ARCWP_PLACE 109 +#define IDC_ARCWP_EFFECTS 110 +#define IDC_ARCWP_TIMEOUT_MIN 111 +#define IDC_ARCWP_TIMEOUT_MAX 112 +#define IDC_ARCWP_TIMEOUT_MID 113 +#define IDC_ARCWP_HOUSEPOS 114 +#define IDC_ARCWP_HOUSEPOSTEXT 115 +#define IDC_ARCWP_EXPACTIV 116 +#define IDC_ARCWP_SHOW 117 +#define IDC_ARCWP_EXPCOND 118 +#define IDC_ARCWP_SCRIPT 119 +#define IDC_ARCWP_PREC 120 +#define IDC_ARCWP_HEIGHT 121 +#define IDC_ARCWP_HEIGHTTEXT 122 +#define IDC_ARCWP_SCRIPTTEXT 123 +#define IDC_ARCWP_CATEGORY 124 + +#define IDC_ARCWP_ARGUMENTS 125 +#define IDC_ARCWP_ARGUMENTSTEXT 126 +#define IDC_ARCWP_NAME 127 + +#define IDC_ARCEFF_SOUND 103 +#define IDC_ARCEFF_VOICE 104 +#define IDC_ARCEFF_SOUND_ENV 105 +#define IDC_ARCEFF_SOUND_DET 106 +#define IDC_ARCEFF_MUSIC 107 +#define IDC_ARCEFF_TITTYPE 108 +#define IDC_ARCEFF_TITEFF 109 +#define IDC_ARCEFF_TITTEXT 110 +#define IDC_ARCEFF_TITRES 111 +#define IDC_ARCEFF_TITOBJ 112 +//#define IDC_ARCEFF_PLAYERONLY 113 +#define IDC_ARCEFF_CONDITION 113 +#define IDC_ARCEFF_TEXT_TITTEXT 114 + +#define IDC_ARCSENS_TITLE 101 +#define IDC_ARCSENS_A 102 +#define IDC_ARCSENS_B 103 +#define IDC_ARCSENS_ANGLE 104 +#define IDC_ARCSENS_ACTIV 105 +#define IDC_ARCSENS_PRESENCE 106 +#define IDC_ARCSENS_REPEATING 107 +#define IDC_ARCSENS_INTERRUPT 108 +#define IDC_ARCSENS_TIMEOUT_MIN 109 +#define IDC_ARCSENS_TIMEOUT_MAX 110 +#define IDC_ARCSENS_TIMEOUT_MID 111 +#define IDC_ARCSENS_TYPE 112 +#define IDC_ARCSENS_OBJECT 113 +#define IDC_ARCSENS_TEXT 114 +#define IDC_ARCSENS_AGE 115 +#define IDC_ARCSENS_EFFECTS 116 +#define IDC_ARCSENS_EXPCOND 117 +#define IDC_ARCSENS_EXPACTIV 118 +#define IDC_ARCSENS_EXPDESACTIV 119 +#define IDC_ARCSENS_RECT 120 +#define IDC_ARCSENS_NAME 121 + +#define IDC_ARCMARK_TITLE 101 +#define IDC_ARCMARK_NAME 102 +#define IDC_ARCMARK_MARKER 103 +#define IDC_ARCMARK_TYPE 104 +#define IDC_ARCMARK_COLOR 105 +#define IDC_ARCMARK_A 106 +#define IDC_ARCMARK_B 107 +#define IDC_ARCMARK_ANGLE 108 +#define IDC_ARCMARK_TYPE_TEXT 109 +#define IDC_ARCMARK_FILL 110 +#define IDC_ARCMARK_TEXT 111 + +#define IDC_INTEL_RESISTANCE 101 +#define IDC_INTEL_MONTH 102 +#define IDC_INTEL_DAY 103 +#define IDC_INTEL_HOUR 104 +#define IDC_INTEL_MINUTE 105 +#define IDC_INTEL_BRIEFING_NAME 106 +#define IDC_INTEL_BRIEFING_DESC 107 +#define IDC_INTEL_WEATHER 108 +#define IDC_INTEL_FOG 109 +#define IDC_INTEL_WEATHER_FORECAST 110 +#define IDC_INTEL_FOG_FORECAST 111 +#define IDC_INTEL_YEAR 112 +//added by MUF - new intel dialog-------------------------- +#define IDC_INTEL_WEATHER_TB 113 +#define IDC_INTEL_WEATHER_FORECAST_TB 114 + +#define IDC_INTEL_FOG_CB 115 +#define IDC_INTEL_FOG_TB 116 +#define IDC_INTEL_FOG_FORECAST_TB 117 + +#define IDC_INTEL_RAIN_CB 118 +#define IDC_INTEL_RAIN 119 +#define IDC_INTEL_RAIN_TB 120 +#define IDC_INTEL_RAIN_FORECAST 121 +#define IDC_INTEL_RAIN_FORECAST_TB 122 + +#define IDC_INTEL_LIGHTN_CB 123 +#define IDC_INTEL_LIGHTN 124 +#define IDC_INTEL_LIGHTN_TB 125 +#define IDC_INTEL_LIGHTN_FORECAST 126 +#define IDC_INTEL_LIGHTN_FORECAST_TB 127 + +#define IDC_INTEL_WAVES_CB 128 +#define IDC_INTEL_WAVES 129 +#define IDC_INTEL_WAVES_TB 130 +#define IDC_INTEL_WAVES_FORECAST 131 +#define IDC_INTEL_WAVES_FORECAST_TB 132 + +#define IDC_INTEL_WIND_CB 133 +#define IDC_INTEL_STRENGTH 134 +#define IDC_INTEL_STRENGTH_TB 135 +#define IDC_INTEL_STRENGTH_FORECAST 136 +#define IDC_INTEL_STRENGTH_FORECAST_TB 137 + +#define IDC_INTEL_GUSTS 138 +#define IDC_INTEL_GUSTS_TB 139 +#define IDC_INTEL_GUSTS_FORECAST 140 +#define IDC_INTEL_GUSTS_FORECAST_TB 141 + +#define IDC_INTEL_WINDDIR 142 +#define IDC_INTEL_WINDDIR_TB 143 +#define IDC_INTEL_WINDDIR_FORECAST 144 +#define IDC_INTEL_WINDDIR_FORECAST_TB 145 + +#define IDC_INTEL_CHNGTIME 146 +#define IDC_INTEL_CHNGTIME_HOUR_TB 147 +#define IDC_INTEL_CHNGTIME_MIN_TB 148 + +#define IDC_INTEL_CHNGTIME_HLEFT 149 +#define IDC_INTEL_CHNGTIME_HMIDDLE 150 +#define IDC_INTEL_CHNGTIME_HRIGHT 151 + +//added by MUF - new intel dialog-------------------------- + +// Dialog for choosing Editor's layout +#define IDC_LAYOUT_LIST 101 +#define IDC_LAYOUT_PICTURE 102 + +// Chat +#define IDC_CHANNEL 101 +#define IDC_CHANNEL_VOICE 102 +#define IDC_CHANNEL_MUTE_VON 103 +#define IDC_CHANNEL_MUTE_CHAT 104 + +#define IDC_CHAT 101 + +#define IDC_VOICE_CHAT 101 + +// Save / load template +#define IDC_TEMPL_NAME 101 +#define IDC_TEMPL_TITLE 102 +#define IDC_TEMPL_MODE 103 +#define IDC_TEMPL_ISLAND 104 + +// publish / update to Steam workshop +#define IDC_PUBLISH_STEAM_TITLE 101 +#define IDC_PUBLISH_STEAM_TAGS 102 +#define IDC_PUBLISH_STEAM_PICTURE 103 +#define IDC_PUBLISH_STEAM_DESCRIPTION 104 +#define IDC_PUBLISH_STEAM_MISSION_LIST 105 +#define IDC_PUBLISH_STEAM_VISIBILITY 106 +#define IDC_PUBLISH_STEAM_CHANGE_NOTES 107 +#define IDC_PUBLISH_STEAM_PREVIEW_FILE 108 +#define IDC_PUBLISH_CHECKBOX_LICENCE 109 +#define IDC_PUBLISH_TEXT_MISSION_SIZE 110 +#define IDC_PUBLISH_TEXT_QUOTA 111 +#define IDC_PUBLISH_BUTTON_PUBLISH 112 +#define IDC_PUBLISH_BUTTON_UPDATE 113 +#define IDC_PUBLISH_BUTTON_DELETE 114 +#define IDC_PUBLISH_BUTTON_EDIT_TAGS 115 +#define IDC_PUBLISH_BUTTON_WORKSHOP 116 +#define IDC_PUBLISH_BUTTON_WORKSHOP_LICENCE 117 +#define IDC_PUBLISH_BUTTON_SELECT_PREVIEW 118 +#define IDC_PUBLISH_BUTTON_DEFAULT_PREVIEW 119 +#define IDC_PUBLISH_STORAGE_SLIDER 120 +// group that is hidden when new mission is selected and shown when already uploaded mission is selected +#define IDC_PUBLISH_STEAM_HIDE_NEW_MISSION 121 +// group that is shown when new mission is selected and hidden when already uploaded mission is selected +#define IDC_PUBLISH_STEAM_SHOW_NEW_MISSION 122 + +// publish / update to Steam workshop - tags dialog +#define IDC_PUBLISH_STEAM_TAGS_AVAILABLE 101 +#define IDC_PUBLISH_STEAM_TAGS_SELECTED 102 +#define IDC_PUBLISH_STEAM_TAGS_ADD 103 +#define IDC_PUBLISH_STEAM_TAGS_REMOVE 104 +#define IDC_PUBLISH_STEAM_TAGS_NEXT 105 +#define IDC_PUBLISH_STEAM_TAGS_BACK 106 +#define IDC_PUBLISH_STEAM_TAGS_TITLE 107 + +// select file dialog +#define IDC_FILE_SELECT_PATH 101 +#define IDC_FILE_SELECT_DIR_TREE 102 +#define IDC_FILE_SELECT_FILE_LIST 103 +#define IDC_FILE_SELECT_PREVIEW 104 + + +//Login display +#define IDC_LOGIN_USER_LIST 101 +#define IDC_LOGIN_EDIT 102 +#define IDC_LOGIN_NEW_USER 103 +#define IDC_LOGIN_DELETE 104 +#define IDC_LOGIN_NAME 105 +#define IDC_LOGIN_FACE 106 +#define IDC_LOGIN_SPEAKER 107 +#define IDC_LOGIN_PITCH 108 +#define IDC_LOGIN_HEAD 109 +#define IDC_LOGIN_GLASSES 110 +#define IDC_LOGIN_ID 111 +#define IDC_LOGIN_SQUAD 112 +#define IDC_LOGIN_SQUAD_TEXT 113 +#define IDC_LOGIN_DISCARD 114 +#define IDC_LOGIN_TAB_AVATAR 115 +#define IDC_LOGIN_TAB_UNIT 116 +#define IDC_LOGIN_UNIT_SELECT 117 +#define IDC_LOGIN_UNIT_LOGO 118 +#define IDC_LOGIN_UNIT_NAME 119 +#define IDC_LOGIN_UNIT_MOTTO 120 +#define IDC_LOGIN_UNIT_DESCRIPTION 121 +#define IDC_LOGIN_ID_TEXT 122 +#define IDC_LOGIN_REFRESH 123 + +// Interrupt display +#define IDC_INT_OPTIONS 101 +#define IDC_INT_LOAD 102 +#define IDC_INT_SAVE 103 +#define IDC_INT_ABORT 104 +#define IDC_INT_RETRY 105 +#define IDC_INT_TITLE 106 +#define IDC_INT_SETTINGS 107 +#define IDC_INT_FRIENDS 108 +#define IDC_INT_PLAYERS 109 +#define IDC_INT_APPEAR_OFFLINE 110 +#define IDC_INT_MISSION 111 +#define IDC_INT_SIGN_IN_STATUS 112 +#define IDC_INT_EDIT_MAP 113 +#define IDC_INT_EDIT_3D 114 +#define IDC_INT_EDIT_PREVIEW 115 +#define IDC_INT_EDIT_REALTIME 116 +#define IDC_INT_RESTART 117 +#define IDC_INT_DIARY 118 +#define IDC_INT_REVERT 119 +#define IDC_INT_MISSIONNAME 120 +#define IDC_INT_TRAFFIC_LIGHT 121 +#define IDC_INT_FIELD_MANUAL 122 + +// Interrupt revert display +#define IDC_INT_REVERT_TYPE 101 + +// Select save display +#define IDC_SELECT_SAVE_SLOTS 101 + +// Mission end display +#define IDC_ME_SUBTITLE 101 +#define IDC_ME_QUOTATION 102 +#define IDC_ME_AUTHOR 103 +#define IDC_ME_RETRY 104 +#define IDC_ME_LOAD 105 +#define IDC_ME_RESTART 106 +#define IDC_ME_TEAM_SWITCH 107 + +// Get ready display +#define IDC_GETREADY_NAME 101 +#define IDC_GETREADY_DESC 102 +#define IDC_GETREADY_PRIMARY 105 +#define IDC_GETREADY_SECONDARY 106 +#define IDC_GETREADY_PLAYER 107 +#define IDC_GETREADY_DATE 108 +#define IDC_GETREADY_MODE 110 +#define IDC_GETREADY_PRIMARY_TEXT 111 +#define IDC_GETREADY_SECONDARY_TEXT 112 +#define IDC_GETREADY_EDITMODE 113 +#define IDC_GETREADY_TITLE 114 + +#define IDC_GEAR_UNIT 101 +#define IDC_GEAR_SKILL 102 +#define IDC_GEAR_VEHICLE 103 +#define IDC_GEAR_POOL 105 +#define IDC_GEAR_OVERVIEW 106 +#define IDC_GEAR_SLOT_PRIMARY 107 +#define IDC_GEAR_SLOT_SECONDARY 108 +#define IDC_GEAR_SLOT_ITEM1 109 +#define IDC_GEAR_SLOT_ITEM2 110 +#define IDC_GEAR_SLOT_ITEM3 111 +#define IDC_GEAR_SLOT_ITEM4 112 +#define IDC_GEAR_SLOT_ITEM5 113 +#define IDC_GEAR_SLOT_ITEM6 114 +#define IDC_GEAR_SLOT_ITEM7 115 +#define IDC_GEAR_SLOT_ITEM8 116 +#define IDC_GEAR_SLOT_ITEM9 117 +#define IDC_GEAR_SLOT_ITEM10 118 +#define IDC_GEAR_SLOT_ITEM11 119 +#define IDC_GEAR_SLOT_ITEM12 120 +#define IDC_GEAR_SLOT_HANDGUN 121 +#define IDC_GEAR_SLOT_HANGUN_ITEM1 122 +#define IDC_GEAR_SLOT_HANGUN_ITEM2 123 +#define IDC_GEAR_SLOT_HANGUN_ITEM3 124 +#define IDC_GEAR_SLOT_HANGUN_ITEM4 125 +#define IDC_GEAR_SLOT_HANGUN_ITEM5 126 +#define IDC_GEAR_SLOT_HANGUN_ITEM6 127 +#define IDC_GEAR_SLOT_HANGUN_ITEM7 128 +#define IDC_GEAR_SLOT_HANGUN_ITEM8 129 +#define IDC_GEAR_SLOT_SPECIAL1 130 +#define IDC_GEAR_SLOT_SPECIAL2 131 +#define IDC_GEAR_REARM 132 +#define IDC_GEAR_CONTINUE 133 +#define IDC_GEAR_SLOT_INVENTORY1 134 +#define IDC_GEAR_SLOT_INVENTORY2 135 +#define IDC_GEAR_SLOT_INVENTORY3 136 +#define IDC_GEAR_SLOT_INVENTORY4 137 +#define IDC_GEAR_SLOT_INVENTORY5 138 +#define IDC_GEAR_SLOT_INVENTORY6 139 +#define IDC_GEAR_SLOT_INVENTORY7 140 +#define IDC_GEAR_SLOT_INVENTORY8 141 +#define IDC_GEAR_SLOT_INVENTORY9 142 +#define IDC_GEAR_SLOT_INVENTORY10 143 +#define IDC_GEAR_SLOT_INVENTORY11 144 +#define IDC_GEAR_SLOT_INVENTORY12 145 + +#define IDC_GEAR_ADD_ITEM 146 +#define IDC_GEAR_REMOVE_ITEM 147 + +#define IDC_GEAR_FILTER 148 +#define IDC_GEAR_FILTER_ICON1 149 +#define IDC_GEAR_FILTER_ICON2 150 +#define IDC_GEAR_FILTER_ICON3 151 +#define IDC_GEAR_FILTER_ICON4 152 +#define IDC_GEAR_FILTER_ICON5 153 +#define IDC_GEAR_FILTER_ICON6 154 + +#define IDC_GEAR_POOL_GROUP 155 +#define IDC_GEAR_SOURCE_NAME 156 +#define IDC_GEAR_OPEN_BAG 157 +#define IDC_GEAR_CLOSE_BAG 158 +#define IDC_GEAR_ADD_DEFAULT 255 +#define IDC_GEAR_CLEAR_ALL 256 +#define IDC_BAG_ITEMS_GROUP 159 +#define IDC_UNIT_ITEMS_GROUP 160 + +#define IDC_GEAR_BAG_EMPTY 5000 +/* +#define IDC_GEAR_BAG_EMPTY_SLOT1 5000 +#define IDC_GEAR_BAG_EMPTY_SLOT2 5001 +#define IDC_GEAR_BAG_EMPTY_SLOT3 5002 +. +. +. +#define IDC_GEAR_BAG_EMPTY_SLOT499 5498 +#define IDC_GEAR_BAG_EMPTY_SLOT500 5499 +*/ +#define IDC_GEAR_BAG_FULL 5500 + +// Debriefing +/* +#define IDC_DEBRIEFING_LEFT 101 +#define IDC_DEBRIEFING_RIGHT 102 +*/ +#define IDC_DEBRIEFING_STAT 103 +#define IDC_DEBRIEFING_RESTART 104 +#define IDC_DEBRIEFING_PAD2 105 +#define IDC_DEBRIEFING_PLAYERS_TITLE_BG 106 +#define IDC_DEBRIEFING_PLAYERS_TITLE 107 +#define IDC_DEBRIEFING_PLAYERS_BG 108 +#define IDC_DEBRIEFING_PLAYERS 109 +#define IDC_DEBRIEFING_TIMEOUT 110 +#define IDC_DEBRIEFING_RESULT 111 +#define IDC_DEBRIEFING_TITLE 112 +#define IDC_DEBRIEFING_DEBRIEFING 113 +#define IDC_DEBRIEFING_OBJECTIVES 114 +#define IDC_DEBRIEFING_INFO 115 +#define IDC_DEBRIEFING_SHOW_PLAYERS 116 +#define IDC_DEBRIEFING_SHOW_PAGE2 117 +#define IDC_DEBRIEFING_LIVE_STATS 118 +#define IDC_DEBRIEFING_PREV_PAGE 119 +#define IDC_DEBRIEFING_NEXT_PAGE 120 +#define IDC_DEBRIEFING_LOAD 121 +#define IDC_DEBRIEFING_TEXT_GROUP 122 +#define IDC_DEBRIEFING_OBJECTIVES_GROUP 123 +#define IDC_DEBRIEFING_STATS_GROUP 124 +#define IDC_DEBRIEFING_MISSION_WORKSHOP 125 +#define IDC_DEBRIEFING_READY 126 +#define IDC_DEBRIEFING_DISCONNECT 127 + +// Debug display +#define IDC_DEBUG_EXP 101 +#define IDC_DEBUG_APPLY 102 +#define IDC_DEBUG_LOG 103 +#define IDC_DEBUG_SEARCH 161 +#define IDC_DEBUG_SEARCH_BUTTON 162 +#define IDC_DEBUG_HISTORY 163 + +#define IDC_DEBUG_EXP1 121 +#define IDC_DEBUG_EXP2 122 +#define IDC_DEBUG_EXP3 123 +#define IDC_DEBUG_EXP4 124 + +#define IDC_DEBUG_RES1 141 +#define IDC_DEBUG_RES2 142 +#define IDC_DEBUG_RES3 143 +#define IDC_DEBUG_RES4 144 + +#define IDC_DEBUG_CLEAR_LOG 151 +#define IDC_DEBUG_FILTER_EDIT 152 + +// Debug PhysX Display +#define IDC_PHYSX_DEBUG_DIAGMODE 101 +#define IDC_PHYSX_DEBUG_DIAGMODEDRAW 102 + +#define IDC_PHYSX_DEBUG_TERRAIN 103 +#define IDC_PHYSX_DEBUG_STATIC 104 +#define IDC_PHYSX_DEBUG_KINEMATIC 105 +#define IDC_PHYSX_DEBUG_DYNAMIC 106 + +#define IDC_PHYSX_DEBUG_CHECK_BUTTONS_START 109 +#define IDC_PHYSX_DEBUG_WORLD_AXES 110 +#define IDC_PHYSX_DEBUG_BODY_AXES 111 +#define IDC_PHYSX_DEBUG_BODY_MASS_AXES 112 +#define IDC_PHYSX_DEBUG_BODY_LIN_VELOCITY 113 +#define IDC_PHYSX_DEBUG_BODY_ANG_VELOCITY 114 +#define IDC_PHYSX_DEBUG_BODY_JOINT_GROUPS 115 +#define IDC_PHYSX_DEBUG_JOINT_LOCAL_AXES 116 +#define IDC_PHYSX_DEBUG_JOINT_WORLD_AXES 117 +#define IDC_PHYSX_DEBUG_JOINT_LIMITS 118 +#define IDC_PHYSX_DEBUG_CONTACT_POINT 119 +#define IDC_PHYSX_DEBUG_CONTACT_NORMAL 120 +#define IDC_PHYSX_DEBUG_CONTACT_ERROR 121 +#define IDC_PHYSX_DEBUG_CONTACT_FORCE 122 +#define IDC_PHYSX_DEBUG_ACTOR_AXES 123 +#define IDC_PHYSX_DEBUG_COLLISION_AABBS 124 +#define IDC_PHYSX_DEBUG_COLLISION_SHAPES 125 +#define IDC_PHYSX_DEBUG_COLLISION_AXES 126 +#define IDC_PHYSX_DEBUG_COLLISION_COMPOUNDS 127 +#define IDC_PHYSX_DEBUG_COLLISION_VNORMALS 128 +#define IDC_PHYSX_DEBUG_COLLISION_FNORMALS 129 +#define IDC_PHYSX_DEBUG_COLLISION_EDGES 130 +#define IDC_PHYSX_DEBUG_COLLISION_SPHERES 131 +#define IDC_PHYSX_DEBUG_COLLISION_STATIC 132 +#define IDC_PHYSX_DEBUG_COLLISION_DYNAMIC 133 +#define IDC_PHYSX_DEBUG_COLLISION_FREE 134 +#define IDC_PHYSX_DEBUG_COLLISION_CCD 135 +#define IDC_PHYSX_DEBUG_COLLISION_SKELETONS 136 +#define IDC_PHYSX_DEBUG_CHECK_BUTTONS_END 148 + +#define IDC_PHYSX3_DEBUG_CHECK_BUTTONS_START 149 +#define IDC_PHYSX3_DEBUG_WORLD_AXES 150 +#define IDC_PHYSX3_DEBUG_BODY_AXES 151 +#define IDC_PHYSX3_DEBUG_BODY_MASS_AXES 152 +#define IDC_PHYSX3_DEBUG_BODY_LIN_VELOCITY 153 +#define IDC_PHYSX3_DEBUG_BODY_ANG_VELOCITY 154 +#define IDC_PHYSX3_DEBUG_BODY_JOINT_GROUPS 155 +#define IDC_PHYSX3_DEBUG_CONTACT_POINT 156 +#define IDC_PHYSX3_DEBUG_CONTACT_NORMAL 157 +#define IDC_PHYSX3_DEBUG_CONTACT_ERROR 158 +#define IDC_PHYSX3_DEBUG_CONTACT_FORCE 159 +#define IDC_PHYSX3_DEBUG_ACTOR_AXES 160 +#define IDC_PHYSX3_DEBUG_COLLISION_AABBS 161 +#define IDC_PHYSX3_DEBUG_COLLISION_SHAPES 162 +#define IDC_PHYSX3_DEBUG_COLLISION_AXES 163 +#define IDC_PHYSX3_DEBUG_COLLISION_COMPOUNDS 164 +#define IDC_PHYSX3_DEBUG_COLLISION_FNORMALS 165 +#define IDC_PHYSX3_DEBUG_COLLISION_EDGES 166 +#define IDC_PHYSX3_DEBUG_COLLISION_STATIC 167 +#define IDC_PHYSX3_DEBUG_COLLISION_DYNAMIC 168 +#define IDC_PHYSX3_DEBUG_COLLISION_PAIRS 169 +#define IDC_PHYSX3_DEBUG_JOINT_LOCAL_AXES 170 +#define IDC_PHYSX3_DEBUG_JOINT_LIMITS 171 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_POSITION 172 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_VELOCITY 173 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_COLLISION_NORMAL 174 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_BOUNDS 175 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_GRID 176 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_BROADPHASE_BOUNDS 177 +#define IDC_PHYSX3_DEBUG_PARTICLE_SYSTEM_MAX_MOTION_DISTANCE 178 +#define IDC_PHYSX3_DEBUG_CHECK_BUTTONS_END 188 + +#define IDC_PHYSX_DEBUG_ALL 190 +#define IDC_PHYSX_DEBUG_NONE 191 +#define IDC_PHYSX_DEBUG_DIAGMODEPERF 192 +#define IDC_PHYSX_DEBUG_DIAGMODESTATS 193 + +#define IDC_PHYSX_DEBUG_USECONVEXSHAPES 194 +#define IDC_PHYSX_DEBUG_USEROADWAYS 195 +#define IDC_PHYSX_DEBUG_USEONECAPSULE 196 +#define IDC_PHYSX_DEBUG_IMMEDIATEFETCH 197 + +#define IDC_PHYSX_DEBUG_BASIC 198 + +// DS interface display +#define IDC_DSI_PLAYERLIST 101 +#define IDC_DSI_MISSONLIST 102 + +// HintC display +#define IDC_HINTC_BG 101 +#define IDC_HINTC_HINT 102 +#define IDC_HINTC_TITLE 103 +#define IDC_HINTC_CONTINUE 104 +#define IDC_HINTC_LINE1 105 +#define IDC_HINTC_LINE2 106 + +// Insert marker display +#define IDC_INSERT_MARKER 101 +#define IDC_INSERT_MARKER_PICTURE 102 +#define IDC_INSERT_MARKER_CHANNELS 103 + +// InGameUI +// - unit info +#define IDC_IGUI_TIME 101 +#define IDC_IGUI_DATE 102 +#define IDC_IGUI_NAME 103 +#define IDC_IGUI_UNIT 104 +#define IDC_IGUI_VALUE_EXP 106 +#define IDC_IGUI_COMBAT_MODE 107 +#define IDC_IGUI_VALUE_HEALTH 109 +#define IDC_IGUI_HITZONES 111 +#define IDC_IGUI_VALUE_FUEL 113 +#define IDC_IGUI_CARGO_MAN 114 +#define IDC_IGUI_CARGO_FUEL 115 +#define IDC_IGUI_CARGO_REPAIR 116 +#define IDC_IGUI_CARGO_AMMO 117 +#define IDC_IGUI_WEAPON 118 +#define IDC_IGUI_AMMO 119 +#define IDC_IGUI_VEHICLE 120 +#define IDC_IGUI_SPEED 121 +#define IDC_IGUI_ALT 122 +#define IDC_IGUI_FORMATION 123 +#define IDC_IGUI_BG 124 +#define IDC_IGUI_COMMANDER 125 +#define IDC_IGUI_DRIVER 126 +#define IDC_IGUI_GUNNER 127 + +#define IDC_IGUI_SPEED_FREEFALL 380 +#define IDC_IGUI_SPEED_VERTICAL_FREEFALL 381 +#define IDC_IGUI_ALT_FREEFALL 382 + +#define IDC_IGUI_ANALOGUE_HORIZON 383 +#define IDC_IGUI_ANALOGUE_SPEED_LADDER 384 +#define IDC_IGUI_ANALOGUE_ALT_LADDER 385 + +#define IDC_IGUI_OPTICS_GROUP 390 +#define IDC_IGUI_DRIVER_GROUP 391 +#define IDC_IGUI_DRIVER_OPTICS_GROUP 392 +#define IDC_IGUI_VEHICLE_PITCH 393 + + +//AV_Terminal +#define IDC_IGUI_AVT_NAME 100 +#define IDC_IGUI_AVT_TAKE_CONTROL 101 +#define IDC_IGUI_AVT_STATUS 102 +#define IDC_IGUI_AVT_TARGET 103 +#define IDC_IGUI_AVT_POSITION 104 +#define IDC_IGUI_AVT_PIP1 105 +#define IDC_IGUI_AVT_PIP2 106 +#define IDC_IGUI_AVT_COUNT 107 +#define IDC_IGUI_AVT_EDITOR_MENU 108 +#define IDC_IGUI_AVT_FUEL 109 +#define IDC_IGUI_AVT_WEAPON 110 +#define IDC_IGUI_AVT_AMMO 111 +#define IDC_IGUI_AVT_WEAPON_SEC 112 +#define IDC_IGUI_AVT_AMMO_SEC 113 +#define IDC_IGUI_AVT_TAKE_CONTROL_DRIVER 114 +#define IDC_IGUI_AVT_TAKE_CONTROL_GUNNER 115 +#define IDC_IGUI_AVT_AUTONOMOUS 116 +#define IDC_IGUI_AVT_COMBO 117 +#define IDC_IGUI_AVT_ALLOW_LIGHTS 118 + +//AV Camera +#define IDC_IGUI_AVC_PIP_DRIVER 100 +#define IDC_IGUI_AVC_PIP_GUNNER 101 +#define IDC_IGUI_AVC_PIP_SINGLE_VIEW 102 +#define IDC_IGUI_AVC_PIP_SOURCE 103 +#define IDC_IGUI_AVC_PIP_HEADING 104 +#define IDC_IGUI_AVC_PIP_MODE 105 + +//Sling Load Assistant +#define IDC_SLA_MAP 100 +#define IDC_SLA_HDIST 101 +#define IDC_SLA_VDIST 102 +#define IDC_SLA_STATUS 103 +#define IDC_SLA_LIFT_PROGRESS 104 +#define IDC_SLA_HEIGHT_BAR 105 +#define IDC_SLA_MAX_ALT 106 +#define IDC_SLA_VIEWPORT 107 + +//Sensors Display +#define IDC_SENS_VIEWPORT 101 +#define IDC_SENS_CIRCLES 102 +#define IDC_SENS_VEHICLE 103 +#define IDC_SENS_RANGE 104 +#define IDC_SENS_RADARON 105 +#define IDC_SENS_RADAROFF 106 +#define IDC_SENS_RADAROFF 106 +#define IDC_SENS_TARGET 107 +#define IDC_SENS_TARGETRANGE 108 +#define IDC_SENS_TARGETSPEED 109 +#define IDC_SENS_TARGETALT 110 +#define IDC_SENS_HEADING 111 + +//Mine detector Display +#define IDC_MINEDETECT_VIEWPORT 101 +#define IDC_MINEDETECT_CIRCLES 102 +#define IDC_MINEDETECT_VEHICLE 103 +#define IDC_MINEDETECT_RANGE 104 + +//Crew list +#define IDC_CREW_VEHICLE 101 +#define IDC_CREW_LIST 102 + +//MP Score Table +#define IDC_MP_SCORE_TABLE_TITLE 101 +#define IDC_MP_SCORE_TABLE_PLAYERS_LIST 102 +#define IDC_MP_SCORE_TABLE_SIDES_LIST 103 +#define IDC_MP_SCORE_TABLE_LINE_TEMPLATE 104 +#define IDC_MP_SCORE_TABLE_LINE_BACK 105 +#define IDC_MP_SCORE_TABLE_ORDER 106 +#define IDC_MP_SCORE_TABLE_PLAYERSNAME 107 +#define IDC_MP_SCORE_TABLE_KILLS_INF 108 +#define IDC_MP_SCORE_TABLE_KILLS_SOFT 109 +#define IDC_MP_SCORE_TABLE_KILLS_ARMOR 110 +#define IDC_MP_SCORE_TABLE_KILLS_AIR 111 +#define IDC_MP_SCORE_TABLE_KILLED 112 +#define IDC_MP_SCORE_TABLE_KILLSTOTAL 113 + +//Vehicle MessageBox +#define IDC_VEHICLEMSGBOX_BACKGROUND 100 +#define IDC_VEHICLEMSGBOX_LOGO 101 +#define IDC_VEHICLEMSGBOX_TEXT 102 +#define IDC_VEHICLEMSGBOX_PURCHASE 103 + +//Action Notification +#define IDC_DLC_ACTION_NOTIFICATION_GROUP 11406 +#define IDC_DLC_ACTION_NOTIFICATION_LOGO 100 +#define IDC_DLC_ACTION_NOTIFICATION_TEXT 101 +#define IDC_DLC_ACTION_NOTIFICATION_TITLE 102 + +//first aid icons +#define IDC_IGUI_BLEEDING0 401 +#define IDC_IGUI_BLEEDING1 402 +#define IDC_IGUI_INJURED_HEAD0 403 +#define IDC_IGUI_INJURED_HEAD1 404 +#define IDC_IGUI_INJURED_HANDS0 405 +#define IDC_IGUI_INJURED_HANDS1 406 +#define IDC_IGUI_INJURED_HANDS2 407 +#define IDC_IGUI_INJURED_LEGS0 408 +#define IDC_IGUI_INJURED_LEGS1 409 +#define IDC_IGUI_INJURED_LEGS2 410 +#define IDC_IGUI_BODY 411 +#define IDC_IGUI_VALUE_OXYGEN 412 +#define IDC_IGUI_BURNING 413 + +#define IDC_IGUI_ALT_WANTED 128 +#define IDC_IGUI_SPEED_WANTED 129 +#define IDC_IGUI_POSITION 130 +#define IDC_IGUI_OPTIC 131 + +// _VBS3 + #define IDC_IGUI_MAGAZINE 132 + #define IDC_IGUI_OVR_STATUS 133 + //TI + #define IDC_IGUI_TI_BACK 134 + #define IDC_IGUI_TI_MODE 135 + #define IDC_IGUI_TI_BRIGHTNESS_TXT 136 + #define IDC_IGUI_TI_BRIGHTNESS 137 + #define IDC_IGUI_TI_CONTRAST_TXT 138 + #define IDC_IGUI_TI_CONTRAST 139 + #define IDC_IGUI_TI_AUTO_CONTRAST 140 + + //LASE + #define IDC_IGLR_RANGE 141 + #define IDC_IGLR_BG 142 + #define IDC_IGLR_RANGE_NUM 143 + + //AVRS + #define IDC_IGUI_NICK 144 + #define IDC_IGUI_NICK_VAL 145 + #define IDC_IGUI_BANK 146 + #define IDC_IGUI_BANK_VAL 147 +// !_VBS3 +#define IDC_IGUI_HEADING 148 + +// !new arrowhead +#define IDC_IGUI_WEAPON_MODE 149 +#define IDC_IGUI_WEAPON_GUNNER 150 +#define IDC_IGUI_COUNTER_MEASURES_AMMO 151 +#define IDC_IGUI_COUNTER_MEASURES_MODE 152 + +#define IDC_IGUI_RADARRANGE 153 +#define IDC_IGUI_VALUE_RELOAD 154 +#define IDC_IGUI_WEAPON_AMMO 155 + +// New Arma 3 +#define IDC_IGUI_STANCE_INDICATOR 188 +#define IDC_IGUI_GPS_PLAYER 189 +#define IDC_IGUI_SPEED2 190 +#define IDC_IGUI_ALT2 191 +#define IDC_IGUI_PILOT_OPTIC_ZOOM 192 +#define IDC_IGUI_STAMINA_BAR 193 + +// weapon/turret info controls +#define IDC_IGUI_WEAPON_DISTANCE 151 +#define IDC_IGUI_WEAPON_VISION_MODE 152 +#define IDC_IGUI_WEAPON_FLIR_MODE 153 +#define IDC_IGUI_WEAPON_FOV_MODE 154 +#define IDC_IGUI_WEAPON_COMPASS 155 +#define IDC_IGUI_WEAPON_HEADING 156 +#define IDC_IGUI_WEAPON_AUTOHOVER 157 +#define IDC_IGUI_WEAPON_LASER_MARKER_ON 158 +#define IDC_IGUI_WEAPON_BALL_ENABLED 159 +#define IDC_IGUI_WEAPON_JAVELIN_DAY 160 +#define IDC_IGUI_WEAPON_JAVELIN_FLTR 161 +#define IDC_IGUI_WEAPON_JAVELIN_NFOV 162 +#define IDC_IGUI_WEAPON_JAVELIN_WFOV 163 +#define IDC_IGUI_WEAPON_BALL_RANGE 164 +#define IDC_IGUI_WEAPON_BALISTIC_COMP 165 +#define IDC_IGUI_WEAPON_JAVELIN_SEEK 166 +#define IDC_IGUI_WEAPON_JAVELIN_MISSLE 167 +#define IDC_IGUI_WEAPON_ELEVATION 168 +#define IDC_IGUI_WEAPON_ELEVATION_TEXT 169 +#define IDC_IGUI_WEAPON_STATIC_ITEMS 170 +#define IDC_IGUI_WEAPON_GPS_PLAYER 171 +#define IDC_IGUI_WEAPON_GPS_TARGET 172 +#define IDC_IGUI_WEAPON_ARTI_DIST 173 +#define IDC_IGUI_WEAPON_ARTI_TIME 174 +#define IDC_IGUI_WEAPON_ARTI_ELEV 175 +#define IDC_IGUI_WEAPON_ARTI_ELEV_NEED 176 +#define IDC_IGUI_WEAPON_ARTI_OUT_RANGE 177 +#define IDC_IGUI_WEAPON_ARTI_AUTO_ELEV 178 +#define IDC_IGUI_WEAPON_VISION_MODE2 179 +#define IDC_IGUI_WEAPON_OPTICS_ZOOM 180 +#define IDC_IGUI_WEAPON_TARGET_UNIT 181 +#define IDC_IGUI_WEAPON_OPTICS_PITCH 182 +#define IDC_IGUI_WEAPON_DISTANCE2 183 + +// unit info (to preserve order) - new A3 +#define IDC_IGUI_AMMOCOUNT 184 +#define IDC_IGUI_MAGCOUNT 185 + +#define IDC_IGUI_DEPTH 186 +#define IDC_IGUI_WEAPON_MODE_TEXTURE 187 +#define IDC_IGUI_WEAPON_SPEED 188 +#define IDC_IGUI_WEAPON_ALT 189 +#define IDC_IGUI_WEAPON_TIME 190 + +#define IDC_IGUI_WEAPON_CAM_TRACK_AREA 194 +#define IDC_IGUI_WEAPON_CAM_TRACK_TARGET 195 + +#define IDC_IGUI_WEAPON_JAVELIN_ATTACK_FROM_TOP 196 +#define IDC_IGUI_WEAPON_JAVELIN_ATTACK_DIRECT 197 + +#define IDC_IGUI_WEAPON_LASED_DISTANCE 198 +#define IDC_IGUI_WEAPON_LASED_SPEED 199 +#define IDC_IGUI_WEAPON_LASED_VALID 200 +#define IDC_IGUI_WEAPON_LASED_ERR_LEAD 201 +#define IDC_IGUI_WEAPON_LASED_ERR_ELEV 202 +#define IDC_IGUI_WEAPON_LASED_ERR_OBJECT 203 +#define IDC_IGUI_WEAPON_LASER_ZEROING_DELAY 204 + +#define IDC_IGUI_THROTTLE 205 +#define IDC_IGUI_VEHICLE_DIRECTION 206 +#define IDC_IGUI_VEHICLE_DIRECTION2 207 + + + + + +// helicopter unit info +#define IDC_IGUI_GMETER 501 +#define IDC_IGUI_RADARALTIMETER 505 +#define IDC_IGUI_RADARALTIMETER_BAR 506 +#define IDC_IGUI_RADARALTIMETER_VALUE 507 +#define IDC_IGUI_TORQUE 510 +#define IDC_IGUI_WINDINDICATOR 515 +#define IDC_IGUI_WINDINDICATOR_TEXT 516 +#define IDC_IGUI_WINDINDICATOR_IMAGE 517 +#define IDC_IGUI_STABILITYINDICATOR 520 +#define IDC_IGUI_STABILITYINDICATOR_AXIS 521 +#define IDC_IGUI_STABILITYINDICATOR_OFFSET 522 +#define IDC_IGUI_COLLECTIVE 525 +#define IDC_IGUI_AIRSPEEDINDICATOR 530 +#define IDC_IGUI_AIRSPEEDINDICATOR_AXIS 531 +#define IDC_IGUI_AIRSPEEDINDICATOR_VALUE 532 +#define IDC_IGUI_ALTIMETER 535 +#define IDC_IGUI_ALTIMETER_AXIS 536 +#define IDC_IGUI_ALTIMETER_VALUE 537 +#define IDC_IGUI_ATTITUDEINDICATOR 540 +#define IDC_IGUI_ATTITUDEINDICATOR_LITE 541 +#define IDC_IGUI_TRIMINDICATOR 545 +#define IDC_IGUI_AUTOHOVERNDICATOR 546 +#define IDC_IGUI_HELIHUD_MISCELLANEOUS 550 + +// helicopter Analogue unit info +#define IDC_IGUI_ANALOGUE_SPEED 601 +#define IDC_IGUI_ANALOGUE_SPEED_NEEDLE 602 +#define IDC_IGUI_ANALOGUE_SPEED_MIN 603 +#define IDC_IGUI_ANALOGUE_SPEED_MAX 604 +#define IDC_IGUI_ANALOGUE_SPEED_TEXT 605 +#define IDC_IGUI_ANALOGUE_SPEED_IMPERIAL 606 +#define IDC_IGUI_ANALOGUE_SPEED_METRIC 607 + +#define IDC_IGUI_ANALOGUE_ALTITUDE 611 +#define IDC_IGUI_ANALOGUE_ALTITUDE_NEEDLE 612 +#define IDC_IGUI_ANALOGUE_ALTITUDE_MIN 613 +#define IDC_IGUI_ANALOGUE_ALTITUDE_MAX 614 +#define IDC_IGUI_ANALOGUE_ALTITUDE_TEXT 615 +#define IDC_IGUI_ANALOGUE_ALTITUDE_IMPERIAL 616 +#define IDC_IGUI_ANALOGUE_ALTITUDE_METRIC 617 + +#define IDC_IGUI_ANALOGUE_ATTITUDE 621 +#define IDC_IGUI_ANALOGUE_ATTITUDE_HORIZON 622 +#define IDC_IGUI_ANALOGUE_ATTITUDE_VALUE 623 + +#define IDC_IGUI_ANALOGUE_COMPASS 631 +#define IDC_IGUI_ANALOGUE_COMPASS_DIR 632 +#define IDC_IGUI_ANALOGUE_COMPASS_WIND 633 +#define IDC_IGUI_ANALOGUE_COMPASS_WAYPOINT 634 +#define IDC_IGUI_ANALOGUE_COMPASS_MIN 635 +#define IDC_IGUI_ANALOGUE_COMPASS_MAX 636 +#define IDC_IGUI_ANALOGUE_COMPASS_TEXT 637 +#define IDC_IGUI_ANALOGUE_COMPASS_WIND_TEXT 63 +#define IDC_IGUI_ANALOGUE_STABILITY 641 +#define IDC_IGUI_ANALOGUE_STABILITY_SPEED 642 +#define IDC_IGUI_ANALOGUE_STABILITY_TEXT 643 +#define IDC_IGUI_ANALOGUE_STABILITY_VSPEED_NEEDLE 644 +#define IDC_IGUI_ANALOGUE_STABILITY_COLLECTIVE 645 +#define IDC_IGUI_ANALOGUE_STABILITY_VSPEED 646 +#define IDC_IGUI_ANALOGUE_STABILITY_IMPERIAL 647 +#define IDC_IGUI_ANALOGUE_STABILITY_METRIC 648 + +//damage +#define IDC_IGUI_DAMAGE_GROUP 660 +#define IDC_IGUI_DAMAGE_ENGINESRPM 662 +#define IDC_IGUI_DAMAGE_ENGINESDAMAGE 663 +#define IDC_IGUI_DAMAGE_TORQUE 664 +#define IDC_IGUI_DAMAGE_ELECTRICITY 665 +#define IDC_IGUI_DAMAGE_FUEL 666 +#define IDC_IGUI_DAMAGE_HYDRAULICS 667 +#define IDC_IGUI_DAMAGE_MAINROTOR 668 +#define IDC_IGUI_DAMAGE_TAILROTOR 669 +#define IDC_IGUI_DAMAGE_AUTOHOVER 670 +#define IDC_IGUI_DAMAGE_INSTALLATIONS 671 +#define IDC_IGUI_DAMAGE_HULL 672 +#define IDC_IGUI_DAMAGE_WHEELBRAKE 673 +#define IDC_IGUI_DAMAGE_ROTORBRAKE 674 +#define IDC_IGUI_DAMAGE_WINCH 675 +#define IDC_IGUI_DAMAGE_GEAR 676 + +// - hint +#define IDC_IGHINT_BG 101 +#define IDC_IGHINT_HINT 102 + +// - task hint +#define IDC_IGTASKHINT_BG 103 +#define IDC_IGTASKHINT_HINT 104 + +// - load mission progress bar +#define IDC_LOAD_MISSION_NAME 101 +#define IDC_LOAD_MISSION_DATE 102 +#define IDC_PROGRESS_TIME 103 +#define IDC_PROGRESS_PROGRESS 104 +#define IDC_LOAD_MISSION_PICTURE 105 +#define IDC_LOAD_MISSION_TEXT 106 + +// - dedicated server dialog +#define IDC_DS_REPORT 101 +#define IDC_DS_PLAYERS 102 +#define IDC_DS_FRIENDS 103 + +// - friend's missions dialog +#define IDC_FRIEND_MISSIONS_LIST 101 + +// - live statistics dialogs +#define IDC_LIVE_STATS_BOARDS 101 + +#define IDC_LIVE_STATS_LIST 101 +#define IDC_LIVE_STATS_COUNT 102 +#define IDC_LIVE_STATS_TITLE 103 +#define IDC_LIVE_STATS_PLAYER 104 +#define IDC_LIVE_STATS_BEGIN 105 +#define IDC_LIVE_STATS_END 106 +#define IDC_LIVE_STATS_PREV 107 +#define IDC_LIVE_STATS_NEXT 108 +#define IDC_LIVE_STATS_FRIENDS 109 +#define IDC_LIVE_STATS_GAMER_CARD 110 + +#define IDC_RECEIVING_TEXT 101 +#define IDC_RECEIVING_TIME 102 + +#define IDC_MSG_BOX_MESSAGE 101 + +#define IDC_EDITOR_OBJECTS 201 +#define IDC_EDITOR_ATTRIBUTES 202 +#define IDC_EDITOR_BACKGROUND 203 +#define IDC_EDITOR_MENU 204 +#define IDC_EDITOR_SAVE 205 +#define IDC_EDITOR_LOAD 206 +#define IDC_EDITOR_RESTART 207 +#define IDC_EDITOR_PREVIEW 208 +#define IDC_EDITOR_MAP 209 +#define IDC_EDITOR_CLEAR 210 +#define IDC_EDITOR_TYPE_LIST 211 + +// editor menu system +#define IDC_EDITOR_FILE 212 +#define IDC_EDITOR_VIEW 213 +#define IDC_EDITOR_USER 214 +#define IDC_EDITOR_MENU_FILE 216 +#define IDC_EDITOR_MENU_VIEW 217 +#define IDC_EDITOR_MENU_USER 218 + +#define IDC_EDITOR_CONTROLS_HELP 220 +#define IDC_EDITOR_LOAD_AAR 221 + +#define IDC_EDITOR_ADDOBJ_TYPES 222 +#define IDC_EDITOR_ADDOBJ_CATEGORIES 223 +#define IDC_EDITOR_ADDOBJ_LISTING 224 + +#define IDC_MINI_MAP 225 + +// editor tree filtering +#define IDC_EDITOR_OBJECTS_FILTER 236 +#define IDC_EDITOR_TREE_EXPAND_ALL 237 +#define IDC_EDITOR_TREE_EXPAND_ALL_BACK 238 +#define IDC_EDITOR_TREE_COLLAPSE_ALL 239 +#define IDC_EDITOR_TREE_COLLAPSE_ALL_BACK 24 +#define IDC_EDIT_OBJECT_CONTROLS 101 +#define IDC_EDIT_OBJECT_TOGGLE_BUTTON 102 + +#define IDC_NEW_OBJECT_TYPE 101 +#define IDC_NEW_OBJECT_PARENT 102 + +#define IDC_MISSION_LOAD_ISLAND 101 +#define IDC_MISSION_LOAD_MISSION 102 + +#define IDC_MISSION_SAVE_MISSION 101 +#define IDC_MISSION_SAVE_TITLE 102 +#define IDC_MISSION_SAVE_DESCRIPTION 103 +#define IDC_MISSION_SAVE_PLACEMENT 104 + +#define IDC_OVERLAY_CREATE_NAME 101 +#define IDC_OVERLAY_LOAD_NAME 101 +#define IDC_OVERLAY_LOAD_MISSION 102 + +#define IDC_EDIT_DIARY_RECORD 101 +#define IDC_EDIT_DIARY_TITLE 102 + +#define IDC_LOAD_AAR_NAME 101 + +#define IDC_EDITOR_EB_PLAN 101 +#define IDC_EDITOR_EB_NOTES 102 +#define IDC_EDITOR_EB_SIDE 103 +#define IDC_EDITOR_EB_OBJECTIVES 104 +#define IDC_EDITOR_EB_NEW_OBJECTIVE 105 +#define IDC_EDITOR_EB_ADD_OBJECTIVE 106 +#define IDC_EDITOR_EB_DEL_OBJECTIVE 107 + +// - team switch display + +#define IDC_TEAM_SWITCH_ROLES 101 + +// - configure action display + +#define IDC_CONFIGURE_ACTION_TITLE 101 +#define IDC_CONFIGURE_ACTION_KEYS 102 +#define IDC_CONFIGURE_ACTION_SPECIAL 103 +#define IDC_CONFIGURE_ACTION_DELETE 104 +#define IDC_CONFIGURE_ACTION_DEFAULT 105 +#define IDC_CONFIGURE_ACTION_CLEAR 106 +#define IDC_CONFIGURE_ACTION_CANCEL 107 +#define IDC_CONFIGURE_ACTION_PREV 108 +#define IDC_CONFIGURE_ACTION_NEXT 109 + +// - controls display +#define IDC_CONTROLS_TYPE 101 +#define IDC_CONTROLS_CONFIGURE 102 + +// - miniMap display + +#define IDC_MINIMAP 101 +#define IDC_MINIMAP_VIEWPORT 102 +#define IDC_MINIMAP_GRID 197 +#define IDC_MINIMAP_HEADING 198 +#define IDC_MINIMAP_TIME 199 + + +// - scripting help display +#define IDC_SCRITING_HELP 101 +#define IDC_SCRITING_HELP_BACK 102 +#define IDC_SCRITING_HELP_FORWARD 103 +#define IDC_SCRITING_HELP_EXAMPLE 104 + +// - performance display +#define IDC_PERF_INDEX 101 +#define IDC_PERF_ENABLE 102 +#define IDC_PERF_GRAPH 103 +#define IDC_PERF_GRAPH_TITLE 104 +#define IDC_PERF_MAXTIME 105 + +// - capture display +#define IDC_CAPTURE_INDEX 101 +#define IDC_CAPTURE_TIMELINES 102 +#define IDC_CAPTURE_ZOOMIN 103 +#define IDC_CAPTURE_ZOOMOUT 104 +#define IDC_CAPTURE_EXPORT 105 +#define IDC_CAPTURE_INFO 106 +#define IDC_CAPTURE_EXPORT_ALL 107 +#define IDC_CAPTURE_IMPORT_ALL 108 +#define IDC_CAPTURE_PREVIOUS_DATA 109 +#define IDC_CAPTURE_AVERAGES 110 +#define IDC_CAPTURE_SAVE_ARCHIVE 111 +#define IDC_CAPTURE_SEARCH 112 + + +// - joysticks configuration display +#define IDC_CONTROLLER_CUSTOMIZE 101 +#define IDC_CONTROLLER_ENABLE 102 +#define IDC_CONTROLLER_XINPUT_LIST 103 +#define IDC_CONTROLLER_LIST 104 +#define IDC_CONTROLLER_REFRESH 105 + +// - customize controllers +#define IDC_CUSTOMIZE_CTRL_SENSITIVITIES 101 +#define IDC_CUSTOMIZE_CTRL_UNMAP 102 +#define IDC_CUSTOMIZE_CTRL_DEFAULT 103 +#define IDC_CUSTOMIZE_CTRL_TITLE 104 +#define IDC_CUSTOMIZE_CTRL_DEFAULT_BINDING 105 +#define IDC_CUSTOMIZE_CTRL_ADVANCED 106 +#define IDC_SENSITIVITY_SLIDER 120 +#define IDC_DEADZONE_SLIDER 220 +#define IDC_CUSTOMIZE_CTRL_ACTIVE_AXIS_ICON 320 +#define IDC_CUSTOMIZE_CTRL_STEEPNESS 420 +#define IDC_CUSTOMIZE_CTRL_VALUE 520 + +// - joystick schemes +#define IDC_JOY_SCHEMES_TITLE 101 +#define IDC_JOY_SCHEMES_LIST 102 +#define IDC_JOY_SCHEMES_MAP 103 + +// - helper IDC for DisplayCampaignLoadLight +#define IDC_MP_CAMPAIGN_RESTART 150 +#define IDC_MP_CAMPAIGN_REPLAY 151 +#define IDC_MP_CAMPAIGN_LOAD 152 + +// - addon actions display +#define IDC_ADDON_ACTIONS 101 +#define IDC_ADDON_ACTIONS_NEW_MOD 102 + +// - mod launcher +#define IDC_MOD_LAUNCHER_MODS 101 +#define IDC_MOD_LAUNCHER_PICTURE 102 +#define IDC_MOD_LAUNCHER_UP 103 +#define IDC_MOD_LAUNCHER_DOWN 104 +#define IDC_MOD_LAUNCHER_DISABLE 105 +#define IDC_MOD_LAUNCHER_ACTION 106 +#define IDC_MOD_LAUNCHER_PURCHASE 107 +#define IDC_MOD_LAUNCHER_DESCRIPTION 108 + +// - create new mod +#define IDC_MOD_NAME 101 +#define IDC_MOD_DIR 102 + + +//A3 credits +#define ONBUTTONCLICK_START_CREDITS "0 = _this spawn (uinamespace getvariable 'bis_fnc_credits');" + + +// Hitzone types +#define HZ_AIRPLANE_HULL 0 +#define HZ_AIRPLANE_ENG 22 +#define HZ_AIRPLANE_FUEL 23 +#define HZ_AIRPLANE_GEAR 24 +#define HZ_AIRPLANE_WINGS 25 +#define HZ_AIRPLANE_INST 26 + +#define HZ_HELICOPTER_HULL 1 +#define HZ_HELICOPTER_ENG 2 +#define HZ_HELICOPTER_INST 3 +#define HZ_HELICOPTER_ATRQ 4 +#define HZ_HELICOPTER_MROT 5 +#define HZ_HELICOPTER_WINCH 6 + +#define HZ_CAR_HULL 7 +#define HZ_CAR_ENG 8 +#define HZ_CAR_FUEL 9 +#define HZ_CAR_WHL 10 + +#define HZ_MOTORCYCLE_HULL 11 +#define HZ_MOTORCYCLE_ENG 12 +#define HZ_MOTORCYCLE_FUEL 13 +#define HZ_MOTORCYCLE_WHL 14 + +#define HZ_TANK_HULL 15 +#define HZ_TANK_ENG 16 +#define HZ_TANK_GUN 17 +#define HZ_TANK_LTR 18 +#define HZ_TANK_RTR 19 +#define HZ_TANK_TRRT 20 + +#define HZ_VEH_GUN HZ_TANK_GUN +#define HZ_VEH_TRRT HZ_TANK_TRRT + +#define HZ_SHIP_ENG 21 + +#define HZ_VEH_TOTAL 27 + +#define HZ_TANK_CMDGUN 28 +#define HZ_TANK_CMDTRRT 29 +#define HZ_VEH_CMDGUN HZ_TANK_CMDGUN +#define HZ_VEH_CMDTRRT HZ_TANK_CMDTRRT + +#define HZ_VEH_TRRT_TOTAL 30 +#define HZ_VEH_CMDTRRT_TOTAL 31 + +#define HZ_TANK_BOTH_TRACKS 32 + + +#endif \ No newline at end of file diff --git a/include/a3/ui_f/hpp/defineResinclDesign.inc b/include/a3/ui_f/hpp/defineResinclDesign.inc new file mode 100644 index 0000000..d233238 --- /dev/null +++ b/include/a3/ui_f/hpp/defineResinclDesign.inc @@ -0,0 +1,1063 @@ +#define IDC_SEARCH 645 +#define IDC_SEARCH_BUTTON 646 + +//--- RscDisplayMain +#define IDC_MAIN_GAMEMODES 201 +#define IDC_MAIN_MP_SCENARIOS 202 +#define IDC_MAIN_ARSENAL 203 +#define IDC_MAIN_COMMUNITYGUIDES 204 +#define IDC_MAIN_PROFILE 205 +#define IDC_MAIN_CAMPAIGN_MP 206 + +#define IDC_MAIN_MOUSEAREA 999 +#define IDC_MAIN_BACKGROUND_PICTURE 998 +#define IDC_MAIN_BACKGROUND_BLACK 997 + +#define IDC_MAIN_GROUP_SINGLEPLAYER 1001 +#define IDC_MAIN_GROUP_MULTIPLAYER 1002 +#define IDC_MAIN_GROUP_TUTORIALS 1003 +#define IDC_MAIN_GROUP_OPTIONS 1004 +#define IDC_MAIN_GROUP_SESSION 1005 + +#define IDC_MAIN_TITLE_SINGLEPLAYER 1011 +#define IDC_MAIN_TITLE_MULTIPLAYER 1012 +#define IDC_MAIN_TITLE_TUTORIALS 1013 +#define IDC_MAIN_TITLE_OPTIONS 1014 +#define IDC_MAIN_TITLE_SESSION 1015 + +#define IDC_MAIN_TITLEICON_SINGLEPLAYER 1111 +#define IDC_MAIN_TITLEICON_MULTIPLAYER 1112 +#define IDC_MAIN_TITLEICON_TUTORIALS 1113 +#define IDC_MAIN_TITLEICON_OPTIONS 1114 +#define IDC_MAIN_TITLEICON_SESSION 1115 + +#define IDC_MAIN_SPOTLIGHT_GROUP_1 1020 +#define IDC_MAIN_SPOTLIGHT_GROUP_2 1021 +#define IDC_MAIN_SPOTLIGHT_GROUP_3 1022 +#define IDC_MAIN_SPOTLIGHT_PICTURE 1023 +#define IDC_MAIN_SPOTLIGHT_VIDEO 1024 +#define IDC_MAIN_SPOTLIGHT_HOVER 1025 +#define IDC_MAIN_SPOTLIGHT_BUTTON 1026 +#define IDC_MAIN_SPOTLIGHT_ACTION 1027 +#define IDC_MAIN_SPOTLIGHT_TEXT 1028 +#define IDC_MAIN_SPOTLIGHT_TEXTBCG 1029 + +#define IDC_MAIN_SPOTLIGHT_PREV 1060 +#define IDC_MAIN_SPOTLIGHT_NEXT 1061 + +#define IDC_MAIN_INFO_MODS 1030 +#define IDC_MAIN_INFO_DLCS 1031 +#define IDC_MAIN_INFO_DLCSOWNED 10311 +#define IDC_MAIN_INFO_NEWS 1032 +#define IDC_MAIN_INFO_VERSION 1033 + +#define IDC_MAIN_INFO_BACKGROUND 1034 +#define IDC_MAIN_INFO_BACKGROUND_ICON 1035 +#define IDC_MAIN_INFO_ICON 1036 +#define IDC_MAIN_INFO_BUTTON 1037 +#define IDC_MAIN_INFO_BUTTON_DEV 1038 +#define IDC_MAIN_INFO_NOTIFICATION 1039 + +#define IDC_MAIN_VERSION_DEV 1050 + +#define BARCOLOR 0, 0, 0, 0.75 +#define INFO_BACKGROUND_COLOR BARCOLOR +#define INFO_ICON_COLOR 1, 1, 1, 0.5 + +//--- RscDisplayDebug +#define IDC_RSCDISPLAYDEBUG_DESIGNHTML 11735 +#define IDC_RSCDISPLAYDEBUG_TEXTEXPRESSION 11736 +#define IDC_RSCDISPLAYDEBUG_TEXTVAR1 11737 +#define IDC_RSCDISPLAYDEBUG_TEXTVAR2 11738 +#define IDC_RSCDISPLAYDEBUG_TEXTVAR3 11739 +#define IDC_RSCDISPLAYDEBUG_TEXTVAR4 11740 +#define IDC_RSCDISPLAYDEBUG_TEXTWATCH 11741 +#define IDC_RSCDISPLAYDEBUG_DIAGTEXT 11747 +#define IDC_RSCDISPLAYDEBUG_DRAWTEXT 11748 +#define IDC_RSCDISPLAYDEBUG_CA_TITLE 11838 +#define IDC_RSCDISPLAYDEBUG_CA_PLAYER 12145 +#define IDC_RSCDISPLAYDEBUG_CA_VERSION 12146 +#define IDC_RSCDISPLAYDEBUG_DIAGLIST 12236 +#define IDC_RSCDISPLAYDEBUG_DIAGLIST_SEARCH 12238 +#define IDC_RSCDISPLAYDEBUG_DRAWLIST 12237 +#define IDC_RSCDISPLAYDEBUG_DIAGFRAME 12535 +#define IDC_RSCDISPLAYDEBUG_DRAWFRAME 12536 +#define IDC_RSCDISPLAYDEBUG_FRAMELOG 12537 +#define IDC_RSCDISPLAYDEBUG_G_EXPRESSION 13035 +#define IDC_RSCDISPLAYDEBUG_G_DIAG 13036 +#define IDC_RSCDISPLAYDEBUG_G_DESIGN 13037 +#define IDC_RSCDISPLAYDEBUG_G_WATCH 13038 +#define IDC_RSCDISPLAYDEBUG_G_DRAW 13039 +#define IDC_RSCDISPLAYDEBUG_DIAGBUTTON 13138 +#define IDC_RSCDISPLAYDEBUG_DRAWBUTTON 13139 +#define IDC_RSCDISPLAYDEBUG_DEBUGFLOW 13140 +#define IDC_RSCDISPLAYDEBUG_DEBUGANIM 13141 +#define IDC_RSCDISPLAYDEBUG_B_CAMERANEW 13142 +#define IDC_RSCDISPLAYDEBUG_CREATEJIRAISSUE 13143 +#define IDC_RSCDISPLAYDEBUG_DEBUGGUI 13144 +#define IDC_RSCDISPLAYDEBUG_DEBUGFUNCTIONS 13145 +#define IDC_RSCDISPLAYDEBUG_DEBUGCONFIG 13154 +#define IDC_RSCDISPLAYDEBUG_B_CAMERA 13155 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT1 13157 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT2 13158 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT3 13159 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT4 13160 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT5 13161 +#define IDC_RSCDISPLAYDEBUG_BUTTONSCRIPT6 13163 +#define IDC_RSCDISPLAYDEBUG_DEBUGCAPTURE 13164 + +//--- RscDisplayAnimViewer +#define IDC_RSCDISPLAYANIMVIEWER_TITLE 1000 +#define IDC_RSCDISPLAYANIMVIEWER_BACKGROUND 1001 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTACTION 1002 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTPOSE 1003 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTMOVEMENT 1004 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTSTANCE 1005 +#define IDC_RSCDISPLAYANIMVIEWER_TEXTITEM 1006 +#define IDC_RSCDISPLAYANIMVIEWER_DESCRIPTION 1100 +#define IDC_RSCDISPLAYANIMVIEWER_MISC 1500 +#define IDC_RSCDISPLAYANIMVIEWER_ACTION 2100 +#define IDC_RSCDISPLAYANIMVIEWER_POSE 2101 +#define IDC_RSCDISPLAYANIMVIEWER_MOVEMENT 2102 +#define IDC_RSCDISPLAYANIMVIEWER_STANCE 2103 +#define IDC_RSCDISPLAYANIMVIEWER_ITEM 2104 +#define IDC_RSCDISPLAYANIMVIEWER_SOLDIER 2106 +#define IDC_RSCDISPLAYANIMVIEWER_BUTTONCLOSE 2700 + +#define IDC_RSCDISPLAYANIMVIEWER_MOUSEAREA 999 +#define IDC_RSCDISPLAYANIMVIEWER 1320 + +//--- RscDisplayFunctionsViewer +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_TITLEBACKGROUND 1000 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BACKGROUNDLEFT 1001 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BACKGROUNDRIGHT 1002 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BACKGROUNDMETA 1003 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_TITLETEXT 1004 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_AUTHOR 1005 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_CODESTRUCTURED 1100 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_TITLEICON 1200 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_CODE 1400 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_NAME 1401 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_FUNCTIONS 1500 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_SOURCES 2100 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_TAGS 2101 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_CATEGORIES 2102 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_PREVIEW 2300 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BUTTONRECOMPILE_ALL 2400 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BUTTONRECOMPILE_SELECTED 2401 +#define IDC_RSCDISPLAYFUNCTIONSVIEWER_BUTTONCLOSE 2700 + +#define IDC_RSCDISPLAYFUNCTIONSVIEWER 1321 + +//--- Loading +#define IDC_LOADING_MAPBACKTOP 1000 +#define IDC_LOADING_MAPNAME 1001 +#define IDC_LOADING_MAPAUTHOR 1002 +#define IDC_LOADING_MAPBACKBOTTOM 1003 +#define IDC_LOADING_MISSIONBACKGROUNDTOP 1005 +#define IDC_LOADING_MISSIONNAME 1006 +#define IDC_LOADING_MISSIONAUTHOR 1007 +#define IDC_LOADING_PROGRESSMAP 1008 +#define IDC_LOADING_DISCLAIMERNAME 1009 +#define IDC_LOADING_MISSIONPICTUREBACK 1010 +#define IDC_LOADING_MISSIONGAMETYPE 1012 +#define IDC_LOADING_PROGRESSMISSION 1013 +#define IDC_LOADING_MISSIONDESCRIPTION 1100 +#define IDC_LOADING_DISCLAIMERDESCRIPTION 1101 +#define IDC_LOADING_MAPDESCRIPTION 1102 +#define IDC_LOADING_MISSION 2300 +#define IDC_LOADING_DISCLAIMER 2301 +//--- Loading - DLC part +#define IDC_LOADING_DLCNAME 3207 +#define IDC_LOADING_DLCAUTHOR 3208 +#define IDC_LOADING_DLCPICTUREBACK 3209 +#define IDC_LOADING_DLCDESCRIPTION 3296 +#define IDC_LOADING_DLCPICTURE 3393 +#define IDC_LOADING_DLCSTRIPE 3395 +#define IDC_LOADING_DLCICON 3396 + +#define IDC_LOADING_MAP 999 + +//--- LoadingStart +#define IDC_LOADINGSTART_BLACK 1000 +#define IDC_LOADINGSTART_LOGO 1200 +#define IDC_LOADINGSTART_NOISE 1201 +#define IDC_LOADINGSTART_LOADINGSTART 2310 + +//--- RscDisplayDebriefing +#define IDC_RSCDISPLAYDEBRIEFING_LISTGROUP 21903 //Defined manually +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE 21904 +#define IDC_RSCDISPLAYDEBRIEFING_TIMEBACKGROUND 20594 +#define IDC_RSCDISPLAYDEBRIEFING_MAINBACKGROUND 20595 +#define IDC_RSCDISPLAYDEBRIEFING_RATINGBACKGROUND 20596 +#define IDC_RSCDISPLAYDEBRIEFING_PLAYERNAME 20599 +#define IDC_RSCDISPLAYDEBRIEFING_TITLE 20600 +#define IDC_RSCDISPLAYDEBRIEFING_SUBTITLE 20601 +#define IDC_RSCDISPLAYDEBRIEFING_OBJECTIVESBACKGROUND 20602 +#define IDC_RSCDISPLAYDEBRIEFING_STATBACKGROUND 20603 +#define IDC_RSCDISPLAYDEBRIEFING_DESCRIPTIONBACKGROUND 20604 +#define IDC_RSCDISPLAYDEBRIEFING_LOADSBACKGROUND 20605 +#define IDC_RSCDISPLAYDEBRIEFING_RATINGTEXT 20606 +#define IDC_RSCDISPLAYDEBRIEFING_RATING 20607 +#define IDC_RSCDISPLAYDEBRIEFING_RATINGBEST 20608 +#define IDC_RSCDISPLAYDEBRIEFING_TIMETEXT 20609 +#define IDC_RSCDISPLAYDEBRIEFING_TIME 20610 +#define IDC_RSCDISPLAYDEBRIEFING_TIMEBEST 20611 +#define IDC_RSCDISPLAYDEBRIEFING_LOADSTEXT 20612 +#define IDC_RSCDISPLAYDEBRIEFING_LOADS 20613 +#define IDC_RSCDISPLAYDEBRIEFING_LOADSBEST 20614 +#define IDC_RSCDISPLAYDEBRIEFING_DLCOVERVIEWBACKGROUND 20615 +#define IDC_RSCDISPLAYDEBRIEFING_DLCOVERVIEWTEXT 20616 +#define IDC_RSCDISPLAYDEBRIEFING_DLCCOUNTDOWN 20617 +#define IDC_RSCDISPLAYDEBRIEFING_TABSBACKGROUND 20618 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBAR 20619 +#define IDC_RSCDISPLAYDEBRIEFING_DESCRIPTIONTEXT 20693 +#define IDC_RSCDISPLAYDEBRIEFING_CUSTOMTEXT 20694 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE1 20696 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE2 20697 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE3 20698 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE4 20699 +#define IDC_RSCDISPLAYDEBRIEFING_SIDE5 20700 +#define IDC_RSCDISPLAYDEBRIEFING_PICTURE 20793 +#define IDC_RSCDISPLAYDEBRIEFING_MISSIONPICTURE 20794 +#define IDC_RSCDISPLAYDEBRIEFING_DLCOVERVIEWPICTURE 20795 +#define IDC_RSCDISPLAYDEBRIEFING_DLCLOCKICON 20798 +#define IDC_RSCDISPLAYDEBRIEFING_SECTION 21093 +#define IDC_RSCDISPLAYDEBRIEFING_SUMMARY 21893 +#define IDC_RSCDISPLAYDEBRIEFING_DESCRIPTION 21894 +#define IDC_RSCDISPLAYDEBRIEFING_OBJECTIVES 21895 +#define IDC_RSCDISPLAYDEBRIEFING_STAT 21896 +#define IDC_RSCDISPLAYDEBRIEFING_CUSTOM 21897 +#define IDC_RSCDISPLAYDEBRIEFING_DATA 21898 +#define IDC_RSCDISPLAYDEBRIEFING_SIDES 21899 +#define IDC_RSCDISPLAYDEBRIEFING_DLCGENERALGROUP 21900 +#define IDC_RSCDISPLAYDEBRIEFING_LOAC 21901 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONALLASSETS 21995 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONKARTS 21996 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONHELI 21997 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONMARKSMEN 21998 +#define IDC_RSCDISPLAYDEBRIEFING_DLCBUTTONAPEX 22000 + +//--- RscDisplayDebriefing - DLC item template +#define IDC_RSCDISPLAYDEBRIEFING_ITEMBACKGROUND 20623 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMBACKGROUNDBLACK 20624 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMNAME 20625 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMTEXTSESSIONTIME 20626 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMSESSIONTIME 20627 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMTEXTTOTALTIME 20628 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMTOTALTIME 20629 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMDESCRIPTION 20630 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMPICTURE 20796 +#define IDC_RSCDISPLAYDEBRIEFING_ITEMDLCLOGO 20797 +#define IDC_RSCDISPLAYDEBRIEFING_RSCDISPLAYDEBRIEFING_ITEMTEMPLATE 21902 +#define IDC_RSCDISPLAYDEBRIEFING_BUTTONPURCHASE 21999 + +//--- RscDisplayDebriefing_LOACTemplate +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_BACKGROUND 52605 +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_TITLE 52705 +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_TEXT 52706 +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_PICTURE 52805 +#define IDC_RSCDISPLAYDEBRIEFING_LOACTEMPLATE_TEXTGROUP 53905 + + +//--- RscDebugConsole +#define IDC_RSCDEBUGCONSOLE_TITLE 11884 +#define IDC_RSCDEBUGCONSOLE_EXPRESSIONBACKGROUND 11885 +#define IDC_RSCDEBUGCONSOLE_WATCHBACKGROUND 11886 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUTBACKGROUND1 11887 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUTBACKGROUND2 11888 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUTBACKGROUND3 11889 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUTBACKGROUND4 11890 +#define IDC_RSCDEBUGCONSOLE_LINK 11891 +#define IDC_RSCDEBUGCONSOLE_EXPRESSIONTEXT 11892 +#define IDC_RSCDEBUGCONSOLE_WATCHTEXT 11893 +#define IDC_RSCDEBUGCONSOLE_EXPRESSION 12284 +#define IDC_RSCDEBUGCONSOLE_WATCHINPUT1 12285 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUT1 12286 +#define IDC_RSCDEBUGCONSOLE_WATCHINPUT2 12287 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUT2 12288 +#define IDC_RSCDEBUGCONSOLE_WATCHINPUT3 12289 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUT3 12290 +#define IDC_RSCDEBUGCONSOLE_WATCHINPUT4 12291 +#define IDC_RSCDEBUGCONSOLE_WATCHOUTPUT4 12293 +#define IDC_RSCDEBUGCONSOLE_RSCDEBUGCONSOLE 13184 +#define IDC_RSCDEBUGCONSOLE_BUTTONCODEPERFORMANCE 13284 +#define IDC_RSCDEBUGCONSOLE_BUTTONEXECUTEALL 13285 +#define IDC_RSCDEBUGCONSOLE_BUTTONEXECUTESERVER 13286 +#define IDC_RSCDEBUGCONSOLE_BUTTONSPECTATORCAMERA 13287 +#define IDC_RSCDEBUGCONSOLE_BUTTONSPLENDIDCAMERA 13288 +#define IDC_RSCDEBUGCONSOLE_BUTTONFUNCTIONS 13289 +#define IDC_RSCDEBUGCONSOLE_BUTTONCONFIG 13290 +#define IDC_RSCDEBUGCONSOLE_BUTTONANIMATIONS 13291 +#define IDC_RSCDEBUGCONSOLE_BUTTONGUI 13292 +#define IDC_RSCDEBUGCONSOLE_BUTTONEXECUTELOCAL 13484 +#define IDC_RSCDEBUGCONSOLE_EXPRESSIONOUTPUT 13190 +#define IDC_RSCDEBUGCONSOLE_EXPRESSIONOUTPUTBACKGROUND 13191 + + + +//--- RscDisplayOptionsLayout +#define IDC_RSCDISPLAYOPTIONSLAYOUT_TITLE 1000 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_BACKGROUND 1001 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_TAGSTEXT 1002 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_PRESETSLABEL 1003 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_MOUSEAREA 1004 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_CENTERW 1005 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_CENTERH 1006 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_TOOLTIP 1100 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_TAGS 2100 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_PRESETS 2101 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_BUTTONSAVE 2400 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_BUTTONOK 2600 +#define IDC_RSCDISPLAYOPTIONSLAYOUT_BUTTONCANCEL 2700 + +//--- RscDisplayRespawn +#define IDC_RSCDISPLAYRESPAWN_TITLE 1000 +#define IDC_RSCDISPLAYRESPAWN_LISTBACKGROUND 1001 +#define IDC_RSCDISPLAYRESPAWN_SECTION 1002 +#define IDC_RSCDISPLAYRESPAWN_BLACK 1003 +#define IDC_RSCDISPLAYRESPAWN_CONTENTBACKGROUND 1004 +#define IDC_RSCDISPLAYRESPAWN_BLACKCONTENT 1005 +#define IDC_RSCDISPLAYRESPAWN_PLAYERSNAME 1006 +#define IDC_RSCDISPLAYRESPAWN_CONTENT 1100 +#define IDC_RSCDISPLAYRESPAWN_LIST 1500 +#define IDC_RSCDISPLAYRESPAWN_CONTENTGROUP 2300 +#define IDC_RSCDISPLAYRESPAWN_BUTTONOK 2600 +#define IDC_RSCDISPLAYRESPAWN_BUTTONCANCEL 2700 + +#define IDC_RSCDISPLAYRESPAWN_MAP 1050 + +//--- RscDisplaySelectIsland +#define IDC_RSCDISPLAYSELECTISLAND_TITLE 1000 +#define IDC_RSCDISPLAYSELECTISLAND_NAME 1002 +#define IDC_RSCDISPLAYSELECTISLAND_AUTHOR 1003 +#define IDC_RSCDISPLAYSELECTISLAND_NAMEBACKGROUND 1004 +#define IDC_RSCDISPLAYSELECTISLAND_ISLANDPANORAMA 1200 +#define IDC_RSCDISPLAYSELECTISLAND_INTERLACING 1201 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD1 1202 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD2 1203 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD3 1204 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD4 1205 +#define IDC_RSCDISPLAYSELECTISLAND_ISLANDGROUP 2300 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCONTINUE 2600 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCANCEL 2700 + +//--- RscSpectator +#define IDC_RSCSPECTATOR_PLAYERNAMEBACKGROUND 1000 +#define IDC_RSCSPECTATOR_PLAYERGROUP 1001 +#define IDC_RSCSPECTATOR_PLAYERNAME 1002 +#define IDC_RSCSPECTATOR_PLAYERDESCRIPTION 1100 +#define IDC_RSCSPECTATOR_PLAYERICON 1200 +#define IDC_RSCSPECTATOR_PLAYER 2300 + +//--- RscMissionEnd +#define IDC_RSCMISSIONEND_TITLE 8942 +#define IDC_RSCMISSIONEND_SUBTITLE 8943 +#define IDC_RSCMISSIONEND_SIDE1 9045 +#define IDC_RSCMISSIONEND_SIDE2 9046 +#define IDC_RSCMISSIONEND_SIDE3 9047 +#define IDC_RSCMISSIONEND_SIDE4 9048 +#define IDC_RSCMISSIONEND_SIDE5 9049 +#define IDC_RSCMISSIONEND_PICTURE 9142 +#define IDC_RSCMISSIONEND_SIDES 10248 + +//--- RscNotification +#define IDC_RSCNOTIFICATION_TITLE 12135 +#define IDC_RSCNOTIFICATION_PICTUREBACKGROUND 12136 +#define IDC_RSCNOTIFICATION_SCORE 12137 +#define IDC_RSCNOTIFICATION_DESCRIPTIONBACKGROUND 12138 +#define IDC_RSCNOTIFICATION_DESCRIPTION 12235 +#define IDC_RSCNOTIFICATION_PICTURE 12335 +#define IDC_RSCNOTIFICATION_NOTIFICATION 13435 + +#define IDC_RSCNOTIFICATION_NOTIFICATIONAREA 312 + +//--- RscCommMenuItems +#define IDC_RSCCOMMMENUITEMS_SLOT1BACKGROUND 1000 +#define IDC_RSCCOMMMENUITEMS_SLOT2BACKGROUND 1001 +#define IDC_RSCCOMMMENUITEMS_SLOT3BACKGROUND 1002 +#define IDC_RSCCOMMMENUITEMS_SLOT4BACKGROUND 1003 +#define IDC_RSCCOMMMENUITEMS_SLOT5BACKGROUND 1004 +#define IDC_RSCCOMMMENUITEMS_SLOT6BACKGROUND 1005 +#define IDC_RSCCOMMMENUITEMS_SLOT7BACKGROUND 1006 +#define IDC_RSCCOMMMENUITEMS_SLOT8BACKGROUND 1007 +#define IDC_RSCCOMMMENUITEMS_SLOT9BACKGROUND 1008 +#define IDC_RSCCOMMMENUITEMS_SLOT0BACKGROUND 1009 +#define IDC_RSCCOMMMENUITEMS_SLOT1TEXT 1010 +#define IDC_RSCCOMMMENUITEMS_SLOT1 1200 +#define IDC_RSCCOMMMENUITEMS_SLOT2 1201 +#define IDC_RSCCOMMMENUITEMS_SLOT3 1202 +#define IDC_RSCCOMMMENUITEMS_SLOT4 1203 +#define IDC_RSCCOMMMENUITEMS_SLOT5 1204 +#define IDC_RSCCOMMMENUITEMS_SLOT6 1205 +#define IDC_RSCCOMMMENUITEMS_SLOT7 1206 +#define IDC_RSCCOMMMENUITEMS_SLOT8 1207 +#define IDC_RSCCOMMMENUITEMS_SLOT9 1208 +#define IDC_RSCCOMMMENUITEMS_SLOT0 1209 +#define IDC_RSCCOMMMENUITEMS_SLOT2TEXT 1210 +#define IDC_RSCCOMMMENUITEMS_SLOT3TEXT 1211 +#define IDC_RSCCOMMMENUITEMS_SLOT4TEXT 1212 +#define IDC_RSCCOMMMENUITEMS_SLOT5TEXT 1213 +#define IDC_RSCCOMMMENUITEMS_SLOT6TEXT 1214 +#define IDC_RSCCOMMMENUITEMS_SLOT7TEXT 1215 +#define IDC_RSCCOMMMENUITEMS_SLOT8TEXT 1216 +#define IDC_RSCCOMMMENUITEMS_SLOT9TEXT 1217 +#define IDC_RSCCOMMMENUITEMS_SLOT0TEXT 1218 +#define IDC_RSCCOMMMENUITEMS_RSCCOMMMENUITEMS 2300 + +//--- RscRespawnCounter +#define IDC_RSCRESPAWNCOUNTER_MPTABLE 1000 +#define IDC_RSCRESPAWNCOUNTER_TITLE 1001 +#define IDC_RSCRESPAWNCOUNTER_TITLEBACKGROUND 1002 +#define IDC_RSCRESPAWNCOUNTER_PLAYERRESPAWNTIME 1003 +#define IDC_RSCRESPAWNCOUNTER_DESCRIPTION 1100 + +//--- RscFiringDrillTime +#define IDC_RSCFIRINGDRILLTIME_CURRENTBACKGROUND 1100 +#define IDC_RSCFIRINGDRILLTIME_BEST 1101 +#define IDC_RSCFIRINGDRILLTIME_PREVIOUS 1102 +#define IDC_RSCFIRINGDRILLTIME_BONUS 1103 +#define IDC_RSCFIRINGDRILLTIME_CURRENT 1104 +#define IDC_RSCFIRINGDRILLTIME_PENALTY 1105 +#define IDC_RSCFIRINGDRILLTIME_TIME 2300 + +//--- RscFiringDrillCheckpoint +#define IDC_RSCFIRINGDRILLCHECKPOINT_CHECKPOINTBACKGROUND 1000 +#define IDC_RSCFIRINGDRILLCHECKPOINT_TARGETBACKGROUND 1001 +#define IDC_RSCFIRINGDRILLCHECKPOINT_STANCEBACKGROUND 1002 +#define IDC_RSCFIRINGDRILLCHECKPOINT_WEAPONBACKGROUND 1003 +#define IDC_RSCFIRINGDRILLCHECKPOINT_CHECKPOINTTEXT 1004 +#define IDC_RSCFIRINGDRILLCHECKPOINT_TARGETTEXTTOTAL 1005 +#define IDC_RSCFIRINGDRILLCHECKPOINT_TARGETTEXTCURRENT 1006 +#define IDC_RSCFIRINGDRILLCHECKPOINT_CHECKPOINTPICTURE 1200 +#define IDC_RSCFIRINGDRILLCHECKPOINT_STANCEPICTURE 1201 +#define IDC_RSCFIRINGDRILLCHECKPOINT_WEAPONPICTURE 1202 +#define IDC_RSCFIRINGDRILLCHECKPOINT_TARGETPICTURE 1203 +#define IDC_RSCFIRINGDRILLCHECKPOINT_CHECKPOINT 2300 + +//--- RscAdvancedHint +#define IDC_RSCADVANCEDHINT_TITLE 11657 +#define IDC_RSCADVANCEDHINT_HINT 11757 +#define IDC_RSCADVANCEDHINT_HINTGROUP 12957 + +//--- RscSectorCapture +#define IDC_RSCSECTORCAPTURE_WEST 1001 +#define IDC_RSCSECTORCAPTURE_EAST 1002 +#define IDC_RSCSECTORCAPTURE_GUER 1003 +#define IDC_RSCSECTORCAPTURE_CIV 1004 +#define IDC_RSCSECTORCAPTURE_NAME 1005 +#define IDC_RSCSECTORCAPTURE_BACKGROUND 1200 +#define IDC_RSCSECTORCAPTURE_SECTORCAPTURE 2300 + +//--- RscMissionStatus +#define IDC_RSCMISSIONSTATUS_BARBRIDGE 13983 +#define IDC_RSCMISSIONSTATUS_BARWEST 13984 +#define IDC_RSCMISSIONSTATUS_BAREAST 13985 +#define IDC_RSCMISSIONSTATUS_BARGUER 13986 +#define IDC_RSCMISSIONSTATUS_BARCIV 13987 +#define IDC_RSCMISSIONSTATUS_BARUNKNOWN 13988 +#define IDC_RSCMISSIONSTATUS_SLOT1BACKGROUND 13989 +#define IDC_RSCMISSIONSTATUS_SLOT1PROGRESS 13990 +#define IDC_RSCMISSIONSTATUS_SLOT2BACKGROUND 13991 +#define IDC_RSCMISSIONSTATUS_SLOT2PROGRESS 13992 +#define IDC_RSCMISSIONSTATUS_SLOT3BACKGROUND 13993 +#define IDC_RSCMISSIONSTATUS_SLOT3PROGRESS 13994 +#define IDC_RSCMISSIONSTATUS_SLOT4BACKGROUND 13995 +#define IDC_RSCMISSIONSTATUS_SLOT4PROGRESS 13996 +#define IDC_RSCMISSIONSTATUS_SLOT5BACKGROUND 13997 +#define IDC_RSCMISSIONSTATUS_SLOT5PROGRESS 13998 +#define IDC_RSCMISSIONSTATUS_SLOT6BACKGROUND 13999 +#define IDC_RSCMISSIONSTATUS_SLOT6PROGRESS 14000 +#define IDC_RSCMISSIONSTATUS_SLOT7BACKGROUND 14001 +#define IDC_RSCMISSIONSTATUS_SLOT7PROGRESS 14002 +#define IDC_RSCMISSIONSTATUS_SLOT8BACKGROUND 14003 +#define IDC_RSCMISSIONSTATUS_SLOT8PROGRESS 14004 +#define IDC_RSCMISSIONSTATUS_SLOT9BACKGROUND 14005 +#define IDC_RSCMISSIONSTATUS_SLOT9PROGRESS 14006 +#define IDC_RSCMISSIONSTATUS_SLOT0BACKGROUND 14007 +#define IDC_RSCMISSIONSTATUS_SLOT0PROGRESS 14008 +#define IDC_RSCMISSIONSTATUS_SLOT1TEXT 14093 +#define IDC_RSCMISSIONSTATUS_SLOT2TEXT 14094 +#define IDC_RSCMISSIONSTATUS_SLOT3TEXT 14095 +#define IDC_RSCMISSIONSTATUS_SLOT4TEXT 14096 +#define IDC_RSCMISSIONSTATUS_SLOT5TEXT 14097 +#define IDC_RSCMISSIONSTATUS_SLOT6TEXT 14098 +#define IDC_RSCMISSIONSTATUS_SLOT7TEXT 14099 +#define IDC_RSCMISSIONSTATUS_SLOT8TEXT 14100 +#define IDC_RSCMISSIONSTATUS_SLOT9TEXT 14101 +#define IDC_RSCMISSIONSTATUS_SLOT0TEXT 14102 +#define IDC_RSCMISSIONSTATUS_SLOT1 14183 +#define IDC_RSCMISSIONSTATUS_SLOT2 14184 +#define IDC_RSCMISSIONSTATUS_SLOT3 14185 +#define IDC_RSCMISSIONSTATUS_SLOT4 14186 +#define IDC_RSCMISSIONSTATUS_SLOT5 14187 +#define IDC_RSCMISSIONSTATUS_SLOT6 14188 +#define IDC_RSCMISSIONSTATUS_SLOT7 14189 +#define IDC_RSCMISSIONSTATUS_SLOT8 14190 +#define IDC_RSCMISSIONSTATUS_SLOT9 14191 +#define IDC_RSCMISSIONSTATUS_SLOT0 14192 +#define IDC_RSCMISSIONSTATUS_RSCMISSIONSTATUS 15283 + +//--- RscFeedback +#define IDC_RSCFEEDBACK_RSCFEEDBACK 6455 + +//--- RscDisplayCommunityGuide +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_TITLE 29956 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_PLAYERSNAME 29957 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_BRIEFINGNAME 29958 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_AUTHOR 29959 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_OVERVIEWTEXT 30056 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_OVERVIEWPICTURE 30156 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_GUIDELIST 30456 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_OVERVIEWCONTROLSGROUP 31256 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_BUTTONPLAY 31556 +#define IDC_RSCDISPLAYCOMMUNITYGUIDE_BUTTONCANCEL 31656 + +//--- RscDisplayArsenal +#define IDC_RSCDISPLAYARSENAL_MOUSEAREA 899 +#define IDC_RSCDISPLAYARSENAL_MOUSEBLOCK 898 +#define IDC_RSCDISPLAYARSENAL_TABS 1800 +#define IDC_RSCDISPLAYARSENAL_FRAMELEFT 1801 +#define IDC_RSCDISPLAYARSENAL_FRAMERIGHT 1802 +#define IDC_RSCDISPLAYARSENAL_LINEICON 1803 +#define IDC_RSCDISPLAYARSENAL_LINETABLEFT 1804 +#define IDC_RSCDISPLAYARSENAL_LINETABLEFTSELECTED 1805 +#define IDC_RSCDISPLAYARSENAL_LINETABRIGHT 1806 +#define IDC_RSCDISPLAYARSENAL_ICON 900 +#define IDC_RSCDISPLAYARSENAL_ICONBACKGROUND 830 +#define IDC_RSCDISPLAYARSENAL_TAB 930 +#define IDC_RSCDISPLAYARSENAL_LIST 960 +#define IDC_RSCDISPLAYARSENAL_SORT 800 +#define IDC_RSCDISPLAYARSENAL_LISTDISABLED 860 +#define IDC_RSCDISPLAYARSENAL_LOAD 990 +#define IDC_RSCDISPLAYARSENAL_LOADCARGO 991 +#define IDC_RSCDISPLAYARSENAL_ARROWLEFT 992 +#define IDC_RSCDISPLAYARSENAL_ARROWRIGHT 993 +#define IDC_RSCDISPLAYARSENAL_BACKGROUNDLEFT 994 +#define IDC_RSCDISPLAYARSENAL_BACKGROUNDRIGHT 995 +#define IDC_RSCDISPLAYARSENAL_MESSAGE 996 + +#define IDC_RSCDISPLAYARSENAL_TAB_PRIMARYWEAPON 0 +#define IDC_RSCDISPLAYARSENAL_TAB_SECONDARYWEAPON 1 +#define IDC_RSCDISPLAYARSENAL_TAB_HANDGUN 2 +#define IDC_RSCDISPLAYARSENAL_TAB_UNIFORM 3 +#define IDC_RSCDISPLAYARSENAL_TAB_VEST 4 +#define IDC_RSCDISPLAYARSENAL_TAB_BACKPACK 5 +#define IDC_RSCDISPLAYARSENAL_TAB_HEADGEAR 6 +#define IDC_RSCDISPLAYARSENAL_TAB_GOGGLES 7 +#define IDC_RSCDISPLAYARSENAL_TAB_NVGS 8 +#define IDC_RSCDISPLAYARSENAL_TAB_BINOCULARS 9 +#define IDC_RSCDISPLAYARSENAL_TAB_MAP 10 +#define IDC_RSCDISPLAYARSENAL_TAB_GPS 11 +#define IDC_RSCDISPLAYARSENAL_TAB_RADIO 12 +#define IDC_RSCDISPLAYARSENAL_TAB_COMPASS 13 +#define IDC_RSCDISPLAYARSENAL_TAB_WATCH 14 +#define IDC_RSCDISPLAYARSENAL_TAB_FACE 15 +#define IDC_RSCDISPLAYARSENAL_TAB_VOICE 16 +#define IDC_RSCDISPLAYARSENAL_TAB_INSIGNIA 17 +#define IDC_RSCDISPLAYARSENAL_TAB_ITEMOPTIC 18 +#define IDC_RSCDISPLAYARSENAL_TAB_ITEMACC 19 +#define IDC_RSCDISPLAYARSENAL_TAB_ITEMMUZZLE 20 +#define IDC_RSCDISPLAYARSENAL_TAB_ITEMBIPOD 25 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOMAG 21 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOTHROW 22 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOPUT 23 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOMISC 24 +#define IDC_RSCDISPLAYARSENAL_TAB_CARGOMAGALL 26 + +#define IDC_RSCDISPLAYARSENAL_WEAPON_WEAPONBACKGROUND 29489 +#define IDC_RSCDISPLAYARSENAL_WEAPON_WEAPONTEXT 29589 +#define IDC_RSCDISPLAYARSENAL_WEAPON_WEAPON 30789 + +#define IDC_RSCDISPLAYARSENAL_INFO_INFOBACKGROUND 24515 +#define IDC_RSCDISPLAYARSENAL_INFO_INFONAME 24516 +#define IDC_RSCDISPLAYARSENAL_INFO_INFOAUTHOR 24517 +#define IDC_RSCDISPLAYARSENAL_INFO_DLCBACKGROUND 24518 +#define IDC_RSCDISPLAYARSENAL_INFO_DLCICON 24715 +#define IDC_RSCDISPLAYARSENAL_INFO_INFO 25815 + +#define IDC_RSCDISPLAYARSENAL_STATS_STATSBACKGROUND 27347 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT1 27348 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT2 27349 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT3 27350 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT4 27351 +#define IDC_RSCDISPLAYARSENAL_STATS_STAT5 27352 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT1 27353 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT2 27354 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT3 27355 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT4 27356 +#define IDC_RSCDISPLAYARSENAL_STATS_STATTEXT5 27357 +#define IDC_RSCDISPLAYARSENAL_STATS_STATS 28644 + +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_CONTROLBAR 44046 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONSAVE 44146 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONLOAD 44147 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONEXPORT 44148 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONIMPORT 44149 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONRANDOM 44150 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONINTERFACE 44151 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONOK 44346 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONTRY 44347 +#define IDC_RSCDISPLAYARSENAL_CONTROLSBAR_BUTTONCLOSE 44448 + +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_TITLE 34619 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN1 34620 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_TEXTNAME 34621 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_MAINBACKGROUND 34622 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN2 34623 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN3 34624 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN4 34625 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_COLUMN5 34626 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_EDITNAME 35020 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_VALUENAME 35119 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_TEMPLATE 35919 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_BUTTONOK 36019 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_BUTTONCANCEL 36020 +#define IDC_RSCDISPLAYARSENAL_TEMPLATE_BUTTONDELETE 36021 + +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACEARSENALBACKGROUND 26603 +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACEGARAGEBACKGROUND 26604 +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACEARSENAL 26803 +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACEGARAGE 26804 +#define IDC_RSCDISPLAYARSENAL_SPACE_SPACE 27903 + +//--- RscDisplayGarage +#define IDC_RSCDISPLAYGARAGE_TAB_CAR 0 +#define IDC_RSCDISPLAYGARAGE_TAB_ARMOR 1 +#define IDC_RSCDISPLAYGARAGE_TAB_HELI 2 +#define IDC_RSCDISPLAYGARAGE_TAB_PLANE 3 +#define IDC_RSCDISPLAYGARAGE_TAB_NAVAL 4 +#define IDC_RSCDISPLAYGARAGE_TAB_STATIC 5 + +#define IDC_RSCDISPLAYGARAGE_TAB_SUBCREW 18 //--- Match he numbers with Arsenal right panel IDCs +#define IDC_RSCDISPLAYGARAGE_TAB_SUBANIMATION 19 +#define IDC_RSCDISPLAYGARAGE_TAB_SUBTEXTURE 20 + +#define IDC_RSCDISPLAYGARAGE3DEN_TAB_SUBANIMATION 0 +#define IDC_RSCDISPLAYGARAGE3DEN_TAB_SUBTEXTURE 1 + +//--- RscDisplayCreateJIRAIssue +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BACKGROUND 29997 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_SCREENSHOTPATHTITLE 29998 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_TITLE 30097 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONMISSION 30098 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONMAP 30099 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONOBJECT 30100 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONEMPTY 30101 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_SCREENSHOTPATH 30397 +#define IDC_RSCDISPLAYCREATEJIRAISSUE_BUTTONCANCEL 31697 + +//--- RscDisplayDLCContentBrowser - main display +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_TITLEBACKGROUND 37179 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MAINBACKGROUND 37180 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_TITLE 37099 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_PLAYERSNAME 37100 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONCANCEL 38799 //MUF - todo - was exported, but not added to config +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_LISTGROUP 38400 +//--- RscDisplayDLCContentBrowser - General +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_OVERVIEWBACKGROUND 37101 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_OVERVIEWTEXT 37102 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_TABSBACKGROUND 37106 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_OVERVIEWDLCNAME 37137 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_OVERVIEWPICTURE 37299 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_GENERALGROUP 38399 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONASSETS 38499 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONSINGLEPLAYER 38500 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONMULTIPLAYER 38501 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONFEATURES 38502 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONPURCHASE 38503 +//--- RscDisplayDLCContentBrowser - item template +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMBACKGROUND 37129 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMBACKGROUNDBLACK 37130 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMNAME 37131 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMTEXTSESSIONTIME 37132 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMSESSIONTIME 37133 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMTEXTTOTALTIME 37134 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMTOTALTIME 37135 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMDESCRIPTION 37136 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMPICTURE 37300 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_ITEMPREMIUMICON 37311 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_RSCDISPLAYDLCCONTENTBROWSER_ITEMTEMPLATE 38401 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONTRY 38504 +//--- RscDisplayDLCContentBrowser - dlc selection group +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSPURCHASED 37103 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELIPURCHASED 37104 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENPURCHASED 37105 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSBACKGROUND 37108 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSNAME 37109 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELIBACKGROUND 37110 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELINAME 37111 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENBACKGROUND 37112 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENNAME 37113 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUNDLEBACKGROUND 37114 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUNDLENAME 37115 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSLOGO 37301 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELILOGO 37302 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENLOGO 37303 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUNDLELOGO 37304 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_KARTSOVERLAY 37305 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_HELIOVERLAY 37306 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MARKSMENOVERLAY 37307 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUNDLEOVERLAY 37308 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLCSELECTIONGROUP 38402 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXBACKGROUND 37116 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXNAME 37117 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXPURCHASED 37118 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXLOGO 37309 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_APEXOVERLAY 37310 + + +//--- GroundSupport_ProcedureVisualization +#define IDC_GROUNDSUPPORT_PROCEDUREVISUALIZATION_PROGRESS 68374 +#define IDC_GROUNDSUPPORT_PROCEDUREVISUALIZATION_TEXT 68375 + +//--- RscDisplaySelectIsland +#define IDC_RSCDISPLAYSELECTISLAND_TITLE 24691 +#define IDC_RSCDISPLAYSELECTISLAND_NAME 24693 +#define IDC_RSCDISPLAYSELECTISLAND_AUTHOR 24694 +#define IDC_RSCDISPLAYSELECTISLAND_NAMEBACKGROUND 24695 +#define IDC_RSCDISPLAYSELECTISLAND_ISLANDPANORAMA 24891 +#define IDC_RSCDISPLAYSELECTISLAND_INTERLACING 24892 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD1 24893 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD2 24894 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD3 24895 +#define IDC_RSCDISPLAYSELECTISLAND_CLOUD4 24896 +#define IDC_RSCDISPLAYSELECTISLAND_ISLANDGROUP 25991 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCONTINUE3D 26091 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCONTINUE 26291 +#define IDC_RSCDISPLAYSELECTISLAND_BUTTONCANCEL 26391 + +//--- RscDisplayPurchaseNotification +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_TITLE 46662 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_TEXT 46663 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_DLCLIST 46762 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_PNPICTURE 46862 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_PNCONTROLSGROUP 47962 +#define IDC_RSCDISPLAYPURCHASENOTIFICATION_BUTTONOK 48262 + +//--- RscDiary +#define IDC_TASKTOOLTIP 47060 +#define IDC_TASKTOOLTIP_BACKGROUND 47061 +#define IDC_TASKTOOLTIP_TITLE 47062 +#define IDC_TASKTOOLTIP_SUBTITLE 47063 +#define IDC_TASKTOOLTIP_BUTTON 47064 +#define IDC_TASKTOOLTIP_ASSIGNEDICON 47065 +#define IDC_TASKTOOLTIP_ASSIGNEDCOUNTER 47066 + +//--- RscRespawnControlsGroup +#define IDC_RSCRESPAWNCONTROLS_RESPAWNCONTROLSGROUP 88800 +#define IDC_RSCRESPAWNCONTROLS_LOCBACKGROUND 88802 +#define IDC_RSCRESPAWNCONTROLS_ROLEBACKGROUND 88803 +#define IDC_RSCRESPAWNCONTROLS_GEARBACKGROUND 88804 +#define IDC_RSCRESPAWNCONTROLS_HEADERBACKGROUND 88801 +#define IDC_RSCRESPAWNCONTROLS_BUTTONSPECTATE 88811 +#define IDC_RSCRESPAWNCONTROLS_LOCLIST 88808 +#define IDC_RSCRESPAWNCONTROLS_ROLELIST 88809 +#define IDC_RSCRESPAWNCONTROLS_COUNTERTEXT 88826 +#define IDC_RSCRESPAWNCONTROLS_COUNTER 88806 +#define IDC_RSCRESPAWNCONTROLS_AUTORESPAWN 88830 +#define IDC_RSCRESPAWNCONTROLS_TEAMTEXT 88827 +#define IDC_RSCRESPAWNCONTROLS_TEAM 88805 +#define IDC_RSCRESPAWNCONTROLS_TICKETSTEXT 88828 +#define IDC_RSCRESPAWNCONTROLS_TICKETS 88807 +#define IDC_RSCRESPAWNCONTROLS_HEADERRESPAWNBUTTON 88829 +#define IDC_RSCRESPAWNCONTROLS_WARNING 88831 +#define IDC_RSCRESPAWNCONTROLS_COMBOLOADOUT 88813 +#define IDC_RSCRESPAWNCONTROLS_BUTTONDETAILS 88814 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDPRIMARYWEAPON 88822 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDSECONDARYWEAPON 88823 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDOPTICS 88824 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDITEM 88825 +#define IDC_RSCRESPAWNCONTROLS_PICTUREPRIMARYWEAPON 88815 +#define IDC_RSCRESPAWNCONTROLS_PICTURESECONDARYWEAPON 88816 +#define IDC_RSCRESPAWNCONTROLS_PICTUREOPTICS 88817 +#define IDC_RSCRESPAWNCONTROLS_PICTUREITEM 88818 +#define IDC_RSCRESPAWNCONTROLS_LOCTITLE 88819 +#define IDC_RSCRESPAWNCONTROLS_ROLETITLE 88820 +#define IDC_RSCRESPAWNCONTROLS_GEARTITLE 88821 +#define IDC_RSCRESPAWNCONTROLS_LOCDISABLED 88832 +#define IDC_RSCRESPAWNCONTROLS_ROLEDISABLED 88833 +#define IDC_RSCRESPAWNCONTROLS_LOADOUTDISABLED 88834 + +#define IDC_RSCRESPAWNCONTROLS_RESPAWNDETAILSCONTROLSGROUP 88850 +#define IDC_RSCRESPAWNCONTROLS_BACKGROUNDDETAILS 88851 +#define IDC_RSCRESPAWNCONTROLS_DETAILSTITLE 88852 +#define IDC_RSCRESPAWNCONTROLS_BUTTONDETAILSCLOSE 88853 + +#define IDC_RSCRESPAWNCONTROLS_RESPAWNDETAILSLISTCONTROLSGROUP 88860 +#define IDC_RSCRESPAWNCONTROLS_DETAILSLIST 88861 + +#define IDC_RSCRESPAWNCONTROLS_OVERHEADERBACKGROUND 88870 +#define IDC_RSCRESPAWNCONTROLS_OVERHEADERLEFT 88871 +#define IDC_RSCRESPAWNCONTROLS_OVERHEADERRIGHT 88872 + +#define IDC_RSCRESPAWNCONTROLS_REVIVEINFO 88874 +#define IDC_RSCRESPAWNCONTROLS_REVIVEINFO_TITLE 88875 +#define IDC_RSCRESPAWNCONTROLS_REVIVEINFO_OPTION 88876 + +#define IDC_RSCRESPAWNCONTROLS_RESPAWNINFO 88877 +#define IDC_RSCRESPAWNCONTROLS_RESPAWNINFO_TITLE 88878 +#define IDC_RSCRESPAWNCONTROLS_RESPAWNINFO_OPTION 88879 + +//--- RscRevive +#define IDC_RSCREVIVE_REVIVEPROGRESSBACKGROUND 4817 +#define IDC_RSCREVIVE_REVIVEPROGRESS 4818 +#define IDC_RSCREVIVE_REVIVEKEYPROGRESS 4819 +#define IDC_RSCREVIVE_REVIVEBAR 4820 +#define IDC_RSCREVIVE_REVIVETEXT 4917 +#define IDC_RSCREVIVE_REVIVECOUNTDOWN 4918 +#define IDC_RSCREVIVE_REVIVEINFO 4919 +#define IDC_RSCREVIVE_REVIVEKEYBACKGROUND 4920 +#define IDC_RSCREVIVE_REVIVEKEY 4921 +#define IDC_RSCREVIVE_REVIVEMEDIKIT 5017 +#define IDC_RSCREVIVE_REVIVEMEDIKITPROGRESS 5018 +#define IDC_RSCREVIVE_REVIVEDEATH 5019 +#define IDC_RSCREVIVE_REVIVERESPAWN 6117 +#define IDC_RSCREVIVE_REVIVETEXT2 6118 + +//--- DynamicGroups +#define IDC_DYNAMICGROUPS_HEADER 9377 +#define IDC_DYNAMICGROUPS_BACKGROUNDMANAGE 9379 +#define IDC_DYNAMICGROUPS_TEXTPLAYERNAME 9380 +#define IDC_DYNAMICGROUPS_BACKGROUNDGROUPNAME 9381 +#define IDC_DYNAMICGROUPS_BACKGROUNDPLAYERS 9382 +#define IDC_DYNAMICGROUPS_TEXTPLAYERSIDE 9383 +#define IDC_DYNAMICGROUPS_TEXTPLAYERCOUNT 9384 +#define IDC_DYNAMICGROUPS_TEXTPLAYERSCORE 9386 +#define IDC_DYNAMICGROUPS_TEXTPLAYERNAMEFILL 9387 +#define IDC_DYNAMICGROUPS_TEXTPLAYERSIDEFILL 9388 +#define IDC_DYNAMICGROUPS_TEXTPLAYERSCOREFILL 9389 +#define IDC_DYNAMICGROUPS_TEXTPRIVATE 9390 +#define IDC_DYNAMICGROUPS_GROUPICON 9577 +#define IDC_DYNAMICGROUPS_PICTURESIDE 9578 +#define IDC_DYNAMICGROUPS_EDITGROUPNAME 9777 +#define IDC_DYNAMICGROUPS_LISTBOXGROUPS 9877 +#define IDC_DYNAMICGROUPS_LISTBOXMANAGE 9878 +#define IDC_DYNAMICGROUPS_LISTBOXPLAYERS 9880 +#define IDC_DYNAMICGROUPS_BUTTONJOIN 9977 +#define IDC_DYNAMICGROUPS_BUTTONCREATELEAVEKICK 9978 +#define IDC_DYNAMICGROUPS_BUTTONPROMOTEDISBAND 9979 +#define IDC_DYNAMICGROUPS_BUTTONINVITE 9980 +#define IDC_DYNAMICGROUPS_TABBUTTONGROUPS 9981 +#define IDC_DYNAMICGROUPS_TABBUTTONPLAYERS 9983 +#define IDC_DYNAMICGROUPS_SECTIONMANAGE 10677 +#define IDC_DYNAMICGROUPS_SECTIONGROUPS 10679 +#define IDC_DYNAMICGROUPS_CHECKBOXPRIVATE 11177 + +//--- RscHvtPhase +#define IDC_RSCHVTPHASE_PERSISTENT 6610 +#define IDC_RSCHVTPHASE_DYNAMIC 6611 +#define IDC_RSCHVTPHASE_DOWNLOADTITLE 6612 +#define IDC_RSCHVTPHASE_DOWNLOADCONTENT 6613 +#define IDC_RSCHVTPHASE_MULTIPLIER 6614 +#define IDC_RSCHVTPHASE_RANGEBACKGROUND 6615 +#define IDC_RSCHVTPHASE_TIMER 6616 +#define IDC_RSCHVTPHASE_PROGRESSBAR 6620 +#define IDC_RSCHVTPHASE_DOWNLOADSPEED 6621 +#define IDC_RSCHVTPHASE_RANGE 6810 +#define IDC_RSCHVTPHASE_CARRIERPICTURE 6811 +#define IDC_RSCHVTPHASE_DOWNLOAD 7910 + +//--- RscPhaseRules +#define IDC_RSCPHASERULES_PHASE1NUMBER 9131 +#define IDC_RSCPHASERULES_PHASE1TEXT 9132 +#define IDC_RSCPHASERULES_PHASE2TEXT 9133 +#define IDC_RSCPHASERULES_PHASE2NUMBER 9134 +#define IDC_RSCPHASERULES_PHASE3TEXT 9135 +#define IDC_RSCPHASERULES_PHASE3NUMBER 9136 +#define IDC_RSCPHASERULES_PHASE1INFO 9137 +#define IDC_RSCPHASERULES_PHASE2INFO 9138 +#define IDC_RSCPHASERULES_PHASE3INFO 9139 +#define IDC_RSCPHASERULES_PHASERULES 10431 + +//--- RscDisplayEGSpectator +#define IDD_RSCDISPLAYEGSPECTATOR 60492 +#define IDC_RSCDISPLAYEGSPECTATOR_GAMETIMETEXT 42609 +#define IDC_RSCDISPLAYEGSPECTATOR_GAMEPHASETEXT 48610 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBBACKGROUND 42611 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEATASK 42612 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEABACKGROUND 42613 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBTASK 42614 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEACOLORBACKGROUND 42615 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBCOLORBACKGROUND 42616 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEACOLOR 42617 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBCOLOR 42618 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEAPROGRESSGROUP 48909 +#define IDC_RSCDISPLAYEGSPECTATOR_SIDEBPROGRESSGROUP 43910 +#define IDC_RSCDISPLAYEGSPECTATOR_MOUSEHANDLER 42989 +#define IDC_RSCDISPLAYEGSPECTATOR_TABS 43609 +#define IDC_RSCDISPLAYEGSPECTATOR_LIST 43109 +#define IDC_RSCDISPLAYEGSPECTATOR_LISTGROUP 43909 +#define IDC_RSCDISPLAYEGSPECTATOR_CAMERATYPESBACKGROUND 52610 +#define IDC_RSCDISPLAYEGSPECTATOR_FREE 52809 +#define IDC_RSCDISPLAYEGSPECTATOR_FOLLOW 52810 +#define IDC_RSCDISPLAYEGSPECTATOR_FPS 52811 +#define IDC_RSCDISPLAYEGSPECTATOR_CAMERATYPESGROUP 52909 +#define IDC_RSCDISPLAYEGSPECTATOR_MAP 62609 +#define IDC_RSCDISPLAYEGSPECTATOR_MAPHEADER 62610 +#define IDC_RSCDISPLAYEGSPECTATOR_MAPFOOTER 62611 +#define IDC_RSCDISPLAYEGSPECTATOR_MAPTITLE 62612 +#define IDC_RSCDISPLAYEGSPECTATOR_SPECTATORSCOUNT 62613 +#define IDC_RSCDISPLAYEGSPECTATOR_SPECTATORSICON 62809 +#define IDC_RSCDISPLAYEGSPECTATOR_MAPGROUP 63909 +#define IDC_RSCDISPLAYEGSPECTATOR_HELPBACKGROUND 72812 +#define IDC_RSCDISPLAYEGSPECTATOR_HELP 73189 +#define IDC_RSCDISPLAYEGSPECTATOR_UPPERBACKGROUND 82609 +#define IDC_RSCDISPLAYEGSPECTATOR_NAME 82610 +#define IDC_RSCDISPLAYEGSPECTATOR_LOWERLEFTBACKGROUND 82611 +#define IDC_RSCDISPLAYEGSPECTATOR_LOWERRIGHTBACKGROUND 82612 +#define IDC_RSCDISPLAYEGSPECTATOR_AVATARBACKGROUND 82613 +#define IDC_RSCDISPLAYEGSPECTATOR_KILLS_COUNT 82614 +#define IDC_RSCDISPLAYEGSPECTATOR_LANDKILLS_COUNT 82615 +#define IDC_RSCDISPLAYEGSPECTATOR_ARMOREDKILLS_COUNT 82616 +#define IDC_RSCDISPLAYEGSPECTATOR_AIRKILLS_COUNT 82617 +#define IDC_RSCDISPLAYEGSPECTATOR_DEATHS_COUNT 82618 +#define IDC_RSCDISPLAYEGSPECTATOR_TOTAL_COUNT 82619 +#define IDC_RSCDISPLAYEGSPECTATOR_AVATAR 82809 +#define IDC_RSCDISPLAYEGSPECTATOR_UNITTYPE 82810 +#define IDC_RSCDISPLAYEGSPECTATOR_KILLS 82811 +#define IDC_RSCDISPLAYEGSPECTATOR_LANDKILLS 82812 +#define IDC_RSCDISPLAYEGSPECTATOR_ARMOREDKILLS 82813 +#define IDC_RSCDISPLAYEGSPECTATOR_AIRKILLS 82814 +#define IDC_RSCDISPLAYEGSPECTATOR_DEATHS 82815 +#define IDC_RSCDISPLAYEGSPECTATOR_TOTAL 82816 +#define IDC_RSCDISPLAYEGSPECTATOR_WEAPONPICTURE 82817 +#define IDC_RSCDISPLAYEGSPECTATOR_VEHICLETYPE 82818 +#define IDC_RSCDISPLAYEGSPECTATOR_FOCUSINFO 83909 + +//--- RscEGProgress +#define IDC_RSCEGPROGRESS_DOWNLOADICONBACKGROUND 9170 +#define IDC_RSCEGPROGRESS_OBJECTIVELETTER 9171 +#define IDC_RSCEGPROGRESS_ACTIVITYBACKGROUND 9172 +#define IDC_RSCEGPROGRESS_PROGRESSBARBACKGROUND 9173 +#define IDC_RSCEGPROGRESS_TITLE 174 +#define IDC_RSCEGPROGRESS_PROGRESSBAR 9180 +#define IDC_RSCEGPROGRESS_OBJECTIVEBACKGROUND 9370 +#define IDC_RSCEGPROGRESS_ACTIVITY 372 +#define IDC_RSCEGPROGRESS_DOWNLOADICON 9374 +#define IDC_RSCEGPROGRESS_OBJECTIVEBACKGROUNDCOLOURED 9375 +#define IDC_RSCEGPROGRESS_DOWNLOAD 9376 + +//--- RscDisplayQuickPlay +#define IDC_RSCDISPLAYQUICKPLAY_TITLE 18702 +#define IDC_RSCDISPLAYQUICKPLAY_PLAYERSNAME 18703 +#define IDC_RSCDISPLAYQUICKPLAY_MODTEXT 18704 +#define IDC_RSCDISPLAYQUICKPLAY_CONTENTBACKGROUND 18705 +#define IDC_RSCDISPLAYQUICKPLAY_MAXPINGTEXT 18706 +#define IDC_RSCDISPLAYQUICKPLAY_BESTMATCHTEXT 18707 +#define IDC_RSCDISPLAYQUICKPLAY_MODBACKGROUND 18708 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPEDESCRIPTION 18713 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPETITLEBACKGROUND 18714 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPETITLE 18715 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPEOVERVIEW 18903 +#define IDC_RSCDISPLAYQUICKPLAY_GAMETYPEDESCRIPTIONBACKGROUND 18904 +#define IDC_RSCDISPLAYQUICKPLAY_MODICON 18905 +#define IDC_RSCDISPLAYQUICKPLAY_CONTENT 20002 +#define IDC_RSCDISPLAYQUICKPLAY_BUTTONBACK 20402 + +//--- RscDisplayCampaignLobby (Scripted campaign lobby) +#define IDD_CAMPAIGN_LOBBY 50000 +#define IDC_CAMPAIGN_LOBBY_BACKGROUND_FULL_GROUP 51000 +#define IDC_CAMPAIGN_LOBBY_BACKGROUND_GROUP 51100 +#define IDC_CAMPAIGN_LOBBY_BACKGROUND_LOADING_GROUP 51200 +#define IDC_CAMPAIGN_LOBBY_BACKGROUND_BORDER_GROUP 51300 +#define IDC_CAMPAIGN_LOBBY_TABLET_GROUP 52000 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_GROUP 52100 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_SEARCH_GROUP 52200 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_SETTINGS_GROUP 52300 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_RESPAWN_GROUP 52400 +#define IDC_CAMPAIGN_LOBBY_TABLET_BUTTON_REVIVE_GROUP 52500 +#define IDC_CAMPAIGN_LOBBY_TABLET_MILITARY_GROUP 52600 +#define IDC_CAMPAIGN_LOBBY_MAIN_GROUP 53000 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_GROUP 53100 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_HEADER_GROUP 53200 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_STRUCTURE_GROUP 53300 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_OPTION_CORE_GROUP 53400 +#define IDC_CAMPAIGN_LOBBY_CTRG_TREE_OPTION_GROUP 53500 +#define IDC_CAMPAIGN_LOBBY_LOGIN_GROUP 54100 +#define IDC_CAMPAIGN_LOBBY_ACCESS_KEY_GROUP 54200 +#define IDC_CAMPAIGN_LOBBY_MISSION_GROUP 54300 +#define IDC_CAMPAIGN_LOBBY_MISSION_VIDEO_GROUP 54400 +#define IDC_CAMPAIGN_LOBBY_MISSION_INTEL_GROUP 54500 +#define IDC_CAMPAIGN_LOBBY_MISSION_OVERLAY_GROUP 54600 +#define IDC_CAMPAIGN_LOBBY_MISSION_PLAYER_CORE_GROUP 55000 +#define IDC_CAMPAIGN_LOBBY_MISSION_PLAYER_GROUP 55100 +#define IDC_CAMPAIGN_LOBBY_PROGRESS_GROUP 56000 +#define IDC_CAMPAIGN_LOBBY_OVERLAY_GROUP 57000 + +// RscDisplayDLCContentBrowser +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_PICTUREBACKGROUND 2000 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_PICTURE 2001 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_VIDEOGROUP 2002 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_VIDEO 2003 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_ICON 2004 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_LINEL 2005 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_LINER 2006 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_LINET 2007 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_LINEB 2008 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_BUTTON 2009 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_TITLE 2010 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLC_HOVER 2011 + +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_MOUSEAREA 999 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLCGROUP 1001 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_DLCBACKGROUND 1002 +#define IDC_RSCDISPLAYDLCCONTENTBROWSER_BUTTONBACKGROUND 1003 + +//--- RscDisplayDLCPreview_List +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BACKGROUND 31263 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_INFOTITLE 31264 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BACKGROUNDBOTTOM 31266 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_INFO 31363 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_INFOSTATS 31364 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREANIM 31463 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTURE 31464 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BROWSEPREV 31465 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BROWSENEXT 31466 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREANIMOVERLAY 31467 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREOVERLAY 31468 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREANIMOVERLAYICON 31469 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREOVERLAYICON 31470 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREBACKGROUND 31471 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREANIMBACKGROUND 31472 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTUREGROUP 32563 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_PICTURELISTGROUP 32564 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_INFOGROUP 32565 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BUTTONTRY 32663 +#define IDC_RSCDISPLAYDLCPREVIEW_LIST_BUTTONPURCHASE 32664 + +//--- RscDisplayDLCPreview_ListItem +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_SELECT 41883 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_HOVER 41884 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_PICTURE 42083 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_SESSIONNOTIFICATION 42084 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_BACKGROUND 42085 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_BUTTON 42483 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTITEM_RSCDISPLAYDLCPREVIEW_LISTITEM 43183 + +//--- RscDisplayDLCPreview +#define IDC_RSCDISPLAYDLCPREVIEW_BACKGROUND 1001 +#define IDC_RSCDISPLAYDLCPREVIEW_LOGO 1002 +#define IDC_RSCDISPLAYDLCPREVIEW_OVERVIEW 1003 +#define IDC_RSCDISPLAYDLCPREVIEW_PREVIEWGROUP 1004 +#define IDC_RSCDISPLAYDLCPREVIEW_PREVIEWBACKGROUND 1005 +#define IDC_RSCDISPLAYDLCPREVIEW_BUTTONBACKGROUND 1006 +#define IDC_RSCDISPLAYDLCPREVIEW_BUTTONPURCHASE 1007 +#define IDC_RSCDISPLAYDLCPREVIEW_AUTHOR 1008 +#define IDC_RSCDISPLAYDLCPREVIEW_LISTGROUP 1009 +#define IDC_RSCDISPLAYDLCPREVIEW_BOHEMIA 1010 + +//--- RscDisplayTimeline +#define IDD_RSCDISPLAYTIMELINE 15000 + +//--- RscDisplayTimeline +#define IDC_RSCDISPLAYTIMELINE_BACKGROUND 16985 +#define IDC_RSCDISPLAYTIMELINE_TEXTTIME 17085 +#define IDC_RSCDISPLAYTIMELINE_TEXTPLAYRATE 17086 +#define IDC_RSCDISPLAYTIMELINE_BUTTONPLAYFORWARD 17585 +#define IDC_RSCDISPLAYTIMELINE_BUTTONPLAYBACKWARD 17586 +#define IDC_RSCDISPLAYTIMELINE_BUTTONPAUSE 17587 +#define IDC_RSCDISPLAYTIMELINE_BUTTONDECREASEPLAYRATE 17588 +#define IDC_RSCDISPLAYTIMELINE_BUTTONINCREASEPLAYRATE 17589 +#define IDC_RSCDISPLAYTIMELINE_LIST 18085 +#define IDC_RSCDISPLAYTIMELINE_TIMELINECONTROLS 18285 diff --git a/include/a3/ui_f/ui_f_curator/ui/defineResinclDesign.inc b/include/a3/ui_f/ui_f_curator/ui/defineResinclDesign.inc new file mode 100644 index 0000000..75ab540 --- /dev/null +++ b/include/a3/ui_f/ui_f_curator/ui/defineResinclDesign.inc @@ -0,0 +1,624 @@ +#include "\a3\ui_f\hpp\defineResincl.inc" + +//--- RscDisplayCurator +#define IDC_RSCDISPLAYCURATOR_CREATEBACKGROUND 15505 +#define IDC_RSCDISPLAYCURATOR_CLOCKDURATION 15506 +#define IDC_RSCDISPLAYCURATOR_ENTITIESBACKGROUND 15508 +#define IDC_RSCDISPLAYCURATOR_CLOCKDAYTIME 15509 +#define IDC_RSCDISPLAYCURATOR_CREATECLASSESBACKGROUND 15510 +#define IDC_RSCDISPLAYCURATOR_CLOCKCOUNTDOWN 15511 +#define IDC_RSCDISPLAYCURATOR_FEEDBACKMESSAGE 15512 +#define IDC_RSCDISPLAYCURATOR_POINTSBACKGROUND 15513 +#define IDC_RSCDISPLAYCURATOR_POINTS 15515 +#define IDC_RSCDISPLAYCURATOR_POINTSPREVIEW 15516 +#define IDC_RSCDISPLAYCURATOR_COMPASSBACKGROUND 15518 +#define IDC_RSCDISPLAYCURATOR_MODEUNITS 15704 +#define IDC_RSCDISPLAYCURATOR_MODEGROUPS 15705 +#define IDC_RSCDISPLAYCURATOR_MODEMODULES 15706 +#define IDC_RSCDISPLAYCURATOR_MODEMARKERS 15708 +#define IDC_RSCDISPLAYCURATOR_SIDEBLUFOR 15709 +#define IDC_RSCDISPLAYCURATOR_SIDEOPFOR 15710 +#define IDC_RSCDISPLAYCURATOR_SIDEINDEPENDENT 15711 +#define IDC_RSCDISPLAYCURATOR_SIDECIVILIAN 15712 +#define IDC_RSCDISPLAYCURATOR_SIDEEMPTY 15713 +#define IDC_RSCDISPLAYCURATOR_LOGO 15715 +#define IDC_RSCDISPLAYCURATOR_WATERMARK 15717 +#define IDC_RSCDISPLAYCURATOR_MISSIONBARTITLE 16104 +#define IDC_RSCDISPLAYCURATOR_ADDBARTITLE 16105 +#define IDC_RSCDISPLAYCURATOR_MODEFRAME 16304 +#define IDC_RSCDISPLAYCURATOR_SIDEFRAME 16305 +#define IDC_RSCDISPLAYCURATOR_POINTSFRAME 16306 +#define IDC_RSCDISPLAYCURATOR_CREATEFRAME 16307 +#define IDC_RSCDISPLAYCURATOR_ENTITIESFRAME 16308 +#define IDC_RSCDISPLAYCURATOR_ADDBARFRAME 16309 +#define IDC_RSCDISPLAYCURATOR_CLOCKFRAME 16310 +#define IDC_RSCDISPLAYCURATOR_MISSIONBARFRAME 16311 +#define IDC_RSCDISPLAYCURATOR_COMPASSFRAME 16312 +#define IDC_RSCDISPLAYCURATOR_COMPASSCARET 16314 +#define IDC_RSCDISPLAYCURATOR_MISSION 16804 +#define IDC_RSCDISPLAYCURATOR_ADDBAR 16805 +#define IDC_RSCDISPLAYCURATOR_MAIN 16806 +#define IDC_RSCDISPLAYCURATOR_ADD 16807 +#define IDC_RSCDISPLAYCURATOR_CLOCK 16808 +#define IDC_RSCDISPLAYCURATOR_MISSIONBAR 16809 +#define IDC_RSCDISPLAYCURATOR_COMPASS 16810 + +//--- Engine Curator +#define IDD_RSCDISPLAYCURATOR 312 +#define IDC_RSCDISPLAYCURATOR_SIDEBLUFOR 155 +#define IDC_RSCDISPLAYCURATOR_SIDEOPFOR 156 +#define IDC_RSCDISPLAYCURATOR_SIDEINDEPENDENT 157 +#define IDC_RSCDISPLAYCURATOR_SIDECIVILIAN 158 +#define IDC_RSCDISPLAYCURATOR_SIDEEMPTY 159 +#define IDC_RSCDISPLAYCURATOR_MODEUNITS 150 +#define IDC_RSCDISPLAYCURATOR_MODEGROUPS 151 +#define IDC_RSCDISPLAYCURATOR_MODEMODULES 152 +#define IDC_RSCDISPLAYCURATOR_MODEMARKERS 154 +#define IDC_RSCDISPLAYCURATOR_MODERECENT 170 +#define IDC_RSCDISPLAYCURATOR_ADD 450 +#define IDC_RSCDISPLAYCURATOR_MISSION 453 +#define IDC_RSCDISPLAYCURATOR_MAINMAP 50 +#define IDC_RSCDISPLAYCURATOR_MOUSEAREA 53 +#define IDC_RSCDISPLAYCURATOR_POINTS 111 +#define IDC_RSCDISPLAYCURATOR_POINTSPREVIEW 112 +#define IDC_RSCDISPLAYCURATOR_ENTITIES 251 +#define IDC_RSCDISPLAYCURATOR_CREATE_UNITS_WEST 270 +#define IDC_RSCDISPLAYCURATOR_CREATE_UNITS_EAST 271 +#define IDC_RSCDISPLAYCURATOR_CREATE_UNITS_GUER 272 +#define IDC_RSCDISPLAYCURATOR_CREATE_UNITS_CIV 273 +#define IDC_RSCDISPLAYCURATOR_CREATE_UNITS_EMPTY 274 +#define IDC_RSCDISPLAYCURATOR_CREATE_GROUPS_WEST 275 +#define IDC_RSCDISPLAYCURATOR_CREATE_GROUPS_EAST 276 +#define IDC_RSCDISPLAYCURATOR_CREATE_GROUPS_GUER 277 +#define IDC_RSCDISPLAYCURATOR_CREATE_GROUPS_CIV 278 +#define IDC_RSCDISPLAYCURATOR_CREATE_GROUPS_EMPTY 279 +#define IDC_RSCDISPLAYCURATOR_CREATE_MODULES 280 +#define IDC_RSCDISPLAYCURATOR_CREATE_MARKERS 281 +#define IDC_RSCDISPLAYCURATOR_CREATE_RECENT 282 +#define IDC_RSCDISPLAYCURATOR_CREATE_SEARCH 283 +//#define IDC_RSCDISPLAYCURATOR_FILTERPLAYERS 282 +//#define IDC_RSCDISPLAYCURATOR_FILTERAI 283 +//#define IDC_RSCDISPLAYCURATOR_FILTERCREW 284 +//#define IDC_RSCDISPLAYCURATOR_FILTERDEAD 285 +//#define IDC_RSCDISPLAYCURATOR_FILTEREMPTY 286 +//#define IDC_RSCDISPLAYCURATOR_FILTERMODULE 287 +#define IDC_RSCDISPLAYCURATOR_BLACK 999 + +//--- RscCuratorPing +#define IDC_RSCCURATORPING_ICON 10674 +#define IDC_RSCCURATORPING_PLAYER 10675 + +//--- RSCCURATORVISIONMODES +#define IDC_RSCCURATORVISIONMODES_VISIONMODE0 10463 +#define IDC_RSCCURATORVISIONMODES_VISIONMODE1 10464 +#define IDC_RSCCURATORVISIONMODES_VISIONMODE2 10465 +#define IDC_RSCCURATORVISIONMODES_VISIONMODE3 10466 +#define IDC_RSCCURATORVISIONMODES_VISIONMODE4 10467 +#define IDC_RSCCURATORVISIONMODES_VISIONMODE5 10468 +#define IDC_RSCCURATORVISIONMODES_VISIONMODE6 10469 +#define IDC_RSCCURATORVISIONMODES_VISIONMODE7 10470 +#define IDC_RSCCURATORVISIONMODES_VISIONMODE8 10471 +#define IDC_RSCCURATORVISIONMODES_VISIONMODE9 10472 +#define IDC_RSCCURATORVISIONMODES_FRAME 11263 +#define IDC_RSCCURATORVISIONMODES_VISIONMODES 11763 + +//--- RscDisplayModuleSkiptime +#define IDC_RSCDISPLAYMODULESKIPTIME_BACKGROUND 1000 +#define IDC_RSCDISPLAYMODULESKIPTIME_TITLE 1001 +#define IDC_RSCDISPLAYMODULESKIPTIME_DESCRIPTION 1100 +#define IDC_RSCDISPLAYMODULESKIPTIME_SLIDERVALUE 1003 +#define IDC_RSCDISPLAYMODULESKIPTIME_SLIDER 1900 +#define IDC_RSCDISPLAYMODULESKIPTIME_BUTTONOK 2600 +#define IDC_RSCDISPLAYMODULESKIPTIME_BUTTONCANCEL 2700 + +//--- RscDisplayAttributes +#define IDC_RSCDISPLAYATTRIBUTES_BACKGROUND 30001 +#define IDC_RSCDISPLAYATTRIBUTES_TITLE 30002 +#define IDC_RSCDISPLAYATTRIBUTES_CONTENT 30003 +#define IDC_RSCDISPLAYATTRIBUTES_BUTTONCUSTOM 30004 +#define IDC_RSCDISPLAYATTRIBUTES_BUTTONOK 30005 +#define IDC_RSCDISPLAYATTRIBUTES_BUTTONCANCEL 30006 + +#define IDC_RSCDISPLAYCURATORATTRIBUTES_TEXT 1000 +#define IDC_RSCDISPLAYCURATORATTRIBUTES_STRUCTUREDTEXT 1100 +#define IDC_RSCDISPLAYCURATORATTRIBUTES_PICTURE 1200 +#define IDC_RSCDISPLAYCURATORATTRIBUTES_ACTIVETEXT 1300 +#define IDC_RSCDISPLAYCURATORATTRIBUTES_EDIT 1400 +#define IDC_RSCDISPLAYCURATORATTRIBUTES_COMBO 2100 +#define IDC_RSCDISPLAYCURATORATTRIBUTES_LISTBOX 1500 +#define IDC_RSCDISPLAYCURATORATTRIBUTES_SLIDER 1900 + +//--- RscAttributeRank +#define IDC_RSCATTRIBUTERANK_BACKGROUND 13469 +#define IDC_RSCATTRIBUTERANK_TITLE 13471 +#define IDC_RSCATTRIBUTERANK_PRIVATE 13669 +#define IDC_RSCATTRIBUTERANK_CORPORAL 13670 +#define IDC_RSCATTRIBUTERANK_SERGEANT 13671 +#define IDC_RSCATTRIBUTERANK_LIEUTENANT 13672 +#define IDC_RSCATTRIBUTERANK_CAPTAIN 13673 +#define IDC_RSCATTRIBUTERANK_MAJOR 13674 +#define IDC_RSCATTRIBUTERANK_COLONEL 13675 +#define IDC_RSCATTRIBUTERANK_RSCATTRIBUTERANK 14769 + +//--- RscAttributeUnitPos +#define IDC_RSCATTRIBUTEUNITPOS_BACKGROUND 18976 +#define IDC_RSCATTRIBUTEUNITPOS_TITLE 18978 +#define IDC_RSCATTRIBUTEUNITPOS_DOWN 19176 +#define IDC_RSCATTRIBUTEUNITPOS_CROUCH 19177 +#define IDC_RSCATTRIBUTEUNITPOS_UP 19178 +#define IDC_RSCATTRIBUTEUNITPOS_AUTO 19179 +#define IDC_RSCATTRIBUTEUNITPOS_RSCATTRIBUTEUNITPOS 20276 + +//--- RscAttributeDamage +#define IDC_RSCATTRIBUTEDAMAGE_TITLE 16502 +#define IDC_RSCATTRIBUTEDAMAGE_VALUE 17402 +#define IDC_RSCATTRIBUTEDAMAGE_RSCATTRIBUTEDAMAGE 17802 + +//--- RscAttributeFuel +#define IDC_RSCATTRIBUTEFUEL_TITLE 13474 +#define IDC_RSCATTRIBUTEFUEL_VALUE 14374 +#define IDC_RSCATTRIBUTEFUEL_RSCATTRIBUTEFUEL 14774 + +//--- RscAttributeSide +#define IDC_RSCATTRIBUTESIDE_BACKGROUND 31000 +#define IDC_RSCATTRIBUTESIDE_TITLE 31002 +#define IDC_RSCATTRIBUTESIDE_BLUFOR 31200 +#define IDC_RSCATTRIBUTESIDE_OPFOR 31201 +#define IDC_RSCATTRIBUTESIDE_INDEPENDENT 31202 +#define IDC_RSCATTRIBUTESIDE_CIVILIAN 31203 +#define IDC_RSCATTRIBUTESIDE_RSCATTRIBUTESIDE 32300 + +//--- RscAttributeOwners +/* +#define IDC_RSCATTRIBUTEOWNERS_BACKGROUND 31000 +#define IDC_RSCATTRIBUTEOWNERS_TITLE 31002 +#define IDC_RSCATTRIBUTEOWNERS_BLUFOR 31200 +#define IDC_RSCATTRIBUTEOWNERS_OPFOR 31201 +#define IDC_RSCATTRIBUTEOWNERS_INDEPENDENT 31202 +#define IDC_RSCATTRIBUTEOWNERS_CIVILIAN 31203 +#define IDC_RSCATTRIBUTEOWNERS_RSCATTRIBUTEOWNERS 32300 +*/ +//--- RscAttributeOwners +#define IDC_RSCATTRIBUTEOWNERS_BACKGROUND 17408 +#define IDC_RSCATTRIBUTEOWNERS_TITLE 17410 +#define IDC_RSCATTRIBUTEOWNERS_BLUFOR 17608 +#define IDC_RSCATTRIBUTEOWNERS_OPFOR 17609 +#define IDC_RSCATTRIBUTEOWNERS_INDEPENDENT 17610 +#define IDC_RSCATTRIBUTEOWNERS_CIVILIAN 17611 +#define IDC_RSCATTRIBUTEOWNERS_TABSIDE 18010 +#define IDC_RSCATTRIBUTEOWNERS_TABGROUP 18011 +#define IDC_RSCATTRIBUTEOWNERS_TABUNIT 18012 +#define IDC_RSCATTRIBUTEOWNERS_GROUPLIST 18508 +#define IDC_RSCATTRIBUTEOWNERS_UNITLIST 18509 +#define IDC_RSCATTRIBUTEOWNERS_RSCATTRIBUTEOWNERS 18708 + + + +//--- RscAttributeOwners2 +#define IDC_RSCATTRIBUTEOWNERS2_BACKGROUND1 18308 +#define IDC_RSCATTRIBUTEOWNERS2_TITLE2 18309 +#define IDC_RSCATTRIBUTEOWNERS2_TITLE1 18310 +#define IDC_RSCATTRIBUTEOWNERS2_BACKGROUND2 18311 +#define IDC_RSCATTRIBUTEOWNERS2_BLUFOR1 18508 +#define IDC_RSCATTRIBUTEOWNERS2_OPFOR1 18509 +#define IDC_RSCATTRIBUTEOWNERS2_INDEPENDENT1 18510 +#define IDC_RSCATTRIBUTEOWNERS2_CIVILIAN1 18511 +#define IDC_RSCATTRIBUTEOWNERS2_BLUFOR2 18512 +#define IDC_RSCATTRIBUTEOWNERS2_OPFOR2 18513 +#define IDC_RSCATTRIBUTEOWNERS2_INDEPENDENT2 18514 +#define IDC_RSCATTRIBUTEOWNERS2_CIVILIAN2 18515 +#define IDC_RSCATTRIBUTEOWNERS2_RSCATTRIBUTEOWNERS2 19608 + +//--- RscAttributeTaskState +#define IDC_RSCATTRIBUTETASKSTATE_BACKGROUND 41000 +#define IDC_RSCATTRIBUTETASKSTATE_TITLE 41002 +#define IDC_RSCATTRIBUTETASKSTATE_ASSIGNED 41200 +#define IDC_RSCATTRIBUTETASKSTATE_CREATED 41201 +#define IDC_RSCATTRIBUTETASKSTATE_SUCCEEDED 41202 +#define IDC_RSCATTRIBUTETASKSTATE_FAILED 41203 +#define IDC_RSCATTRIBUTETASKSTATE_CANCELED 41204 +#define IDC_RSCATTRIBUTETASKSTATE_RSCATTRIBUTETASKSTATE 42300 + +//--- RscAttributeTaskDescription +#define IDC_RSCATTRIBUTETASKDESCRIPTION_TITLEMARKER 38091 +#define IDC_RSCATTRIBUTETASKDESCRIPTION_TITLEDESCRIPTION 38092 +#define IDC_RSCATTRIBUTETASKDESCRIPTION_TITLETITLE 38093 +#define IDC_RSCATTRIBUTETASKDESCRIPTION_TITLETEMPLATE 38094 +#define IDC_RSCATTRIBUTETASKDESCRIPTION_EDITTITLE 38491 +#define IDC_RSCATTRIBUTETASKDESCRIPTION_EDITMARKER 38492 +#define IDC_RSCATTRIBUTETASKDESCRIPTION_EDITDESCRIPTION 38493 +#define IDC_RSCATTRIBUTETASKDESCRIPTION_EDITTEMPLATE 39191 +#define IDC_RSCATTRIBUTETASKDESCRIPTION_RSCATTRIBUTETASKDESCRIPTION 39391 + +//--- RscAttributeSkiptime +#define IDC_RSCATTRIBUTESKIPTIME_TITLE 21138 +#define IDC_RSCATTRIBUTESKIPTIME_TIME 21139 +#define IDC_RSCATTRIBUTESKIPTIME_BACKGROUND 21140 +#define IDC_RSCATTRIBUTESKIPTIME_SKIPTIME 21141 +#define IDC_RSCATTRIBUTESKIPTIME_VALUE 22038 +#define IDC_RSCATTRIBUTESKIPTIME_RSCATTRIBUTESKIPTIME 22438 + +//--- RscAttributeSound +#define IDC_RSCATTRIBUTESOUND_TITLE 15406 +#define IDC_RSCATTRIBUTESOUND_VALUE 16506 +#define IDC_RSCATTRIBUTESOUND_RSCATTRIBUTESOUND 16706 + +//--- RscAttributeMusic +#define IDC_RSCATTRIBUTEMUSIC_TITLE 15293 +#define IDC_RSCATTRIBUTEMUSIC_VALUE 16393 +#define IDC_RSCATTRIBUTEMUSIC_RSCATTRIBUTEMUSIC 16593 + +//--- RscAttributeMusicVolume +#define IDC_RSCATTRIBUTEMUSICVOLUME_TITLE 27656 +#define IDC_RSCATTRIBUTEMUSICVOLUME_VALUE 28556 +#define IDC_RSCATTRIBUTEMUSICVOLUME_RSCATTRIBUTEMUSICVOLUME 28956 + +//--- RscAttributeGenericRadio +#define IDC_RSCATTRIBUTEGENERICRADIO_TITLE 29151 +#define IDC_RSCATTRIBUTEGENERICRADIO_VALUE 29651 +#define IDC_RSCATTRIBUTEGENERICRADIO_RSCATTRIBUTEGENERICRADIO 30451 + +//--- RscAttributeDiaryRecord +#define IDC_RSCATTRIBUTEDIARYRECORD_IMAGETITLE 27171 +#define IDC_RSCATTRIBUTEDIARYRECORD_DESCRIPTIONTITLE 27172 +#define IDC_RSCATTRIBUTEDIARYRECORD_TITLETITLE 27173 +#define IDC_RSCATTRIBUTEDIARYRECORD_IMAGETREE 27174 +#define IDC_RSCATTRIBUTEDIARYRECORD_TEMPLATETITLE 27175 +#define IDC_RSCATTRIBUTEDIARYRECORD_IMAGEPREVIEW 27371 +#define IDC_RSCATTRIBUTEDIARYRECORD_TITLEEDIT 27571 +#define IDC_RSCATTRIBUTEDIARYRECORD_DESCRIPTIONEDIT 27573 +#define IDC_RSCATTRIBUTEDIARYRECORD_TEMPLATELIST 28271 +#define IDC_RSCATTRIBUTEDIARYRECORD_RSCATTRIBUTEDIARYRECORD 28471 + +//--- RscAttributeOvercast +#define IDC_RSCATTRIBUTEOVERCAST_BACKGROUND 21192 +#define IDC_RSCATTRIBUTEOVERCAST_TITLE 21194 +#define IDC_RSCATTRIBUTEOVERCAST_VALUE000 21392 +#define IDC_RSCATTRIBUTEOVERCAST_VALUE025 21393 +#define IDC_RSCATTRIBUTEOVERCAST_VALUE050 21394 +#define IDC_RSCATTRIBUTEOVERCAST_VALUE075 21395 +#define IDC_RSCATTRIBUTEOVERCAST_VALUE100 21396 +#define IDC_RSCATTRIBUTEOVERCAST_RSCATTRIBUTEOVERCAST 22492 + +//--- RscAttributeFog +#define IDC_RSCATTRIBUTEFOG_TITLE 11804 +#define IDC_RSCATTRIBUTEFOG_ALTTITLE 11805 +#define IDC_RSCATTRIBUTEFOG_VALUE 12704 +#define IDC_RSCATTRIBUTEFOG_ALTVALUE 12705 +#define IDC_RSCATTRIBUTEFOG_RSCATTRIBUTEFOG 13104 + +//--- RscAttributePostprocess +#define IDC_RSCATTRIBUTEPOSTPROCESS_TITLE 28406 +#define IDC_RSCATTRIBUTEPOSTPROCESS_VALUE 28906 +#define IDC_RSCATTRIBUTEPOSTPROCESS_RSCATTRIBUTEPOSTPROCESS 29706 + +//--- RscAttributeGroupID +#define IDC_RSCATTRIBUTEGROUPID_TITLE 17979 +#define IDC_RSCATTRIBUTEGROUPID_VALUE 18379 +#define IDC_RSCATTRIBUTEGROUPID_RSCATTRIBUTEGROUPID 19279 + +//--- RscAttributeFormation +#define IDC_RSCATTRIBUTEFORMATION_BACKGROUND 23316 +#define IDC_RSCATTRIBUTEFORMATION_TITLE 23318 +#define IDC_RSCATTRIBUTEFORMATION_COLUMN 23516 +#define IDC_RSCATTRIBUTEFORMATION_STAG_COLUMN 23517 +#define IDC_RSCATTRIBUTEFORMATION_WEDGE 23518 +#define IDC_RSCATTRIBUTEFORMATION_ECH_LEFT 23519 +#define IDC_RSCATTRIBUTEFORMATION_ECH_RIGHT 23520 +#define IDC_RSCATTRIBUTEFORMATION_VEE 23521 +#define IDC_RSCATTRIBUTEFORMATION_LINE 23522 +#define IDC_RSCATTRIBUTEFORMATION_FILE 23523 +#define IDC_RSCATTRIBUTEFORMATION_DIAMOND 23524 +#define IDC_RSCATTRIBUTEFORMATION_DEFAULT 23525 +#define IDC_RSCATTRIBUTEFORMATION_RSCATTRIBUTEFORMATION 24616 + +//--- RscAttributeBehaviour +#define IDC_RSCATTRIBUTEBEHAVIOUR_BACKGROUND 23269 +#define IDC_RSCATTRIBUTEBEHAVIOUR_TITLE 23271 +#define IDC_RSCATTRIBUTEBEHAVIOUR_STEALTH 23469 +#define IDC_RSCATTRIBUTEBEHAVIOUR_DEFAULT 23470 +#define IDC_RSCATTRIBUTEBEHAVIOUR_SAFE 23471 +#define IDC_RSCATTRIBUTEBEHAVIOUR_AWARE 23474 +#define IDC_RSCATTRIBUTEBEHAVIOUR_COMBAT 23475 +#define IDC_RSCATTRIBUTEBEHAVIOUR_RSCATTRIBUTEBEHAVIOUR 24569 + +//--- RscAttributeLock +#define IDC_RSCATTRIBUTELOCK_BACKGROUND 13425 +#define IDC_RSCATTRIBUTELOCK_TITLE 13427 +#define IDC_RSCATTRIBUTELOCK_LOCKED 13627 +#define IDC_RSCATTRIBUTELOCK_UNLOCKED 13630 +#define IDC_RSCATTRIBUTELOCK_RSCATTRIBUTELOCK 14725 + +//--- RscAttributeMarkerText +#define IDC_RSCATTRIBUTEMARKERTEXT_TITLE 25286 +#define IDC_RSCATTRIBUTEMARKERTEXT_VALUE 25686 +#define IDC_RSCATTRIBUTEMARKERTEXT_RSCATTRIBUTEMARKERTEXT 26586 + +//--- RscAttributeMarkerColor +#define IDC_RSCATTRIBUTEMARKERCOLOR_BACKGROUND 27333 +#define IDC_RSCATTRIBUTEMARKERCOLOR_TITLE 27335 +#define IDC_RSCATTRIBUTEMARKERCOLOR_COLOR3 27533 +#define IDC_RSCATTRIBUTEMARKERCOLOR_COLOR4 27534 +#define IDC_RSCATTRIBUTEMARKERCOLOR_COLOR1 27535 +#define IDC_RSCATTRIBUTEMARKERCOLOR_COLOR5 27536 +#define IDC_RSCATTRIBUTEMARKERCOLOR_COLOR6 27537 +#define IDC_RSCATTRIBUTEMARKERCOLOR_COLOR2 27538 +#define IDC_RSCATTRIBUTEMARKERCOLOR_COLOR7 27539 +#define IDC_RSCATTRIBUTEMARKERCOLOR_COLOR8 27540 +#define IDC_RSCATTRIBUTEMARKERCOLOR_COLOR9 27541 +#define IDC_RSCATTRIBUTEMARKERCOLOR_COLOR10 27542 +#define IDC_RSCATTRIBUTEMARKERCOLOR_COLOR11 27543 +#define IDC_RSCATTRIBUTEMARKERCOLOR_COLOR12 27544 +#define IDC_RSCATTRIBUTEMARKERCOLOR_COLOR13 27545 +#define IDC_RSCATTRIBUTEMARKERCOLOR_COLOR14 27546 +#define IDC_RSCATTRIBUTEMARKERCOLOR_RSCATTRIBUTEMARKERCOLOR 28633 + +//--- RscAttributeRespawnVehicle +#define IDC_RSCATTRIBUTERESPAWNVEHICLE_BACKGROUND 34763 +#define IDC_RSCATTRIBUTERESPAWNVEHICLE_TITLE 34765 +#define IDC_RSCATTRIBUTERESPAWNVEHICLE_START 34963 +#define IDC_RSCATTRIBUTERESPAWNVEHICLE_WEST 34964 +#define IDC_RSCATTRIBUTERESPAWNVEHICLE_EAST 34965 +#define IDC_RSCATTRIBUTERESPAWNVEHICLE_GUER 34966 +#define IDC_RSCATTRIBUTERESPAWNVEHICLE_CIV 34967 +#define IDC_RSCATTRIBUTERESPAWNVEHICLE_DISABLED 34968 +#define IDC_RSCATTRIBUTERESPAWNVEHICLE_RSCATTRIBUTERESPAWNVEHICLE 36063 + +//--- RscAttributeSkill +#define IDC_RSCATTRIBUTESKILL_TITLE 15284 +#define IDC_RSCATTRIBUTESKILL_VALUE 16184 +#define IDC_RSCATTRIBUTESKILL_RSCATTRIBUTESKILL 16584 + +//--- RscAttributeRespawnPosition +#define IDC_RSCATTRIBUTERESPAWNPOSITION_BACKGROUND 38509 +#define IDC_RSCATTRIBUTERESPAWNPOSITION_TITLE 38511 +#define IDC_RSCATTRIBUTERESPAWNPOSITION_WEST 38710 +#define IDC_RSCATTRIBUTERESPAWNPOSITION_EAST 38711 +#define IDC_RSCATTRIBUTERESPAWNPOSITION_GUER 38712 +#define IDC_RSCATTRIBUTERESPAWNPOSITION_CIV 38713 +#define IDC_RSCATTRIBUTERESPAWNPOSITION_DISABLED 38714 +#define IDC_RSCATTRIBUTERESPAWNPOSITION_RSCATTRIBUTERESPAWNPOSITION 39809 + +//--- RscAttributeText +#define IDC_RSCATTRIBUTETEXT_TITLE 13920 +#define IDC_RSCATTRIBUTETEXT_RSCATTRIBUTETEXT 15120 + +//--- RscAttributeAreaSize +#define IDC_RSCATTRIBUTEAREASIZE_TITLE 20438 +#define IDC_RSCATTRIBUTEAREASIZE_VALUE 20439 +#define IDC_RSCATTRIBUTEAREASIZE_RSCATTRIBUTEAREASIZE 21738 + +//--- RscAttributeRespawnTickets +#define IDC_RSCATTRIBUTERESPAWNTICKETS_BACKGROUND 35332 +#define IDC_RSCATTRIBUTERESPAWNTICKETS_WESTTEXT 35333 +#define IDC_RSCATTRIBUTERESPAWNTICKETS_EASTTEXT 35334 +#define IDC_RSCATTRIBUTERESPAWNTICKETS_GUERTEXT 35335 +#define IDC_RSCATTRIBUTERESPAWNTICKETS_CIVTEXT 35336 +#define IDC_RSCATTRIBUTERESPAWNTICKETS_TITLE 35337 +#define IDC_RSCATTRIBUTERESPAWNTICKETS_VALUE 35338 +#define IDC_RSCATTRIBUTERESPAWNTICKETS_WEST 35532 +#define IDC_RSCATTRIBUTERESPAWNTICKETS_EAST 35533 +#define IDC_RSCATTRIBUTERESPAWNTICKETS_GUER 35534 +#define IDC_RSCATTRIBUTERESPAWNTICKETS_CIV 35535 +#define IDC_RSCATTRIBUTERESPAWNTICKETS_WESTVALUE 36232 +#define IDC_RSCATTRIBUTERESPAWNTICKETS_EASTVALUE 36233 +#define IDC_RSCATTRIBUTERESPAWNTICKETS_GUERVALUE 36234 +#define IDC_RSCATTRIBUTERESPAWNTICKETS_CIVVALUE 36235 +#define IDC_RSCATTRIBUTERESPAWNTICKETS_RSCATTRIBUTERESPAWNTICKETS 36632 + +//--- RscAttributeCountdown +#define IDC_RSCATTRIBUTECOUNTDOWN_TITLE 23629 +#define IDC_RSCATTRIBUTECOUNTDOWN_TIME 23630 +#define IDC_RSCATTRIBUTECOUNTDOWN_BACKGROUND 23631 +#define IDC_RSCATTRIBUTECOUNTDOWN_VALUE 24529 +#define IDC_RSCATTRIBUTECOUNTDOWN_RSCATTRIBUTECOUNTDOWN 24929 + +//--- RscAttributeEndMission +#define IDC_RSCATTRIBUTEENDMISSION_TITLE 25122 +#define IDC_RSCATTRIBUTEENDMISSION_TITLEDEBRIEFING 25123 +#define IDC_RSCATTRIBUTEENDMISSION_DEBRIEFING 25522 +#define IDC_RSCATTRIBUTEENDMISSION_VALUE 25622 +#define IDC_RSCATTRIBUTEENDMISSION_RSCATTRIBUTEENDMISSION 26422 + +//--- RscAttributeName +#define IDC_RSCATTRIBUTENAME_TITLE 13317 +#define IDC_RSCATTRIBUTENAME_VALUE 13717 +#define IDC_RSCATTRIBUTENAME_RSCATTRIBUTENAME 14617 + +//--- RscAttributeInventory +#define IDC_RSCATTRIBUTEINVENTORY_LOAD 23868 +#define IDC_RSCATTRIBUTEINVENTORY_LISTBACKGROUND 23869 +#define IDC_RSCATTRIBUTEINVENTORY_FILTERBACKGROUND 23870 +#define IDC_RSCATTRIBUTEINVENTORY_FILTER0 24068 +#define IDC_RSCATTRIBUTEINVENTORY_FILTER1 24069 +#define IDC_RSCATTRIBUTEINVENTORY_FILTER2 24070 +#define IDC_RSCATTRIBUTEINVENTORY_FILTER3 24071 +#define IDC_RSCATTRIBUTEINVENTORY_FILTER4 24072 +#define IDC_RSCATTRIBUTEINVENTORY_FILTER5 24073 +#define IDC_RSCATTRIBUTEINVENTORY_FILTER6 24074 +#define IDC_RSCATTRIBUTEINVENTORY_FILTER7 24075 +#define IDC_RSCATTRIBUTEINVENTORY_FILTER8 24076 +#define IDC_RSCATTRIBUTEINVENTORY_FILTER9 24077 +#define IDC_RSCATTRIBUTEINVENTORY_FILTER10 24078 +#define IDC_RSCATTRIBUTEINVENTORY_FILTER11 24079 +#define IDC_RSCATTRIBUTEINVENTORY_FILTER12 24080 +#define IDC_RSCATTRIBUTEINVENTORY_LIST 24368 +#define IDC_RSCATTRIBUTEINVENTORY_ARROWLEFT 24468 +#define IDC_RSCATTRIBUTEINVENTORY_ARROWRIGHT 24469 +#define IDC_RSCATTRIBUTEINVENTORY_RSCATTRIBUTEINVENTORY 25168 + +//--- RscAttributeRespawnInventory +#define IDC_RSCATTRIBUTERESPAWNINVENTORY_LISTBACKGROUND 41829 +#define IDC_RSCATTRIBUTERESPAWNINVENTORY_FILTERBACKGROUND 41830 +#define IDC_RSCATTRIBUTERESPAWNINVENTORY_FILTER0 42028 +#define IDC_RSCATTRIBUTERESPAWNINVENTORY_FILTER1 42029 +#define IDC_RSCATTRIBUTERESPAWNINVENTORY_FILTER2 42030 +#define IDC_RSCATTRIBUTERESPAWNINVENTORY_FILTER3 42031 +#define IDC_RSCATTRIBUTERESPAWNINVENTORY_TREEWEST 42328 +#define IDC_RSCATTRIBUTERESPAWNINVENTORY_TREEEAST 42329 +#define IDC_RSCATTRIBUTERESPAWNINVENTORY_TREEGUER 42330 +#define IDC_RSCATTRIBUTERESPAWNINVENTORY_TREECIV 42331 +#define IDC_RSCATTRIBUTERESPAWNINVENTORY_RSCATTRIBUTERESPAWNINVENTORY 43128 + +//--- RscAttributeCAS +#define IDC_RSCATTRIBUTECAS_TITLE 10890 +#define IDC_RSCATTRIBUTECAS_VALUE 11390 +#define IDC_RSCATTRIBUTECAS_RSCATTRIBUTECAS 12190 + +//--- RscAttributeExec +#define IDC_RSCATTRIBUTEEXEC_TITLE 13366 +#define IDC_RSCATTRIBUTEEXEC_VALUE 13766 +#define IDC_RSCATTRIBUTEEXEC_VALUETEMPLATE 14466 +#define IDC_RSCATTRIBUTEEXEC_RSCATTRIBUTEEXEC 14666 + +//--- RSCATTRIBUTEMISSIONNAME +#define IDC_RSCATTRIBUTEMISSIONNAME_TITLE 20175 +#define IDC_RSCATTRIBUTEMISSIONNAME_PREVIEWTITLE 20176 +#define IDC_RSCATTRIBUTEMISSIONNAME_PREVIEW 20275 +#define IDC_RSCATTRIBUTEMISSIONNAME_VALUE 20575 +#define IDC_RSCATTRIBUTEMISSIONNAME_RSCATTRIBUTEMISSIONNAME 21475 + +//--- RscAttributeSpeedMode +#define IDC_RSCATTRIBUTESPEEDMODE_BACKGROUND 22287 +#define IDC_RSCATTRIBUTESPEEDMODE_TITLE 22289 +#define IDC_RSCATTRIBUTESPEEDMODE_DEFAULT 22488 +#define IDC_RSCATTRIBUTESPEEDMODE_LIMITED 22489 +#define IDC_RSCATTRIBUTESPEEDMODE_NORMAL 22492 +#define IDC_RSCATTRIBUTESPEEDMODE_FULL 22493 +#define IDC_RSCATTRIBUTESPEEDMODE_RSCATTRIBUTESPEEDMODE 23587 + +//--- RscAttributeTaskDestination +#define IDC_RSCATTRIBUTETASKDESTINATION_BACKGROUND 38009 +#define IDC_RSCATTRIBUTETASKDESTINATION_VALUE 38010 +#define IDC_RSCATTRIBUTETASKDESTINATION_TITLE 38011 +#define IDC_RSCATTRIBUTETASKDESTINATION_RSCATTRIBUTETASKDESTINATION 39309 + +//--- RscAttributeWaypointType +#define IDC_RSCATTRIBUTEWAYPOINTTYPE_BACKGROUND 30511 +#define IDC_RSCATTRIBUTEWAYPOINTTYPE_TITLE 30513 +#define IDC_RSCATTRIBUTEWAYPOINTTYPE_VALUE 31011 +#define IDC_RSCATTRIBUTEWAYPOINTTYPE_RSCATTRIBUTEWAYPOINTTYPE 31811 + +//--- RscAttributeWaypointTimeout +#define IDC_RSCATTRIBUTEWAYPOINTTIMEOUT_TITLE 38714 +#define IDC_RSCATTRIBUTEWAYPOINTTIMEOUT_BUTTONTIME00 39314 +#define IDC_RSCATTRIBUTEWAYPOINTTIMEOUT_BUTTONTIME05 39316 +#define IDC_RSCATTRIBUTEWAYPOINTTIMEOUT_BUTTONTIME10 39317 +#define IDC_RSCATTRIBUTEWAYPOINTTIMEOUT_BUTTONTIME15 39318 +#define IDC_RSCATTRIBUTEWAYPOINTTIMEOUT_BUTTONTIME20 39319 +#define IDC_RSCATTRIBUTEWAYPOINTTIMEOUT_BUTTONTIME25 39320 +#define IDC_RSCATTRIBUTEWAYPOINTTIMEOUT_BUTTONTIME30 39321 +#define IDC_RSCATTRIBUTEWAYPOINTTIMEOUT_RSCATTRIBUTEWAYPOINTTIMEOUT 40014 + +//--- RscAttributeTimeMultiplier +#define IDC_RSCATTRIBUTETIMEMULTIPLIER_TITLE 35379 +#define IDC_RSCATTRIBUTETIMEMULTIPLIER_MULTIPLIER 35380 +#define IDC_RSCATTRIBUTETIMEMULTIPLIER_BACKGROUND 35381 +#define IDC_RSCATTRIBUTETIMEMULTIPLIER_EXAMPLE 35382 +#define IDC_RSCATTRIBUTETIMEMULTIPLIER_VALUE 36279 +#define IDC_RSCATTRIBUTETIMEMULTIPLIER_RSCATTRIBUTETIMEMULTIPLIER 36679 + +//--- RscAttributeHintTopics +#define IDC_RSCATTRIBUTEHINTTOPICS_TITLE 25225 +#define IDC_RSCATTRIBUTEHINTTOPICS_VALUE 25725 +#define IDC_RSCATTRIBUTEHINTTOPICS_RSCATTRIBUTEHINTTOPICS 26525 + +//--- RscAttributeBootcampStage +#define IDC_RSCATTRIBUTEBOOTCAMPSTAGE_BACKGROUND 31954 +#define IDC_RSCATTRIBUTEBOOTCAMPSTAGE_TITLE 31956 +#define IDC_RSCATTRIBUTEBOOTCAMPSTAGE_INFANTRY 32154 +#define IDC_RSCATTRIBUTEBOOTCAMPSTAGE_MOTORIZEDVEHICLES 32155 +#define IDC_RSCATTRIBUTEBOOTCAMPSTAGE_RSCATTRIBUTEBOOTCAMPSTAGE 33254 + +//--- RscAttributeHintCustom +#define IDC_RSCATTRIBUTEHINTCUSTOM_TITLETITLE 25434 +#define IDC_RSCATTRIBUTEHINTCUSTOM_EDITTITLE 25832 +#define IDC_RSCATTRIBUTEHINTCUSTOM_RSCATTRIBUTEHINTCUSTOM 26732 + +//--- RscAttributePunishmentAnimation +#define IDC_RSCATTRIBUTEPUNISHMENTANIMATION_BACKGROUND 50118 +#define IDC_RSCATTRIBUTEPUNISHMENTANIMATION_TITLE 50120 +#define IDC_RSCATTRIBUTEPUNISHMENTANIMATION_PUSHUPS 50318 +#define IDC_RSCATTRIBUTEPUNISHMENTANIMATION_LEGPUSHUPS 50319 +#define IDC_RSCATTRIBUTEPUNISHMENTANIMATION_RSCATTRIBUTEPUNISHMENTANIMATION 51418 + +//--- RscAttributeTargetPopup +#define IDC_RSCATTRIBUTETARGETPOPUP_BACKGROUND 27787 +#define IDC_RSCATTRIBUTETARGETPOPUP_VALUE 27788 +#define IDC_RSCATTRIBUTETARGETPOPUP_TITLE 27789 +#define IDC_RSCATTRIBUTETARGETPOPUP_RSCATTRIBUTETARGETPOPUP 29087 + +//--- RscAttributeTargetPopupDelay +#define IDC_RSCATTRIBUTETARGETPOPUPDELAY_TITLE 40264 +#define IDC_RSCATTRIBUTETARGETPOPUPDELAY_VALUE 41164 +#define IDC_RSCATTRIBUTETARGETPOPUPDELAY_RSCATTRIBUTETARGETPOPUPDELAY 41564 + +//--- RscAttributeTargetData +#define IDC_RSCATTRIBUTETARGETDATA_VALUE 25001 +#define IDC_RSCATTRIBUTETARGETDATA_RSCATTRIBUTETARGETDATA 25801 + +//--- RscAttributeTargetDataStore +#define IDC_RSCATTRIBUTETARGETDATASTORE_BACKGROUND 37135 +#define IDC_RSCATTRIBUTETARGETDATASTORE_VALUE 37136 +#define IDC_RSCATTRIBUTETARGETDATASTORE_TITLE 37137 +#define IDC_RSCATTRIBUTETARGETDATASTORE_RSCATTRIBUTETARGETDATASTORE 38435 + +//--- RscAttributeTargetTexture +#define IDC_RSCATTRIBUTETARGETTEXTURE_BACKGROUND 32964 +#define IDC_RSCATTRIBUTETARGETTEXTURE_TITLE 32966 +#define IDC_RSCATTRIBUTETARGETTEXTURE_PREVIEW 33167 +#define IDC_RSCATTRIBUTETARGETTEXTURE_TEXTURELIST 33464 +#define IDC_RSCATTRIBUTETARGETTEXTURE_RSCATTRIBUTETARGETTEXTURE 34264 +#define IDC_RSCATTRIBUTETARGETTEXTURE_OVERLAP 34265 + +//--- RscAttributeTargetState +#define IDC_RSCATTRIBUTETARGETSTATE_BACKGROUND 27373 +#define IDC_RSCATTRIBUTETARGETSTATE_VALUE 27374 +#define IDC_RSCATTRIBUTETARGETSTATE_TITLE 27375 +#define IDC_RSCATTRIBUTETARGETSTATE_RSCATTRIBUTETARGETSTATE 28673 + +//--- RscDisplayTargetBoard +#define IDC_RSCDISPLAYTARGETBOARD_TABLE 22928 +#define IDC_RSCDISPLAYTARGETBOARD_BACKGROUNDTITLE 23628 +#define IDC_RSCDISPLAYTARGETBOARD_BACKGROUND 23629 +#define IDC_RSCDISPLAYTARGETBOARD_BUTTONOK 24028 + +//--- RscDisplayFiringRangeBoard +#define IDC_RSCDISPLAYFIRINGRANGEBOARD_TABLE 34191 +#define IDC_RSCDISPLAYFIRINGRANGEBOARD_BACKGROUNDTITLE 34891 +#define IDC_RSCDISPLAYFIRINGRANGEBOARD_BUTTONOK 35291 + +//--- RscDisplayTimeTrialBoard +#define IDC_RSCDISPLAYTIMETRIALBOARD_TABLE 29399 +#define IDC_RSCDISPLAYTIMETRIALBOARD_BACKGROUNDTITLE 30099 +#define IDC_RSCDISPLAYTIMETRIALBOARD_BUTTONOK 30499 + +//--- RscRecruitStatus +#define IDC_RSCRECRUITSTATUS_PROGRESSBAR 13986 +#define IDC_RSCRECRUITSTATUS_TITLE 14086 +#define IDC_RSCRECRUITSTATUS_DESCRIPTION 14087 +#define IDC_RSCRECRUITSTATUS_LIST 14486 +#define IDC_RSCRECRUITSTATUS_BACKGROUND 15186 + +#define IDC_RSCMISSIONTEXT 20145 +#define IDC_RSCMISSIONTEXT_TEXT 20146 + +//--- RscVRMeta +#define IDC_RSCVRMETA_BACKGROUNDFATIGUE 4478 +#define IDC_RSCVRMETA_BACKGROUNDSPEED 4479 +#define IDC_RSCVRMETA_BACKGROUNDLOAD 4480 +#define IDC_RSCVRMETA_BACKGROUNDTGT 4481 +#define IDC_RSCVRMETA_PROGRESSLOAD 4482 +#define IDC_RSCVRMETA_PROGRESSFATIGUE 4483 +#define IDC_RSCVRMETA_PROGRESSSPEED 4484 +#define IDC_RSCVRMETA_TEXTLOAD 4485 +#define IDC_RSCVRMETA_TEXTFATIGUE 4486 +#define IDC_RSCVRMETA_TEXTSPEED 4487 +#define IDC_RSCVRMETA_VALUELOAD 4488 +#define IDC_RSCVRMETA_VALUEFATIGUE 4489 +#define IDC_RSCVRMETA_VALUESPEED 4490 +#define IDC_RSCVRMETA_TEXTTGT 4491 +#define IDC_RSCVRMETA_PROGRESSTGT 4492 +#define IDC_RSCVRMETA_VALUETGT 4494 +#define IDC_RSCVRMETA_VALUETGTDMG 4495 +#define IDC_RSCVRMETA_VRMETA 5778 diff --git a/include/x/cba/addons/main/$PBOPREFIX$ b/include/x/cba/addons/main/$PBOPREFIX$ new file mode 100644 index 0000000..835b0c9 --- /dev/null +++ b/include/x/cba/addons/main/$PBOPREFIX$ @@ -0,0 +1 @@ +x\cba\addons\main \ No newline at end of file diff --git a/include/x/cba/addons/main/script_macros_common.hpp b/include/x/cba/addons/main/script_macros_common.hpp new file mode 100644 index 0000000..be13021 --- /dev/null +++ b/include/x/cba/addons/main/script_macros_common.hpp @@ -0,0 +1,1833 @@ +/* + Header: script_macros_common.hpp + + Description: + A general set of useful macro functions for use by CBA itself or by any module that uses CBA. + + Authors: + Sickboy and Spooner +*/ + +/* **************************************************** + New - Should be exported to general addon + Aim: + - Simplify (shorten) the amount of characters required for repetitive tasks + - Provide a solid structure that can be dynamic and easy editable (Which sometimes means we cannot adhere to Aim #1 ;-) + An example is the path that is built from defines. Some available in this file, others in mods and addons. + + Follows Standard: + Object variables: PREFIX_COMPONENT + Main-object variables: PREFIX_main + Paths: MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SCRIPTNAME.sqf + e.g: x\six\addons\sys_menu\fDate.sqf + + Usage: + define PREFIX and COMPONENT, then include this file + (Note, you could have a main addon for your mod, define the PREFIX in a macros.hpp, + and include this script_macros_common.hpp file. + Then in your addons, add a component.hpp, define the COMPONENT, + and include your mod's script_macros.hpp + In your scripts you can then include the addon's component.hpp with relative path) + + TODO: + - Try only to use 1 string type " vs ' + - Evaluate double functions, and simplification + - Evaluate naming scheme; current = prototype + - Evaluate "Debug" features.. + - Evaluate "create mini function per precompiled script, that will load the script on first usage, rather than on init" + - Also saw "Namespace" typeName, evaluate which we need :P + - Single/Multi player gamelogics? (Incase of MP, you would want only 1 gamelogic per component, which is pv'ed from server, etc) + */ + +#ifndef MAINPREFIX + #define MAINPREFIX x +#endif + +#ifndef SUBPREFIX + #define SUBPREFIX addons +#endif + +#ifndef MAINLOGIC + #define MAINLOGIC main +#endif + +#define ADDON DOUBLES(PREFIX,COMPONENT) +#define MAIN_ADDON DOUBLES(PREFIX,main) + +/* ------------------------------------------- +Macro: VERSION_CONFIG + Define CBA Versioning System config entries. + + VERSION should be a floating-point number (1 separator). + VERSION_STR is a string representation of the version. + VERSION_AR is an array representation of the version. + + VERSION must always be defined, otherwise it is 0. + VERSION_STR and VERSION_AR default to VERSION if undefined. + +Parameters: + None + +Example: + (begin example) + #define VERSION 1.0 + #define VERSION_STR 1.0.1 + #define VERSION_AR 1,0,1 + + class CfgPatches { + class MyMod_main { + VERSION_CONFIG; + }; + }; + (end) + +Author: + ?, Jonpas +------------------------------------------- */ +#ifndef VERSION + #define VERSION 0 +#endif + +#ifndef VERSION_STR + #define VERSION_STR VERSION +#endif + +#ifndef VERSION_AR + #define VERSION_AR VERSION +#endif + +#ifndef VERSION_CONFIG + #define VERSION_CONFIG version = VERSION; versionStr = QUOTE(VERSION_STR); versionAr[] = {VERSION_AR} +#endif + +/* ------------------------------------------- +Group: Debugging +------------------------------------------- */ + +/* ------------------------------------------- +Macros: DEBUG_MODE_x + Managing debugging based on debug level. + + According to the *highest* level of debugging that has been defined *before* script_macros_common.hpp is included, + only the appropriate debugging commands will be functional. With no level explicitely defined, assume DEBUG_MODE_NORMAL. + + DEBUG_MODE_FULL - Full debugging output. + DEBUG_MODE_NORMAL - All debugging except and (Default setting if none specified). + DEBUG_MODE_MINIMAL - Only and enabled. + +Examples: + In order to turn on full debugging for a single file, + (begin example) + // Top of individual script file. + #define DEBUG_MODE_FULL + #include "script_component.hpp" + (end) + + In order to force minimal debugging for a single component, + (begin example) + // Top of addons\\script_component.hpp + // Ensure that any FULL and NORMAL setting from the individual files are undefined and MINIMAL is set. + #ifdef DEBUG_MODE_FULL + #undef DEBUG_MODE_FULL + #endif + #ifdef DEBUG_MODE_NORMAL + #undef DEBUG_MODE_NORMAL + #endif + #ifndef DEBUG_MODE_MINIMAL + #define DEBUG_MODE_MINIMAL + #endif + #include "script_macros.hpp" + (end) + + In order to turn on full debugging for a whole addon, + (begin example) + // Top of addons\main\script_macros.hpp + #ifndef DEBUG_MODE_FULL + #define DEBUG_MODE_FULL + #endif + #include "\x\cba\addons\main\script_macros_common.hpp" + (end) + +Author: + Spooner +------------------------------------------- */ + +// If DEBUG_MODE_FULL, then also enable DEBUG_MODE_NORMAL. +#ifdef DEBUG_MODE_FULL +#define DEBUG_MODE_NORMAL +#endif + +// If DEBUG_MODE_NORMAL, then also enable DEBUG_MODE_MINIMAL. +#ifdef DEBUG_MODE_NORMAL +#define DEBUG_MODE_MINIMAL +#endif + +// If no debug modes specified, use DEBUG_MODE_NORMAL (+ DEBUG_MODE_MINIMAL). +#ifndef DEBUG_MODE_MINIMAL +#define DEBUG_MODE_NORMAL +#define DEBUG_MODE_MINIMAL +#endif + +#define LOG_SYS_FORMAT(LEVEL,MESSAGE) format ['[%1] (%2) %3: %4', toUpper 'PREFIX', 'COMPONENT', LEVEL, MESSAGE] + +#ifdef DEBUG_SYNCHRONOUS +#define LOG_SYS(LEVEL,MESSAGE) diag_log text LOG_SYS_FORMAT(LEVEL,MESSAGE) +#else +#define LOG_SYS(LEVEL,MESSAGE) LOG_SYS_FORMAT(LEVEL,MESSAGE) call CBA_fnc_log +#endif + +#define LOG_SYS_FILELINENUMBERS(LEVEL,MESSAGE) LOG_SYS(LEVEL,format [ARR_4('%1 %2:%3',MESSAGE,__FILE__,__LINE__ + 1)]) + +/* ------------------------------------------- +Macro: LOG() + Log a debug message into the RPT log. + + Only run if is defined. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + LOG("Initiated clog-dancing simulator."); + (end) + +Author: + Spooner +------------------------------------------- */ +#ifdef DEBUG_MODE_FULL + +#define LOG(MESSAGE) LOG_SYS('LOG',MESSAGE) +#define LOG_1(MESSAGE,ARG1) LOG(FORMAT_1(MESSAGE,ARG1)) +#define LOG_2(MESSAGE,ARG1,ARG2) LOG(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define LOG_3(MESSAGE,ARG1,ARG2,ARG3) LOG(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define LOG_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) LOG(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define LOG_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) LOG(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define LOG_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) LOG(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define LOG_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) LOG(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define LOG_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) LOG(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +#else + +#define LOG(MESSAGE) /* disabled */ +#define LOG_1(MESSAGE,ARG1) /* disabled */ +#define LOG_2(MESSAGE,ARG1,ARG2) /* disabled */ +#define LOG_3(MESSAGE,ARG1,ARG2,ARG3) /* disabled */ +#define LOG_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) /* disabled */ +#define LOG_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) /* disabled */ +#define LOG_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) /* disabled */ +#define LOG_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) /* disabled */ +#define LOG_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) /* disabled */ + +#endif + +/* ------------------------------------------- +Macro: INFO() + Record a message without file and line number in the RPT log. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + INFO("Mod X is loaded, do Y"); + (end) + +Author: + commy2 +------------------------------------------- */ +#define INFO(MESSAGE) LOG_SYS('INFO',MESSAGE) +#define INFO_1(MESSAGE,ARG1) INFO(FORMAT_1(MESSAGE,ARG1)) +#define INFO_2(MESSAGE,ARG1,ARG2) INFO(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define INFO_3(MESSAGE,ARG1,ARG2,ARG3) INFO(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define INFO_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) INFO(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define INFO_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) INFO(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define INFO_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) INFO(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define INFO_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) INFO(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define INFO_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) INFO(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: WARNING() + Record a non-critical error in the RPT log. + + Only run if or higher is defined. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + WARNING("This function has been deprecated. Please don't use it in future!"); + (end) + +Author: + Spooner +------------------------------------------- */ +#ifdef DEBUG_MODE_NORMAL + +#define WARNING(MESSAGE) LOG_SYS('WARNING',MESSAGE) +#define WARNING_1(MESSAGE,ARG1) WARNING(FORMAT_1(MESSAGE,ARG1)) +#define WARNING_2(MESSAGE,ARG1,ARG2) WARNING(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define WARNING_3(MESSAGE,ARG1,ARG2,ARG3) WARNING(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define WARNING_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) WARNING(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define WARNING_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) WARNING(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define WARNING_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) WARNING(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define WARNING_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) WARNING(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define WARNING_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) WARNING(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +#else + +#define WARNING(MESSAGE) /* disabled */ +#define WARNING_1(MESSAGE,ARG1) /* disabled */ +#define WARNING_2(MESSAGE,ARG1,ARG2) /* disabled */ +#define WARNING_3(MESSAGE,ARG1,ARG2,ARG3) /* disabled */ +#define WARNING_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) /* disabled */ +#define WARNING_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) /* disabled */ +#define WARNING_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) /* disabled */ +#define WARNING_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) /* disabled */ +#define WARNING_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) /* disabled */ + +#endif + +/* ------------------------------------------- +Macro: ERROR() + Record a critical error in the RPT log. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + ERROR("value of frog not found in config ...yada...yada..."); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ERROR(MESSAGE) LOG_SYS('ERROR',MESSAGE) +#define ERROR_1(MESSAGE,ARG1) ERROR(FORMAT_1(MESSAGE,ARG1)) +#define ERROR_2(MESSAGE,ARG1,ARG2) ERROR(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define ERROR_3(MESSAGE,ARG1,ARG2,ARG3) ERROR(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define ERROR_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) ERROR(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define ERROR_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) ERROR(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define ERROR_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ERROR(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define ERROR_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define ERROR_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: ERROR_MSG() + Record a critical error in the RPT log and display on screen error message. + + Newlines (\n) in the MESSAGE will be put on separate lines. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + ERROR_MSG("value of frog not found in config ...yada...yada..."); + (end) + +Author: + commy2 +------------------------------------------- */ +#define ERROR_MSG(MESSAGE) ['PREFIX', 'COMPONENT', nil, MESSAGE, __FILE__, __LINE__ + 1] call CBA_fnc_error +#define ERROR_MSG_1(MESSAGE,ARG1) ERROR_MSG(FORMAT_1(MESSAGE,ARG1)) +#define ERROR_MSG_2(MESSAGE,ARG1,ARG2) ERROR_MSG(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define ERROR_MSG_3(MESSAGE,ARG1,ARG2,ARG3) ERROR_MSG(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define ERROR_MSG_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) ERROR_MSG(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define ERROR_MSG_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) ERROR_MSG(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define ERROR_MSG_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ERROR_MSG(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define ERROR_MSG_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR_MSG(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define ERROR_MSG_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR_MSG(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: ERROR_WITH_TITLE() + Record a critical error in the RPT log. + + The title can be specified (in the heading is always just "ERROR") + Newlines (\n) in the MESSAGE will be put on separate lines. + +Parameters: + TITLE - Title of error message + MESSAGE - Body of error message + +Example: + (begin example) + ERROR_WITH_TITLE("Value not found","Value of frog not found in config ...yada...yada..."); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ERROR_WITH_TITLE(TITLE,MESSAGE) ['PREFIX', 'COMPONENT', TITLE, MESSAGE, __FILE__, __LINE__ + 1] call CBA_fnc_error +#define ERROR_WITH_TITLE_1(TITLE,MESSAGE,ARG1) ERROR_WITH_TITLE(TITLE,FORMAT_1(MESSAGE,ARG1)) +#define ERROR_WITH_TITLE_2(TITLE,MESSAGE,ARG1,ARG2) ERROR_WITH_TITLE(TITLE,FORMAT_2(MESSAGE,ARG1,ARG2)) +#define ERROR_WITH_TITLE_3(TITLE,MESSAGE,ARG1,ARG2,ARG3) ERROR_WITH_TITLE(TITLE,FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define ERROR_WITH_TITLE_4(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4) ERROR_WITH_TITLE(TITLE,FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define ERROR_WITH_TITLE_5(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) ERROR_WITH_TITLE(TITLE,FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define ERROR_WITH_TITLE_6(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ERROR_WITH_TITLE(TITLE,FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define ERROR_WITH_TITLE_7(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR_WITH_TITLE(TITLE,FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define ERROR_WITH_TITLE_8(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR_WITH_TITLE(TITLE,FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: MESSAGE_WITH_TITLE() + Record a single line in the RPT log. + +Parameters: + TITLE - Title of log message + MESSAGE - Body of message + +Example: + (begin example) + MESSAGE_WITH_TITLE("Value found","Value of frog found in config "); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define MESSAGE_WITH_TITLE(TITLE,MESSAGE) LOG_SYS_FILELINENUMBERS(TITLE,MESSAGE) + +/* ------------------------------------------- +Macro: RETDEF() + If a variable is undefined, return the default value. Otherwise, return the + variable itself. + +Parameters: + VARIABLE - the variable to check + DEFAULT_VALUE - the default value to use if variable is undefined + +Example: + (begin example) + // _var is undefined + hintSilent format ["_var=%1", RETDEF(_var,5)]; // "_var=5" + _var = 7; + hintSilent format ["_var=%1", RETDEF(_var,5)]; // "_var=7" + (end example) +Author: + 654wak654 +------------------------------------------- */ +#define RETDEF(VARIABLE,DEFAULT_VALUE) (if (isNil {VARIABLE}) then [{DEFAULT_VALUE}, {VARIABLE}]) + +/* ------------------------------------------- +Macro: RETNIL() + If a variable is undefined, return the value nil. Otherwise, return the + variable itself. + +Parameters: + VARIABLE - the variable to check + +Example: + (begin example) + // _var is undefined + hintSilent format ["_var=%1", RETNIL(_var)]; // "_var=any" + (end example) + +Author: + Alef (see CBA issue #8514) +------------------------------------------- */ +#define RETNIL(VARIABLE) RETDEF(VARIABLE,nil) + +/* ------------------------------------------- +Macros: TRACE_n() + Log a message and 1-8 variables to the RPT log. + + Only run if is defined. + + TRACE_1(MESSAGE,A) - Log 1 variable. + TRACE_2(MESSAGE,A,B) - Log 2 variables. + TRACE_3(MESSAGE,A,B,C) - Log 3 variables. + TRACE_4(MESSAGE,A,B,C,D) - Log 4 variables. + TRACE_5(MESSAGE,A,B,C,D,E) - Log 5 variables. + TRACE_6(MESSAGE,A,B,C,D,E,F) - Log 6 variables. + TRACE_7(MESSAGE,A,B,C,D,E,F,G) - Log 7 variables. + TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) - Log 8 variables. + TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) - Log 9 variables. + +Parameters: + MESSAGE - Message to add to the trace [String] + A..H - Variable names to log values of [Any] + +Example: + (begin example) + TRACE_3("After takeoff",_vehicle player,getPos (_vehicle player), getPosASL (_vehicle player)); + (end) + +Author: + Spooner +------------------------------------------- */ +#define PFORMAT_1(MESSAGE,A) \ + format ['%1: A=%2', MESSAGE, RETNIL(A)] + +#define PFORMAT_2(MESSAGE,A,B) \ + format ['%1: A=%2, B=%3', MESSAGE, RETNIL(A), RETNIL(B)] + +#define PFORMAT_3(MESSAGE,A,B,C) \ + format ['%1: A=%2, B=%3, C=%4', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C)] + +#define PFORMAT_4(MESSAGE,A,B,C,D) \ + format ['%1: A=%2, B=%3, C=%4, D=%5', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D)] + +#define PFORMAT_5(MESSAGE,A,B,C,D,E) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E)] + +#define PFORMAT_6(MESSAGE,A,B,C,D,E,F) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F)] + +#define PFORMAT_7(MESSAGE,A,B,C,D,E,F,G) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G)] + +#define PFORMAT_8(MESSAGE,A,B,C,D,E,F,G,H) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8, H=%9', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G), RETNIL(H)] + +#define PFORMAT_9(MESSAGE,A,B,C,D,E,F,G,H,I) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8, H=%9, I=%10', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G), RETNIL(H), RETNIL(I)] + + +#ifdef DEBUG_MODE_FULL +#define TRACE_1(MESSAGE,A) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_1(str diag_frameNo + ' ' + (MESSAGE),A)) +#define TRACE_2(MESSAGE,A,B) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_2(str diag_frameNo + ' ' + (MESSAGE),A,B)) +#define TRACE_3(MESSAGE,A,B,C) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_3(str diag_frameNo + ' ' + (MESSAGE),A,B,C)) +#define TRACE_4(MESSAGE,A,B,C,D) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_4(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D)) +#define TRACE_5(MESSAGE,A,B,C,D,E) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_5(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E)) +#define TRACE_6(MESSAGE,A,B,C,D,E,F) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_6(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F)) +#define TRACE_7(MESSAGE,A,B,C,D,E,F,G) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_7(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F,G)) +#define TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_8(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F,G,H)) +#define TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_9(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F,G,H,I)) +#else +#define TRACE_1(MESSAGE,A) /* disabled */ +#define TRACE_2(MESSAGE,A,B) /* disabled */ +#define TRACE_3(MESSAGE,A,B,C) /* disabled */ +#define TRACE_4(MESSAGE,A,B,C,D) /* disabled */ +#define TRACE_5(MESSAGE,A,B,C,D,E) /* disabled */ +#define TRACE_6(MESSAGE,A,B,C,D,E,F) /* disabled */ +#define TRACE_7(MESSAGE,A,B,C,D,E,F,G) /* disabled */ +#define TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) /* disabled */ +#define TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) /* disabled */ +#endif + +/* ------------------------------------------- +Group: General +------------------------------------------- */ + +// ************************************* +// Internal Functions +#define DOUBLES(var1,var2) var1##_##var2 +#define TRIPLES(var1,var2,var3) var1##_##var2##_##var3 +#define QUOTE(var1) #var1 + +#ifdef MODULAR + #define COMPONENT_T DOUBLES(t,COMPONENT) + #define COMPONENT_M DOUBLES(m,COMPONENT) + #define COMPONENT_S DOUBLES(s,COMPONENT) + #define COMPONENT_C DOUBLES(c,COMPONENT) + #define COMPONENT_F COMPONENT_C +#else + #define COMPONENT_T COMPONENT + #define COMPONENT_M COMPONENT + #define COMPONENT_S COMPONENT + #define COMPONENT_F COMPONENT + #define COMPONENT_C COMPONENT +#endif + +/* ------------------------------------------- +Macro: INC() + +Description: + Increase a number by one. + +Parameters: + VAR - Variable to increment [Number] + +Example: + (begin example) + _counter = 0; + INC(_counter); + // _counter => 1 + (end) + +Author: + Spooner +------------------------------------------- */ +#define INC(var) var = (var) + 1 + +/* ------------------------------------------- +Macro: DEC() + +Description: + Decrease a number by one. + +Parameters: + VAR - Variable to decrement [Number] + +Example: + (begin example) + _counter = 99; + DEC(_counter); + // _counter => 98 + (end) + +Author: + Spooner +------------------------------------------- */ +#define DEC(var) var = (var) - 1 + +/* ------------------------------------------- +Macro: ADD() + +Description: + Add a value to a variable. Variable and value should be both Numbers or both Strings. + +Parameters: + VAR - Variable to add to [Number or String] + VALUE - Value to add [Number or String] + +Examples: + (begin example) + _counter = 2; + ADD(_counter,3); + // _counter => 5 + (end) + (begin example) + _str = "hello"; + ADD(_str," "); + ADD(_str,"Fred"); + // _str => "hello Fred" + (end) + +Author: + Sickboy +------------------------------------------- */ +#define ADD(var1,var2) var1 = (var1) + (var2) + +/* ------------------------------------------- +Macro: SUB() + +Description: + Subtract a value from a number variable. VAR and VALUE should both be Numbers. + +Parameters: + VAR - Variable to subtract from [Number] + VALUE - Value to subtract [Number] + +Examples: + (begin example) + _numChickens = 2; + SUB(_numChickens,3); + // _numChickens => -1 + (end) +------------------------------------------- */ +#define SUB(var1,var2) var1 = (var1) - (var2) + +/* ------------------------------------------- +Macro: REM() + +Description: + Remove an element from an array each time it occurs. + + This recreates the entire array, so use BIS_fnc_removeIndex if modification of the original array is required + or if only one of the elements that matches ELEMENT needs to be removed. + +Parameters: + ARRAY - Array to modify [Array] + ELEMENT - Element to remove [Any] + +Examples: + (begin example) + _array = [1, 2, 3, 4, 3, 8]; + REM(_array,3); + // _array = [1, 2, 4, 8]; + (end) + +Author: + Spooner +------------------------------------------- */ +#define REM(var1,var2) SUB(var1,[var2]) + +/* ------------------------------------------- +Macro: PUSH() + +Description: + Appends a single value onto the end of an ARRAY. Change is made to the ARRAY itself, not creating a new array. + +Parameters: + ARRAY - Array to push element onto [Array] + ELEMENT - Element to push [Any] + +Examples: + (begin example) + _fish = ["blue", "green", "smelly"]; + PUSH(_fish,"monkey-flavoured"); + // _fish => ["blue", "green", "smelly", "monkey-flavoured"] + (end) + +Author: + Spooner +------------------------------------------- */ +#define PUSH(var1,var2) (var1) pushBack (var2) + +/* ------------------------------------------- +Macro: MAP() +Description: + Applies given code to each element of the array, then assigns the + resulting array to the original +Parameters: + ARRAY - Array to be modified + CODE - Code that'll be applied to each element of the array. +Example: + (begin example) + _array = [1, 2, 3, 4, 3, 8]; + MAP(_array,_x + 1); + // _array is now [2, 3, 4, 5, 4, 9]; + (end) +Author: + 654wak654 +------------------------------------------- */ +#define MAP(ARR,CODE) ARR = ARR apply {CODE} + +/* ------------------------------------------- +Macro: FILTER() +Description: + Filters an array based on given code, then assigns the resulting array + to the original +Parameters: + ARRAY - Array to be filtered + CODE - Condition to pick elements +Example: + (begin example) + _array = [1, 2, 3, 4, 3, 8]; + FILTER(_array,_x % 2 == 0) + // _array is now [2, 4, 8]; + (end) +Author: + Commy2 +------------------------------------------- */ +#define FILTER(ARR,CODE) ARR = ARR select {CODE} + +/* ------------------------------------------- +Macro: UNIQUE() +Description: + Removes duplicate values in given array +Parameters: + ARRAY - The array to be modified +Example: + (begin example) + _someArray = [4, 4, 5, 5, 5, 2]; + UNIQUE(_someArray); + // _someArray is now [4, 5, 2] + (end) +Author: + Commy2 +------------------------------------------- */ +#define UNIQUE(ARR) ARR = ARR arrayIntersect ARR + +/* ------------------------------------------- +Macro: INTERSECTION() +Description: + Finds unique common elements between two arrays and assigns them + to the first array +Parameters: + ARRAY0 - The array to be modified + ARRAY1 - The array to find intersections with +Example: + (begin example) + _someArray = [1, 2, 3, 4, 5, 5]; + _anotherArray = [4, 5, 6, 7]; + INTERSECTION(_someArray,_anotherArray); + // _someArray is now [4, 5] + (end) +Author: + 654wak654 +------------------------------------------- */ +#define INTERSECTION(ARG0,ARG1) ARG0 = ARG0 arrayIntersect (ARG1) + +/* ------------------------------------------- +Macro: ISNILS() + +Description: + Sets a variable with a value, but only if it is undefined. + +Parameters: + VARIABLE - Variable to set [Any, not nil] + DEFAULT_VALUE - Value to set VARIABLE to if it is undefined [Any, not nil] + +Examples: + (begin example) + // _fish is undefined + ISNILS(_fish,0); + // _fish => 0 + (end) + (begin example) + _fish = 12; + // ...later... + ISNILS(_fish,0); + // _fish => 12 + (end) + +Author: + Sickboy +------------------------------------------- */ +#define ISNILS(VARIABLE,DEFAULT_VALUE) if (isNil #VARIABLE) then { VARIABLE = DEFAULT_VALUE } +#define ISNILS2(var1,var2,var3,var4) ISNILS(TRIPLES(var1,var2,var3),var4) +#define ISNILS3(var1,var2,var3) ISNILS(DOUBLES(var1,var2),var3) +#define ISNIL(var1,var2) ISNILS2(PREFIX,COMPONENT,var1,var2) +#define ISNILMAIN(var1,var2) ISNILS3(PREFIX,var1,var2) + +#define CREATELOGICS(var1,var2) var1##_##var2 = ([sideLogic] call CBA_fnc_getSharedGroup) createUnit ["LOGIC", [0, 0, 0], [], 0, "NONE"] +#define CREATELOGICLOCALS(var1,var2) var1##_##var2 = "LOGIC" createVehicleLocal [0, 0, 0] +#define CREATELOGICGLOBALS(var1,var2) var1##_##var2 = ([sideLogic] call CBA_fnc_getSharedGroup) createUnit ["LOGIC", [0, 0, 0], [], 0, "NONE"]; publicVariable QUOTE(DOUBLES(var1,var2)) +#define CREATELOGICGLOBALTESTS(var1,var2) var1##_##var2 = ([sideLogic] call CBA_fnc_getSharedGroup) createUnit [QUOTE(DOUBLES(ADDON,logic)), [0, 0, 0], [], 0, "NONE"] + +#define GETVARS(var1,var2,var3) (var1##_##var2 getVariable #var3) +#define GETVARMAINS(var1,var2) GETVARS(var1,MAINLOGIC,var2) + +#ifndef PATHTO_SYS + #define PATHTO_SYS(var1,var2,var3) \MAINPREFIX\var1\SUBPREFIX\var2\var3.sqf +#endif +#ifndef PATHTOF_SYS + #define PATHTOF_SYS(var1,var2,var3) \MAINPREFIX\var1\SUBPREFIX\var2\var3 +#endif + +#ifndef PATHTOF2_SYS + #define PATHTOF2_SYS(var1,var2,var3) MAINPREFIX\var1\SUBPREFIX\var2\var3 +#endif + +#define PATHTO_R(var1) PATHTOF2_SYS(PREFIX,COMPONENT_C,var1) +#define PATHTO_T(var1) PATHTOF_SYS(PREFIX,COMPONENT_T,var1) +#define PATHTO_M(var1) PATHTOF_SYS(PREFIX,COMPONENT_M,var1) +#define PATHTO_S(var1) PATHTOF_SYS(PREFIX,COMPONENT_S,var1) +#define PATHTO_C(var1) PATHTOF_SYS(PREFIX,COMPONENT_C,var1) +#define PATHTO_F(var1) PATHTO_SYS(PREFIX,COMPONENT_F,var1) + +// Already quoted "" +#define QPATHTO_R(var1) QUOTE(PATHTO_R(var1)) +#define QPATHTO_T(var1) QUOTE(PATHTO_T(var1)) +#define QPATHTO_M(var1) QUOTE(PATHTO_M(var1)) +#define QPATHTO_S(var1) QUOTE(PATHTO_S(var1)) +#define QPATHTO_C(var1) QUOTE(PATHTO_C(var1)) +#define QPATHTO_F(var1) QUOTE(PATHTO_F(var1)) + +// This only works for binarized configs after recompiling the pbos +// TODO: Reduce amount of calls / code.. +#define COMPILE_FILE2_CFG_SYS(var1) compile preprocessFileLineNumbers var1 +#define COMPILE_FILE2_SYS(var1) COMPILE_FILE2_CFG_SYS(var1) + +#define COMPILE_FILE_SYS(var1,var2,var3) COMPILE_FILE2_SYS('PATHTO_SYS(var1,var2,var3)') +#define COMPILE_FILE_CFG_SYS(var1,var2,var3) COMPILE_FILE2_CFG_SYS('PATHTO_SYS(var1,var2,var3)') + +#define SETVARS(var1,var2) var1##_##var2 setVariable +#define SETVARMAINS(var1) SETVARS(var1,MAINLOGIC) +#define GVARMAINS(var1,var2) var1##_##var2 +#define CFGSETTINGSS(var1,var2) configFile >> "CfgSettings" >> #var1 >> #var2 +//#define SETGVARS(var1,var2,var3) var1##_##var2##_##var3 = +//#define SETGVARMAINS(var1,var2) var1##_##var2 = + +// Compile-Once, JIT: On first use. +// #define PREPMAIN_SYS(var1,var2,var3) var1##_fnc_##var3 = { var1##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)); if (isNil "_this") then { call var1##_fnc_##var3 } else { _this call var1##_fnc_##var3 } } +// #define PREP_SYS(var1,var2,var3) var1##_##var2##_fnc_##var3 = { var1##_##var2##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)); if (isNil "_this") then { call var1##_##var2##_fnc_##var3 } else { _this call var1##_##var2##_fnc_##var3 } } +// #define PREP_SYS2(var1,var2,var3,var4) var1##_##var2##_fnc_##var4 = { var1##_##var2##_fnc_##var4 = COMPILE_FILE_SYS(var1,var3,DOUBLES(fnc,var4)); if (isNil "_this") then { call var1##_##var2##_fnc_##var4 } else { _this call var1##_##var2##_fnc_##var4 } } + +// Compile-Once, at Macro. As opposed to Compile-Once, on first use. +#define PREPMAIN_SYS(var1,var2,var3) var1##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)) +#define PREP_SYS(var1,var2,var3) var1##_##var2##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)) +#define PREP_SYS2(var1,var2,var3,var4) var1##_##var2##_fnc_##var4 = COMPILE_FILE_SYS(var1,var3,DOUBLES(fnc,var4)) + +#define LSTR(var1) TRIPLES(ADDON,STR,var1) + +#ifndef DEBUG_SETTINGS + #define DEBUG_SETTINGS [false, true, false] +#endif + +#define MSG_INIT QUOTE(Initializing: ADDON version: VERSION) + +// ************************************* +// User Functions +#define CFGSETTINGS CFGSETTINGSS(PREFIX,COMPONENT) +#define PATHTO(var1) PATHTO_SYS(PREFIX,COMPONENT_F,var1) +#define PATHTOF(var1) PATHTOF_SYS(PREFIX,COMPONENT,var1) +#define PATHTOEF(var1,var2) PATHTOF_SYS(PREFIX,var1,var2) +#define QPATHTOF(var1) QUOTE(PATHTOF(var1)) +#define QPATHTOEF(var1,var2) QUOTE(PATHTOEF(var1,var2)) + +#define COMPILE_FILE(var1) COMPILE_FILE_SYS(PREFIX,COMPONENT_F,var1) +#define COMPILE_FILE_CFG(var1) COMPILE_FILE_CFG_SYS(PREFIX,COMPONENT_F,var1) +#define COMPILE_FILE2(var1) COMPILE_FILE2_SYS('var1') +#define COMPILE_FILE2_CFG(var1) COMPILE_FILE2_CFG_SYS('var1') + +#define COMPILE_SCRIPT(var1) compileScript ['PATHTO_SYS(PREFIX,COMPONENT_F,var1)'] + + +#define VERSIONING_SYS(var1) class CfgSettings \ +{ \ + class CBA \ + { \ + class Versioning \ + { \ + class var1 \ + { \ + }; \ + }; \ + }; \ +}; + +#define VERSIONING VERSIONING_SYS(PREFIX) + +/* ------------------------------------------- +Macro: GVAR() + Get full variable identifier for a global variable owned by this component. + +Parameters: + VARIABLE - Partial name of global variable owned by this component [Any]. + +Example: + (begin example) + GVAR(frog) = 12; + // In SPON_FrogDancing component, equivalent to SPON_FrogDancing_frog = 12 + (end) + +Author: + Sickboy +------------------------------------------- */ +#define GVAR(var1) DOUBLES(ADDON,var1) +#define EGVAR(var1,var2) TRIPLES(PREFIX,var1,var2) +#define QGVAR(var1) QUOTE(GVAR(var1)) +#define QEGVAR(var1,var2) QUOTE(EGVAR(var1,var2)) +#define QQGVAR(var1) QUOTE(QGVAR(var1)) +#define QQEGVAR(var1,var2) QUOTE(QEGVAR(var1,var2)) + +/* ------------------------------------------- +Macro: GVARMAIN() + Get full variable identifier for a global variable owned by this addon. + +Parameters: + VARIABLE - Partial name of global variable owned by this addon [Any]. + +Example: + (begin example) + GVARMAIN(frog) = 12; + // In SPON_FrogDancing component, equivalent to SPON_frog = 12 + (end) + +Author: + Sickboy +------------------------------------------- */ +#define GVARMAIN(var1) GVARMAINS(PREFIX,var1) +#define QGVARMAIN(var1) QUOTE(GVARMAIN(var1)) +#define QQGVARMAIN(var1) QUOTE(QGVARMAIN(var1)) +// TODO: What's this? +#define SETTINGS DOUBLES(PREFIX,settings) +#define CREATELOGIC CREATELOGICS(PREFIX,COMPONENT) +#define CREATELOGICGLOBAL CREATELOGICGLOBALS(PREFIX,COMPONENT) +#define CREATELOGICGLOBALTEST CREATELOGICGLOBALTESTS(PREFIX,COMPONENT) +#define CREATELOGICLOCAL CREATELOGICLOCALS(PREFIX,COMPONENT) +#define CREATELOGICMAIN CREATELOGICS(PREFIX,MAINLOGIC) +#define GETVAR(var1) GETVARS(PREFIX,COMPONENT,var1) +#define SETVAR SETVARS(PREFIX,COMPONENT) +#define SETVARMAIN SETVARMAINS(PREFIX) +#define IFCOUNT(var1,var2,var3) if (count var1 > var2) then { var3 = var1 select var2 }; + +/* ------------------------------------------- +Macro: PREP() + +Description: + Defines a function. + + Full file path: + '\MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\fnc_.sqf' + + Resulting function name: + 'PREFIX_COMPONENT_' + + The PREP macro should be placed in a script run by a XEH preStart and XEH preInit event. + + The PREP macro allows for CBA function caching, which drastically speeds up load times. + Beware though that function caching is enabled by default and as such to disable it, you need to + #define DISABLE_COMPILE_CACHE above your #include "script_components.hpp" include! + + The function will be defined in ui and mission namespace. It can not be overwritten without + a mission restart. + +Parameters: + FUNCTION NAME - Name of the function, unquoted + +Examples: + (begin example) + PREP(banana); + call FUNC(banana); + (end) + +Author: + dixon13 + ------------------------------------------- */ +//#define PREP(var1) PREP_SYS(PREFIX,COMPONENT_F,var1) + +#ifdef DISABLE_COMPILE_CACHE + #define PREP(var1) TRIPLES(ADDON,fnc,var1) = compile preProcessFileLineNumbers 'PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))' + #define PREPMAIN(var1) TRIPLES(PREFIX,fnc,var1) = compile preProcessFileLineNumbers 'PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))' +#else + #define PREP(var1) ['PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))', 'TRIPLES(ADDON,fnc,var1)'] call SLX_XEH_COMPILE_NEW + #define PREPMAIN(var1) ['PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))', 'TRIPLES(PREFIX,fnc,var1)'] call SLX_XEH_COMPILE_NEW +#endif + +/* ------------------------------------------- +Macro: PATHTO_FNC() + +Description: + Defines a function inside CfgFunctions. + + Full file path in addons: + '\MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\fnc_.sqf' + Define 'RECOMPILE' to enable recompiling. + Define 'SKIP_FUNCTION_HEADER' to skip adding function header. + +Parameters: + FUNCTION NAME - Name of the function, unquoted + +Examples: + (begin example) + // file name: fnc_addPerFrameHandler.sqf + class CfgFunctions { + class CBA { + class Misc { + PATHTO_FNC(addPerFrameHandler); + }; + }; + }; + // -> CBA_fnc_addPerFrameHandler + (end) + +Author: + dixon13, commy2 + ------------------------------------------- */ +#ifdef RECOMPILE + #undef RECOMPILE + #define RECOMPILE recompile = 1 +#else + #define RECOMPILE recompile = 0 +#endif +// Set function header type: -1 - no header; 0 - default header; 1 - system header. +#ifdef SKIP_FUNCTION_HEADER + #define CFGFUNCTION_HEADER headerType = -1 +#else + #define CFGFUNCTION_HEADER headerType = 0 +#endif + +#define PATHTO_FNC(func) class func {\ + file = QPATHTOF(DOUBLES(fnc,func).sqf);\ + CFGFUNCTION_HEADER;\ + RECOMPILE;\ +} + +#define FUNC(var1) TRIPLES(ADDON,fnc,var1) +#define FUNCMAIN(var1) TRIPLES(PREFIX,fnc,var1) +#define FUNC_INNER(var1,var2) TRIPLES(DOUBLES(PREFIX,var1),fnc,var2) +#define EFUNC(var1,var2) FUNC_INNER(var1,var2) +#define QFUNC(var1) QUOTE(FUNC(var1)) +#define QFUNCMAIN(var1) QUOTE(FUNCMAIN(var1)) +#define QFUNC_INNER(var1,var2) QUOTE(FUNC_INNER(var1,var2)) +#define QEFUNC(var1,var2) QUOTE(EFUNC(var1,var2)) +#define QQFUNC(var1) QUOTE(QFUNC(var1)) +#define QQFUNCMAIN(var1) QUOTE(QFUNCMAIN(var1)) +#define QQFUNC_INNER(var1,var2) QUOTE(QFUNC_INNER(var1,var2)) +#define QQEFUNC(var1,var2) QUOTE(QEFUNC(var1,var2)) + +#ifndef PRELOAD_ADDONS + #define PRELOAD_ADDONS class CfgAddons \ +{ \ + class PreloadAddons \ + { \ + class ADDON \ + { \ + list[]={ QUOTE(ADDON) }; \ + }; \ + }; \ +} +#endif + +/* ------------------------------------------- +Macros: ARG_#() + Select from list of array arguments + +Parameters: + VARIABLE(1-8) - elements for the list + +Author: + Rommel +------------------------------------------- */ +#define ARG_1(A,B) ((A) select (B)) +#define ARG_2(A,B,C) (ARG_1(ARG_1(A,B),C)) +#define ARG_3(A,B,C,D) (ARG_1(ARG_2(A,B,C),D)) +#define ARG_4(A,B,C,D,E) (ARG_1(ARG_3(A,B,C,D),E)) +#define ARG_5(A,B,C,D,E,F) (ARG_1(ARG_4(A,B,C,D,E),F)) +#define ARG_6(A,B,C,D,E,F,G) (ARG_1(ARG_5(A,B,C,D,E,F),G)) +#define ARG_7(A,B,C,D,E,F,G,H) (ARG_1(ARG_6(A,B,C,D,E,E,F,G),H)) +#define ARG_8(A,B,C,D,E,F,G,H,I) (ARG_1(ARG_7(A,B,C,D,E,E,F,G,H),I)) + +/* ------------------------------------------- +Macros: ARR_#() + Create list from arguments. Useful for working around , in macro parameters. + 1-8 arguments possible. + +Parameters: + VARIABLE(1-8) - elements for the list + +Author: + Nou +------------------------------------------- */ +#define ARR_1(ARG1) ARG1 +#define ARR_2(ARG1,ARG2) ARG1, ARG2 +#define ARR_3(ARG1,ARG2,ARG3) ARG1, ARG2, ARG3 +#define ARR_4(ARG1,ARG2,ARG3,ARG4) ARG1, ARG2, ARG3, ARG4 +#define ARR_5(ARG1,ARG2,ARG3,ARG4,ARG5) ARG1, ARG2, ARG3, ARG4, ARG5 +#define ARR_6(ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 +#define ARR_7(ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7 +#define ARR_8(ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8 + +/* ------------------------------------------- +Macros: FORMAT_#(STR, ARG1) + Format - Useful for working around , in macro parameters. + 1-8 arguments possible. + +Parameters: + STRING - string used by format + VARIABLE(1-8) - elements for usage in format + +Author: + Nou & Sickboy +------------------------------------------- */ +#define FORMAT_1(STR,ARG1) format[STR, ARG1] +#define FORMAT_2(STR,ARG1,ARG2) format[STR, ARG1, ARG2] +#define FORMAT_3(STR,ARG1,ARG2,ARG3) format[STR, ARG1, ARG2, ARG3] +#define FORMAT_4(STR,ARG1,ARG2,ARG3,ARG4) format[STR, ARG1, ARG2, ARG3, ARG4] +#define FORMAT_5(STR,ARG1,ARG2,ARG3,ARG4,ARG5) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5] +#define FORMAT_6(STR,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6] +#define FORMAT_7(STR,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7] +#define FORMAT_8(STR,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8] + +// CONTROL(46) 12 +#define DISPLAY(A) (findDisplay A) +#define CONTROL(A) DISPLAY(A) displayCtrl + +/* ------------------------------------------- +Macros: IS_x() + Checking the data types of variables. + + IS_ARRAY() - Array + IS_BOOL() - Boolean + IS_BOOLEAN() - UI display handle(synonym for ) + IS_CODE() - Code block (i.e a compiled function) + IS_CONFIG() - Configuration + IS_CONTROL() - UI control handle. + IS_DISPLAY() - UI display handle. + IS_FUNCTION() - A compiled function (synonym for ) + IS_GROUP() - Group. + IS_INTEGER() - Is a number a whole number? + IS_LOCATION() - World location. + IS_NUMBER() - A floating point number (synonym for ) + IS_OBJECT() - World object. + IS_SCALAR() - Floating point number. + IS_SCRIPT() - A script handle (as returned by execVM and spawn commands). + IS_SIDE() - Game side. + IS_STRING() - World object. + IS_TEXT() - Structured text. + +Parameters: + VARIABLE - Variable to check if it is of a particular type [Any, not nil] + +Author: + Spooner +------------------------------------------- */ +#define IS_META_SYS(VAR,TYPE) (if (isNil {VAR}) then {false} else {(VAR) isEqualType TYPE}) +#define IS_ARRAY(VAR) IS_META_SYS(VAR,[]) +#define IS_BOOL(VAR) IS_META_SYS(VAR,false) +#define IS_CODE(VAR) IS_META_SYS(VAR,{}) +#define IS_CONFIG(VAR) IS_META_SYS(VAR,configNull) +#define IS_CONTROL(VAR) IS_META_SYS(VAR,controlNull) +#define IS_DISPLAY(VAR) IS_META_SYS(VAR,displayNull) +#define IS_GROUP(VAR) IS_META_SYS(VAR,grpNull) +#define IS_OBJECT(VAR) IS_META_SYS(VAR,objNull) +#define IS_SCALAR(VAR) IS_META_SYS(VAR,0) +#define IS_SCRIPT(VAR) IS_META_SYS(VAR,scriptNull) +#define IS_SIDE(VAR) IS_META_SYS(VAR,west) +#define IS_STRING(VAR) IS_META_SYS(VAR,"STRING") +#define IS_TEXT(VAR) IS_META_SYS(VAR,text "") +#define IS_LOCATION(VAR) IS_META_SYS(VAR,locationNull) + +#define IS_BOOLEAN(VAR) IS_BOOL(VAR) +#define IS_FUNCTION(VAR) IS_CODE(VAR) +#define IS_INTEGER(VAR) (if (IS_SCALAR(VAR)) then {floor (VAR) == (VAR)} else {false}) +#define IS_NUMBER(VAR) IS_SCALAR(VAR) + +#define FLOAT_TO_STRING(num) (if (_this == 0) then {"0"} else {str parseNumber (str (_this % _this) + str floor abs _this) + "." + (str (abs _this - floor abs _this) select [2]) + "0"}) + +/* ------------------------------------------- +Macro: SCRIPT() + Sets name of script (relies on PREFIX and COMPONENT values being #defined). + Define 'SKIP_SCRIPT_NAME' to skip adding scriptName. + +Parameters: + NAME - Name of script [Indentifier] + +Example: + (begin example) + SCRIPT(eradicateMuppets); + (end) + +Author: + Spooner +------------------------------------------- */ +#ifndef SKIP_SCRIPT_NAME + #define SCRIPT(NAME) scriptName 'PREFIX\COMPONENT\NAME' +#else + #define SCRIPT(NAME) /* nope */ +#endif + +/* ------------------------------------------- +Macros: EXPLODE_n() + DEPRECATED - Use param/params commands added in Arma 3 1.48 + + Splitting an ARRAY into a number of variables (A, B, C, etc). + + Note that this NOT does make the created variables private. + _PVT variants do. + + EXPLODE_1(ARRAY,A,B) - Split a 1-element array into separate variable. + EXPLODE_2(ARRAY,A,B) - Split a 2-element array into separate variables. + EXPLODE_3(ARRAY,A,B,C) - Split a 3-element array into separate variables. + EXPLODE_4(ARRAY,A,B,C,D) - Split a 4-element array into separate variables. + EXPLODE_5(ARRAY,A,B,C,D,E) - Split a 5-element array into separate variables. + EXPLODE_6(ARRAY,A,B,C,D,E,F) - Split a 6-element array into separate variables. + EXPLODE_7(ARRAY,A,B,C,D,E,F,G) - Split a 7-element array into separate variables. + EXPLODE_8(ARRAY,A,B,C,D,E,F,G,H) - Split a 8-element array into separate variables. + EXPLODE_9(ARRAY,A,B,C,D,E,F,G,H,I) - Split a 9-element array into separate variables. + +Parameters: + ARRAY - Array to read from [Array] + A..H - Names of variables to set from array [Identifier] + +Example: + (begin example) + _array = ["fred", 156.8, 120.9]; + EXPLODE_3(_array,_name,_height,_weight); + (end) + +Author: + Spooner +------------------------------------------- */ +#define EXPLODE_1_SYS(ARRAY,A) A = ARRAY param [0] +#define EXPLODE_1(ARRAY,A) EXPLODE_1_SYS(ARRAY,A); TRACE_1("EXPLODE_1, " + QUOTE(ARRAY),A) +#define EXPLODE_1_PVT(ARRAY,A) ARRAY params [#A]; TRACE_1("EXPLODE_1, " + QUOTE(ARRAY),A) + +#define EXPLODE_2_SYS(ARRAY,A,B) EXPLODE_1_SYS(ARRAY,A); B = ARRAY param [1] +#define EXPLODE_2(ARRAY,A,B) EXPLODE_2_SYS(ARRAY,A,B); TRACE_2("EXPLODE_2, " + QUOTE(ARRAY),A,B) +#define EXPLODE_2_PVT(ARRAY,A,B) ARRAY params [#A,#B]; TRACE_2("EXPLODE_2, " + QUOTE(ARRAY),A,B) + +#define EXPLODE_3_SYS(ARRAY,A,B,C) EXPLODE_2_SYS(ARRAY,A,B); C = ARRAY param [2] +#define EXPLODE_3(ARRAY,A,B,C) EXPLODE_3_SYS(ARRAY,A,B,C); TRACE_3("EXPLODE_3, " + QUOTE(ARRAY),A,B,C) +#define EXPLODE_3_PVT(ARRAY,A,B,C) ARRAY params [#A,#B,#C]; TRACE_3("EXPLODE_3, " + QUOTE(ARRAY),A,B,C) + +#define EXPLODE_4_SYS(ARRAY,A,B,C,D) EXPLODE_3_SYS(ARRAY,A,B,C); D = ARRAY param [3] +#define EXPLODE_4(ARRAY,A,B,C,D) EXPLODE_4_SYS(ARRAY,A,B,C,D); TRACE_4("EXPLODE_4, " + QUOTE(ARRAY),A,B,C,D) +#define EXPLODE_4_PVT(ARRAY,A,B,C,D) ARRAY params [#A,#B,#C,#D]; TRACE_4("EXPLODE_4, " + QUOTE(ARRAY),A,B,C,D) + +#define EXPLODE_5_SYS(ARRAY,A,B,C,D,E) EXPLODE_4_SYS(ARRAY,A,B,C,D); E = ARRAY param [4] +#define EXPLODE_5(ARRAY,A,B,C,D,E) EXPLODE_5_SYS(ARRAY,A,B,C,D,E); TRACE_5("EXPLODE_5, " + QUOTE(ARRAY),A,B,C,D,E) +#define EXPLODE_5_PVT(ARRAY,A,B,C,D,E) ARRAY params [#A,#B,#C,#D,#E]; TRACE_5("EXPLODE_5, " + QUOTE(ARRAY),A,B,C,D,E) + +#define EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F) EXPLODE_5_SYS(ARRAY,A,B,C,D,E); F = ARRAY param [5] +#define EXPLODE_6(ARRAY,A,B,C,D,E,F) EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F); TRACE_6("EXPLODE_6, " + QUOTE(ARRAY),A,B,C,D,E,F) +#define EXPLODE_6_PVT(ARRAY,A,B,C,D,E,F) ARRAY params [#A,#B,#C,#D,#E,#F]; TRACE_6("EXPLODE_6, " + QUOTE(ARRAY),A,B,C,D,E,F) + +#define EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G) EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F); G = ARRAY param [6] +#define EXPLODE_7(ARRAY,A,B,C,D,E,F,G) EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G); TRACE_7("EXPLODE_7, " + QUOTE(ARRAY),A,B,C,D,E,F,G) +#define EXPLODE_7_PVT(ARRAY,A,B,C,D,E,F,G) ARRAY params [#A,#B,#C,#D,#E,#F,#G]; TRACE_7("EXPLODE_7, " + QUOTE(ARRAY),A,B,C,D,E,F,G) + +#define EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H) EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G); H = ARRAY param [7] +#define EXPLODE_8(ARRAY,A,B,C,D,E,F,G,H) EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H); TRACE_8("EXPLODE_8, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H) +#define EXPLODE_8_PVT(ARRAY,A,B,C,D,E,F,G,H) ARRAY params [#A,#B,#C,#D,#E,#F,#G,#H]; TRACE_8("EXPLODE_8, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H) + +#define EXPLODE_9_SYS(ARRAY,A,B,C,D,E,F,G,H,I) EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H); I = ARRAY param [8] +#define EXPLODE_9(ARRAY,A,B,C,D,E,F,G,H,I) EXPLODE_9_SYS(ARRAY,A,B,C,D,E,F,G,H,I); TRACE_9("EXPLODE_9, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H,I) +#define EXPLODE_9_PVT(ARRAY,A,B,C,D,E,F,G,H,I) ARRAY params [#A,#B,#C,#D,#E,#F,#G,#H,#I]; TRACE_9("EXPLODE_9, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H,I) + +/* ------------------------------------------- +Macro: xSTRING() + Get full string identifier from a stringtable owned by this component. + +Parameters: + VARIABLE - Partial name of global variable owned by this component [Any]. + +Example: + ADDON is CBA_Balls. + (begin example) + // Localized String (localize command must still be used with it) + LSTRING(Example); // STR_CBA_Balls_Example; + // Config String (note the $) + CSTRING(Example); // $STR_CBA_Balls_Example; + (end) + +Author: + Jonpas +------------------------------------------- */ +#ifndef STRING_MACROS_GUARD +#define STRING_MACROS_GUARD + #define LSTRING(var1) QUOTE(TRIPLES(STR,ADDON,var1)) + #define ELSTRING(var1,var2) QUOTE(TRIPLES(STR,DOUBLES(PREFIX,var1),var2)) + #define CSTRING(var1) QUOTE(TRIPLES($STR,ADDON,var1)) + #define ECSTRING(var1,var2) QUOTE(TRIPLES($STR,DOUBLES(PREFIX,var1),var2)) + + #define LLSTRING(var1) localize QUOTE(TRIPLES(STR,ADDON,var1)) + #define LELSTRING(var1,var2) localize QUOTE(TRIPLES(STR,DOUBLES(PREFIX,var1),var2)) +#endif + + +/* ------------------------------------------- +Group: Managing Function Parameters +------------------------------------------- */ + +/* ------------------------------------------- +Macros: PARAMS_n() + DEPRECATED - Use param/params commands added in Arma 3 1.48 + + Setting variables based on parameters passed to a function. + + Each parameter is defines as private and set to the appropriate value from _this. + + PARAMS_1(A) - Get 1 parameter from the _this array (or _this if it's not an array). + PARAMS_2(A,B) - Get 2 parameters from the _this array. + PARAMS_3(A,B,C) - Get 3 parameters from the _this array. + PARAMS_4(A,B,C,D) - Get 4 parameters from the _this array. + PARAMS_5(A,B,C,D,E) - Get 5 parameters from the _this array. + PARAMS_6(A,B,C,D,E,F) - Get 6 parameters from the _this array. + PARAMS_7(A,B,C,D,E,F,G) - Get 7 parameters from the _this array. + PARAMS_8(A,B,C,D,E,F,G,H) - Get 8 parameters from the _this array. + +Parameters: + A..H - Name of variable to read from _this [Identifier] + +Example: + A function called like this: + (begin example) + [_name,_address,_telephone] call recordPersonalDetails; + (end) + expects 3 parameters and those variables could be initialised at the start of the function definition with: + (begin example) + recordPersonalDetails = { + PARAMS_3(_name,_address,_telephone); + // Rest of function follows... + }; + (end) + +Author: + Spooner +------------------------------------------- */ +#define PARAMS_1(A) EXPLODE_1_PVT(_this,A) +#define PARAMS_2(A,B) EXPLODE_2_PVT(_this,A,B) +#define PARAMS_3(A,B,C) EXPLODE_3_PVT(_this,A,B,C) +#define PARAMS_4(A,B,C,D) EXPLODE_4_PVT(_this,A,B,C,D) +#define PARAMS_5(A,B,C,D,E) EXPLODE_5_PVT(_this,A,B,C,D,E) +#define PARAMS_6(A,B,C,D,E,F) EXPLODE_6_PVT(_this,A,B,C,D,E,F) +#define PARAMS_7(A,B,C,D,E,F,G) EXPLODE_7_PVT(_this,A,B,C,D,E,F,G) +#define PARAMS_8(A,B,C,D,E,F,G,H) EXPLODE_8_PVT(_this,A,B,C,D,E,F,G,H) +#define PARAMS_9(A,B,C,D,E,F,G,H,I) EXPLODE_9_PVT(_this,A,B,C,D,E,F,G,H,I) + +/* ------------------------------------------- +Macro: DEFAULT_PARAM() + DEPRECATED - Use param/params commands added in Arma 3 1.48 + + Getting a default function parameter. This may be used together with to have a mix of required and + optional parameters. + +Parameters: + INDEX - Index of parameter in _this [Integer, 0+] + NAME - Name of the variable to set [Identifier] + DEF_VALUE - Default value to use in case the array is too short or the value at INDEX is nil [Any] + +Example: + A function called with optional parameters: + (begin example) + [_name] call myFunction; + [_name, _numberOfLegs] call myFunction; + [_name, _numberOfLegs, _hasAHead] call myFunction; + (end) + 1 required parameter and 2 optional parameters. Those variables could be initialised at the start of the function + definition with: + (begin example) + myFunction = { + PARAMS_1(_name); + DEFAULT_PARAM(1,_numberOfLegs,2); + DEFAULT_PARAM(2,_hasAHead,true); + // Rest of function follows... + }; + (end) + +Author: + Spooner +------------------------------------------- */ +#define DEFAULT_PARAM(INDEX,NAME,DEF_VALUE) \ + private [#NAME,"_this"]; \ + ISNILS(_this,[]); \ + NAME = _this param [INDEX, DEF_VALUE]; \ + TRACE_3("DEFAULT_PARAM",INDEX,NAME,DEF_VALUE) + +/* ------------------------------------------- +Macro: KEY_PARAM() + Get value from key in _this list, return default when key is not included in list. + +Parameters: + KEY - Key name [String] + NAME - Name of the variable to set [Identifier] + DEF_VALUE - Default value to use in case key not found [ANY] + +Example: + + +Author: + Muzzleflash +------------------------------------------- */ +#define KEY_PARAM(KEY,NAME,DEF_VALUE) \ + private #NAME; \ + NAME = [toLower KEY, toUpper KEY, DEF_VALUE, RETNIL(_this)] call CBA_fnc_getArg; \ + TRACE_3("KEY_PARAM",KEY,NAME,DEF_VALUE) + +/* ------------------------------------------- +Group: Assertions +------------------------------------------- */ + +#define ASSERTION_ERROR(MESSAGE) ERROR_WITH_TITLE("Assertion failed!",MESSAGE) + +/* ------------------------------------------- +Macro: ASSERT_TRUE() + Asserts that a CONDITION is true. When an assertion fails, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to assert as true [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is false [String] + +Example: + (begin example) + ASSERT_TRUE(_frogIsDead,"The frog is alive"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_TRUE(CONDITION,MESSAGE) \ + if (not (CONDITION)) then \ + { \ + ASSERTION_ERROR('Assertion (CONDITION) failed!\n\n' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: ASSERT_FALSE() + Asserts that a CONDITION is false. When an assertion fails, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to assert as false [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is true [String] + +Example: + (begin example) + ASSERT_FALSE(_frogIsDead,"The frog died"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_FALSE(CONDITION,MESSAGE) \ + if (CONDITION) then \ + { \ + ASSERTION_ERROR('Assertion (not (CONDITION)) failed!\n\n' + (MESSAGE)) \ + } + +/* ------------------------------------------- +Macro: ASSERT_OP() + Asserts that (A OPERATOR B) is true. When an assertion fails, an error is raised with the given MESSAGE. + +Parameters: + A - First value [Any] + OPERATOR - Binary operator to use [Operator] + B - Second value [Any] + MESSSAGE - Message to display if (A OPERATOR B) is false. [String] + +Example: + (begin example) + ASSERT_OP(_fish,>,5,"Too few fish!"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_OP(A,OPERATOR,B,MESSAGE) \ + if (not ((A) OPERATOR (B))) then \ + { \ + ASSERTION_ERROR('Assertion (A OPERATOR B) failed!\n' + 'A: ' + (str (A)) + '\n' + 'B: ' + (str (B)) + "\n\n" + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: ASSERT_DEFINED() + Asserts that a VARIABLE is defined. When an assertion fails, an error is raised with the given MESSAGE.. + +Parameters: + VARIABLE - Variable to test if defined [String or Function]. + MESSAGE - Message to display if variable is undefined [String]. + +Examples: + (begin example) + ASSERT_DEFINED("_anUndefinedVar","Too few fish!"); + ASSERT_DEFINED({ obj getVariable "anUndefinedVar" },"Too many fish!"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_DEFINED(VARIABLE,MESSAGE) \ + if (isNil VARIABLE) then \ + { \ + ASSERTION_ERROR('Assertion (VARIABLE is defined) failed!\n\n' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Group: Unit tests +------------------------------------------- */ +#define TEST_SUCCESS(MESSAGE) MESSAGE_WITH_TITLE("Test OK",MESSAGE) +#define TEST_FAIL(MESSAGE) ERROR_WITH_TITLE("Test FAIL",MESSAGE) + +/* ------------------------------------------- +Macro: TEST_TRUE() + Tests that a CONDITION is true. + If the condition is not true, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to assert as true [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is false [String] + +Example: + (begin example) + TEST_TRUE(_frogIsDead,"The frog is alive"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_TRUE(CONDITION, MESSAGE) \ + if (CONDITION) then \ + { \ + TEST_SUCCESS('(CONDITION)'); \ + } \ + else \ + { \ + TEST_FAIL('(CONDITION) ' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: TEST_FALSE() + Tests that a CONDITION is false. + If the condition is not false, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to test as false [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is true [String] + +Example: + (begin example) + TEST_FALSE(_frogIsDead,"The frog died"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_FALSE(CONDITION, MESSAGE) \ + if (not (CONDITION)) then \ + { \ + TEST_SUCCESS('(not (CONDITION))'); \ + } \ + else \ + { \ + TEST_FAIL('(not (CONDITION)) ' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: TEST_OP() + Tests that (A OPERATOR B) is true. + If the test fails, an error is raised with the given MESSAGE. + +Parameters: + A - First value [Any] + OPERATOR - Binary operator to use [Operator] + B - Second value [Any] + MESSSAGE - Message to display if (A OPERATOR B) is false. [String] + +Example: + (begin example) + TEST_OP(_fish,>,5,"Too few fish!"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_OP(A,OPERATOR,B,MESSAGE) \ + if ((A) OPERATOR (B)) then \ + { \ + TEST_SUCCESS('(A OPERATOR B)') \ + } \ + else \ + { \ + TEST_FAIL('(A OPERATOR B)') \ + }; + +/* ------------------------------------------- +Macro: TEST_DEFINED_AND_OP() + Tests that A and B are defined and (A OPERATOR B) is true. + If the test fails, an error is raised with the given MESSAGE. + +Parameters: + A - First value [Any] + OPERATOR - Binary operator to use [Operator] + B - Second value [Any] + MESSSAGE - Message to display [String] + +Example: + (begin example) + TEST_OP(_fish,>,5,"Too few fish!"); + (end) + +Author: + Killswitch, PabstMirror +------------------------------------------- */ +#define TEST_DEFINED_AND_OP(A,OPERATOR,B,MESSAGE) \ + if (isNil #A) then { \ + TEST_FAIL('(A is not defined) ' + (MESSAGE)); \ + } else { \ + if (isNil #B) then { \ + TEST_FAIL('(B is not defined) ' + (MESSAGE)); \ + } else { \ + if ((A) OPERATOR (B)) then { \ + TEST_SUCCESS('(A OPERATOR B) ' + (MESSAGE)) \ + } else { \ + TEST_FAIL('(A OPERATOR B) ' + (MESSAGE)) \ + }; }; }; + + +/* ------------------------------------------- +Macro: TEST_DEFINED() + Tests that a VARIABLE is defined. + +Parameters: + VARIABLE - Variable to test if defined [String or Function]. + MESSAGE - Message to display if variable is undefined [String]. + +Examples: + (begin example) + TEST_DEFINED("_anUndefinedVar","Too few fish!"); + TEST_DEFINED({ obj getVariable "anUndefinedVar" },"Too many fish!"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_DEFINED(VARIABLE,MESSAGE) \ + if (not isNil VARIABLE) then \ + { \ + TEST_SUCCESS('(' + VARIABLE + ' is defined)'); \ + } \ + else \ + { \ + TEST_FAIL('(' + VARIABLE + ' is not defined)' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Group: Managing Deprecation +------------------------------------------- */ + +/* ------------------------------------------- +Macro: DEPRECATE_SYS() + Allow deprecation of a function that has been renamed. + + Replaces an old OLD_FUNCTION (which will have PREFIX_ prepended) with a NEW_FUNCTION + (PREFIX_ prepended) with the intention that the old function will be disabled in the future. + + Shows a warning in RPT each time the deprecated function is used, but runs the new function. + +Parameters: + OLD_FUNCTION - Full name of old function [Identifier for function that does not exist any more] + NEW_FUNCTION - Full name of new function [Function] + +Example: + (begin example) + // After renaming CBA_fnc_frog as CBA_fnc_fish + DEPRECATE_SYS(CBA_fnc_frog,CBA_fnc_fish); + (end) + +Author: + Sickboy +------------------------------------------- */ +#define DEPRECATE_SYS(OLD_FUNCTION,NEW_FUNCTION) \ + OLD_FUNCTION = { \ + WARNING('Deprecated function used: OLD_FUNCTION (new: NEW_FUNCTION) in ADDON'); \ + if (isNil "_this") then { call NEW_FUNCTION } else { _this call NEW_FUNCTION }; \ + } + +/* ------------------------------------------- +Macro: DEPRECATE() + Allow deprecation of a function, in the current component, that has been renamed. + + Replaces an OLD_FUNCTION (which will have PREFIX_ prepended) with a NEW_FUNCTION + (PREFIX_ prepended) with the intention that the old function will be disabled in the future. + + Shows a warning in RPT each time the deprecated function is used, but runs the new function. + +Parameters: + OLD_FUNCTION - Name of old function, assuming PREFIX [Identifier for function that does not exist any more] + NEW_FUNCTION - Name of new function, assuming PREFIX [Function] + +Example: + (begin example) + // After renaming CBA_fnc_frog as CBA_fnc_fish + DEPRECATE(fnc_frog,fnc_fish); + (end) + +Author: + Sickboy +------------------------------------------- */ +#define DEPRECATE(OLD_FUNCTION,NEW_FUNCTION) \ + DEPRECATE_SYS(DOUBLES(PREFIX,OLD_FUNCTION),DOUBLES(PREFIX,NEW_FUNCTION)) + +/* ------------------------------------------- +Macro: OBSOLETE_SYS() + Replace a function that has become obsolete. + + Replace an obsolete OLD_FUNCTION with a simple COMMAND_FUNCTION, with the intention that anyone + using the function should replace it with the simple command, since the function will be disabled in the future. + + Shows a warning in RPT each time the deprecated function is used, and runs the command function. + +Parameters: + OLD_FUNCTION - Full name of old function [Identifier for function that does not exist any more] + COMMAND_CODE - Code to replace the old function [Function] + +Example: + (begin example) + // In Arma2, currentWeapon command made the CBA_fMyWeapon function obsolete: + OBSOLETE_SYS(CBA_fMyWeapon,{ currentWeapon player }); + (end) + +Author: + Spooner +------------------------------------------- */ +#define OBSOLETE_SYS(OLD_FUNCTION,COMMAND_CODE) \ + OLD_FUNCTION = { \ + WARNING('Obsolete function used: (use: OLD_FUNCTION) in ADDON'); \ + if (isNil "_this") then { call COMMAND_CODE } else { _this call COMMAND_CODE }; \ + } + +/* ------------------------------------------- +Macro: OBSOLETE() + Replace a function, in the current component, that has become obsolete. + + Replace an obsolete OLD_FUNCTION (which will have PREFIX_ prepended) with a simple + COMMAND_CODE, with the intention that anyone using the function should replace it with the simple + command. + + Shows a warning in RPT each time the deprecated function is used. + +Parameters: + OLD_FUNCTION - Name of old function, assuming PREFIX [Identifier for function that does not exist any more] + COMMAND_CODE - Code to replace the old function [Function] + +Example: + (begin example) + // In Arma2, currentWeapon command made the CBA_fMyWeapon function obsolete: + OBSOLETE(fMyWeapon,{ currentWeapon player }); + (end) + +Author: + Spooner +------------------------------------------- */ +#define OBSOLETE(OLD_FUNCTION,COMMAND_CODE) \ + OBSOLETE_SYS(DOUBLES(PREFIX,OLD_FUNCTION),COMMAND_CODE) + +#define BWC_CONFIG(NAME) class NAME { \ + units[] = {}; \ + weapons[] = {}; \ + requiredVersion = REQUIRED_VERSION; \ + requiredAddons[] = {}; \ + version = VERSION; \ +} + +// XEH Specific +#define XEH_CLASS CBA_Extended_EventHandlers +#define XEH_CLASS_BASE DOUBLES(XEH_CLASS,base) +#define XEH_DISABLED class EventHandlers { class XEH_CLASS {}; }; SLX_XEH_DISABLED = 1 +#define XEH_ENABLED class EventHandlers { class XEH_CLASS { EXTENDED_EVENTHANDLERS }; }; SLX_XEH_DISABLED = 0 + +// TODO: These are actually outdated; _Once ? +#define XEH_PRE_INIT QUOTE(call COMPILE_FILE(XEH_PreInit_Once)) +#define XEH_PRE_CINIT QUOTE(call COMPILE_FILE(XEH_PreClientInit_Once)) +#define XEH_PRE_SINIT QUOTE(call COMPILE_FILE(XEH_PreServerInit_Once)) + +#define XEH_POST_INIT QUOTE(call COMPILE_FILE(XEH_PostInit_Once)) +#define XEH_POST_CINIT QUOTE(call COMPILE_FILE(XEH_PostClientInit_Once)) +#define XEH_POST_SINIT QUOTE(call COMPILE_FILE(XEH_PostServerInit_Once)) + +/* ------------------------------------------- +Macro: IS_ADMIN + Check if the local machine is an admin in the multiplayer environment. + + Reports 'true' for logged and voted in admins. + +Parameters: + None + +Example: + (begin example) + // print "true" if player is admin + systemChat str IS_ADMIN; + (end) + +Author: + commy2 +------------------------------------------- */ +#define IS_ADMIN_SYS(x) x##kick +#define IS_ADMIN serverCommandAvailable 'IS_ADMIN_SYS(#)' + +/* ------------------------------------------- +Macro: IS_ADMIN_LOGGED + Check if the local machine is a logged in admin in the multiplayer environment. + + Reports 'false' if the player was voted to be the admin. + +Parameters: + None + +Example: + (begin example) + // print "true" if player is admin and entered in the server password + systemChat str IS_ADMIN_LOGGED; + (end) + +Author: + commy2 +------------------------------------------- */ +#define IS_ADMIN_LOGGED_SYS(x) x##shutdown +#define IS_ADMIN_LOGGED serverCommandAvailable 'IS_ADMIN_LOGGED_SYS(#)' + +/* ------------------------------------------- +Macro: FILE_EXISTS + Check if a file exists + + Reports "false" if the file does not exist. + +Parameters: + FILE - Path to the file + +Example: + (begin example) + // print "true" if file exists + systemChat str FILE_EXISTS("\A3\ui_f\data\igui\cfg\cursors\weapon_ca.paa"); + (end) + +Author: + commy2 +------------------------------------------- */ +#define FILE_EXISTS(FILE) (fileExists (FILE)) diff --git a/include/x/cba/addons/xeh/$PBOPREFIX$ b/include/x/cba/addons/xeh/$PBOPREFIX$ new file mode 100644 index 0000000..4533938 --- /dev/null +++ b/include/x/cba/addons/xeh/$PBOPREFIX$ @@ -0,0 +1 @@ +x\cba\addons\xeh \ No newline at end of file diff --git a/include/x/cba/addons/xeh/script_xeh.hpp b/include/x/cba/addons/xeh/script_xeh.hpp new file mode 100644 index 0000000..2eba000 --- /dev/null +++ b/include/x/cba/addons/xeh/script_xeh.hpp @@ -0,0 +1,118 @@ +/* + Header: script_xeh.hpp + + Description: + Used internally. +*/ +///////////////////////////////////////////////////////////////////////////////// +// MACRO: EXTENDED_EVENTHANDLERS +// Add all XEH event handlers +///////////////////////////////////////////////////////////////////////////////// + +#define EXTENDED_EVENTHANDLERS init = "call cba_xeh_fnc_init"; \ +fired = "call cba_xeh_fnc_fired"; \ +animChanged = "call cba_xeh_fnc_animChanged"; \ +animDone = "call cba_xeh_fnc_animDone"; \ +animStateChanged = "call cba_xeh_fnc_animStateChanged"; \ +containerClosed = "call cba_xeh_fnc_containerClosed"; \ +containerOpened = "call cba_xeh_fnc_containerOpened"; \ +controlsShifted = "call cba_xeh_fnc_controlsShifted"; \ +dammaged = "call cba_xeh_fnc_dammaged"; \ +engine = "call cba_xeh_fnc_engine"; \ +epeContact = "call cba_xeh_fnc_epeContact"; \ +epeContactEnd = "call cba_xeh_fnc_epeContactEnd"; \ +epeContactStart = "call cba_xeh_fnc_epeContactStart"; \ +explosion = "call cba_xeh_fnc_explosion"; \ +firedNear = "call cba_xeh_fnc_firedNear"; \ +fuel = "call cba_xeh_fnc_cba_xeh_fuel"; \ +gear = "call cba_xeh_fnc_gear"; \ +getIn = "call cba_xeh_fnc_getIn"; \ +getInMan = "call cba_xeh_fnc_getInMan"; \ +getOut = "call cba_xeh_fnc_getOut"; \ +getOutMan = "call cba_xeh_fnc_getOutMan"; \ +handleHeal = "call cba_xeh_fnc_handleHeal"; \ +hit = "call cba_xeh_fnc_hit"; \ +hitPart = "call cba_xeh_fnc_hitPart"; \ +incomingMissile = "call cba_xeh_fnc_incomingMissile"; \ +inventoryClosed = "call cba_xeh_fnc_inventoryClosed"; \ +inventoryOpened = "call cba_xeh_fnc_inventoryOpened"; \ +killed = "call cba_xeh_fnc_killed"; \ +landedTouchDown = "call cba_xeh_fnc_landedTouchDown"; \ +landedStopped = "call cba_xeh_fnc_landedStopped"; \ +local = "call cba_xeh_fnc_local"; \ +respawn = "call cba_xeh_fnc_respawn"; \ +put = "call cba_xeh_fnc_put"; \ +take = "call cba_xeh_fnc_take"; \ +seatSwitched = "call cba_xeh_fnc_seatSwitched"; \ +seatSwitchedMan = "call cba_xeh_fnc_seatSwitchedMan"; \ +soundPlayed = "call cba_xeh_fnc_soundPlayed"; \ +weaponAssembled = "call cba_xeh_fnc_weaponAssembled"; \ +weaponDisassembled = "call cba_xeh_fnc_weaponDisassembled"; \ +weaponDeployed = "call cba_xeh_fnc_weaponDeployed"; \ +weaponRested = "call cba_xeh_fnc_weaponRested"; \ +reloaded = "call cba_xeh_fnc_reloaded"; \ +firedMan = "call cba_xeh_fnc_firedMan"; \ +turnIn = "call cba_xeh_fnc_turnIn"; \ +turnOut = "call cba_xeh_fnc_turnOut"; \ +deleted = "call cba_xeh_fnc_deleted"; \ +disassembled = "call cba_xeh_fnc_disassembled"; \ +Suppressed = "call cba_xeh_fnc_Suppressed"; \ +gestureChanged = "call cba_xeh_fnc_gestureChanged"; \ +gestureDone = "call cba_xeh_fnc_gestureDone"; + +/* + MACRO: DELETE_EVENTHANDLERS + + Removes all event handlers. +*/ + +#define DELETE_EVENTHANDLERS init = ""; \ +fired = ""; \ +animChanged = ""; \ +animDone = ""; \ +animStateChanged = ""; \ +containerClosed = ""; \ +containerOpened = ""; \ +controlsShifted = ""; \ +dammaged = ""; \ +engine = ""; \ +epeContact = ""; \ +epeContactEnd = ""; \ +epeContactStart = ""; \ +explosion = ""; \ +firedNear = ""; \ +fuel = ""; \ +gear = ""; \ +getIn = ""; \ +getInMan = ""; \ +getOut = ""; \ +getOutMan = ""; \ +handleHeal = ""; \ +hit = ""; \ +hitPart = ""; \ +incomingMissile = ""; \ +inventoryClosed = ""; \ +inventoryOpened = ""; \ +killed = ""; \ +landedTouchDown = ""; \ +landedStopped = ""; \ +local = ""; \ +respawn = ""; \ +put = ""; \ +take = ""; \ +seatSwitched = ""; \ +seatSwitchedMan = ""; \ +soundPlayed = ""; \ +weaponAssembled = ""; \ +weaponDisassembled = ""; \ +weaponDeployed = ""; \ +weaponRested = ""; \ +reloaded = ""; \ +firedMan = ""; \ +turnIn = ""; \ +turnOut = ""; \ +deleted = ""; \ +disassembled = ""; \ +Suppressed = ""; \ +gestureChanged = ""; \ +gestureDone = "" diff --git a/include/z/ace/addons/main/script_debug.hpp b/include/z/ace/addons/main/script_debug.hpp new file mode 100644 index 0000000..72b6657 --- /dev/null +++ b/include/z/ace/addons/main/script_debug.hpp @@ -0,0 +1,58 @@ +/** +Fast Recompiling via function +**/ +// #define DISABLE_COMPILE_CACHE +// To Use: [] call ACE_PREP_RECOMPILE; + +#ifdef DISABLE_COMPILE_CACHE + #define LINKFUNC(x) {_this call FUNC(x)} + #define PREP_RECOMPILE_START if (isNil "ACE_PREP_RECOMPILE") then {ACE_RECOMPILES = []; ACE_PREP_RECOMPILE = {{call _x} forEach ACE_RECOMPILES;}}; private _recomp = { + #define PREP_RECOMPILE_END }; call _recomp; ACE_RECOMPILES pushBack _recomp; +#else + #define LINKFUNC(x) FUNC(x) + #define PREP_RECOMPILE_START ; /* disabled */ + #define PREP_RECOMPILE_END ; /* disabled */ +#endif + + +/** +STACK TRACING +**/ +//#define ENABLE_CALLSTACK +//#define ENABLE_PERFORMANCE_COUNTERS +//#define DEBUG_EVENTS + +#ifdef ENABLE_CALLSTACK + #define CALLSTACK(function) {if(ACE_IS_ERRORED) then { ['AUTO','AUTO'] call ACE_DUMPSTACK_FNC; ACE_IS_ERRORED = false; }; ACE_IS_ERRORED = true; ACE_STACK_TRACE set [ACE_STACK_DEPTH, [diag_tickTime, __FILE__, __LINE__, ACE_CURRENT_FUNCTION, 'ANON', _this]]; ACE_STACK_DEPTH = ACE_STACK_DEPTH + 1; ACE_CURRENT_FUNCTION = 'ANON'; private _ret = _this call ##function; ACE_STACK_DEPTH = ACE_STACK_DEPTH - 1; ACE_IS_ERRORED = false; _ret;} + #define CALLSTACK_NAMED(function, functionName) {if(ACE_IS_ERRORED) then { ['AUTO','AUTO'] call ACE_DUMPSTACK_FNC; ACE_IS_ERRORED = false; }; ACE_IS_ERRORED = true; ACE_STACK_TRACE set [ACE_STACK_DEPTH, [diag_tickTime, __FILE__, __LINE__, ACE_CURRENT_FUNCTION, functionName, _this]]; ACE_STACK_DEPTH = ACE_STACK_DEPTH + 1; ACE_CURRENT_FUNCTION = functionName; private _ret = _this call ##function; ACE_STACK_DEPTH = ACE_STACK_DEPTH - 1; ACE_IS_ERRORED = false; _ret;} + #define DUMPSTACK ([__FILE__, __LINE__] call ACE_DUMPSTACK_FNC) + + #define FUNC(var1) {if(ACE_IS_ERRORED) then { ['AUTO','AUTO'] call ACE_DUMPSTACK_FNC; ACE_IS_ERRORED = false; }; ACE_IS_ERRORED = true; ACE_STACK_TRACE set [ACE_STACK_DEPTH, [diag_tickTime, __FILE__, __LINE__, ACE_CURRENT_FUNCTION, 'TRIPLES(ADDON,fnc,var1)', _this]]; ACE_STACK_DEPTH = ACE_STACK_DEPTH + 1; ACE_CURRENT_FUNCTION = 'TRIPLES(ADDON,fnc,var1)'; private _ret = _this call TRIPLES(ADDON,fnc,var1); ACE_STACK_DEPTH = ACE_STACK_DEPTH - 1; ACE_IS_ERRORED = false; _ret;} + #define EFUNC(var1,var2) {if(ACE_IS_ERRORED) then { ['AUTO','AUTO'] call ACE_DUMPSTACK_FNC; ACE_IS_ERRORED = false; }; ACE_IS_ERRORED = true; ACE_STACK_TRACE set [ACE_STACK_DEPTH, [diag_tickTime, __FILE__, __LINE__, ACE_CURRENT_FUNCTION, 'TRIPLES(DOUBLES(PREFIX,var1),fnc,var2)', _this]]; ACE_STACK_DEPTH = ACE_STACK_DEPTH + 1; ACE_CURRENT_FUNCTION = 'TRIPLES(DOUBLES(PREFIX,var1),fnc,var2)'; private _ret = _this call TRIPLES(DOUBLES(PREFIX,var1),fnc,var2); ACE_STACK_DEPTH = ACE_STACK_DEPTH - 1; ACE_IS_ERRORED = false; _ret;} +#else + #define CALLSTACK(function) function + #define CALLSTACK_NAMED(function, functionName) function + #define DUMPSTACK ; /* disabled */ +#endif + + +/** +PERFORMANCE COUNTERS SECTION +**/ +//#define ENABLE_PERFORMANCE_COUNTERS +// To Use: [] call ace_common_fnc_dumpPerformanceCounters; + +#ifdef ENABLE_PERFORMANCE_COUNTERS + #define CBA_fnc_addPerFrameHandler { _ret = [(_this select 0), (_this select 1), (_this select 2), #function] call CBA_fnc_addPerFrameHandler; if(isNil "ACE_PFH_COUNTER" ) then { ACE_PFH_COUNTER=[]; }; ACE_PFH_COUNTER pushBack [[_ret, __FILE__, __LINE__], [(_this select 0), (_this select 1), (_this select 2)]]; _ret } + + #define CREATE_COUNTER(x) if(isNil "ACE_COUNTERS" ) then { ACE_COUNTERS=[]; }; GVAR(DOUBLES(x,counter))=[]; GVAR(DOUBLES(x,counter)) set[0, QUOTE(GVAR(DOUBLES(x,counter)))]; GVAR(DOUBLES(x,counter)) set[1, diag_tickTime]; ACE_COUNTERS pushBack GVAR(DOUBLES(x,counter)); + #define BEGIN_COUNTER(x) if(isNil QUOTE(GVAR(DOUBLES(x,counter)))) then { CREATE_COUNTER(x) }; GVAR(DOUBLES(x,counter)) set[2, diag_tickTime]; + #define END_COUNTER(x) GVAR(DOUBLES(x,counter)) pushBack [(GVAR(DOUBLES(x,counter)) select 2), diag_tickTime]; + + #define DUMP_COUNTERS ([__FILE__, __LINE__] call ACE_DUMPCOUNTERS_FNC) +#else + #define CREATE_COUNTER(x) ; /* disabled */ + #define BEGIN_COUNTER(x) ; /* disabled */ + #define END_COUNTER(x) ; /* disabled */ + #define DUMP_COUNTERS ; /* disabled */ +#endif diff --git a/include/z/ace/addons/main/script_macros.hpp b/include/z/ace/addons/main/script_macros.hpp new file mode 100644 index 0000000..96d96f5 --- /dev/null +++ b/include/z/ace/addons/main/script_macros.hpp @@ -0,0 +1,168 @@ +#define DEBUG_SYNCHRONOUS +#include "\x\cba\addons\main\script_macros_common.hpp" +#include "\x\cba\addons\xeh\script_xeh.hpp" + +// Default versioning level +#define DEFAULT_VERSIONING_LEVEL 2 + +#define DGVAR(varName) if(isNil "ACE_DEBUG_NAMESPACE") then { ACE_DEBUG_NAMESPACE = []; }; if(!(QUOTE(GVAR(varName)) in ACE_DEBUG_NAMESPACE)) then { PUSH(ACE_DEBUG_NAMESPACE, QUOTE(GVAR(varName))); }; GVAR(varName) +#define DVAR(varName) if(isNil "ACE_DEBUG_NAMESPACE") then { ACE_DEBUG_NAMESPACE = []; }; if(!(QUOTE(varName) in ACE_DEBUG_NAMESPACE)) then { PUSH(ACE_DEBUG_NAMESPACE, QUOTE(varName)); }; varName +#define DFUNC(var1) TRIPLES(ADDON,fnc,var1) +#define DEFUNC(var1,var2) TRIPLES(DOUBLES(PREFIX,var1),fnc,var2) + +#undef QFUNC +#undef QEFUNC +#define QFUNC(var1) QUOTE(DFUNC(var1)) +#define QEFUNC(var1,var2) QUOTE(DEFUNC(var1,var2)) + +#define GETVAR_SYS(var1,var2) getVariable [ARR_2(QUOTE(var1),var2)] +#define SETVAR_SYS(var1,var2) setVariable [ARR_2(QUOTE(var1),var2)] +#define SETPVAR_SYS(var1,var2) setVariable [ARR_3(QUOTE(var1),var2,true)] + +#undef GETVAR +#define GETVAR(var1,var2,var3) (var1 GETVAR_SYS(var2,var3)) +#define GETMVAR(var1,var2) (missionNamespace GETVAR_SYS(var1,var2)) +#define GETUVAR(var1,var2) (uiNamespace GETVAR_SYS(var1,var2)) +#define GETPRVAR(var1,var2) (profileNamespace GETVAR_SYS(var1,var2)) +#define GETPAVAR(var1,var2) (parsingNamespace GETVAR_SYS(var1,var2)) + +#undef SETVAR +#define SETVAR(var1,var2,var3) var1 SETVAR_SYS(var2,var3) +#define SETPVAR(var1,var2,var3) var1 SETPVAR_SYS(var2,var3) +#define SETMVAR(var1,var2) missionNamespace SETVAR_SYS(var1,var2) +#define SETUVAR(var1,var2) uiNamespace SETVAR_SYS(var1,var2) +#define SETPRVAR(var1,var2) profileNamespace SETVAR_SYS(var1,var2) +#define SETPAVAR(var1,var2) parsingNamespace SETVAR_SYS(var1,var2) + +#define GETGVAR(var1,var2) GETMVAR(GVAR(var1),var2) +#define GETEGVAR(var1,var2,var3) GETMVAR(EGVAR(var1,var2),var3) + +#define ARR_SELECT(ARRAY,INDEX,DEFAULT) (if (count ARRAY > INDEX) then {ARRAY select INDEX} else {DEFAULT}) +#define ANY_OF(ARRAY,CONDITION) (ARRAY findIf {CONDITION} != -1) + +// ACEX Merge +#define ACEX_PREFIX acex +#define XADDON DOUBLES(ACEX_PREFIX,COMPONENT) +#define XGVAR(var) DOUBLES(XADDON,var) +#define EXGVAR(var1,var2) TRIPLES(ACEX_PREFIX,var1,var2) +#define QXGVAR(var) QUOTE(XGVAR(var)) +#define QEXGVAR(var1,var2) QUOTE(EXGVAR(var1,var2)) +#define QQXGVAR(var) QUOTE(QXGVAR(var)) +#define QQEXGVAR(var1,var2) QUOTE(QEXGVAR(var1,var2)) +#define ACEX_PREP(func) PREP(func); TRIPLES(XADDON,fnc,func) = DFUNC(func) + + +#define MACRO_ADDWEAPON(WEAPON,COUNT) class _xx_##WEAPON { \ + weapon = #WEAPON; \ + count = COUNT; \ +} + +#define MACRO_ADDITEM(ITEM,COUNT) class _xx_##ITEM { \ + name = #ITEM; \ + count = COUNT; \ +} + +#define MACRO_ADDMAGAZINE(MAGAZINE,COUNT) class _xx_##MAGAZINE { \ + magazine = #MAGAZINE; \ + count = COUNT; \ +} + +#define MACRO_ADDBACKPACK(BACKPACK,COUNT) class _xx_##BACKPACK { \ + backpack = #BACKPACK; \ + count = COUNT; \ +} + +// weapon types +#define TYPE_WEAPON_PRIMARY 1 +#define TYPE_WEAPON_HANDGUN 2 +#define TYPE_WEAPON_SECONDARY 4 +// magazine types +#define TYPE_MAGAZINE_HANDGUN_AND_GL 16 // mainly +#define TYPE_MAGAZINE_PRIMARY_AND_THROW 256 +#define TYPE_MAGAZINE_SECONDARY_AND_PUT 512 // mainly +#define TYPE_MAGAZINE_MISSILE 768 +// more types +#define TYPE_BINOCULAR_AND_NVG 4096 +#define TYPE_WEAPON_VEHICLE 65536 +#define TYPE_ITEM 131072 +// item types +#define TYPE_DEFAULT 0 +#define TYPE_MUZZLE 101 +#define TYPE_OPTICS 201 +#define TYPE_FLASHLIGHT 301 +#define TYPE_BIPOD 302 +#define TYPE_FIRST_AID_KIT 401 +#define TYPE_FINS 501 // not implemented +#define TYPE_BREATHING_BOMB 601 // not implemented +#define TYPE_NVG 602 +#define TYPE_GOGGLE 603 +#define TYPE_SCUBA 604 // not implemented +#define TYPE_HEADGEAR 605 +#define TYPE_FACTOR 607 +#define TYPE_RADIO 611 +#define TYPE_HMD 616 +#define TYPE_BINOCULAR 617 +#define TYPE_MEDIKIT 619 +#define TYPE_TOOLKIT 620 +#define TYPE_UAV_TERMINAL 621 +#define TYPE_VEST 701 +#define TYPE_UNIFORM 801 +#define TYPE_BACKPACK 901 + +#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 + +#define PREP_MODULE(folder) [] call compile preprocessFileLineNumbers QPATHTOF(folder\__PREP__.sqf) + +#define ACE_isHC (!hasInterface && !isDedicated) + +#define IDC_STAMINA_BAR 193 + +#define ACE_DEPRECATED(arg1,arg2,arg3) WARNING_3("%1 is deprecated. Support will be dropped in version %2. Replaced by: %3",arg1,arg2,arg3) + +#define PFORMAT_10(MESSAGE,A,B,C,D,E,F,G,H,I,J) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8, H=%9, I=%10 J=%11', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G), RETNIL(H), RETNIL(I), RETNIL(J)] +#ifdef DEBUG_MODE_FULL +#define TRACE_10(MESSAGE,A,B,C,D,E,F,G,H,I,J) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_10(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F,G,H,I,J)) +#else + #define TRACE_10(MESSAGE,A,B,C,D,E,F,G,H,I,J) /* disabled */ +#endif + +#define GRAVITY 9.8066 + +#define SD_TO_MIN_MAX(d) ((d) * 3.371) // Standard deviation -> min / max of random [min, mid, max] + +// Angular unit conversion +#define MRAD_TO_MOA(d) ((d) * 3.43774677) // Conversion factor: 54 / (5 * PI) +#define MOA_TO_MRAD(d) ((d) * 0.29088821) // Conversion factor: (5 * PI) / 54 +#define DEG_TO_MOA(d) ((d) * 60) // Conversion factor: 60 +#define MOA_TO_DEG(d) ((d) / 60) // Conversion factor: 1 / 60 +#define DEG_TO_MRAD(d) ((d) * 17.45329252) // Conversion factor: (50 * PI) / 9 +#define MRAD_TO_DEG(d) ((d) / 17.45329252) // Conversion factor: 9 / (50 * PI) +#define MOA_TO_RAD(d) ((d) * 0.00029088) // Conversion factor: PI / 10800 + +#define ZEUS_ACTION_CONDITION ([_target, {QUOTE(QUOTE(ADDON)) in curatorAddons _this}, missionNamespace, QUOTE(QGVAR(zeusCheck)), 1E11, 'ace_interactMenuClosed'] call EFUNC(common,cachedCall)) + +#define SUBSKILLS ["aimingAccuracy", "aimingShake", "aimingSpeed", "spotDistance", "spotTime", "courage", "reloadSpeed", "commanding", "general"] + +// macro add a dummy cfgPatch and notLoaded entry +#define ACE_PATCH_NOT_LOADED(NAME,CAUSE) \ +class CfgPatches { \ + class DOUBLES(NAME,notLoaded) { \ + units[] = {}; \ + weapons[] = {}; \ + requiredVersion = REQUIRED_VERSION; \ + requiredAddons[] = {"ace_main"}; \ + VERSION_CONFIG; \ + }; \ +}; \ +class ace_notLoaded { \ + NAME = CAUSE; \ +}; + +#include "script_debug.hpp" diff --git a/mod.cpp b/mod.cpp new file mode 100644 index 0000000..0583a3a --- /dev/null +++ b/mod.cpp @@ -0,0 +1,27 @@ +dir = "@Tun Respawn System"; +name = "Tun Respawn System v0.0.0"; + +author = "Tuntematon"; + +picture = "data\afilogo.paa"; // Picture displayed from the expansions menu. Optimal size is 2048x1024 +hideName = "false"; // Hide the extension name +hidePicture = "false"; // Hide the extension menu + +logoSmall = "data\afilogo.paa"; // Display next to the item added by the mod 64x64 +logo = "data\afilogo.paa"; // Logo displayed in the main menu 128x128 +logoOver = "data\afilogo.paa"; // When the mouse is over, in the main menu 128x128 +tooltip = "Customisable wave based respawn system"; +tooltipOwned = "Customisable wave based respawn system"; // Tool tip displayed when the mouse is left over, in the main menu +overview = "Tun Respawn System v0.0.0"; // Overview text, displayed from the extension menu +description = "It's unclear where this will show"; // Probably in context with action +action = "https://github.com/tuntematonjr/Tun-Respawn-System"; // Website URL, that can accessed from the expansions menu +actionName = "Github"; // label of button/tooltip in extension menu + +// Color used for DLC stripes and backgrounds (RGBA) +dlcColor[] = +{ + 1, + 0.0, + 0.86, + 1 +}; diff --git a/template/addon_template/$PBOPREFIX$ b/template/addon_template/$PBOPREFIX$ new file mode 100644 index 0000000..c4f5b54 --- /dev/null +++ b/template/addon_template/$PBOPREFIX$ @@ -0,0 +1 @@ +x\TunRes\addons\addon_template diff --git a/template/addon_template/CfgEventHandlers.hpp b/template/addon_template/CfgEventHandlers.hpp new file mode 100644 index 0000000..67fa1ae --- /dev/null +++ b/template/addon_template/CfgEventHandlers.hpp @@ -0,0 +1,19 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + serverInit = QUOTE(call COMPILE_FILE(XEH_preInit_server)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + clientInit = QUOTE(call COMPILE_FILE(XEH_postInit_client)); + }; +}; diff --git a/template/addon_template/XEH_PREP.hpp b/template/addon_template/XEH_PREP.hpp new file mode 100644 index 0000000..24fa227 --- /dev/null +++ b/template/addon_template/XEH_PREP.hpp @@ -0,0 +1 @@ +PREP(printAddonSetupReminder); diff --git a/addons/main/XEH_prep.sqf b/template/addon_template/XEH_postInit.sqf similarity index 61% rename from addons/main/XEH_prep.sqf rename to template/addon_template/XEH_postInit.sqf index dbd6724..421c54b 100644 --- a/addons/main/XEH_prep.sqf +++ b/template/addon_template/XEH_postInit.sqf @@ -1,2 +1 @@ #include "script_component.hpp" -PREP(briefingNotes); \ No newline at end of file diff --git a/template/addon_template/XEH_postInit_client.sqf b/template/addon_template/XEH_postInit_client.sqf new file mode 100644 index 0000000..90929f0 --- /dev/null +++ b/template/addon_template/XEH_postInit_client.sqf @@ -0,0 +1,4 @@ +#include "script_component.hpp" +// only executed on client + +call FUNC(printAddonSetupReminder); diff --git a/template/addon_template/XEH_preInit.sqf b/template/addon_template/XEH_preInit.sqf new file mode 100644 index 0000000..ecb5d0c --- /dev/null +++ b/template/addon_template/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/template/addon_template/XEH_preInit_server.sqf b/template/addon_template/XEH_preInit_server.sqf new file mode 100644 index 0000000..ea99354 --- /dev/null +++ b/template/addon_template/XEH_preInit_server.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +//only executed on server diff --git a/template/addon_template/XEH_preStart.sqf b/template/addon_template/XEH_preStart.sqf new file mode 100644 index 0000000..a51262a --- /dev/null +++ b/template/addon_template/XEH_preStart.sqf @@ -0,0 +1,2 @@ +#include "script_component.hpp" +#include "XEH_PREP.hpp" diff --git a/template/addon_template/config.cpp b/template/addon_template/config.cpp new file mode 100644 index 0000000..0f52a03 --- /dev/null +++ b/template/addon_template/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +// information on this addon specifically +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"TunRes_main"}; + authors[] = {"Your Name", "Other Author"}; // sub array of authors, considered for the specific addon, can be removed or left empty {} + VERSION_CONFIG; + }; +}; + +// configs go here +#include "CfgEventHandlers.hpp" diff --git a/template/addon_template/functions/fnc_printAddonSetupReminder.sqf b/template/addon_template/functions/fnc_printAddonSetupReminder.sqf new file mode 100644 index 0000000..5a5ac38 --- /dev/null +++ b/template/addon_template/functions/fnc_printAddonSetupReminder.sqf @@ -0,0 +1,5 @@ +#include "script_component.hpp" + +// simple function to print name of addon to systemChat using the ADDON macro + +systemChat format ["Don't forget to set up your new template addon '%1'!", 'ADDON']; diff --git a/template/addon_template/functions/script_component.hpp b/template/addon_template/functions/script_component.hpp new file mode 100644 index 0000000..d42d310 --- /dev/null +++ b/template/addon_template/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\x\TunRes\addons\addon_template\script_component.hpp" \ No newline at end of file diff --git a/template/addon_template/script_component.hpp b/template/addon_template/script_component.hpp new file mode 100644 index 0000000..a659c5f --- /dev/null +++ b/template/addon_template/script_component.hpp @@ -0,0 +1,15 @@ +#define COMPONENT addon_template +#define COMPONENT_BEAUTIFIED Addon_Template +#include "\x\TunRes\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +#define DISABLE_COMPILE_CACHE + +#ifdef DEBUG_ENABLED_ADDON_TEMPLATE + #define DEBUG_MODE_FULL +#endif + #ifdef DEBUG_SETTINGS_ADDON_TEMPLATE + #define DEBUG_SETTINGS DEBUG_SETTINGS_ADDON_TEMPLATE +#endif + +#include "\x\TunRes\addons\main\script_macros.hpp" From dbf44686daf168a5381842158b346559b5c66d54 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 27 Dec 2023 22:17:29 +0200 Subject: [PATCH 007/228] minor hemtt build fixes --- addons/main/script_mod.hpp | 2 +- addons/main/script_version.hpp | 2 +- addons/msp/config.cpp | 4 ++-- addons/msp/script_component.hpp | 2 +- addons/respawn/config.cpp | 5 ++++- addons/respawn/functions/fnc_briefingNotes.sqf | 5 +++-- addons/respawn/script_component.hpp | 4 ++-- 7 files changed, 14 insertions(+), 10 deletions(-) diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index cbb2861..f1b0afd 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -1,5 +1,5 @@ #define MAINPREFIX x -#define PREFIX main +#define PREFIX tunres #include "script_version.hpp" diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index cb62fcf..3dae7be 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 1 #define MINOR 8 #define PATCH 0 -#define BUILD 0 \ No newline at end of file +#define BUILD 20231227 \ No newline at end of file diff --git a/addons/msp/config.cpp b/addons/msp/config.cpp index e934973..a3b92ea 100644 --- a/addons/msp/config.cpp +++ b/addons/msp/config.cpp @@ -7,11 +7,11 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"TunRes_main", "cba_main","cba_xeh","tunres_Respawn","ace_interaction","ace_interact_menu"}; + requiredAddons[] = {"TunRes_main","tunres_Respawn","ace_interaction","ace_interact_menu"}; authors[] = {"Tuntematon"}; // sub array of authors, considered for the specific addon, can be removed or left empty {} VERSION_CONFIG; }; }; // configs go here -#include "CfgEventHandlers.hpp" +#include "CfgEventHandlers.hpp" \ No newline at end of file diff --git a/addons/msp/script_component.hpp b/addons/msp/script_component.hpp index 3c2a33a..9da6e0d 100644 --- a/addons/msp/script_component.hpp +++ b/addons/msp/script_component.hpp @@ -2,7 +2,7 @@ #define COMPONENT_BEAUTIFIED MSP #include "\x\tunres\addons\main\script_mod.hpp" -// #define DEBUG_MODE_FULL +#define DEBUG_MODE_FULL #define DISABLE_COMPILE_CACHE #ifdef DEBUG_ENABLED_MSP diff --git a/addons/respawn/config.cpp b/addons/respawn/config.cpp index 16a7feb..0e24d9f 100644 --- a/addons/respawn/config.cpp +++ b/addons/respawn/config.cpp @@ -7,7 +7,7 @@ class CfgPatches { units[] = {QGVAR(Module_waitingarea), QGVAR(Module_Respawn_point), QGVAR(tunres_Respawn_Module_teleportPoint)}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"tunres_main","A3_Modules_F","3DEN","cba_main","cba_xeh","ace_interaction","ace_interact_menu"}; + requiredAddons[] = {"tunres_main","A3_Modules_F","3DEN","ace_interaction","ace_interact_menu"}; authors[] = {"Tuntematon"}; // sub array of authors, considered for the specific addon, can be removed or left empty {} VERSION_CONFIG; }; @@ -15,6 +15,9 @@ class CfgPatches { // configs go here #include "CfgEventHandlers.hpp" +#include "\a3\ui_f\hpp\definecommoncolors.inc" +#include "RscCommon.hpp" +#include "TP_dialog.hpp" class CfgFactionClasses { diff --git a/addons/respawn/functions/fnc_briefingNotes.sqf b/addons/respawn/functions/fnc_briefingNotes.sqf index ff66100..6ab7f86 100644 --- a/addons/respawn/functions/fnc_briefingNotes.sqf +++ b/addons/respawn/functions/fnc_briefingNotes.sqf @@ -102,10 +102,11 @@ if (GVAR(killJIP)) then { }; _text = _text + localize "STR_tunres_Respawn_Briefing_teleportNetwork"; -_text = format ["%1

Powered By TuntematonEngine v%2.%3.%4", _text, MAJOR, MINOR, PATCHLVL]; +_text = format ["%1

Powered By TuntematonEngine v%2.%3.%4", _text, MAJOR, MINOR, PATCH]; //player createDiaryRecord ["Diary",["Respawn info",_text]]; if !(player diarySubjectExists "Respawn info") then { player createDiarySubject ["Respawn info","Tun - Respawn info"]; }; -player createDiaryRecord ["Respawn info",["Tun - Respawn info", _text]]; \ No newline at end of file + +player createDiaryRecord ["Respawn info",["Respawn info", _text]]; \ No newline at end of file diff --git a/addons/respawn/script_component.hpp b/addons/respawn/script_component.hpp index 7edd963..43db8c3 100644 --- a/addons/respawn/script_component.hpp +++ b/addons/respawn/script_component.hpp @@ -2,8 +2,8 @@ #define COMPONENT_BEAUTIFIED Respawn #include "\x\tunres\addons\main\script_mod.hpp" -// #define DEBUG_MODE_FULL -// #define DISABLE_COMPILE_CACHE +#define DEBUG_MODE_FULL +#define DISABLE_COMPILE_CACHE #ifdef DEBUG_ENABLED_RESPAWN #define DEBUG_MODE_FULL From f5a7c5add92cf0141e5a4034e543168d65013f4f Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 27 Dec 2023 22:19:08 +0200 Subject: [PATCH 008/228] update briefing info --- addons/msp/functions/fnc_briefingNotes.sqf | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/addons/msp/functions/fnc_briefingNotes.sqf b/addons/msp/functions/fnc_briefingNotes.sqf index aebd14d..c4066bc 100644 --- a/addons/msp/functions/fnc_briefingNotes.sqf +++ b/addons/msp/functions/fnc_briefingNotes.sqf @@ -23,7 +23,8 @@ private _vehicle = switch (playerSide) do { default { "No side" }; }; -private _text = format ["%1

MSP settings
",_text]; +private _text = "MSP settings
"; + if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { _text = format ["%1
%2",_text, localize "STR_tunres_Respawn_Briefing_MspEnabled"]; @@ -44,10 +45,11 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { _text = format ["%1
%2",_text, localize "STR_tunres_Respawn_Briefing_MspDisabled"]; }; -_text = format ["%1

Powered By TuntematonEngine v%2.%3.%4", _text, MAJOR, MINOR, PATCHLVL]; +_text = format ["%1

Powered By TuntematonEngine v%2.%3.%4", _text, MAJOR, MINOR, PATCH]; //player createDiaryRecord ["Diary",["Respawn info",_text]]; if !(player diarySubjectExists "Respawn info") then { player createDiarySubject ["Respawn info","Tun - Respawn info"]; }; -player createDiaryRecord ["Respawn info",["Tun - MSP info", _text]]; \ No newline at end of file + +player createDiaryRecord ["Respawn info",["MSP info", _text]]; \ No newline at end of file From 8dd834d54ab03cff8f3cf1066411448565db4070 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 27 Dec 2023 22:19:27 +0200 Subject: [PATCH 009/228] update TP dialog --- addons/respawn/RscCommon.hpp | 268 +++++++++++++++++++++++++++++++++++ addons/respawn/TP_dialog.hpp | 97 +++++-------- 2 files changed, 301 insertions(+), 64 deletions(-) create mode 100644 addons/respawn/RscCommon.hpp diff --git a/addons/respawn/RscCommon.hpp b/addons/respawn/RscCommon.hpp new file mode 100644 index 0000000..f74326b --- /dev/null +++ b/addons/respawn/RscCommon.hpp @@ -0,0 +1,268 @@ +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUTBUTTON 16 +#define CT_HITZONES 17 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_LISTNBOX 102 +#define CT_ITEMSLOT 103 +#define CT_CHECKBOX 77 + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0C + +#define ST_TYPE 0xF0 +#define ST_SINGLE 0x00 +#define ST_MULTI 0x10 +#define ST_TITLE_BAR 0x20 +#define ST_PICTURE 0x30 +#define ST_FRAME 0x40 +#define ST_BACKGROUND 0x50 +#define ST_GROUP_BOX 0x60 +#define ST_GROUP_BOX2 0x70 +#define ST_HUD_BACKGROUND 0x80 +#define ST_TILE_PICTURE 0x90 +#define ST_WITH_RECT 0xA0 +#define ST_LINE 0xB0 +#define ST_UPPERCASE 0xC0 +#define ST_LOWERCASE 0xD0 + +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 + +#define SL_TEXTURES 0x10 + +// progress bar +#define ST_VERTICAL 0x01 +#define ST_HORIZONTAL 0 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 + +// Tree styles +#define TR_SHOWROOT 1 +#define TR_AUTOCOLLAPSE 2 + +// Default grid +#define GUI_GRID_WAbs ((safezoneW / safezoneH) min 1.2) +#define GUI_GRID_HAbs (GUI_GRID_WAbs / 1.2) +#define GUI_GRID_W (GUI_GRID_WAbs / 40) +#define GUI_GRID_H (GUI_GRID_HAbs / 25) +#define GUI_GRID_X (safezoneX) +#define GUI_GRID_Y (safezoneY + safezoneH - GUI_GRID_HAbs) + +// Default text sizes +#define GUI_TEXT_SIZE_SMALL (GUI_GRID_H * 0.8) +#define GUI_TEXT_SIZE_MEDIUM (GUI_GRID_H * 1) +#define GUI_TEXT_SIZE_LARGE (GUI_GRID_H * 1.2) + +class ScrollBar; +class RscObject; +class RscText; +class RscTextSmall; +class RscTitle; +class RscProgress; +class RscProgressNotFreeze; +class RscPicture; +class RscLadderPicture; +class RscPictureKeepAspect; +class RscHTML; +class RscButton; +class RscShortcutButton; +class RscButtonSmall; +class RscEdit; +class RscCombo; +class RscListBox; +class RscListNBox; +class RscXListBox; +class RscTree; +class RscSlider; +class RscSliderH; +class RscXSliderH; +class RscActiveText; +class RscStructuredText; +class RscControlsGroup; +class RscToolbox; +class RscMapControl; +class RscCheckBox; +class RscFrame; +class ctrlDefault; +class ctrlControlsGroup; +class ctrlDefaultText; +class ctrlDefaultButton; +class RscBackgroundStripeTop; +class RscBackgroundStripeBottom; +class RscIGText; +class RscIGProgress; +class RscListBoxKeys; +class RscControlsGroupNoScrollbars; +class RscControlsGroupNoHScrollbars; +class RscControlsGroupNoVScrollbars; +class RscLine; +class RscActivePicture; +class RscButtonTextOnly; +class RscShortcutButtonMain; +class RscButtonEditor; +class RscIGUIShortcutButton; +class RscGearShortcutButton; +class RscButtonMenu; +class RscButtonMenuOK; +class RscButtonMenuCancel; +class RscButtonMenuSteam; +class RscLoadingText; +class RscIGUIListBox; +class RscIGUIListNBox; +class RscBackground; +class RscBackgroundGUI; +class RscBackgroundGUILeft; +class RscBackgroundGUIRight; +class RscBackgroundGUIBottom; +class RscBackgroundGUITop; +class RscBackgroundGUIDark; +class RscBackgroundLogo; +class RscMapControlEmpty; +class RscVignette; +class CA_Mainback; +class CA_Back; +class CA_Title_Back; +class CA_Black_Back; +class CA_Title; +class CA_Logo; +class CA_Logo_Small; +class CA_RscButton; +class CA_RscButton_dialog; +class CA_Ok; +class CA_Ok_image; +class CA_Ok_image2; +class CA_Ok_text; +class ctrlCheckbox; +class ctrlCheckboxBaseline; +class ctrlStatic; +class ctrlControlsGroupNoScrollbars; +class ctrlStructuredText; +class RscTextMulti; +class RscTreeSearch; +class RscVideo; +class RscVideoKeepAspect; +class RscActivePictureKeepAspect; +class RscEditMulti; +class RscMapSignalBackground; +class RscMapSignalPicture; +class RscMapSignalText; +class RscColorPicker; +class RscInterlacingScreen; +class RscFeedback; +class RscTrafficLight; +class RscButtonSearch; +class RscIGUIText; +class RscOpticsText; +class RscOpticsValue; +class RscIGUIValue; +class RscButtonMenuMain; +class RscButtonTestCentered; +class RscDisplaySingleMission_ChallengeOverviewGroup; +class RscDisplayDebriefing_RscTextMultiline; +class RscDisplayDebriefing_ListGroup; +class RscButtonArsenal; +class RscTextNoShadow; +class RscButtonNoColor; +class RscToolboxButton; +class ctrlStaticPicture; +class ctrlStaticPictureKeepAspect; +class ctrlStaticPictureTile; +class ctrlStaticFrame; +class ctrlStaticLine; +class ctrlStaticMulti; +class ctrlStaticBackground; +class ctrlStaticOverlay; +class ctrlStaticTitle; +class ctrlStaticFooter; +class ctrlStaticBackgroundDisable; +class ctrlStaticBackgroundDisableTiles; +class ctrlButton; +class ctrlButtonPicture; +class ctrlButtonPictureKeepAspect; +class ctrlButtonOK; +class ctrlButtonCancel; +class ctrlButtonClose; +class ctrlButtonToolbar; +class ctrlButtonSearch; +class ctrlButtonExpandAll; +class ctrlButtonCollapseAll; +class ctrlButtonFilter; +class ctrlEdit; +class ctrlEditMulti; +class ctrlSliderV; +class ctrlSliderH; +class ctrlCombo; +class ctrlComboToolbar; +class ctrlListbox; +class ctrlToolbox; +class ctrlToolboxPicture; +class ctrlToolboxPictureKeepAspect; +class ctrlCheckboxes; +class ctrlCheckboxesCheckbox; +class ctrlProgress; +class ctrlHTML; +class ctrlActiveText; +class ctrlActivePicture; +class ctrlActivePictureKeepAspect; +class ctrlTree; +class ctrlControlsGroupNoHScrollbars; +class ctrlControlsGroupNoVScrollbars; +class ctrlShortcutButton; +class ctrlShortcutButtonOK; +class ctrlShortcutButtonCancel; +class ctrlShortcutButtonSteam; +class ctrlXListbox; +class ctrlXSliderV; +class ctrlXSliderH; +class ctrlMenu; +class ctrlMenuStrip; +class ctrlMap; +class ctrlMapEmpty; +class ctrlMapMain; +class ctrlListNBox; +class ctrlCheckboxToolbar; diff --git a/addons/respawn/TP_dialog.hpp b/addons/respawn/TP_dialog.hpp index f17fff4..35930e3 100644 --- a/addons/respawn/TP_dialog.hpp +++ b/addons/respawn/TP_dialog.hpp @@ -1,51 +1,19 @@ //Exported via Arma Dialog Creator (https://github.com/kayler-renslow/arma-dialog-creator) -class RscListBox; -class RscButton; -class RscText; -class RscMapControl; - -// Default grid -#define GUI_GRID_WAbs ((safezoneW / safezoneH) min 1.2) -#define GUI_GRID_HAbs (GUI_GRID_WAbs / 1.2) -#define GUI_GRID_W (GUI_GRID_WAbs / 40) -#define GUI_GRID_H (GUI_GRID_HAbs / 25) -#define GUI_GRID_X (safezoneX) -#define GUI_GRID_Y (safezoneY + safezoneH - GUI_GRID_HAbs) - -// Default text sizes -#define GUI_TEXT_SIZE_SMALL (GUI_GRID_H * 0.8) -#define GUI_TEXT_SIZE_MEDIUM (GUI_GRID_H * 1) -#define GUI_TEXT_SIZE_LARGE (GUI_GRID_H * 1.2) - -// Pixel grid -#define pixelScale 0.50 -#define GRID_W (pixelW * pixelGrid * pixelScale) -#define GRID_H (pixelH * pixelGrid * pixelScale) - -//GUI color -#define GUI_USER_COLORBACKGROUND { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.13])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.54])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.21])", 1 } - class TP_Dialog { idd = 300000; class ControlsBackground { - class tunres_respawn_tp_background + class tunres_respawn_tp_background : RscBackgroundGUI { - type = 0; idc = -1; - x = safeZoneX + safeZoneW * 0.3; - y = safeZoneY + safeZoneH * 0.25; - w = safeZoneW * 0.4; - h = safeZoneH * 0.5; - style = 0; - text = ""; - colorBackground[] = {0.102, 0.102, 0.102, 0.8}; - colorText[] = {0.2431,0.1725,0.3333,1}; - font = "PuristaMedium"; - sizeEx = (((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1); + x = "safeZoneX + safeZoneW * 0.345275"; + y = "safeZoneY + safeZoneH * 0.247078"; + w = "safeZoneW * 0.309451"; + h = "safeZoneH * 0.505844"; + colorBackground[] = {GUI_BCG_MENU_RGB, 0.9}; }; }; @@ -54,50 +22,51 @@ class TP_Dialog class tunres_respawn_tp_list : RscListBox { idc = 300001; - x = safeZoneX + safeZoneW * 0.325; - y = safeZoneY + safeZoneH * 0.275; - w = safeZoneW * 0.175; - h = safeZoneH * 0.425; + x = "safeZoneX + safeZoneW * 0.365905"; + y = "safeZoneY + safeZoneH * 0.291065"; + w = "safeZoneW * 0.113465"; + h = "safeZoneH * 0.417871"; onLBSelChanged = "params ['_control', '_selectedIndex']; [_control, _selectedIndex] call tunres_Respawn_fnc_teleportOnLBSelChanged"; + colorBackground[] = {0.302, 0.302, 0.302, 1}; }; class tunres_respawn_tp_button : RscButton { idc = 300002; - x = safeZoneX + safeZoneW * 0.625; - y = safeZoneY + safeZoneH * 0.67592593; - w = safeZoneW * 0.05; - h = safeZoneH * 0.05; + x = "safeZoneX + safeZoneW * 0.58252"; + y = "safeZoneY + safeZoneH * 0.66495"; + w = "safeZoneW * 0.0515752"; + h = "safeZoneH * 0.0439865"; text = "$STR_tunres_Respawn_tp_dialog_button"; - action = "[] call tunres_Respawn_fnc_teleportButton"; - SizeEx = GUI_TEXT_SIZE_SMALL; - colorBackground[] = GUI_USER_COLORBACKGROUND; - colorFocused[] = GUI_USER_COLORBACKGROUND; - colorFocused2[] = GUI_USER_COLORBACKGROUND; + action = QUOTE([] spawn FUNC(teleportButton);); + SizeEx = QUOTE(GUI_TEXT_SIZE_SMALL); + colorBackground[] = GUI_BCG_COLOR; + colorFocused[] = GUI_BCG_COLOR; + colorFocused2[] = GUI_BCG_COLOR; }; - class tunres_respawn_tp_header : RscText + class tunres_respawn_tp_header : RscTitle { idc = -1; - x = safeZoneX + safeZoneW * 0.50520834; - y = safeZoneY + safeZoneH * 0.27592593; - w = safeZoneW * 0.1796875; - h = safeZoneH * 0.08611112; - style = 2; + x = "safeZoneX + safeZoneW * 0.489685"; + y = "safeZoneY + safeZoneH * 0.291064"; + w = "safeZoneW * 0.144411"; + h = "safeZoneH * 0.0659797"; + style = ST_CENTER; text = "$STR_tunres_Respawn_tp_dialog_header"; - colorBackground[] = GUI_USER_COLORBACKGROUND; - colorText[] = {1,1,1,1}; + sizeEx = QUOTE(GUI_TEXT_SIZE_LARGE); + colorText[] = GUI_TITLETEXT_COLOR; + colorBackground[] = GUI_BCG_COLOR; font = "TahomaB"; - SizeEx = GUI_TEXT_SIZE_LARGE; shadow = 2; }; class tunres_respawn_tp_minimap : RscMapControl { idc = 300003; - x = safeZoneX + safeZoneW * 0.51875; - y = safeZoneY + safeZoneH * 0.375; - w = safeZoneW * 0.1625; - h = safeZoneH * 0.275; + x = "safeZoneX + safeZoneW * 0.489685"; + y = "safeZoneY + safeZoneH * 0.379036"; + w = "safeZoneW * 0.144411"; + h = "safeZoneH * 0.263919"; }; }; }; \ No newline at end of file From fac14d9cc4298d27fdb02d75516b0f6329692790 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 27 Dec 2023 22:20:27 +0200 Subject: [PATCH 010/228] dont add check tickets, when no tickets in use --- addons/respawn/functions/fnc_addCheckTicketCountAction.sqf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf b/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf index 5a269c2..77eac85 100644 --- a/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf +++ b/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf @@ -18,10 +18,14 @@ params [ ["_object", objNull, [objNull]], ["_offset", nil, [[]]], ["_parrenPath", ["ACE_MainActions"], [[]]]]; +if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Default") exitWith { + LOG("Skip adding ticket check ace action, as we dont use tickets"); + }; + if (_useAceAction) then { private _action = ["CheckTickets", "STR_tunres_Respawn_CheckTickets" call BIS_fnc_localize,"\a3\modules_f_curator\data\portraitmissionname_ca.paa",{ [playerSide] call FUNC(checkTicketCount); }, {true}, nil, nil, _offset] call ace_interact_menu_fnc_createAction; [_object, 0, _parrenPath, _action] call ace_interact_menu_fnc_addActionToObject; } else { _object addAction ["STR_tunres_Respawn_CheckTickets" call BIS_fnc_localize, { [playerSide] call FUNC(checkTicketCount) }, [], 10, true, true, "", "true", 10]; -}; \ No newline at end of file +}; From cec077174c50b11a0b0d85ed2fed3cfaf052f2ee Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 27 Dec 2023 22:20:42 +0200 Subject: [PATCH 011/228] fix values not being rounded --- addons/msp/XEH_preInit.sqf | 39 ++++++++++++++++++------ addons/respawn/XEH_preInit.sqf | 55 +++++++++++++++++++++++++++------- 2 files changed, 74 insertions(+), 20 deletions(-) diff --git a/addons/msp/XEH_preInit.sqf b/addons/msp/XEH_preInit.sqf index 1df5539..3645b7b 100644 --- a/addons/msp/XEH_preInit.sqf +++ b/addons/msp/XEH_preInit.sqf @@ -45,7 +45,10 @@ PREP_RECOMPILE_END; ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_contested" call BIS_fnc_localize], [1, 600, 30, 0], 1, - {}, + { + params ["_value"]; + GVAR(report_enemies_interval) = round _value; + }, true ] call CBA_Settings_fnc_init; @@ -56,7 +59,10 @@ PREP_RECOMPILE_END; ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_contested" call BIS_fnc_localize], [0, 5000, 500, 0], 1, - {}, + { + params ["_value"]; + GVAR(report_enemies_range) = round _value; + }, false ] call CBA_Settings_fnc_init; @@ -65,9 +71,12 @@ PREP_RECOMPILE_END; "SLIDER", ["STR_tunres_MSP_CBA_contested_radius_max" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_contested_max" call BIS_fnc_localize], ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_contested" call BIS_fnc_localize], - [0, 5000, 500, 0], + [0, 3000, 500, 0], 1, - {}, + { + params ["_value"]; + GVAR(contested_radius_max) = round _value; + }, false ] call CBA_Settings_fnc_init; @@ -76,9 +85,12 @@ PREP_RECOMPILE_END; "SLIDER", ["STR_tunres_MSP_CBA_contested_radius_min" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_contested_min" call BIS_fnc_localize], ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_contested" call BIS_fnc_localize], - [0, 5000, 200, 0], + [0, 3000, 200, 0], 1, - {}, + { + params ["_value"]; + GVAR(contested_radius_min) = round _value; + }, false ] call CBA_Settings_fnc_init; @@ -89,7 +101,10 @@ PREP_RECOMPILE_END; ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_contested" call BIS_fnc_localize], [1, 600, 30, 0], 1, - {}, + { + params ["_value"]; + GVAR(contested_check_interval) = round _value; + }, true ] call CBA_Settings_fnc_init; @@ -100,7 +115,10 @@ PREP_RECOMPILE_END; ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_progres" call BIS_fnc_localize], [0, 60, 5, 0], 1, - {}, + { + params ["_value"]; + GVAR(progresbar_time_setup) = round _value; + }, true ] call CBA_Settings_fnc_init; @@ -111,7 +129,10 @@ PREP_RECOMPILE_END; ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_progres" call BIS_fnc_localize], [0, 60, 5, 0], 1, - {}, + { + params ["_value"]; + GVAR(progresbar_time_pack) = round _value; + }, true ] call CBA_Settings_fnc_init; diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index 7acdca1..eba3da4 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -75,7 +75,10 @@ GVAR(selfTPmenuOpenObj) = objNull; ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_generic" call BIS_fnc_localize], [1, 300, 20, 0], 1, - {}, + { + params ["_value"]; + GVAR(killJIP_time) = round _value; + }, true ] call CBA_Settings_fnc_init; @@ -119,7 +122,10 @@ GVAR(selfTPmenuOpenObj) = objNull; ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_generic" call BIS_fnc_localize], [0, 100, 0, 0], 1, - {}, + { + params ["_value"]; + GVAR(delayed_respawn) = round _value; + }, true ] call CBA_Settings_fnc_init; @@ -130,7 +136,10 @@ GVAR(selfTPmenuOpenObj) = objNull; ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_generic" call BIS_fnc_localize], [30, 300, 100, 0], 1, - {}, + { + params ["_value"]; + GVAR(waiting_area_range) = round _value; + }, true ] call CBA_Settings_fnc_init; @@ -142,7 +151,10 @@ GVAR(selfTPmenuOpenObj) = objNull; ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_time" call BIS_fnc_localize], [1, 60, 15, 0], 1, - {}, + { + params ["_value"]; + GVAR(time_west) = round _value; + }, true ] call CBA_Settings_fnc_init; @@ -153,7 +165,10 @@ GVAR(selfTPmenuOpenObj) = objNull; ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_time" call BIS_fnc_localize], [1, 60, 15, 0], 1, - {}, + { + params ["_value"]; + GVAR(time_east) = round _value; + }, true ] call CBA_Settings_fnc_init; @@ -164,7 +179,10 @@ GVAR(selfTPmenuOpenObj) = objNull; ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_time" call BIS_fnc_localize], [1, 60, 15, 0], 1, - {}, + { + params ["_value"]; + GVAR(time_guer) = round _value; + }, true ] call CBA_Settings_fnc_init; @@ -175,7 +193,10 @@ GVAR(selfTPmenuOpenObj) = objNull; ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_time" call BIS_fnc_localize], [1, 60, 15, 0], 1, - {}, + { + params ["_value"]; + GVAR(time_civ) = round _value; + }, true ] call CBA_Settings_fnc_init; @@ -221,7 +242,10 @@ GVAR(selfTPmenuOpenObj) = objNull; ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_ticketcount" call BIS_fnc_localize], [0, 1000, 0, 0], 1, - {}, + { + params ["_value"]; + GVAR(tickets_west) = round _value; + }, true ] call CBA_Settings_fnc_init; @@ -232,7 +256,10 @@ GVAR(selfTPmenuOpenObj) = objNull; ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_ticketcount" call BIS_fnc_localize], [0, 1000, 0, 0], 1, - {}, + { + params ["_value"]; + GVAR(tickets_east) = round _value; + }, true ] call CBA_Settings_fnc_init; @@ -243,7 +270,10 @@ GVAR(selfTPmenuOpenObj) = objNull; ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_ticketcount" call BIS_fnc_localize], [0, 1000, 0, 0], 1, - {}, + { + params ["_value"]; + GVAR(tickets_guer) = round _value; + }, true ] call CBA_Settings_fnc_init; @@ -254,7 +284,10 @@ GVAR(selfTPmenuOpenObj) = objNull; ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_ticketcount" call BIS_fnc_localize], [0, 1000, 0, 0], 1, - {}, + { + params ["_value"]; + GVAR(tickets_civ) = round _value; + }, true ] call CBA_Settings_fnc_init; From 6fffad2616d44c274612b66f74827df770ee63b2 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 27 Dec 2023 22:28:04 +0200 Subject: [PATCH 012/228] delete some unused shit --- include/a3/ui_f/$PBOPREFIX$ | 1 - include/x/cba/addons/main/$PBOPREFIX$ | 1 - include/x/cba/addons/xeh/$PBOPREFIX$ | 1 - include/z/ace/addons/main/script_debug.hpp | 58 ---------------------- 4 files changed, 61 deletions(-) delete mode 100644 include/a3/ui_f/$PBOPREFIX$ delete mode 100644 include/x/cba/addons/main/$PBOPREFIX$ delete mode 100644 include/x/cba/addons/xeh/$PBOPREFIX$ delete mode 100644 include/z/ace/addons/main/script_debug.hpp diff --git a/include/a3/ui_f/$PBOPREFIX$ b/include/a3/ui_f/$PBOPREFIX$ deleted file mode 100644 index 93870d7..0000000 --- a/include/a3/ui_f/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -a3\ui_f diff --git a/include/x/cba/addons/main/$PBOPREFIX$ b/include/x/cba/addons/main/$PBOPREFIX$ deleted file mode 100644 index 835b0c9..0000000 --- a/include/x/cba/addons/main/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -x\cba\addons\main \ No newline at end of file diff --git a/include/x/cba/addons/xeh/$PBOPREFIX$ b/include/x/cba/addons/xeh/$PBOPREFIX$ deleted file mode 100644 index 4533938..0000000 --- a/include/x/cba/addons/xeh/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -x\cba\addons\xeh \ No newline at end of file diff --git a/include/z/ace/addons/main/script_debug.hpp b/include/z/ace/addons/main/script_debug.hpp deleted file mode 100644 index 72b6657..0000000 --- a/include/z/ace/addons/main/script_debug.hpp +++ /dev/null @@ -1,58 +0,0 @@ -/** -Fast Recompiling via function -**/ -// #define DISABLE_COMPILE_CACHE -// To Use: [] call ACE_PREP_RECOMPILE; - -#ifdef DISABLE_COMPILE_CACHE - #define LINKFUNC(x) {_this call FUNC(x)} - #define PREP_RECOMPILE_START if (isNil "ACE_PREP_RECOMPILE") then {ACE_RECOMPILES = []; ACE_PREP_RECOMPILE = {{call _x} forEach ACE_RECOMPILES;}}; private _recomp = { - #define PREP_RECOMPILE_END }; call _recomp; ACE_RECOMPILES pushBack _recomp; -#else - #define LINKFUNC(x) FUNC(x) - #define PREP_RECOMPILE_START ; /* disabled */ - #define PREP_RECOMPILE_END ; /* disabled */ -#endif - - -/** -STACK TRACING -**/ -//#define ENABLE_CALLSTACK -//#define ENABLE_PERFORMANCE_COUNTERS -//#define DEBUG_EVENTS - -#ifdef ENABLE_CALLSTACK - #define CALLSTACK(function) {if(ACE_IS_ERRORED) then { ['AUTO','AUTO'] call ACE_DUMPSTACK_FNC; ACE_IS_ERRORED = false; }; ACE_IS_ERRORED = true; ACE_STACK_TRACE set [ACE_STACK_DEPTH, [diag_tickTime, __FILE__, __LINE__, ACE_CURRENT_FUNCTION, 'ANON', _this]]; ACE_STACK_DEPTH = ACE_STACK_DEPTH + 1; ACE_CURRENT_FUNCTION = 'ANON'; private _ret = _this call ##function; ACE_STACK_DEPTH = ACE_STACK_DEPTH - 1; ACE_IS_ERRORED = false; _ret;} - #define CALLSTACK_NAMED(function, functionName) {if(ACE_IS_ERRORED) then { ['AUTO','AUTO'] call ACE_DUMPSTACK_FNC; ACE_IS_ERRORED = false; }; ACE_IS_ERRORED = true; ACE_STACK_TRACE set [ACE_STACK_DEPTH, [diag_tickTime, __FILE__, __LINE__, ACE_CURRENT_FUNCTION, functionName, _this]]; ACE_STACK_DEPTH = ACE_STACK_DEPTH + 1; ACE_CURRENT_FUNCTION = functionName; private _ret = _this call ##function; ACE_STACK_DEPTH = ACE_STACK_DEPTH - 1; ACE_IS_ERRORED = false; _ret;} - #define DUMPSTACK ([__FILE__, __LINE__] call ACE_DUMPSTACK_FNC) - - #define FUNC(var1) {if(ACE_IS_ERRORED) then { ['AUTO','AUTO'] call ACE_DUMPSTACK_FNC; ACE_IS_ERRORED = false; }; ACE_IS_ERRORED = true; ACE_STACK_TRACE set [ACE_STACK_DEPTH, [diag_tickTime, __FILE__, __LINE__, ACE_CURRENT_FUNCTION, 'TRIPLES(ADDON,fnc,var1)', _this]]; ACE_STACK_DEPTH = ACE_STACK_DEPTH + 1; ACE_CURRENT_FUNCTION = 'TRIPLES(ADDON,fnc,var1)'; private _ret = _this call TRIPLES(ADDON,fnc,var1); ACE_STACK_DEPTH = ACE_STACK_DEPTH - 1; ACE_IS_ERRORED = false; _ret;} - #define EFUNC(var1,var2) {if(ACE_IS_ERRORED) then { ['AUTO','AUTO'] call ACE_DUMPSTACK_FNC; ACE_IS_ERRORED = false; }; ACE_IS_ERRORED = true; ACE_STACK_TRACE set [ACE_STACK_DEPTH, [diag_tickTime, __FILE__, __LINE__, ACE_CURRENT_FUNCTION, 'TRIPLES(DOUBLES(PREFIX,var1),fnc,var2)', _this]]; ACE_STACK_DEPTH = ACE_STACK_DEPTH + 1; ACE_CURRENT_FUNCTION = 'TRIPLES(DOUBLES(PREFIX,var1),fnc,var2)'; private _ret = _this call TRIPLES(DOUBLES(PREFIX,var1),fnc,var2); ACE_STACK_DEPTH = ACE_STACK_DEPTH - 1; ACE_IS_ERRORED = false; _ret;} -#else - #define CALLSTACK(function) function - #define CALLSTACK_NAMED(function, functionName) function - #define DUMPSTACK ; /* disabled */ -#endif - - -/** -PERFORMANCE COUNTERS SECTION -**/ -//#define ENABLE_PERFORMANCE_COUNTERS -// To Use: [] call ace_common_fnc_dumpPerformanceCounters; - -#ifdef ENABLE_PERFORMANCE_COUNTERS - #define CBA_fnc_addPerFrameHandler { _ret = [(_this select 0), (_this select 1), (_this select 2), #function] call CBA_fnc_addPerFrameHandler; if(isNil "ACE_PFH_COUNTER" ) then { ACE_PFH_COUNTER=[]; }; ACE_PFH_COUNTER pushBack [[_ret, __FILE__, __LINE__], [(_this select 0), (_this select 1), (_this select 2)]]; _ret } - - #define CREATE_COUNTER(x) if(isNil "ACE_COUNTERS" ) then { ACE_COUNTERS=[]; }; GVAR(DOUBLES(x,counter))=[]; GVAR(DOUBLES(x,counter)) set[0, QUOTE(GVAR(DOUBLES(x,counter)))]; GVAR(DOUBLES(x,counter)) set[1, diag_tickTime]; ACE_COUNTERS pushBack GVAR(DOUBLES(x,counter)); - #define BEGIN_COUNTER(x) if(isNil QUOTE(GVAR(DOUBLES(x,counter)))) then { CREATE_COUNTER(x) }; GVAR(DOUBLES(x,counter)) set[2, diag_tickTime]; - #define END_COUNTER(x) GVAR(DOUBLES(x,counter)) pushBack [(GVAR(DOUBLES(x,counter)) select 2), diag_tickTime]; - - #define DUMP_COUNTERS ([__FILE__, __LINE__] call ACE_DUMPCOUNTERS_FNC) -#else - #define CREATE_COUNTER(x) ; /* disabled */ - #define BEGIN_COUNTER(x) ; /* disabled */ - #define END_COUNTER(x) ; /* disabled */ - #define DUMP_COUNTERS ; /* disabled */ -#endif From 5f48c0478ba07dc8963af86faa6762ade364fb09 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 10 Jan 2024 17:41:15 +0200 Subject: [PATCH 013/228] removed unsude things --- addons/respawn/XEH_postInit_server.sqf | 112 ++++++++++++------------- 1 file changed, 54 insertions(+), 58 deletions(-) diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index e53e2c8..4ff2f82 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -1,72 +1,68 @@ #include "script_component.hpp" -if (isServer) then { +if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Playertickets") then { + GVAR(PlayerTicektsHash) = createHashMap; + AAR_UPDATE("west","Player tickets", GVAR(tickets_west)); + AAR_UPDATE("east","Player tickets", GVAR(tickets_east)); + AAR_UPDATE("guer","Player tickets", GVAR(tickets_guer)); + AAR_UPDATE("civ","Player tickets", GVAR(tickets_civ)); +}; - if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Playertickets") then { - GVAR(PlayerTicektsHash) = createHashMap; - GVAR(tickets_west), GVAR(tickets_east), GVAR(tickets_guer), GVAR(tickets_civ); - AAR_UPDATE("west","Player tickets", GVAR(tickets_west)); - AAR_UPDATE("east","Player tickets", GVAR(tickets_east)); - AAR_UPDATE("guer","Player tickets", GVAR(tickets_guer)); - AAR_UPDATE("civ","Player tickets", GVAR(tickets_civ)); - }; +if (GVAR(respawn_type) isNotEqualTo localize "STR_tunres_Respawn_Type_Default") then { + // if player disconnect add its uid to list so when he come back. No ticket is used. Only used if Kill jip is enabled + addMissionEventHandler ["PlayerDisconnected", { + if (GVAR(respawn_type) isEqualTo "default") exitWith { }; + params ["_id", "_uid", "_name", "_jip", "_owner"]; - if (GVAR(respawn_type) isNotEqualTo localize "STR_tunres_Respawn_Type_Default") then { - // if player disconnect add its uid to list so when he come back. No ticket is used. Only used if Kill jip is enabled - addMissionEventHandler ["PlayerDisconnected", { - if (GVAR(respawn_type) isEqualTo "default") exitWith { }; - params ["_id", "_uid", "_name", "_jip", "_owner"]; + if (cba_missiontime > (GVAR(killJIP_time) * 60) && GVAR(killJIP)) then { + GVAR(disconnected_players) pushBackUnique _uid; + }; + }]; +}; - if (cba_missiontime > (GVAR(killJIP_time) * 60) && GVAR(killJIP)) then { - GVAR(disconnected_players) pushBackUnique _uid; - }; - }]; +//clean bodies during briefing && safestart +addMissionEventHandler ["HandleDisconnect", { + params ["_unit", "_id", "_uid", "_name"]; + if (cba_missiontime < (GVAR(killJIP_time) * 60) || _unit getVariable [QGVAR(waiting_respawn),false]) then { + deleteVehicle _unit; }; + false; +}]; - //clean bodies during briefing && safestart - addMissionEventHandler ["HandleDisconnect", { - params ["_unit", "_id", "_uid", "_name"]; - if (cba_missiontime < (GVAR(killJIP_time) * 60) || _unit getVariable [QGVAR(waiting_respawn),false]) then { - deleteVehicle _unit; +//AAR times +if ( !isnil "afi_aar2" ) then { + [{cba_missiontime > 10}, { + if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Sidetickets") then { + AAR_UPDATE("west","Side tickets", GVAR(tickets_west)); + AAR_UPDATE("east","Side tickets", GVAR(tickets_east)); + AAR_UPDATE("guer","Side tickets", GVAR(tickets_guer)); + AAR_UPDATE("civ","Side tickets", GVAR(tickets_civ)); }; - false; - }]; - //AAR times - if ( !isnil "afi_aar2" ) then { - [{cba_missiontime > 10}, { - if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Sidetickets") then { - AAR_UPDATE("west","Side tickets", GVAR(tickets_west)); - AAR_UPDATE("east","Side tickets", GVAR(tickets_east)); - AAR_UPDATE("guer","Side tickets", GVAR(tickets_guer)); - AAR_UPDATE("civ","Side tickets", GVAR(tickets_civ)); - }; + if (missionNamespace getVariable ["afi_aar2", false]) then { + [{ - if (missionNamespace getVariable ["afi_aar2", false]) then { - [{ + if (GVAR(enabled_west)) then { + _time = round (GVAR(wait_time_west) - cba_missiontime); + AAR_UPDATE("west","Next respawn wave", _time); + }; - if (GVAR(enabled_west)) then { - _time = round (GVAR(wait_time_west) - cba_missiontime); - AAR_UPDATE("west","Next respawn wave", _time); - }; + if (GVAR(enabled_east)) then { + _time = round (GVAR(wait_time_east) - cba_missiontime); + AAR_UPDATE("east","Next respawn wave", _time); + }; - if (GVAR(enabled_east)) then { - _time = round (GVAR(wait_time_east) - cba_missiontime); - AAR_UPDATE("east","Next respawn wave", _time); - }; + if (GVAR(enabled_guer)) then { + _time = round (GVAR(wait_time_guer) - cba_missiontime); + AAR_UPDATE("guer","Next respawn wave", _time); + }; - if (GVAR(enabled_guer)) then { - _time = round (GVAR(wait_time_guer) - cba_missiontime); - AAR_UPDATE("guer","Next respawn wave", _time); - }; + if (GVAR(enabled_civ)) then { + _time = round (GVAR(wait_time_civ) - cba_missiontime); + AAR_UPDATE("civ","Next respawn wave", _time); + }; - if (GVAR(enabled_civ)) then { - _time = round (GVAR(wait_time_civ) - cba_missiontime); - AAR_UPDATE("civ","Next respawn wave", _time); - }; - - }, 10] call CBA_fnc_addPerFrameHandler; - }; - }] call CBA_fnc_waitUntilAndExecute; - }; -}; \ No newline at end of file + }, 10] call CBA_fnc_addPerFrameHandler; + }; + }] call CBA_fnc_waitUntilAndExecute; +}; From ffbb1e049e81b89cb0f66eaa970bb26683ed1511 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 11 Jan 2024 22:20:15 +0200 Subject: [PATCH 014/228] Global function for remaining time notification --- addons/msp/functions/fnc_ace_actions.sqf | 9 ++------- .../functions/fnc_addActionsPlayer.sqf | 7 +------ .../fnc_remainingWaitTimeNotification.sqf | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 13 deletions(-) create mode 100644 addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf diff --git a/addons/msp/functions/fnc_ace_actions.sqf b/addons/msp/functions/fnc_ace_actions.sqf index 1a7f6a4..78fa1ea 100644 --- a/addons/msp/functions/fnc_ace_actions.sqf +++ b/addons/msp/functions/fnc_ace_actions.sqf @@ -36,6 +36,7 @@ private _vehicle = switch (playerSide) do { default { "" }; + }; private _actionMain = ["tunres_respawnAction", "Respawn Actions", "\a3\Modules_F_Curator\Data\portraitRespawnTickets_ca.paa", {true}, {true}] call ace_interact_menu_fnc_createAction; @@ -51,14 +52,8 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { private _remove_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide} && {_target getVariable [QGVAR(isMSP), false]} }; _removeMSP = ["Pack MSP", "Pack MSP", "\a3\3den\data\cfgwaypoints\load_ca.paa", {[_target, false] spawn FUNC(initate_msp_action);}, _remove_condition, {}, [], [0, 0, 0], 2, [false, true, false, false, false]] call ace_interact_menu_fnc_createAction; - //remaining time for respawn. - - private _timer_action = { - _wait_time = ((missionNamespace getVariable format ["tunres_Respawn_wait_time_%1", playerSide]) - cba_missiontime); - format ["STR_tunres_MSP_remaining_time" call BIS_fnc_localize, [_wait_time] call CBA_fnc_formatElapsedTime] call CBA_fnc_notify; - }; private _timer_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; - _chekTime = ["Check Respawn Time", "Check Respawn Time", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", _timer_action, _timer_condition] call ace_interact_menu_fnc_createAction; + _chekTime = ["Check Respawn Time", "Check Respawn Time", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", EFUNC(respawn,remainingWaitTimeNotification), _timer_condition] call ace_interact_menu_fnc_createAction; //Ace inteaction [_vehicle, 1, ["ACE_SelfActions"], _createMSP] call ace_interact_menu_fnc_addActionToClass; diff --git a/addons/respawn/functions/fnc_addActionsPlayer.sqf b/addons/respawn/functions/fnc_addActionsPlayer.sqf index cc185e6..ec3c5f2 100644 --- a/addons/respawn/functions/fnc_addActionsPlayer.sqf +++ b/addons/respawn/functions/fnc_addActionsPlayer.sqf @@ -21,13 +21,8 @@ if (GVAR(allowCheckTicketsBase)) then { [_object, true, nil, _actionPath] call FUNC(addCheckTicketCountAction); }; -private _timer_action = { - _wait_time = ((missionNamespace getVariable format ["tunres_Respawn_wait_time_%1", playerSide]) - cba_missiontime); - format ["STR_tunres_MSP_remaining_time" call BIS_fnc_localize, [_wait_time] call CBA_fnc_formatElapsedTime] call CBA_fnc_notify; -}; - //private _timer_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; -private _chekTime = ["Check Respawn Time", "Check Respawn Time", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", _timer_action, {true}] call ace_interact_menu_fnc_createAction; +private _chekTime = ["Check Respawn Time", "Check Respawn Time", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", FUNC(remainingWaitTimeNotification), {true}] call ace_interact_menu_fnc_createAction; [_object, 0, _actionPath, _chekTime] call ace_interact_menu_fnc_addActionToObject; // Add tp action diff --git a/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf b/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf new file mode 100644 index 0000000..340baba --- /dev/null +++ b/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf @@ -0,0 +1,19 @@ +/* + * Author: [Tuntematon] + * [Description] + * + * + * Arguments: + * 0: None + * + * Return Value: + * The return value + * + * Example: + * [] call tunres_respawn_fnc_remainingWaitTimeNotification + */ +#include "script_component.hpp" + +private _hash = GVAR(nextWaveTimes); +private _waitTime = (_hash get playerSide) - cba_missiontime; +format [localize "STR_tunres_MSP_remaining_time", [_waitTime] call CBA_fnc_formatElapsedTime] call CBA_fnc_notify; \ No newline at end of file From 2f8d93cec1e54c9e552e59b4fc4c2b26cc3f763e Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 11 Jan 2024 22:23:18 +0200 Subject: [PATCH 015/228] Update to use hashs --- addons/respawn/XEH_postInit_server.sqf | 14 +-- addons/respawn/XEH_preInit.sqf | 55 ++++------ .../respawn/functions/fnc_briefingNotes.sqf | 19 ++-- .../respawn/functions/fnc_delayed_respawn.sqf | 65 ++--------- addons/respawn/functions/fnc_moveRespawns.sqf | 103 ++++++------------ .../functions/fnc_ticketCounterPlayer.sqf | 4 +- .../functions/fnc_ticketCounterSide.sqf | 5 +- addons/respawn/functions/fnc_timer.sqf | 62 ++++------- .../fnc_updateWaitingRespawnList.sqf | 16 +-- addons/respawn/functions/fnc_waitingArea.sqf | 14 ++- 10 files changed, 120 insertions(+), 237 deletions(-) diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 4ff2f82..4f26cd8 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -15,7 +15,7 @@ if (GVAR(respawn_type) isNotEqualTo localize "STR_tunres_Respawn_Type_Default") params ["_id", "_uid", "_name", "_jip", "_owner"]; if (cba_missiontime > (GVAR(killJIP_time) * 60) && GVAR(killJIP)) then { - GVAR(disconnected_players) pushBackUnique _uid; + GVAR(disconnected_players) set [_uid, true]; }; }]; }; @@ -41,28 +41,28 @@ if ( !isnil "afi_aar2" ) then { if (missionNamespace getVariable ["afi_aar2", false]) then { [{ - + private _hash = GVAR(nextWaveTimes); if (GVAR(enabled_west)) then { - _time = round (GVAR(wait_time_west) - cba_missiontime); + private _time = (_hash get west); AAR_UPDATE("west","Next respawn wave", _time); }; if (GVAR(enabled_east)) then { - _time = round (GVAR(wait_time_east) - cba_missiontime); + private _time = (_hash get east); AAR_UPDATE("east","Next respawn wave", _time); }; if (GVAR(enabled_guer)) then { - _time = round (GVAR(wait_time_guer) - cba_missiontime); + private _time = (_hash get resistance); AAR_UPDATE("guer","Next respawn wave", _time); }; if (GVAR(enabled_civ)) then { - _time = round (GVAR(wait_time_civ) - cba_missiontime); + private _time = (_hash get civilian); AAR_UPDATE("civ","Next respawn wave", _time); }; }, 10] call CBA_fnc_addPerFrameHandler; }; }] call CBA_fnc_waitUntilAndExecute; -}; +}; \ No newline at end of file diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index eba3da4..b8e0466 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -6,34 +6,23 @@ PREP_RECOMPILE_START; PREP_RECOMPILE_END; //Remaining time for wave. -ISNILS(GVAR(wait_time_west),0); -ISNILS(GVAR(wait_time_east),0); -ISNILS(GVAR(wait_time_guer),0); -ISNILS(GVAR(wait_time_civ),0); - -ISNILS(GVAR(totalRespawnCountWest),0); -ISNILS(GVAR(totalRespawnCountEast),0); -ISNILS(GVAR(totalRespawnCountGuer),0); -ISNILS(GVAR(totalRespawnCountCiv),0); - -ISNILS(GVAR(allow_respawn_west),true); -ISNILS(GVAR(allow_respawn_east),true); -ISNILS(GVAR(allow_respawn_guer),true); -ISNILS(GVAR(allow_respawn_civ),true); - -ISNILS(GVAR(waitingRespawnWest),[]); -ISNILS(GVAR(waitingRespawnEast),[]); -ISNILS(GVAR(waitingRespawnGuer),[]); -ISNILS(GVAR(waitingRespawnCiv),[]); - -ISNILS(GVAR(waitingRespawnDelayedWest),[]); -ISNILS(GVAR(waitingRespawnDelayedEast),[]); -ISNILS(GVAR(waitingRespawnDelayedGuer),[]); -ISNILS(GVAR(waitingRespawnDelayedCiv),[]); - -ISNILS(GVAR(disconnected_players),[]); - -ISNILS(GVAR(timer_running),[]); +private _waitTimesPreArray = [[west,0],[east,0],[resistance,0],[civilian,0]]; +GVAR(nextWaveTimes) = createHashMapFromArray _waitTimesPreArray; + +//Respawn wave lenght times +GVAR(waveLenghtTimes) = createHashMap; + +private _waitingRespawnEmptyArray= [[west,[]],[east,[]],[resistance,[]],[civilian,[]]]; +GVAR(waitingRespawnList) = createHashMapFromArray _waitingRespawnEmptyArray; +GVAR(waitingRespawnDelayedList) = createHashMapFromArray _waitingRespawnEmptyArray; + +//Total respawn count (log stuff) +GVAR(totalRespawnCount) = createHashMapFromArray _waitTimesPreArray; + +GVAR(allowRespawn) = createHashMapFromArray _waitingRespawnEmptyArray; + +GVAR(disconnected_players) = createHashMapFromArray _waitingRespawnEmptyArray; +GVAR(timerRunning) = createHashMapFromArray [[west,false],[east,false],[resistance,false],[civilian,false]]; ISNILS(GVAR(teleportPoints),[]); //allowed sides to spectate !WIP! Currentlu forced all @@ -153,7 +142,7 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(time_west) = round _value; + GVAR(waveLenghtTimes) set [west, round _value]; }, true ] call CBA_Settings_fnc_init; @@ -167,7 +156,7 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(time_east) = round _value; + GVAR(waveLenghtTimes) set [east, round _value]; }, true ] call CBA_Settings_fnc_init; @@ -181,7 +170,7 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(time_guer) = round _value; + GVAR(waveLenghtTimes) set [resistance, round _value]; }, true ] call CBA_Settings_fnc_init; @@ -195,7 +184,7 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(time_civ) = round _value; + GVAR(waveLenghtTimes) set [civilian, round _value]; }, true ] call CBA_Settings_fnc_init; @@ -391,4 +380,4 @@ GVAR(selfTPmenuOpenObj) = objNull; true ] call CBA_Settings_fnc_init; -ADDON = true; +ADDON = true; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_briefingNotes.sqf b/addons/respawn/functions/fnc_briefingNotes.sqf index 6ab7f86..e8710a6 100644 --- a/addons/respawn/functions/fnc_briefingNotes.sqf +++ b/addons/respawn/functions/fnc_briefingNotes.sqf @@ -36,32 +36,27 @@ if (GVAR(briefingEnableShowRespawnType)) then { }; if (GVAR(briefingEnableShowTime)) then { + private _waveLenghtTimeHash = GVAR(waveLenghtTimes); _text = format ["%1

Wave interval",_text]; if (playerSide isEqualTo west || GVAR(briefingEnableShowOtherSidesDataWest)) then { - _text = format ["%1
For West is %2min",_text, GVAR(time_west)]; + _text = format ["%1
For West is %2min",_text, _waveLenghtTimeHash get west]; }; if (playerSide isEqualTo east || GVAR(briefingEnableShowOtherSidesDataEast)) then { - _text = format ["%1
For East is %2min",_text, GVAR(time_east)]; + _text = format ["%1
For East is %2min",_text,_waveLenghtTimeHash get east]; }; if (playerSide isEqualTo resistance || GVAR(briefingEnableShowOtherSidesDataResistance)) then { - _text = format ["%1
For Resistance is %2min",_text, GVAR(time_guer)]; + _text = format ["%1
For Resistance is %2min",_text, _waveLenghtTimeHash get resistance]; }; if (playerSide isEqualTo civilian || GVAR(briefingEnableShowOtherSidesDataCivilian)) then { - _text = format ["%1
For Civilian is %2min",_text, GVAR(time_civ)]; + _text = format ["%1
For Civilian is %2min",_text, _waveLenghtTimeHash get civilian]; }; private _delayedRespawn = GVAR(delayed_respawn); if (_delayedRespawn > 0) then { - private _respawnTime = switch (playerSide) do { - case west: { GVAR(time_west) }; - case east: { GVAR(time_west) }; - case resistance: { GVAR(time_west) }; - case civilian: { GVAR(time_west) }; - }; - + private _respawnTime = _waveLenghtTimeHash get playerSide; _respawnTime = _respawnTime * 60; private _delayedTime = [(_respawnTime * (_delayedRespawn / 100)), "M:SS"] call CBA_fnc_formatElapsedTime; _respawnTime = [_respawnTime, "M:SS"] call CBA_fnc_formatElapsedTime; @@ -72,7 +67,7 @@ if (GVAR(briefingEnableShowTime)) then { }; }; -if (GVAR(briefingEnableShowTickets) && { GVAR(briefingEnableShowRespawnType) isNotEqualTo localize "STR_tunres_Respawn_Type_Default"}) then { +if (GVAR(briefingEnableShowTickets) && { GVAR(respawn_type) isNotEqualTo localize "STR_tunres_Respawn_Type_Default"}) then { _text = format ["%1

Tickets",_text]; if (playerSide isEqualTo west || GVAR(briefingEnableShowOtherSidesDataWest)) then { _text = format ["%1
Ticket count: %2 (West)",_text, GVAR(tickets_west)]; diff --git a/addons/respawn/functions/fnc_delayed_respawn.sqf b/addons/respawn/functions/fnc_delayed_respawn.sqf index 3c4c9b3..b3dacc9 100644 --- a/addons/respawn/functions/fnc_delayed_respawn.sqf +++ b/addons/respawn/functions/fnc_delayed_respawn.sqf @@ -15,65 +15,24 @@ #include "script_component.hpp" params ["_unit", "_side"]; -_skip = false; +private _skip = false; if (GVAR(delayed_respawn) > 0) then { - - private ["_time", "_waittime"]; - - switch (_side) do { - - case west: { - _time = GVAR(wait_time_west); - _waittime = GVAR(time_west); - }; - case east: { - _time = GVAR(wait_time_east); - _waittime = GVAR(time_east); - }; - - case resistance: { - _time = GVAR(wait_time_guer); - _waittime = GVAR(time_guer); - }; - - case civilian: { - _time = GVAR(wait_time_civ); - _waittime = GVAR(time_civ); - }; - - default { - ERROR_MSG("Delayed respawn got no side"); - }; - }; - - _skip = ((_time - cba_missiontime) < ((_waittime * 60) * (GVAR(delayed_respawn) / 100))); + private _hashWaitTime = GVAR(nextWaveTimes); + private _hashWaveLenght = GVAR(waveLenghtTimes); + private _time = _hashWaitTime get _side; + private _waveLenghtTime = _hashWaveLenght get _side; + _skip = ((_time - cba_missiontime) < ((_waveLenghtTime * 60) * (GVAR(delayed_respawn) / 100))); }; _unit setVariable [QGVAR(skip_next_wave), _skip, true]; if (_skip) then { - switch (_side) do { - case west: { - PUSH(GVAR(waitingRespawnDelayedWest),_unit); - FILTER(GVAR(waitingRespawnDelayedWest),(!isnull _x && _x in allPlayers && alive _x )); - publicVariable QGVAR(waitingRespawnDelayedWest); - }; - case east: { - PUSH(GVAR(waitingRespawnDelayedEast),_unit); - FILTER(GVAR(waitingRespawnDelayedEast),(!isnull _x && _x in allPlayers && alive _x )); - publicVariable QGVAR(waitingRespawnDelayedEast); - }; - case resistance: { - PUSH(GVAR(waitingRespawnDelayedGuer),_unit); - FILTER(GVAR(waitingRespawnDelayedGuer),(!isnull _x && _x in allPlayers && alive _x )); - publicVariable QGVAR(waitingRespawnDelayedGuer); - }; - case civilian: { - PUSH(GVAR(waitingRespawnDelayedCiv),_unit); - FILTER(GVAR(waitingRespawnDelayedCiv),(!isnull _x && _x in allPlayers && alive _x )); - publicVariable QGVAR(waitingRespawnDelayedCiv); - }; - }; + private _waitingRespawnDelayedHash = GVAR(waitingRespawnDelayedList); + private _waitingRespawnDelayed = _waitingRespawnDelayedHash get _side; + PUSH(_waitingRespawnDelayed,_unit); + FILTER(_waitingRespawnDelayed,(!isnull _x && _x in allPlayers && alive _x )); + _waitingRespawnDelayed set [_side, _waitingRespawnDelayed]; + publicVariable QGVAR(waitingRespawnDelayedList); }; _skip \ No newline at end of file diff --git a/addons/respawn/functions/fnc_moveRespawns.sqf b/addons/respawn/functions/fnc_moveRespawns.sqf index e1c2176..3096fac 100644 --- a/addons/respawn/functions/fnc_moveRespawns.sqf +++ b/addons/respawn/functions/fnc_moveRespawns.sqf @@ -13,65 +13,28 @@ * ["side"] call tunres_Respawn_fnc_moveRespawns */ #include "script_component.hpp" -params ["_side", ["_forceAll", false, [false]]]; +params [["_side", nil, [west]], ["_forceAll", false, [false]]]; private ["_respawn_waitingarea", "_respawn_gearPath"]; if (!isServer) exitWith { }; -private _waitingRespawnDelayedInRespawn = []; -private _totalRespawnCount = 0; -private _unitListVarName = ""; -private _delayedUnitListVarName = ""; -private _hash = GVAR(respawnPointsHash); -private _respawn_position = getMarkerPos ((_hash get _side) select 0); -switch (_side) do { - case west: { - _respawn_waitingarea = getpos (GVAR(waitingarea_west) select 1); - _waitingRespawnDelayedInRespawn = GVAR(waitingRespawnWest); - _totalRespawnCount = GVAR(totalRespawnCountWest); - _unitListVarName = QGVAR(waitingRespawnWest); - _delayedUnitListVarName = QGVAR(waitingRespawnDelayedWest); - }; - - case east: { - _respawn_waitingarea = getpos (GVAR(waitingarea_east) select 1); - _totalRespawnCount = GVAR(totalRespawnCountEast); - _unitListVarName = QGVAR(waitingRespawnEast); - _delayedUnitListVarName = QGVAR(waitingRespawnDelayedEast); - }; - - case resistance: { - _respawn_waitingarea = getpos (GVAR(waitingarea_guer) select 1); - _totalRespawnCount = GVAR(totalRespawnCountGuer); - _unitListVarName = QGVAR(waitingRespawnGuer); - _delayedUnitListVarName = QGVAR(waitingRespawnDelayedGuer); - }; +private _totalRespawnCountHash = GVAR(totalRespawnCount); +private _totalRespawnCount = _totalRespawnCountHash get _side; +private _respawnPointsHash= GVAR(respawnPointsHash); +private _respawn_position = getMarkerPos ((_respawnPointsHash get _side) select 0); +private _waitingRespawnHash = GVAR(waitingRespawnList); +private _waitingRespawnDelayedHash = GVAR(waitingRespawnDelayedList); +private _waitingRespawn = _waitingRespawnHash get _side; +private _waitingRespawnDelayed = _waitingRespawnDelayedHash get _side; - case civilian: { - _respawn_waitingarea = getpos (GVAR(waitingarea_civ) select 1); - _totalRespawnCount = GVAR(totalRespawnCountCiv); - _unitListVarName = QGVAR(waitingRespawnCiv); - _delayedUnitListVarName = QGVAR(waitingRespawnDelayedCiv); - }; - - default { - ERROR_MSG("Move respawn FNC missing side param!"); - }; -}; - - - -private _waitingRespawn = missionNamespace getVariable _unitListVarName; -private _waitingRespawnDelayed = missionNamespace getVariable _delayedUnitListVarName; if (count _waitingRespawn > 0 || count _waitingRespawnDelayed > 0) then { + + //Filter ghost units out FILTER(_waitingRespawn,(!isnull _x && _x in allPlayers && alive _x )); FILTER(_waitingRespawnDelayed,(!isnull _x && _x in allPlayers && alive _x )); - missionNamespace setVariable [_unitListVarName, _waitingRespawn, false]; - missionNamespace setVariable [_delayedUnitListVarName, _waitingRespawnDelayed, false]; - //Sort out delayed respawn play + //If forced all, clears delayed respawn if (_forceAll) then { - { private _unit = _x; if (_unit getVariable [QGVAR(skip_next_wave), false]) then { @@ -79,34 +42,43 @@ if (count _waitingRespawn > 0 || count _waitingRespawnDelayed > 0) then { PUSH(_waitingRespawn,_unit); }; } forEach _waitingRespawnDelayed; - missionNamespace setVariable [_unitListVarName, _waitingRespawn, true]; - missionNamespace setVariable [_delayedUnitListVarName, [], true]; + _waitingRespawnDelayed = []; }; + + _waitingRespawnHash set [_side, _waitingRespawn]; + _waitingRespawnDelayedHash set [_side, _waitingRespawnDelayed]; }; + if (count _waitingRespawn > 0) then { //move [{ - _args params ["_respawn_waitingarea", "_respawn_position", "_side", "_unitListVarName", "_delayedUnitListVarName"]; + _args params ["_respawn_position", "_side"]; + private _waitingRespawnHash = GVAR(waitingRespawnList); + private _unitList = _waitingRespawnHash get _side; - private _unitList = (missionNamespace getVariable _unitListVarName); //when done, remove and move delayed units to main var if ((count _unitList) isEqualTo 0) exitWith { [_handle] call CBA_fnc_removePerFrameHandler; - private _waitingRespawnDelayed = missionNamespace getVariable _delayedUnitListVarName; + private _waitingRespawnDelayedHash = GVAR(waitingRespawnDelayedList); + private _waitingRespawnDelayed = _waitingRespawnDelayedHash get _side; { private _unit = _x; _unit setVariable [QGVAR(skip_next_wave), false, true]; } forEach _waitingRespawnDelayed; - missionNamespace setVariable [_unitListVarName, _waitingRespawnDelayed, true]; - missionNamespace setVariable [_delayedUnitListVarName, [], true]; + + _waitingRespawnHash set [_side, _waitingRespawnDelayed]; + _waitingRespawnDelayedHash set [_side, []]; + + publicVariable QGVAR(waitingRespawnList); + publicVariable QGVAR(waitingRespawnDelayedList); }; private _unit = _unitList select 0; _unitList deleteAt 0; if (isnull _unit || !(_unit in allPlayers) || !alive _unit ) exitWith { - missionNamespace setVariable [_unitListVarName, _unitList, false]; + _waitingRespawnHash set [_side, _unitList]; }; _unit setVariable [QGVAR(waiting_respawn), false, true]; @@ -114,31 +86,28 @@ if (count _waitingRespawn > 0) then { [_unit, _respawn_position, _text, 20] call FUNC(teleport); remoteExecCall [QFUNC(addGear), _unit]; [QGVAR(EH_unitRespawned), [_unit], _unit] call CBA_fnc_localEvent; - }, 0.2, [_respawn_waitingarea, _respawn_position, _side, _unitListVarName, _delayedUnitListVarName]] call CBA_fnc_addPerFrameHandler; + }, 0.2, [_respawn_position, _side]] call CBA_fnc_addPerFrameHandler; private _waitingRespawnCount = count _waitingRespawn; _totalRespawnCount = _totalRespawnCount + _waitingRespawnCount; - switch (_side) do { - case west: { missionNamespace setVariable [QGVAR(totalRespawnCountWest), _totalRespawnCount, true]; }; - case east: { missionNamespace setVariable [QGVAR(totalRespawnCountEast), _totalRespawnCount, true]; }; - case resistance: { missionNamespace setVariable [QGVAR(totalRespawnCountGuer), _totalRespawnCount, true]; }; - case civilian: { missionNamespace setVariable [QGVAR(totalRespawnCountCiv), _totalRespawnCount, true]; }; - }; + _totalRespawnCountHash set [_side, _totalRespawnCount]; private _debugText = format ["Side %1 all respawn units moved. Respawned: %2. Total count is: %3", _side, _waitingRespawnCount, _totalRespawnCount]; INFO(_debugText); [QGVAR(EH_moveRespawns), [_side, _waitingRespawn]] call CBA_fnc_serverEvent; } else { - private _waitingRespawnDelayed = missionNamespace getVariable _delayedUnitListVarName; + //No one at respawn if (count _waitingRespawnDelayed > 0) then { { private _unit = _x; _unit setVariable [QGVAR(skip_next_wave), false, true]; } forEach _waitingRespawnDelayed; - missionNamespace setVariable [_unitListVarName, _waitingRespawnDelayed, true]; - missionNamespace setVariable [_delayedUnitListVarName, [], true]; + _waitingRespawnHash set [_side, _waitingRespawnDelayed]; + _waitingRespawnDelayedHash set [_side, []]; + publicVariable QGVAR(waitingRespawnList); + publicVariable QGVAR(waitingRespawnDelayedList); }; }; diff --git a/addons/respawn/functions/fnc_ticketCounterPlayer.sqf b/addons/respawn/functions/fnc_ticketCounterPlayer.sqf index 8fe7627..63801a2 100644 --- a/addons/respawn/functions/fnc_ticketCounterPlayer.sqf +++ b/addons/respawn/functions/fnc_ticketCounterPlayer.sqf @@ -23,8 +23,8 @@ private _remainingTickets = [_side, _player, false] call FUNC(getTicketCountPlay if ( _remainingTickets > 0 ) then { //if player disconnected and came back. So no ticket wasted. - if (_playerUID in GVAR(disconnected_players)) then { - REM(GVAR(disconnected_players), _playerUID); + if (GVAR(disconnected_players) getOrDefault [_playerUID, false]) then { + GVAR(disconnected_players) set [_uid, false]; } else { DEC(_remainingTickets); AAR_UPDATE(_player,"Player tickets", _remainingTickets); diff --git a/addons/respawn/functions/fnc_ticketCounterSide.sqf b/addons/respawn/functions/fnc_ticketCounterSide.sqf index 21f20d8..7e19257 100644 --- a/addons/respawn/functions/fnc_ticketCounterSide.sqf +++ b/addons/respawn/functions/fnc_ticketCounterSide.sqf @@ -16,10 +16,11 @@ #include "script_component.hpp" params ["_side","_player"]; if (!isServer) exitWith { }; +private _playerUID = getPlayerUID _player; //if player disconnected and came back. So no ticket wasted. -if (getPlayerUID _player in GVAR(disconnected_players)) exitWith { - REM(GVAR(disconnected_players), (getPlayerUID _player)); +if (GVAR(disconnected_players) getOrDefault [_playerUID, false]) then { + GVAR(disconnected_players) set [_uid, false]; [5] remoteExecCall ["setPlayerRespawnTime", _player]; }; diff --git a/addons/respawn/functions/fnc_timer.sqf b/addons/respawn/functions/fnc_timer.sqf index da23fa4..44e4668 100644 --- a/addons/respawn/functions/fnc_timer.sqf +++ b/addons/respawn/functions/fnc_timer.sqf @@ -10,58 +10,34 @@ * None * * Example: - * ["west"] call tunres_Respawn_fnc_timer + * [west] call tunres_Respawn_fnc_timer */ #include "script_component.hpp" -params ["_side"]; +params [["_side", nil, [west]]]; + if (!isServer) exitWith { }; if (GVAR(forced_respawn)) exitWith { INFO("No timer, Only forced waves"); }; -private ["_wait_time_var", "_allow_respawn_var"]; - -switch (_side) do { - case west: { - GVAR(wait_time_west) = GVAR(wait_time_west) + GVAR(time_west) * 60; - _wait_time_var = QGVAR(wait_time_west); - _allow_respawn_var = QGVAR(allow_respawn_west); - publicVariable QGVAR(wait_time_west); - }; - - case east: { - GVAR(wait_time_east) = GVAR(wait_time_east) + GVAR(time_east) * 60; - _wait_time_var = QGVAR(wait_time_east); - _allow_respawn_var = QGVAR(allow_respawn_east); - publicVariable QGVAR(wait_time_east); - }; - case resistance: { - GVAR(wait_time_guer) = GVAR(wait_time_guer) + GVAR(time_guer) * 60; - _wait_time_var = QGVAR(wait_time_guer); - _allow_respawn_var = QGVAR(allow_respawn_guer); - publicVariable QGVAR(wait_time_guer); - }; +private _hashWaitTime = GVAR(nextWaveTimes); +private _hashWaveLenght = GVAR(waveLenghtTimes); +private _time = (_hashWaitTime get _side) + (_hashWaveLenght get _side) * 60; - case civilian: { - GVAR(wait_time_civ) = GVAR(wait_time_civ) + GVAR(time_civ) * 60; - _wait_time_var = QGVAR(wait_time_civ); - _allow_respawn_var = QGVAR(allow_respawn_civ); - publicVariable QGVAR(wait_time_civ); - }; +_hashWaitTime set [_side, _time]; - default { - ERROR_MSG("respawn timer FNC missing side param!"); - }; -}; - -if !( _side in GVAR(timer_running) ) then { - GVAR(timer_running) pushBack _side; - [{ missionNamespace getVariable (_this select 2) && { cba_missiontime >= missionNamespace getVariable (_this select 1) } }, { - if (tunres_MSP_enable) then { - [] call tunres_MSP_fnc_contestedCheck; +if ( GVAR(timerRunning) getOrDefault [_side, false]) then { + GVAR(timerRunning) set [_side, true]; + [{ _this params["_side"]; + GVAR(allowRespawn) get _side && + { cba_missiontime >= GVAR(nextWaveTimes) get _side } + }, { + _this params["_side"]; + if (EGVAR(msp,enable)) then { + [] call EFUNC(msp,contestedCheck); }; - private _side = _this select 0; - REM(GVAR(timer_running), _side); + + GVAR(timerRunning) set [_side, false]; [_side] call FUNC(moveRespawns); [_side] call FUNC(timer); - }, [_side, _wait_time_var, _allow_respawn_var]] call CBA_fnc_waitUntilAndExecute; + }, [_side]] call CBA_fnc_waitUntilAndExecute; }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf index 6b57914..ce749f6 100644 --- a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf +++ b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf @@ -18,12 +18,8 @@ params [["_player", nil, [objNull]], ["_addPlayer", nil, [false]], ["_side", nil private _skip = [_player, _side] call FUNC(delayed_respawn); if !(_skip) then { - private _unitList = switch (_side) do { - case west: { GVAR(waitingRespawnWest) }; - case east: { GVAR(waitingRespawnEast) }; - case resistance: { GVAR(waitingRespawnGuer) }; - case civilian: { GVAR(waitingRespawnCiv) }; - }; + private _waitingRespawnHash = GVAR(waitingRespawnList); + private _unitList = _waitingRespawnHash get _side; FILTER(_unitList,(!isnull _x && _x in allPlayers && alive _x )); @@ -33,10 +29,6 @@ if !(_skip) then { _unitList deleteAt (_unitList find _player); }; - switch (_side) do { - case west: { missionNamespace setVariable [QGVAR(waitingRespawnWest), _unitList, true]; }; - case east: { missionNamespace setVariable [QGVAR(waitingRespawnEast), _unitList, true]; }; - case resistance: { missionNamespace setVariable [QGVAR(waitingRespawnGuer), _unitList, true]; }; - case civilian: { missionNamespace setVariable [QGVAR(waitingRespawnCiv), _unitList, true]; }; - }; + _waitingRespawnHash set [_side, _unitList]; + publicVariable QGVAR(waitingRespawnList); }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 589db40..f983ffc 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -44,19 +44,21 @@ switch (playerSide) do { if !( player getvariable QGVAR(waiting_respawn) ) exitWith { [_handle] call CBA_fnc_removePerFrameHandler; }; //Show remaining time - private _respawn_time = (missionNamespace getVariable format ["%1_%2", QGVAR(wait_time), playerSide]); - private _wait_time = round (_respawn_time - cba_missiontime); + private _hashWaitTime = GVAR(nextWaveTimes); + private _waitTime = _hashWaitTime get playerSide; + private _remainingWaitTime = round (_waitTime - cba_missiontime); if (player getVariable [QGVAR(skip_next_wave), false]) then { - private _wave_time = (missionNamespace getVariable format ["%1%2", QGVAR(time_), playerSide]) * 60; - _wait_time = _wait_time + _wave_time; + private _hashWaveLenght = GVAR(waveLenghtTimes); + private _waveLenght = _hashWaveLenght get playerSide; + _remainingWaitTime = _remainingWaitTime + _waveLenght; }; private _text = format ["%1", "STR_tunres_Respawn_FNC_only_forced_waves" call BIS_fnc_localize]; - if (_wait_time >= 0 && { (missionNamespace getVariable [format ["%1_%2", QGVAR(allow_respawn), playerSide], true]) }) then { - _text = format ["%2
%1
", ([_wait_time] call CBA_fnc_formatElapsedTime), "STR_tunres_Respawn_FNC_remaining_time" call BIS_fnc_localize]; + if (_remainingWaitTime >= 0 && { (missionNamespace getVariable [format ["%1_%2", QGVAR(allow_respawn), playerSide], true]) }) then { + _text = format ["%2
%1
", ([_remainingWaitTime] call CBA_fnc_formatElapsedTime), "STR_tunres_Respawn_FNC_remaining_time" call BIS_fnc_localize]; } else { if (player getvariable [QGVAR(waiting_respawn), true] && { !(GVAR(forced_respawn)) }) then { _text = format ["%1", "STR_tunres_Respawn_FNC_RespawnDisabled" call BIS_fnc_localize]; From f4631052ccb24457bd2e4e6df7a638595e2b5b25 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 11 Jan 2024 22:23:25 +0200 Subject: [PATCH 016/228] misc --- addons/respawn/XEH_PREP.hpp | 5 +++-- addons/respawn/XEH_preStart.sqf | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/respawn/XEH_PREP.hpp b/addons/respawn/XEH_PREP.hpp index 12bf03c..4422ceb 100644 --- a/addons/respawn/XEH_PREP.hpp +++ b/addons/respawn/XEH_PREP.hpp @@ -5,6 +5,7 @@ PREP(addGear); PREP(addMainAction); PREP(addTeleportAction); PREP(blackscreen); +PREP(briefingNotes); PREP(checkTicketCount); PREP(createLocalMarker); PREP(delayed_respawn); @@ -21,6 +22,7 @@ PREP(module_waitingarea); PREP(moveRespawns); PREP(openTeleportMenu); PREP(radioSettings_tfar); +PREP(remainingWaitTimeNotification); PREP(removegear); PREP(savegear); PREP(startSpectator); @@ -33,5 +35,4 @@ PREP(timer); PREP(update_respawn_point); PREP(updatePlayerTicketCount); PREP(updateWaitingRespawnList); -PREP(waitingArea); -PREP(briefingNotes); \ No newline at end of file +PREP(waitingArea); \ No newline at end of file diff --git a/addons/respawn/XEH_preStart.sqf b/addons/respawn/XEH_preStart.sqf index a51262a..7dca066 100644 --- a/addons/respawn/XEH_preStart.sqf +++ b/addons/respawn/XEH_preStart.sqf @@ -1,2 +1,2 @@ #include "script_component.hpp" -#include "XEH_PREP.hpp" +#include "XEH_PREP.hpp" \ No newline at end of file From ca18d065a26f10391ec6f8707aec3863dc444cf9 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 11 Jan 2024 22:24:59 +0200 Subject: [PATCH 017/228] add wait so cba settings are added --- .../functions/fnc_module_waitingarea.sqf | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/addons/respawn/functions/fnc_module_waitingarea.sqf b/addons/respawn/functions/fnc_module_waitingarea.sqf index ee5d4df..3b49005 100644 --- a/addons/respawn/functions/fnc_module_waitingarea.sqf +++ b/addons/respawn/functions/fnc_module_waitingarea.sqf @@ -41,30 +41,39 @@ switch (_markername) do { missionNamespace setVariable [QGVAR(waitingarea_west), [_markername, _logic, _pos], true]; GVAR(flag_west) = "Flag_Blue_F" createVehicle _pos; - [west] call FUNC(timer); + [{ADDON}, { + [west] call FUNC(timer); + }] call CBA_fnc_waitUntilAndExecute; }; case "respawn_east": { missionNamespace setVariable [QGVAR(waitingarea_east), [_markername, _logic, _pos], true]; GVAR(flag_east) = "Flag_Red_F" createVehicle _pos; - [east] call FUNC(timer); + [{ADDON}, { + [east] call FUNC(timer); + }] call CBA_fnc_waitUntilAndExecute; }; case "respawn_guerrila": { missionNamespace setVariable [QGVAR(waitingarea_guer), [_markername, _logic, _pos], true]; GVAR(flag_guerrila) = "Flag_Green_F" createVehicle _pos; - [resistance] call FUNC(timer); + [{ADDON}, { + [resistance] call FUNC(timer); + }] call CBA_fnc_waitUntilAndExecute; }; case "respawn_civilian": { missionNamespace setVariable [QGVAR(waitingarea_civ), [_markername, _logic, _pos], true]; GVAR(flag_civilian) = "Flag_White_F" createVehicle _pos; - [civilian] call FUNC(timer); + [{ADDON}, { + [civilian] call FUNC(timer); + }] call CBA_fnc_waitUntilAndExecute; }; }; // Module function is executed by spawn command, so returned value is not necessary, but it's good practice. -true \ No newline at end of file +true + From d0e8a1f061959effd2dc1f522fad831f66f996e8 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 11 Jan 2024 22:30:01 +0200 Subject: [PATCH 018/228] stringtable fix --- addons/main/Stringtable.xml | 1132 +++++++++++++++++------------------ 1 file changed, 565 insertions(+), 567 deletions(-) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index 226f0b7..02918da 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -1,569 +1,567 @@ - - - - Time between respawn waves (minutes) - Time between respawn waves (minutes) - - - Time after JIP are killed and moved to respawn (minutes) - Time after JIP are killed and moved to respawn (minutes) - - - Enable kill JIP system - Enable kill JIP system - - - Ticket count for either for whole side or each player in that side. - Ticket count for either for whole side or each player in that side. - - - "SQF Gearscript": Needs two variables set "tunres_Respawn_Role" which works as parameter and "tunres_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using tunres_Respawn_fnc_savegear function. - "SQF Gearscript": Needs two variables set "tunres_Respawn_Role" which works as parameter and "tunres_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using tunres_Respawn_fnc_savegear function. - - - "Default" : Endless waves. "Side tickets": Side shares ticket pool. . "Player tickets": Each player has own ticket pool - "Default" : Endless waves. "Side tickets": Side shares ticket pool. . "Player tickets": Each player has own ticket pool - - - Enable this cameramode for spectators - Enable this cameramode for spectators - - - TUN - Respawn System - TUN - Respawn System - - - Briefing notes - Briefing notes - - - Wave times - Wave times - - - Check tickets - Check tickets - - - Spectator camera modes - Spectator camera modes - - - Tickets - Tickets - - - Main Settings - Main Settings - - - Enable Respawn System - Enable Respawn System - - - Enable Respawn System for mission. - Enable Respawn System for mission. - - - Allow checking remaining tickets from this place - Allow checking remaining tickets from this place - - - Only forced respawn waves. No timer! - Only forced respawn waves. No timer! - - - If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. - If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. - - - Range for waitingarea. Default 100m - Range for waitingarea. Default 100m - - - - - You are respawning! Standby. - You are respawning! Standby. - - - Remaining time until respawn - Remaining time until respawn - - - Respawn is currently disabled. - Respawn is currently disabled. - - - Mission is using only forced waves. - Mission is using only forced waves. - - - Remaining ticket count is: - Remaining ticket count is: - - - Check remaining tickets - Check remaining tickets - - - - - You are being teleported to: - You are being teleported to: - - - This teleport point is disabled - This teleport point is disabled - - - Open teleportmenu - Open teleportmenu - - - <t color='#FF0000'>Open teleportmenu</t> - <t color='#FF0000'>Open teleportmenu</t> - - - Main Base - Main Base - - - - - Put this module where you want respawn point to be for this side. - Put this module where you want respawn point to be for this side. - - - Spawn Point - Spawn Point - - - Choose side for this spawn point - Choose side for this spawn point - - - Tun Respawn - Tun Respawn - - - Respawn Position module do not have side set - Respawn Position module do not have side set - - - There is already "%1" marker. You either have multiple respawn point modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple respawn point modules with same settings or marker named that. Either way, remove it. - - - - - Teleport point - Teleport point - - - Teleport network point. - Teleport network point. - - - Marker icon, must be in non string format. Default: hd_start - Marker icon, must be in non string format. Default: hd_start - - - Create marker for this teleport, for enabled sides. - Create marker for this teleport, for enabled sides. - - - When enabled, will use ace interaction. Otherwise will use addaction. - When enabled, will use ace interaction. Otherwise will use addaction. - - - Name for teleport location - Name for teleport location - - - Condition to enable/disable opening teleport menu. Must return true or flase. Default: true - Condition to enable/disable opening teleport menu. Must return true or flase. Default: true - - - Conditio to enable/disable TP location. (Code) Default: True - Conditio to enable/disable TP location. (Code) Default: True - - - Is this side allowed to use this teleportter. - Is this side allowed to use this teleportter. - - - Classname for object where action to teleport is. Non string format: Land_Sleeping_bag_blue_folded_F - Classname for object where action to teleport is. Non string format: Land_Sleeping_bag_blue_folded_F - - - - - There is already "%1" marker. You either have multiple Waiting Area modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple Waiting Area modules with same settings or marker named that. Either way, remove it. - - - Waiting area module do not have side set - Waiting area module do not have side set - - - Respawn Waiting Area - Respawn Waiting Area - - - Put this module where you want respawn waiting area to be for this side. - Put this module where you want respawn waiting area to be for this side. - - - Choose side for this waiting area - Choose side for this waiting area - - - - - Teleport network - Teleport network - - - Teleport - Teleport - - - - - Show tickets - Show tickets - - - Enable briefing notes - Enable briefing notes - - - Create briefing tab where all these settings are show. - Create briefing tab where all these settings are show. - - - Show respawn type - Show respawn type - - - Show respawn wave time - Show respawn wave time - - - When enabled, wave interval time will be shown in briefing notes. - When enabled, wave interval time will be shown in briefing notes. - - - When enabled, starting ticket count will be shown in briefing notes. - When enabled, starting ticket count will be shown in briefing notes. - - - When enabled, respawn type will be shown in briefing notes. - When enabled, respawn type will be shown in briefing notes. - - - Show this side for all. Own side is aways shown, if show tickets is enabled. Also it that is disabled, none of the sides tickets are shown. - Show this side for all. Own side is aways shown, if show tickets is enabled. Also it that is disabled, none of the sides tickets are shown. - - - Show west data to all - Show west data to all - - - Show east data to all - Show east data to all - - - Show resistance data to all - Show resistance data to all - - - Show civilian data to all - Show civilian data to all - - - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - - - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - - - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each player</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each player</font>. - - - Mission uses only forced respawn waves. So no respawn timer. - Mission uses only forced respawn waves. So no respawn timer. - - - %1<br/><br/>JIP players will be killed and move to respawn after <font face='PuristaBold' size='14'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. - %1<br/><br/>JIP players will be killed and move to respawn after <font face='PuristaBold' size='14'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. - - - JIP players are not killed and moved to respawn when they join game. - JIP players are not killed and moved to respawn when they join game. - - - %1<br/><br/>When MSP has been deployed, it will report enemies every <font face='PuristaBold' size='14'>%2s</font>, if there is any inside <font face='PuristaBold' size='14'>%3</font> meter radius. - %1<br/><br/>When MSP has been deployed, it will report enemies every <font face='PuristaBold' size='14'>%2s</font>, if there is any inside <font face='PuristaBold' size='14'>%3</font> meter radius. - - - Reporting enemies near MSP is disabled. - Reporting enemies near MSP is disabled. - - - %1<br/><br/>MSP contested status is updated every <font face='PuristaBold' size='14'>%2s</font>.<br/>It will get contested if there is more enemis inside <font face='PuristaBold' size='14'>%3m</font> radius or even one enemy is <font face='PuristaBold' size='14'>%4m</font> away from it. - %1<br/><br/>MSP contested status is updated every <font face='PuristaBold' size='14'>%2s</font>.<br/>It will get contested if there is more enemis inside <font face='PuristaBold' size='14'>%3m</font> radius or even one enemy is <font face='PuristaBold' size='14'>%4m</font> away from it. - - - %1<br/><br/>MSP vehicle is <font face='PuristaBold' size='14'>%2</font> - %1<br/><br/>MSP vehicle is <font face='PuristaBold' size='14'>%2</font> - - - %1<br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn on.</font> <br/>If there is <font face='PuristaBold' size='14'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font face='PuristaBold' size='14'>you will skip it.</font> - %1<br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn on.</font> <br/>If there is <font face='PuristaBold' size='14'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font face='PuristaBold' size='14'>you will skip it.</font> - - - <br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn off.</font> - <br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn off.</font> - - - Mobile Spawn Point (MSP) has been <font face='PuristaBold' size='14'>enabled</font> to this mission for your side. - Mobile Spawn Point (MSP) has been <font face='PuristaBold' size='14'>enabled</font> to this mission for your side. - - - Mobile Spawn Point (MSP) has been enabled for this mission, but <font face='PuristaBold' size='14'>your side does not have MSP.</font> - Mobile Spawn Point (MSP) has been enabled for this mission, but <font face='PuristaBold' size='14'>your side does not have MSP.</font> - - - <br/><br/>If there is MSP or custom teleport points in this mission, you can accses teleport menu always from Main Base and uncontested MSP using ace action menu. Custom teleport points might have different conditions and uses either vanilla action menu or ace action menu. - <br/><br/>If there is MSP or custom teleport points in this mission, you can accses teleport menu always from Main Base and uncontested MSP using ace action menu. Custom teleport points might have different conditions and uses either vanilla action menu or ace action menu. - - - - - Default - Default - - - Side tickets - Side tickets - - - Player tickets - Player tickets - - - - - - - TUN - Mobile Spawn Point - TUN - Mobile Spawn Point - - - Progress Bar - Progress Bar - - - Time that it takes to setup MSP (seconds) - Setup Time - - - Packing Time - Packing Time - - - Setup Time - Setup Time - - - Time that it takes to deploy MSP (seconds) - Time that it takes to deploy MSP (seconds) - - - Time that it takes to pack MSP (seconds) - Time that it takes to pack MSP (seconds) - - - Enable MSP - Enable MSP - - - Check tickets from msp - Check tickets from msp - - - Enable MSP system - Enable MSP system - - - - - Setting up MSP - Setting up MSP - - - Packing MSP - Packing MSP - - - - - [['MSP has been contested!'], ['Respawn position has been updated.']] - [['MSP has been contested!'], ['Respawn position has been updated.']] - - - [['MSP has been secured!'], ['Respawn position has been updated.']] - [['MSP has been secured!'], ['Respawn position has been updated.']] - - - Enemies spotted near MSP! - Enemies spotted near MSP! - - - - - [['MSP has been deployed!'], ['Respawn position has been updated.']] - [['MSP has been deployed!'], ['Respawn position has been updated.']] - - - [['MSP has been packed!'], ['Respawn position has been updated.']] - [['MSP has been packed!'], ['Respawn position has been updated.']] - - - - - MSP Classname - MSP Classname - - - West MSP Classname - West MSP Classname - - - East MSP Classname - East MSP Classname - - - Resistance MSP Classname - Resistance MSP Classname - - - Civilian MSP Classname - Civilian MSP Classname - - - Put vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use non-string version of classname like: B_MRAP_01_F. Only one type of vehicle is supported currently - Put vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use non-string version of classname like: B_MRAP_01_F. Only one type of vehicle is supported currently - - - - - When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) - When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) - - - Interval for when server updates the contested status for MSP - Interval for when server updates the contested status for MSP - - - Radius where there needs to be more enemies than allies to disable MSP (meters) - Radius where there needs to be more enemies than allies to disable MSP (meters) - - - Min Contested Radius - Min Contested Radius - - - Max Contested Radius - Max Contested Radius - - - Contested Check Interval - Contested Check Interval - - - Contested - Contested - - - - - Range from MSP where enemies are reported (meters) - Range from MSP where enemies are reported (meters) - - - Interval when server check if there is enemies near MSP - Interval when server check if there is enemies near MSP - - - %1<br/><br/>Enable Report Enemies near MSP - %1<br/><br/>Enable Report Enemies near MSP - - - Report Enemies Interval - Report Enemies Interval - - - Report Enemies Range - Report Enemies Range - - - Report Enemies - Report Enemies - - - - - Mobile spawn point - Mobile spawn point - - - MSP has been destroyed! - MSP has been destroyed! - - - - - Remaining time until respawn: %1 - Remaining time until respawn: %1 - - - - - Who gets notification from MSP setup/pack? - Who gets notification from MSP setup/pack? - - - Who gets notification when MSP contested? - Who gets notification when MSP contested? - - - Who gets notification when there is enemies near MSP? - Who gets notification when there is enemies near MSP? - - - When MSP is setup or packed up, who whil recive notification from it. Default: Group Leader - When MSP is setup or packed up, who whil recive notification from it. Default: Group Leader - - - When MSP is contested, who whil recive notification from it. Default: Group Leader - When MSP is contested, who whil recive notification from it. Default: Group Leader - - - When there is enemies near MSP, who whil recive notification from it. Default: Group Leader - When there is enemies near MSP, who whil recive notification from it. Default: Group Leader - - - Notifications - Notifications - - - - \ No newline at end of file + + + + Time between respawn waves (minutes) + Time between respawn waves (minutes) + + + Time after JIP are killed and moved to respawn (minutes) + Time after JIP are killed and moved to respawn (minutes) + + + Enable kill JIP system + Enable kill JIP system + + + Ticket count for either for whole side or each player in that side. + Ticket count for either for whole side or each player in that side. + + + "SQF Gearscript": Needs two variables set "tunres_Respawn_Role" which works as parameter and "tunres_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using tunres_Respawn_fnc_savegear function. + "SQF Gearscript": Needs two variables set "tunres_Respawn_Role" which works as parameter and "tunres_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using tunres_Respawn_fnc_savegear function. + + + "Default" : Endless waves. "Side tickets": Side shares ticket pool. . "Player tickets": Each player has own ticket pool + "Default" : Endless waves. "Side tickets": Side shares ticket pool. . "Player tickets": Each player has own ticket pool + + + Enable this cameramode for spectators + Enable this cameramode for spectators + + + TUN - Respawn System + TUN - Respawn System + + + Briefing notes + Briefing notes + + + Wave times + Wave times + + + Check tickets + Check tickets + + + Spectator camera modes + Spectator camera modes + + + Tickets + Tickets + + + Main Settings + Main Settings + + + Enable Respawn System + Enable Respawn System + + + Enable Respawn System for mission. + Enable Respawn System for mission. + + + Allow checking remaining tickets from this place + Allow checking remaining tickets from this place + + + Only forced respawn waves. No timer! + Only forced respawn waves. No timer! + + + If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. + If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. + + + Range for waitingarea. Default 100m + Range for waitingarea. Default 100m + + + + + You are respawning! Standby. + You are respawning! Standby. + + + Remaining time until respawn + Remaining time until respawn + + + Respawn is currently disabled. + Respawn is currently disabled. + + + Mission is using only forced waves. + Mission is using only forced waves. + + + Remaining ticket count is: + Remaining ticket count is: + + + Check remaining tickets + Check remaining tickets + + + + + You are being teleported to: + You are being teleported to: + + + This teleport point is disabled + This teleport point is disabled + + + Open teleportmenu + Open teleportmenu + + + <t color='#FF0000'>Open teleportmenu</t> + <t color='#FF0000'>Open teleportmenu</t> + + + Main Base + Main Base + + + + + Put this module where you want respawn point to be for this side. + Put this module where you want respawn point to be for this side. + + + Spawn Point + Spawn Point + + + Choose side for this spawn point + Choose side for this spawn point + + + Tun Respawn + Tun Respawn + + + Respawn Position module do not have side set + Respawn Position module do not have side set + + + There is already "%1" marker. You either have multiple respawn point modules with same settings or marker named that. Either way, remove it. + There is already "%1" marker. You either have multiple respawn point modules with same settings or marker named that. Either way, remove it. + + + + + Teleport point + Teleport point + + + Teleport network point. + Teleport network point. + + + Marker icon, must be in non string format. Default: hd_start + Marker icon, must be in non string format. Default: hd_start + + + Create marker for this teleport, for enabled sides. + Create marker for this teleport, for enabled sides. + + + When enabled, will use ace interaction. Otherwise will use addaction. + When enabled, will use ace interaction. Otherwise will use addaction. + + + Name for teleport location + Name for teleport location + + + Condition to enable/disable opening teleport menu. Must return true or flase. Default: true + Condition to enable/disable opening teleport menu. Must return true or flase. Default: true + + + Conditio to enable/disable TP location. (Code) Default: True + Conditio to enable/disable TP location. (Code) Default: True + + + Is this side allowed to use this teleportter. + Is this side allowed to use this teleportter. + + + Classname for object where action to teleport is. Non string format: Land_Sleeping_bag_blue_folded_F + Classname for object where action to teleport is. Non string format: Land_Sleeping_bag_blue_folded_F + + + + + There is already "%1" marker. You either have multiple Waiting Area modules with same settings or marker named that. Either way, remove it. + There is already "%1" marker. You either have multiple Waiting Area modules with same settings or marker named that. Either way, remove it. + + + Waiting area module do not have side set + Waiting area module do not have side set + + + Respawn Waiting Area + Respawn Waiting Area + + + Put this module where you want respawn waiting area to be for this side. + Put this module where you want respawn waiting area to be for this side. + + + Choose side for this waiting area + Choose side for this waiting area + + + + + Teleport network + Teleport network + + + Teleport + Teleport + + + + + Show tickets + Show tickets + + + Enable briefing notes + Enable briefing notes + + + Create briefing tab where all these settings are show. + Create briefing tab where all these settings are show. + + + Show respawn type + Show respawn type + + + Show respawn wave time + Show respawn wave time + + + When enabled, wave interval time will be shown in briefing notes. + When enabled, wave interval time will be shown in briefing notes. + + + When enabled, starting ticket count will be shown in briefing notes. + When enabled, starting ticket count will be shown in briefing notes. + + + When enabled, respawn type will be shown in briefing notes. + When enabled, respawn type will be shown in briefing notes. + + + Show this side for all. Own side is aways shown, if show tickets is enabled. Also it that is disabled, none of the sides tickets are shown. + Show this side for all. Own side is aways shown, if show tickets is enabled. Also it that is disabled, none of the sides tickets are shown. + + + Show west data to all + Show west data to all + + + Show east data to all + Show east data to all + + + Show resistance data to all + Show resistance data to all + + + Show civilian data to all + Show civilian data to all + + + Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>unlimited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. + Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>unlimited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. + + + Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. + Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. + + + Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each player</font>. + Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each player</font>. + + + Mission uses only forced respawn waves. So no respawn timer. + Mission uses only forced respawn waves. So no respawn timer. + + + %1<br/><br/>JIP players will be killed and move to respawn after <font face='PuristaBold' size='14'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. + %1<br/><br/>JIP players will be killed and move to respawn after <font face='PuristaBold' size='14'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. + + + JIP players are not killed and moved to respawn when they join game. + JIP players are not killed and moved to respawn when they join game. + + + %1<br/><br/>When MSP has been deployed, it will report enemies every <font face='PuristaBold' size='14'>%2s</font>, if there is any inside <font face='PuristaBold' size='14'>%3</font> meter radius. + %1<br/><br/>When MSP has been deployed, it will report enemies every <font face='PuristaBold' size='14'>%2s</font>, if there is any inside <font face='PuristaBold' size='14'>%3</font> meter radius. + + + Reporting enemies near MSP is disabled. + Reporting enemies near MSP is disabled. + + + %1<br/><br/>MSP contested status is updated every <font face='PuristaBold' size='14'>%2s</font>.<br/>It will get contested if there is more enemis inside <font face='PuristaBold' size='14'>%3m</font> radius or even one enemy is <font face='PuristaBold' size='14'>%4m</font> away from it. + %1<br/><br/>MSP contested status is updated every <font face='PuristaBold' size='14'>%2s</font>.<br/>It will get contested if there is more enemis inside <font face='PuristaBold' size='14'>%3m</font> radius or even one enemy is <font face='PuristaBold' size='14'>%4m</font> away from it. + + + %1<br/><br/>MSP vehicle is <font face='PuristaBold' size='14'>%2</font> + %1<br/><br/>MSP vehicle is <font face='PuristaBold' size='14'>%2</font> + + + %1<br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn on.</font> <br/>If there is <font face='PuristaBold' size='14'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font face='PuristaBold' size='14'>you will skip it.</font> + %1<br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn on.</font> <br/>If there is <font face='PuristaBold' size='14'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font face='PuristaBold' size='14'>you will skip it.</font> + + + <br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn off.</font> + <br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn off.</font> + + + Mobile Spawn Point (MSP) has been <font face='PuristaBold' size='14'>enabled</font> to this mission for your side. + Mobile Spawn Point (MSP) has been <font face='PuristaBold' size='14'>enabled</font> to this mission for your side. + + + Mobile Spawn Point (MSP) has been enabled for this mission, but <font face='PuristaBold' size='14'>your side does not have MSP.</font> + Mobile Spawn Point (MSP) has been enabled for this mission, but <font face='PuristaBold' size='14'>your side does not have MSP.</font> + + + <br/><br/>If there is MSP or custom teleport points in this mission, you can accses teleport menu always from Main Base and uncontested MSP using ace action menu. Custom teleport points might have different conditions and uses either vanilla action menu or ace action menu. + <br/><br/>If there is MSP or custom teleport points in this mission, you can accses teleport menu always from Main Base and uncontested MSP using ace action menu. Custom teleport points might have different conditions and uses either vanilla action menu or ace action menu. + + + + + Default + Default + + + Side tickets + Side tickets + + + Player tickets + Player tickets + + + + + TUN - Mobile Spawn Point + TUN - Mobile Spawn Point + + + Progress Bar + Progress Bar + + + Time that it takes to setup MSP (seconds) + Setup Time + + + Packing Time + Packing Time + + + Setup Time + Setup Time + + + Time that it takes to deploy MSP (seconds) + Time that it takes to deploy MSP (seconds) + + + Time that it takes to pack MSP (seconds) + Time that it takes to pack MSP (seconds) + + + Enable MSP + Enable MSP + + + Check tickets from msp + Check tickets from msp + + + Enable MSP system + Enable MSP system + + + + + Setting up MSP + Setting up MSP + + + Packing MSP + Packing MSP + + + + + [['MSP has been contested!'], ['Respawn position has been updated.']] + [['MSP has been contested!'], ['Respawn position has been updated.']] + + + [['MSP has been secured!'], ['Respawn position has been updated.']] + [['MSP has been secured!'], ['Respawn position has been updated.']] + + + Enemies spotted near MSP! + Enemies spotted near MSP! + + + + + [['MSP has been deployed!'], ['Respawn position has been updated.']] + [['MSP has been deployed!'], ['Respawn position has been updated.']] + + + [['MSP has been packed!'], ['Respawn position has been updated.']] + [['MSP has been packed!'], ['Respawn position has been updated.']] + + + + + MSP Classname + MSP Classname + + + West MSP Classname + West MSP Classname + + + East MSP Classname + East MSP Classname + + + Resistance MSP Classname + Resistance MSP Classname + + + Civilian MSP Classname + Civilian MSP Classname + + + Put vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use non-string version of classname like: B_MRAP_01_F. Only one type of vehicle is supported currently + Put vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use non-string version of classname like: B_MRAP_01_F. Only one type of vehicle is supported currently + + + + + When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) + When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) + + + Interval for when server updates the contested status for MSP + Interval for when server updates the contested status for MSP + + + Radius where there needs to be more enemies than allies to disable MSP (meters) + Radius where there needs to be more enemies than allies to disable MSP (meters) + + + Min Contested Radius + Min Contested Radius + + + Max Contested Radius + Max Contested Radius + + + Contested Check Interval + Contested Check Interval + + + Contested + Contested + + + + + Range from MSP where enemies are reported (meters) + Range from MSP where enemies are reported (meters) + + + Interval when server check if there is enemies near MSP + Interval when server check if there is enemies near MSP + + + %1<br/><br/>Enable Report Enemies near MSP + %1<br/><br/>Enable Report Enemies near MSP + + + Report Enemies Interval + Report Enemies Interval + + + Report Enemies Range + Report Enemies Range + + + Report Enemies + Report Enemies + + + + + Mobile spawn point + Mobile spawn point + + + MSP has been destroyed! + MSP has been destroyed! + + + + + Remaining time until respawn: %1 + Remaining time until respawn: %1 + + + + + Who gets notification from MSP setup/pack? + Who gets notification from MSP setup/pack? + + + Who gets notification when MSP contested? + Who gets notification when MSP contested? + + + Who gets notification when there is enemies near MSP? + Who gets notification when there is enemies near MSP? + + + When MSP is setup or packed up, who whil recive notification from it. Default: Group Leader + When MSP is setup or packed up, who whil recive notification from it. Default: Group Leader + + + When MSP is contested, who whil recive notification from it. Default: Group Leader + When MSP is contested, who whil recive notification from it. Default: Group Leader + + + When there is enemies near MSP, who whil recive notification from it. Default: Group Leader + When there is enemies near MSP, who whil recive notification from it. Default: Group Leader + + + Notifications + Notifications + + + + From 07d39509dc1456a9557426cc0d71bbf245dabd00 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 11 Jan 2024 23:05:20 +0200 Subject: [PATCH 019/228] Remove different font --- addons/main/Stringtable.xml | 44 ++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index 02918da..1a62215 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -285,60 +285,60 @@ Show civilian data to all - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>unlimited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>unlimited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. + Mission has an <font size='16'>wave respawn</font> with <font size='16'>unlimited tickets</font> for <font size='16'>each side</font>. + Mission has an <font size='16'>wave respawn</font> with <font size='16'>unlimited tickets</font> for <font size='16'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each side</font>. + Mission has an <font size='16'>wave respawn</font> with <font size='16'>limited tickets</font> for <font size='16'>each side</font>. + Mission has an <font size='16'>wave respawn</font> with <font size='16'>limited tickets</font> for <font size='16'>each side</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each player</font>. - Mission has an <font face='PuristaBold' size='14'>wave respawn</font> with <font face='PuristaBold' size='14'>limited tickets</font> for <font face='PuristaBold' size='14'>each player</font>. + Mission has an <font size='16'>wave respawn</font> with <font size='16'>limited tickets</font> for <font size='16'>each player</font>. + Mission has an <font size='16'>wave respawn</font> with <font size='16'>limited tickets</font> for <font size='16'>each player</font>. Mission uses only forced respawn waves. So no respawn timer. Mission uses only forced respawn waves. So no respawn timer. - %1<br/><br/>JIP players will be killed and move to respawn after <font face='PuristaBold' size='14'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. - %1<br/><br/>JIP players will be killed and move to respawn after <font face='PuristaBold' size='14'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. + %1<br/><br/>JIP players will be killed and move to respawn after <font size='16'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. + %1<br/><br/>JIP players will be killed and move to respawn after <font size='16'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. JIP players are not killed and moved to respawn when they join game. JIP players are not killed and moved to respawn when they join game. - %1<br/><br/>When MSP has been deployed, it will report enemies every <font face='PuristaBold' size='14'>%2s</font>, if there is any inside <font face='PuristaBold' size='14'>%3</font> meter radius. - %1<br/><br/>When MSP has been deployed, it will report enemies every <font face='PuristaBold' size='14'>%2s</font>, if there is any inside <font face='PuristaBold' size='14'>%3</font> meter radius. + %1<br/><br/>When MSP has been deployed, it will report enemies every <font size='16'>%2s</font>, if there is any inside <font size='16'>%3</font> meter radius. + %1<br/><br/>When MSP has been deployed, it will report enemies every <font size='16'>%2s</font>, if there is any inside <font size='16'>%3</font> meter radius. Reporting enemies near MSP is disabled. Reporting enemies near MSP is disabled. - %1<br/><br/>MSP contested status is updated every <font face='PuristaBold' size='14'>%2s</font>.<br/>It will get contested if there is more enemis inside <font face='PuristaBold' size='14'>%3m</font> radius or even one enemy is <font face='PuristaBold' size='14'>%4m</font> away from it. - %1<br/><br/>MSP contested status is updated every <font face='PuristaBold' size='14'>%2s</font>.<br/>It will get contested if there is more enemis inside <font face='PuristaBold' size='14'>%3m</font> radius or even one enemy is <font face='PuristaBold' size='14'>%4m</font> away from it. + %1<br/><br/>MSP contested status is updated every <font size='16'>%2s</font>.<br/>It will get contested if there is more enemis inside <font size='16'>%3m</font> radius or even one enemy is <font size='16'>%4m</font> away from it. + %1<br/><br/>MSP contested status is updated every <font size='16'>%2s</font>.<br/>It will get contested if there is more enemis inside <font size='16'>%3m</font> radius or even one enemy is <font size='16'>%4m</font> away from it. - %1<br/><br/>MSP vehicle is <font face='PuristaBold' size='14'>%2</font> - %1<br/><br/>MSP vehicle is <font face='PuristaBold' size='14'>%2</font> + %1<br/><br/>MSP vehicle is <font size='16'>%2</font> + %1<br/><br/>MSP vehicle is <font size='16'>%2</font> - %1<br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn on.</font> <br/>If there is <font face='PuristaBold' size='14'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font face='PuristaBold' size='14'>you will skip it.</font> - %1<br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn on.</font> <br/>If there is <font face='PuristaBold' size='14'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font face='PuristaBold' size='14'>you will skip it.</font> + %1<br/><br/>This mission has <font size='16'>delayed respawn on.</font> <br/>If there is <font size='16'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font size='16'>you will skip it.</font> + %1<br/><br/>This mission has <font size='16'>delayed respawn on.</font> <br/>If there is <font size='16'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font size='16'>you will skip it.</font> - <br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn off.</font> - <br/><br/>This mission has <font face='PuristaBold' size='14'>delayed respawn off.</font> + <br/><br/>This mission has <font size='16'>delayed respawn off.</font> + <br/><br/>This mission has <font size='16'>delayed respawn off.</font> - Mobile Spawn Point (MSP) has been <font face='PuristaBold' size='14'>enabled</font> to this mission for your side. - Mobile Spawn Point (MSP) has been <font face='PuristaBold' size='14'>enabled</font> to this mission for your side. + Mobile Spawn Point (MSP) has been <font size='16'>enabled</font> to this mission for your side. + Mobile Spawn Point (MSP) has been <font size='16'>enabled</font> to this mission for your side. - Mobile Spawn Point (MSP) has been enabled for this mission, but <font face='PuristaBold' size='14'>your side does not have MSP.</font> - Mobile Spawn Point (MSP) has been enabled for this mission, but <font face='PuristaBold' size='14'>your side does not have MSP.</font> + Mobile Spawn Point (MSP) has been enabled for this mission, but <font size='16'>your side does not have MSP.</font> + Mobile Spawn Point (MSP) has been enabled for this mission, but <font size='16'>your side does not have MSP.</font> <br/><br/>If there is MSP or custom teleport points in this mission, you can accses teleport menu always from Main Base and uncontested MSP using ace action menu. Custom teleport points might have different conditions and uses either vanilla action menu or ace action menu. From 003c3f5ee5d18590ad688cd197ab60640fdfe98b Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 11 Jan 2024 23:05:36 +0200 Subject: [PATCH 020/228] fix timer --- addons/respawn/functions/fnc_timer.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/respawn/functions/fnc_timer.sqf b/addons/respawn/functions/fnc_timer.sqf index 44e4668..d587a52 100644 --- a/addons/respawn/functions/fnc_timer.sqf +++ b/addons/respawn/functions/fnc_timer.sqf @@ -25,7 +25,7 @@ private _time = (_hashWaitTime get _side) + (_hashWaveLenght get _side) * 60; _hashWaitTime set [_side, _time]; -if ( GVAR(timerRunning) getOrDefault [_side, false]) then { +if !( GVAR(timerRunning) getOrDefault [_side, false]) then { GVAR(timerRunning) set [_side, true]; [{ _this params["_side"]; GVAR(allowRespawn) get _side && From 2551ba129015d741209eb9979c44ed81fe79dcc8 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 11 Jan 2024 23:05:54 +0200 Subject: [PATCH 021/228] fix waiting area text --- addons/respawn/functions/fnc_waitingArea.sqf | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index f983ffc..609a04b 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -57,11 +57,13 @@ switch (playerSide) do { private _text = format ["%1", "STR_tunres_Respawn_FNC_only_forced_waves" call BIS_fnc_localize]; - if (_remainingWaitTime >= 0 && { (missionNamespace getVariable [format ["%1_%2", QGVAR(allow_respawn), playerSide], true]) }) then { + if (_remainingWaitTime >= 0 && { GVAR(allowRespawn) get playerSide }) then { _text = format ["%2
%1
", ([_remainingWaitTime] call CBA_fnc_formatElapsedTime), "STR_tunres_Respawn_FNC_remaining_time" call BIS_fnc_localize]; } else { - if (player getvariable [QGVAR(waiting_respawn), true] && { !(GVAR(forced_respawn)) }) then { + if (player getvariable [QGVAR(waiting_respawn), true] && { !(GVAR(forced_respawn)) } && { !(GVAR(allowRespawn) get playerSide) }) then { _text = format ["%1", "STR_tunres_Respawn_FNC_RespawnDisabled" call BIS_fnc_localize]; + } else { + _text = format ["Something is vevy vevy wrong. time: %1 - allowRespawn: %2 - forced respawn: %3 ", _remainingWaitTime, GVAR(allowRespawn) get playerSid, GVAR(forced_respawn)]; }; }; From e58d2eb54be8398af31399ac55c4d738fc122fce Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 11 Jan 2024 23:06:20 +0200 Subject: [PATCH 022/228] Comments & tweaks --- addons/respawn/XEH_preInit.sqf | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index b8e0466..a714918 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -5,24 +5,29 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; -//Remaining time for wave. +private _waitingRespawnEmptyArray= [[west,[]],[east,[]],[resistance,[]],[civilian,[]]]; private _waitTimesPreArray = [[west,0],[east,0],[resistance,0],[civilian,0]]; +private _emptyFalseArray = [[west,false],[east,false],[resistance,false],[civilian,false]]; +private _emptyTrueArray = [[west,true],[east,true],[resistance,true],[civilian,true]]; +//Remaining time for wave. + GVAR(nextWaveTimes) = createHashMapFromArray _waitTimesPreArray; //Respawn wave lenght times GVAR(waveLenghtTimes) = createHashMap; -private _waitingRespawnEmptyArray= [[west,[]],[east,[]],[resistance,[]],[civilian,[]]]; +//Respawn waiting area unit arrays GVAR(waitingRespawnList) = createHashMapFromArray _waitingRespawnEmptyArray; GVAR(waitingRespawnDelayedList) = createHashMapFromArray _waitingRespawnEmptyArray; //Total respawn count (log stuff) GVAR(totalRespawnCount) = createHashMapFromArray _waitTimesPreArray; -GVAR(allowRespawn) = createHashMapFromArray _waitingRespawnEmptyArray; +//Allow respawn for each side +GVAR(allowRespawn) = createHashMapFromArray _emptyTrueArray; GVAR(disconnected_players) = createHashMapFromArray _waitingRespawnEmptyArray; -GVAR(timerRunning) = createHashMapFromArray [[west,false],[east,false],[resistance,false],[civilian,false]]; +GVAR(timerRunning) = createHashMapFromArray _emptyFalseArray; ISNILS(GVAR(teleportPoints),[]); //allowed sides to spectate !WIP! Currentlu forced all From e46a05fcd2dd68a186b2dcd1bfac769e61ecb02a Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 11 Jan 2024 23:08:51 +0200 Subject: [PATCH 023/228] fix missing include --- include/z/ace/addons/main/script_debug.hpp | 58 ++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 include/z/ace/addons/main/script_debug.hpp diff --git a/include/z/ace/addons/main/script_debug.hpp b/include/z/ace/addons/main/script_debug.hpp new file mode 100644 index 0000000..72b6657 --- /dev/null +++ b/include/z/ace/addons/main/script_debug.hpp @@ -0,0 +1,58 @@ +/** +Fast Recompiling via function +**/ +// #define DISABLE_COMPILE_CACHE +// To Use: [] call ACE_PREP_RECOMPILE; + +#ifdef DISABLE_COMPILE_CACHE + #define LINKFUNC(x) {_this call FUNC(x)} + #define PREP_RECOMPILE_START if (isNil "ACE_PREP_RECOMPILE") then {ACE_RECOMPILES = []; ACE_PREP_RECOMPILE = {{call _x} forEach ACE_RECOMPILES;}}; private _recomp = { + #define PREP_RECOMPILE_END }; call _recomp; ACE_RECOMPILES pushBack _recomp; +#else + #define LINKFUNC(x) FUNC(x) + #define PREP_RECOMPILE_START ; /* disabled */ + #define PREP_RECOMPILE_END ; /* disabled */ +#endif + + +/** +STACK TRACING +**/ +//#define ENABLE_CALLSTACK +//#define ENABLE_PERFORMANCE_COUNTERS +//#define DEBUG_EVENTS + +#ifdef ENABLE_CALLSTACK + #define CALLSTACK(function) {if(ACE_IS_ERRORED) then { ['AUTO','AUTO'] call ACE_DUMPSTACK_FNC; ACE_IS_ERRORED = false; }; ACE_IS_ERRORED = true; ACE_STACK_TRACE set [ACE_STACK_DEPTH, [diag_tickTime, __FILE__, __LINE__, ACE_CURRENT_FUNCTION, 'ANON', _this]]; ACE_STACK_DEPTH = ACE_STACK_DEPTH + 1; ACE_CURRENT_FUNCTION = 'ANON'; private _ret = _this call ##function; ACE_STACK_DEPTH = ACE_STACK_DEPTH - 1; ACE_IS_ERRORED = false; _ret;} + #define CALLSTACK_NAMED(function, functionName) {if(ACE_IS_ERRORED) then { ['AUTO','AUTO'] call ACE_DUMPSTACK_FNC; ACE_IS_ERRORED = false; }; ACE_IS_ERRORED = true; ACE_STACK_TRACE set [ACE_STACK_DEPTH, [diag_tickTime, __FILE__, __LINE__, ACE_CURRENT_FUNCTION, functionName, _this]]; ACE_STACK_DEPTH = ACE_STACK_DEPTH + 1; ACE_CURRENT_FUNCTION = functionName; private _ret = _this call ##function; ACE_STACK_DEPTH = ACE_STACK_DEPTH - 1; ACE_IS_ERRORED = false; _ret;} + #define DUMPSTACK ([__FILE__, __LINE__] call ACE_DUMPSTACK_FNC) + + #define FUNC(var1) {if(ACE_IS_ERRORED) then { ['AUTO','AUTO'] call ACE_DUMPSTACK_FNC; ACE_IS_ERRORED = false; }; ACE_IS_ERRORED = true; ACE_STACK_TRACE set [ACE_STACK_DEPTH, [diag_tickTime, __FILE__, __LINE__, ACE_CURRENT_FUNCTION, 'TRIPLES(ADDON,fnc,var1)', _this]]; ACE_STACK_DEPTH = ACE_STACK_DEPTH + 1; ACE_CURRENT_FUNCTION = 'TRIPLES(ADDON,fnc,var1)'; private _ret = _this call TRIPLES(ADDON,fnc,var1); ACE_STACK_DEPTH = ACE_STACK_DEPTH - 1; ACE_IS_ERRORED = false; _ret;} + #define EFUNC(var1,var2) {if(ACE_IS_ERRORED) then { ['AUTO','AUTO'] call ACE_DUMPSTACK_FNC; ACE_IS_ERRORED = false; }; ACE_IS_ERRORED = true; ACE_STACK_TRACE set [ACE_STACK_DEPTH, [diag_tickTime, __FILE__, __LINE__, ACE_CURRENT_FUNCTION, 'TRIPLES(DOUBLES(PREFIX,var1),fnc,var2)', _this]]; ACE_STACK_DEPTH = ACE_STACK_DEPTH + 1; ACE_CURRENT_FUNCTION = 'TRIPLES(DOUBLES(PREFIX,var1),fnc,var2)'; private _ret = _this call TRIPLES(DOUBLES(PREFIX,var1),fnc,var2); ACE_STACK_DEPTH = ACE_STACK_DEPTH - 1; ACE_IS_ERRORED = false; _ret;} +#else + #define CALLSTACK(function) function + #define CALLSTACK_NAMED(function, functionName) function + #define DUMPSTACK ; /* disabled */ +#endif + + +/** +PERFORMANCE COUNTERS SECTION +**/ +//#define ENABLE_PERFORMANCE_COUNTERS +// To Use: [] call ace_common_fnc_dumpPerformanceCounters; + +#ifdef ENABLE_PERFORMANCE_COUNTERS + #define CBA_fnc_addPerFrameHandler { _ret = [(_this select 0), (_this select 1), (_this select 2), #function] call CBA_fnc_addPerFrameHandler; if(isNil "ACE_PFH_COUNTER" ) then { ACE_PFH_COUNTER=[]; }; ACE_PFH_COUNTER pushBack [[_ret, __FILE__, __LINE__], [(_this select 0), (_this select 1), (_this select 2)]]; _ret } + + #define CREATE_COUNTER(x) if(isNil "ACE_COUNTERS" ) then { ACE_COUNTERS=[]; }; GVAR(DOUBLES(x,counter))=[]; GVAR(DOUBLES(x,counter)) set[0, QUOTE(GVAR(DOUBLES(x,counter)))]; GVAR(DOUBLES(x,counter)) set[1, diag_tickTime]; ACE_COUNTERS pushBack GVAR(DOUBLES(x,counter)); + #define BEGIN_COUNTER(x) if(isNil QUOTE(GVAR(DOUBLES(x,counter)))) then { CREATE_COUNTER(x) }; GVAR(DOUBLES(x,counter)) set[2, diag_tickTime]; + #define END_COUNTER(x) GVAR(DOUBLES(x,counter)) pushBack [(GVAR(DOUBLES(x,counter)) select 2), diag_tickTime]; + + #define DUMP_COUNTERS ([__FILE__, __LINE__] call ACE_DUMPCOUNTERS_FNC) +#else + #define CREATE_COUNTER(x) ; /* disabled */ + #define BEGIN_COUNTER(x) ; /* disabled */ + #define END_COUNTER(x) ; /* disabled */ + #define DUMP_COUNTERS ; /* disabled */ +#endif From 48e503db76bd64909a56f4030de5b1d0102a038c Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 11 Jan 2024 23:08:58 +0200 Subject: [PATCH 024/228] auto run test mission --- .hemtt/project.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/.hemtt/project.toml b/.hemtt/project.toml index 21e96e5..e277670 100644 --- a/.hemtt/project.toml +++ b/.hemtt/project.toml @@ -30,6 +30,7 @@ parameters = [ "-showScriptErrors", # You can add additional parameters here "-debug", "-filePatching", + "C:\\Users\\mikal\\Documents\\Arma 3 - Other Profiles\\Tuntematon\\missions\\TUN_Respawn_System.Stratis\\mission.sqm", # Launch into existing Editor Mission - \\ needed ] [hemtt.release] From 7f7e897b3d41f1e2aed0800d0c1823ca484551f2 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 17:34:50 +0200 Subject: [PATCH 025/228] tickets to hash --- addons/respawn/XEH_postInit_server.sqf | 51 ++++++++++++------- addons/respawn/XEH_preInit.sqf | 14 ++--- .../functions/fnc_checkTicketCount.sqf | 8 +-- .../functions/fnc_getTicketCountPlayer.sqf | 5 +- 4 files changed, 45 insertions(+), 33 deletions(-) diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 4f26cd8..3f96671 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -2,10 +2,10 @@ if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Playertickets") then { GVAR(PlayerTicektsHash) = createHashMap; - AAR_UPDATE("west","Player tickets", GVAR(tickets_west)); - AAR_UPDATE("east","Player tickets", GVAR(tickets_east)); - AAR_UPDATE("guer","Player tickets", GVAR(tickets_guer)); - AAR_UPDATE("civ","Player tickets", GVAR(tickets_civ)); + AAR_UPDATE("west","Player tickets", (round GVAR(tickets_west))); + AAR_UPDATE("east","Player tickets", (round GVAR(tickets_east))); + AAR_UPDATE("guer","Player tickets", (round GVAR(tickets_guer))); + AAR_UPDATE("civ","Player tickets", (round GVAR(tickets_civ))); }; if (GVAR(respawn_type) isNotEqualTo localize "STR_tunres_Respawn_Type_Default") then { @@ -30,35 +30,52 @@ addMissionEventHandler ["HandleDisconnect", { }]; //AAR times -if ( !isnil "afi_aar2" ) then { +if ( !isnil "afi_aar2" ) then { [{cba_missiontime > 10}, { - if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Sidetickets") then { - AAR_UPDATE("west","Side tickets", GVAR(tickets_west)); - AAR_UPDATE("east","Side tickets", GVAR(tickets_east)); - AAR_UPDATE("guer","Side tickets", GVAR(tickets_guer)); - AAR_UPDATE("civ","Side tickets", GVAR(tickets_civ)); - }; - if (missionNamespace getVariable ["afi_aar2", false]) then { + + if ((GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Sidetickets")) then { + private _hashTickets = GVAR(tickets) + if (GVAR(enabled_west)) then { + private _ticektsWest = _hashTickets get west; + AAR_UPDATE("west","Side tickets", _ticektsWest); + }; + + if (GVAR(enabled_east)) then { + private _ticektsEast = _hashTickets get east; + AAR_UPDATE("east","Side tickets", _ticektsEast); + }; + + if (GVAR(enabled_guer)) then { + private _ticektsResistance = _hashTickets get resistance; + AAR_UPDATE("guer","Side tickets", _ticektsResistance); + }; + + if (GVAR(enabled_civ)) then { + private _ticektsCivilian = _hashTickets get civilian; + AAR_UPDATE("civ","Side tickets", _ticektsCivilian); + }; + }; + [{ - private _hash = GVAR(nextWaveTimes); + private _hashTime = GVAR(nextWaveTimes); if (GVAR(enabled_west)) then { - private _time = (_hash get west); + private _time = (_hashTime get west); AAR_UPDATE("west","Next respawn wave", _time); }; if (GVAR(enabled_east)) then { - private _time = (_hash get east); + private _time = (_hashTime get east); AAR_UPDATE("east","Next respawn wave", _time); }; if (GVAR(enabled_guer)) then { - private _time = (_hash get resistance); + private _time = (_hashTime get resistance); AAR_UPDATE("guer","Next respawn wave", _time); }; if (GVAR(enabled_civ)) then { - private _time = (_hash get civilian); + private _time = (_hashTime get civilian); AAR_UPDATE("civ","Next respawn wave", _time); }; diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index a714918..f09a315 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -9,13 +9,15 @@ private _waitingRespawnEmptyArray= [[west,[]],[east,[]],[resistance,[]],[civilia private _waitTimesPreArray = [[west,0],[east,0],[resistance,0],[civilian,0]]; private _emptyFalseArray = [[west,false],[east,false],[resistance,false],[civilian,false]]; private _emptyTrueArray = [[west,true],[east,true],[resistance,true],[civilian,true]]; -//Remaining time for wave. - +//cba_missiontime time when next wave happens. GVAR(nextWaveTimes) = createHashMapFromArray _waitTimesPreArray; //Respawn wave lenght times GVAR(waveLenghtTimes) = createHashMap; +//Tickets +GVAR(tickets) = createHashMap; + //Respawn waiting area unit arrays GVAR(waitingRespawnList) = createHashMapFromArray _waitingRespawnEmptyArray; GVAR(waitingRespawnDelayedList) = createHashMapFromArray _waitingRespawnEmptyArray; @@ -238,7 +240,7 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(tickets_west) = round _value; + GVAR(tickets) set [west, round _value]; }, true ] call CBA_Settings_fnc_init; @@ -252,7 +254,7 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(tickets_east) = round _value; + GVAR(tickets) set [east, round _value]; }, true ] call CBA_Settings_fnc_init; @@ -266,7 +268,7 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(tickets_guer) = round _value; + GVAR(tickets) set [resistance, round _value]; }, true ] call CBA_Settings_fnc_init; @@ -280,7 +282,7 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(tickets_civ) = round _value; + GVAR(tickets) set [civilian, round _value]; }, true ] call CBA_Settings_fnc_init; diff --git a/addons/respawn/functions/fnc_checkTicketCount.sqf b/addons/respawn/functions/fnc_checkTicketCount.sqf index a7c1d1c..07e794d 100644 --- a/addons/respawn/functions/fnc_checkTicketCount.sqf +++ b/addons/respawn/functions/fnc_checkTicketCount.sqf @@ -16,13 +16,7 @@ if (isDedicated) exitWith { }; params [["_side", nil, [west]]]; if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Sidetickets") then { - _ticetCount = switch (_side) do { - case west: { GVAR(tickets_west) }; - case east: { GVAR(tickets_east) }; - case resistance: { GVAR(tickets_guer) }; - case civilian: { GVAR(tickets_civ) }; - default { "No side" }; - }; + _ticetCount = GVAR(tickets) get _side; _text = format["%1 %2","STR_tunres_Respawn_RemainingTicketsText" call BIS_fnc_localize, _ticetCount]; _text call CBA_fnc_notify; } else { diff --git a/addons/respawn/functions/fnc_getTicketCountPlayer.sqf b/addons/respawn/functions/fnc_getTicketCountPlayer.sqf index 7929425..077eadd 100644 --- a/addons/respawn/functions/fnc_getTicketCountPlayer.sqf +++ b/addons/respawn/functions/fnc_getTicketCountPlayer.sqf @@ -22,13 +22,12 @@ private _playerUID = getPlayerUID _player; private _remainingTickets = _hash getOrDefault [_playerUID, -10]; if (_remainingTickets isEqualTo -10) then { - private _sideNum = [west, east, resistance, civilian] findIf { _side isEqualTo _x }; - _remainingTickets = [GVAR(tickets_west), GVAR(tickets_east), GVAR(tickets_guer), GVAR(tickets_civ)] select _sideNum; + _remainingTickets = GVAR(tickets) get _side; _hash set [_playerUID, _remainingTickets, true]; }; if (_doHint) then { - private _text = format["%1 %2","STR_tunres_Respawn_RemainingTicketsText" call BIS_fnc_localize, str _remainingTickets]; + private _text = format["%1 %2",localize "STR_tunres_Respawn_RemainingTicketsText", str _remainingTickets]; _text remoteExecCall ["CBA_fnc_notify", _player]; }; From 8077f2a424945773810cbd793adbf0aebc8cd88d Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 17:35:33 +0200 Subject: [PATCH 026/228] Rename function tunres_Respawn_fnc_ticketCounterSide-> tunres_Respawn_fnc_decreaseSideTicketCountOnDeath --- ...e.sqf => fnc_decreaseSideTicketCountOnDeath.sqf} | 13 +++++++------ addons/respawn/functions/fnc_killed.sqf | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) rename addons/respawn/functions/{fnc_ticketCounterSide.sqf => fnc_decreaseSideTicketCountOnDeath.sqf} (59%) diff --git a/addons/respawn/functions/fnc_ticketCounterSide.sqf b/addons/respawn/functions/fnc_decreaseSideTicketCountOnDeath.sqf similarity index 59% rename from addons/respawn/functions/fnc_ticketCounterSide.sqf rename to addons/respawn/functions/fnc_decreaseSideTicketCountOnDeath.sqf index 7e19257..85aef0a 100644 --- a/addons/respawn/functions/fnc_ticketCounterSide.sqf +++ b/addons/respawn/functions/fnc_decreaseSideTicketCountOnDeath.sqf @@ -11,7 +11,7 @@ * None * * Example: - * [side, player] call tunres_Respawn_fnc_ticketCounterSide + * [side, player] call tunres_Respawn_fnc_decreaseSideTicketCountOnDeath */ #include "script_component.hpp" params ["_side","_player"]; @@ -24,16 +24,17 @@ if (GVAR(disconnected_players) getOrDefault [_playerUID, false]) then { [5] remoteExecCall ["setPlayerRespawnTime", _player]; }; -private _sideNum = [west, east, resistance, civilian] findIf { _side isEqualTo _x }; -private _remainingTicketsVar = [QGVAR(tickets_west), QGVAR(tickets_east), QGVAR(tickets_guer), QGVAR(tickets_civ)] select _sideNum; -private _remainingTickets = missionNamespace getVariable _remainingTicketsVar; +_remainingTickets = GVAR(tickets) get _side; if ( _remainingTickets > 0 ) then { DEC(_remainingTickets); private _sideSTR = str _side; AAR_UPDATE(_sideSTR,"Side tickets", _remainingTickets); - missionNamespace setVariable [_remainingTicketsVar, _remainingTickets, true]; + GVAR(tickets) set [_side, _remainingTickets]; + publicVariable QGVAR(tickets); [5] remoteExecCall ["setPlayerRespawnTime", _player]; } else { - [{remoteExecCall [QFUNC(startSpectator), _this];}, _player, 5] call CBA_fnc_waitAndExecute; + [{ + remoteExecCall [QFUNC(startSpectator), _this]; + }, _player, 5] call CBA_fnc_waitAndExecute; }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_killed.sqf b/addons/respawn/functions/fnc_killed.sqf index ab28c56..1bc7aff 100644 --- a/addons/respawn/functions/fnc_killed.sqf +++ b/addons/respawn/functions/fnc_killed.sqf @@ -24,7 +24,7 @@ if (GVAR(endRespawns)) exitWith { switch (GVAR(respawn_type)) do { case localize "STR_tunres_Respawn_Type_Sidetickets": { - [playerSide, player] remoteExecCall [QFUNC(ticketCounterSide),2]; + [playerSide, player] remoteExecCall [QFUNC(decreaseSideTicketCountOnDeath),2]; }; case localize "STR_tunres_Respawn_Type_Playertickets": { From 171fa418a12b4f6e3b58bdb56b489472f212ddcb Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 17:38:09 +0200 Subject: [PATCH 027/228] Rename function tunres_Respawn_fnc_updatePlayerTicketCount -> tunres_Respawn_fnc_setPlayerTicketCount --- ...pdatePlayerTicketCount.sqf => fnc_setPlayerTicketCount.sqf} | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) rename addons/respawn/functions/{fnc_updatePlayerTicketCount.sqf => fnc_setPlayerTicketCount.sqf} (79%) diff --git a/addons/respawn/functions/fnc_updatePlayerTicketCount.sqf b/addons/respawn/functions/fnc_setPlayerTicketCount.sqf similarity index 79% rename from addons/respawn/functions/fnc_updatePlayerTicketCount.sqf rename to addons/respawn/functions/fnc_setPlayerTicketCount.sqf index 04f29f1..4e14e9e 100644 --- a/addons/respawn/functions/fnc_updatePlayerTicketCount.sqf +++ b/addons/respawn/functions/fnc_setPlayerTicketCount.sqf @@ -7,10 +7,9 @@ * 1: New ticket count * * Return Value: - * The return true when done * * Example: - * [player, 10] call tunres_Respawn_fnc_updatePlayerTicketCount + * [player, 10] call tunres_Respawn_fnc_setPlayerTicketCount */ #include "script_component.hpp" if (!isServer) exitWith { }; From d509bb8a2c7ebd5104542a0b97882180b01afe49 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 17:42:25 +0200 Subject: [PATCH 028/228] Add function to set side tickets --- .../functions/fnc_setSideTicketCount.sqf | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 addons/respawn/functions/fnc_setSideTicketCount.sqf diff --git a/addons/respawn/functions/fnc_setSideTicketCount.sqf b/addons/respawn/functions/fnc_setSideTicketCount.sqf new file mode 100644 index 0000000..2fd75de --- /dev/null +++ b/addons/respawn/functions/fnc_setSideTicketCount.sqf @@ -0,0 +1,19 @@ +/* + * Author: [Tuntematon] + * [Description] + * + * Arguments: + * 0: Side to add tickets + * 1: New ticket count + * + * Return Value: + * + * Example: + * [west, 10] call tunres_Respawn_fnc_setSideTicketCount + */ +#include "script_component.hpp" +if (!isServer) exitWith { }; +params ["_side", "_count"]; + +private _hash = GVAR(tickets); +_hash set [_side, _count]; \ No newline at end of file From cb9e3fa3a411c6684f34d85b53a85642b6d99d6c Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 17:48:54 +0200 Subject: [PATCH 029/228] Update function name tunres_Respawn_fnc_getTicketCountPlayer-> tunres_Respawn_fnc_getPlayerTicketCount --- addons/respawn/functions/fnc_checkTicketCount.sqf | 2 +- ...nc_getTicketCountPlayer.sqf => fnc_getPlayerTicketCount.sqf} | 2 +- addons/respawn/functions/fnc_ticketCounterPlayer.sqf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename addons/respawn/functions/{fnc_getTicketCountPlayer.sqf => fnc_getPlayerTicketCount.sqf} (92%) diff --git a/addons/respawn/functions/fnc_checkTicketCount.sqf b/addons/respawn/functions/fnc_checkTicketCount.sqf index 07e794d..f650574 100644 --- a/addons/respawn/functions/fnc_checkTicketCount.sqf +++ b/addons/respawn/functions/fnc_checkTicketCount.sqf @@ -20,6 +20,6 @@ if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Sidetickets") _text = format["%1 %2","STR_tunres_Respawn_RemainingTicketsText" call BIS_fnc_localize, _ticetCount]; _text call CBA_fnc_notify; } else { - [playerSide, player, true] remoteExecCall [QFUNC(getTicketCountPlayer),2]; + [playerSide, player, true] remoteExecCall [QFUNC(getPlayerTicketCount),2]; }; diff --git a/addons/respawn/functions/fnc_getTicketCountPlayer.sqf b/addons/respawn/functions/fnc_getPlayerTicketCount.sqf similarity index 92% rename from addons/respawn/functions/fnc_getTicketCountPlayer.sqf rename to addons/respawn/functions/fnc_getPlayerTicketCount.sqf index 077eadd..252e0ed 100644 --- a/addons/respawn/functions/fnc_getTicketCountPlayer.sqf +++ b/addons/respawn/functions/fnc_getPlayerTicketCount.sqf @@ -11,7 +11,7 @@ * None * * Example: - * [side, player, true] call tunres_Respawn_fnc_getTicketCountPlayer + * [side, player, true] call tunres_Respawn_fnc_getPlayerTicketCount */ #include "script_component.hpp" params [["_side", nil, [west]], ["_player", objNull, [objNull]], ["_doHint", false, [true]]]; diff --git a/addons/respawn/functions/fnc_ticketCounterPlayer.sqf b/addons/respawn/functions/fnc_ticketCounterPlayer.sqf index 63801a2..b7e2a0b 100644 --- a/addons/respawn/functions/fnc_ticketCounterPlayer.sqf +++ b/addons/respawn/functions/fnc_ticketCounterPlayer.sqf @@ -19,7 +19,7 @@ if (!isServer) exitWith { }; private _hash = GVAR(PlayerTicektsHash); private _playerUID = getPlayerUID _player; -private _remainingTickets = [_side, _player, false] call FUNC(getTicketCountPlayer); +private _remainingTickets = [_side, _player, false] call FUNC(getPlayerTicketCount); if ( _remainingTickets > 0 ) then { //if player disconnected and came back. So no ticket wasted. From 805375e0a9f6fa4291461f4a62b3c5a331927e07 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 17:50:23 +0200 Subject: [PATCH 030/228] New get side ticket count function Add get side ticket count function. To make it easy to check from hash --- .../functions/fnc_getSideTicketCount.sqf | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 addons/respawn/functions/fnc_getSideTicketCount.sqf diff --git a/addons/respawn/functions/fnc_getSideTicketCount.sqf b/addons/respawn/functions/fnc_getSideTicketCount.sqf new file mode 100644 index 0000000..b119462 --- /dev/null +++ b/addons/respawn/functions/fnc_getSideTicketCount.sqf @@ -0,0 +1,20 @@ +/* + * Author: [Tuntematon] + * [Description] + * + * Arguments: + * 0: Side to get tickets + * + * Return Value: + * + * Example: + * [west] call tunres_Respawn_fnc_getSideTicketCount + */ +#include "script_component.hpp" +if (!isServer) exitWith { }; +params ["_side", "_count"]; + +private _hash = GVAR(tickets); +private _ticketCount = _hash get _side; + +_ticketCount \ No newline at end of file From 50e4bda29e1b362d0163f7ce7181f239b90dc4d0 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 17:53:42 +0200 Subject: [PATCH 031/228] Rename function tunres_Respawn_fnc_killed -> tunres_Respawn_fnc_onPlayerKilled --- addons/respawn/XEH_postInit_client.sqf | 2 +- .../functions/{fnc_killed.sqf => fnc_onPlayerKilled.sqf} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename addons/respawn/functions/{fnc_killed.sqf => fnc_onPlayerKilled.sqf} (94%) diff --git a/addons/respawn/XEH_postInit_client.sqf b/addons/respawn/XEH_postInit_client.sqf index 9d88348..1796e0f 100644 --- a/addons/respawn/XEH_postInit_client.sqf +++ b/addons/respawn/XEH_postInit_client.sqf @@ -43,7 +43,7 @@ if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (I // Add killed EH [player, "killed", { - [] call FUNC(killed); + [] call FUNC(onPlayerKilled); }] call CBA_fnc_addBISEventHandler; }] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/respawn/functions/fnc_killed.sqf b/addons/respawn/functions/fnc_onPlayerKilled.sqf similarity index 94% rename from addons/respawn/functions/fnc_killed.sqf rename to addons/respawn/functions/fnc_onPlayerKilled.sqf index 1bc7aff..7055fcf 100644 --- a/addons/respawn/functions/fnc_killed.sqf +++ b/addons/respawn/functions/fnc_onPlayerKilled.sqf @@ -10,7 +10,7 @@ * None * * Example: - * [] call tunres_Respawn_fnc_killed + * [] call tunres_Respawn_fnc_onPlayerKilled */ #include "script_component.hpp" From 675fe8c80a52b39b78e5650f0eb38d401a2b6f88 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 18:09:39 +0200 Subject: [PATCH 032/228] Add tickest to respawn waiting area text --- addons/main/Stringtable.xml | 8 +++++ addons/respawn/functions/fnc_waitingArea.sqf | 34 +++++++++++++------- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index 1a62215..203c9a0 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -82,6 +82,14 @@ Range for waitingarea. Default 100m Range for waitingarea. Default 100m
+ + Remaining tickets for your side: + Remaining tickets for your side: + + + Your remaining tickets: + Your remaining tickets: + diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 609a04b..7424491 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -14,13 +14,13 @@ */ #include "script_component.hpp" private ["_respawn_waitingarea"]; - -if (isDedicated || !(playerSide in [west,east,resistance,civilian]) ) exitWith { }; +private _playerSide = playerSide; +if (isDedicated || !(_playerSide in [west,east,resistance,civilian]) ) exitWith { }; //tell server to add this player to list -[player, true, playerSide] remoteExecCall [QFUNC(updateWaitingRespawnList),2]; +[player, true, _playerSide] remoteExecCall [QFUNC(updateWaitingRespawnList),2]; -switch (playerSide) do { +switch (_playerSide) do { case west: { _respawn_waitingarea = getpos (GVAR(waitingarea_west) select 1); @@ -42,31 +42,41 @@ switch (playerSide) do { [{ params ["_respawn_waitingarea"]; if !( player getvariable QGVAR(waiting_respawn) ) exitWith { [_handle] call CBA_fnc_removePerFrameHandler; }; - + private _playerSide = playerSide; //Show remaining time private _hashWaitTime = GVAR(nextWaveTimes); - private _waitTime = _hashWaitTime get playerSide; + private _waitTime = _hashWaitTime get _playerSide; private _remainingWaitTime = round (_waitTime - cba_missiontime); if (player getVariable [QGVAR(skip_next_wave), false]) then { private _hashWaveLenght = GVAR(waveLenghtTimes); - private _waveLenght = _hashWaveLenght get playerSide; + private _waveLenght = _hashWaveLenght get _playerSide; _remainingWaitTime = _remainingWaitTime + _waveLenght; }; - private _text = format ["%1", "STR_tunres_Respawn_FNC_only_forced_waves" call BIS_fnc_localize]; + private _text = format ["%1", localize "STR_tunres_Respawn_FNC_only_forced_waves"]; - if (_remainingWaitTime >= 0 && { GVAR(allowRespawn) get playerSide }) then { - _text = format ["%2
%1
", ([_remainingWaitTime] call CBA_fnc_formatElapsedTime), "STR_tunres_Respawn_FNC_remaining_time" call BIS_fnc_localize]; + if (_remainingWaitTime >= 0 && { GVAR(allowRespawn) get _playerSide }) then { + _text = format ["%2
%1
", ([_remainingWaitTime] call CBA_fnc_formatElapsedTime), localize "STR_tunres_Respawn_FNC_remaining_time"]; } else { - if (player getvariable [QGVAR(waiting_respawn), true] && { !(GVAR(forced_respawn)) } && { !(GVAR(allowRespawn) get playerSide) }) then { - _text = format ["%1", "STR_tunres_Respawn_FNC_RespawnDisabled" call BIS_fnc_localize]; + if (player getvariable [QGVAR(waiting_respawn), true] && { !(GVAR(forced_respawn)) } && { !(GVAR(allowRespawn) get _playerSide) }) then { + _text = format ["%1", localize "STR_tunres_Respawn_FNC_RespawnDisabled"]; } else { _text = format ["Something is vevy vevy wrong. time: %1 - allowRespawn: %2 - forced respawn: %3 ", _remainingWaitTime, GVAR(allowRespawn) get playerSid, GVAR(forced_respawn)]; }; }; + if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Default") then { + private _tickets = GVAR(tickest) get _playerSide; + _text = format["%1
%2 %3", _text, localize "STR_tunres_Respawan_RemainingTickestSide", _tickets]; + } else { + if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Playertickets") then { + private _tickets = GVAR(tickest) get _playerSide; + _text = format["%1
%2 %3", _text, localize "STR_tunres_Respawan_RemainingTickestPlayer", _tickets]; + }; + }; + [_text,0,0,1,0] spawn BIS_fnc_dynamicText; //make sure that player is still in area From d6bbaa0440dcfb8b16f612c756e40e252e2b5af0 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 18:17:14 +0200 Subject: [PATCH 033/228] Waiting area stuff to hashmap --- addons/respawn/XEH_preInit.sqf | 3 +++ .../functions/fnc_module_waitingarea.sqf | 13 ++++++------- addons/respawn/functions/fnc_waitingArea.sqf | 19 +------------------ 3 files changed, 10 insertions(+), 25 deletions(-) diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index f09a315..caaa00b 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -18,6 +18,9 @@ GVAR(waveLenghtTimes) = createHashMap; //Tickets GVAR(tickets) = createHashMap; +//Waiting area stuff +GVAR(waitingArea) = createHashMap; + //Respawn waiting area unit arrays GVAR(waitingRespawnList) = createHashMapFromArray _waitingRespawnEmptyArray; GVAR(waitingRespawnDelayedList) = createHashMapFromArray _waitingRespawnEmptyArray; diff --git a/addons/respawn/functions/fnc_module_waitingarea.sqf b/addons/respawn/functions/fnc_module_waitingarea.sqf index 3b49005..3ba51ac 100644 --- a/addons/respawn/functions/fnc_module_waitingarea.sqf +++ b/addons/respawn/functions/fnc_module_waitingarea.sqf @@ -38,8 +38,7 @@ _pos = getPos _logic; switch (_markername) do { case "respawn_west": { - missionNamespace setVariable [QGVAR(waitingarea_west), [_markername, _logic, _pos], true]; - + _side = west; GVAR(flag_west) = "Flag_Blue_F" createVehicle _pos; [{ADDON}, { [west] call FUNC(timer); @@ -47,8 +46,7 @@ switch (_markername) do { }; case "respawn_east": { - missionNamespace setVariable [QGVAR(waitingarea_east), [_markername, _logic, _pos], true]; - + _side = east; GVAR(flag_east) = "Flag_Red_F" createVehicle _pos; [{ADDON}, { [east] call FUNC(timer); @@ -56,7 +54,7 @@ switch (_markername) do { }; case "respawn_guerrila": { - missionNamespace setVariable [QGVAR(waitingarea_guer), [_markername, _logic, _pos], true]; + _side = resistance; GVAR(flag_guerrila) = "Flag_Green_F" createVehicle _pos; [{ADDON}, { @@ -65,8 +63,7 @@ switch (_markername) do { }; case "respawn_civilian": { - missionNamespace setVariable [QGVAR(waitingarea_civ), [_markername, _logic, _pos], true]; - + _side = civilian; GVAR(flag_civilian) = "Flag_White_F" createVehicle _pos; [{ADDON}, { [civilian] call FUNC(timer); @@ -74,6 +71,8 @@ switch (_markername) do { }; }; +GVAR(waitingArea) set [_side, [_markername, _logic, _pos]]; +publicVariable QGVAR(waitingArea); // Module function is executed by spawn command, so returned value is not necessary, but it's good practice. true diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 7424491..0451848 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -20,24 +20,7 @@ if (isDedicated || !(_playerSide in [west,east,resistance,civilian]) ) exitWith //tell server to add this player to list [player, true, _playerSide] remoteExecCall [QFUNC(updateWaitingRespawnList),2]; -switch (_playerSide) do { - - case west: { - _respawn_waitingarea = getpos (GVAR(waitingarea_west) select 1); - }; - - case east: { - _respawn_waitingarea = getpos (GVAR(waitingarea_east) select 1); - }; - - case resistance: { - _respawn_waitingarea = getpos (GVAR(waitingarea_guer) select 1); - }; - - case civilian: { - _respawn_waitingarea = getpos (GVAR(waitingarea_civ) select 1); - }; -}; +_respawn_waitingarea = GVAR(waitingArea) get _playerSide; [{ params ["_respawn_waitingarea"]; From 4344f113b747bdaad31be13bfd272305afe61acf Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 18:26:29 +0200 Subject: [PATCH 034/228] Respawn enabled moved to hash --- addons/respawn/XEH_postInit_server.sqf | 20 ++++++++++--------- addons/respawn/XEH_preInit.sqf | 3 +++ .../functions/fnc_module_respawnpos.sqf | 11 +++++----- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 3f96671..da812ce 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -36,45 +36,47 @@ if ( !isnil "afi_aar2" ) then { if ((GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Sidetickets")) then { private _hashTickets = GVAR(tickets) - if (GVAR(enabled_west)) then { + private _enabledSideHash = GVAR(enabledSides); + + if (_enabledSideHash getOrDefault [west, false]) then { private _ticektsWest = _hashTickets get west; AAR_UPDATE("west","Side tickets", _ticektsWest); }; - if (GVAR(enabled_east)) then { + if (_enabledSideHash getOrDefault [east, false]) then { private _ticektsEast = _hashTickets get east; AAR_UPDATE("east","Side tickets", _ticektsEast); }; - if (GVAR(enabled_guer)) then { + if (_enabledSideHash getOrDefault [resistance, false]) then { private _ticektsResistance = _hashTickets get resistance; AAR_UPDATE("guer","Side tickets", _ticektsResistance); }; - if (GVAR(enabled_civ)) then { + if (_enabledSideHash getOrDefault [civilian, false]) then { private _ticektsCivilian = _hashTickets get civilian; AAR_UPDATE("civ","Side tickets", _ticektsCivilian); }; }; [{ - private _hashTime = GVAR(nextWaveTimes); - if (GVAR(enabled_west)) then { + private _enabledSideHash = GVAR(enabledSides); + if (_enabledSideHash getOrDefault [west, false]) then { private _time = (_hashTime get west); AAR_UPDATE("west","Next respawn wave", _time); }; - if (GVAR(enabled_east)) then { + if (_enabledSideHash getOrDefault [east, false]) then { private _time = (_hashTime get east); AAR_UPDATE("east","Next respawn wave", _time); }; - if (GVAR(enabled_guer)) then { + if (_enabledSideHash getOrDefault [resistance, false]) then { private _time = (_hashTime get resistance); AAR_UPDATE("guer","Next respawn wave", _time); }; - if (GVAR(enabled_civ)) then { + if (_enabledSideHash getOrDefault [civilian, false]) then { private _time = (_hashTime get civilian); AAR_UPDATE("civ","Next respawn wave", _time); }; diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index caaa00b..6e693c0 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -21,6 +21,9 @@ GVAR(tickets) = createHashMap; //Waiting area stuff GVAR(waitingArea) = createHashMap; +//Which side has respawn system started +GVAR(enabledSides) = createHashMapFromArray _emptyFalseArray; + //Respawn waiting area unit arrays GVAR(waitingRespawnList) = createHashMapFromArray _waitingRespawnEmptyArray; GVAR(waitingRespawnDelayedList) = createHashMapFromArray _waitingRespawnEmptyArray; diff --git a/addons/respawn/functions/fnc_module_respawnpos.sqf b/addons/respawn/functions/fnc_module_respawnpos.sqf index f496757..9e136dc 100644 --- a/addons/respawn/functions/fnc_module_respawnpos.sqf +++ b/addons/respawn/functions/fnc_module_respawnpos.sqf @@ -35,8 +35,7 @@ private ["_side", "_color"]; private _flag = objNull; switch (_markername) do { - case "tunres_respawn_west": { - missionNamespace setVariable [QGVAR(enabled_west),true, true]; + case "tunres_respawn_west": { _flag = "Flag_Blue_F" createVehicle _pos; GVAR(flag_west_spawn) = _flag; publicVariable QGVAR(flag_west_spawn); @@ -45,7 +44,6 @@ switch (_markername) do { }; case "tunres_respawn_east": { - missionNamespace setVariable [QGVAR(enabled_east),true, true]; _flag = "Flag_Red_F" createVehicle _pos; GVAR(flag_east_spawn) = _flag; publicVariable QGVAR(flag_east_spawn); @@ -54,7 +52,6 @@ switch (_markername) do { }; case "tunres_respawn_guerrila": { - missionNamespace setVariable [QGVAR(enabled_guer),true, true]; _flag = "Flag_Green_F" createVehicle _pos; GVAR(flag_guerrila_spawn) = _flag; publicVariable QGVAR(flag_guerrila_spawn); @@ -63,17 +60,19 @@ switch (_markername) do { }; case "tunres_respawn_civilian": { - missionNamespace setVariable [QGVAR(enabled_civ),true, true]; _flag = "Flag_White_F" createVehicle _pos; GVAR(flag_civilian_spawn) = _flag; publicVariable QGVAR(flag_civilian_spawn); _side = civilian; _color = "ColorCIV"; - }; }; +GVAR(enabledSides) set [_side, true]; +publicVariable QGVAR(enabledSides); GVAR(respawnPointsHash) set [_side, [_markername, _pos]]; +publicVariable QGVAR(respawnPointsHash); + ["RespawnPosLocal", _pos, "Respawn", "respawn_inf", _color, 1] remoteExecCall [QFUNC(createLocalMarker), _side, true]; ["MainBaseLocal", _pos, "Main Base", "mil_start", _color] remoteExecCall [QFUNC(createLocalMarker), _side, true]; From 422f31c18ace4687345948cc52edb3f6dda025a3 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 18:38:17 +0200 Subject: [PATCH 035/228] optimize localize --- addons/msp/XEH_preInit.sqf | 68 +++++------ addons/msp/functions/fnc_ace_actions.sqf | 4 +- addons/msp/functions/fnc_add_EH.sqf | 2 +- addons/msp/functions/fnc_contestedCheck.sqf | 4 +- addons/msp/functions/fnc_init_contested.sqf | 2 +- .../msp/functions/fnc_initate_msp_action.sqf | 4 +- addons/msp/functions/fnc_update_status.sqf | 4 +- addons/respawn/XEH_postInit_client.sqf | 2 +- addons/respawn/XEH_preInit.sqf | 112 +++++++++--------- .../functions/fnc_addActionsPlayer.sqf | 2 +- .../fnc_addCheckTicketCountAction.sqf | 4 +- .../functions/fnc_addTeleportAction.sqf | 4 +- .../functions/fnc_checkTicketCount.sqf | 2 +- .../functions/fnc_module_respawnpos.sqf | 4 +- addons/respawn/functions/fnc_moveRespawns.sqf | 2 +- .../respawn/functions/fnc_teleportButton.sqf | 4 +- .../functions/fnc_ticketCounterPlayer.sqf | 2 +- 17 files changed, 113 insertions(+), 113 deletions(-) diff --git a/addons/msp/XEH_preInit.sqf b/addons/msp/XEH_preInit.sqf index 3645b7b..9bca519 100644 --- a/addons/msp/XEH_preInit.sqf +++ b/addons/msp/XEH_preInit.sqf @@ -8,8 +8,8 @@ PREP_RECOMPILE_END; [ QGVAR(enable), "CHECKBOX", - ["STR_tunres_MSP_CBA_Enable" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_Enable" call BIS_fnc_localize], - "STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, + [localize "STR_tunres_MSP_CBA_Enable", localize "STR_tunres_MSP_CBA_tooltip_Enable"], + localize "STR_tunres_MSP_CBA_Category_main", false, 1, {}, @@ -19,8 +19,8 @@ PREP_RECOMPILE_END; [ QGVAR(allowCheckTicketsMSP), "CHECKBOX", - ["STR_tunres_MSP_CBA_allowCheckTicketsMSP" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_tooltip_CheckTickets" call BIS_fnc_localize], - "STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, + [localize "STR_tunres_MSP_CBA_allowCheckTicketsMSP", localize "STR_tunres_Respawn_CBA_tooltip_CheckTickets"], + localize "STR_tunres_MSP_CBA_Category_main", false, 1, {}, @@ -30,8 +30,8 @@ PREP_RECOMPILE_END; [ QGVAR(report_enemies), "CHECKBOX", - ["STR_tunres_MSP_CBA_report_enemies" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_report_enemies" call BIS_fnc_localize], - ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_contested" call BIS_fnc_localize], + [localize "STR_tunres_MSP_CBA_report_enemies", localize "STR_tunres_MSP_CBA_tooltip_report_enemies"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], true, 1, {}, @@ -41,8 +41,8 @@ PREP_RECOMPILE_END; [ QGVAR(report_enemies_interval), "SLIDER", - ["STR_tunres_MSP_CBA_report_enemies_intervala" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_report_enemies_interval" call BIS_fnc_localize], - ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_contested" call BIS_fnc_localize], + [localize "STR_tunres_MSP_CBA_report_enemies_intervala", localize "STR_tunres_MSP_CBA_tooltip_report_enemies_interval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], [1, 600, 30, 0], 1, { @@ -55,8 +55,8 @@ PREP_RECOMPILE_END; [ QGVAR(report_enemies_range), "SLIDER", - ["STR_tunres_MSP_CBA_report_enemies_range" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_report_enemies_range" call BIS_fnc_localize], - ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_contested" call BIS_fnc_localize], + [localize "STR_tunres_MSP_CBA_report_enemies_range", localize "STR_tunres_MSP_CBA_tooltip_report_enemies_range"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], [0, 5000, 500, 0], 1, { @@ -69,8 +69,8 @@ PREP_RECOMPILE_END; [ QGVAR(contested_radius_max), "SLIDER", - ["STR_tunres_MSP_CBA_contested_radius_max" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_contested_max" call BIS_fnc_localize], - ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_contested" call BIS_fnc_localize], + [localize "STR_tunres_MSP_CBA_contested_radius_max", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], [0, 3000, 500, 0], 1, { @@ -83,8 +83,8 @@ PREP_RECOMPILE_END; [ QGVAR(contested_radius_min), "SLIDER", - ["STR_tunres_MSP_CBA_contested_radius_min" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_contested_min" call BIS_fnc_localize], - ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_contested" call BIS_fnc_localize], + [localize "STR_tunres_MSP_CBA_contested_radius_min", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], [0, 3000, 200, 0], 1, { @@ -97,8 +97,8 @@ PREP_RECOMPILE_END; [ QGVAR(contested_check_interval), "SLIDER", - ["STR_tunres_MSP_CBA_contested_check_interval" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_contested_check_interval" call BIS_fnc_localize], - ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_contested" call BIS_fnc_localize], + [localize "STR_tunres_MSP_CBA_contested_check_interval", localize "STR_tunres_MSP_CBA_tooltip_contested_check_interval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], [1, 600, 30, 0], 1, { @@ -111,8 +111,8 @@ PREP_RECOMPILE_END; [ QGVAR(progresbar_time_setup), "SLIDER", - ["STR_tunres_MSP_CBA_setup_progresbar" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_setup_progresbar" call BIS_fnc_localize], - ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_progres" call BIS_fnc_localize], + [localize "STR_tunres_MSP_CBA_setup_progresbar", localize "STR_tunres_MSP_CBA_tooltip_setup_progresbar"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_progres"], [0, 60, 5, 0], 1, { @@ -125,8 +125,8 @@ PREP_RECOMPILE_END; [ QGVAR(progresbar_time_pack), "SLIDER", - ["STR_tunres_MSP_CBA_pack_progresbar" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_pack_progresbar" call BIS_fnc_localize], - ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_Category_progres" call BIS_fnc_localize], + [localize "STR_tunres_MSP_CBA_pack_progresbar", localize "STR_tunres_MSP_CBA_tooltip_pack_progresbar"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_progres"], [0, 60, 5, 0], 1, { @@ -139,8 +139,8 @@ PREP_RECOMPILE_END; [ QGVAR(clasnames_east), "EDITBOX", - ["STR_tunres_MSP_CBA_classname_east" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_classname" call BIS_fnc_localize], - ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_classname" call BIS_fnc_localize], + [localize "STR_tunres_MSP_CBA_classname_east", localize "STR_tunres_MSP_CBA_tooltip_classname"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], "O_Truck_03_transport_F", 1, {}, @@ -150,8 +150,8 @@ PREP_RECOMPILE_END; [ QGVAR(clasnames_west), "EDITBOX", - ["STR_tunres_MSP_CBA_classname_west" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_classname" call BIS_fnc_localize], - ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_classname" call BIS_fnc_localize], + [localize "STR_tunres_MSP_CBA_classname_west", localize "STR_tunres_MSP_CBA_tooltip_classname"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], "B_Truck_01_transport_F", 1, {}, @@ -161,8 +161,8 @@ PREP_RECOMPILE_END; [ QGVAR(clasnames_resistance), "EDITBOX", - ["STR_tunres_MSP_CBA_classname_resistance" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_classname" call BIS_fnc_localize], - ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_classname" call BIS_fnc_localize], + [localize "STR_tunres_MSP_CBA_classname_resistance", localize "STR_tunres_MSP_CBA_tooltip_classname"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], "I_Truck_02_transport_F", 1, {}, @@ -172,8 +172,8 @@ PREP_RECOMPILE_END; [ QGVAR(clasnames_civilian), "EDITBOX", - ["STR_tunres_MSP_CBA_classname_civilian" call BIS_fnc_localize, "STR_tunres_MSP_CBA_tooltip_classname" call BIS_fnc_localize], - ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_classname" call BIS_fnc_localize], + [localize "STR_tunres_MSP_CBA_classname_civilian", localize "STR_tunres_MSP_CBA_tooltip_classname"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], "C_Truck_02_transport_F", 1, {}, @@ -183,8 +183,8 @@ PREP_RECOMPILE_END; [ QGVAR(setupNotification), "LIST", - ["STR_tunres_MSP_CBA_whoGetsSetUpNotification" call BIS_fnc_localize, "STR_tunres_MSP_CBA_whoGetsSetUpNotification_Tooltip" call BIS_fnc_localize], - ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_notificationCategory" call BIS_fnc_localize], + [localize "STR_tunres_MSP_CBA_whoGetsSetUpNotification", localize "STR_tunres_MSP_CBA_whoGetsSetUpNotification_Tooltip"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_notificationCategory"], [[0, 1], ["Group Leaders", "Side"], 0], 1, {}, @@ -194,8 +194,8 @@ PREP_RECOMPILE_END; [ QGVAR(contestedNotification), "LIST", - ["STR_tunres_MSP_CBA_whoGetsContestedNotification" call BIS_fnc_localize, "STR_tunres_MSP_CBA_whoGetsContestedNotification_Tooltip" call BIS_fnc_localize], - ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_notificationCategory" call BIS_fnc_localize], + [localize "STR_tunres_MSP_CBA_whoGetsContestedNotification", localize "STR_tunres_MSP_CBA_whoGetsContestedNotification_Tooltip"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_notificationCategory"], [[0, 1], ["Group Leaders", "Side"], 0], 1, {}, @@ -205,8 +205,8 @@ PREP_RECOMPILE_END; [ QGVAR(reportEnemiesNotification), "LIST", - ["STR_tunres_MSP_CBA_whoGetsReportEnemiesNotification" call BIS_fnc_localize, "STR_tunres_MSP_CBA_whoGetsReportEnemies_Tooltip" call BIS_fnc_localize], - ["STR_tunres_MSP_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_MSP_CBA_notificationCategory" call BIS_fnc_localize], + [localize "STR_tunres_MSP_CBA_whoGetsReportEnemiesNotification", localize "STR_tunres_MSP_CBA_whoGetsReportEnemies_Tooltip"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_notificationCategory"], [[0, 1], ["Group Leaders", "Side"], 0], 1, {}, diff --git a/addons/msp/functions/fnc_ace_actions.sqf b/addons/msp/functions/fnc_ace_actions.sqf index 78fa1ea..46b649d 100644 --- a/addons/msp/functions/fnc_ace_actions.sqf +++ b/addons/msp/functions/fnc_ace_actions.sqf @@ -74,7 +74,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { private _tp_conditionText = " private _msp = missionNamespace getVariable ['%1', objNull]; private _status = _msp getVariable ['tunres_msp_isContested', false]; (_target isNotEqualTo _msp && _obj getVariable ['tunres_msp_isMSP', false] && !_status) "; _tp_conditionText = format [_tp_conditionText, _variable]; - [_entity, _tp_conditionText, "STR_tunres_MSP_TpText" call BIS_fnc_localize, false, nil, [playerSide], true, _menu_condition, false, ["ACE_MainActions","tunres_respawnAction"]] call tunres_Respawn_fnc_addCustomTeleporter; + [_entity, _tp_conditionText, localize "STR_tunres_MSP_TpText", false, nil, [playerSide], true, _menu_condition, false, ["ACE_MainActions","tunres_respawnAction"]] call tunres_Respawn_fnc_addCustomTeleporter; }, false, [], true] call CBA_fnc_addClassEventHandler; @@ -83,7 +83,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { [playerSide] call EFUNC(respawn,checkTicketCount); }; private _remaining_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; - _remainingTickets = ["STR_tunres_Respawn_CheckTickets" call BIS_fnc_localize, "STR_tunres_Respawn_CheckTickets" call BIS_fnc_localize, "\a3\modules_f_curator\data\portraitmissionname_ca.paa", _remaining_action, _remaining_condition] call ace_interact_menu_fnc_createAction; + _remainingTickets = [localize "STR_tunres_Respawn_CheckTickets", localize "STR_tunres_Respawn_CheckTickets", "\a3\modules_f_curator\data\portraitmissionname_ca.paa", _remaining_action, _remaining_condition] call ace_interact_menu_fnc_createAction; [_vehicle, 0, ["ACE_MainActions","tunres_respawnAction"], _remainingTickets] call ace_interact_menu_fnc_addActionToClass; }; } else { diff --git a/addons/msp/functions/fnc_add_EH.sqf b/addons/msp/functions/fnc_add_EH.sqf index 290e7cd..c4a0e88 100644 --- a/addons/msp/functions/fnc_add_EH.sqf +++ b/addons/msp/functions/fnc_add_EH.sqf @@ -84,7 +84,7 @@ [_side, false] remoteExecCall ["tunres_respawn_fnc_update_respawn_point", 2]; - ("STR_tunres_MSP_destroyed" call BIS_fnc_localize) remoteExecCall ["CBA_fnc_notify", _side]; + (localize "STR_tunres_MSP_destroyed") remoteExecCall ["CBA_fnc_notify", _side]; }; }; diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index b80bdf4..98effc2 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -64,10 +64,10 @@ private _allunits = allUnits select {(side _x) in [west,east,resistance,civilian if (count _whoToNotify > 0 ) then { if (_isContested) then { [_side, false] call EFUNC(respawn,update_respawn_point); - (call compile ("STR_tunres_MSP_FNC_Contested_hint" call BIS_fnc_localize)) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; + (call compile (localize "STR_tunres_MSP_FNC_Contested_hint")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; } else { [_side, true, (getPos _msp) ] call EFUNC(respawn,update_respawn_point); - (call compile ("STR_tunres_MSP_FNC_secured_hint" call BIS_fnc_localize)) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; + (call compile (localize "STR_tunres_MSP_FNC_secured_hint")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; }; }; }; diff --git a/addons/msp/functions/fnc_init_contested.sqf b/addons/msp/functions/fnc_init_contested.sqf index 6de60a2..803651f 100644 --- a/addons/msp/functions/fnc_init_contested.sqf +++ b/addons/msp/functions/fnc_init_contested.sqf @@ -34,7 +34,7 @@ if (_enemyCount > 0 && !_isContested) then { private _whoToNotify = [_side] call FUNC(whoToNotify); if (count _whoToNotify > 0 ) then { - ("STR_tunres_MSP_FNC_enemies_near" call BIS_fnc_localize) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; + (localize "STR_tunres_MSP_FNC_enemies_near") remoteExecCall ["CBA_fnc_notify", _whoToNotify]; }; }; }; diff --git a/addons/msp/functions/fnc_initate_msp_action.sqf b/addons/msp/functions/fnc_initate_msp_action.sqf index 8897500..e7473e8 100644 --- a/addons/msp/functions/fnc_initate_msp_action.sqf +++ b/addons/msp/functions/fnc_initate_msp_action.sqf @@ -21,11 +21,11 @@ private ["_text", "_time", "_conditio"]; private _statusvar = format ["%1_%2", QGVAR(status), playerSide]; if (_setup) then { - _text = "STR_tunres_MSP_fnc_initate_msp_action_setting" call BIS_fnc_localize; + _text = localize "STR_tunres_MSP_fnc_initate_msp_action_setting"; _conditio = { !(missionNamespace getVariable (_this select 0 select 1)) }; _time = GVAR(progresbar_time_setup); } else { - _text = "STR_tunres_MSP_fnc_initate_msp_action_packing" call BIS_fnc_localize; + _text = localize "STR_tunres_MSP_fnc_initate_msp_action_packing"; _conditio = { missionNamespace getVariable (_this select 0 select 1) }; _time = GVAR(progresbar_time_pack); }; diff --git a/addons/msp/functions/fnc_update_status.sqf b/addons/msp/functions/fnc_update_status.sqf index e3f6709..0dcb026 100644 --- a/addons/msp/functions/fnc_update_status.sqf +++ b/addons/msp/functions/fnc_update_status.sqf @@ -26,7 +26,7 @@ AAR_UPDATE(_msp,"Is active MSP", _setup); if (_setup) then { if (count _whoToNotify > 0 ) then { - (call compile ("STR_tunres_MSP_FNC_setup_notification" call BIS_fnc_localize)) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; + (call compile (localize "STR_tunres_MSP_FNC_setup_notification")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; }; [_msp] remoteExecCall [QFUNC(create_msp_props), 2]; @@ -44,7 +44,7 @@ if (_setup) then { } else { if (count _whoToNotify > 0 ) then { - (call compile ("STR_tunres_MSP_FNC_pack_notification" call BIS_fnc_localize)) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; + (call compile (localize "STR_tunres_MSP_FNC_pack_notification")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; }; //Delete props { diff --git a/addons/respawn/XEH_postInit_client.sqf b/addons/respawn/XEH_postInit_client.sqf index 1796e0f..ce44c17 100644 --- a/addons/respawn/XEH_postInit_client.sqf +++ b/addons/respawn/XEH_postInit_client.sqf @@ -31,7 +31,7 @@ if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (I _return }; - private _action = ["TpMenu","STR_tunres_Respawn_TeleportMenu" call BIS_fnc_localize,"\a3\3den\data\cfg3den\history\changeattributes_ca.paa",{ [GVAR(selfTPmenuOpenObj)] call FUNC(openTeleportMenu) }, _conditio] call ace_interact_menu_fnc_createAction; + private _action = ["TpMenu", localize "STR_tunres_Respawn_TeleportMenu","\a3\3den\data\cfg3den\history\changeattributes_ca.paa",{ [GVAR(selfTPmenuOpenObj)] call FUNC(openTeleportMenu) }, _conditio] call ace_interact_menu_fnc_createAction; [(typeOf player), 1, ["ACE_SelfActions"], _action] call ace_interact_menu_fnc_addActionToClass; //Add respawn eh diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index 6e693c0..9fc5331 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -51,8 +51,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(enable), // Unique setting name. Matches resulting variable name "CHECKBOX", // Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" - ["STR_tunres_Respawn_CBA_Enable" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_tooltip_Enable" call BIS_fnc_localize], // Display name or display name + tooltip (optional, default: same as setting name) - "STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, // Category for the settings menu + optional sub-category + [localize "STR_tunres_Respawn_CBA_Enable", localize "STR_tunres_Respawn_CBA_tooltip_Enable"], // Display name or display name + tooltip (optional, default: same as setting name) + localize "STR_tunres_Respawn_CBA_Category_main", // Category for the settings menu + optional sub-category false, // Extra properties of the setting depending of _settingType. 1, // 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) {}, // Script to execute when setting is changed. (optional) @@ -62,8 +62,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(killJIP), "CHECKBOX", - ["Kill JIP", "STR_tunres_Respawn_CBA_tooltip_killjip" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_generic" call BIS_fnc_localize], + ["Kill JIP", localize "STR_tunres_Respawn_CBA_tooltip_killjip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], true, 1, {}, @@ -73,8 +73,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(killJIP_time), "SLIDER", - ["Kill JIP Time", "STR_tunres_Respawn_CBA_tooltip_killjip_time" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_generic" call BIS_fnc_localize], + ["Kill JIP Time", localize "STR_tunres_Respawn_CBA_tooltip_killjip_time"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], [1, 300, 20, 0], 1, { @@ -87,8 +87,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(respawn_type), "LIST", - ["Respawn Type", "STR_tunres_Respawn_CBA_tooltip_respawntypes" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_generic" call BIS_fnc_localize], + ["Respawn Type", localize "STR_tunres_Respawn_CBA_tooltip_respawntypes"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], [[localize "STR_tunres_Respawn_Type_Default", localize "STR_tunres_Respawn_Type_Sidetickets", localize "STR_tunres_Respawn_Type_Playertickets"], [localize "STR_tunres_Respawn_Type_Default", localize "STR_tunres_Respawn_Type_Sidetickets", localize "STR_tunres_Respawn_Type_Playertickets"], 0], 1, {}, @@ -98,8 +98,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(gearscriptType), "LIST", - ["Gearscript type", "STR_tunres_Respawn_CBA_tooltip_gearscript" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_generic" call BIS_fnc_localize], + ["Gearscript type", localize "STR_tunres_Respawn_CBA_tooltip_gearscript"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], [["SQF Gearscript", "Potato Tool", "Save gear"], ["SQF Gearscript", "Potato Tool", "Save gear"], 0], 1, {}, @@ -109,8 +109,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(forced_respawn), "CHECKBOX", - ["Only Forced Waves", "STR_tunres_Respawn_CBA_tooltip_forceRespawn" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_generic" call BIS_fnc_localize], + ["Only Forced Waves", localize "STR_tunres_Respawn_CBA_tooltip_forceRespawn"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], false, 1, {}, @@ -120,8 +120,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(delayed_respawn), "SLIDER", - ["Delayed respawn", "STR_tunres_Respawn_CBA_tooltip_delayed_respawn" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_generic" call BIS_fnc_localize], + ["Delayed respawn", localize "STR_tunres_Respawn_CBA_tooltip_delayed_respawn"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], [0, 100, 0, 0], 1, { @@ -134,8 +134,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(waiting_area_range), "SLIDER", - ["Waiting Area Range", "STR_tunres_Respawn_CBA_tooltip_waiting_area_range" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_generic" call BIS_fnc_localize], + ["Waiting Area Range", localize "STR_tunres_Respawn_CBA_tooltip_waiting_area_range"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], [30, 300, 100, 0], 1, { @@ -149,8 +149,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(time_west), "SLIDER", - ["West", "STR_tunres_Respawn_CBA_tooltip_time" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_time" call BIS_fnc_localize], + ["West", localize "STR_tunres_Respawn_CBA_tooltip_time"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], [1, 60, 15, 0], 1, { @@ -163,8 +163,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(time_east), "SLIDER", - ["East", "STR_tunres_Respawn_CBA_tooltip_time" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_time" call BIS_fnc_localize], + ["East", localize "STR_tunres_Respawn_CBA_tooltip_time"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], [1, 60, 15, 0], 1, { @@ -177,8 +177,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(time_guer), "SLIDER", - ["Resistance", "STR_tunres_Respawn_CBA_tooltip_time" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_time" call BIS_fnc_localize], + ["Resistance", localize "STR_tunres_Respawn_CBA_tooltip_time"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], [1, 60, 15, 0], 1, { @@ -191,8 +191,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(time_civ), "SLIDER", - ["Civilian", "STR_tunres_Respawn_CBA_tooltip_time" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_time" call BIS_fnc_localize], + ["Civilian", localize "STR_tunres_Respawn_CBA_tooltip_time"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], [1, 60, 15, 0], 1, { @@ -206,8 +206,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(spectate_Cameramode_1st), "CHECKBOX", - ["1st", "STR_tunres_Respawn_CBA_tooltip_specta_modes" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_spectate_cameramode" call BIS_fnc_localize], + ["1st", localize "STR_tunres_Respawn_CBA_tooltip_specta_modes"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], true, 1, {}, @@ -217,8 +217,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(spectate_Cameramode_3th), "CHECKBOX", - ["3th", "STR_tunres_Respawn_CBA_tooltip_specta_modes" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_spectate_cameramode" call BIS_fnc_localize], + ["3th", localize "STR_tunres_Respawn_CBA_tooltip_specta_modes"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], true, 1, {}, @@ -228,8 +228,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(spectate_Cameramode_free), "CHECKBOX", - ["Free", "STR_tunres_Respawn_CBA_tooltip_specta_modes" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_spectate_cameramode" call BIS_fnc_localize], + ["Free", localize "STR_tunres_Respawn_CBA_tooltip_specta_modes"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], true, 1, {}, @@ -240,8 +240,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(tickets_west), "SLIDER", - ["West", "STR_tunres_Respawn_CBA_tooltip_ticket" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_ticketcount" call BIS_fnc_localize], + ["West", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], [0, 1000, 0, 0], 1, { @@ -254,8 +254,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(tickets_east), "SLIDER", - ["East", "STR_tunres_Respawn_CBA_tooltip_ticket" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_ticketcount" call BIS_fnc_localize], + ["East", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], [0, 1000, 0, 0], 1, { @@ -268,8 +268,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(tickets_guer), "SLIDER", - ["Resistance", "STR_tunres_Respawn_CBA_tooltip_ticket" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_ticketcount" call BIS_fnc_localize], + ["Resistance", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], [0, 1000, 0, 0], 1, { @@ -282,8 +282,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(tickets_civ), "SLIDER", - ["Civilian", "STR_tunres_Respawn_CBA_tooltip_ticket" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_ticketcount" call BIS_fnc_localize], + ["Civilian", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], [0, 1000, 0, 0], 1, { @@ -296,8 +296,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(allowCheckTicketsBase), "CHECKBOX", - ["Main base", "STR_tunres_Respawn_CBA_tooltip_CheckTickets" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_checkTickets" call BIS_fnc_localize], + ["Main base", localize "STR_tunres_Respawn_CBA_tooltip_CheckTickets"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_checkTickets"], false, 1, {}, @@ -308,8 +308,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(briefingEnable), "CHECKBOX", - ["STR_tunres_Respawn_CBA_Briefing_Enable" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Briefing_Enable_tooltip" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], + [localize "STR_tunres_Respawn_CBA_Briefing_Enable", localize "STR_tunres_Respawn_CBA_Briefing_Enable_tooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], true, 1, {}, @@ -319,8 +319,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(briefingEnableShowRespawnType), "CHECKBOX", - ["STR_tunres_Respawn_CBA_Briefing_Enable_ShowRespawType" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Briefing_Enable_ShowRespawType_tooltip" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], + [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowRespawType", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowRespawType_tooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], true, 1, {}, @@ -330,8 +330,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(briefingEnableShowTickets), "CHECKBOX", - ["STR_tunres_Respawn_CBA_Briefing_Enable_ShowTickets" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTickets_tooltip" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], + [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTickets", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTickets_tooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], true, 1, {}, @@ -341,8 +341,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(briefingEnableShowTime), "CHECKBOX", - ["STR_tunres_Respawn_CBA_Briefing_Enable_ShowTime" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTime_tooltip" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], + [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTime", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTime_tooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], true, 1, {}, @@ -352,8 +352,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(briefingEnableShowOtherSidesDataWest), "CHECKBOX", - ["STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_West" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], + [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_West", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], true, 1, {}, @@ -363,8 +363,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(briefingEnableShowOtherSidesDataEast), "CHECKBOX", - ["STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_East" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], + [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_East", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], true, 1, {}, @@ -374,8 +374,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(briefingEnableShowOtherSidesDataResistance), "CHECKBOX", - ["STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_Resistance" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], + [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_Resistance", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], true, 1, {}, @@ -385,8 +385,8 @@ GVAR(selfTPmenuOpenObj) = objNull; [ QGVAR(briefingEnableShowOtherSidesDataCivilian), "CHECKBOX", - ["STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_Civilian" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip" call BIS_fnc_localize], - ["STR_tunres_Respawn_CBA_Category_main" call BIS_fnc_localize, "STR_tunres_Respawn_CBA_Category_Briefing" call BIS_fnc_localize], + [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_Civilian", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], false, 1, {}, diff --git a/addons/respawn/functions/fnc_addActionsPlayer.sqf b/addons/respawn/functions/fnc_addActionsPlayer.sqf index ec3c5f2..336aada 100644 --- a/addons/respawn/functions/fnc_addActionsPlayer.sqf +++ b/addons/respawn/functions/fnc_addActionsPlayer.sqf @@ -27,4 +27,4 @@ private _chekTime = ["Check Respawn Time", "Check Respawn Time", "\a3\modules_f_ // Add tp action private _conditio = "count (missionNamespace getVariable ['tunres_respawn_teleportPoints', []]) > 1" ; -[_object, "true", "STR_tunres_Respawn_MainBaseText" call BIS_fnc_localize, false, nil, [playerSide], true, _conditio, false, _actionPath] call FUNC(addCustomTeleporter); \ No newline at end of file +[_object, "true", localize "STR_tunres_Respawn_MainBaseText", false, nil, [playerSide], true, _conditio, false, _actionPath] call FUNC(addCustomTeleporter); \ No newline at end of file diff --git a/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf b/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf index 77eac85..79eacd1 100644 --- a/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf +++ b/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf @@ -23,9 +23,9 @@ if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Default") exi }; if (_useAceAction) then { - private _action = ["CheckTickets", "STR_tunres_Respawn_CheckTickets" call BIS_fnc_localize,"\a3\modules_f_curator\data\portraitmissionname_ca.paa",{ [playerSide] call FUNC(checkTicketCount); }, {true}, nil, nil, _offset] call ace_interact_menu_fnc_createAction; + private _action = ["CheckTickets", localize "STR_tunres_Respawn_CheckTickets","\a3\modules_f_curator\data\portraitmissionname_ca.paa",{ [playerSide] call FUNC(checkTicketCount); }, {true}, nil, nil, _offset] call ace_interact_menu_fnc_createAction; [_object, 0, _parrenPath, _action] call ace_interact_menu_fnc_addActionToObject; } else { - _object addAction ["STR_tunres_Respawn_CheckTickets" call BIS_fnc_localize, { [playerSide] call FUNC(checkTicketCount) }, [], 10, true, true, "", "true", 10]; + _object addAction [localize "STR_tunres_Respawn_CheckTickets", { [playerSide] call FUNC(checkTicketCount) }, [], 10, true, true, "", "true", 10]; }; diff --git a/addons/respawn/functions/fnc_addTeleportAction.sqf b/addons/respawn/functions/fnc_addTeleportAction.sqf index 72d3a78..79a2c7c 100644 --- a/addons/respawn/functions/fnc_addTeleportAction.sqf +++ b/addons/respawn/functions/fnc_addTeleportAction.sqf @@ -24,13 +24,13 @@ if (_useAceAction) then { _statement = { params ["_obj", "_menuOpenConditio", "_actionPath"]; _menuOpenConditio = compile _menuOpenConditio; - private _action = ["TpMenu", "STR_tunres_Respawn_TeleportMenu" call BIS_fnc_localize,"\a3\3den\data\cfg3den\history\changeattributes_ca.paa",{ [_target] call FUNC(openTeleportMenu) }, _menuOpenConditio] call ace_interact_menu_fnc_createAction; + private _action = ["TpMenu", localize "STR_tunres_Respawn_TeleportMenu","\a3\3den\data\cfg3den\history\changeattributes_ca.paa",{ [_target] call FUNC(openTeleportMenu) }, _menuOpenConditio] call ace_interact_menu_fnc_createAction; [_obj, 0, _actionPath, _action] call ace_interact_menu_fnc_addActionToObject; }; } else { _statement = { params ["_obj", "_menuOpenConditio"]; - _obj addAction ["STR_tunres_Respawn_TeleportMenuVanilla" call BIS_fnc_localize, { [_this select 0] call FUNC(openTeleportMenu) }, [], 10, true, true, "", _menuOpenConditio, 10] + _obj addAction [localize "STR_tunres_Respawn_TeleportMenuVanilla", { [_this select 0] call FUNC(openTeleportMenu) }, [], 10, true, true, "", _menuOpenConditio, 10] }; }; diff --git a/addons/respawn/functions/fnc_checkTicketCount.sqf b/addons/respawn/functions/fnc_checkTicketCount.sqf index f650574..93ba2ec 100644 --- a/addons/respawn/functions/fnc_checkTicketCount.sqf +++ b/addons/respawn/functions/fnc_checkTicketCount.sqf @@ -17,7 +17,7 @@ params [["_side", nil, [west]]]; if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Sidetickets") then { _ticetCount = GVAR(tickets) get _side; - _text = format["%1 %2","STR_tunres_Respawn_RemainingTicketsText" call BIS_fnc_localize, _ticetCount]; + _text = format["%1 %2",localize "STR_tunres_Respawn_RemainingTicketsText", _ticetCount]; _text call CBA_fnc_notify; } else { [playerSide, player, true] remoteExecCall [QFUNC(getPlayerTicketCount),2]; diff --git a/addons/respawn/functions/fnc_module_respawnpos.sqf b/addons/respawn/functions/fnc_module_respawnpos.sqf index 9e136dc..c423bcb 100644 --- a/addons/respawn/functions/fnc_module_respawnpos.sqf +++ b/addons/respawn/functions/fnc_module_respawnpos.sqf @@ -20,7 +20,7 @@ private _logic = param [0,objNull,[objNull]]; private _markername = _logic getVariable ["respawn_side","none"]; private _pos = getPos _logic; -if (_markername isEqualTo "none") exitWith { hint "STR_tunres_Respawn_Module_RespanPos_novalue" call BIS_fnc_localize; false }; // Exit if no side +if (_markername isEqualTo "none") exitWith { hint localize "STR_tunres_Respawn_Module_RespanPos_novalue"; false }; // Exit if no side private _marker = ""; if (getMarkerColor _markername isEqualTo "") then { @@ -28,7 +28,7 @@ if (getMarkerColor _markername isEqualTo "") then { _marker setMarkerType "Empty"; } else { - hint format [("STR_tunres_Respawn_Module_RespanPos_MultipleMarkers" call BIS_fnc_localize), _markername]; + hint format [(localize "STR_tunres_Respawn_Module_RespanPos_MultipleMarkers"), _markername]; }; private ["_side", "_color"]; diff --git a/addons/respawn/functions/fnc_moveRespawns.sqf b/addons/respawn/functions/fnc_moveRespawns.sqf index 3096fac..bdb9c52 100644 --- a/addons/respawn/functions/fnc_moveRespawns.sqf +++ b/addons/respawn/functions/fnc_moveRespawns.sqf @@ -82,7 +82,7 @@ if (count _waitingRespawn > 0) then { }; _unit setVariable [QGVAR(waiting_respawn), false, true]; - private _text = "STR_tunres_Respawn_FNC_moveRespawns" call BIS_fnc_localize; + private _text = localize "STR_tunres_Respawn_FNC_moveRespawns"; [_unit, _respawn_position, _text, 20] call FUNC(teleport); remoteExecCall [QFUNC(addGear), _unit]; [QGVAR(EH_unitRespawned), [_unit], _unit] call CBA_fnc_localEvent; diff --git a/addons/respawn/functions/fnc_teleportButton.sqf b/addons/respawn/functions/fnc_teleportButton.sqf index 084e61d..193bbf2 100644 --- a/addons/respawn/functions/fnc_teleportButton.sqf +++ b/addons/respawn/functions/fnc_teleportButton.sqf @@ -29,12 +29,12 @@ private _teleportConditio = call compile (_teleportConditioText); private _teleportName = _obj getVariable [QGVAR(teleportName), "TP"]; private _destination = getpos _obj; -private _text = format["%1 %2", "STR_tunres_Respawn_Teleporting" call BIS_fnc_localize, _teleportName]; +private _text = format["%1 %2", localize "STR_tunres_Respawn_Teleporting", _teleportName]; if (_teleportConditio) then { closeDialog 2; GVAR(tpMenuOpenedFrom) = objNull; [player, _destination, _text, 10] call FUNC(teleport); } else { - ("STR_tunres_Respawn_Teleport_Disabled" call BIS_fnc_localize) call CBA_fnc_notify; + (localize "STR_tunres_Respawn_Teleport_Disabled") call CBA_fnc_notify; }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_ticketCounterPlayer.sqf b/addons/respawn/functions/fnc_ticketCounterPlayer.sqf index b7e2a0b..2376ca0 100644 --- a/addons/respawn/functions/fnc_ticketCounterPlayer.sqf +++ b/addons/respawn/functions/fnc_ticketCounterPlayer.sqf @@ -31,7 +31,7 @@ if ( _remainingTickets > 0 ) then { _hash set [_playerUID, _remainingTickets]; }; [5] remoteExecCall ["setPlayerRespawnTime", _player]; - private _text = format["%1 %2","STR_tunres_Respawn_RemainingTicketsText" call BIS_fnc_localize, str _remainingTickets]; + private _text = format["%1 %2",localize "STR_tunres_Respawn_RemainingTicketsText", str _remainingTickets]; _text remoteExecCall ["CBA_fnc_notify", _player]; } else { From ff9b8880e120118f472dd4b2f7f5f8e83a879222 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 19:17:40 +0200 Subject: [PATCH 036/228] Rename function tunres_Respawn_fnc_ticketCounterPlayer -> tunres_Respawn_fnc_bleedPlayerTicketCountOnDeath --- ...tCounterPlayer.sqf => fnc_bleedPlayerTicketCountOnDeath.sqf} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename addons/respawn/functions/{fnc_ticketCounterPlayer.sqf => fnc_bleedPlayerTicketCountOnDeath.sqf} (93%) diff --git a/addons/respawn/functions/fnc_ticketCounterPlayer.sqf b/addons/respawn/functions/fnc_bleedPlayerTicketCountOnDeath.sqf similarity index 93% rename from addons/respawn/functions/fnc_ticketCounterPlayer.sqf rename to addons/respawn/functions/fnc_bleedPlayerTicketCountOnDeath.sqf index 2376ca0..2612a7e 100644 --- a/addons/respawn/functions/fnc_ticketCounterPlayer.sqf +++ b/addons/respawn/functions/fnc_bleedPlayerTicketCountOnDeath.sqf @@ -11,7 +11,7 @@ * None * * Example: - * [side, player] call tunres_Respawn_fnc_ticketCounterPlayer + * [side, player] call tunres_Respawn_fnc_bleedPlayerTicketCountOnDeath */ #include "script_component.hpp" params ["_side","_player"]; From 380b266aa4862d7702ad29744b40152d9c1df265 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 19:18:12 +0200 Subject: [PATCH 037/228] rename function tunres_Respawn_fnc_decreaseSideTicketCountOnDeath -> tunres_Respawn_fnc_bleedSideTicketCountOnDeath --- ...cketCountOnDeath.sqf => fnc_bleedSideTicketCountOnDeath.sqf} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename addons/respawn/functions/{fnc_decreaseSideTicketCountOnDeath.sqf => fnc_bleedSideTicketCountOnDeath.sqf} (93%) diff --git a/addons/respawn/functions/fnc_decreaseSideTicketCountOnDeath.sqf b/addons/respawn/functions/fnc_bleedSideTicketCountOnDeath.sqf similarity index 93% rename from addons/respawn/functions/fnc_decreaseSideTicketCountOnDeath.sqf rename to addons/respawn/functions/fnc_bleedSideTicketCountOnDeath.sqf index 85aef0a..5cb654f 100644 --- a/addons/respawn/functions/fnc_decreaseSideTicketCountOnDeath.sqf +++ b/addons/respawn/functions/fnc_bleedSideTicketCountOnDeath.sqf @@ -11,7 +11,7 @@ * None * * Example: - * [side, player] call tunres_Respawn_fnc_decreaseSideTicketCountOnDeath + * [side, player] call tunres_Respawn_fnc_bleedSideTicketCountOnDeath */ #include "script_component.hpp" params ["_side","_player"]; From 42bbc1791373a102e31de69ad96d8b3768671771 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 19:18:31 +0200 Subject: [PATCH 038/228] Rename function tunres_Respawn_fnc_teleport -> tunres_Respawn_fnc_teleportUnit --- .../{fnc_teleport.sqf => fnc_teleportUnit.sqf} | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) rename addons/respawn/functions/{fnc_teleport.sqf => fnc_teleportUnit.sqf} (71%) diff --git a/addons/respawn/functions/fnc_teleport.sqf b/addons/respawn/functions/fnc_teleportUnit.sqf similarity index 71% rename from addons/respawn/functions/fnc_teleport.sqf rename to addons/respawn/functions/fnc_teleportUnit.sqf index 5ff98fe..78e1aab 100644 --- a/addons/respawn/functions/fnc_teleport.sqf +++ b/addons/respawn/functions/fnc_teleportUnit.sqf @@ -12,18 +12,29 @@ * The return true when done * * Example: - * [_unit, _destination, _text, _range] call tunres_Respawn_fnc_teleport + * [_unit, _destination, _text, _range] call tunres_Respawn_fnc_teleportUnit */ #include "script_component.hpp" params [["_unit", objNull, [objNull]], ["_destination", [0,0,0], [[]]], ["_text", "", [""]], - ["_range", 10, [0]] + ["_range", 10, [0]], + ["_godMode", false, [false], + ["_godModeLenght", 30, [0]]] ]; -[_text, 10] remoteExecCall [QFUNC(blackscreen), _unit]; // make player screen black and prevent them moving right away so server can keep up. +if (_godMode) then { + player allowDamage true; + LOG("Enable god mode"); + [{ + player allowDamage false; + LOG("Disable god mode"); + }, [], _godModeLenght] call CBA_fnc_waitAndExecute; +}; +[_text, 10] remoteExecCall [QFUNC(blackscreen), _unit]; // make player screen black and prevent them moving right away so server can keep up. +cba_fnc_waitAndExe _unit setPos ([_destination, _range] call CBA_fnc_randPos); [QGVAR(EH_unitTeleported), [_unit, _destination]] call CBA_fnc_serverEvent; From 788b21b8c148bc095a38bcb1bcc712712fa2cc00 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 19:19:07 +0200 Subject: [PATCH 039/228] Update description --- .../fnc_addCheckTicketCountAction.sqf | 2 +- .../respawn/functions/fnc_checkTicketCount.sqf | 3 +-- .../functions/fnc_createLocalMarker.sqf | 18 +++++++++--------- .../functions/fnc_teleportOnLBSelChanged.sqf | 14 ++++---------- 4 files changed, 15 insertions(+), 22 deletions(-) diff --git a/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf b/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf index 79eacd1..2b4a08f 100644 --- a/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf +++ b/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf @@ -28,4 +28,4 @@ if (_useAceAction) then { } else { _object addAction [localize "STR_tunres_Respawn_CheckTickets", { [playerSide] call FUNC(checkTicketCount) }, [], 10, true, true, "", "true", 10]; -}; +}; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_checkTicketCount.sqf b/addons/respawn/functions/fnc_checkTicketCount.sqf index 93ba2ec..fd2702a 100644 --- a/addons/respawn/functions/fnc_checkTicketCount.sqf +++ b/addons/respawn/functions/fnc_checkTicketCount.sqf @@ -21,5 +21,4 @@ if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Sidetickets") _text call CBA_fnc_notify; } else { [playerSide, player, true] remoteExecCall [QFUNC(getPlayerTicketCount),2]; -}; - +}; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_createLocalMarker.sqf b/addons/respawn/functions/fnc_createLocalMarker.sqf index ec62156..a89549d 100644 --- a/addons/respawn/functions/fnc_createLocalMarker.sqf +++ b/addons/respawn/functions/fnc_createLocalMarker.sqf @@ -1,23 +1,23 @@ /* * Author: [Tuntematon] * [Description] + * Create local marker. * * Arguments: - * 0: The first argument - * 1: The second argument - * 2: Multiple input types - * 3: Optional input (default: true) - * 4: Optional input with multiple types (default: {true}) - * 5: Not mandatory input (default: nil) + * 0: Marker name + * 1: Position + * 2: Marker text + * 3: Icon + * 4: Color + * 5: Alpha * * Return Value: - * The return value * * Example: - * ["something", player] call tunres_Respawn_fnc_createLocalMarker + * ["RespawnPosLocal", _pos, "Respawn", "respawn_inf", _color, 1] call tunres_Respawn_fnc_createLocalMarker */ #include "script_component.hpp" -params ["_name", "_pos", "_text", "_icon", "_color", ["_alpha", 0]]; +params [["_name", nil [""]], ["_pos", nil [[]]], ["_text", nil [""]], ["_icon", nil [""]], ["_color", nil [""]], ["_alpha", 0, [0]]]; if (!hasInterface) exitWith {}; private _marker = createMarkerLocal [_name, _pos]; diff --git a/addons/respawn/functions/fnc_teleportOnLBSelChanged.sqf b/addons/respawn/functions/fnc_teleportOnLBSelChanged.sqf index ff27d5b..f1bf0b6 100644 --- a/addons/respawn/functions/fnc_teleportOnLBSelChanged.sqf +++ b/addons/respawn/functions/fnc_teleportOnLBSelChanged.sqf @@ -3,20 +3,14 @@ * [Description] * * Arguments: - * 0: The first argument - * 1: The second argument - * 2: Multiple input types - * 3: Optional input (default: true) - * 4: Optional input with multiple types (default: {true}) - * 5: Not mandatory input (default: nil) + * 0: Control + * 1: Index * * Return Value: - * The return value + * None * * Example: - * ["something", player] call tunres_Respawn_fnc_teleportOnLBSelChanged - * - * Public: [Yes/No] + * [_control, _selectedIndex] call tunres_Respawn_fnc_teleportOnLBSelChanged */ #include "script_component.hpp" params ["_control", "_selectedIndex"]; From 47919a596bf00448d83a7c00ac5a1c09234f3cf9 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 19:19:44 +0200 Subject: [PATCH 040/228] Add god mode to teleport --- addons/respawn/functions/fnc_moveRespawns.sqf | 10 ++++++++-- addons/respawn/functions/fnc_teleportButton.sqf | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/addons/respawn/functions/fnc_moveRespawns.sqf b/addons/respawn/functions/fnc_moveRespawns.sqf index bdb9c52..7663963 100644 --- a/addons/respawn/functions/fnc_moveRespawns.sqf +++ b/addons/respawn/functions/fnc_moveRespawns.sqf @@ -59,9 +59,12 @@ if (count _waitingRespawn > 0) then { //when done, remove and move delayed units to main var if ((count _unitList) isEqualTo 0) exitWith { + [_handle] call CBA_fnc_removePerFrameHandler; + private _waitingRespawnDelayedHash = GVAR(waitingRespawnDelayedList); private _waitingRespawnDelayed = _waitingRespawnDelayedHash get _side; + { private _unit = _x; _unit setVariable [QGVAR(skip_next_wave), false, true]; @@ -75,16 +78,19 @@ if (count _waitingRespawn > 0) then { }; private _unit = _unitList select 0; - _unitList deleteAt 0; + if (isnull _unit || !(_unit in allPlayers) || !alive _unit ) exitWith { _waitingRespawnHash set [_side, _unitList]; }; _unit setVariable [QGVAR(waiting_respawn), false, true]; private _text = localize "STR_tunres_Respawn_FNC_moveRespawns"; - [_unit, _respawn_position, _text, 20] call FUNC(teleport); + + [_unit, _respawn_position, _text, 20, true] call FUNC(teleportUnit); + remoteExecCall [QFUNC(addGear), _unit]; + [QGVAR(EH_unitRespawned), [_unit], _unit] call CBA_fnc_localEvent; }, 0.2, [_respawn_position, _side]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/respawn/functions/fnc_teleportButton.sqf b/addons/respawn/functions/fnc_teleportButton.sqf index 193bbf2..52fa331 100644 --- a/addons/respawn/functions/fnc_teleportButton.sqf +++ b/addons/respawn/functions/fnc_teleportButton.sqf @@ -34,7 +34,7 @@ private _text = format["%1 %2", localize "STR_tunres_Respawn_Teleporting", _tele if (_teleportConditio) then { closeDialog 2; GVAR(tpMenuOpenedFrom) = objNull; - [player, _destination, _text, 10] call FUNC(teleport); + [player, _destination, _text, 10, true] call FUNC(teleportUnit); } else { (localize "STR_tunres_Respawn_Teleport_Disabled") call CBA_fnc_notify; }; \ No newline at end of file From 8294d81f209f0a8db5d802e3e8fb9699854abd29 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 19:19:54 +0200 Subject: [PATCH 041/228] Function update --- addons/respawn/functions/fnc_onPlayerKilled.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/respawn/functions/fnc_onPlayerKilled.sqf b/addons/respawn/functions/fnc_onPlayerKilled.sqf index 7055fcf..382163d 100644 --- a/addons/respawn/functions/fnc_onPlayerKilled.sqf +++ b/addons/respawn/functions/fnc_onPlayerKilled.sqf @@ -24,11 +24,11 @@ if (GVAR(endRespawns)) exitWith { switch (GVAR(respawn_type)) do { case localize "STR_tunres_Respawn_Type_Sidetickets": { - [playerSide, player] remoteExecCall [QFUNC(decreaseSideTicketCountOnDeath),2]; + [playerSide, player] remoteExecCall [QFUNC(bleedSideTicketCountOnDeath),2]; }; case localize "STR_tunres_Respawn_Type_Playertickets": { - [playerSide, player] remoteExecCall [QFUNC(ticketCounterPlayer),2]; + [playerSide, player] remoteExecCall [QFUNC(bleedPlayerTicketCountOnDeath),2]; }; default { From 51accfb70ed8d41717341f0f859c2416219d38d3 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 19:22:16 +0200 Subject: [PATCH 042/228] Update description --- addons/respawn/functions/fnc_onPlayerKilled.sqf | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/respawn/functions/fnc_onPlayerKilled.sqf b/addons/respawn/functions/fnc_onPlayerKilled.sqf index 382163d..2b8c085 100644 --- a/addons/respawn/functions/fnc_onPlayerKilled.sqf +++ b/addons/respawn/functions/fnc_onPlayerKilled.sqf @@ -1,7 +1,7 @@ /* * Author: [Tuntematon] * [Description] - * Depending what respawn style is chosen. Chose fnc acording that. + * Depending what respawn style is chosen. * * Arguments: * None @@ -34,5 +34,4 @@ switch (GVAR(respawn_type)) do { default { setPlayerRespawnTime 5; }; -}; - +}; \ No newline at end of file From dc9be43ed3096278188e7420cd90ea963d0f6b6d Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 19:41:29 +0200 Subject: [PATCH 043/228] Rename respawn --- addons/respawn/eh list.txt | 2 +- addons/respawn/functions/fnc_moveRespawns.sqf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/respawn/eh list.txt b/addons/respawn/eh list.txt index 234487c..0fccaa0 100644 --- a/addons/respawn/eh list.txt +++ b/addons/respawn/eh list.txt @@ -1,5 +1,5 @@ EH Name | locality | params tunres_respawn_EH_gearAdded - local- unit -tunres_respawn_EH_moveRespawns - Server - side string (["west"]), units moved +tunres_respawn_EH_respawnWave - Server - side string (["west"]), units moved tunres_respawn_EH_unitTeleported - local - unit, destination pos tunres_respawn_EH_unitRespawned - local - unit \ No newline at end of file diff --git a/addons/respawn/functions/fnc_moveRespawns.sqf b/addons/respawn/functions/fnc_moveRespawns.sqf index 7663963..00601ef 100644 --- a/addons/respawn/functions/fnc_moveRespawns.sqf +++ b/addons/respawn/functions/fnc_moveRespawns.sqf @@ -85,7 +85,7 @@ if (count _waitingRespawn > 0) then { }; _unit setVariable [QGVAR(waiting_respawn), false, true]; - private _text = localize "STR_tunres_Respawn_FNC_moveRespawns"; + private _text = localize "STR_tunres_Respawn_FNC_moveRespawnText"; [_unit, _respawn_position, _text, 20, true] call FUNC(teleportUnit); @@ -102,7 +102,7 @@ if (count _waitingRespawn > 0) then { private _debugText = format ["Side %1 all respawn units moved. Respawned: %2. Total count is: %3", _side, _waitingRespawnCount, _totalRespawnCount]; INFO(_debugText); - [QGVAR(EH_moveRespawns), [_side, _waitingRespawn]] call CBA_fnc_serverEvent; + [QGVAR(EH_respawnWave), [_side, _waitingRespawn]] call CBA_fnc_serverEvent; } else { //No one at respawn if (count _waitingRespawnDelayed > 0) then { From 778252e473d4f91a3999f29f371c6a286670fd1f Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 19:44:23 +0200 Subject: [PATCH 044/228] update function name tunres_Respawn_fnc_moveRespawns -> tunres_Respawn_fnc_doRespawnWave --- .../functions/{fnc_moveRespawns.sqf => fnc_doRespawnWave.sqf} | 2 +- addons/respawn/functions/fnc_timer.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename addons/respawn/functions/{fnc_moveRespawns.sqf => fnc_doRespawnWave.sqf} (98%) diff --git a/addons/respawn/functions/fnc_moveRespawns.sqf b/addons/respawn/functions/fnc_doRespawnWave.sqf similarity index 98% rename from addons/respawn/functions/fnc_moveRespawns.sqf rename to addons/respawn/functions/fnc_doRespawnWave.sqf index 00601ef..b57b3cf 100644 --- a/addons/respawn/functions/fnc_moveRespawns.sqf +++ b/addons/respawn/functions/fnc_doRespawnWave.sqf @@ -10,7 +10,7 @@ * The return true when done * * Example: - * ["side"] call tunres_Respawn_fnc_moveRespawns + * ["side"] call tunres_Respawn_fnc_doRespawnWave */ #include "script_component.hpp" params [["_side", nil, [west]], ["_forceAll", false, [false]]]; diff --git a/addons/respawn/functions/fnc_timer.sqf b/addons/respawn/functions/fnc_timer.sqf index d587a52..1e0ca96 100644 --- a/addons/respawn/functions/fnc_timer.sqf +++ b/addons/respawn/functions/fnc_timer.sqf @@ -37,7 +37,7 @@ if !( GVAR(timerRunning) getOrDefault [_side, false]) then { }; GVAR(timerRunning) set [_side, false]; - [_side] call FUNC(moveRespawns); + [_side] call FUNC(doRespawnWave); [_side] call FUNC(timer); }, [_side]] call CBA_fnc_waitUntilAndExecute; }; \ No newline at end of file From 88171bfa5c93d5bbce40360b65120612d4f1fcc8 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 20:03:20 +0200 Subject: [PATCH 045/228] Rename function tunres_Respawn_fnc_force_Respawn -> tunres_Respawn_fnc_forceRespawnSide --- .../{fnc_force_Respawn.sqf => fnc_forceRespawnWave.sqf} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename addons/respawn/functions/{fnc_force_Respawn.sqf => fnc_forceRespawnWave.sqf} (80%) diff --git a/addons/respawn/functions/fnc_force_Respawn.sqf b/addons/respawn/functions/fnc_forceRespawnWave.sqf similarity index 80% rename from addons/respawn/functions/fnc_force_Respawn.sqf rename to addons/respawn/functions/fnc_forceRespawnWave.sqf index 622d98e..e34b62d 100644 --- a/addons/respawn/functions/fnc_force_Respawn.sqf +++ b/addons/respawn/functions/fnc_forceRespawnWave.sqf @@ -11,7 +11,7 @@ * None * * Example: - * [west, false] call tunres_Respawn_fnc_force_Respawn + * [west, false] call tunres_Respawn_fnc_forceRespawnWave */ #include "script_component.hpp" @@ -19,7 +19,7 @@ if (!isServer) exitWith { }; params [["_side", nil, [east]], ["_reset", false, [false]]]; -[_side, true] call FUNC(moveRespawns); +[_side, true] call FUNC(doRespawnWave); if (_reset && { !(GVAR(forced_respawn)) }) then { [_side] call FUNC(timer); From c2d2b11587a8c1008142e5a6f814d765bc5957f4 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 21:46:10 +0200 Subject: [PATCH 046/228] typofix --- addons/main/Stringtable.xml | 8 ++++---- .../functions/fnc_bleedPlayerTicketCountOnDeath.sqf | 2 +- .../respawn/functions/fnc_bleedSideTicketCountOnDeath.sqf | 2 +- addons/respawn/functions/fnc_getPlayerTicketCount.sqf | 2 +- addons/respawn/functions/fnc_killJIP.sqf | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index 203c9a0..ba12a8b 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -82,6 +82,10 @@ Range for waitingarea. Default 100m Range for waitingarea. Default 100m + + You are respawning! Standby. + You are respawning! Standby. + Remaining tickets for your side: Remaining tickets for your side: @@ -92,10 +96,6 @@ - - You are respawning! Standby. - You are respawning! Standby. - Remaining time until respawn Remaining time until respawn diff --git a/addons/respawn/functions/fnc_bleedPlayerTicketCountOnDeath.sqf b/addons/respawn/functions/fnc_bleedPlayerTicketCountOnDeath.sqf index 2612a7e..b068fea 100644 --- a/addons/respawn/functions/fnc_bleedPlayerTicketCountOnDeath.sqf +++ b/addons/respawn/functions/fnc_bleedPlayerTicketCountOnDeath.sqf @@ -1,7 +1,7 @@ /* * Author: [Tuntematon] * [Description] - * Count side tickest + * Count side tickets * * Arguments: * 0: Playerside diff --git a/addons/respawn/functions/fnc_bleedSideTicketCountOnDeath.sqf b/addons/respawn/functions/fnc_bleedSideTicketCountOnDeath.sqf index 5cb654f..333a4ec 100644 --- a/addons/respawn/functions/fnc_bleedSideTicketCountOnDeath.sqf +++ b/addons/respawn/functions/fnc_bleedSideTicketCountOnDeath.sqf @@ -1,7 +1,7 @@ /* * Author: [Tuntematon] * [Description] - * Count side tickest + * Count side tickets * * Arguments: * 0: Playerside diff --git a/addons/respawn/functions/fnc_getPlayerTicketCount.sqf b/addons/respawn/functions/fnc_getPlayerTicketCount.sqf index 252e0ed..6e2faee 100644 --- a/addons/respawn/functions/fnc_getPlayerTicketCount.sqf +++ b/addons/respawn/functions/fnc_getPlayerTicketCount.sqf @@ -1,7 +1,7 @@ /* * Author: [Tuntematon] * [Description] - * Count side tickest + * Count side tickets * * Arguments: * 0: Playerside diff --git a/addons/respawn/functions/fnc_killJIP.sqf b/addons/respawn/functions/fnc_killJIP.sqf index dde9d1d..4191541 100644 --- a/addons/respawn/functions/fnc_killJIP.sqf +++ b/addons/respawn/functions/fnc_killJIP.sqf @@ -26,7 +26,7 @@ if (!hasInterface) exitWith { }; player allowDamage true; - player setDammage 1; + player setDamage 1; }, [], 1] call CBA_fnc_waitAndExecute; }; }] call CBA_fnc_waitUntilAndExecute; \ No newline at end of file From 92e392706bf07b7acf6876d6d717ef6f6a1987dc Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 22:16:58 +0200 Subject: [PATCH 047/228] typofix --- addons/main/Stringtable.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index ba12a8b..6d3c54d 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -86,14 +86,14 @@ You are respawning! Standby. You are respawning! Standby. - - Remaining tickets for your side: - Remaining tickets for your side: - Your remaining tickets: Your remaining tickets: + + Remaining tickets for your side: + Remaining tickets for your side: + From b8ce3a9bfb69cc280c360ec9a443716c103e8541 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 22:21:31 +0200 Subject: [PATCH 048/228] tweaks --- addons/respawn/XEH_PREP.hpp | 20 +++++++++------- addons/respawn/XEH_postInit_client.sqf | 2 +- addons/respawn/XEH_postInit_server.sqf | 4 ++-- .../functions/fnc_createLocalMarker.sqf | 7 +++++- .../respawn/functions/fnc_delayed_respawn.sqf | 2 +- .../respawn/functions/fnc_marker_update.sqf | 2 +- .../functions/fnc_module_waitingarea.sqf | 24 ++++++++++++------- addons/respawn/functions/fnc_teleportUnit.sqf | 2 +- 8 files changed, 40 insertions(+), 23 deletions(-) diff --git a/addons/respawn/XEH_PREP.hpp b/addons/respawn/XEH_PREP.hpp index 4422ceb..b32853f 100644 --- a/addons/respawn/XEH_PREP.hpp +++ b/addons/respawn/XEH_PREP.hpp @@ -5,34 +5,38 @@ PREP(addGear); PREP(addMainAction); PREP(addTeleportAction); PREP(blackscreen); +PREP(bleedPlayerTicketCountOnDeath); +PREP(bleedSideTicketCountOnDeath); PREP(briefingNotes); PREP(checkTicketCount); PREP(createLocalMarker); PREP(delayed_respawn); -PREP(force_Respawn); +PREP(doRespawnWave); +PREP(forceRespawnPlayer); +PREP(forceRespawnWave); PREP(getOffSet); PREP(getParentAction); -PREP(getTicketCountPlayer); -PREP(killed); +PREP(getPlayerTicketCount); +PREP(getSideTicketCount); PREP(killJIP); PREP(marker_update); PREP(module_respawnpos); PREP(module_teleporter); PREP(module_waitingarea); -PREP(moveRespawns); +PREP(onPlayerKilled); PREP(openTeleportMenu); PREP(radioSettings_tfar); PREP(remainingWaitTimeNotification); PREP(removegear); +PREP(respawnUnit); PREP(savegear); +PREP(setPlayerTicketCount); +PREP(setSideTicketCount); PREP(startSpectator); -PREP(teleport); PREP(teleportButton); PREP(teleportOnLBSelChanged); -PREP(ticketCounterPlayer); -PREP(ticketCounterSide); +PREP(teleportUnit); PREP(timer); PREP(update_respawn_point); -PREP(updatePlayerTicketCount); PREP(updateWaitingRespawnList); PREP(waitingArea); \ No newline at end of file diff --git a/addons/respawn/XEH_postInit_client.sqf b/addons/respawn/XEH_postInit_client.sqf index ce44c17..9abe843 100644 --- a/addons/respawn/XEH_postInit_client.sqf +++ b/addons/respawn/XEH_postInit_client.sqf @@ -37,7 +37,7 @@ if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (I //Add respawn eh [player, "Respawn", { [] call FUNC(removegear); - player setVariable [QGVAR(waiting_respawn), true, true]; + player setVariable [QGVAR(isWaitingRespawn), true, true]; [] call FUNC(waitingArea); }] call CBA_fnc_addBISEventHandler; diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index da812ce..93077bd 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -23,7 +23,7 @@ if (GVAR(respawn_type) isNotEqualTo localize "STR_tunres_Respawn_Type_Default") //clean bodies during briefing && safestart addMissionEventHandler ["HandleDisconnect", { params ["_unit", "_id", "_uid", "_name"]; - if (cba_missiontime < (GVAR(killJIP_time) * 60) || _unit getVariable [QGVAR(waiting_respawn),false]) then { + if (cba_missiontime < (GVAR(killJIP_time) * 60) || _unit getVariable [QGVAR(isWaitingRespawn),false]) then { deleteVehicle _unit; }; false; @@ -35,7 +35,7 @@ if ( !isnil "afi_aar2" ) then { if (missionNamespace getVariable ["afi_aar2", false]) then { if ((GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Sidetickets")) then { - private _hashTickets = GVAR(tickets) + private _hashTickets = GVAR(tickets); private _enabledSideHash = GVAR(enabledSides); if (_enabledSideHash getOrDefault [west, false]) then { diff --git a/addons/respawn/functions/fnc_createLocalMarker.sqf b/addons/respawn/functions/fnc_createLocalMarker.sqf index a89549d..69236e6 100644 --- a/addons/respawn/functions/fnc_createLocalMarker.sqf +++ b/addons/respawn/functions/fnc_createLocalMarker.sqf @@ -17,7 +17,12 @@ * ["RespawnPosLocal", _pos, "Respawn", "respawn_inf", _color, 1] call tunres_Respawn_fnc_createLocalMarker */ #include "script_component.hpp" -params [["_name", nil [""]], ["_pos", nil [[]]], ["_text", nil [""]], ["_icon", nil [""]], ["_color", nil [""]], ["_alpha", 0, [0]]]; +params [["_name", nil, [""]], + ["_pos", nil, [[]]], + ["_text", nil, [""]], + ["_icon", nil, [""]], + ["_color", nil, [""]], + ["_alpha", 0, [0]]]; if (!hasInterface) exitWith {}; private _marker = createMarkerLocal [_name, _pos]; diff --git a/addons/respawn/functions/fnc_delayed_respawn.sqf b/addons/respawn/functions/fnc_delayed_respawn.sqf index b3dacc9..47a57b3 100644 --- a/addons/respawn/functions/fnc_delayed_respawn.sqf +++ b/addons/respawn/functions/fnc_delayed_respawn.sqf @@ -24,7 +24,7 @@ if (GVAR(delayed_respawn) > 0) then { _skip = ((_time - cba_missiontime) < ((_waveLenghtTime * 60) * (GVAR(delayed_respawn) / 100))); }; -_unit setVariable [QGVAR(skip_next_wave), _skip, true]; +_unit setVariable [QGVAR(skipNextWave), _skip, true]; if (_skip) then { private _waitingRespawnDelayedHash = GVAR(waitingRespawnDelayedList); diff --git a/addons/respawn/functions/fnc_marker_update.sqf b/addons/respawn/functions/fnc_marker_update.sqf index f85d36e..7c077c2 100644 --- a/addons/respawn/functions/fnc_marker_update.sqf +++ b/addons/respawn/functions/fnc_marker_update.sqf @@ -48,7 +48,7 @@ if ((getMarkerPos "RespawnPosLocal") distance2D (getMarkerPos "MainBaseLocal") > }; //maker marker bigger, if waiting respawn just because -if (player getvariable [QGVAR(waiting_respawn), false]) then { +if (player getvariable [QGVAR(isWaitingRespawn), false]) then { "RespawnPosLocal" setMarkerSizeLocal [3,3]; } else { "RespawnPosLocal" setMarkerSizeLocal [1,1]; diff --git a/addons/respawn/functions/fnc_module_waitingarea.sqf b/addons/respawn/functions/fnc_module_waitingarea.sqf index 3ba51ac..6afa936 100644 --- a/addons/respawn/functions/fnc_module_waitingarea.sqf +++ b/addons/respawn/functions/fnc_module_waitingarea.sqf @@ -16,13 +16,13 @@ if (!isServer) exitWith { }; -_logic = param [0,objNull,[objNull]]; +private _logic = param [0,objNull,[objNull]]; -_markername = _logic getVariable ["respawn_side","none"]; +private _markername = _logic getVariable ["respawn_side","none"]; if (_markername isEqualTo "none") exitWith { // Exit if no side private _errorText = localize "STR_tunres_Respawn_Module_WaitingArea_novalue"; - ERROR_MSG(_errorText); + ERROR_MSG(_errorText); false }; @@ -34,13 +34,14 @@ if (getMarkerColor _markername isEqualTo "") then { ERROR_MSG(_errorText); }; -_pos = getPos _logic; +private _pos = getPos _logic; +private "_side"; switch (_markername) do { case "respawn_west": { _side = west; GVAR(flag_west) = "Flag_Blue_F" createVehicle _pos; - [{ADDON}, { + [{ ADDON } , { [west] call FUNC(timer); }] call CBA_fnc_waitUntilAndExecute; }; @@ -48,7 +49,7 @@ switch (_markername) do { case "respawn_east": { _side = east; GVAR(flag_east) = "Flag_Red_F" createVehicle _pos; - [{ADDON}, { + [{ ADDON }, { [east] call FUNC(timer); }] call CBA_fnc_waitUntilAndExecute; }; @@ -57,7 +58,7 @@ switch (_markername) do { _side = resistance; GVAR(flag_guerrila) = "Flag_Green_F" createVehicle _pos; - [{ADDON}, { + [{ ADDON }, { [resistance] call FUNC(timer); }] call CBA_fnc_waitUntilAndExecute; }; @@ -65,12 +66,19 @@ switch (_markername) do { case "respawn_civilian": { _side = civilian; GVAR(flag_civilian) = "Flag_White_F" createVehicle _pos; - [{ADDON}, { + [{ ADDON }, { [civilian] call FUNC(timer); }] call CBA_fnc_waitUntilAndExecute; }; + + default { + _side = sideLogic; + } }; +if (_side == sideLogic) then { + ERROR("Module has side logic for some fucking reason.") +}; GVAR(waitingArea) set [_side, [_markername, _logic, _pos]]; publicVariable QGVAR(waitingArea); // Module function is executed by spawn command, so returned value is not necessary, but it's good practice. diff --git a/addons/respawn/functions/fnc_teleportUnit.sqf b/addons/respawn/functions/fnc_teleportUnit.sqf index 78e1aab..e74eda9 100644 --- a/addons/respawn/functions/fnc_teleportUnit.sqf +++ b/addons/respawn/functions/fnc_teleportUnit.sqf @@ -34,7 +34,7 @@ if (_godMode) then { }; [_text, 10] remoteExecCall [QFUNC(blackscreen), _unit]; // make player screen black and prevent them moving right away so server can keep up. -cba_fnc_waitAndExe + _unit setPos ([_destination, _range] call CBA_fnc_randPos); [QGVAR(EH_unitTeleported), [_unit, _destination]] call CBA_fnc_serverEvent; From 25b7ea1053baa2e7c2c013f7a8bb783f6c6b2af9 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 22:22:24 +0200 Subject: [PATCH 049/228] split respawn unit part --- .../respawn/functions/fnc_doRespawnWave.sqf | 28 ++++---------- addons/respawn/functions/fnc_respawnUnit.sqf | 37 +++++++++++++++++++ 2 files changed, 44 insertions(+), 21 deletions(-) create mode 100644 addons/respawn/functions/fnc_respawnUnit.sqf diff --git a/addons/respawn/functions/fnc_doRespawnWave.sqf b/addons/respawn/functions/fnc_doRespawnWave.sqf index b57b3cf..68f264d 100644 --- a/addons/respawn/functions/fnc_doRespawnWave.sqf +++ b/addons/respawn/functions/fnc_doRespawnWave.sqf @@ -20,8 +20,6 @@ if (!isServer) exitWith { }; private _totalRespawnCountHash = GVAR(totalRespawnCount); private _totalRespawnCount = _totalRespawnCountHash get _side; -private _respawnPointsHash= GVAR(respawnPointsHash); -private _respawn_position = getMarkerPos ((_respawnPointsHash get _side) select 0); private _waitingRespawnHash = GVAR(waitingRespawnList); private _waitingRespawnDelayedHash = GVAR(waitingRespawnDelayedList); private _waitingRespawn = _waitingRespawnHash get _side; @@ -37,8 +35,8 @@ if (count _waitingRespawn > 0 || count _waitingRespawnDelayed > 0) then { if (_forceAll) then { { private _unit = _x; - if (_unit getVariable [QGVAR(skip_next_wave), false]) then { - _unit setVariable [QGVAR(skip_next_wave), false, true]; + if (_unit getVariable [QGVAR(skipNextWave), false]) then { + _unit setVariable [QGVAR(skipNextWave), false, true]; PUSH(_waitingRespawn,_unit); }; } forEach _waitingRespawnDelayed; @@ -53,7 +51,7 @@ if (count _waitingRespawn > 0) then { //move [{ - _args params ["_respawn_position", "_side"]; + _args params ["_side"]; private _waitingRespawnHash = GVAR(waitingRespawnList); private _unitList = _waitingRespawnHash get _side; @@ -67,7 +65,7 @@ if (count _waitingRespawn > 0) then { { private _unit = _x; - _unit setVariable [QGVAR(skip_next_wave), false, true]; + _unit setVariable [QGVAR(skipNextWave), false, true]; } forEach _waitingRespawnDelayed; _waitingRespawnHash set [_side, _waitingRespawnDelayed]; @@ -78,21 +76,9 @@ if (count _waitingRespawn > 0) then { }; private _unit = _unitList select 0; - _unitList deleteAt 0; - if (isnull _unit || !(_unit in allPlayers) || !alive _unit ) exitWith { - _waitingRespawnHash set [_side, _unitList]; - }; - - _unit setVariable [QGVAR(waiting_respawn), false, true]; - private _text = localize "STR_tunres_Respawn_FNC_moveRespawnText"; - - [_unit, _respawn_position, _text, 20, true] call FUNC(teleportUnit); - - remoteExecCall [QFUNC(addGear), _unit]; - - [QGVAR(EH_unitRespawned), [_unit], _unit] call CBA_fnc_localEvent; - }, 0.2, [_respawn_position, _side]] call CBA_fnc_addPerFrameHandler; + [_side, _unit] call FUNC(respawnUnit); + }, 0.2, [ _side]] call CBA_fnc_addPerFrameHandler; private _waitingRespawnCount = count _waitingRespawn; @@ -108,7 +94,7 @@ if (count _waitingRespawn > 0) then { if (count _waitingRespawnDelayed > 0) then { { private _unit = _x; - _unit setVariable [QGVAR(skip_next_wave), false, true]; + _unit setVariable [QGVAR(skipNextWave), false, true]; } forEach _waitingRespawnDelayed; _waitingRespawnHash set [_side, _waitingRespawnDelayed]; _waitingRespawnDelayedHash set [_side, []]; diff --git a/addons/respawn/functions/fnc_respawnUnit.sqf b/addons/respawn/functions/fnc_respawnUnit.sqf new file mode 100644 index 0000000..9f24468 --- /dev/null +++ b/addons/respawn/functions/fnc_respawnUnit.sqf @@ -0,0 +1,37 @@ +/* + * Author: [Tuntematon] + * [Description] + * + * Arguments: + * 0: Side + * 1: Unit + * + * Return Value: + * + * + * Example: + * [_side, _unit] call tunres_Respawn_fnc_respawnUnit + */ +#include "script_component.hpp" +params [["_side", nil, [west]], ["_unit", objnull, [objnull]]]; +private _respawnPointsHash = GVAR(respawnPointsHash); +private _respawnPosition = getMarkerPos ((_respawnPointsHash get _side) select 0); + +private _waitingRespawnHash = GVAR(waitingRespawnList); +private _unitList = _waitingRespawnHash get _side; + +if (isnull _unit || !(_unit in allPlayers) || !alive _unit ) exitWith { + _waitingRespawnHash set [_side, _unitList]; +}; + +_unitList deleteAt (_unitList find _unit); +_waitingRespawnHash set [_side, _unitList]; + +_unit setVariable [QGVAR(isWaitingRespawn), false, true]; +private _text = localize "STR_tunres_Respawn_FNC_moveRespawnText"; + +[_unit, _respawnPosition, _text, 20, true] call FUNC(teleportUnit); + +remoteExecCall [QFUNC(addGear), _unit]; + +[QGVAR(EH_unitRespawned), [_unit], _unit] call CBA_fnc_localEvent; \ No newline at end of file From 55937b0925c617953ebfd9cb556559ea19713d64 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 22:23:00 +0200 Subject: [PATCH 050/228] Add tickets to respawn text and sounds --- addons/respawn/functions/fnc_waitingArea.sqf | 51 +++++++++++++------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 0451848..b527316 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -13,60 +13,77 @@ * [] call tunres_Respawn_fnc_waitingArea */ #include "script_component.hpp" -private ["_respawn_waitingarea"]; + private _playerSide = playerSide; if (isDedicated || !(_playerSide in [west,east,resistance,civilian]) ) exitWith { }; //tell server to add this player to list [player, true, _playerSide] remoteExecCall [QFUNC(updateWaitingRespawnList),2]; -_respawn_waitingarea = GVAR(waitingArea) get _playerSide; +private _respawnWaitingarea = (GVAR(waitingArea) get _playerSide) select 1; +GVAR(firstMark) = true; [{ - params ["_respawn_waitingarea"]; - if !( player getvariable QGVAR(waiting_respawn) ) exitWith { [_handle] call CBA_fnc_removePerFrameHandler; }; + params ["_respawnWaitingarea"]; + if !( player getvariable QGVAR(isWaitingRespawn) ) exitWith { [_handle] call CBA_fnc_removePerFrameHandler; }; private _playerSide = playerSide; //Show remaining time private _hashWaitTime = GVAR(nextWaveTimes); private _waitTime = _hashWaitTime get _playerSide; private _remainingWaitTime = round (_waitTime - cba_missiontime); - if (player getVariable [QGVAR(skip_next_wave), false]) then { + if (player getVariable [QGVAR(skipNextWave), false]) then { private _hashWaveLenght = GVAR(waveLenghtTimes); private _waveLenght = _hashWaveLenght get _playerSide; _remainingWaitTime = _remainingWaitTime + _waveLenght; }; + if (GVAR(firstMark) && {_remainingWaitTime <= 20} ) then { + GVAR(firstMark) = false; + playSound "Orange_PhoneCall_Ringtone"; + }; - private _text = format ["%1", localize "STR_tunres_Respawn_FNC_only_forced_waves"]; + if ( _remainingWaitTime <= 5 ) then { + playSound "TacticalPing"; + }; + private _text = format ["%1", localize "STR_tunres_Respawn_FNC_only_forced_waves"]; if (_remainingWaitTime >= 0 && { GVAR(allowRespawn) get _playerSide }) then { - _text = format ["%2
%1
", ([_remainingWaitTime] call CBA_fnc_formatElapsedTime), localize "STR_tunres_Respawn_FNC_remaining_time"]; + _text = format ["%2
%1
", ([_remainingWaitTime] call CBA_fnc_formatElapsedTime), localize "STR_tunres_Respawn_FNC_remaining_time"]; } else { - if (player getvariable [QGVAR(waiting_respawn), true] && { !(GVAR(forced_respawn)) } && { !(GVAR(allowRespawn) get _playerSide) }) then { - _text = format ["%1", localize "STR_tunres_Respawn_FNC_RespawnDisabled"]; + if (player getvariable [QGVAR(isWaitingRespawn), true] && { !(GVAR(forced_respawn)) } && { !(GVAR(allowRespawn) get _playerSide) }) then { + _text = format ["%1", localize "STR_tunres_Respawn_FNC_RespawnDisabled"]; } else { _text = format ["Something is vevy vevy wrong. time: %1 - allowRespawn: %2 - forced respawn: %3 ", _remainingWaitTime, GVAR(allowRespawn) get playerSid, GVAR(forced_respawn)]; }; }; - if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Default") then { - private _tickets = GVAR(tickest) get _playerSide; - _text = format["%1
%2 %3", _text, localize "STR_tunres_Respawan_RemainingTickestSide", _tickets]; + private _usesTickets = false; + private "_tickets"; + private "_ticketsTypeText"; + if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Sidetickets") then { + _tickets = GVAR(tickets) get _playerSide; + _ticketsTypeText = localize "STR_tunres_Respawan_RemainingTicketsSide"; + _usesTickets = true; } else { if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Playertickets") then { - private _tickets = GVAR(tickest) get _playerSide; - _text = format["%1
%2 %3", _text, localize "STR_tunres_Respawan_RemainingTickestPlayer", _tickets]; + _tickets = GVAR(tickets) get _playerSide; + _ticketsTypeText = localize "STR_tunres_Respawan_RemainingTicketsPlayer"; + _usesTickets = true; }; }; + if (_usesTickets) then { + _text = format["%1
%2 %3", _text, _ticketsTypeText, _tickets]; + }; + [_text,0,0,1,0] spawn BIS_fnc_dynamicText; //make sure that player is still in area private _waitingRange = GVAR(waiting_area_range); - if !(player inArea [_respawn_waitingarea, _waitingRange, _waitingRange, 0, false]) then { - player setPos ([_respawn_waitingarea, (_waitingRange / 2)] call CBA_fnc_randPos); + if !(player inArea [_respawnWaitingarea, _waitingRange, _waitingRange, 0, false]) then { + player setPos ([_respawnWaitingarea, (_waitingRange / 2)] call CBA_fnc_randPos); "Get over here!" call CBA_fnc_notify; }; -}, 1, _respawn_waitingarea] call CBA_fnc_addPerFrameHandler; +}, 1, _respawnWaitingarea] call CBA_fnc_addPerFrameHandler; \ No newline at end of file From 54b2932c92ff999a491618801a114e17e7dd2f8c Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 12 Jan 2024 22:23:13 +0200 Subject: [PATCH 051/228] Force respawn for single unit --- .../functions/fnc_forceRespawnPlayer.sqf | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 addons/respawn/functions/fnc_forceRespawnPlayer.sqf diff --git a/addons/respawn/functions/fnc_forceRespawnPlayer.sqf b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf new file mode 100644 index 0000000..51767ea --- /dev/null +++ b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf @@ -0,0 +1,23 @@ +/* + * Author: [Tuntematon] + * [Description] + * Force respawn wave + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call tunres_Respawn_fnc_forceRespawnPlayer + */ +#include "script_component.hpp" + +if !(player getVariable [QGVAR(isWaitingRespawn),false]) exitWith { + ERROR("Tried to force respawn unit, whichs is not at respawn"); +}; + +player setVariable [QGVAR(skipNextWave), false, true]; + +[playerSide, player] remoteExecCall [QFUNC(respawnUnit), 2]; \ No newline at end of file From 956d66cabe7647c8a0e502857e79d28f4ae0a384 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 13 Jan 2024 00:59:23 +0200 Subject: [PATCH 052/228] Add contest area markers Ability to check contest area with ace action or when setting up MSP Opens up map and creates markers for that area. --- addons/msp/XEH_PREP.hpp | 4 +- addons/msp/functions/fnc_ace_actions.sqf | 10 ++++- .../msp/functions/fnc_contestZoneMarkers.sqf | 43 +++++++++++++++++++ .../msp/functions/fnc_initate_msp_action.sqf | 3 +- 4 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 addons/msp/functions/fnc_contestZoneMarkers.sqf diff --git a/addons/msp/XEH_PREP.hpp b/addons/msp/XEH_PREP.hpp index 8f43e04..c2f9d58 100644 --- a/addons/msp/XEH_PREP.hpp +++ b/addons/msp/XEH_PREP.hpp @@ -6,4 +6,6 @@ PREP(init_contested); PREP(initate_msp_action); PREP(update_status); PREP(whoToNotify); -PREP(briefingNotes); \ No newline at end of file +PREP(briefingNotes); +PREP(contestZoneMarkers); + diff --git a/addons/msp/functions/fnc_ace_actions.sqf b/addons/msp/functions/fnc_ace_actions.sqf index 46b649d..d3c2aea 100644 --- a/addons/msp/functions/fnc_ace_actions.sqf +++ b/addons/msp/functions/fnc_ace_actions.sqf @@ -52,13 +52,19 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { private _remove_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide} && {_target getVariable [QGVAR(isMSP), false]} }; _removeMSP = ["Pack MSP", "Pack MSP", "\a3\3den\data\cfgwaypoints\load_ca.paa", {[_target, false] spawn FUNC(initate_msp_action);}, _remove_condition, {}, [], [0, 0, 0], 2, [false, true, false, false, false]] call ace_interact_menu_fnc_createAction; - private _timer_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; - _chekTime = ["Check Respawn Time", "Check Respawn Time", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", EFUNC(respawn,remainingWaitTimeNotification), _timer_condition] call ace_interact_menu_fnc_createAction; + private _aliveAndSameSideConditio = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; + + //check time + private _chekTime = ["Check Respawn Time", "Check Respawn Time", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", EFUNC(respawn,remainingWaitTimeNotification), _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; + + //Check contest area + private _checkArea = ["Check contest area", "Check contest area", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", {[_target] call FUNC(contestZoneMarkers);}, _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; //Ace inteaction [_vehicle, 1, ["ACE_SelfActions"], _createMSP] call ace_interact_menu_fnc_addActionToClass; [_vehicle, 0, ["ACE_MainActions","tunres_respawnAction"], _removeMSP] call ace_interact_menu_fnc_addActionToClass; [_vehicle, 0, ["ACE_MainActions","tunres_respawnAction"], _chekTime] call ace_interact_menu_fnc_addActionToClass; + [_vehicle, 0, ["ACE_MainActions","tunres_respawnAction"], _checkArea] call ace_interact_menu_fnc_addActionToClass; //TP. I hate this system already. [_vehicle, "InitPost", { diff --git a/addons/msp/functions/fnc_contestZoneMarkers.sqf b/addons/msp/functions/fnc_contestZoneMarkers.sqf new file mode 100644 index 0000000..b1704e5 --- /dev/null +++ b/addons/msp/functions/fnc_contestZoneMarkers.sqf @@ -0,0 +1,43 @@ +/* + * Author: [Tuntematon] + * [Description] + * + * Arguments: + * 0: The first argument + * 1: The second argument + * 2: Multiple input types + * 3: Optional input (default: true) + * 4: Optional input with multiple types (default: {true}) + * 5: Not mandatory input (default: nil) + * + * Return Value: + * The return value + * + * Example: + * ["something", player] call tunres_MSP_fnc_contestZoneMarkers + + */ +#include "script_component.hpp" +params[["_target", player]]; + +openMap true; +private _pos = getPos _target; +private _contestRangeMax = GVAR(contested_radius_max); +private _contestRangeMin = GVAR(contested_radius_min); +private _posMax = _pos getPos [_contestRangeMax, 90]; +private _posMin = _pos getPos [_contestRangeMin, 90]; +[QGVAR(contestMarkerMapMax), _pos, "ELLIPSE", [_contestRangeMax, _contestRangeMax], "COLOR:", "ColorOrange"] call CBA_fnc_createMarker; +[QGVAR(contestMarkerMapMaxText), _posMax, "ICON", [1,1], "TEXT:", "Max Contest range", "COLOR:", "ColorOrange", "TYPE:", "hd_warning"] call CBA_fnc_createMarker; +[QGVAR(contestMarkerMapMin), _pos, "ELLIPSE", [_contestRangeMin, _contestRangeMin], "COLOR:", "colorOPFOR"] call CBA_fnc_createMarker; +[QGVAR(contestMarkerMapMinText), _posMin, "ICON", [1,1],"TEXT:", "Min Contest range", "COLOR:", "ColorRed", "TYPE:", "hd_warning"] call CBA_fnc_createMarker; + +GVAR(contestMarkerMapEH) = addMissionEventHandler ["Map", { + params ["_mapIsOpened", "_mapIsForced"]; + if !(_mapIsOpened) then { + removeMissionEventHandler ["Map", GVAR(contestMarkerMapEH)]; + deleteMarkerLocal QGVAR(contestMarkerMapMax); + deleteMarkerLocal QGVAR(contestMarkerMapMin); + deleteMarkerLocal QGVAR(contestMarkerMapMinText); + deleteMarkerLocal QGVAR(contestMarkerMapMaxText); + }; +}] \ No newline at end of file diff --git a/addons/msp/functions/fnc_initate_msp_action.sqf b/addons/msp/functions/fnc_initate_msp_action.sqf index e7473e8..e640eb6 100644 --- a/addons/msp/functions/fnc_initate_msp_action.sqf +++ b/addons/msp/functions/fnc_initate_msp_action.sqf @@ -21,6 +21,7 @@ private ["_text", "_time", "_conditio"]; private _statusvar = format ["%1_%2", QGVAR(status), playerSide]; if (_setup) then { + [_target] call FUNC(contestZoneMarkers); _text = localize "STR_tunres_MSP_fnc_initate_msp_action_setting"; _conditio = { !(missionNamespace getVariable (_this select 0 select 1)) }; _time = GVAR(progresbar_time_setup); @@ -30,5 +31,5 @@ if (_setup) then { _time = GVAR(progresbar_time_pack); }; -_code = { (_this select 0 select 0) call FUNC(update_status); }; +private _code = { (_this select 0 select 0) call FUNC(update_status); }; [_text, _time, _conditio, _code, {hint "aborted"},[[_target, _setup], _statusvar]] call CBA_fnc_progressBar; \ No newline at end of file From 686fedb1472586cbd5881c79cfbcfa2b3edd6f63 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 18 Jan 2024 22:10:27 +0200 Subject: [PATCH 053/228] Renaming --- addons/main/Stringtable.xml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index 6d3c54d..dfb8b1a 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -409,12 +409,12 @@ Enable MSP system - - + + Setting up MSP Setting up MSP - + Packing MSP Packing MSP @@ -474,7 +474,7 @@ When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) - + Interval for when server updates the contested status for MSP Interval for when server updates the contested status for MSP @@ -482,15 +482,15 @@ Radius where there needs to be more enemies than allies to disable MSP (meters) Radius where there needs to be more enemies than allies to disable MSP (meters) - + Min Contested Radius Min Contested Radius - + Max Contested Radius Max Contested Radius - + Contested Check Interval Contested Check Interval @@ -500,27 +500,27 @@ - + Range from MSP where enemies are reported (meters) Range from MSP where enemies are reported (meters) - + Interval when server check if there is enemies near MSP Interval when server check if there is enemies near MSP - + %1<br/><br/>Enable Report Enemies near MSP %1<br/><br/>Enable Report Enemies near MSP - + Report Enemies Interval Report Enemies Interval - + Report Enemies Range Report Enemies Range - + Report Enemies Report Enemies From 2fc4512fb4e0877aaca2e4f88f7d89939cc60aab Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 18 Jan 2024 22:10:56 +0200 Subject: [PATCH 054/228] Rename function tunres_MSP_fnc_ace_actions -> tunres_MSP_fnc_addAceActions --- ..._ace_actions.sqf => fnc_addAceActions.sqf} | 54 ++++++------------- 1 file changed, 15 insertions(+), 39 deletions(-) rename addons/msp/functions/{fnc_ace_actions.sqf => fnc_addAceActions.sqf} (60%) diff --git a/addons/msp/functions/fnc_ace_actions.sqf b/addons/msp/functions/fnc_addAceActions.sqf similarity index 60% rename from addons/msp/functions/fnc_ace_actions.sqf rename to addons/msp/functions/fnc_addAceActions.sqf index d3c2aea..a7be6d4 100644 --- a/addons/msp/functions/fnc_ace_actions.sqf +++ b/addons/msp/functions/fnc_addAceActions.sqf @@ -10,34 +10,12 @@ * None * * Example: - * [] call tunres_MSP_fnc_ace_actions + * [] call tunres_MSP_fnc_addAceActions */ #include "script_component.hpp" -if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (IE zeus) +if (playerSide isEqualTo sideLogic || !hasInterface) exitWith { }; // Exit if a virtual entity (IE zeus) -private _vehicle = switch (playerSide) do { - - case west: { - GVAR(clasnames_west); - }; - - case east: { - GVAR(clasnames_east); - }; - - case resistance: { - GVAR(clasnames_resistance); - }; - - case civilian: { - GVAR(clasnames_civilian); - }; - - default { - "" - }; - -}; +private _vehicle = GVAR(classnames) get playerSide; private _actionMain = ["tunres_respawnAction", "Respawn Actions", "\a3\Modules_F_Curator\Data\portraitRespawnTickets_ca.paa", {true}, {true}] call ace_interact_menu_fnc_createAction; [_vehicle, 0, ["ACE_MainActions"], _actionMain] call ace_interact_menu_fnc_addActionToClass; @@ -45,12 +23,17 @@ private _actionMain = ["tunres_respawnAction", "Respawn Actions", "\a3\Modules_F //check that class exist if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { //create msp action - private _create_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide} && { driver _target isEqualTo player} && { speed player isEqualTo 0 } && {!(missionNamespace getVariable [format ["%1_%2", QGVAR(status), playerSide], false])}}; - _createMSP = ["Set up MSP", "Set up MSP", "\a3\3den\data\cfgwaypoints\unload_ca.paa", {[_target, true] spawn FUNC(initate_msp_action);}, _create_condition, {}, [], [0, 0, 0], 2, [false, true, false, false, false]] call ace_interact_menu_fnc_createAction; + private _create_condition = { alive _target && + {_target getVariable QGVAR(side) isEqualTo playerSide} && + { driver _target isEqualTo player} && + { speed player isEqualTo 0 } && + {!((GVAR(deployementStatus) getOrDefault [playerSide, false]))} + }; + _createMSP = ["Set up MSP", "Set up MSP", "\a3\3den\data\cfgwaypoints\unload_ca.paa", {[_target, true] call FUNC(startUpdateDeployementStatus);}, _create_condition, {}, [], [0, 0, 0], 2, [false, true, false, false, false]] call ace_interact_menu_fnc_createAction; //remove msp action private _remove_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide} && {_target getVariable [QGVAR(isMSP), false]} }; - _removeMSP = ["Pack MSP", "Pack MSP", "\a3\3den\data\cfgwaypoints\load_ca.paa", {[_target, false] spawn FUNC(initate_msp_action);}, _remove_condition, {}, [], [0, 0, 0], 2, [false, true, false, false, false]] call ace_interact_menu_fnc_createAction; + _removeMSP = ["Pack MSP", "Pack MSP", "\a3\3den\data\cfgwaypoints\load_ca.paa", {[_target, false] call FUNC(startUpdateDeployementStatus);}, _remove_condition, {}, [], [0, 0, 0], 2, [false, true, false, false, false]] call ace_interact_menu_fnc_createAction; private _aliveAndSameSideConditio = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; @@ -58,7 +41,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { private _chekTime = ["Check Respawn Time", "Check Respawn Time", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", EFUNC(respawn,remainingWaitTimeNotification), _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; //Check contest area - private _checkArea = ["Check contest area", "Check contest area", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", {[_target] call FUNC(contestZoneMarkers);}, _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; + private _checkArea = ["Check contest area", "Check contest area", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", {[_target] call FUNC(createContestZoneMarkers);}, _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; //Ace inteaction [_vehicle, 1, ["ACE_SelfActions"], _createMSP] call ace_interact_menu_fnc_addActionToClass; @@ -70,17 +53,10 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { [_vehicle, "InitPost", { params ["_entity"]; - private _variable = switch (playerSide) do { - case west: { "tunres_msp_vehicle_west" }; - case east: { "tunres_msp_vehicle_east" }; - case resistance: { "tunres_msp_vehicle_guer" }; - case civilian: { "tunres_msp_vehicle_civ" }; - }; private _menu_condition = "alive _target && {_target getVariable ['tunres_msp_isMSP', false]} && {!(_target getVariable ['tunres_msp_isContested', false])}"; - private _tp_conditionText = " private _msp = missionNamespace getVariable ['%1', objNull]; private _status = _msp getVariable ['tunres_msp_isContested', false]; (_target isNotEqualTo _msp && _obj getVariable ['tunres_msp_isMSP', false] && !_status) "; + private _tp_conditionText = " private _msp = "+ QGVAR(activeVehicle) +"get playerSide; private _status = _msp getVariable ['tunres_msp_isContested', false]; (_target isNotEqualTo _msp && _obj getVariable ['tunres_msp_isMSP', false] && !_status) "; - _tp_conditionText = format [_tp_conditionText, _variable]; - [_entity, _tp_conditionText, localize "STR_tunres_MSP_TpText", false, nil, [playerSide], true, _menu_condition, false, ["ACE_MainActions","tunres_respawnAction"]] call tunres_Respawn_fnc_addCustomTeleporter; + [_entity, _tp_conditionText, localize "STR_tunres_MSP_TpText", false, nil, [playerSide], true, _menu_condition, false, ["ACE_MainActions","tunres_respawnAction"]] call EFUNC(respawn,addCustomTeleporter); }, false, [], true] call CBA_fnc_addClassEventHandler; @@ -93,6 +69,6 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { [_vehicle, 0, ["ACE_MainActions","tunres_respawnAction"], _remainingTickets] call ace_interact_menu_fnc_addActionToClass; }; } else { - private _errorText = format ["(tunres_MSP_fnc_ace_actions) Tried to add following classname as MSP: %1. But it does not exist",_vehicle]; + private _errorText = format ["(tunres_MSP_fnc_addAceActions) Tried to add following classname as MSP: %1. But it does not exist",_vehicle]; ERROR(_errorText); }; From a8350d97f0cb5ad4c9c6963d56ae0779c299ab6e Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 18 Jan 2024 22:12:00 +0200 Subject: [PATCH 055/228] Rename function tunres_MSP_fnc_add_eh -> tunres_MSP_fnc_addEventHandlers --- ...nc_add_EH.sqf => fnc_addEventHandlers.sqf} | 54 +++++-------------- 1 file changed, 14 insertions(+), 40 deletions(-) rename addons/msp/functions/{fnc_add_EH.sqf => fnc_addEventHandlers.sqf} (56%) diff --git a/addons/msp/functions/fnc_add_EH.sqf b/addons/msp/functions/fnc_addEventHandlers.sqf similarity index 56% rename from addons/msp/functions/fnc_add_EH.sqf rename to addons/msp/functions/fnc_addEventHandlers.sqf index c4a0e88..8362f24 100644 --- a/addons/msp/functions/fnc_add_EH.sqf +++ b/addons/msp/functions/fnc_addEventHandlers.sqf @@ -10,12 +10,13 @@ * None * * Example: - * [] call tunres_MSP_fnc_add_eh + * [] call tunres_MSP_fnc_addEventHandlers */ #include "script_component.hpp" - { - private _vehicle = _x; + private _side = _x; + private _vehicle = GVAR(classnames) get _side; + //check that class exist if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { //Add side variable for vehicle classname @@ -26,20 +27,13 @@ AAR_UPDATE(_entity,"Is active MSP", false); AAR_UPDATE(_entity,"Is contested", false); AAR_UPDATE(_entity,"Enemies near", false); - AAR_UPDATE(_entity,"Report enemies radius", GVAR(report_enemies_range)); - AAR_UPDATE(_entity,"Contested radius max", GVAR(contested_radius_max)); - AAR_UPDATE(_entity,"Contested radius min", GVAR(contested_radius_min)); + AAR_UPDATE(_entity,"Report enemies radius", GVAR(reportEnemiesRange)); + AAR_UPDATE(_entity,"Contested radius max", GVAR(contestedRadiusMax)); + AAR_UPDATE(_entity,"Contested radius min", GVAR(contestedRadiusMin)); AAR_UPDATE(_entity,"Enemy Count", 0); AAR_UPDATE(_entity,"Enemy Count Min", 0); AAR_UPDATE(_entity,"Friendly Count", 0); - private _side = switch (typeOf _entity) do { - case GVAR(clasnames_west): { west }; - case GVAR(clasnames_east): { east }; - case GVAR(clasnames_resistance): { resistance }; - case GVAR(clasnames_civilian): { civilian }; - }; - _entity setVariable [QGVAR(side), _side, true]; }, true, [], true] call CBA_fnc_addClassEventHandler; }; @@ -56,32 +50,12 @@ deleteVehicle _x; } forEach (_unit getVariable QGVAR(objects)); - switch (_side) do { - case east: { - missionNamespace setVariable [QGVAR(status_east), false, true]; - GVAR(vehicle_east) = objNull; - }; - - case west: { - missionNamespace setVariable [QGVAR(status_west), false, true]; - GVAR(vehicle_west) = objNull; - }; - - case resistance: { - missionNamespace setVariable [QGVAR(status_guer), false, true]; - GVAR(vehicle_guer) = objNull; - }; - - case civilian: { - missionNamespace setVariable [QGVAR(status_civ), false, true]; - GVAR(vehicle_civ) = objNull; - }; + GVAR(deployementStatus) set [_side, false]; + publicVariable QGVAR(deployementStatus); + GVAR(activeVehicle) set [_side, objNull]; + publicVariable QGVAR(activeVehicle); - default { }; - }; - - //Do marker update - + //Do marker update [_side, false] remoteExecCall ["tunres_respawn_fnc_update_respawn_point", 2]; (localize "STR_tunres_MSP_destroyed") remoteExecCall ["CBA_fnc_notify", _side]; @@ -94,8 +68,8 @@ [_vehicle, "Deleted", _mspLostEhCode, true, [], true] call CBA_fnc_addClassEventHandler; } else { if (isServer) then { - private _errorText = format ["(tunres_MSP_fnc_ace_actions) Tried to add following classname as MSP: %1. But it does not exist",_vehicle]; + private _errorText = format ["(tunres_MSP_fnc_addAceActions) Tried to add following classname as MSP: %1. But it does not exist",_vehicle]; ERROR(_errorText); }; }; -} forEach [GVAR(clasnames_west), GVAR(clasnames_east), GVAR(clasnames_resistance), GVAR(clasnames_civilian)]; \ No newline at end of file +} forEach [west,east,resistance,civilian]; \ No newline at end of file From 2db02b32a4c706e9d2377e3b235c3bb1168617cf Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 18 Jan 2024 22:12:37 +0200 Subject: [PATCH 056/228] rename function tunres_MSP_fnc_contestZoneMarkers -> tunres_MSP_fnc_createContestZoneMarkers --- .../msp/functions/fnc_contestZoneMarkers.sqf | 43 --------------- .../fnc_createContestZoneMarkers.sqf | 53 +++++++++++++++++++ 2 files changed, 53 insertions(+), 43 deletions(-) delete mode 100644 addons/msp/functions/fnc_contestZoneMarkers.sqf create mode 100644 addons/msp/functions/fnc_createContestZoneMarkers.sqf diff --git a/addons/msp/functions/fnc_contestZoneMarkers.sqf b/addons/msp/functions/fnc_contestZoneMarkers.sqf deleted file mode 100644 index b1704e5..0000000 --- a/addons/msp/functions/fnc_contestZoneMarkers.sqf +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Author: [Tuntematon] - * [Description] - * - * Arguments: - * 0: The first argument - * 1: The second argument - * 2: Multiple input types - * 3: Optional input (default: true) - * 4: Optional input with multiple types (default: {true}) - * 5: Not mandatory input (default: nil) - * - * Return Value: - * The return value - * - * Example: - * ["something", player] call tunres_MSP_fnc_contestZoneMarkers - - */ -#include "script_component.hpp" -params[["_target", player]]; - -openMap true; -private _pos = getPos _target; -private _contestRangeMax = GVAR(contested_radius_max); -private _contestRangeMin = GVAR(contested_radius_min); -private _posMax = _pos getPos [_contestRangeMax, 90]; -private _posMin = _pos getPos [_contestRangeMin, 90]; -[QGVAR(contestMarkerMapMax), _pos, "ELLIPSE", [_contestRangeMax, _contestRangeMax], "COLOR:", "ColorOrange"] call CBA_fnc_createMarker; -[QGVAR(contestMarkerMapMaxText), _posMax, "ICON", [1,1], "TEXT:", "Max Contest range", "COLOR:", "ColorOrange", "TYPE:", "hd_warning"] call CBA_fnc_createMarker; -[QGVAR(contestMarkerMapMin), _pos, "ELLIPSE", [_contestRangeMin, _contestRangeMin], "COLOR:", "colorOPFOR"] call CBA_fnc_createMarker; -[QGVAR(contestMarkerMapMinText), _posMin, "ICON", [1,1],"TEXT:", "Min Contest range", "COLOR:", "ColorRed", "TYPE:", "hd_warning"] call CBA_fnc_createMarker; - -GVAR(contestMarkerMapEH) = addMissionEventHandler ["Map", { - params ["_mapIsOpened", "_mapIsForced"]; - if !(_mapIsOpened) then { - removeMissionEventHandler ["Map", GVAR(contestMarkerMapEH)]; - deleteMarkerLocal QGVAR(contestMarkerMapMax); - deleteMarkerLocal QGVAR(contestMarkerMapMin); - deleteMarkerLocal QGVAR(contestMarkerMapMinText); - deleteMarkerLocal QGVAR(contestMarkerMapMaxText); - }; -}] \ No newline at end of file diff --git a/addons/msp/functions/fnc_createContestZoneMarkers.sqf b/addons/msp/functions/fnc_createContestZoneMarkers.sqf new file mode 100644 index 0000000..3d225da --- /dev/null +++ b/addons/msp/functions/fnc_createContestZoneMarkers.sqf @@ -0,0 +1,53 @@ +/* + * Author: [Tuntematon] + * [Description] + * + * Arguments: + * 0: Give object to get position (default: {player}) + * + * Return Value: + * None + * + * Example: + * [_target] call tunres_MSP_fnc_createContestZoneMarkers + + */ +#include "script_component.hpp" + +if (playerSide isEqualTo sideLogic || !hasInterface) exitWith { }; + +params[["_target", player]]; + +openMap true; +private _pos = getPos _target; +private _reportEnemiesRange = GVAR(reportEnemiesRange); +private _contestRangeMax = GVAR(contestedRadiusMax); +private _contestRangeMin = GVAR(contestedRadiusMin); +private _posMax = _pos getPos [_contestRangeMax, 100]; +private _posMin = _pos getPos [_contestRangeMin, 90]; +private _posReport= _pos getPos [_reportEnemiesRange, 80]; +[QGVAR(contestMarkerMapMax), _pos, "ELLIPSE", [_contestRangeMax, _contestRangeMax], "COLOR:", "ColorOrange"] call CBA_fnc_createMarker; +[QGVAR(contestMarkerMapMaxText), _posMax, "ICON", [1,1], "TEXT:", format["Max Contest range (%1m)",_contestRangeMax], "COLOR:", "ColorOrange", "TYPE:", "hd_warning"] call CBA_fnc_createMarker; + +[QGVAR(contestMarkerMapReport), _pos, "ELLIPSE", [_reportEnemiesRange, _reportEnemiesRange], "COLOR:", "colorOPFOR"] call CBA_fnc_createMarker; +[QGVAR(contestMarkerMapReportText), _posReport, "ICON", [1,1],"TEXT:", format["Report enemies range (%1m)",_reportEnemiesRange], "COLOR:", "ColorYellow", "TYPE:", "hd_warning"] call CBA_fnc_createMarker; + +[QGVAR(contestMarkerMapMin), _pos, "ELLIPSE", [_contestRangeMin, _contestRangeMin], "COLOR:", "colorOPFOR"] call CBA_fnc_createMarker; +[QGVAR(contestMarkerMapMinText), _posMin, "ICON", [1,1],"TEXT:", format["Min Contest range (%1m)",_contestRangeMin], "COLOR:", "ColorRed", "TYPE:", "hd_warning"] call CBA_fnc_createMarker; + +[QGVAR(contestMarkerMapMSPText), _pos, "ICON", [1,1],"TEXT:", "MSP", "TYPE:", "loc_Truck"] call CBA_fnc_createMarker; + + +GVAR(contestMarkerMapEH) = addMissionEventHandler ["Map", { + params ["_mapIsOpened", "_mapIsForced"]; + if !(_mapIsOpened) then { + removeMissionEventHandler ["Map", GVAR(contestMarkerMapEH)]; + deleteMarkerLocal QGVAR(contestMarkerMapMax); + deleteMarkerLocal QGVAR(contestMarkerMapMin); + deleteMarkerLocal QGVAR(contestMarkerMapMinText); + deleteMarkerLocal QGVAR(contestMarkerMapMaxText); + deleteMarkerLocal QGVAR(contestMarkerMapReport); + deleteMarkerLocal QGVAR(contestMarkerMapReportText); + deleteMarkerLocal QGVAR(contestMarkerMapMSPText); + }; +}] \ No newline at end of file From f8ec62393e6f8730f1b79e036b7ff267d3487fc9 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 18 Jan 2024 22:13:04 +0200 Subject: [PATCH 057/228] rename function tunres_MSP_fnc_create_msp_props -> tunres_MSP_fnc_createMspProps --- .../{fnc_create_msp_props.sqf => fnc_createMspProps.sqf} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename addons/msp/functions/{fnc_create_msp_props.sqf => fnc_createMspProps.sqf} (87%) diff --git a/addons/msp/functions/fnc_create_msp_props.sqf b/addons/msp/functions/fnc_createMspProps.sqf similarity index 87% rename from addons/msp/functions/fnc_create_msp_props.sqf rename to addons/msp/functions/fnc_createMspProps.sqf index 10808a6..4aaece8 100644 --- a/addons/msp/functions/fnc_create_msp_props.sqf +++ b/addons/msp/functions/fnc_createMspProps.sqf @@ -10,10 +10,10 @@ * None * * Example: - * [_msp] call tunres_MSP_fnc_create_msp_props + * [_msp] call tunres_MSP_fnc_createMspProps */ #include "script_component.hpp" - +if (!isServer) then {}; params ["_msp"]; //todo give user ability to chose what props will be added. From c3514a96a782c2528d81bca0f948bc59027271bc Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 18 Jan 2024 22:14:03 +0200 Subject: [PATCH 058/228] update function name tunres_MSP_fnc_initate_msp_action -> tunres_MSP_fnc_startUpdateDeployementStatus --- .../msp/functions/fnc_initate_msp_action.sqf | 35 ------------- .../fnc_startUpdateDeployementStatus.sqf | 49 +++++++++++++++++++ 2 files changed, 49 insertions(+), 35 deletions(-) delete mode 100644 addons/msp/functions/fnc_initate_msp_action.sqf create mode 100644 addons/msp/functions/fnc_startUpdateDeployementStatus.sqf diff --git a/addons/msp/functions/fnc_initate_msp_action.sqf b/addons/msp/functions/fnc_initate_msp_action.sqf deleted file mode 100644 index e640eb6..0000000 --- a/addons/msp/functions/fnc_initate_msp_action.sqf +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Author: [Tuntematon] - * [Description] - * Initate ace action from MSP. Either to setup or pack it. - * - * Arguments: - * 0: MSP vehicle - * 1: True: Setup MSP. False: Pack msp - * - * Return Value: - * None - * - * Example: - * [msp, true] call tunres_MSP_fnc_initate_msp_action - */ -#include "script_component.hpp" - - -params ["_target", "_setup"]; -private ["_text", "_time", "_conditio"]; -private _statusvar = format ["%1_%2", QGVAR(status), playerSide]; - -if (_setup) then { - [_target] call FUNC(contestZoneMarkers); - _text = localize "STR_tunres_MSP_fnc_initate_msp_action_setting"; - _conditio = { !(missionNamespace getVariable (_this select 0 select 1)) }; - _time = GVAR(progresbar_time_setup); -} else { - _text = localize "STR_tunres_MSP_fnc_initate_msp_action_packing"; - _conditio = { missionNamespace getVariable (_this select 0 select 1) }; - _time = GVAR(progresbar_time_pack); -}; - -private _code = { (_this select 0 select 0) call FUNC(update_status); }; -[_text, _time, _conditio, _code, {hint "aborted"},[[_target, _setup], _statusvar]] call CBA_fnc_progressBar; \ No newline at end of file diff --git a/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf new file mode 100644 index 0000000..3330327 --- /dev/null +++ b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf @@ -0,0 +1,49 @@ +/* + * Author: [Tuntematon] + * [Description] + * Initate ace action from MSP. Either to setup or pack it. + * + * Arguments: + * 0: MSP vehicle + * 1: True: Setup MSP. False: Pack msp + * + * Return Value: + * None + * + * Example: + * [msp, true] call tunres_MSP_fnc_startUpdateDeployementStatus + */ +#include "script_component.hpp" + + +params ["_target", "_setup"]; +private ["_text", "_time", "_conditio"]; + +if (_setup) then { + [_target] call FUNC(createContestZoneMarkers); + _text = localize "STR_tunres_MSP_fnc_startUpdateDeployementStatus_setting"; + _conditio = { + private _msp = (_args select 0); + driver _msp isEqualTo player && + alive _msp && + !(GVAR(deployementStatus) get playerSide) + }; + _time = GVAR(progresbarTimeSetup); +} else { + _text = localize "STR_tunres_MSP_fnc_startUpdateDeployementStatus_packing"; + _conditio = { + private _msp = (_args select 0); + driver _msp isEqualTo player && + alive _msp && + (GVAR(deployementStatus) get playerSide) + }; + _time = GVAR(progresbarTimePack); +}; + +private _code = { + _args call FUNC(updateDeployementStatus); + openMap false; + }; +//[_text, _time, _conditio, _code, {hint "Aborted"}, [_target, _setup]] call CBA_fnc_progressBar; + +[_time, [_target, _setup], _code, {hint "Aborted!";}, _text, _conditio, ["notOnMap","isnotinside"]] call ace_common_fnc_progressBar; \ No newline at end of file From c448cf75b26af7b7763a3cc3be8e098b0578039f Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 18 Jan 2024 22:18:11 +0200 Subject: [PATCH 059/228] update function name tunres_MSP_fnc_update_status -> tunres_MSP_fnc_updateDeployementStatus --- ...us.sqf => fnc_updateDeployementStatus.sqf} | 56 +++++-------------- 1 file changed, 14 insertions(+), 42 deletions(-) rename addons/msp/functions/{fnc_update_status.sqf => fnc_updateDeployementStatus.sqf} (50%) diff --git a/addons/msp/functions/fnc_update_status.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf similarity index 50% rename from addons/msp/functions/fnc_update_status.sqf rename to addons/msp/functions/fnc_updateDeployementStatus.sqf index 0dcb026..748afc7 100644 --- a/addons/msp/functions/fnc_update_status.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -11,14 +11,15 @@ * none * * Example: - * [msp, true] call tunres_MSP_fnc_update_status + * [msp, true] call tunres_MSP_fnc_updateDeployementStatus */ #include "script_component.hpp" -params ["_msp", "_setup"]; +if (!isServer) then {}; + +params [["_msp", objNull, [objNull]], ["_setup", nil, [false]]]; private _side = _msp getVariable QGVAR(side); -private _msp_var = objNull; private _whoToNotify = [_side] call FUNC(whoToNotify); AAR_UPDATE(_msp,"Is active MSP", _setup); @@ -29,7 +30,7 @@ if (_setup) then { (call compile (localize "STR_tunres_MSP_FNC_setup_notification")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; }; - [_msp] remoteExecCall [QFUNC(create_msp_props), 2]; + [_msp] remoteExecCall [QFUNC(createMspProps), 2]; //force player out from MSP and LOCK it { @@ -40,8 +41,6 @@ if (_setup) then { [_this, 2] remoteExecCall ["lock", _this]; }, _msp] call CBA_fnc_waitUntilAndExecute; - _msp_var = _msp; - } else { if (count _whoToNotify > 0 ) then { (call compile (localize "STR_tunres_MSP_FNC_pack_notification")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; @@ -53,7 +52,7 @@ if (_setup) then { //Unlock vehicle [_msp, 0] remoteExecCall ["lock", _msp]; - + _msp = objNull; }; private _pos = getpos _msp; @@ -61,41 +60,14 @@ private _pos = getpos _msp; [_side, _setup, _pos] remoteExecCall [QEFUNC(respawn,update_respawn_point), 2]; _msp setVariable [QGVAR(isMSP), _setup, true]; - -switch (_side) do { - case west: { - missionNamespace setVariable [QGVAR(vehicle_west), _msp_var, true]; - missionNamespace setVariable [QGVAR(status_west), _setup, true]; - if !(_setup) then { - missionNamespace setVariable [QGVAR(contested_west), false, true]; - }; - }; - - case east: { - missionNamespace setVariable [QGVAR(vehicle_east), _msp_var, true]; - missionNamespace setVariable [QGVAR(status_east), _setup, true]; - if !(_setup) then { - missionNamespace setVariable [QGVAR(contested_east), false, true]; - }; - }; - - case resistance: { - missionNamespace setVariable [QGVAR(vehicle_guer), _msp_var, true]; - missionNamespace setVariable [QGVAR(status_guer), _setup, true]; - if !(_setup) then { - missionNamespace setVariable [QGVAR(contested_guer), false, true]; - }; - }; - - case civilian: { - missionNamespace setVariable [QGVAR(vehicle_civ), _msp_var, true]; - missionNamespace setVariable [QGVAR(status_civ), _setup, true]; - if !(_setup) then { - missionNamespace setVariable [QGVAR(contested_civ), false, true]; - }; - }; -}; +GVAR(deployementStatus) set [_side, _setup]; +publicVariable QGVAR(deployementStatus); +GVAR(activeVehicle) set [_side, _msp]; +publicVariable QGVAR(activeVehicle); if (_setup) then { - [] remoteExecCall [QFUNC(contestedCheck), 2]; + [_side, true] remoteExecCall [QFUNC(contestedCheck), 2]; +} else { + GVAR(contestedStatus) set [_side, false]; + publicVariable QGVAR(contestedStatus); }; \ No newline at end of file From d2396ab643a8685ba94d78b7de7a0e2b4b9dc779 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 18 Jan 2024 22:18:28 +0200 Subject: [PATCH 060/228] update function name tunres_MSP_fnc_init_contested -> tunres_MSP_fnc_startContestedChecks --- addons/msp/functions/fnc_init_contested.sqf | 49 ----------------- .../functions/fnc_startContestedChecks.sqf | 54 +++++++++++++++++++ 2 files changed, 54 insertions(+), 49 deletions(-) delete mode 100644 addons/msp/functions/fnc_init_contested.sqf create mode 100644 addons/msp/functions/fnc_startContestedChecks.sqf diff --git a/addons/msp/functions/fnc_init_contested.sqf b/addons/msp/functions/fnc_init_contested.sqf deleted file mode 100644 index 803651f..0000000 --- a/addons/msp/functions/fnc_init_contested.sqf +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Author: [Tuntematon] - * [Description] - * Notify if ther is enemies inside max radius - * Disable msp if there is more enemies than friendlies inside max range - * Disable MSP if there is even one enemy in min range - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * [] call tunres_MSP_fnc_init_contested - */ -#include "script_component.hpp" - -[{cba_missiontime > GVAR(contested_check_interval)}, { - [{ - if !(GVAR(disableContestedCheck)) then { - [] call FUNC(contestedCheck); - }; - - }, GVAR(contested_check_interval), []] call CBA_fnc_addPerFrameHandler; - - if (GVAR(report_enemies)) then { - [{ - private _hash = GVAR(contestedCheckHash); - { - _x params ["_side", "_isContested", "_status"]; - if (_status) then { - private _enemyCount = (_hash get _side) select 0; - if (_enemyCount > 0 && !_isContested) then { - private _whoToNotify = [_side] call FUNC(whoToNotify); - if (count _whoToNotify > 0 ) then { - (localize "STR_tunres_MSP_FNC_enemies_near") remoteExecCall ["CBA_fnc_notify", _whoToNotify]; - }; - }; - }; - - } forEach [ - [west, GVAR(contested_west), GVAR(status_west)], - [east, GVAR(contested_east), GVAR(contested_east)], - [resistance, GVAR(contested_east), GVAR(contested_east)], - [civilian, GVAR(contested_east), GVAR(contested_east)]]; - }, GVAR(report_enemies_interval), []] call CBA_fnc_addPerFrameHandler; - }; -}] call CBA_fnc_waitUntilAndExecute; \ No newline at end of file diff --git a/addons/msp/functions/fnc_startContestedChecks.sqf b/addons/msp/functions/fnc_startContestedChecks.sqf new file mode 100644 index 0000000..84b94fb --- /dev/null +++ b/addons/msp/functions/fnc_startContestedChecks.sqf @@ -0,0 +1,54 @@ +/* + * Author: [Tuntematon] + * [Description] + * Notify if ther is enemies inside max radius + * Disable msp if there is more enemies than friendlies inside max range + * Disable MSP if there is even one enemy in min range + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call tunres_MSP_fnc_startContestedChecks + */ +#include "script_component.hpp" + +if (!isServer) then {}; + +[{cba_missiontime > GVAR(contestedCheckInterval)}, { + [{ + if !(GVAR(disableContestedCheck)) then { + + { + private _side = _x; + private _mspDeployementStatus = GVAR(deployementStatus) get _side; + if (_mspDeployementStatus) then { + [_side] call FUNC(contestedCheck); + }; + } forEach [west,east,resistance,civilian]; + }; + }, GVAR(contestedCheckInterval), []] call CBA_fnc_addPerFrameHandler; + + if (GVAR(reportEnemiesEnabled)) then { + [{ + private _hash = GVAR(contestedCheckHash); + { + private _side = _x; + private _contestedStatus = GVAR(contestedStatus) get _side; + private _mspStatus = GVAR(deployementStatus) get _side; + if (_mspStatus) then { + private _enemyCount = (_hash get _side) select 0; + if (_enemyCount > 0 && !_contestedStatus) then { + private _whoToNotify = [_side] call FUNC(whoToNotify); + if (count _whoToNotify > 0 ) then { + (localize "STR_tunres_MSP_FNC_enemies_near") remoteExecCall ["CBA_fnc_notify", _whoToNotify]; + }; + }; + }; + } forEach [west,east,resistance,civilian]; + }, GVAR(reportEnemiesInterval), []] call CBA_fnc_addPerFrameHandler; + }; +}] call CBA_fnc_waitUntilAndExecute; From 116be706ab05b67adc6074d9898190e3e117d4ad Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 18 Jan 2024 22:19:25 +0200 Subject: [PATCH 061/228] function renamings & minor tweaks --- addons/msp/XEH_PREP.hpp | 19 +++--- addons/msp/XEH_postInit.sqf | 9 ++- addons/msp/XEH_postInit_client.sqf | 2 +- addons/msp/XEH_postInit_server.sqf | 5 +- addons/msp/XEH_preInit.sqf | 73 +++++++++++++--------- addons/msp/functions/fnc_briefingNotes.sqf | 18 ++---- addons/respawn/functions/fnc_timer.sqf | 2 +- 7 files changed, 71 insertions(+), 57 deletions(-) diff --git a/addons/msp/XEH_PREP.hpp b/addons/msp/XEH_PREP.hpp index c2f9d58..b5b60f5 100644 --- a/addons/msp/XEH_PREP.hpp +++ b/addons/msp/XEH_PREP.hpp @@ -1,11 +1,10 @@ -PREP(ace_actions); -PREP(add_EH); -PREP(contestedCheck); -PREP(create_msp_props); -PREP(init_contested); -PREP(initate_msp_action); -PREP(update_status); -PREP(whoToNotify); +PREP(addAceActions); +PREP(addEventHandlers); PREP(briefingNotes); -PREP(contestZoneMarkers); - +PREP(contestedCheck); +PREP(createContestZoneMarkers); +PREP(createMspProps); +PREP(startContestedChecks); +PREP(startUpdateDeployementStatus); +PREP(updateDeployementStatus); +PREP(whoToNotify); \ No newline at end of file diff --git a/addons/msp/XEH_postInit.sqf b/addons/msp/XEH_postInit.sqf index 9242705..01851f1 100644 --- a/addons/msp/XEH_postInit.sqf +++ b/addons/msp/XEH_postInit.sqf @@ -1,6 +1,9 @@ #include "script_component.hpp" -if !(GVAR(enable)) exitWith { INFO("TUN Mobile Respawn Point Disabled"); }; -INFO("TUN Mobile Respawn Point Enabled"); +[{ ADDON }, { + + if !(GVAR(enable)) exitWith { INFO("TUN Mobile Respawn Point Disabled"); }; + INFO("TUN Mobile Respawn Point Enabled"); -[] call FUNC(add_EH); \ No newline at end of file + [] call FUNC(addEventHandlers); +}] call CBA_fnc_waitUntilAndExecute; \ No newline at end of file diff --git a/addons/msp/XEH_postInit_client.sqf b/addons/msp/XEH_postInit_client.sqf index 5969f00..2f42d0d 100644 --- a/addons/msp/XEH_postInit_client.sqf +++ b/addons/msp/XEH_postInit_client.sqf @@ -4,5 +4,5 @@ ADDON }, { [] call FUNC(briefingNotes); - [] call FUNC(ace_actions); + [] call FUNC(addAceActions); }] call CBA_fnc_waitUntilAndExecute; \ No newline at end of file diff --git a/addons/msp/XEH_postInit_server.sqf b/addons/msp/XEH_postInit_server.sqf index 0edc09d..4cbc2b0 100644 --- a/addons/msp/XEH_postInit_server.sqf +++ b/addons/msp/XEH_postInit_server.sqf @@ -1,3 +1,6 @@ #include "script_component.hpp" -[] call FUNC(init_contested); \ No newline at end of file + +[{ ADDON }, { + [] call FUNC(startContestedChecks); +}] call CBA_fnc_waitUntilAndExecute; \ No newline at end of file diff --git a/addons/msp/XEH_preInit.sqf b/addons/msp/XEH_preInit.sqf index 9bca519..1d97c8b 100644 --- a/addons/msp/XEH_preInit.sqf +++ b/addons/msp/XEH_preInit.sqf @@ -5,6 +5,9 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +//Msp classnames +GVAR(classnames) = createHashMap; + [ QGVAR(enable), "CHECKBOX", @@ -28,9 +31,9 @@ PREP_RECOMPILE_END; ] call CBA_Settings_fnc_init; [ - QGVAR(report_enemies), + QGVAR(reportEnemiesEnabled), "CHECKBOX", - [localize "STR_tunres_MSP_CBA_report_enemies", localize "STR_tunres_MSP_CBA_tooltip_report_enemies"], + [localize "STR_tunres_MSP_CBA_reportEnemiesEnabled", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], true, 1, @@ -39,77 +42,77 @@ PREP_RECOMPILE_END; ] call CBA_Settings_fnc_init; [ - QGVAR(report_enemies_interval), + QGVAR(reportEnemiesInterval), "SLIDER", - [localize "STR_tunres_MSP_CBA_report_enemies_intervala", localize "STR_tunres_MSP_CBA_tooltip_report_enemies_interval"], + [localize "STR_tunres_MSP_CBA_reportEnemiesIntervala", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], [1, 600, 30, 0], 1, { params ["_value"]; - GVAR(report_enemies_interval) = round _value; + GVAR(reportEnemiesInterval) = round _value; }, true ] call CBA_Settings_fnc_init; [ - QGVAR(report_enemies_range), + QGVAR(reportEnemiesRange), "SLIDER", - [localize "STR_tunres_MSP_CBA_report_enemies_range", localize "STR_tunres_MSP_CBA_tooltip_report_enemies_range"], + [localize "STR_tunres_MSP_CBA_reportEnemiesRange", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], [0, 5000, 500, 0], 1, { params ["_value"]; - GVAR(report_enemies_range) = round _value; + GVAR(reportEnemiesRange) = round _value; }, false ] call CBA_Settings_fnc_init; [ - QGVAR(contested_radius_max), + QGVAR(contestedRadiusMax), "SLIDER", - [localize "STR_tunres_MSP_CBA_contested_radius_max", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], + [localize "STR_tunres_MSP_CBA_contestedRadiusMax", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], [0, 3000, 500, 0], 1, { params ["_value"]; - GVAR(contested_radius_max) = round _value; + GVAR(contestedRadiusMax) = round _value; }, false ] call CBA_Settings_fnc_init; [ - QGVAR(contested_radius_min), + QGVAR(contestedRadiusMin), "SLIDER", - [localize "STR_tunres_MSP_CBA_contested_radius_min", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], + [localize "STR_tunres_MSP_CBA_contestedRadiusMin", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], [0, 3000, 200, 0], 1, { params ["_value"]; - GVAR(contested_radius_min) = round _value; + GVAR(contestedRadiusMin) = round _value; }, false ] call CBA_Settings_fnc_init; [ - QGVAR(contested_check_interval), + QGVAR(contestedCheckInterval), "SLIDER", - [localize "STR_tunres_MSP_CBA_contested_check_interval", localize "STR_tunres_MSP_CBA_tooltip_contested_check_interval"], + [localize "STR_tunres_MSP_CBA_contestedCheckInterval", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], [1, 600, 30, 0], 1, { params ["_value"]; - GVAR(contested_check_interval) = round _value; + GVAR(contestedCheckInterval) = round _value; }, true ] call CBA_Settings_fnc_init; [ - QGVAR(progresbar_time_setup), + QGVAR(progresbarTimeSetup), "SLIDER", [localize "STR_tunres_MSP_CBA_setup_progresbar", localize "STR_tunres_MSP_CBA_tooltip_setup_progresbar"], [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_progres"], @@ -117,13 +120,13 @@ PREP_RECOMPILE_END; 1, { params ["_value"]; - GVAR(progresbar_time_setup) = round _value; + GVAR(progresbarTimeSetup) = round _value; }, true ] call CBA_Settings_fnc_init; [ - QGVAR(progresbar_time_pack), + QGVAR(progresbarTimePack), "SLIDER", [localize "STR_tunres_MSP_CBA_pack_progresbar", localize "STR_tunres_MSP_CBA_tooltip_pack_progresbar"], [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_progres"], @@ -131,52 +134,64 @@ PREP_RECOMPILE_END; 1, { params ["_value"]; - GVAR(progresbar_time_pack) = round _value; + GVAR(progresbarTimePack) = round _value; }, true ] call CBA_Settings_fnc_init; [ - QGVAR(clasnames_east), + QGVAR(clasnamesEast), "EDITBOX", [localize "STR_tunres_MSP_CBA_classname_east", localize "STR_tunres_MSP_CBA_tooltip_classname"], [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], "O_Truck_03_transport_F", 1, - {}, + { + params ["_value"]; + GVAR(classnames) set [east , _value]; + }, true ] call CBA_Settings_fnc_init; [ - QGVAR(clasnames_west), + QGVAR(clasnamesWest), "EDITBOX", [localize "STR_tunres_MSP_CBA_classname_west", localize "STR_tunres_MSP_CBA_tooltip_classname"], [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], "B_Truck_01_transport_F", 1, - {}, + { + params ["_value"]; + GVAR(classnames) set [west , _value]; + }, true ] call CBA_Settings_fnc_init; [ - QGVAR(clasnames_resistance), + QGVAR(clasnamesResistance), "EDITBOX", [localize "STR_tunres_MSP_CBA_classname_resistance", localize "STR_tunres_MSP_CBA_tooltip_classname"], [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], "I_Truck_02_transport_F", 1, - {}, + { + params ["_value"]; + GVAR(classnames) set [resistance , _value]; + }, true ] call CBA_Settings_fnc_init; [ - QGVAR(clasnames_civilian), + QGVAR(clasnamesCivilian), "EDITBOX", [localize "STR_tunres_MSP_CBA_classname_civilian", localize "STR_tunres_MSP_CBA_tooltip_classname"], [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], "C_Truck_02_transport_F", 1, - {}, + { + params ["_value"]; + GVAR(classnames) set [civilian , _value]; + }, true ] call CBA_Settings_fnc_init; diff --git a/addons/msp/functions/fnc_briefingNotes.sqf b/addons/msp/functions/fnc_briefingNotes.sqf index c4066bc..2c98420 100644 --- a/addons/msp/functions/fnc_briefingNotes.sqf +++ b/addons/msp/functions/fnc_briefingNotes.sqf @@ -13,15 +13,9 @@ */ #include "script_component.hpp" -if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (IE zeus) - -private _vehicle = switch (playerSide) do { - case west: { GVAR(clasnames_west) }; - case east: { GVAR(clasnames_east) }; - case resistance: { GVAR(clasnames_resistance) }; - case civilian: { GVAR(clasnames_civilian) }; - default { "No side" }; -}; +if (playerSide isEqualTo sideLogic || !hasInterface) exitWith { }; // Exit if a virtual entity (IE zeus) + +private _vehicle = GVAR(classnames) get playerSide; private _text = "MSP settings
"; @@ -29,8 +23,8 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { _text = format ["%1
%2",_text, localize "STR_tunres_Respawn_Briefing_MspEnabled"]; - if (GVAR(report_enemies)) then { - _text = format [localize "STR_tunres_Respawn_Briefing_reportEnemiesEnabled",_text, GVAR(report_enemies_interval), GVAR(report_enemies_range)]; + if (GVAR(reportEnemiesEnabled)) then { + _text = format [localize "STR_tunres_Respawn_Briefing_reportEnemiesEnabled",_text, GVAR(reportEnemiesInterval), GVAR(reportEnemiesRange)]; } else { _text = format ["%1
%2",_text, localize "STR_tunres_Respawn_Briefing_reportEnemiesDisabled"]; }; @@ -39,7 +33,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { _text = format ["%1
You can check remaining tickets from MSP (using ace actions).",_text]; }; - _text = format [localize "STR_tunres_Respawn_Briefing_ContestedCheck",_text, GVAR(contested_check_interval), GVAR(contested_radius_max), GVAR(contested_radius_min)]; + _text = format [localize "STR_tunres_Respawn_Briefing_ContestedCheck",_text, GVAR(contestedCheckInterval), GVAR(contestedRadiusMax), GVAR(contestedRadiusMin)]; _text = format [localize "STR_tunres_Respawn_Briefing_MspVehicle",_text, getText (configFile >> "CfgVehicles" >> _vehicle >> "displayName")]; } else { _text = format ["%1
%2",_text, localize "STR_tunres_Respawn_Briefing_MspDisabled"]; diff --git a/addons/respawn/functions/fnc_timer.sqf b/addons/respawn/functions/fnc_timer.sqf index 1e0ca96..789d6c2 100644 --- a/addons/respawn/functions/fnc_timer.sqf +++ b/addons/respawn/functions/fnc_timer.sqf @@ -33,7 +33,7 @@ if !( GVAR(timerRunning) getOrDefault [_side, false]) then { }, { _this params["_side"]; if (EGVAR(msp,enable)) then { - [] call EFUNC(msp,contestedCheck); + [_side] call EFUNC(msp,contestedCheck); }; GVAR(timerRunning) set [_side, false]; From bf1ba958faebc50aaa4078c09fb9890a67ead97c Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 18 Jan 2024 22:19:48 +0200 Subject: [PATCH 062/228] hash life --- addons/msp/XEH_preInit_server.sqf | 54 ++++++++----------------------- 1 file changed, 13 insertions(+), 41 deletions(-) diff --git a/addons/msp/XEH_preInit_server.sqf b/addons/msp/XEH_preInit_server.sqf index 8a6f256..fc44523 100644 --- a/addons/msp/XEH_preInit_server.sqf +++ b/addons/msp/XEH_preInit_server.sqf @@ -1,49 +1,21 @@ #include "script_component.hpp" //only executed on server -missionNamespace setVariable [QGVAR(disableContestedCheck), false, true]; - -missionNamespace setVariable [QGVAR(contested_east), false, true]; -missionNamespace setVariable [QGVAR(contested_west), false, true]; -missionNamespace setVariable [QGVAR(contested_guer), false, true]; -missionNamespace setVariable [QGVAR(contested_civ), false, true]; - -missionNamespace setVariable [QGVAR(status_east), false, true]; -missionNamespace setVariable [QGVAR(status_west), false, true]; -missionNamespace setVariable [QGVAR(status_guer), false, true]; -missionNamespace setVariable [QGVAR(status_civ), false, true]; - -missionNamespace setVariable [QGVAR(vehicle_east), objNull, true]; -missionNamespace setVariable [QGVAR(vehicle_west), objNull, true]; -missionNamespace setVariable [QGVAR(vehicle_guer), objNull, true]; -missionNamespace setVariable [QGVAR(vehicle_civ), objNull, true]; - -missionNamespace setVariable [QGVAR(nearUnitsEast), [], true]; -missionNamespace setVariable [QGVAR(nearUnitsEastMin), [], true]; +private _emptyFalseArray = [[west,false],[east,false],[resistance,false],[civilian,false]]; -missionNamespace setVariable [QGVAR(nearUnitsWest), [], true]; -missionNamespace setVariable [QGVAR(nearUnitsWestMin), [], true]; - -missionNamespace setVariable [QGVAR(nearUnitsGuer), [], true]; -missionNamespace setVariable [QGVAR(nearUnitsGuerMin), [], true]; - -missionNamespace setVariable [QGVAR(nearUnitsCiv), [], true]; -missionNamespace setVariable [QGVAR(nearUnitsCivMin), [], true]; - -missionNamespace setVariable [QGVAR(enemyCountEast), 0, true]; -missionNamespace setVariable [QGVAR(enemyCountMinEast), 0, true]; -missionNamespace setVariable [QGVAR(friendlyCountEast), 0, true]; +missionNamespace setVariable [QGVAR(disableContestedCheck), false, true]; -missionNamespace setVariable [QGVAR(enemyCountWest), 0, true]; -missionNamespace setVariable [QGVAR(enemyCountMinWest), 0, true]; -missionNamespace setVariable [QGVAR(friendlyCountWest), 0, true]; +//Contested status +GVAR(contestedStatus) = createHashMapFromArray _emptyFalseArray; +publicVariable QGVAR(contestedStatus); -missionNamespace setVariable [QGVAR(enemyCountGuer), 0, true]; -missionNamespace setVariable [QGVAR(enemyCountMinGuer), 0, true]; -missionNamespace setVariable [QGVAR(friendlyCountGuer), 0, true]; +//MSP status. If true, msp is setup +GVAR(deployementStatus) = createHashMapFromArray _emptyFalseArray; +publicVariable QGVAR(deployementStatus); -missionNamespace setVariable [QGVAR(enemyCountCiv), 0, true]; -missionNamespace setVariable [QGVAR(enemyCountMinCiv), 0, true]; -missionNamespace setVariable [QGVAR(friendlyCountCiv), 0, true]; +//MSP vehicle +GVAR(activeVehicle) = createHashMapFromArray [[west, objNull],[east, objNull],[resistance, objNull],[civilian, objNull]]; +publicVariable QGVAR(activeVehicle); -GVAR(contestedCheckHash) = createHashMap; \ No newline at end of file +//Contested stuff +GVAR(contestedCheckHash) = createHashMapFromArray [[west,[0,0,0]],[east,[0,0,0]],[resistance,[0,0,0]],[civilian,[0,0,0]]]; \ No newline at end of file From 8c2f4ea5a900842cfd88167554e27ca6494d441a Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 18 Jan 2024 22:20:07 +0200 Subject: [PATCH 063/228] update contested check to be called with side --- addons/msp/functions/fnc_contestedCheck.sqf | 134 ++++++++++---------- 1 file changed, 65 insertions(+), 69 deletions(-) diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index 98effc2..6ad6f68 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -12,84 +12,80 @@ */ // private _result = diag_codePerformance [{ #include "script_component.hpp" +params[["_side", nil,[west]],["_mspSetup", false]]; +ok = _mspSetup; +if (!isServer) then {}; +private _oldAllowRespawnStatus = GVAR(allowRespawn) get _side; +GVAR(allowRespawn) set [_side, false]; private _hash = GVAR(contestedCheckHash); -private _countestedRangeMax = GVAR(contested_radius_max); -private _countestedRangeMin = GVAR(contested_radius_min); -private _allSides = [west,east,resistance,civilian]; -private _allunits = allUnits select {(side _x) in [west,east,resistance,civilian]}; +private _countestedRangeMax = GVAR(contestedRadiusMax); +private _countestedRangeMin = GVAR(contestedRadiusMin); +private _allUnits = units west + units east + units resistance + units civilian; -{ - _x params ["_mspDeployementStatusVar", "_msp", "_contestedStatusVar", "_side"]; - private _status = missionNamespace getVariable [_mspDeployementStatusVar, false]; - - if ( _status && { !(isNull _msp) } ) then { - - private _sidesToCheck = _allSides - [_side]; - private _friendlySides = [_side]; - private _enemySides = []; +private _mspDeployementStatus = GVAR(deployementStatus) get _side; +private _msp = GVAR(activeVehicle) get _side; - { - private _otherSide = _x; - if (_side getFriend _otherSide < 0.6) then { - _enemySides pushBack _otherSide; - } else { - _friendlySides pushBack _otherSide; - }; - } forEach _sidesToCheck; +if ( _mspDeployementStatus && { !(isNull _msp) } ) then { + + private _sidesToCheck = [west,east,resistance,civilian] - [_side]; + private _friendlySides = [_side]; + private _enemySides = []; - private _pos = getpos _msp; - private _unitsInArea = _allunits inAreaArray [_pos, _countestedRangeMax, _countestedRangeMax, 0, false, (_countestedRangeMax/2)]; - private _enemiesInArea = _unitsInArea select {(side _x) in _enemySides}; - private _friendliesInArea = (count _unitsInArea) - (count _enemiesInArea); - private _enemiesInAreaMin = count (_enemiesInArea inAreaArray [_pos, _countestedRangeMin, _countestedRangeMin, 0, false, (_countestedRangeMin/2)]); - _enemiesInArea = count _enemiesInArea; - _hash set [_side, [_enemiesInArea, _enemiesInAreaMin, _friendliesInArea]]; - - private _isContested = false; - if (_enemiesInAreaMin > 0 || _enemiesInArea > _friendliesInArea) then { - _isContested = true; + { + private _otherSide = _x; + if (_side getFriend _otherSide < 0.6) then { + _enemySides pushBack _otherSide; + } else { + _friendlySides pushBack _otherSide; }; - AAR_UPDATE(_msp, "Enemy Count", _enemiesInArea); - AAR_UPDATE(_msp, "Enemy Count Min", _enemiesInAreaMin); - AAR_UPDATE(_msp, "Friendly Count", _friendliesInArea); - AAR_UPDATE(_msp, "Is contested", _isContested); + } forEach _sidesToCheck; - private _oldContestedStatus = missionNamespace getVariable [_contestedStatusVar, false]; - if (_oldContestedStatus isNotEqualTo _isContested) then { - AAR_UPDATE(_msp, "Is contested", _isContested); - missionNamespace setVariable [_contestedStatusVar, _isContested, true]; - _msp setVariable [QGVAR(isContested), _isContested, true]; - private _whoToNotify = [_side] call FUNC(whoToNotify); - if (count _whoToNotify > 0 ) then { - if (_isContested) then { - [_side, false] call EFUNC(respawn,update_respawn_point); - (call compile (localize "STR_tunres_MSP_FNC_Contested_hint")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; - } else { - [_side, true, (getPos _msp) ] call EFUNC(respawn,update_respawn_point); - (call compile (localize "STR_tunres_MSP_FNC_secured_hint")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; - }; + private _pos = getpos _msp; + private _unitsInArea = _allunits inAreaArray [_pos, _countestedRangeMax, _countestedRangeMax, 0, false, (_countestedRangeMax/2)]; + private _enemiesInArea = _unitsInArea select {(side _x) in _enemySides}; + private _friendliesInArea = (count _unitsInArea) - (count _enemiesInArea); + private _enemiesInAreaMin = count (_enemiesInArea inAreaArray [_pos, _countestedRangeMin, _countestedRangeMin, 0, false, (_countestedRangeMin/2)]); + _enemiesInArea = count _enemiesInArea; + _hash set [_side, [_enemiesInArea, _enemiesInAreaMin, _friendliesInArea]]; + + private _isContested = false; + if (_enemiesInAreaMin > 0 || _enemiesInArea > _friendliesInArea) then { + _isContested = true; + }; + AAR_UPDATE(_msp, "Enemy Count", _enemiesInArea); + AAR_UPDATE(_msp, "Enemy Count Min", _enemiesInAreaMin); + AAR_UPDATE(_msp, "Friendly Count", _friendliesInArea); + AAR_UPDATE(_msp, "Is contested", _isContested); + + private _oldContestedStatus = GVAR(contestedStatus) get _side; + if (_oldContestedStatus isNotEqualTo _isContested) then { + AAR_UPDATE(_msp, "Is contested", _isContested); + GVAR(contestedStatus) set [_side, _isContested]; + publicVariable QGVAR(contestedStatus); + _msp setVariable [QGVAR(isContested), _isContested, true]; + private _whoToNotify = [_side] call FUNC(whoToNotify); + if (count _whoToNotify > 0 ) then { + if (_isContested) then { + [_side, false] call EFUNC(respawn,update_respawn_point); + (call compile (localize "STR_tunres_MSP_FNC_Contested_hint")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; + } else { + [_side, true, (getPos _msp) ] call EFUNC(respawn,update_respawn_point); + (call compile (localize "STR_tunres_MSP_FNC_secured_hint")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; }; }; - - private _debugText = format ["Contested summary. Side: %1, NewStatus: %2, OldStatus: %6, enemyCount: %3, enemyCountMin: %4, FriendlyCount: %5",_side, _isContested, _enemiesInArea, _enemiesInAreaMin, _friendliesInArea, _oldContestedStatus]; + }; + private _debugText = format ["Contested summary. Side: %1, NewStatus: %2, OldStatus: %3, enemyCount: %4, enemyCountMin: %5, FriendlyCount: %6, Was MSP setup: %7",_side, _isContested, _oldContestedStatus, _enemiesInArea, _enemiesInAreaMin, _friendliesInArea, _mspSetup]; LOG(_debugText); - } else { - if (_status) then { - missionNamespace setVariable [_mspDeployementStatusVar, false, true]; - missionNamespace setVariable [_contestedStatusVar, false, true]; - private _text = "MSP Object Disapeared" + str _side; - ERROR(_text); - }; +} else { + if (_mspDeployementStatus) then { + GVAR(deployementStatus) set [_side, false]; + publicVariable QGVAR(deployementStatus); + GVAR(contestedStatus) set [_side, false]; + publicVariable QGVAR(contestedStatus); + private _text = "MSP Object Disapeared" + str _side; + ERROR(_text); }; -} forEach [ - [QGVAR(status_east), GVAR(vehicle_east), QGVAR(contested_east), east], - [QGVAR(status_West), GVAR(vehicle_west), QGVAR(contested_west), west], - [QGVAR(status_guer), GVAR(vehicle_guer), QGVAR(contested_guer), resistance], - [QGVAR(status_civ), GVAR(vehicle_civ), QGVAR(contested_civ), civilian] -]; -// }, nil, 10000]; - -// systemChat str _result; +}; -// diag_log _result; \ No newline at end of file +GVAR(allowRespawn) set [_side, _oldAllowRespawnStatus]; \ No newline at end of file From eab64afb73ea6905b1fb1f7726789ddffc6f8def Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 18 Jan 2024 23:20:16 +0200 Subject: [PATCH 064/228] Add right icon --- addons/msp/functions/fnc_addAceActions.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/msp/functions/fnc_addAceActions.sqf b/addons/msp/functions/fnc_addAceActions.sqf index a7be6d4..327d581 100644 --- a/addons/msp/functions/fnc_addAceActions.sqf +++ b/addons/msp/functions/fnc_addAceActions.sqf @@ -41,7 +41,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { private _chekTime = ["Check Respawn Time", "Check Respawn Time", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", EFUNC(respawn,remainingWaitTimeNotification), _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; //Check contest area - private _checkArea = ["Check contest area", "Check contest area", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", {[_target] call FUNC(createContestZoneMarkers);}, _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; + private _checkArea = ["Check contest area", "Check contest area", "a3\ui_f\data\igui\cfg\simpletasks\types\map_ca.paa", {[_target] call FUNC(createContestZoneMarkers);}, _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; //Ace inteaction [_vehicle, 1, ["ACE_SelfActions"], _createMSP] call ace_interact_menu_fnc_addActionToClass; From 48ee749bd58316c17c7cbae2df67f6bb15291f83 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 3 Feb 2024 10:47:13 +0200 Subject: [PATCH 065/228] Variable cleaning --- addons/main/Stringtable.xml | 10 ++-- addons/msp/functions/fnc_addEventHandlers.sqf | 24 +++++----- addons/msp/functions/fnc_contestedCheck.sqf | 10 ++-- .../functions/fnc_updateDeployementStatus.sqf | 2 +- addons/respawn/XEH_PREP.hpp | 2 +- addons/respawn/XEH_postInit_client.sqf | 3 +- addons/respawn/XEH_postInit_server.sqf | 38 +++++++-------- addons/respawn/XEH_preInit.sqf | 48 +++++++++---------- .../fnc_addCheckTicketCountAction.sqf | 2 +- addons/respawn/functions/fnc_addGear.sqf | 22 ++++----- .../fnc_bleedPlayerTicketCountOnDeath.sqf | 2 +- .../fnc_bleedSideTicketCountOnDeath.sqf | 2 +- .../respawn/functions/fnc_briefingNotes.sqf | 28 +++++------ .../functions/fnc_checkTicketCount.sqf | 2 +- .../respawn/functions/fnc_delayed_respawn.sqf | 6 +-- .../functions/fnc_forceRespawnWave.sqf | 2 +- addons/respawn/functions/fnc_killJIP.sqf | 2 +- .../respawn/functions/fnc_onPlayerKilled.sqf | 19 ++++---- addons/respawn/functions/fnc_respawnUnit.sqf | 2 +- addons/respawn/functions/fnc_savegear.sqf | 2 +- .../respawn/functions/fnc_startSpectator.sqf | 10 ++-- addons/respawn/functions/fnc_timer.sqf | 2 +- .../fnc_updateWaitingRespawnList.sqf | 2 +- addons/respawn/functions/fnc_waitingArea.sqf | 10 ++-- 24 files changed, 126 insertions(+), 126 deletions(-) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index dfb8b1a..59ca2e5 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -6,7 +6,7 @@ Time between respawn waves (minutes) Time between respawn waves (minutes) - + Time after JIP are killed and moved to respawn (minutes) Time after JIP are killed and moved to respawn (minutes) @@ -19,8 +19,8 @@ Ticket count for either for whole side or each player in that side. - "SQF Gearscript": Needs two variables set "tunres_Respawn_Role" which works as parameter and "tunres_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using tunres_Respawn_fnc_savegear function. - "SQF Gearscript": Needs two variables set "tunres_Respawn_Role" which works as parameter and "tunres_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using tunres_Respawn_fnc_savegear function. + "SQF Gearscript": Needs two variables set "tunres_Respawn_Role" which works as parameter and "tunres_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using tunres_Respawn_fnc_savegear function. None: No gearscripts run. People will spawn witouth any gear, use eventhandler "tunres_respawn_EH_unitRespawned " to give your gears. + "SQF Gearscript": Needs two variables set "tunres_Respawn_Role" which works as parameter and "tunres_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using tunres_Respawn_fnc_savegear function. None: No gearscripts run. People will spawn witouth any gear, use eventhandler "tunres_respawn_EH_unitRespawned " to give your gears. "Default" : Endless waves. "Side tickets": Side shares ticket pool. . "Player tickets": Each player has own ticket pool @@ -74,11 +74,11 @@ Only forced respawn waves. No timer! Only forced respawn waves. No timer! - + If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. - + Range for waitingarea. Default 100m Range for waitingarea. Default 100m diff --git a/addons/msp/functions/fnc_addEventHandlers.sqf b/addons/msp/functions/fnc_addEventHandlers.sqf index 8362f24..e3eadf7 100644 --- a/addons/msp/functions/fnc_addEventHandlers.sqf +++ b/addons/msp/functions/fnc_addEventHandlers.sqf @@ -24,15 +24,15 @@ [_vehicle, "InitPost", { params ["_entity"]; - AAR_UPDATE(_entity,"Is active MSP", false); - AAR_UPDATE(_entity,"Is contested", false); - AAR_UPDATE(_entity,"Enemies near", false); - AAR_UPDATE(_entity,"Report enemies radius", GVAR(reportEnemiesRange)); - AAR_UPDATE(_entity,"Contested radius max", GVAR(contestedRadiusMax)); - AAR_UPDATE(_entity,"Contested radius min", GVAR(contestedRadiusMin)); - AAR_UPDATE(_entity,"Enemy Count", 0); - AAR_UPDATE(_entity,"Enemy Count Min", 0); - AAR_UPDATE(_entity,"Friendly Count", 0); + AAR_UPDATE(_entity,"Is active MSP",false); + AAR_UPDATE(_entity,"Is contested",false); + AAR_UPDATE(_entity,"Enemies near",false); + AAR_UPDATE(_entity,"Report enemies radius",GVAR(reportEnemiesRange)); + AAR_UPDATE(_entity,"Contested radius max",GVAR(contestedRadiusMax)); + AAR_UPDATE(_entity,"Contested radius min",GVAR(contestedRadiusMin)); + AAR_UPDATE(_entity,"Enemy Count",0); + AAR_UPDATE(_entity,"Enemy Count Min",0); + AAR_UPDATE(_entity,"Friendly Count",0); _entity setVariable [QGVAR(side), _side, true]; }, true, [], true] call CBA_fnc_addClassEventHandler; @@ -41,9 +41,9 @@ private _mspLostEhCode = { params ["_unit"]; private _side = _unit getVariable QGVAR(side); - AAR_UPDATE(_unit,"Is active MSP", "RIP"); - AAR_UPDATE(_unit,"Is contested", "RIP"); - AAR_UPDATE(_unit,"Enemies near", "RIP"); + AAR_UPDATE(_unit,"Is active MSP","RIP"); + AAR_UPDATE(_unit,"Is contested","RIP"); + AAR_UPDATE(_unit,"Enemies near","RIP"); if ( local _unit && { _unit getVariable [QGVAR(isMSP), false] } ) then { { diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index 6ad6f68..eeab409 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -53,14 +53,14 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { if (_enemiesInAreaMin > 0 || _enemiesInArea > _friendliesInArea) then { _isContested = true; }; - AAR_UPDATE(_msp, "Enemy Count", _enemiesInArea); - AAR_UPDATE(_msp, "Enemy Count Min", _enemiesInAreaMin); - AAR_UPDATE(_msp, "Friendly Count", _friendliesInArea); - AAR_UPDATE(_msp, "Is contested", _isContested); + AAR_UPDATE(_msp,"Enemy Count",_enemiesInArea); + AAR_UPDATE(_msp,"Enemy Count Min",_enemiesInAreaMin); + AAR_UPDATE(_msp,"Friendly Count",_friendliesInArea); + AAR_UPDATE(_msp,"Is contested",_isContested); private _oldContestedStatus = GVAR(contestedStatus) get _side; if (_oldContestedStatus isNotEqualTo _isContested) then { - AAR_UPDATE(_msp, "Is contested", _isContested); + AAR_UPDATE(_msp,"Is contested",_isContested); GVAR(contestedStatus) set [_side, _isContested]; publicVariable QGVAR(contestedStatus); _msp setVariable [QGVAR(isContested), _isContested, true]; diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index 748afc7..aa7c896 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -22,7 +22,7 @@ params [["_msp", objNull, [objNull]], ["_setup", nil, [false]]]; private _side = _msp getVariable QGVAR(side); private _whoToNotify = [_side] call FUNC(whoToNotify); -AAR_UPDATE(_msp,"Is active MSP", _setup); +AAR_UPDATE(_msp,"Is active MSP",_setup); if (_setup) then { diff --git a/addons/respawn/XEH_PREP.hpp b/addons/respawn/XEH_PREP.hpp index b32853f..a6cc414 100644 --- a/addons/respawn/XEH_PREP.hpp +++ b/addons/respawn/XEH_PREP.hpp @@ -10,7 +10,7 @@ PREP(bleedSideTicketCountOnDeath); PREP(briefingNotes); PREP(checkTicketCount); PREP(createLocalMarker); -PREP(delayed_respawn); +PREP(delayedRespawn); PREP(doRespawnWave); PREP(forceRespawnPlayer); PREP(forceRespawnWave); diff --git a/addons/respawn/XEH_postInit_client.sqf b/addons/respawn/XEH_postInit_client.sqf index 9abe843..79c46d6 100644 --- a/addons/respawn/XEH_postInit_client.sqf +++ b/addons/respawn/XEH_postInit_client.sqf @@ -9,8 +9,7 @@ ADDON if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (IE zeus) [{!isNull player }, { - - if (GVAR(gearscriptType) isEqualTo "Save gear") then { + if (GVAR(gearscriptType) isEqualTo 2) then { [] call FUNC(savegear); }; diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 93077bd..c41903b 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -1,20 +1,20 @@ #include "script_component.hpp" -if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Playertickets") then { +if (GVAR(respawnType) isEqualTo 2) then { GVAR(PlayerTicektsHash) = createHashMap; - AAR_UPDATE("west","Player tickets", (round GVAR(tickets_west))); - AAR_UPDATE("east","Player tickets", (round GVAR(tickets_east))); - AAR_UPDATE("guer","Player tickets", (round GVAR(tickets_guer))); - AAR_UPDATE("civ","Player tickets", (round GVAR(tickets_civ))); + AAR_UPDATE("west","Player tickets",(round GVAR(initialTicketsWest))); + AAR_UPDATE("east","Player tickets",(round GVAR(initialTicketsEast))); + AAR_UPDATE("guer","Player tickets",(round GVAR(initialTicketsResistance))); + AAR_UPDATE("civ","Player tickets",(round GVAR(initialTicketsCivilian))); }; -if (GVAR(respawn_type) isNotEqualTo localize "STR_tunres_Respawn_Type_Default") then { +if (GVAR(respawnType) isNotEqualTo 0) then { // if player disconnect add its uid to list so when he come back. No ticket is used. Only used if Kill jip is enabled addMissionEventHandler ["PlayerDisconnected", { - if (GVAR(respawn_type) isEqualTo "default") exitWith { }; + if (GVAR(respawnType) isEqualTo 0) exitWith { }; params ["_id", "_uid", "_name", "_jip", "_owner"]; - if (cba_missiontime > (GVAR(killJIP_time) * 60) && GVAR(killJIP)) then { + if (cba_missiontime > (GVAR(killJipTime) * 60) && GVAR(killJIP)) then { GVAR(disconnected_players) set [_uid, true]; }; }]; @@ -23,39 +23,39 @@ if (GVAR(respawn_type) isNotEqualTo localize "STR_tunres_Respawn_Type_Default") //clean bodies during briefing && safestart addMissionEventHandler ["HandleDisconnect", { params ["_unit", "_id", "_uid", "_name"]; - if (cba_missiontime < (GVAR(killJIP_time) * 60) || _unit getVariable [QGVAR(isWaitingRespawn),false]) then { + if (cba_missiontime < (GVAR(killJipTime) * 60) || _unit getVariable [QGVAR(isWaitingRespawn),false]) then { deleteVehicle _unit; }; false; }]; -//AAR times +//AAR times if ( !isnil "afi_aar2" ) then { [{cba_missiontime > 10}, { if (missionNamespace getVariable ["afi_aar2", false]) then { - if ((GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Sidetickets")) then { + if ((GVAR(respawnType) isEqualTo 1)) then { private _hashTickets = GVAR(tickets); private _enabledSideHash = GVAR(enabledSides); if (_enabledSideHash getOrDefault [west, false]) then { private _ticektsWest = _hashTickets get west; - AAR_UPDATE("west","Side tickets", _ticektsWest); + AAR_UPDATE("west","Side tickets",_ticektsWest); }; if (_enabledSideHash getOrDefault [east, false]) then { private _ticektsEast = _hashTickets get east; - AAR_UPDATE("east","Side tickets", _ticektsEast); + AAR_UPDATE("east","Side tickets",_ticektsEast); }; if (_enabledSideHash getOrDefault [resistance, false]) then { private _ticektsResistance = _hashTickets get resistance; - AAR_UPDATE("guer","Side tickets", _ticektsResistance); + AAR_UPDATE("guer","Side tickets",_ticektsResistance); }; if (_enabledSideHash getOrDefault [civilian, false]) then { private _ticektsCivilian = _hashTickets get civilian; - AAR_UPDATE("civ","Side tickets", _ticektsCivilian); + AAR_UPDATE("civ","Side tickets",_ticektsCivilian); }; }; @@ -63,22 +63,22 @@ if ( !isnil "afi_aar2" ) then { private _enabledSideHash = GVAR(enabledSides); if (_enabledSideHash getOrDefault [west, false]) then { private _time = (_hashTime get west); - AAR_UPDATE("west","Next respawn wave", _time); + AAR_UPDATE("west","Next respawn wave",_time); }; if (_enabledSideHash getOrDefault [east, false]) then { private _time = (_hashTime get east); - AAR_UPDATE("east","Next respawn wave", _time); + AAR_UPDATE("east","Next respawn wave",_time); }; if (_enabledSideHash getOrDefault [resistance, false]) then { private _time = (_hashTime get resistance); - AAR_UPDATE("guer","Next respawn wave", _time); + AAR_UPDATE("guer","Next respawn wave",_time); }; if (_enabledSideHash getOrDefault [civilian, false]) then { private _time = (_hashTime get civilian); - AAR_UPDATE("civ","Next respawn wave", _time); + AAR_UPDATE("civ","Next respawn wave",_time); }; }, 10] call CBA_fnc_addPerFrameHandler; diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index 9fc5331..bacde26 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -71,25 +71,25 @@ GVAR(selfTPmenuOpenObj) = objNull; ] call CBA_Settings_fnc_init; [ - QGVAR(killJIP_time), + QGVAR(killJipTime), "SLIDER", - ["Kill JIP Time", localize "STR_tunres_Respawn_CBA_tooltip_killjip_time"], + ["Kill JIP Time", localize "STR_tunres_Respawn_CBA_tooltip_killJipTime"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], [1, 300, 20, 0], 1, { params ["_value"]; - GVAR(killJIP_time) = round _value; + GVAR(killJipTime) = round _value; }, true ] call CBA_Settings_fnc_init; [ - QGVAR(respawn_type), + QGVAR(respawnType), "LIST", ["Respawn Type", localize "STR_tunres_Respawn_CBA_tooltip_respawntypes"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], - [[localize "STR_tunres_Respawn_Type_Default", localize "STR_tunres_Respawn_Type_Sidetickets", localize "STR_tunres_Respawn_Type_Playertickets"], [localize "STR_tunres_Respawn_Type_Default", localize "STR_tunres_Respawn_Type_Sidetickets", localize "STR_tunres_Respawn_Type_Playertickets"], 0], + [[0, 1, 2], [localize "STR_tunres_Respawn_Type_Default", localize "STR_tunres_Respawn_Type_Sidetickets", localize "STR_tunres_Respawn_Type_Playertickets"], 0], 1, {}, true @@ -100,14 +100,14 @@ GVAR(selfTPmenuOpenObj) = objNull; "LIST", ["Gearscript type", localize "STR_tunres_Respawn_CBA_tooltip_gearscript"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], - [["SQF Gearscript", "Potato Tool", "Save gear"], ["SQF Gearscript", "Potato Tool", "Save gear"], 0], + [[0, 1, 2, 3], ["SQF Gearscript", "Potato Tool", "Save gear", "None"], 3], 1, {}, true ] call CBA_Settings_fnc_init; [ - QGVAR(forced_respawn), + QGVAR(forcedRespawn), "CHECKBOX", ["Only Forced Waves", localize "STR_tunres_Respawn_CBA_tooltip_forceRespawn"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], @@ -118,36 +118,36 @@ GVAR(selfTPmenuOpenObj) = objNull; ] call CBA_Settings_fnc_init; [ - QGVAR(delayed_respawn), + QGVAR(delayedRespawn), "SLIDER", - ["Delayed respawn", localize "STR_tunres_Respawn_CBA_tooltip_delayed_respawn"], + ["Delayed respawn", localize "STR_tunres_Respawn_CBA_tooltip_delayedRespawn"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], [0, 100, 0, 0], 1, { params ["_value"]; - GVAR(delayed_respawn) = round _value; + GVAR(delayedRespawn) = round _value; }, true ] call CBA_Settings_fnc_init; [ - QGVAR(waiting_area_range), + QGVAR(waitingAreaRange), "SLIDER", - ["Waiting Area Range", localize "STR_tunres_Respawn_CBA_tooltip_waiting_area_range"], + ["Waiting Area Range", localize "STR_tunres_Respawn_CBA_tooltip_waitingAreaRange"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], [30, 300, 100, 0], 1, { params ["_value"]; - GVAR(waiting_area_range) = round _value; + GVAR(waitingAreaRange) = round _value; }, true ] call CBA_Settings_fnc_init; //Wave times [ - QGVAR(time_west), + QGVAR(initialWaveTimeWest), "SLIDER", ["West", localize "STR_tunres_Respawn_CBA_tooltip_time"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], @@ -161,7 +161,7 @@ GVAR(selfTPmenuOpenObj) = objNull; ] call CBA_Settings_fnc_init; [ - QGVAR(time_east), + QGVAR(initialWaveTimeEast), "SLIDER", ["East", localize "STR_tunres_Respawn_CBA_tooltip_time"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], @@ -175,7 +175,7 @@ GVAR(selfTPmenuOpenObj) = objNull; ] call CBA_Settings_fnc_init; [ - QGVAR(time_guer), + QGVAR(initialWaveTimeResistance), "SLIDER", ["Resistance", localize "STR_tunres_Respawn_CBA_tooltip_time"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], @@ -189,7 +189,7 @@ GVAR(selfTPmenuOpenObj) = objNull; ] call CBA_Settings_fnc_init; [ - QGVAR(time_civ), + QGVAR(initialWaveTimeCivilian), "SLIDER", ["Civilian", localize "STR_tunres_Respawn_CBA_tooltip_time"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], @@ -204,7 +204,7 @@ GVAR(selfTPmenuOpenObj) = objNull; //Spectator camera modes [ - QGVAR(spectate_Cameramode_1st), + QGVAR(spectateCameramode1st), "CHECKBOX", ["1st", localize "STR_tunres_Respawn_CBA_tooltip_specta_modes"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], @@ -215,7 +215,7 @@ GVAR(selfTPmenuOpenObj) = objNull; ] call CBA_Settings_fnc_init; [ - QGVAR(spectate_Cameramode_3th), + QGVAR(spectateCameramode3th), "CHECKBOX", ["3th", localize "STR_tunres_Respawn_CBA_tooltip_specta_modes"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], @@ -226,7 +226,7 @@ GVAR(selfTPmenuOpenObj) = objNull; ] call CBA_Settings_fnc_init; [ - QGVAR(spectate_Cameramode_free), + QGVAR(spectateCameramodeFree), "CHECKBOX", ["Free", localize "STR_tunres_Respawn_CBA_tooltip_specta_modes"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], @@ -238,7 +238,7 @@ GVAR(selfTPmenuOpenObj) = objNull; //Ticket count [ - QGVAR(tickets_west), + QGVAR(initialTicketsWest), "SLIDER", ["West", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], @@ -252,7 +252,7 @@ GVAR(selfTPmenuOpenObj) = objNull; ] call CBA_Settings_fnc_init; [ - QGVAR(tickets_east), + QGVAR(initialTicketsEast), "SLIDER", ["East", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], @@ -266,7 +266,7 @@ GVAR(selfTPmenuOpenObj) = objNull; ] call CBA_Settings_fnc_init; [ - QGVAR(tickets_guer), + QGVAR(initialTicketsResistance), "SLIDER", ["Resistance", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], @@ -280,7 +280,7 @@ GVAR(selfTPmenuOpenObj) = objNull; ] call CBA_Settings_fnc_init; [ - QGVAR(tickets_civ), + QGVAR(initialTicketsCivilian), "SLIDER", ["Civilian", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], diff --git a/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf b/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf index 2b4a08f..4f6ce93 100644 --- a/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf +++ b/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf @@ -18,7 +18,7 @@ params [ ["_object", objNull, [objNull]], ["_offset", nil, [[]]], ["_parrenPath", ["ACE_MainActions"], [[]]]]; -if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Default") exitWith { +if (GVAR(respawnType) isEqualTo 0) exitWith { LOG("Skip adding ticket check ace action, as we dont use tickets"); }; diff --git a/addons/respawn/functions/fnc_addGear.sqf b/addons/respawn/functions/fnc_addGear.sqf index b9f4b64..39e0c05 100644 --- a/addons/respawn/functions/fnc_addGear.sqf +++ b/addons/respawn/functions/fnc_addGear.sqf @@ -14,29 +14,29 @@ */ #include "script_component.hpp" if (isDedicated) exitWith { }; +params [["_unit", player, [objNull]]]; switch (GVAR(gearscriptType)) do { - case "SQF Gearscript": { - private _gearScriptPath = player getVariable [QGVAR(GearPath), "Not set"]; + case 0: { + private _gearScriptPath = _unit getVariable [QGVAR(GearPath), "Not set"]; if (_gearScriptPath isEqualTo "Not set") exitWith { hint "this unit is missing its gearscript path!"}; - private _role = player getVariable [QGVAR(Role), "Not Set"]; + private _role = _unit getVariable [QGVAR(Role), "Not Set"]; if (_role isEqualTo "Not set") exitWith { hint "Missing role variable !"}; - [_role, player] call compile preprocessFileLineNumbers _gearScriptPath; + [_role, _unit] call compile preprocessFileLineNumbers _gearScriptPath; }; - case "Potato Tool": { - [player] call potato_assignGear_fnc_assignGearMan; + case 1: { + [_unit] call potato_assignGear_fnc_assignGearMan; }; - case "Save gear": { - player setUnitLoadout GVAR(savedgear); + case 2: { + _unit setUnitLoadout GVAR(savedGear); }; - default { }; }; if (isClass(configFile >> "CfgPatches" >> "tfar_core")) then { - [QGVAR(setTfarLRsettings_EH), [player]] call CBA_fnc_localEvent; + [QGVAR(setTfarLRsettings_EH), [_unit]] call CBA_fnc_localEvent; }; -[QGVAR(EH_GearAdded), [player]] call CBA_fnc_localEvent; \ No newline at end of file +[QGVAR(EH_GearAdded), [_unit]] call CBA_fnc_localEvent; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_bleedPlayerTicketCountOnDeath.sqf b/addons/respawn/functions/fnc_bleedPlayerTicketCountOnDeath.sqf index b068fea..7a08815 100644 --- a/addons/respawn/functions/fnc_bleedPlayerTicketCountOnDeath.sqf +++ b/addons/respawn/functions/fnc_bleedPlayerTicketCountOnDeath.sqf @@ -27,7 +27,7 @@ if ( _remainingTickets > 0 ) then { GVAR(disconnected_players) set [_uid, false]; } else { DEC(_remainingTickets); - AAR_UPDATE(_player,"Player tickets", _remainingTickets); + AAR_UPDATE(_player,"Player tickets",_remainingTickets); _hash set [_playerUID, _remainingTickets]; }; [5] remoteExecCall ["setPlayerRespawnTime", _player]; diff --git a/addons/respawn/functions/fnc_bleedSideTicketCountOnDeath.sqf b/addons/respawn/functions/fnc_bleedSideTicketCountOnDeath.sqf index 333a4ec..4e895a4 100644 --- a/addons/respawn/functions/fnc_bleedSideTicketCountOnDeath.sqf +++ b/addons/respawn/functions/fnc_bleedSideTicketCountOnDeath.sqf @@ -29,7 +29,7 @@ _remainingTickets = GVAR(tickets) get _side; if ( _remainingTickets > 0 ) then { DEC(_remainingTickets); private _sideSTR = str _side; - AAR_UPDATE(_sideSTR,"Side tickets", _remainingTickets); + AAR_UPDATE(_sideSTR,"Side tickets",_remainingTickets); GVAR(tickets) set [_side, _remainingTickets]; publicVariable QGVAR(tickets); [5] remoteExecCall ["setPlayerRespawnTime", _player]; diff --git a/addons/respawn/functions/fnc_briefingNotes.sqf b/addons/respawn/functions/fnc_briefingNotes.sqf index e8710a6..faa7de8 100644 --- a/addons/respawn/functions/fnc_briefingNotes.sqf +++ b/addons/respawn/functions/fnc_briefingNotes.sqf @@ -18,17 +18,17 @@ if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (I private _text = "Respawn settings
"; if (GVAR(briefingEnableShowRespawnType)) then { - if ( GVAR(forced_respawn) ) then { + if ( GVAR(forcedRespawn) ) then { _text = format ["%1
%2",_text, localize "STR_tunres_Respawn_Briefing_onlyForcedWaves"]; }; - switch (GVAR(respawn_type)) do { - case localize "STR_tunres_Respawn_Type_Sidetickets": { - _text = format ["
%1
%2",_text, localize "STR_tunres_Respawn_Briefing_sidetickets"]; - }; - case localize "STR_tunres_Respawn_Type_Default": { + switch (GVAR(respawnType)) do { + case 0: { _text = format ["
%1
%2",_text, localize "STR_tunres_Respawn_Briefing_default"]; }; - case localize "STR_tunres_Respawn_Type_Playertickets": { + case 1: { + _text = format ["
%1
%2",_text, localize "STR_tunres_Respawn_Briefing_sidetickets"]; + }; + case 2: { _text = format ["
%1
%2",_text, localize "STR_tunres_Respawn_Briefing_playertickets"]; }; default { }; @@ -54,7 +54,7 @@ if (GVAR(briefingEnableShowTime)) then { _text = format ["%1
For Civilian is %2min",_text, _waveLenghtTimeHash get civilian]; }; - private _delayedRespawn = GVAR(delayed_respawn); + private _delayedRespawn = GVAR(delayedRespawn); if (_delayedRespawn > 0) then { private _respawnTime = _waveLenghtTimeHash get playerSide; _respawnTime = _respawnTime * 60; @@ -67,22 +67,22 @@ if (GVAR(briefingEnableShowTime)) then { }; }; -if (GVAR(briefingEnableShowTickets) && { GVAR(respawn_type) isNotEqualTo localize "STR_tunres_Respawn_Type_Default"}) then { +if (GVAR(briefingEnableShowTickets) && { GVAR(respawnType) isNotEqualTo 0}) then { _text = format ["%1

Tickets",_text]; if (playerSide isEqualTo west || GVAR(briefingEnableShowOtherSidesDataWest)) then { - _text = format ["%1
Ticket count: %2 (West)",_text, GVAR(tickets_west)]; + _text = format ["%1
Ticket count: %2 (West)",_text, GVAR(initialTicketsWest)]; }; if (playerSide isEqualTo east || GVAR(briefingEnableShowOtherSidesDataEast)) then { - _text = format ["%1
Ticket count: %2 (East)",_text, GVAR(tickets_east)]; + _text = format ["%1
Ticket count: %2 (East)",_text, GVAR(initialTicketsEast)]; }; if (playerSide isEqualTo resistance || GVAR(briefingEnableShowOtherSidesDataResistance)) then { - _text = format ["%1
Ticket count: %2 (Resistance)",_text, GVAR(tickets_guer)]; + _text = format ["%1
Ticket count: %2 (Resistance)",_text, GVAR(initialTicketsResistance)]; }; if (playerSide isEqualTo civilian || GVAR(briefingEnableShowOtherSidesDataCivilian)) then { - _text = format ["%1
Ticket count: %2 (Civilian)",_text, GVAR(tickets_civ)]; + _text = format ["%1
Ticket count: %2 (Civilian)",_text, GVAR(initialTicketsCivilian)]; }; if (GVAR(allowCheckTicketsBase)) then { @@ -91,7 +91,7 @@ if (GVAR(briefingEnableShowTickets) && { GVAR(respawn_type) isNotEqualTo localiz }; if (GVAR(killJIP)) then { - _text = format [localize "STR_tunres_Respawn_Briefing_killJipEnabled",_text, GVAR(killJIP_time)]; + _text = format [localize "STR_tunres_Respawn_Briefing_killJipEnabled",_text, GVAR(killJipTime)]; } else { _text = format ["%1

%2",_text, localize "STR_tunres_Respawn_Briefing_killJipDisabled"]; }; diff --git a/addons/respawn/functions/fnc_checkTicketCount.sqf b/addons/respawn/functions/fnc_checkTicketCount.sqf index fd2702a..6901b5c 100644 --- a/addons/respawn/functions/fnc_checkTicketCount.sqf +++ b/addons/respawn/functions/fnc_checkTicketCount.sqf @@ -15,7 +15,7 @@ if (isDedicated) exitWith { }; params [["_side", nil, [west]]]; -if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Sidetickets") then { +if (GVAR(respawnType) isEqualTo 1) then { _ticetCount = GVAR(tickets) get _side; _text = format["%1 %2",localize "STR_tunres_Respawn_RemainingTicketsText", _ticetCount]; _text call CBA_fnc_notify; diff --git a/addons/respawn/functions/fnc_delayed_respawn.sqf b/addons/respawn/functions/fnc_delayed_respawn.sqf index 47a57b3..ffcff74 100644 --- a/addons/respawn/functions/fnc_delayed_respawn.sqf +++ b/addons/respawn/functions/fnc_delayed_respawn.sqf @@ -10,18 +10,18 @@ * The return value * * Example: - * [] call tunres_Respawn_fnc_delayed_respawn + * [] call tunres_Respawn_fnc_delayedRespawn */ #include "script_component.hpp" params ["_unit", "_side"]; private _skip = false; -if (GVAR(delayed_respawn) > 0) then { +if (GVAR(delayedRespawn) > 0) then { private _hashWaitTime = GVAR(nextWaveTimes); private _hashWaveLenght = GVAR(waveLenghtTimes); private _time = _hashWaitTime get _side; private _waveLenghtTime = _hashWaveLenght get _side; - _skip = ((_time - cba_missiontime) < ((_waveLenghtTime * 60) * (GVAR(delayed_respawn) / 100))); + _skip = ((_time - cba_missiontime) < ((_waveLenghtTime * 60) * (GVAR(delayedRespawn) / 100))); }; _unit setVariable [QGVAR(skipNextWave), _skip, true]; diff --git a/addons/respawn/functions/fnc_forceRespawnWave.sqf b/addons/respawn/functions/fnc_forceRespawnWave.sqf index e34b62d..3f252fc 100644 --- a/addons/respawn/functions/fnc_forceRespawnWave.sqf +++ b/addons/respawn/functions/fnc_forceRespawnWave.sqf @@ -21,6 +21,6 @@ params [["_side", nil, [east]], ["_reset", false, [false]]]; [_side, true] call FUNC(doRespawnWave); -if (_reset && { !(GVAR(forced_respawn)) }) then { +if (_reset && { !(GVAR(forcedRespawn)) }) then { [_side] call FUNC(timer); }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_killJIP.sqf b/addons/respawn/functions/fnc_killJIP.sqf index 4191541..1778d85 100644 --- a/addons/respawn/functions/fnc_killJIP.sqf +++ b/addons/respawn/functions/fnc_killJIP.sqf @@ -16,7 +16,7 @@ if (!hasInterface) exitWith { }; [{!isNull player}, { - if (cba_missiontime > (GVAR(killJIP_time) * 60) && GVAR(killJIP)) then { + if (cba_missiontime > (GVAR(killJipTime) * 60) && GVAR(killJIP)) then { [{ [player, "Respawn", { params ["_newObject","_oldObject"]; diff --git a/addons/respawn/functions/fnc_onPlayerKilled.sqf b/addons/respawn/functions/fnc_onPlayerKilled.sqf index 2b8c085..1c0c324 100644 --- a/addons/respawn/functions/fnc_onPlayerKilled.sqf +++ b/addons/respawn/functions/fnc_onPlayerKilled.sqf @@ -19,19 +19,20 @@ setPlayerRespawnTime 99999; ( "BIS_fnc_respawnSpectator" call BIS_fnc_rscLayer ) cutText [ "", "PLAIN" ]; if (GVAR(endRespawns)) exitWith { - [{remoteExecCall [QFUNC(startSpectator), _this];}, _player, 5] call CBA_fnc_waitAndExecute; + [{ + remoteExecCall [QFUNC(startSpectator), _this]; + }, player, 5] call CBA_fnc_waitAndExecute; }; -switch (GVAR(respawn_type)) do { - case localize "STR_tunres_Respawn_Type_Sidetickets": { +switch (GVAR(respawnType)) do { + case 0: { + setPlayerRespawnTime 5; + }; + case 1: { [playerSide, player] remoteExecCall [QFUNC(bleedSideTicketCountOnDeath),2]; }; - - case localize "STR_tunres_Respawn_Type_Playertickets": { + case 2: { [playerSide, player] remoteExecCall [QFUNC(bleedPlayerTicketCountOnDeath),2]; }; - - default { - setPlayerRespawnTime 5; - }; + default {}; }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_respawnUnit.sqf b/addons/respawn/functions/fnc_respawnUnit.sqf index 9f24468..f60887e 100644 --- a/addons/respawn/functions/fnc_respawnUnit.sqf +++ b/addons/respawn/functions/fnc_respawnUnit.sqf @@ -32,6 +32,6 @@ private _text = localize "STR_tunres_Respawn_FNC_moveRespawnText"; [_unit, _respawnPosition, _text, 20, true] call FUNC(teleportUnit); -remoteExecCall [QFUNC(addGear), _unit]; +[_unit] remoteExecCall [QFUNC(addGear), _unit]; [QGVAR(EH_unitRespawned), [_unit], _unit] call CBA_fnc_localEvent; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_savegear.sqf b/addons/respawn/functions/fnc_savegear.sqf index fc6f87a..d40c55f 100644 --- a/addons/respawn/functions/fnc_savegear.sqf +++ b/addons/respawn/functions/fnc_savegear.sqf @@ -24,4 +24,4 @@ if (isNumber (configFile >> "CfgWeapons" >> _radio >> "tf_radio")) then { _gearToSave set [9, _itemsList]; }; -GVAR(savedgear) = _gearToSave; \ No newline at end of file +GVAR(savedGear) = _gearToSave; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_startSpectator.sqf b/addons/respawn/functions/fnc_startSpectator.sqf index e11231e..816917f 100644 --- a/addons/respawn/functions/fnc_startSpectator.sqf +++ b/addons/respawn/functions/fnc_startSpectator.sqf @@ -55,9 +55,9 @@ if ((isClass(configFile >> "CfgPatches" >> "ace_main"))) then { private _Cameramodes = []; - if (GVAR(spectate_Cameramode_1st)) then { _Cameramodes pushBack 0; }; - if (GVAR(spectate_Cameramode_3th)) then { _Cameramodes pushBack 1; }; - if (GVAR(spectate_Cameramode_free)) then { _Cameramodes pushBack 2; }; + if (GVAR(spectateCameramode1st)) then { _Cameramodes pushBack 0; }; + if (GVAR(spectateCameramode3th)) then { _Cameramodes pushBack 1; }; + if (GVAR(spectateCameramodeFree)) then { _Cameramodes pushBack 2; }; [_Cameramodes, []] call ace_spectator_fnc_updateCameraModes; } else { @@ -65,8 +65,8 @@ if ((isClass(configFile >> "CfgPatches" >> "ace_main"))) then { player, _allowed_sides, true, - GVAR(spectate_Cameramode_free), - GVAR(spectate_Cameramode_3th), + GVAR(spectateCameramodeFree), + GVAR(spectateCameramode3th), true, true, true, diff --git a/addons/respawn/functions/fnc_timer.sqf b/addons/respawn/functions/fnc_timer.sqf index 789d6c2..61f142f 100644 --- a/addons/respawn/functions/fnc_timer.sqf +++ b/addons/respawn/functions/fnc_timer.sqf @@ -17,7 +17,7 @@ params [["_side", nil, [west]]]; if (!isServer) exitWith { }; -if (GVAR(forced_respawn)) exitWith { INFO("No timer, Only forced waves"); }; +if (GVAR(forcedRespawn)) exitWith { INFO("No timer, Only forced waves"); }; private _hashWaitTime = GVAR(nextWaveTimes); private _hashWaveLenght = GVAR(waveLenghtTimes); diff --git a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf index ce749f6..46ac4cc 100644 --- a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf +++ b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf @@ -15,7 +15,7 @@ #include "script_component.hpp" params [["_player", nil, [objNull]], ["_addPlayer", nil, [false]], ["_side", nil, [west]]]; -private _skip = [_player, _side] call FUNC(delayed_respawn); +private _skip = [_player, _side] call FUNC(delayedRespawn); if !(_skip) then { private _waitingRespawnHash = GVAR(waitingRespawnList); diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index b527316..21ce595 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -51,22 +51,22 @@ GVAR(firstMark) = true; if (_remainingWaitTime >= 0 && { GVAR(allowRespawn) get _playerSide }) then { _text = format ["%2
%1
", ([_remainingWaitTime] call CBA_fnc_formatElapsedTime), localize "STR_tunres_Respawn_FNC_remaining_time"]; } else { - if (player getvariable [QGVAR(isWaitingRespawn), true] && { !(GVAR(forced_respawn)) } && { !(GVAR(allowRespawn) get _playerSide) }) then { + if (player getvariable [QGVAR(isWaitingRespawn), true] && { !(GVAR(forcedRespawn)) } && { !(GVAR(allowRespawn) get _playerSide) }) then { _text = format ["%1", localize "STR_tunres_Respawn_FNC_RespawnDisabled"]; } else { - _text = format ["Something is vevy vevy wrong. time: %1 - allowRespawn: %2 - forced respawn: %3 ", _remainingWaitTime, GVAR(allowRespawn) get playerSid, GVAR(forced_respawn)]; + _text = format ["Something is vevy vevy wrong. time: %1 - allowRespawn: %2 - forced respawn: %3 ", _remainingWaitTime, GVAR(allowRespawn) get playerSid, GVAR(forcedRespawn)]; }; }; private _usesTickets = false; private "_tickets"; private "_ticketsTypeText"; - if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Sidetickets") then { + if (GVAR(respawnType) isEqualTo 1) then { _tickets = GVAR(tickets) get _playerSide; _ticketsTypeText = localize "STR_tunres_Respawan_RemainingTicketsSide"; _usesTickets = true; } else { - if (GVAR(respawn_type) isEqualTo localize "STR_tunres_Respawn_Type_Playertickets") then { + if (GVAR(respawnType) isEqualTo 2) then { _tickets = GVAR(tickets) get _playerSide; _ticketsTypeText = localize "STR_tunres_Respawan_RemainingTicketsPlayer"; _usesTickets = true; @@ -80,7 +80,7 @@ GVAR(firstMark) = true; [_text,0,0,1,0] spawn BIS_fnc_dynamicText; //make sure that player is still in area - private _waitingRange = GVAR(waiting_area_range); + private _waitingRange = GVAR(waitingAreaRange); if !(player inArea [_respawnWaitingarea, _waitingRange, _waitingRange, 0, false]) then { player setPos ([_respawnWaitingarea, (_waitingRange / 2)] call CBA_fnc_randPos); "Get over here!" call CBA_fnc_notify; From de5295b4beb801536a7a18be8a806682dc2c11e4 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 3 Feb 2024 11:14:22 +0200 Subject: [PATCH 066/228] Fix who to notify Actually uses the last 2/3 variables. --- addons/msp/functions/fnc_contestedCheck.sqf | 4 ++-- addons/msp/functions/fnc_startContestedChecks.sqf | 3 ++- addons/msp/functions/fnc_updateDeployementStatus.sqf | 2 +- addons/msp/functions/fnc_whoToNotify.sqf | 4 ++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index eeab409..97d75a7 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -13,7 +13,7 @@ // private _result = diag_codePerformance [{ #include "script_component.hpp" params[["_side", nil,[west]],["_mspSetup", false]]; -ok = _mspSetup; + if (!isServer) then {}; private _oldAllowRespawnStatus = GVAR(allowRespawn) get _side; GVAR(allowRespawn) set [_side, false]; @@ -64,7 +64,7 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { GVAR(contestedStatus) set [_side, _isContested]; publicVariable QGVAR(contestedStatus); _msp setVariable [QGVAR(isContested), _isContested, true]; - private _whoToNotify = [_side] call FUNC(whoToNotify); + private _whoToNotify = [_side, GVAR(contestedNotification)] call FUNC(whoToNotify); if (count _whoToNotify > 0 ) then { if (_isContested) then { [_side, false] call EFUNC(respawn,update_respawn_point); diff --git a/addons/msp/functions/fnc_startContestedChecks.sqf b/addons/msp/functions/fnc_startContestedChecks.sqf index 84b94fb..e2c35b9 100644 --- a/addons/msp/functions/fnc_startContestedChecks.sqf +++ b/addons/msp/functions/fnc_startContestedChecks.sqf @@ -32,6 +32,7 @@ if (!isServer) then {}; }; }, GVAR(contestedCheckInterval), []] call CBA_fnc_addPerFrameHandler; + //Report enemies loop thing if (GVAR(reportEnemiesEnabled)) then { [{ private _hash = GVAR(contestedCheckHash); @@ -42,7 +43,7 @@ if (!isServer) then {}; if (_mspStatus) then { private _enemyCount = (_hash get _side) select 0; if (_enemyCount > 0 && !_contestedStatus) then { - private _whoToNotify = [_side] call FUNC(whoToNotify); + private _whoToNotify = [_side, GVAR(reportEnemiesNotification)] call FUNC(whoToNotify); if (count _whoToNotify > 0 ) then { (localize "STR_tunres_MSP_FNC_enemies_near") remoteExecCall ["CBA_fnc_notify", _whoToNotify]; }; diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index aa7c896..2c59670 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -20,7 +20,7 @@ if (!isServer) then {}; params [["_msp", objNull, [objNull]], ["_setup", nil, [false]]]; private _side = _msp getVariable QGVAR(side); -private _whoToNotify = [_side] call FUNC(whoToNotify); +private _whoToNotify = [_side, GVAR(setupNotification)] call FUNC(whoToNotify); AAR_UPDATE(_msp,"Is active MSP",_setup); diff --git a/addons/msp/functions/fnc_whoToNotify.sqf b/addons/msp/functions/fnc_whoToNotify.sqf index 2488fe7..11aec5c 100644 --- a/addons/msp/functions/fnc_whoToNotify.sqf +++ b/addons/msp/functions/fnc_whoToNotify.sqf @@ -12,9 +12,9 @@ * [west] call tunres_MSP_fnc_whoToNotify */ #include "script_component.hpp" -params [["_side", nil, [west]]]; +params [["_side", nil, [west]], ["_type", 1]]; private _whoToNotify = []; -if (GVAR(contestedNotification) isEqualTo 0) then { +if (_type isEqualTo 0) then { { private _group = _x; private _leader = leader _group; From 54267f612f4ac8c0df01068cfdcdc8503e7e6e81 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 3 Feb 2024 12:39:08 +0200 Subject: [PATCH 067/228] Fix name --- .../functions/{fnc_delayed_respawn.sqf => fnc_delayedRespawn.sqf} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename addons/respawn/functions/{fnc_delayed_respawn.sqf => fnc_delayedRespawn.sqf} (100%) diff --git a/addons/respawn/functions/fnc_delayed_respawn.sqf b/addons/respawn/functions/fnc_delayedRespawn.sqf similarity index 100% rename from addons/respawn/functions/fnc_delayed_respawn.sqf rename to addons/respawn/functions/fnc_delayedRespawn.sqf From 5a6f776e3c5c8c42d63cd065d5e80462122f7dfc Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 4 Feb 2024 00:12:25 +0200 Subject: [PATCH 068/228] Updated strings --- addons/main/Stringtable.xml | 76 ++++++++++++++++++++++++++----------- 1 file changed, 54 insertions(+), 22 deletions(-) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index 59ca2e5..a97d361 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -82,10 +82,6 @@ Range for waitingarea. Default 100m Range for waitingarea. Default 100m
- - You are respawning! Standby. - You are respawning! Standby. - Your remaining tickets: Your remaining tickets: @@ -94,6 +90,46 @@ Remaining tickets for your side: Remaining tickets for your side: + + You are respawning! Standby. + You are respawning! Standby. + + + Contested settings West + Contested settings West + + + Contested settings East + Contested settings East + + + Contested settings Resistance + Contested settings Resistance + + + Contested settings Civilian + Contested settings Civilian + + + Spectator allowed sides for west + Spectator allowed sides for west + + + Spectator allowed sides for east + Spectator allowed sides for east + + + Spectator allowed sides for resistance + Spectator allowed sides for resistance + + + Spectator allowed sides for civilian + Spectator allowed sides for civilian + + + Allow this side to be spectated + Allow this side to be spectated + @@ -471,16 +507,16 @@ - When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) - When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters) + When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters), for this side + When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters), for this side - Interval for when server updates the contested status for MSP - Interval for when server updates the contested status for MSP + Interval for when server updates the contested status for MSP, for this side + Interval for when server updates the contested status for MSP, for this side - Radius where there needs to be more enemies than allies to disable MSP (meters) - Radius where there needs to be more enemies than allies to disable MSP (meters) + Radius where there needs to be more enemies than allies to disable MSP (meters), for this side + Radius where there needs to be more enemies than allies to disable MSP (meters), for this side Min Contested Radius @@ -494,23 +530,19 @@ Contested Check Interval Contested Check Interval - - Contested - Contested - - Range from MSP where enemies are reported (meters) - Range from MSP where enemies are reported (meters) + Range from MSP where enemies are reported (meters), for this side + Range from MSP where enemies are reported (meters), for this side - Interval when server check if there is enemies near MSP - Interval when server check if there is enemies near MSP + Interval when server check if there is enemies near MSP, for this side + Interval when server check if there is enemies near MSP, for this side - %1<br/><br/>Enable Report Enemies near MSP - %1<br/><br/>Enable Report Enemies near MSP + Enable Report Enemies near MSP, for this side + Enable Report Enemies near MSP, for this side Report Enemies Interval @@ -551,8 +583,8 @@ Who gets notification when MSP contested? - Who gets notification when there is enemies near MSP? - Who gets notification when there is enemies near MSP? + Who to notify when enemies near MSP? + Who to notify when enemies near MSP? When MSP is setup or packed up, who whil recive notification from it. Default: Group Leader From c5cd7d8645a18079c263dcba304fbada91878c3c Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 4 Feb 2024 00:14:15 +0200 Subject: [PATCH 069/228] Merged functions --- addons/respawn/XEH_PREP.hpp | 6 +- .../fnc_addCheckTicketCountAction.sqf | 6 +- .../fnc_bleedPlayerTicketCountOnDeath.sqf | 39 ------------- .../fnc_bleedSideTicketCountOnDeath.sqf | 40 -------------- .../functions/fnc_bleedTicketCountOnDeath.sqf | 55 +++++++++++++++++++ .../functions/fnc_checkTicketCount.sqf | 19 +++---- .../functions/fnc_getPlayerTicketCount.sqf | 34 ------------ .../functions/fnc_getSideTicketCount.sqf | 20 ------- .../respawn/functions/fnc_getTicketCount.sqf | 49 +++++++++++++++++ .../respawn/functions/fnc_onPlayerKilled.sqf | 15 ++--- 10 files changed, 121 insertions(+), 162 deletions(-) delete mode 100644 addons/respawn/functions/fnc_bleedPlayerTicketCountOnDeath.sqf delete mode 100644 addons/respawn/functions/fnc_bleedSideTicketCountOnDeath.sqf create mode 100644 addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf delete mode 100644 addons/respawn/functions/fnc_getPlayerTicketCount.sqf delete mode 100644 addons/respawn/functions/fnc_getSideTicketCount.sqf create mode 100644 addons/respawn/functions/fnc_getTicketCount.sqf diff --git a/addons/respawn/XEH_PREP.hpp b/addons/respawn/XEH_PREP.hpp index a6cc414..a255210 100644 --- a/addons/respawn/XEH_PREP.hpp +++ b/addons/respawn/XEH_PREP.hpp @@ -5,8 +5,7 @@ PREP(addGear); PREP(addMainAction); PREP(addTeleportAction); PREP(blackscreen); -PREP(bleedPlayerTicketCountOnDeath); -PREP(bleedSideTicketCountOnDeath); +PREP(bleedTicketCountOnDeath); PREP(briefingNotes); PREP(checkTicketCount); PREP(createLocalMarker); @@ -16,8 +15,7 @@ PREP(forceRespawnPlayer); PREP(forceRespawnWave); PREP(getOffSet); PREP(getParentAction); -PREP(getPlayerTicketCount); -PREP(getSideTicketCount); +PREP(getTicketCount); PREP(killJIP); PREP(marker_update); PREP(module_respawnpos); diff --git a/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf b/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf index 4f6ce93..cbb7143 100644 --- a/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf +++ b/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf @@ -20,12 +20,12 @@ params [ ["_object", objNull, [objNull]], if (GVAR(respawnType) isEqualTo 0) exitWith { LOG("Skip adding ticket check ace action, as we dont use tickets"); - }; +}; if (_useAceAction) then { - private _action = ["CheckTickets", localize "STR_tunres_Respawn_CheckTickets","\a3\modules_f_curator\data\portraitmissionname_ca.paa",{ [playerSide] call FUNC(checkTicketCount); }, {true}, nil, nil, _offset] call ace_interact_menu_fnc_createAction; + private _action = ["CheckTickets", localize "STR_tunres_Respawn_CheckTickets","\a3\modules_f_curator\data\portraitmissionname_ca.paa",{ [] call FUNC(checkTicketCount); }, {true}, nil, nil, _offset] call ace_interact_menu_fnc_createAction; [_object, 0, _parrenPath, _action] call ace_interact_menu_fnc_addActionToObject; } else { - _object addAction [localize "STR_tunres_Respawn_CheckTickets", { [playerSide] call FUNC(checkTicketCount) }, [], 10, true, true, "", "true", 10]; + _object addAction [localize "STR_tunres_Respawn_CheckTickets", { [] call FUNC(checkTicketCount) }, [], 10, true, true, "", "true", 10]; }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_bleedPlayerTicketCountOnDeath.sqf b/addons/respawn/functions/fnc_bleedPlayerTicketCountOnDeath.sqf deleted file mode 100644 index 7a08815..0000000 --- a/addons/respawn/functions/fnc_bleedPlayerTicketCountOnDeath.sqf +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Author: [Tuntematon] - * [Description] - * Count side tickets - * - * Arguments: - * 0: Playerside - * 1: player - * - * Return Value: - * None - * - * Example: - * [side, player] call tunres_Respawn_fnc_bleedPlayerTicketCountOnDeath - */ -#include "script_component.hpp" -params ["_side","_player"]; -if (!isServer) exitWith { }; - -private _hash = GVAR(PlayerTicektsHash); -private _playerUID = getPlayerUID _player; -private _remainingTickets = [_side, _player, false] call FUNC(getPlayerTicketCount); - -if ( _remainingTickets > 0 ) then { - //if player disconnected and came back. So no ticket wasted. - if (GVAR(disconnected_players) getOrDefault [_playerUID, false]) then { - GVAR(disconnected_players) set [_uid, false]; - } else { - DEC(_remainingTickets); - AAR_UPDATE(_player,"Player tickets",_remainingTickets); - _hash set [_playerUID, _remainingTickets]; - }; - [5] remoteExecCall ["setPlayerRespawnTime", _player]; - private _text = format["%1 %2",localize "STR_tunres_Respawn_RemainingTicketsText", str _remainingTickets]; - _text remoteExecCall ["CBA_fnc_notify", _player]; - - } else { - [{remoteExecCall [QFUNC(startSpectator), _this];}, _player, 5] call CBA_fnc_waitAndExecute; -}; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_bleedSideTicketCountOnDeath.sqf b/addons/respawn/functions/fnc_bleedSideTicketCountOnDeath.sqf deleted file mode 100644 index 4e895a4..0000000 --- a/addons/respawn/functions/fnc_bleedSideTicketCountOnDeath.sqf +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Author: [Tuntematon] - * [Description] - * Count side tickets - * - * Arguments: - * 0: Playerside - * 1: player - * - * Return Value: - * None - * - * Example: - * [side, player] call tunres_Respawn_fnc_bleedSideTicketCountOnDeath - */ -#include "script_component.hpp" -params ["_side","_player"]; -if (!isServer) exitWith { }; -private _playerUID = getPlayerUID _player; - -//if player disconnected and came back. So no ticket wasted. -if (GVAR(disconnected_players) getOrDefault [_playerUID, false]) then { - GVAR(disconnected_players) set [_uid, false]; - [5] remoteExecCall ["setPlayerRespawnTime", _player]; -}; - -_remainingTickets = GVAR(tickets) get _side; - -if ( _remainingTickets > 0 ) then { - DEC(_remainingTickets); - private _sideSTR = str _side; - AAR_UPDATE(_sideSTR,"Side tickets",_remainingTickets); - GVAR(tickets) set [_side, _remainingTickets]; - publicVariable QGVAR(tickets); - [5] remoteExecCall ["setPlayerRespawnTime", _player]; -} else { - [{ - remoteExecCall [QFUNC(startSpectator), _this]; - }, _player, 5] call CBA_fnc_waitAndExecute; -}; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf b/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf new file mode 100644 index 0000000..77c1305 --- /dev/null +++ b/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf @@ -0,0 +1,55 @@ +/* + * Author: [Tuntematon] + * [Description] + * Count side tickets + * + * Arguments: + * 0: Playerside + * 1: player + * + * Return Value: + * None + * + * Example: + * [side, player] call tunres_Respawn_fnc_bleedTicketCountOnDeath + */ +#include "script_component.hpp" +params [["_side", nil, [west]], ["_player", objNull, [objNull]]]; +if (!isServer) exitWith { }; + +private _respawnType = GVAR(respawnType); +if (_respawnType isEqualTo 0) exitWith { + ERROR("Tried to bleed tickets, when not using them"); +}; +private _playerUID = getPlayerUID _player; + +//if player disconnected and came back. So no ticket wasted. +if (GVAR(disconnectedPlayers) getOrDefault [_playerUID, false]) exitWith { + GVAR(disconnectedPlayers) set [_uid, false]; + [5] remoteExecCall ["setPlayerRespawnTime", _player]; +}; + +private _remainingTickets = [_side, _player, false] call FUNC(getTicketCount); + +if !( _remainingTickets > 0 ) exitWith { + [{ + remoteExecCall [QFUNC(startSpectator), _this]; + }, _player, 5] call CBA_fnc_waitAndExecute; +}; + +DEC(_remainingTickets); + +if (_respawnType isEqualTo 1) then { + private _sideSTR = str _side; + AAR_UPDATE(_sideSTR,"Side tickets",_remainingTickets); + GVAR(tickets) set [_side, _remainingTickets]; + publicVariable QGVAR(tickets); +} else { + AAR_UPDATE(_player,"Player tickets",_remainingTickets); + GVAR(playerTicektsHash) set [_playerUID, _remainingTickets]; + + private _text = format["%1 %2",localize "STR_tunres_Respawn_RemainingTicketsText", str _remainingTickets]; + _text remoteExecCall ["CBA_fnc_notify", _player]; +}; + +[5] remoteExecCall ["setPlayerRespawnTime", _player]; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_checkTicketCount.sqf b/addons/respawn/functions/fnc_checkTicketCount.sqf index 6901b5c..06078b9 100644 --- a/addons/respawn/functions/fnc_checkTicketCount.sqf +++ b/addons/respawn/functions/fnc_checkTicketCount.sqf @@ -1,24 +1,21 @@ /* * Author: [Tuntematon] * [Description] - * Run for clints and show how many tickets left. + * Run for clints and do hint what shows how many tickets left. * * Arguments: - * 0: The first argument + * None * Return Value: * None * * Example: - * [west] call tunres_Respawn_fnc_checkTicketCount + * [] call tunres_Respawn_fnc_checkTicketCount */ #include "script_component.hpp" if (isDedicated) exitWith { }; -params [["_side", nil, [west]]]; -if (GVAR(respawnType) isEqualTo 1) then { - _ticetCount = GVAR(tickets) get _side; - _text = format["%1 %2",localize "STR_tunres_Respawn_RemainingTicketsText", _ticetCount]; - _text call CBA_fnc_notify; -} else { - [playerSide, player, true] remoteExecCall [QFUNC(getPlayerTicketCount),2]; -}; \ No newline at end of file +private _respawnType = GVAR(respawnType); + +if (_respawnType isEqualTo 0) exitWith {}; + +[playerSide, player, true] remoteExecCall [QFUNC(getTicketCount),2]; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_getPlayerTicketCount.sqf b/addons/respawn/functions/fnc_getPlayerTicketCount.sqf deleted file mode 100644 index 6e2faee..0000000 --- a/addons/respawn/functions/fnc_getPlayerTicketCount.sqf +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Author: [Tuntematon] - * [Description] - * Count side tickets - * - * Arguments: - * 0: Playerside - * 1: player - * - * Return Value: - * None - * - * Example: - * [side, player, true] call tunres_Respawn_fnc_getPlayerTicketCount - */ -#include "script_component.hpp" -params [["_side", nil, [west]], ["_player", objNull, [objNull]], ["_doHint", false, [true]]]; -if (!isServer) exitWith { }; - -private _hash = GVAR(PlayerTicektsHash); -private _playerUID = getPlayerUID _player; -private _remainingTickets = _hash getOrDefault [_playerUID, -10]; - -if (_remainingTickets isEqualTo -10) then { - _remainingTickets = GVAR(tickets) get _side; - _hash set [_playerUID, _remainingTickets, true]; -}; - -if (_doHint) then { - private _text = format["%1 %2",localize "STR_tunres_Respawn_RemainingTicketsText", str _remainingTickets]; - _text remoteExecCall ["CBA_fnc_notify", _player]; -}; - -_remainingTickets \ No newline at end of file diff --git a/addons/respawn/functions/fnc_getSideTicketCount.sqf b/addons/respawn/functions/fnc_getSideTicketCount.sqf deleted file mode 100644 index b119462..0000000 --- a/addons/respawn/functions/fnc_getSideTicketCount.sqf +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Author: [Tuntematon] - * [Description] - * - * Arguments: - * 0: Side to get tickets - * - * Return Value: - * - * Example: - * [west] call tunres_Respawn_fnc_getSideTicketCount - */ -#include "script_component.hpp" -if (!isServer) exitWith { }; -params ["_side", "_count"]; - -private _hash = GVAR(tickets); -private _ticketCount = _hash get _side; - -_ticketCount \ No newline at end of file diff --git a/addons/respawn/functions/fnc_getTicketCount.sqf b/addons/respawn/functions/fnc_getTicketCount.sqf new file mode 100644 index 0000000..7c7dd84 --- /dev/null +++ b/addons/respawn/functions/fnc_getTicketCount.sqf @@ -0,0 +1,49 @@ +/* + * Author: [Tuntematon] + * [Description] + * + * Arguments: + * 0: Side to get tickets + * 1: Player to get tickets (optional) + * 2: Do hint (optional) + * + * Return Value: + * ticket count + * Example: + * [west, _unit, false] call tunres_Respawn_fnc_getTicketCount + */ +#include "script_component.hpp" +if (!isServer) exitWith { }; +params [["_side", nil, [west]], ["_player", objNull, [objNull]], ["_doHint", false, [true]]]; +private _ticketCount = -1; +switch (GVAR(respawnType)) do { + case 1: { + private _hash = GVAR(tickets); + _ticketCount = _hash get _side; + }; + case 2: { + if (!isNull _player) then { + private _hash = GVAR(playerTicektsHash); + private _playerUID = getPlayerUID _player; + _ticketCount = _hash getOrDefault [_playerUID, -10]; + + if (_ticketCount isEqualTo -10) then { + _ticketCount = GVAR(tickets) get _side; + _hash set [_playerUID, _ticketCount, true]; + }; + } else { + ERROR("Tried to get player tickest from objNull"); + breakWith "player was objNull"; + }; + }; + default { + breakWith "Not using tickest"; + }; +}; + +if (_doHint && !isNull _player) then { + private _text = format["%1 %2",localize "STR_tunres_Respawn_RemainingTicketsText", str _ticketCount]; + _text remoteExecCall ["CBA_fnc_notify", _player]; +}; + +_ticketCount \ No newline at end of file diff --git a/addons/respawn/functions/fnc_onPlayerKilled.sqf b/addons/respawn/functions/fnc_onPlayerKilled.sqf index 1c0c324..8ef3e71 100644 --- a/addons/respawn/functions/fnc_onPlayerKilled.sqf +++ b/addons/respawn/functions/fnc_onPlayerKilled.sqf @@ -24,15 +24,8 @@ if (GVAR(endRespawns)) exitWith { }, player, 5] call CBA_fnc_waitAndExecute; }; -switch (GVAR(respawnType)) do { - case 0: { - setPlayerRespawnTime 5; - }; - case 1: { - [playerSide, player] remoteExecCall [QFUNC(bleedSideTicketCountOnDeath),2]; - }; - case 2: { - [playerSide, player] remoteExecCall [QFUNC(bleedPlayerTicketCountOnDeath),2]; - }; - default {}; +if (GVAR(respawnType) isEqualTo 0) then { + setPlayerRespawnTime 5; +} else { + [playerSide, player] remoteExecCall [QFUNC(bleedTicketCountOnDeath),2]; }; \ No newline at end of file From 17f350194f69aeafe56132760fb8297f2353ccf7 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 4 Feb 2024 00:19:50 +0200 Subject: [PATCH 070/228] added EHs --- addons/msp/eh list.txt | 3 ++- addons/msp/functions/fnc_addAceActions.sqf | 2 +- addons/msp/functions/fnc_contestedCheck.sqf | 1 + addons/msp/functions/fnc_updateDeployementStatus.sqf | 5 ++++- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/addons/msp/eh list.txt b/addons/msp/eh list.txt index 1131ee3..532c020 100644 --- a/addons/msp/eh list.txt +++ b/addons/msp/eh list.txt @@ -1,2 +1,3 @@ EH Name | locality | params -tunres_msp_EH_contestedUpdate- global - new status, enemy count, enemy count min, Friendly count \ No newline at end of file +tunres_msp_EH_contestedUpdate - global - Side, NewStatus, OldStatus, enemyCount, enemyCountMin, FriendlyCount, Was MSP setup +tunres_msp_EH_mspStatusUpdate - global - MSP , True: Setup MSP. False: Pack MSP \ No newline at end of file diff --git a/addons/msp/functions/fnc_addAceActions.sqf b/addons/msp/functions/fnc_addAceActions.sqf index 327d581..bd98ca8 100644 --- a/addons/msp/functions/fnc_addAceActions.sqf +++ b/addons/msp/functions/fnc_addAceActions.sqf @@ -62,7 +62,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { if (GVAR(allowCheckTicketsMSP)) then { private _remaining_action = { - [playerSide] call EFUNC(respawn,checkTicketCount); + [] call EFUNC(respawn,checkTicketCount); }; private _remaining_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; _remainingTickets = [localize "STR_tunres_Respawn_CheckTickets", localize "STR_tunres_Respawn_CheckTickets", "\a3\modules_f_curator\data\portraitmissionname_ca.paa", _remaining_action, _remaining_condition] call ace_interact_menu_fnc_createAction; diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index 97d75a7..b0accc7 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -75,6 +75,7 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { }; }; }; + [QGVAR(EH_mspStatusUpdate), [_side, _isContested, _oldContestedStatus, _enemiesInArea, _enemiesInAreaMin, _friendliesInArea, _mspSetup]] call CBA_fnc_globalEvent; private _debugText = format ["Contested summary. Side: %1, NewStatus: %2, OldStatus: %3, enemyCount: %4, enemyCountMin: %5, FriendlyCount: %6, Was MSP setup: %7",_side, _isContested, _oldContestedStatus, _enemiesInArea, _enemiesInAreaMin, _friendliesInArea, _mspSetup]; LOG(_debugText); } else { diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index 2c59670..7f10a2b 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -70,4 +70,7 @@ if (_setup) then { } else { GVAR(contestedStatus) set [_side, false]; publicVariable QGVAR(contestedStatus); -}; \ No newline at end of file + [_side, false] remoteExecCall [QFUNC(startContestedChecks), 2]; +}; + +[QGVAR(EH_mspStatusUpdate), [_msp, _setup]] call CBA_fnc_globalEvent; \ No newline at end of file From d58d11a3682d93fe7b9401bc76fd8c68a06a6561 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 4 Feb 2024 00:20:25 +0200 Subject: [PATCH 071/228] Disable msp check tickes, when not using them --- addons/msp/functions/fnc_addAceActions.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/msp/functions/fnc_addAceActions.sqf b/addons/msp/functions/fnc_addAceActions.sqf index bd98ca8..5e1aa50 100644 --- a/addons/msp/functions/fnc_addAceActions.sqf +++ b/addons/msp/functions/fnc_addAceActions.sqf @@ -60,7 +60,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { }, false, [], true] call CBA_fnc_addClassEventHandler; - if (GVAR(allowCheckTicketsMSP)) then { + if (GVAR(allowCheckTicketsMSP) && EGVAR(respawn,respawnType) isNotEqualTo 0) then { private _remaining_action = { [] call EFUNC(respawn,checkTicketCount); }; From 26483d4c4ffb935a2c68e5f420444c31de915ae3 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 4 Feb 2024 00:22:47 +0200 Subject: [PATCH 072/228] Cleaning --- addons/main/script_component.hpp | 4 +- .../fnc_startUpdateDeployementStatus.sqf | 2 - .../functions/fnc_updateDeployementStatus.sqf | 4 +- addons/respawn/CfgVehicles.hpp | 238 ++++++++++++++++ addons/respawn/XEH_postInit_server.sqf | 4 +- addons/respawn/XEH_preInit.sqf | 6 +- addons/respawn/config.cpp | 257 ++---------------- .../functions/fnc_setSideTicketCount.sqf | 2 +- 8 files changed, 265 insertions(+), 252 deletions(-) create mode 100644 addons/respawn/CfgVehicles.hpp diff --git a/addons/main/script_component.hpp b/addons/main/script_component.hpp index abc4a4e..a8c63e3 100644 --- a/addons/main/script_component.hpp +++ b/addons/main/script_component.hpp @@ -1,8 +1,8 @@ #define COMPONENT main #include "\x\tunres\addons\main\script_mod.hpp" -// #define DEBUG_MODE_FULL -// #define DISABLE_COMPILE_CACHE +#define DEBUG_MODE_FULL +#define DISABLE_COMPILE_CACHE #ifdef DEBUG_ENABLED_MAIN #define DEBUG_MODE_FULL diff --git a/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf index 3330327..1e89e54 100644 --- a/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf @@ -15,7 +15,6 @@ */ #include "script_component.hpp" - params ["_target", "_setup"]; private ["_text", "_time", "_conditio"]; @@ -44,6 +43,5 @@ private _code = { _args call FUNC(updateDeployementStatus); openMap false; }; -//[_text, _time, _conditio, _code, {hint "Aborted"}, [_target, _setup]] call CBA_fnc_progressBar; [_time, [_target, _setup], _code, {hint "Aborted!";}, _text, _conditio, ["notOnMap","isnotinside"]] call ace_common_fnc_progressBar; \ No newline at end of file diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index 7f10a2b..3800297 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -26,7 +26,7 @@ AAR_UPDATE(_msp,"Is active MSP",_setup); if (_setup) then { - if (count _whoToNotify > 0 ) then { + if (_whoToNotify isNotEqualTo [] ) then { (call compile (localize "STR_tunres_MSP_FNC_setup_notification")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; }; @@ -42,7 +42,7 @@ if (_setup) then { }, _msp] call CBA_fnc_waitUntilAndExecute; } else { - if (count _whoToNotify > 0 ) then { + if (_whoToNotify isNotEqualTo [] ) then { (call compile (localize "STR_tunres_MSP_FNC_pack_notification")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; }; //Delete props diff --git a/addons/respawn/CfgVehicles.hpp b/addons/respawn/CfgVehicles.hpp new file mode 100644 index 0000000..4015fb3 --- /dev/null +++ b/addons/respawn/CfgVehicles.hpp @@ -0,0 +1,238 @@ +class CfgVehicles +{ + class Logic; + class Module_F: Logic + { + class AttributesBase + { + class Default; + class Edit; // Default edit box (i.e., text input field) + class Combo; // Default combo box (i.e., drop-down menu) + class Checkbox; // Default checkbox (returned value is Bool) + class CheckboxNumber; // Default checkbox (returned value is Number) + class ModuleDescription; // Module description + class Units; // Selection of units on which the module is applied + }; + // Description base classes, for more information see below + class ModuleDescription + { + class AnyBrain; + }; + }; + + class GVAR(Module_waitingarea): Module_F + { + scope = 2; // Editor visibility; 2 will show it in the menu, 1 will hide it. + scopeCurator = 1; + displayName = "$STR_tunres_Respawn_Module_DisplayName_WaitingArea"; // Name displayed in the menu + icon = "\a3\modules_f_curator\data\portraitcountdown_ca.paa"; // Map icon. Delete this entry to use the default icon + category = "tunres_Respawn"; + + // Name of function triggered once conditions are met + function = QFUNC(module_waitingarea); + // Execution priority, modules with lower number are executed first. 0 is used when the attribute is undefined + functionPriority = 10; + // 0 for server only execution, 1 for global execution, 2 for persistent global execution + isGlobal = 0; + // 1 for module waiting until all synced triggers are activated + isTriggerActivated = 0; + // 1 if modules is to be disabled once it's activated (i.e., repeated trigger activation won't work) + isDisposable = 1; + // // 1 to run init function in Eden Editor as well + is3DEN = 0; + + // Module attributes, uses https://community.bistudio.com/wiki/Eden_Editor:_Configuring_Attributes#Entity_Specific + class Attributes: AttributesBase + { + class respawn_side: Combo + { + property = QGVAR(module_waiting_area_side); + displayName = "Side"; // Argument label + tooltip = "$STR_tunres_Respawn_Module_tooltip_WaitingArea"; // Tooltip description + typeName = "STRING"; // Value type, can be "NUMBER", "STRING" or "BOOL" + defaultValue = "0"; // Default attribute value. WARNING: This is an expression, and its returned value will be used (50 in this case) + class Values + { + class none {name = "none"; value = "none";}; // Listbox item + class west {name = "west"; value = "respawn_west";}; + class east {name = "east"; value = "respawn_east";}; + class resistance {name = "resistance"; value = "respawn_guerrila";}; + class civilian {name = "civilian"; value = "respawn_civilian";}; + }; + }; + class ModuleDescription: ModuleDescription{}; + }; + class ModuleDescription: ModuleDescription + { + description = "$STR_tunres_Respawn_Module_Description_Waitingarea"; // Short description, will be formatted as structured text + sync[] = {}; // Array of synced entities (can contain base classes) + }; + }; + + class GVAR(Module_Respawn_point): GVAR(Module_waitingarea) + { + displayName = "$STR_tunres_Respawn_Module_DisplayName_SpawnPoint"; // Name displayed in the menu + icon = "\a3\modules_f\data\portraitrespawn_ca.paa"; + // Name of function triggered once conditions are met + function = QFUNC(module_respawnpos); + + class Attributes: AttributesBase + { + class respawn_side: Combo + { + property = QGVAR(module_respawn_point_side); + displayName = "Side"; // Argument label + tooltip = "$STR_tunres_Respawn_Module_tooltip_SpawnPoint"; // Tooltip description + typeName = "STRING"; // Value type, can be "NUMBER", "STRING" or "BOOL" + defaultValue = "0"; // Default attribute value. WARNING: This is an expression, and its returned value will be used (50 in this case) + class Values + { + class none {name = "none"; value = "none";}; // Listbox item + class west {name = "west"; value = "tunres_respawn_west";}; + class east {name = "east"; value = "tunres_respawn_east";}; + class resistance {name = "resistance"; value = "tunres_respawn_guerrila";}; + class civilian {name = "civilian"; value = "tunres_respawn_civilian";}; + }; + }; + class ModuleDescription: ModuleDescription{}; + }; + class ModuleDescription: ModuleDescription + { + description = "$STR_tunres_Respawn_Module_Description_Spawn_Point"; // Short description, will be formatted as structured text + sync[] = {}; // Array of synced entities (can contain base classes) + }; + }; + + class GVAR(tunres_Respawn_Module_teleportPoint): GVAR(Module_waitingarea) + { + displayName = "$STR_tunres_Respawn_Module_DisplayName_teleportPoint"; // Name displayed in the menu + // 0 for server only execution, 1 for global execution, 2 for persistent global execution + isGlobal = 2; + // 1 for module waiting until all synced triggers are activated + //isTriggerActivated = 1; + // Name of function triggered once conditions are met + function = QFUNC(module_teleporter); + icon = "\a3\ui_f\data\map\groupicons\badge_gs.paa"; + + class Attributes: AttributesBase + { + + class GVAR(teleportPointOBJ): Edit + { + property = QGVAR(teleportPointOBJ); + displayName = "Teleport point object"; + tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportPointOBJ"; + typeName = "STRING"; + // Default text filled in the input box + // Because it is an expression, to return a String one must have a string within a string + defaultValue = """Land_Sleeping_bag_blue_folded_F"""; + }; + + class GVAR(teleportConditio): Edit + { + property = QGVAR(teleportConditio); + displayName = "Teleport conditio"; + tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportConditio"; + typeName = "STRING"; + // Default text filled in the input box + // Because it is an expression, to return a String one must have a string within a string + defaultValue = "true"; + }; + + class GVAR(teleportName): Edit + { + property = QGVAR(teleportName); + displayName = "Teleport name"; + tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportName"; + typeName = "STRING"; + // Default text filled in the input box + // Because it is an expression, to return a String one must have a string within a string + defaultValue = """Name"""; + }; + + class GVAR(teleportCreateMarker): Checkbox + { + property = QGVAR(teleportCreateMarker); + displayName = "Create Marker"; + typeName = "BOOL"; + tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportCreateMarker"; + defaultValue = "true"; + }; + + class GVAR(teleportMarkerIcone): Edit + { + property = QGVAR(teleportMarkerIcone); + displayName = "Marker Icon"; + tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportMarkerIcone"; + typeName = "STRING"; + // Default text filled in the input box + // Because it is an expression, to return a String one must have a string within a string + defaultValue = """hd_start"""; + }; + + class GVAR(teleportMenuOpenConditio): Edit + { + property = QGVAR(teleportMenuOpenConditio); + displayName = "Menu open conditio"; + typeName = "STRING"; + tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportMenuOpenConditio"; + defaultValue = """true"""; + }; + + class GVAR(teleportUseAceAction): Checkbox + { + property = QGVAR(teleportUseAceAction); + displayName = "Use Ace Actions"; + typeName = "BOOL"; + tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportUseAceAction"; + defaultValue = "true"; + }; + + class GVAR(teleportCheckTickets): Checkbox + { + property = QGVAR(teleportCheckTickets); + displayName = "Allow Check Tickets"; + typeName = "BOOL"; + //tooltip = $STR_tunres_Respawn_Module_tooltip_teleportCreateMarker; + defaultValue = "true"; + }; + + class GVAR(teleportEnableWest): Checkbox + { + property = QGVAR(teleportEnableWest); + displayName = "Enable West"; + typeName = "BOOL"; + tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportEnableSides"; + defaultValue = "false"; + }; + + class GVAR(teleportEnableEast): GVAR(teleportEnableWest) + { + property = QGVAR(teleportEnableEast); + displayName = "Enable East"; + }; + + class GVAR(teleportEnableResistance): GVAR(teleportEnableWest) + { + property = QGVAR(teleportEnableResistance); + displayName = "Enable Resistance"; + }; + + class GVAR(teleportEnableCivilian): GVAR(teleportEnableWest) + { + property = QGVAR(teleportEnableCivilian); + displayName = "Enable Civilian"; + }; + + class ModuleDescription: ModuleDescription{}; + }; + class ModuleDescription: ModuleDescription + { + description = "$STR_tunres_Respawn_Module_Description_Spawn_Point"; // Short description, will be formatted as structured text + position = 1; // Position is taken into effect + direction = 0; // Direction is taken into effect + optional = 1; // Synced entity is optional + duplicate = 1; // Multiple entities of this type can be synced + }; + }; +}; \ No newline at end of file diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index c41903b..08e501f 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" if (GVAR(respawnType) isEqualTo 2) then { - GVAR(PlayerTicektsHash) = createHashMap; + GVAR(playerTicektsHash) = createHashMap; AAR_UPDATE("west","Player tickets",(round GVAR(initialTicketsWest))); AAR_UPDATE("east","Player tickets",(round GVAR(initialTicketsEast))); AAR_UPDATE("guer","Player tickets",(round GVAR(initialTicketsResistance))); @@ -15,7 +15,7 @@ if (GVAR(respawnType) isNotEqualTo 0) then { params ["_id", "_uid", "_name", "_jip", "_owner"]; if (cba_missiontime > (GVAR(killJipTime) * 60) && GVAR(killJIP)) then { - GVAR(disconnected_players) set [_uid, true]; + GVAR(disconnectedPlayers) set [_uid, true]; }; }]; }; diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index bacde26..7bafc71 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -34,7 +34,7 @@ GVAR(totalRespawnCount) = createHashMapFromArray _waitTimesPreArray; //Allow respawn for each side GVAR(allowRespawn) = createHashMapFromArray _emptyTrueArray; -GVAR(disconnected_players) = createHashMapFromArray _waitingRespawnEmptyArray; +GVAR(disconnectedPlayers) = createHashMapFromArray _waitingRespawnEmptyArray; GVAR(timerRunning) = createHashMapFromArray _emptyFalseArray; ISNILS(GVAR(teleportPoints),[]); @@ -100,7 +100,7 @@ GVAR(selfTPmenuOpenObj) = objNull; "LIST", ["Gearscript type", localize "STR_tunres_Respawn_CBA_tooltip_gearscript"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], - [[0, 1, 2, 3], ["SQF Gearscript", "Potato Tool", "Save gear", "None"], 3], + [[0, 1, 2, 3], ["SQF Gearscript", "Potato Tool", "Save gear", "None"], 2], 1, {}, true @@ -298,7 +298,7 @@ GVAR(selfTPmenuOpenObj) = objNull; "CHECKBOX", ["Main base", localize "STR_tunres_Respawn_CBA_tooltip_CheckTickets"], [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_checkTickets"], - false, + true, 1, {}, true diff --git a/addons/respawn/config.cpp b/addons/respawn/config.cpp index 0e24d9f..d451f64 100644 --- a/addons/respawn/config.cpp +++ b/addons/respawn/config.cpp @@ -13,12 +13,6 @@ class CfgPatches { }; }; -// configs go here -#include "CfgEventHandlers.hpp" -#include "\a3\ui_f\hpp\definecommoncolors.inc" -#include "RscCommon.hpp" -#include "TP_dialog.hpp" - class CfgFactionClasses { class NO_CATEGORY; @@ -28,241 +22,24 @@ class CfgFactionClasses }; }; -class CfgVehicles -{ - class Logic; - class Module_F: Logic - { - class AttributesBase - { - class Default; - class Edit; // Default edit box (i.e., text input field) - class Combo; // Default combo box (i.e., drop-down menu) - class Checkbox; // Default checkbox (returned value is Bool) - class CheckboxNumber; // Default checkbox (returned value is Number) - class ModuleDescription; // Module description - class Units; // Selection of units on which the module is applied - }; - // Description base classes, for more information see below - class ModuleDescription - { - class AnyBrain; - }; - }; - - class GVAR(Module_waitingarea): Module_F - { - scope = 2; // Editor visibility; 2 will show it in the menu, 1 will hide it. - scopeCurator = 1; - displayName = "$STR_tunres_Respawn_Module_DisplayName_WaitingArea"; // Name displayed in the menu - icon = "\a3\modules_f_curator\data\portraitcountdown_ca.paa"; // Map icon. Delete this entry to use the default icon - category = "tunres_Respawn"; - - // Name of function triggered once conditions are met - function = QFUNC(module_waitingarea); - // Execution priority, modules with lower number are executed first. 0 is used when the attribute is undefined - functionPriority = 10; - // 0 for server only execution, 1 for global execution, 2 for persistent global execution - isGlobal = 0; - // 1 for module waiting until all synced triggers are activated - isTriggerActivated = 0; - // 1 if modules is to be disabled once it's activated (i.e., repeated trigger activation won't work) - isDisposable = 1; - // // 1 to run init function in Eden Editor as well - is3DEN = 0; - - // Module attributes, uses https://community.bistudio.com/wiki/Eden_Editor:_Configuring_Attributes#Entity_Specific - class Attributes: AttributesBase - { - class respawn_side: Combo - { - property = QGVAR(module_waiting_area_side); - displayName = "Side"; // Argument label - tooltip = "$STR_tunres_Respawn_Module_tooltip_WaitingArea"; // Tooltip description - typeName = "STRING"; // Value type, can be "NUMBER", "STRING" or "BOOL" - defaultValue = "0"; // Default attribute value. WARNING: This is an expression, and its returned value will be used (50 in this case) - class Values - { - class none {name = "none"; value = "none";}; // Listbox item - class west {name = "west"; value = "respawn_west";}; - class east {name = "east"; value = "respawn_east";}; - class resistance {name = "resistance"; value = "respawn_guerrila";}; - class civilian {name = "civilian"; value = "respawn_civilian";}; - }; - }; - class ModuleDescription: ModuleDescription{}; - }; - class ModuleDescription: ModuleDescription - { - description = "$STR_tunres_Respawn_Module_Description_Waitingarea"; // Short description, will be formatted as structured text - sync[] = {}; // Array of synced entities (can contain base classes) - }; - }; - - class GVAR(Module_Respawn_point): GVAR(Module_waitingarea) - { - displayName = "$STR_tunres_Respawn_Module_DisplayName_SpawnPoint"; // Name displayed in the menu - icon = "\a3\modules_f\data\portraitrespawn_ca.paa"; - // Name of function triggered once conditions are met - function = QFUNC(module_respawnpos); - - class Attributes: AttributesBase - { - class respawn_side: Combo - { - property = QGVAR(module_respawn_point_side); - displayName = "Side"; // Argument label - tooltip = "$STR_tunres_Respawn_Module_tooltip_SpawnPoint"; // Tooltip description - typeName = "STRING"; // Value type, can be "NUMBER", "STRING" or "BOOL" - defaultValue = "0"; // Default attribute value. WARNING: This is an expression, and its returned value will be used (50 in this case) - class Values - { - class none {name = "none"; value = "none";}; // Listbox item - class west {name = "west"; value = "tunres_respawn_west";}; - class east {name = "east"; value = "tunres_respawn_east";}; - class resistance {name = "resistance"; value = "tunres_respawn_guerrila";}; - class civilian {name = "civilian"; value = "tunres_respawn_civilian";}; - }; - }; - class ModuleDescription: ModuleDescription{}; - }; - class ModuleDescription: ModuleDescription - { - description = "$STR_tunres_Respawn_Module_Description_Spawn_Point"; // Short description, will be formatted as structured text - sync[] = {}; // Array of synced entities (can contain base classes) - }; - }; - - class GVAR(tunres_Respawn_Module_teleportPoint): GVAR(Module_waitingarea) - { - displayName = "$STR_tunres_Respawn_Module_DisplayName_teleportPoint"; // Name displayed in the menu - // 0 for server only execution, 1 for global execution, 2 for persistent global execution - isGlobal = 2; - // 1 for module waiting until all synced triggers are activated - //isTriggerActivated = 1; - // Name of function triggered once conditions are met - function = QFUNC(module_teleporter); - icon = "\a3\ui_f\data\map\groupicons\badge_gs.paa"; - - class Attributes: AttributesBase - { - - class GVAR(teleportPointOBJ): Edit - { - property = QGVAR(teleportPointOBJ); - displayName = "Teleport point object"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportPointOBJ"; - typeName = "STRING"; - // Default text filled in the input box - // Because it is an expression, to return a String one must have a string within a string - defaultValue = """Land_Sleeping_bag_blue_folded_F"""; - }; - - class GVAR(teleportConditio): Edit - { - property = QGVAR(teleportConditio); - displayName = "Teleport conditio"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportConditio"; - typeName = "STRING"; - // Default text filled in the input box - // Because it is an expression, to return a String one must have a string within a string - defaultValue = "true"; - }; - - class GVAR(teleportName): Edit - { - property = QGVAR(teleportName); - displayName = "Teleport name"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportName"; - typeName = "STRING"; - // Default text filled in the input box - // Because it is an expression, to return a String one must have a string within a string - defaultValue = """Name"""; - }; - - class GVAR(teleportCreateMarker): Checkbox - { - property = QGVAR(teleportCreateMarker); - displayName = "Create Marker"; - typeName = "BOOL"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportCreateMarker"; - defaultValue = "true"; - }; - - class GVAR(teleportMarkerIcone): Edit - { - property = QGVAR(teleportMarkerIcone); - displayName = "Marker Icon"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportMarkerIcone"; - typeName = "STRING"; - // Default text filled in the input box - // Because it is an expression, to return a String one must have a string within a string - defaultValue = """hd_start"""; - }; - - class GVAR(teleportMenuOpenConditio): Edit - { - property = QGVAR(teleportMenuOpenConditio); - displayName = "Menu open conditio"; - typeName = "STRING"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportMenuOpenConditio"; - defaultValue = """true"""; - }; - - class GVAR(teleportUseAceAction): Checkbox - { - property = QGVAR(teleportUseAceAction); - displayName = "Use Ace Actions"; - typeName = "BOOL"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportUseAceAction"; - defaultValue = "true"; - }; - - class GVAR(teleportCheckTickets): Checkbox - { - property = QGVAR(teleportCheckTickets); - displayName = "Allow Check Tickets"; - typeName = "BOOL"; - //tooltip = $STR_tunres_Respawn_Module_tooltip_teleportCreateMarker; - defaultValue = "true"; - }; - - class GVAR(teleportEnableWest): Checkbox - { - property = QGVAR(teleportEnableWest); - displayName = "Enable West"; - typeName = "BOOL"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportEnableSides"; - defaultValue = "false"; - }; - - class GVAR(teleportEnableEast): GVAR(teleportEnableWest) - { - property = QGVAR(teleportEnableEast); - displayName = "Enable East"; - }; - - class GVAR(teleportEnableResistance): GVAR(teleportEnableWest) - { - property = QGVAR(teleportEnableResistance); - displayName = "Enable Resistance"; - }; +// configs go here +#include "CfgEventHandlers.hpp" +#include "\a3\ui_f\hpp\definecommoncolors.inc" +#include "RscCommon.hpp" +#include "TP_dialog.hpp" +#include "CfgVehicles.hpp" - class GVAR(teleportEnableCivilian): GVAR(teleportEnableWest) - { - property = QGVAR(teleportEnableCivilian); - displayName = "Enable Civilian"; - }; - class ModuleDescription: ModuleDescription{}; - }; - class ModuleDescription: ModuleDescription - { - description = "$STR_tunres_Respawn_Module_Description_Spawn_Point"; // Short description, will be formatted as structured text - position = 1; // Position is taken into effect - direction = 0; // Direction is taken into effect - optional = 1; // Synced entity is optional - duplicate = 1; // Multiple entities of this type can be synced - }; +class CfgRespawnTemplates { + class ADDON { + displayName = "Tun wave respawn"; + //onPlayerKilled = QFUNC(respawnTemplate); + //onPlayerRespawn = QFUNC(respawnTemplate); + respawnTypes[] = {3}; + respawnDelay = 99999; + respawnOnStart = 0; + respawnTemplates[] = { }; + disabledAI = 1; + respawn = 3; }; }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_setSideTicketCount.sqf b/addons/respawn/functions/fnc_setSideTicketCount.sqf index 2fd75de..55aa53f 100644 --- a/addons/respawn/functions/fnc_setSideTicketCount.sqf +++ b/addons/respawn/functions/fnc_setSideTicketCount.sqf @@ -7,7 +7,7 @@ * 1: New ticket count * * Return Value: - * + * True on success * Example: * [west, 10] call tunres_Respawn_fnc_setSideTicketCount */ From 568ccf6957e231cca726712ef7c7fabdea76c2b3 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 4 Feb 2024 00:23:46 +0200 Subject: [PATCH 073/228] Allow enabling side to spectate --- addons/respawn/XEH_preInit.sqf | 210 +++++++++++++++++- .../respawn/functions/fnc_startSpectator.sqf | 42 +--- 2 files changed, 216 insertions(+), 36 deletions(-) diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index 7bafc71..dc6ceff 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -9,6 +9,8 @@ private _waitingRespawnEmptyArray= [[west,[]],[east,[]],[resistance,[]],[civilia private _waitTimesPreArray = [[west,0],[east,0],[resistance,0],[civilian,0]]; private _emptyFalseArray = [[west,false],[east,false],[resistance,false],[civilian,false]]; private _emptyTrueArray = [[west,true],[east,true],[resistance,true],[civilian,true]]; + + //cba_missiontime time when next wave happens. GVAR(nextWaveTimes) = createHashMapFromArray _waitTimesPreArray; @@ -38,11 +40,11 @@ GVAR(disconnectedPlayers) = createHashMapFromArray _waitingRespawnEmptyArray; GVAR(timerRunning) = createHashMapFromArray _emptyFalseArray; ISNILS(GVAR(teleportPoints),[]); -//allowed sides to spectate !WIP! Currentlu forced all -ISNILS(GVAR(spectate_west),true); -ISNILS(GVAR(spectate_east),true); -ISNILS(GVAR(spectate_independent),true); -ISNILS(GVAR(spectate_civilian),true); +//allowed sides to spectate +GVAR(allowedSpectateSidesWest) = [west]; +GVAR(allowedSpectateSidesEast) = [east]; +GVAR(allowedSpectateSidesResistance) = [resistance]; +GVAR(allowedSpectateSidesCivilian) = [civilian]; ISNILS(GVAR(endRespawns),false); @@ -236,6 +238,204 @@ GVAR(selfTPmenuOpenObj) = objNull; true ] call CBA_Settings_fnc_init; +//allow spectate west +[ + QGVAR(allowWestSpectateEast), + "CHECKBOX", + ["East", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesWest"], + true, + 1, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateSidesWest) pushBack east; + }; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(allowWestSpectateResistance), + "CHECKBOX", + ["Resistance", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesWest"], + true, + 1, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateSidesWest) pushBack resistance; + }; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(allowWestSpectateCivilian), + "CHECKBOX", + ["Civilian", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesWest"], + true, + 1, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateSidesWest) pushBack civilian; + }; + }, + true +] call CBA_Settings_fnc_init; + +//allow spectate east +[ + QGVAR(allowEastSpectateWest), + "CHECKBOX", + ["West", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesEast"], + true, + 1, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateSidesEast) pushBack west; + }; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(allowEastSpectateResistance), + "CHECKBOX", + ["Resistance", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesEast"], + true, + 1, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateSidesEast) pushBack resistance; + }; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(allowEastSpectateCivilian), + "CHECKBOX", + ["Civilian", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesEast"], + true, + 1, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateSidesEast) pushBack civilian; + }; + }, + true +] call CBA_Settings_fnc_init; + +//allow spectate resistance +[ + QGVAR(allowResistanceSpectateWest), + "CHECKBOX", + ["West", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesResistance"], + true, + 1, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateSidesResistance) pushBack west; + }; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(allowResistanceSpectateEast), + "CHECKBOX", + ["East", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesResistance"], + true, + 1, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateSidesResistance) pushBack east; + }; + }, + true +] call CBA_Settings_fnc_init; + + +[ + QGVAR(allowResistanceSpectateCivilian), + "CHECKBOX", + ["Civilian", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesResistance"], + true, + 1, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateSidesResistance) pushBack civilian; + }; + }, + true +] call CBA_Settings_fnc_init; + +//allow spectate civilians +[ + QGVAR(allowCivilianSpectateWest), + "CHECKBOX", + ["West", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesCivilian"], + true, + 1, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateSidesCivilian) pushBack west; + }; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(allowCivilianSpectateEast), + "CHECKBOX", + ["East", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesCivilian"], + true, + 1, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateSidesCivilian) pushBack east; + }; + }, + true +] call CBA_Settings_fnc_init; + + +[ + QGVAR(allowCivilianSpectateResistance), + "CHECKBOX", + ["Resistance", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesCivilian"], + true, + 1, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateSidesCivilian) pushBack resistance; + }; + }, + true +] call CBA_Settings_fnc_init; + //Ticket count [ QGVAR(initialTicketsWest), diff --git a/addons/respawn/functions/fnc_startSpectator.sqf b/addons/respawn/functions/fnc_startSpectator.sqf index 816917f..84dcd1c 100644 --- a/addons/respawn/functions/fnc_startSpectator.sqf +++ b/addons/respawn/functions/fnc_startSpectator.sqf @@ -14,41 +14,21 @@ */ #include "script_component.hpp" -if (isDedicated) exitWith { }; - -private _allowed_sides = []; -private _notAllowed = []; -if (GVAR(spectate_west)) then { - _allowed_sides pushBack west; -} else { - _notAllowed pushBack west; -}; - -if (GVAR(spectate_east)) then { - _allowed_sides pushBack east; -} else { - _notAllowed pushBack east; -}; - -if (GVAR(spectate_independent)) then { - _allowed_sides pushBack resistance; -} else { - _notAllowed pushBack resistance; -}; - -if (GVAR(spectate_civilian)) then { - _allowed_sides pushBack civilian; -} else { - _notAllowed pushBack civilian; +if (!hasInterface) exitWith { }; + +private _allowedSides = switch (playerSide) do { + case west: { GVAR(allowedSpectateSidesWest) }; + case east: { GVAR(allowedSpectateSidesEast) }; + case resistance: { GVAR(allowedSpectateSidesResistance) }; + case civilian: { GVAR(allowedSpectateSidesCivilian) }; + default { [west, east, resistance, civilian] }; }; - - // use ace spectator if using ace if ((isClass(configFile >> "CfgPatches" >> "ace_main"))) then { [] call ace_spectator_fnc_setSpectator; //force spectator - [_allowed_sides, _notAllowed] call ace_spectator_fnc_updateSides; + [_allowedSides, [west, east, resistance, civilian]] call ace_spectator_fnc_updateSides; //Set camera modes [[], [0,1,2]] call ace_spectator_fnc_updateCameraModes; @@ -63,7 +43,7 @@ if ((isClass(configFile >> "CfgPatches" >> "ace_main"))) then { } else { ["Initialize", [ player, - _allowed_sides, + _allowedSides, true, GVAR(spectateCameramodeFree), GVAR(spectateCameramode3th), @@ -72,4 +52,4 @@ if ((isClass(configFile >> "CfgPatches" >> "ace_main"))) then { true, true, true]] call BIS_fnc_EGSpectator; -}; +}; \ No newline at end of file From a9ab1cfd6fe2ad31c1e1a0f4f44aac453a3aee72 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 4 Feb 2024 00:24:13 +0200 Subject: [PATCH 074/228] Fix missing side for spawned msps --- addons/msp/functions/fnc_addEventHandlers.sqf | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/addons/msp/functions/fnc_addEventHandlers.sqf b/addons/msp/functions/fnc_addEventHandlers.sqf index e3eadf7..4be3c2e 100644 --- a/addons/msp/functions/fnc_addEventHandlers.sqf +++ b/addons/msp/functions/fnc_addEventHandlers.sqf @@ -23,6 +23,13 @@ if (isServer) then { [_vehicle, "InitPost", { params ["_entity"]; + private _side = sideEmpty; + { + if (_y isEqualTo (typeOf _entity)) then { + _side = _x; + break; + }; + } forEach GVAR(classnames); AAR_UPDATE(_entity,"Is active MSP",false); AAR_UPDATE(_entity,"Is contested",false); From c702d517e4ea2fadf55931d2b703674ed534324a Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 4 Feb 2024 00:26:14 +0200 Subject: [PATCH 075/228] ReDesing contested check. again. Contested checks are now started when msp is deployed and stops after it is packed. Stores settings to hash --- addons/msp/XEH_postInit_server.sqf | 4 - addons/msp/XEH_preInit.sqf | 401 ++++++++++++++++-- addons/msp/functions/fnc_addEventHandlers.sqf | 11 +- addons/msp/functions/fnc_briefingNotes.sqf | 8 +- addons/msp/functions/fnc_contestedCheck.sqf | 12 +- .../fnc_createContestZoneMarkers.sqf | 20 +- .../functions/fnc_startContestedChecks.sqf | 68 ++- .../functions/fnc_updateDeployementStatus.sqf | 1 + 8 files changed, 453 insertions(+), 72 deletions(-) diff --git a/addons/msp/XEH_postInit_server.sqf b/addons/msp/XEH_postInit_server.sqf index 4cbc2b0..6eccf9d 100644 --- a/addons/msp/XEH_postInit_server.sqf +++ b/addons/msp/XEH_postInit_server.sqf @@ -1,6 +1,2 @@ #include "script_component.hpp" - -[{ ADDON }, { - [] call FUNC(startContestedChecks); -}] call CBA_fnc_waitUntilAndExecute; \ No newline at end of file diff --git a/addons/msp/XEH_preInit.sqf b/addons/msp/XEH_preInit.sqf index 1d97c8b..73b16c1 100644 --- a/addons/msp/XEH_preInit.sqf +++ b/addons/msp/XEH_preInit.sqf @@ -8,6 +8,10 @@ PREP_RECOMPILE_END; //Msp classnames GVAR(classnames) = createHashMap; +//reportEnemiesInterval 0 - reportEnemiesRange 1 - contestedRadiusMax 2 - contestedRadiusMin 3 - contestedCheckInterval 4 - reportEnemiesEnabled 5 +GVAR(contestValues) = createHashMapFromArray [[west,[0,0,0,0,0,false]],[east,[0,0,0,0,0,false]],[resistance,[0,0,0,0,0,false]],[civilian,[0,0,0,0,0,false]]]; +GVAR(contestHandles) = createHashMap; +GVAR(contestCheckRunning) = createHashMapFromArray [[west,false],[east,false],[resistance,false],[civilian,false]]; [ QGVAR(enable), "CHECKBOX", @@ -24,89 +28,432 @@ GVAR(classnames) = createHashMap; "CHECKBOX", [localize "STR_tunres_MSP_CBA_allowCheckTicketsMSP", localize "STR_tunres_Respawn_CBA_tooltip_CheckTickets"], localize "STR_tunres_MSP_CBA_Category_main", - false, + true, 1, {}, true ] call CBA_Settings_fnc_init; [ - QGVAR(reportEnemiesEnabled), + QGVAR(reportEnemiesEnabledWest), "CHECKBOX", - [localize "STR_tunres_MSP_CBA_reportEnemiesEnabled", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], + [(localize "STR_tunres_MSP_CBA_reportEnemiesEnabled") + " West", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], true, 1, - {}, + { + params ["_value"]; + private _array = GVAR(contestValues) get west; + _array set [5, _value]; + GVAR(contestValues) set [west, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesEnabledEast), + "CHECKBOX", + [(localize "STR_tunres_MSP_CBA_reportEnemiesEnabled") + " East", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + true, + 1, + { + params ["_value"]; + private _array = GVAR(contestValues) get east; + _array set [5, _value]; + GVAR(contestValues) set [east, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesEnabledResistance), + "CHECKBOX", + [(localize "STR_tunres_MSP_CBA_reportEnemiesEnabled") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], + true, + 1, + { + params ["_value"]; + private _array = GVAR(contestValues) get resistance; + _array set [5, _value]; + GVAR(contestValues) set [resistance, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesEnabledCivilian), + "CHECKBOX", + [(localize "STR_tunres_MSP_CBA_reportEnemiesEnabled" + " Civilian"), localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], + true, + 1, + { + params ["_value"]; + private _array = GVAR(contestValues) get civilian; + _array set [5, _value]; + GVAR(contestValues) set [civilian, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesIntervalWest), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_reportEnemiesIntervala") + " West", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], + [1, 600, 60, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(reportEnemiesIntervalWest) = _value; + private _array = GVAR(contestValues) get west; + _array set [0, _value]; + GVAR(contestValues) set [west, _array]; + }, true ] call CBA_Settings_fnc_init; [ - QGVAR(reportEnemiesInterval), + QGVAR(reportEnemiesIntervalEast), "SLIDER", - [localize "STR_tunres_MSP_CBA_reportEnemiesIntervala", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], - [1, 600, 30, 0], + [(localize "STR_tunres_MSP_CBA_reportEnemiesIntervala") + " East", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + [1, 600, 60, 0], 1, { params ["_value"]; - GVAR(reportEnemiesInterval) = round _value; + _value = round _value; + GVAR(reportEnemiesIntervalEast) = _value; + private _array = GVAR(contestValues) get east; + _array set [0, _value]; + GVAR(contestValues) set [east, _array]; }, true ] call CBA_Settings_fnc_init; [ - QGVAR(reportEnemiesRange), + QGVAR(reportEnemiesIntervalResistance), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_reportEnemiesIntervala") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], + [1, 600, 60, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(reportEnemiesIntervalResistance) = _value; + private _array = GVAR(contestValues) get resistance; + _array set [0, _value]; + GVAR(contestValues) set [resistance, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesIntervalCivilian), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_reportEnemiesIntervala") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], + [1, 600, 60, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(reportEnemiesIntervalCivilian) = _value; + private _array = GVAR(contestValues) get civilian; + _array set [0, _value]; + GVAR(contestValues) set [civilian, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesRangeWest), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_reportEnemiesRange") + " West", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], + [0, 5000, 500, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(reportEnemiesRangeWest) = _value; + private _array = GVAR(contestValues) get west; + _array set [1, _value]; + GVAR(contestValues) set [west, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesRangeEast), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_reportEnemiesRange") + " East", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + [0, 5000, 500, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(reportEnemiesRangeEast) = _value; + private _array = GVAR(contestValues) get east; + _array set [1, _value]; + GVAR(contestValues) set [east, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesRangeResistance), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_reportEnemiesRange") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], + [0, 5000, 500, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(reportEnemiesRangeResistance) = _value; + private _array = GVAR(contestValues) get resistance; + _array set [1, _value]; + GVAR(contestValues) set [resistance, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesRangeCivilian), "SLIDER", - [localize "STR_tunres_MSP_CBA_reportEnemiesRange", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], + [(localize "STR_tunres_MSP_CBA_reportEnemiesRange") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], [0, 5000, 500, 0], 1, { params ["_value"]; - GVAR(reportEnemiesRange) = round _value; + _value = round _value; + GVAR(reportEnemiesRangeCivilian) = _value; + private _array = GVAR(contestValues) get civilian; + _array set [1, _value]; + GVAR(contestValues) set [civilian, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedRadiusMaxWest), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedRadiusMax") + " West", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], + [0, 3000, 500, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedRadiusMaxWest) = _value; + private _array = GVAR(contestValues) get west; + _array set [2, _value]; + GVAR(contestValues) set [west, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedRadiusMaxEast), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedRadiusMax") + " East", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + [0, 3000, 500, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedRadiusMaxEast) = _value; + private _array = GVAR(contestValues) get east; + _array set [2, _value]; + GVAR(contestValues) set [east, _array]; }, false ] call CBA_Settings_fnc_init; [ - QGVAR(contestedRadiusMax), + QGVAR(contestedRadiusMaxResistance), "SLIDER", - [localize "STR_tunres_MSP_CBA_contestedRadiusMax", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], + [(localize "STR_tunres_MSP_CBA_contestedRadiusMax") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], [0, 3000, 500, 0], 1, { params ["_value"]; - GVAR(contestedRadiusMax) = round _value; + _value = round _value; + GVAR(contestedRadiusMaxResistance) = _value; + private _array = GVAR(contestValues) get resistance; + _array set [2, _value]; + GVAR(contestValues) set [resistance, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedRadiusMaxCivilian), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedRadiusMax") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], + [0, 3000, 500, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedRadiusMaxCivilian) = _value; + private _array = GVAR(contestValues) get civilian; + _array set [2, _value]; + GVAR(contestValues) set [civilian, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedRadiusMinWest), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedRadiusMin") + " West", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], + [0, 3000, 200, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedRadiusMinWest) = _value; + private _array = GVAR(contestValues) get west; + _array set [3, _value]; + GVAR(contestValues) set [west, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedRadiusMinEast), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedRadiusMin") + " East", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + [0, 3000, 200, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedRadiusMinEast) = _value; + private _array = GVAR(contestValues) get east; + _array set [3, _value]; + GVAR(contestValues) set [east, _array]; }, false ] call CBA_Settings_fnc_init; [ - QGVAR(contestedRadiusMin), + QGVAR(contestedRadiusMinResistance), "SLIDER", - [localize "STR_tunres_MSP_CBA_contestedRadiusMin", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], + [(localize "STR_tunres_MSP_CBA_contestedRadiusMin") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], [0, 3000, 200, 0], 1, { params ["_value"]; - GVAR(contestedRadiusMin) = round _value; + _value = round _value; + GVAR(contestedRadiusMinResistance) = _value; + private _array = GVAR(contestValues) get resistance; + _array set [3, _value]; + GVAR(contestValues) set [resistance, _array]; }, false ] call CBA_Settings_fnc_init; [ - QGVAR(contestedCheckInterval), + QGVAR(contestedRadiusMinCivilian), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedRadiusMin") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], + [0, 3000, 200, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedRadiusMinCivilian) = _value; + private _array = GVAR(contestValues) get civilian; + _array set [3, _value]; + GVAR(contestValues) set [civilian, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedCheckIntervalWest), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedCheckInterval") + " West", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], + [1, 600, 20, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedCheckIntervalWest) = _value; + private _array = GVAR(contestValues) get west; + _array set [4, _value]; + GVAR(contestValues) set [west, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedCheckIntervalEast), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedCheckInterval") + " East", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + [1, 600, 20, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedCheckIntervalEast) = _value; + private _array = GVAR(contestValues) get east; + _array set [4, _value]; + GVAR(contestValues) set [west, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedCheckIntervalResistance), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedCheckInterval") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], + [1, 600, 20, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedCheckIntervalResistance) = _value; + private _array = GVAR(contestValues) get resistance; + _array set [4, _value]; + GVAR(contestValues) set [resistance, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedCheckIntervalCivilian), "SLIDER", - [localize "STR_tunres_MSP_CBA_contestedCheckInterval", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contested"], - [1, 600, 30, 0], + [(localize "STR_tunres_MSP_CBA_contestedCheckInterval") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], + [1, 600, 20, 0], 1, { params ["_value"]; - GVAR(contestedCheckInterval) = round _value; + _value = round _value; + GVAR(contestedCheckIntervalCivilian) = _value; + private _array = GVAR(contestValues) get civilian; + _array set [4, _value]; + GVAR(contestValues) set [civilian, _array]; }, true ] call CBA_Settings_fnc_init; diff --git a/addons/msp/functions/fnc_addEventHandlers.sqf b/addons/msp/functions/fnc_addEventHandlers.sqf index 4be3c2e..684fc0a 100644 --- a/addons/msp/functions/fnc_addEventHandlers.sqf +++ b/addons/msp/functions/fnc_addEventHandlers.sqf @@ -31,12 +31,17 @@ }; } forEach GVAR(classnames); + private _values = GVAR(contestValues) get _side; + private _reportEnemiesRange = _values param [1]; + private _contestedRadiusMax = _values param [2]; + private _contestedRadiusMin = _values param [3]; + AAR_UPDATE(_entity,"Is active MSP",false); AAR_UPDATE(_entity,"Is contested",false); AAR_UPDATE(_entity,"Enemies near",false); - AAR_UPDATE(_entity,"Report enemies radius",GVAR(reportEnemiesRange)); - AAR_UPDATE(_entity,"Contested radius max",GVAR(contestedRadiusMax)); - AAR_UPDATE(_entity,"Contested radius min",GVAR(contestedRadiusMin)); + AAR_UPDATE(_entity,"Report enemies radius",_reportEnemiesRange); + AAR_UPDATE(_entity,"Contested radius max",_contestedRadiusMax); + AAR_UPDATE(_entity,"Contested radius min",_contestedRadiusMin); AAR_UPDATE(_entity,"Enemy Count",0); AAR_UPDATE(_entity,"Enemy Count Min",0); AAR_UPDATE(_entity,"Friendly Count",0); diff --git a/addons/msp/functions/fnc_briefingNotes.sqf b/addons/msp/functions/fnc_briefingNotes.sqf index 2c98420..3fccfcb 100644 --- a/addons/msp/functions/fnc_briefingNotes.sqf +++ b/addons/msp/functions/fnc_briefingNotes.sqf @@ -21,10 +21,12 @@ private _text = "MSP settings
"; if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { + private _values = GVAR(contestValues) get playerSide; + _values params ["_reportEnemiesInterval", "_reportEnemiesRange", "_contestedRadiusMax", "_contestedRadiusMin", "_contestedCheckInterval", "_reportEnemiesEnabled"]; _text = format ["%1
%2",_text, localize "STR_tunres_Respawn_Briefing_MspEnabled"]; - if (GVAR(reportEnemiesEnabled)) then { - _text = format [localize "STR_tunres_Respawn_Briefing_reportEnemiesEnabled",_text, GVAR(reportEnemiesInterval), GVAR(reportEnemiesRange)]; + if (_reportEnemiesEnabled) then { + _text = format [localize "STR_tunres_Respawn_Briefing_reportEnemiesEnabled",_text, _reportEnemiesInterval, _reportEnemiesRange]; } else { _text = format ["%1
%2",_text, localize "STR_tunres_Respawn_Briefing_reportEnemiesDisabled"]; }; @@ -33,7 +35,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { _text = format ["%1
You can check remaining tickets from MSP (using ace actions).",_text]; }; - _text = format [localize "STR_tunres_Respawn_Briefing_ContestedCheck",_text, GVAR(contestedCheckInterval), GVAR(contestedRadiusMax), GVAR(contestedRadiusMin)]; + _text = format [localize "STR_tunres_Respawn_Briefing_ContestedCheck",_text, _contestedCheckInterval, _contestedRadiusMax, _contestedRadiusMin]; _text = format [localize "STR_tunres_Respawn_Briefing_MspVehicle",_text, getText (configFile >> "CfgVehicles" >> _vehicle >> "displayName")]; } else { _text = format ["%1
%2",_text, localize "STR_tunres_Respawn_Briefing_MspDisabled"]; diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index b0accc7..4071f9d 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -18,9 +18,11 @@ if (!isServer) then {}; private _oldAllowRespawnStatus = GVAR(allowRespawn) get _side; GVAR(allowRespawn) set [_side, false]; +private _values = GVAR(contestValues) get _side; +private _contestedRadiusMax = _values param [2]; +private _contestedRadiusMin = _values param [3]; + private _hash = GVAR(contestedCheckHash); -private _countestedRangeMax = GVAR(contestedRadiusMax); -private _countestedRangeMin = GVAR(contestedRadiusMin); private _allUnits = units west + units east + units resistance + units civilian; private _mspDeployementStatus = GVAR(deployementStatus) get _side; @@ -42,10 +44,10 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { } forEach _sidesToCheck; private _pos = getpos _msp; - private _unitsInArea = _allunits inAreaArray [_pos, _countestedRangeMax, _countestedRangeMax, 0, false, (_countestedRangeMax/2)]; + private _unitsInArea = _allunits inAreaArray [_pos, _contestedRadiusMax, _contestedRadiusMax, 0, false, (_contestedRadiusMax/2)]; private _enemiesInArea = _unitsInArea select {(side _x) in _enemySides}; private _friendliesInArea = (count _unitsInArea) - (count _enemiesInArea); - private _enemiesInAreaMin = count (_enemiesInArea inAreaArray [_pos, _countestedRangeMin, _countestedRangeMin, 0, false, (_countestedRangeMin/2)]); + private _enemiesInAreaMin = count (_enemiesInArea inAreaArray [_pos, _contestedRadiusMin, _contestedRadiusMin, 0, false, (_contestedRadiusMin/2)]); _enemiesInArea = count _enemiesInArea; _hash set [_side, [_enemiesInArea, _enemiesInAreaMin, _friendliesInArea]]; @@ -65,7 +67,7 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { publicVariable QGVAR(contestedStatus); _msp setVariable [QGVAR(isContested), _isContested, true]; private _whoToNotify = [_side, GVAR(contestedNotification)] call FUNC(whoToNotify); - if (count _whoToNotify > 0 ) then { + if (_whoToNotify isNotEqualTo [] ) then { if (_isContested) then { [_side, false] call EFUNC(respawn,update_respawn_point); (call compile (localize "STR_tunres_MSP_FNC_Contested_hint")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; diff --git a/addons/msp/functions/fnc_createContestZoneMarkers.sqf b/addons/msp/functions/fnc_createContestZoneMarkers.sqf index 3d225da..7114d3d 100644 --- a/addons/msp/functions/fnc_createContestZoneMarkers.sqf +++ b/addons/msp/functions/fnc_createContestZoneMarkers.sqf @@ -18,22 +18,24 @@ if (playerSide isEqualTo sideLogic || !hasInterface) exitWith { }; params[["_target", player]]; +private _values = GVAR(contestValues) get playerSide; +private _reportEnemiesRange = _values param [1]; +private _contestedRadiusMax = _values param [2]; +private _contestedRadiusMin = _values param [3]; + openMap true; private _pos = getPos _target; -private _reportEnemiesRange = GVAR(reportEnemiesRange); -private _contestRangeMax = GVAR(contestedRadiusMax); -private _contestRangeMin = GVAR(contestedRadiusMin); -private _posMax = _pos getPos [_contestRangeMax, 100]; -private _posMin = _pos getPos [_contestRangeMin, 90]; +private _posMax = _pos getPos [_contestedRadiusMax, 100]; +private _posMin = _pos getPos [_contestedRadiusMin, 90]; private _posReport= _pos getPos [_reportEnemiesRange, 80]; -[QGVAR(contestMarkerMapMax), _pos, "ELLIPSE", [_contestRangeMax, _contestRangeMax], "COLOR:", "ColorOrange"] call CBA_fnc_createMarker; -[QGVAR(contestMarkerMapMaxText), _posMax, "ICON", [1,1], "TEXT:", format["Max Contest range (%1m)",_contestRangeMax], "COLOR:", "ColorOrange", "TYPE:", "hd_warning"] call CBA_fnc_createMarker; +[QGVAR(contestMarkerMapMax), _pos, "ELLIPSE", [_contestedRadiusMax, _contestedRadiusMax], "COLOR:", "ColorOrange"] call CBA_fnc_createMarker; +[QGVAR(contestMarkerMapMaxText), _posMax, "ICON", [1,1], "TEXT:", format["Max Contest range (%1m)",_contestedRadiusMax], "COLOR:", "ColorOrange", "TYPE:", "hd_warning"] call CBA_fnc_createMarker; [QGVAR(contestMarkerMapReport), _pos, "ELLIPSE", [_reportEnemiesRange, _reportEnemiesRange], "COLOR:", "colorOPFOR"] call CBA_fnc_createMarker; [QGVAR(contestMarkerMapReportText), _posReport, "ICON", [1,1],"TEXT:", format["Report enemies range (%1m)",_reportEnemiesRange], "COLOR:", "ColorYellow", "TYPE:", "hd_warning"] call CBA_fnc_createMarker; -[QGVAR(contestMarkerMapMin), _pos, "ELLIPSE", [_contestRangeMin, _contestRangeMin], "COLOR:", "colorOPFOR"] call CBA_fnc_createMarker; -[QGVAR(contestMarkerMapMinText), _posMin, "ICON", [1,1],"TEXT:", format["Min Contest range (%1m)",_contestRangeMin], "COLOR:", "ColorRed", "TYPE:", "hd_warning"] call CBA_fnc_createMarker; +[QGVAR(contestMarkerMapMin), _pos, "ELLIPSE", [_contestedRadiusMin, _contestedRadiusMin], "COLOR:", "colorOPFOR"] call CBA_fnc_createMarker; +[QGVAR(contestMarkerMapMinText), _posMin, "ICON", [1,1],"TEXT:", format["Min Contest range (%1m)",_contestedRadiusMin], "COLOR:", "ColorRed", "TYPE:", "hd_warning"] call CBA_fnc_createMarker; [QGVAR(contestMarkerMapMSPText), _pos, "ICON", [1,1],"TEXT:", "MSP", "TYPE:", "loc_Truck"] call CBA_fnc_createMarker; diff --git a/addons/msp/functions/fnc_startContestedChecks.sqf b/addons/msp/functions/fnc_startContestedChecks.sqf index e2c35b9..5ebc7b9 100644 --- a/addons/msp/functions/fnc_startContestedChecks.sqf +++ b/addons/msp/functions/fnc_startContestedChecks.sqf @@ -15,41 +15,67 @@ * [] call tunres_MSP_fnc_startContestedChecks */ #include "script_component.hpp" - +params ["_side", "_start"]; if (!isServer) then {}; -[{cba_missiontime > GVAR(contestedCheckInterval)}, { - [{ +if (_start) then { + if (GVAR(contestCheckRunning) getOrDefault [_side, false]) exitWith { + ERROR("Tried to start contested check, while it was already on!!"); + }; + + private _values = GVAR(contestValues) get _side; + private _reportEnemiesInterval = _values param [0]; + private _contestedCheckInterval = _values param [4]; + private _reportEnemiesEnabled = _values param [5]; + + private _handleContest = [{ if !(GVAR(disableContestedCheck)) then { - - { - private _side = _x; - private _mspDeployementStatus = GVAR(deployementStatus) get _side; - if (_mspDeployementStatus) then { - [_side] call FUNC(contestedCheck); - }; - } forEach [west,east,resistance,civilian]; + private _mspDeployementStatus = GVAR(deployementStatus) get _side; + if (_mspDeployementStatus) then { + [_args] call FUNC(contestedCheck); + } else { + ERROR("Tried to run contested check, while msp was not deployed!!"); + }; }; - }, GVAR(contestedCheckInterval), []] call CBA_fnc_addPerFrameHandler; + }, _contestedCheckInterval, [_side]] call CBA_fnc_addPerFrameHandler; //Report enemies loop thing - if (GVAR(reportEnemiesEnabled)) then { - [{ - private _hash = GVAR(contestedCheckHash); - { - private _side = _x; + private _handleReport = nil; + if (_reportEnemiesEnabled) then { + _handleReport = [{ + //So that this does not run, when contest update is offline + if !(GVAR(disableContestedCheck)) then { + private _side = _args; + private _hash = GVAR(contestedCheckHash); private _contestedStatus = GVAR(contestedStatus) get _side; private _mspStatus = GVAR(deployementStatus) get _side; if (_mspStatus) then { private _enemyCount = (_hash get _side) select 0; if (_enemyCount > 0 && !_contestedStatus) then { private _whoToNotify = [_side, GVAR(reportEnemiesNotification)] call FUNC(whoToNotify); - if (count _whoToNotify > 0 ) then { + if (_whoToNotify isNotEqualTo [] ) then { (localize "STR_tunres_MSP_FNC_enemies_near") remoteExecCall ["CBA_fnc_notify", _whoToNotify]; }; }; + } else { + ERROR("Tried to run report enemies, while msp was not deployed!!"); }; - } forEach [west,east,resistance,civilian]; - }, GVAR(reportEnemiesInterval), []] call CBA_fnc_addPerFrameHandler; + }; + }, _reportEnemiesInterval, [_side]] call CBA_fnc_addPerFrameHandler; }; -}] call CBA_fnc_waitUntilAndExecute; + GVAR(contestHandles) set [_side,[_handleContest,_handleReport]]; +} else { + + if !(GVAR(contestCheckRunning) getOrDefault [_side, false]) exitWith { + ERROR("Tried to stop contested check, while it was already off!!"); + }; + + private _values = GVAR(contestHandles) get _side; + { + if (!isNil _x) then { + [_x] call CBA_fnc_removePerFrameHandler; + }; + } forEach _values; +}; + +GVAR(contestCheckRunning) set [_side, _start]; \ No newline at end of file diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index 3800297..7b05556 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -67,6 +67,7 @@ publicVariable QGVAR(activeVehicle); if (_setup) then { [_side, true] remoteExecCall [QFUNC(contestedCheck), 2]; + [_side, true] remoteExecCall [QFUNC(startContestedChecks), 2]; } else { GVAR(contestedStatus) set [_side, false]; publicVariable QGVAR(contestedStatus); From 0727e4579db421b59a06a3aaade485e3777e457b Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 4 Feb 2024 00:26:38 +0200 Subject: [PATCH 076/228] Fix missing publicvariables --- addons/respawn/functions/fnc_timer.sqf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/respawn/functions/fnc_timer.sqf b/addons/respawn/functions/fnc_timer.sqf index 61f142f..50de4e8 100644 --- a/addons/respawn/functions/fnc_timer.sqf +++ b/addons/respawn/functions/fnc_timer.sqf @@ -21,12 +21,14 @@ if (GVAR(forcedRespawn)) exitWith { INFO("No timer, Only forced waves"); }; private _hashWaitTime = GVAR(nextWaveTimes); private _hashWaveLenght = GVAR(waveLenghtTimes); -private _time = (_hashWaitTime get _side) + (_hashWaveLenght get _side) * 60; +private _time = round ((_hashWaitTime get _side) + (_hashWaveLenght get _side) * 60); _hashWaitTime set [_side, _time]; +publicVariable QGVAR(nextWaveTimes); if !( GVAR(timerRunning) getOrDefault [_side, false]) then { GVAR(timerRunning) set [_side, true]; + publicVariable QGVAR(timerRunning); [{ _this params["_side"]; GVAR(allowRespawn) get _side && { cba_missiontime >= GVAR(nextWaveTimes) get _side } @@ -37,6 +39,7 @@ if !( GVAR(timerRunning) getOrDefault [_side, false]) then { }; GVAR(timerRunning) set [_side, false]; + publicVariable QGVAR(timerRunning); [_side] call FUNC(doRespawnWave); [_side] call FUNC(timer); }, [_side]] call CBA_fnc_waitUntilAndExecute; From da56ee7264f9a63d846254b35d672a4d686fd009 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 4 Feb 2024 00:26:59 +0200 Subject: [PATCH 077/228] Additional check to prevent running at wrong respawn mode --- .../respawn/functions/fnc_setPlayerTicketCount.sqf | 12 +++++++++--- addons/respawn/functions/fnc_setSideTicketCount.sqf | 10 ++++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/addons/respawn/functions/fnc_setPlayerTicketCount.sqf b/addons/respawn/functions/fnc_setPlayerTicketCount.sqf index 4e14e9e..02533f7 100644 --- a/addons/respawn/functions/fnc_setPlayerTicketCount.sqf +++ b/addons/respawn/functions/fnc_setPlayerTicketCount.sqf @@ -15,6 +15,12 @@ if (!isServer) exitWith { }; params ["_player", "_count"]; -private _hash = GVAR(PlayerTicektsHash); -private _playerUID = getPlayerUID _player; -_hash set [_playerUID, _count]; \ No newline at end of file +if (GVAR(respawnType) isEqualTo 2) then { + private _hash = GVAR(playerTicektsHash); + private _playerUID = getPlayerUID _player; + _hash set [_playerUID, _count]; + breakWith true; +} else { + ERROR("Tried to set player tickest, when not using player tickest"); + breakWith false; +}; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_setSideTicketCount.sqf b/addons/respawn/functions/fnc_setSideTicketCount.sqf index 55aa53f..d193dad 100644 --- a/addons/respawn/functions/fnc_setSideTicketCount.sqf +++ b/addons/respawn/functions/fnc_setSideTicketCount.sqf @@ -15,5 +15,11 @@ if (!isServer) exitWith { }; params ["_side", "_count"]; -private _hash = GVAR(tickets); -_hash set [_side, _count]; \ No newline at end of file +if (GVAR(respawnType) isEqualTo 1) then { + GVAR(tickets) set [_side, _count]; + publicVariable QGVAR(tickets); + breakWith true; +} else { + ERROR("Tried to set side tickest, when not using side tickest"); + breakWith false; +}; \ No newline at end of file From 59d6fcc4f7b758f71f4d4acf3beccc39ac289577 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 24 Feb 2024 19:30:31 +0200 Subject: [PATCH 078/228] rename tunres_respawn_fnc_update_respawn_point -> tunres_respawn_fnc_updateRespawnPoint --- addons/msp/functions/fnc_addEventHandlers.sqf | 2 +- addons/msp/functions/fnc_contestedCheck.sqf | 4 ++-- addons/msp/functions/fnc_updateDeployementStatus.sqf | 2 +- addons/respawn/XEH_PREP.hpp | 2 +- ...nc_update_respawn_point.sqf => fnc_updateRespawnPoint.sqf} | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) rename addons/respawn/functions/{fnc_update_respawn_point.sqf => fnc_updateRespawnPoint.sqf} (92%) diff --git a/addons/msp/functions/fnc_addEventHandlers.sqf b/addons/msp/functions/fnc_addEventHandlers.sqf index 684fc0a..4223339 100644 --- a/addons/msp/functions/fnc_addEventHandlers.sqf +++ b/addons/msp/functions/fnc_addEventHandlers.sqf @@ -68,7 +68,7 @@ publicVariable QGVAR(activeVehicle); //Do marker update - [_side, false] remoteExecCall ["tunres_respawn_fnc_update_respawn_point", 2]; + [_side, false] remoteExecCall ["tunres_respawn_fnc_updateRespawnPoint", 2]; (localize "STR_tunres_MSP_destroyed") remoteExecCall ["CBA_fnc_notify", _side]; }; diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index 4071f9d..28bd9fe 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -69,10 +69,10 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { private _whoToNotify = [_side, GVAR(contestedNotification)] call FUNC(whoToNotify); if (_whoToNotify isNotEqualTo [] ) then { if (_isContested) then { - [_side, false] call EFUNC(respawn,update_respawn_point); + [_side, false] call EFUNC(respawn,updateRespawnPoint); (call compile (localize "STR_tunres_MSP_FNC_Contested_hint")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; } else { - [_side, true, (getPos _msp) ] call EFUNC(respawn,update_respawn_point); + [_side, true, (getPos _msp) ] call EFUNC(respawn,updateRespawnPoint); (call compile (localize "STR_tunres_MSP_FNC_secured_hint")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; }; }; diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index 7b05556..aa57f3d 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -57,7 +57,7 @@ if (_setup) then { private _pos = getpos _msp; -[_side, _setup, _pos] remoteExecCall [QEFUNC(respawn,update_respawn_point), 2]; +[_side, _setup, _pos] remoteExecCall [QEFUNC(respawn,updateRespawnPoint), 2]; _msp setVariable [QGVAR(isMSP), _setup, true]; GVAR(deployementStatus) set [_side, _setup]; diff --git a/addons/respawn/XEH_PREP.hpp b/addons/respawn/XEH_PREP.hpp index a255210..8ee6dea 100644 --- a/addons/respawn/XEH_PREP.hpp +++ b/addons/respawn/XEH_PREP.hpp @@ -35,6 +35,6 @@ PREP(teleportButton); PREP(teleportOnLBSelChanged); PREP(teleportUnit); PREP(timer); -PREP(update_respawn_point); +PREP(updateRespawnPoint); PREP(updateWaitingRespawnList); PREP(waitingArea); \ No newline at end of file diff --git a/addons/respawn/functions/fnc_update_respawn_point.sqf b/addons/respawn/functions/fnc_updateRespawnPoint.sqf similarity index 92% rename from addons/respawn/functions/fnc_update_respawn_point.sqf rename to addons/respawn/functions/fnc_updateRespawnPoint.sqf index 2b838d0..4e03cf2 100644 --- a/addons/respawn/functions/fnc_update_respawn_point.sqf +++ b/addons/respawn/functions/fnc_updateRespawnPoint.sqf @@ -11,7 +11,7 @@ * None * * Example: - * [west, true] call tunres_respawn_fnc_update_respawn_point + * [west, true] call tunres_respawn_fnc_updateRespawnPoint */ #include "script_component.hpp" From 0bd6d34ac6b40193e8498d75d9be8b0b3f874003 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 24 Feb 2024 19:31:21 +0200 Subject: [PATCH 079/228] cleanup --- .gitignore | 2 +- addons/respawn/XEH_postInit_server.sqf | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 77dd7b2..52aaca3 100644 --- a/.gitignore +++ b/.gitignore @@ -24,4 +24,4 @@ releases/* sqfvm.exe texHeaders.bin Thumbs.db -tools/temp \ No newline at end of file +tools/temp diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 08e501f..01fc548 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -80,7 +80,6 @@ if ( !isnil "afi_aar2" ) then { private _time = (_hashTime get civilian); AAR_UPDATE("civ","Next respawn wave",_time); }; - }, 10] call CBA_fnc_addPerFrameHandler; }; }] call CBA_fnc_waitUntilAndExecute; From c3d72decec784086b6bc8e13d4586fee69a5ce17 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 23 May 2024 22:47:32 +0300 Subject: [PATCH 080/228] Rename functions --- addons/respawn/XEH_PREP.hpp | 8 +- .../respawn/functions/fnc_marker_update.sqf | 55 ------------ ...pawnpos.sqf => fnc_moduleRespawnPoint.sqf} | 39 +++++---- ..._teleporter.sqf => fnc_moduleTeleport.sqf} | 2 +- .../functions/fnc_module_waitingarea.sqf | 86 ------------------- .../functions/fnc_updateRespawnMarkers.sqf | 38 ++++++++ 6 files changed, 65 insertions(+), 163 deletions(-) delete mode 100644 addons/respawn/functions/fnc_marker_update.sqf rename addons/respawn/functions/{fnc_module_respawnpos.sqf => fnc_moduleRespawnPoint.sqf} (62%) rename addons/respawn/functions/{fnc_module_teleporter.sqf => fnc_moduleTeleport.sqf} (97%) delete mode 100644 addons/respawn/functions/fnc_module_waitingarea.sqf create mode 100644 addons/respawn/functions/fnc_updateRespawnMarkers.sqf diff --git a/addons/respawn/XEH_PREP.hpp b/addons/respawn/XEH_PREP.hpp index 8ee6dea..068c278 100644 --- a/addons/respawn/XEH_PREP.hpp +++ b/addons/respawn/XEH_PREP.hpp @@ -17,10 +17,9 @@ PREP(getOffSet); PREP(getParentAction); PREP(getTicketCount); PREP(killJIP); -PREP(marker_update); -PREP(module_respawnpos); -PREP(module_teleporter); -PREP(module_waitingarea); +PREP(moduleRespawnPoint); +PREP(moduleTeleport); +PREP(moduleWaitingArea); PREP(onPlayerKilled); PREP(openTeleportMenu); PREP(radioSettings_tfar); @@ -35,6 +34,7 @@ PREP(teleportButton); PREP(teleportOnLBSelChanged); PREP(teleportUnit); PREP(timer); +PREP(updateRespawnMarkers); PREP(updateRespawnPoint); PREP(updateWaitingRespawnList); PREP(waitingArea); \ No newline at end of file diff --git a/addons/respawn/functions/fnc_marker_update.sqf b/addons/respawn/functions/fnc_marker_update.sqf deleted file mode 100644 index 7c077c2..0000000 --- a/addons/respawn/functions/fnc_marker_update.sqf +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Author: [Tuntematon] - * [Description] - * Update all marker alphas. If in waiting area, makes respawn marker BIG! - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * [] call tunres_Respawn_fnc_marker_update - */ -#include "script_component.hpp" - -if (!hasInterface) exitWith { }; -if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (IE zeus) -private _currentRespawnPos = switch (playerSide) do { - case west: { - "tunres_respawn_west" - }; - - case east: { - "tunres_respawn_east"; - }; - - case resistance: { - "tunres_respawn_guerrila" - }; - - case civilian: { - "tunres_respawn_civilian" - }; -}; - -private _newPos = getMarkerPos _currentRespawnPos; -private _contestedStatus = true; -private _status = false; - -"RespawnPosLocal" setMarkerPosLocal _newPos; - -//show main base if respawn pos is somewhere else -if ((getMarkerPos "RespawnPosLocal") distance2D (getMarkerPos "MainBaseLocal") > 2) then { - "MainBaseLocal" setMarkerAlphaLocal 1; -} else { - "MainBaseLocal" setMarkerAlphaLocal 0; -}; - -//maker marker bigger, if waiting respawn just because -if (player getvariable [QGVAR(isWaitingRespawn), false]) then { - "RespawnPosLocal" setMarkerSizeLocal [3,3]; -} else { - "RespawnPosLocal" setMarkerSizeLocal [1,1]; -}; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_module_respawnpos.sqf b/addons/respawn/functions/fnc_moduleRespawnPoint.sqf similarity index 62% rename from addons/respawn/functions/fnc_module_respawnpos.sqf rename to addons/respawn/functions/fnc_moduleRespawnPoint.sqf index c423bcb..b982acd 100644 --- a/addons/respawn/functions/fnc_module_respawnpos.sqf +++ b/addons/respawn/functions/fnc_moduleRespawnPoint.sqf @@ -1,7 +1,7 @@ /* * Author: [Tuntematon] * [Description] - * Module fnc to create markers + * Module fnc to mainbase respawn point * * Arguments: * 0: Logic @@ -10,7 +10,7 @@ * The return true when done * * Example: - * [Logic] call tunres_Respawn_fnc_module_respawnpos + * [Logic] call tunres_Respawn_fnc_moduleRespawnPoint */ #include "script_component.hpp" @@ -18,7 +18,9 @@ if (!isServer) exitWith { }; private _logic = param [0,objNull,[objNull]]; -private _markername = _logic getVariable ["respawn_side","none"]; +private _markername = _logic getVariable ["respawn_side","none"]; +private _flagTexture = _logic getVariable ["flag_texture",""]; + private _pos = getPos _logic; if (_markername isEqualTo "none") exitWith { hint localize "STR_tunres_Respawn_Module_RespanPos_novalue"; false }; // Exit if no side private _marker = ""; @@ -35,46 +37,49 @@ private ["_side", "_color"]; private _flag = objNull; switch (_markername) do { - case "tunres_respawn_west": { + case QGVAR(west): { _flag = "Flag_Blue_F" createVehicle _pos; - GVAR(flag_west_spawn) = _flag; - publicVariable QGVAR(flag_west_spawn); _side = west; _color = "ColorWEST"; }; - case "tunres_respawn_east": { + case QGVAR(east): { _flag = "Flag_Red_F" createVehicle _pos; - GVAR(flag_east_spawn) = _flag; - publicVariable QGVAR(flag_east_spawn); _side = east; _color = "ColorEAST"; }; - case "tunres_respawn_guerrila": { + case QGVAR(resistance): { _flag = "Flag_Green_F" createVehicle _pos; - GVAR(flag_guerrila_spawn) = _flag; - publicVariable QGVAR(flag_guerrila_spawn); _side = resistance; _color = "ColorGUER"; }; - case "tunres_respawn_civilian": { + case QGVAR(civilian): { _flag = "Flag_White_F" createVehicle _pos; - GVAR(flag_civilian_spawn) = _flag; - publicVariable QGVAR(flag_civilian_spawn); _side = civilian; _color = "ColorCIV"; }; }; + +private _values = GVAR(flagPoles) get _side; +_values set [0, _flag]; +GVAR(flagPoles) set [_side, _values]; +publicVariable QGVAR(flagPoles); + +//Set flag texure, if given texture exist +if (fileExists _flagTexture) then { + _flag setFlagTexture _flagTexture; +}; + GVAR(enabledSides) set [_side, true]; publicVariable QGVAR(enabledSides); GVAR(respawnPointsHash) set [_side, [_markername, _pos]]; publicVariable QGVAR(respawnPointsHash); -["RespawnPosLocal", _pos, "Respawn", "respawn_inf", _color, 1] remoteExecCall [QFUNC(createLocalMarker), _side, true]; -["MainBaseLocal", _pos, "Main Base", "mil_start", _color] remoteExecCall [QFUNC(createLocalMarker), _side, true]; +[QGVAR(RespawnPosLocal), _pos, localize "STR_tunres_Respawn_RespawnPoint", "respawn_inf", _color, 1, 100] remoteExecCall [QFUNC(createLocalMarker), _side, true]; +[QGVAR(MainBaseLocal), _pos, localize "STR_tunres_Respawn_MainBase", "mil_start", _color, 0, 100] remoteExecCall [QFUNC(createLocalMarker), _side, true]; [_flag] remoteExecCall [QFUNC(addActionsPlayer), _side, true]; diff --git a/addons/respawn/functions/fnc_module_teleporter.sqf b/addons/respawn/functions/fnc_moduleTeleport.sqf similarity index 97% rename from addons/respawn/functions/fnc_module_teleporter.sqf rename to addons/respawn/functions/fnc_moduleTeleport.sqf index b4cdb35..34fd1d3 100644 --- a/addons/respawn/functions/fnc_module_teleporter.sqf +++ b/addons/respawn/functions/fnc_moduleTeleport.sqf @@ -9,7 +9,7 @@ * The return true when done * * Example: - * [Logic]call tunres_Respawn_fnc_module_teleporter + * [Logic]call tunres_Respawn_fnc_moduleTeleport */ #include "script_component.hpp" diff --git a/addons/respawn/functions/fnc_module_waitingarea.sqf b/addons/respawn/functions/fnc_module_waitingarea.sqf deleted file mode 100644 index 6afa936..0000000 --- a/addons/respawn/functions/fnc_module_waitingarea.sqf +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Author: [Tuntematon] - * [Description] - * Module fnc to create markers - * - * Arguments: - * 0: Logic - * - * Return Value: - * The return true when done - * - * Example: - * [Logic] call tunres_Respawn_fnc_module_waitingarea - */ -#include "script_component.hpp" - -if (!isServer) exitWith { }; - -private _logic = param [0,objNull,[objNull]]; - -private _markername = _logic getVariable ["respawn_side","none"]; - -if (_markername isEqualTo "none") exitWith { // Exit if no side - private _errorText = localize "STR_tunres_Respawn_Module_WaitingArea_novalue"; - ERROR_MSG(_errorText); - false -}; - -if (getMarkerColor _markername isEqualTo "") then { - _marker = [_markername, getPos _logic, "icon", [1, 1], "PERSIST", "TYPE:", "Empty"] call CBA_fnc_createMarker; - _marker setMarkerAlpha 0; -} else { - private _errorText = format [(localize "STR_tunres_Respawn_Module_WaitingArea_MultipleMarkers"), _markername]; - ERROR_MSG(_errorText); -}; - -private _pos = getPos _logic; -private "_side"; - -switch (_markername) do { - case "respawn_west": { - _side = west; - GVAR(flag_west) = "Flag_Blue_F" createVehicle _pos; - [{ ADDON } , { - [west] call FUNC(timer); - }] call CBA_fnc_waitUntilAndExecute; - }; - - case "respawn_east": { - _side = east; - GVAR(flag_east) = "Flag_Red_F" createVehicle _pos; - [{ ADDON }, { - [east] call FUNC(timer); - }] call CBA_fnc_waitUntilAndExecute; - }; - - case "respawn_guerrila": { - _side = resistance; - - GVAR(flag_guerrila) = "Flag_Green_F" createVehicle _pos; - [{ ADDON }, { - [resistance] call FUNC(timer); - }] call CBA_fnc_waitUntilAndExecute; - }; - - case "respawn_civilian": { - _side = civilian; - GVAR(flag_civilian) = "Flag_White_F" createVehicle _pos; - [{ ADDON }, { - [civilian] call FUNC(timer); - }] call CBA_fnc_waitUntilAndExecute; - }; - - default { - _side = sideLogic; - } -}; - -if (_side == sideLogic) then { - ERROR("Module has side logic for some fucking reason.") -}; -GVAR(waitingArea) set [_side, [_markername, _logic, _pos]]; -publicVariable QGVAR(waitingArea); -// Module function is executed by spawn command, so returned value is not necessary, but it's good practice. -true - diff --git a/addons/respawn/functions/fnc_updateRespawnMarkers.sqf b/addons/respawn/functions/fnc_updateRespawnMarkers.sqf new file mode 100644 index 0000000..df10e5f --- /dev/null +++ b/addons/respawn/functions/fnc_updateRespawnMarkers.sqf @@ -0,0 +1,38 @@ +/* + * Author: [Tuntematon] + * [Description] + * Update all marker alphas. If in waiting area, makes respawn marker BIG! + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call tunres_Respawn_fnc_updateRespawnMarkers + */ +#include "script_component.hpp" + +if (!hasInterface) exitWith { }; +private _side = playerSide; +if (_side isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (IE zeus) + +private _localRespawnPosMarker = QGVAR(RespawnPosLocal); +private _localMainBaseMarker = QGVAR(MainBaseLocal); + +_localRespawnPosMarker setMarkerPosLocal (getMarkerPos MARKER_NAME(_side)); + +//show main base if respawn pos is somewhere else +if ((getMarkerPos _localRespawnPosMarker) distance2D (getMarkerPos _localMainBaseMarker) > 2) then { + _localMainBaseMarker setMarkerAlphaLocal 1; +} else { + _localMainBaseMarker setMarkerAlphaLocal 0; +}; + +//maker marker bigger, if waiting respawn just because +if (player getvariable [QGVAR(isWaitingRespawn), false]) then { + _localRespawnPosMarker setMarkerSizeLocal [3,3]; +} else { + _localRespawnPosMarker setMarkerSizeLocal [1,1]; +}; \ No newline at end of file From facf136d7449eb7be99d35173613dfbc3c8cf28c Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 23 May 2024 22:49:33 +0300 Subject: [PATCH 081/228] Check contest area during briefing Splitted create and delete markers to own fnc. Created system for checking contest area during briefing. --- addons/msp/functions/fnc_briefingNotes.sqf | 10 +++- .../functions/fnc_checkContestZoneArea.sqf | 35 +++++++++++ .../fnc_checkContestZoneMarkersBriefing.sqf | 56 ++++++++++++++++++ .../fnc_createContestZoneMarkers.sqf | 58 +++++++++---------- .../fnc_deleteContestZoneMarkers.sqf | 30 ++++++++++ 5 files changed, 159 insertions(+), 30 deletions(-) create mode 100644 addons/msp/functions/fnc_checkContestZoneArea.sqf create mode 100644 addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf create mode 100644 addons/msp/functions/fnc_deleteContestZoneMarkers.sqf diff --git a/addons/msp/functions/fnc_briefingNotes.sqf b/addons/msp/functions/fnc_briefingNotes.sqf index 3fccfcb..bc77ba5 100644 --- a/addons/msp/functions/fnc_briefingNotes.sqf +++ b/addons/msp/functions/fnc_briefingNotes.sqf @@ -48,4 +48,12 @@ if !(player diarySubjectExists "Respawn info") then { player createDiarySubject ["Respawn info","Tun - Respawn info"]; }; -player createDiaryRecord ["Respawn info",["MSP info", _text]]; \ No newline at end of file +player createDiaryRecord ["Respawn info",["MSP info", _text]]; + +player createDiaryRecord ["Respawn info",["MSP check contest area", +"After enabling, you can click on map and it will create area markers. +

Enable contest area check. +

Disable contest area check. + +" +]]; \ No newline at end of file diff --git a/addons/msp/functions/fnc_checkContestZoneArea.sqf b/addons/msp/functions/fnc_checkContestZoneArea.sqf new file mode 100644 index 0000000..276fae8 --- /dev/null +++ b/addons/msp/functions/fnc_checkContestZoneArea.sqf @@ -0,0 +1,35 @@ +/* + * Author: [Tuntematon] + * [Description] + * + * Arguments: + * 0: Give object to get position (default: {player}) + * + * Return Value: + * None + * + * Example: + * [_target] call tunres_MSP_fnc_checkContestZoneArea + + */ +#include "script_component.hpp" + +if (playerSide isEqualTo sideLogic || !hasInterface) exitWith { }; + +params[["_target", player]]; + +openMap true; +private _pos = getPos _target; + +[_pos] call FUNC(createContestZoneMarkers); + +GVAR(contestMarkerMapEH) = addMissionEventHandler ["Map", { + params ["_mapIsOpened", "_mapIsForced"]; + if !(_mapIsOpened) then { + removeMissionEventHandler ["Map", GVAR(contestMarkerMapEH)]; + + QEGVAR(Respawn,RespawnPosLocal) setMarkerAlphaLocal 1; + }; +}]; + +QEGVAR(Respawn,RespawnPosLocal) setMarkerAlphaLocal 0; \ No newline at end of file diff --git a/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf b/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf new file mode 100644 index 0000000..beb1249 --- /dev/null +++ b/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf @@ -0,0 +1,56 @@ +/* + * Author: [Tuntematon] + * [Description] + * + * Arguments: + * 0: The first argument + * 1: The second argument + * 2: Multiple input types + * 3: Optional input (default: true) + * 4: Optional input with multiple types (default: {true}) + * 5: Not mandatory input (default: nil) + * + * Return Value: + * The return value + * + * Example: + * ["something", player] call tunres_MSP_fnc_checkContestZoneMarkersBriefing + * + * Public: [Yes/No] + */ +#include "script_component.hpp" +params[["_enable", true]]; + +if (_enable) then { + if (cba_missiontime > 1) exitWith { + "Can't be used during mission!" call CBA_fnc_notify; + }; + + if (!isNil QGVAR(checkContestZoneMarkersBriefingEH)) exitWith { + + }; + LOG("Enable briefing contest area check during briefing"); + onMapSingleClick {_shift}; + GVAR(checkContestZoneMarkersBriefingEH) = addMissionEventHandler ["MapSingleClick", { + params ["_units", "_pos", "_alt", "_shift"]; + + LOG("Update briefing contest area check markers pos"); + [] call FUNC(deleteContestZoneMarkers); + [_pos] call FUNC(createContestZoneMarkers); + }]; + + [{ cba_missiontime > 1 || isNil QGVAR(checkContestZoneMarkersBriefingEH) }, { + if (!isNil QGVAR(checkContestZoneMarkersBriefingEH)) then { + LOG("Cleare briefing contest area check markers"); + [false] call FUNC(checkContestZoneMarkersBriefing); + }; + }] call CBA_fnc_waitUntilAndExecute; +} else { + if (!isNil QGVAR(checkContestZoneMarkersBriefingEH)) then { + onMapSingleClick ""; + LOG("Disable contest markers"); + [] call FUNC(deleteContestZoneMarkers); + removeMissionEventHandler ["MapSingleClick", GVAR(checkContestZoneMarkersBriefingEH)]; + GVAR(checkContestZoneMarkersBriefingEH) = nil; + }; +}; \ No newline at end of file diff --git a/addons/msp/functions/fnc_createContestZoneMarkers.sqf b/addons/msp/functions/fnc_createContestZoneMarkers.sqf index 7114d3d..9db6417 100644 --- a/addons/msp/functions/fnc_createContestZoneMarkers.sqf +++ b/addons/msp/functions/fnc_createContestZoneMarkers.sqf @@ -16,40 +16,40 @@ if (playerSide isEqualTo sideLogic || !hasInterface) exitWith { }; -params[["_target", player]]; +params["_pos"]; private _values = GVAR(contestValues) get playerSide; private _reportEnemiesRange = _values param [1]; private _contestedRadiusMax = _values param [2]; private _contestedRadiusMin = _values param [3]; -openMap true; -private _pos = getPos _target; private _posMax = _pos getPos [_contestedRadiusMax, 100]; private _posMin = _pos getPos [_contestedRadiusMin, 90]; -private _posReport= _pos getPos [_reportEnemiesRange, 80]; -[QGVAR(contestMarkerMapMax), _pos, "ELLIPSE", [_contestedRadiusMax, _contestedRadiusMax], "COLOR:", "ColorOrange"] call CBA_fnc_createMarker; -[QGVAR(contestMarkerMapMaxText), _posMax, "ICON", [1,1], "TEXT:", format["Max Contest range (%1m)",_contestedRadiusMax], "COLOR:", "ColorOrange", "TYPE:", "hd_warning"] call CBA_fnc_createMarker; - -[QGVAR(contestMarkerMapReport), _pos, "ELLIPSE", [_reportEnemiesRange, _reportEnemiesRange], "COLOR:", "colorOPFOR"] call CBA_fnc_createMarker; -[QGVAR(contestMarkerMapReportText), _posReport, "ICON", [1,1],"TEXT:", format["Report enemies range (%1m)",_reportEnemiesRange], "COLOR:", "ColorYellow", "TYPE:", "hd_warning"] call CBA_fnc_createMarker; - -[QGVAR(contestMarkerMapMin), _pos, "ELLIPSE", [_contestedRadiusMin, _contestedRadiusMin], "COLOR:", "colorOPFOR"] call CBA_fnc_createMarker; -[QGVAR(contestMarkerMapMinText), _posMin, "ICON", [1,1],"TEXT:", format["Min Contest range (%1m)",_contestedRadiusMin], "COLOR:", "ColorRed", "TYPE:", "hd_warning"] call CBA_fnc_createMarker; - -[QGVAR(contestMarkerMapMSPText), _pos, "ICON", [1,1],"TEXT:", "MSP", "TYPE:", "loc_Truck"] call CBA_fnc_createMarker; - - -GVAR(contestMarkerMapEH) = addMissionEventHandler ["Map", { - params ["_mapIsOpened", "_mapIsForced"]; - if !(_mapIsOpened) then { - removeMissionEventHandler ["Map", GVAR(contestMarkerMapEH)]; - deleteMarkerLocal QGVAR(contestMarkerMapMax); - deleteMarkerLocal QGVAR(contestMarkerMapMin); - deleteMarkerLocal QGVAR(contestMarkerMapMinText); - deleteMarkerLocal QGVAR(contestMarkerMapMaxText); - deleteMarkerLocal QGVAR(contestMarkerMapReport); - deleteMarkerLocal QGVAR(contestMarkerMapReportText); - deleteMarkerLocal QGVAR(contestMarkerMapMSPText); - }; -}] \ No newline at end of file +private _posReport = _pos getPos [_reportEnemiesRange, 80]; + + +// * 0: Marker name +// * 1: Position +// * 2: Marker text +// * 3: Icon/brush https://community.bistudio.com/wiki/setMarkerBrushLocal https://community.bistudio.com/wiki/setMarkerTypeLocal +// * 4: Color +// * 5: Alpha +// * 6: Priority +// * 7: Shape (Default: "ICON") "ICON", "RECTANGLE", "ELLIPSE", "POLYLINE" +// * 8: Size [a-axis, b-axis] +// * 9: Direction + + +[QGVAR(contestMarkerMapMax), _pos, nil, "Solid", "ColorOrange", 0.75, -2, "ELLIPSE", [_contestedRadiusMax, _contestedRadiusMax]] call EFUNC(respawn,createLocalMarker); + +[QGVAR(contestMarkerMapMaxText), _posMax, format["Max Contest range (%1m)",_contestedRadiusMax], "hd_warning", "ColorOrange", 1, 110] call EFUNC(respawn,createLocalMarker); + +[QGVAR(contestMarkerMapReport), _pos, nil, "Solid", "ColorYellow", 0.75, -3, "ELLIPSE", [_reportEnemiesRange, _reportEnemiesRange]] call EFUNC(respawn,createLocalMarker); + +[QGVAR(contestMarkerMapReportText), _posReport, format["Report enemies range (%1m)",_reportEnemiesRange], "hd_warning", "ColorYellow", 1, 110] call EFUNC(respawn,createLocalMarker); + +[QGVAR(contestMarkerMapMin), _pos, nil, "Solid", "colorOPFOR", 0.75, -1, "ELLIPSE", [_contestedRadiusMin, _contestedRadiusMin]] call EFUNC(respawn,createLocalMarker); + +[QGVAR(contestMarkerMapMinText), _posMin, format["Min Contest range (%1m)",_contestedRadiusMin], "hd_warning", "ColorRed", 1, 110] call EFUNC(respawn,createLocalMarker); + +[QGVAR(contestMarkerMapMSPText), _pos, "MSP", "loc_Truck", "ColorBlack", 1, 110, nil, [2,2]] call EFUNC(respawn,createLocalMarker); \ No newline at end of file diff --git a/addons/msp/functions/fnc_deleteContestZoneMarkers.sqf b/addons/msp/functions/fnc_deleteContestZoneMarkers.sqf new file mode 100644 index 0000000..e834165 --- /dev/null +++ b/addons/msp/functions/fnc_deleteContestZoneMarkers.sqf @@ -0,0 +1,30 @@ +/* + * Author: [Tuntematon] + * [Description] + * + * Arguments: + * 0: The first argument + * 1: The second argument + * 2: Multiple input types + * 3: Optional input (default: true) + * 4: Optional input with multiple types (default: {true}) + * 5: Not mandatory input (default: nil) + * + * Return Value: + * The return value + * + * Example: + * ["something", player] call tunres_MSP_fnc_deleteContestZoneMarkers + * + * Public: [Yes/No] + */ +#include "script_component.hpp" + + +deleteMarkerLocal QGVAR(contestMarkerMapMax); +deleteMarkerLocal QGVAR(contestMarkerMapMin); +deleteMarkerLocal QGVAR(contestMarkerMapMinText); +deleteMarkerLocal QGVAR(contestMarkerMapMaxText); +deleteMarkerLocal QGVAR(contestMarkerMapReport); +deleteMarkerLocal QGVAR(contestMarkerMapReportText); +deleteMarkerLocal QGVAR(contestMarkerMapMSPText); \ No newline at end of file From 1b25d9907cc6b1715f7afc1d793902af12edaf3a Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 23 May 2024 22:50:00 +0300 Subject: [PATCH 082/228] Add contest area check & minor fiexes --- addons/main/Stringtable.xml | 64 ++++++++++++++++++++++++++++++------- 1 file changed, 52 insertions(+), 12 deletions(-) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index a97d361..8fead5c 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -130,6 +130,50 @@ Allow this side to be spectated Allow this side to be spectated + + __%1__ deployed MSP by __inst__. + __%1__ deployed MSP by __inst__. + + + __%1__ packed MSP by __inst__. + __%1__ packed MSP by __inst__. + + + __%1__ MSP is contested + __%1__ MSP is contested + + + __%1__ MSP is no longer contested + __%1__ MSP is no longer contested + + + Respawn wave for __%1__. %2 units respawned. Total respawn count is %3 + Respawn wave for __%1__. %2 units respawned. Total respawn count is %3 + + + Respawn wave for __%1__. %2 units respawned. Total respawn count is %3 and tickets left %4 + Respawn wave for __%1__. %2 units respawned. Total respawn count is %3 and tickets left %4 + + + MSP deployement aborted! + MSP deployement aborted! + + + MSP contest status: %1 + MSP contest status: %1 + + + Respawn point + Respawn point + + + Main base + Main base + + + To use custom texture, give path to it in non string format. If left empty or invalid paht, uses default side color + To use custom texture, give path to it in non string format. If left empty or invalid paht, uses default side color + @@ -253,8 +297,8 @@ Waiting area module do not have side set - Respawn Waiting Area - Respawn Waiting Area + Waiting Area + Waiting Area Put this module where you want respawn waiting area to be for this side. @@ -412,17 +456,13 @@ Progress Bar Progress Bar - - Time that it takes to setup MSP (seconds) - Setup Time - - Packing Time - Packing Time + Pack time + Pack time - Setup Time - Setup Time + Deploy time + Deploy time Time that it takes to deploy MSP (seconds) @@ -575,8 +615,8 @@ - Who gets notification from MSP setup/pack? - Who gets notification from MSP setup/pack? + Who gets notification from MSP deploy/pack? + Who gets notification from MSP deploy/pack? Who gets notification when MSP contested? From 0558de20e103c44b0d8b22db6f20d9db221fc900 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 23 May 2024 22:50:36 +0300 Subject: [PATCH 083/228] renaming fnc --- .../functions/fnc_moduleWaitingArea.sqf | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 addons/respawn/functions/fnc_moduleWaitingArea.sqf diff --git a/addons/respawn/functions/fnc_moduleWaitingArea.sqf b/addons/respawn/functions/fnc_moduleWaitingArea.sqf new file mode 100644 index 0000000..6f7d4a1 --- /dev/null +++ b/addons/respawn/functions/fnc_moduleWaitingArea.sqf @@ -0,0 +1,91 @@ +/* + * Author: [Tuntematon] + * [Description] + * Module fnc to wainting area point + * + * Arguments: + * 0: Logic + * + * Return Value: + * The return true when done + * + * Example: + * [Logic] call tunres_Respawn_fnc_moduleWaitingArea + */ +#include "script_component.hpp" + +if (!isServer) exitWith { }; + +private _logic = param [0,objNull,[objNull]]; + +private _markername = _logic getVariable ["respawn_side","none"]; +private _flagTexture = _logic getVariable ["flag_texture",""]; + +if (_markername isEqualTo "none") exitWith { // Exit if no side + private _errorText = localize "STR_tunres_Respawn_Module_WaitingArea_novalue"; + ERROR_MSG(_errorText); + false +}; + +if (getMarkerColor _markername isEqualTo "") then { + _marker = [_markername, getPos _logic, "icon", [1, 1], "PERSIST", "TYPE:", "Empty"] call CBA_fnc_createMarker; + _marker setMarkerAlpha 0; +} else { + private _errorText = format [(localize "STR_tunres_Respawn_Module_WaitingArea_MultipleMarkers"), _markername]; + ERROR_MSG(_errorText); +}; + +private _pos = getPos _logic; +private _flag = objNull; +private _side = nil; + +switch (_markername) do { + case "respawn_west": { + _side = west; + _flag = "Flag_Blue_F" createVehicle _pos; + }; + + case "respawn_east": { + _side = east; + _flag = "Flag_Red_F" createVehicle _pos; + }; + + case "respawn_guerrila": { + _side = resistance; + _flag = "Flag_Green_F" createVehicle _pos; + }; + + case "respawn_civilian": { + _side = civilian; + _flag = "Flag_White_F" createVehicle _pos; + }; + + default { + _side = sideLogic; + } +}; + +if (_side isEqualTo sideLogic) then { + ERROR("Module has side logic for some fucking reason.") +}; + +//Set flag texure, if given texture exist +if (fileExists _flagTexture) then { + _flag setFlagTexture _flagTexture; +}; + +//Start timer for this side +[{ ADDON }, { + [_this] call FUNC(timer); +}, _side] call CBA_fnc_waitUntilAndExecute; + + +private _values = GVAR(flagPoles) get _side; +_values set [1, _flag]; +GVAR(flagPoles) set [_side, _values]; +publicVariable QGVAR(flagPoles); + +GVAR(waitingArea) set [_side, [_markername, _logic, _pos]]; +publicVariable QGVAR(waitingArea); +// Module function is executed by spawn command, so returned value is not necessary, but it's good practice. +true \ No newline at end of file From 528d935f7b1c110dc88876633e5cfa8ef94f06c1 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 23 May 2024 22:52:37 +0300 Subject: [PATCH 084/228] renaming fnc and fix typos --- addons/msp/XEH_PREP.hpp | 3 +++ addons/msp/XEH_postInit_client.sqf | 6 ++++-- addons/msp/XEH_postInit_server.sqf | 3 +-- addons/msp/XEH_preInit.sqf | 3 ++- addons/msp/eh list.txt | 2 +- addons/msp/functions/fnc_startUpdateDeployementStatus.sqf | 6 +++--- addons/respawn/XEH_postInit_client.sqf | 8 +++++--- addons/respawn/functions/fnc_openTeleportMenu.sqf | 2 +- addons/respawn/functions/fnc_updateRespawnPoint.sqf | 6 +++--- 9 files changed, 23 insertions(+), 16 deletions(-) diff --git a/addons/msp/XEH_PREP.hpp b/addons/msp/XEH_PREP.hpp index b5b60f5..de6dccf 100644 --- a/addons/msp/XEH_PREP.hpp +++ b/addons/msp/XEH_PREP.hpp @@ -1,9 +1,12 @@ PREP(addAceActions); PREP(addEventHandlers); PREP(briefingNotes); +PREP(checkContestZoneArea); +PREP(checkContestZoneMarkersBriefing); PREP(contestedCheck); PREP(createContestZoneMarkers); PREP(createMspProps); +PREP(deleteContestZoneMarkers); PREP(startContestedChecks); PREP(startUpdateDeployementStatus); PREP(updateDeployementStatus); diff --git a/addons/msp/XEH_postInit_client.sqf b/addons/msp/XEH_postInit_client.sqf index 2f42d0d..de00a81 100644 --- a/addons/msp/XEH_postInit_client.sqf +++ b/addons/msp/XEH_postInit_client.sqf @@ -3,6 +3,8 @@ [{!isNull player && ADDON }, { - [] call FUNC(briefingNotes); - [] call FUNC(addAceActions); + if (GVAR(enable)) then { + [] call FUNC(briefingNotes); + [] call FUNC(addAceActions); + }; }] call CBA_fnc_waitUntilAndExecute; \ No newline at end of file diff --git a/addons/msp/XEH_postInit_server.sqf b/addons/msp/XEH_postInit_server.sqf index 6eccf9d..84f2529 100644 --- a/addons/msp/XEH_postInit_server.sqf +++ b/addons/msp/XEH_postInit_server.sqf @@ -1,2 +1 @@ -#include "script_component.hpp" - +#include "script_component.hpp" \ No newline at end of file diff --git a/addons/msp/XEH_preInit.sqf b/addons/msp/XEH_preInit.sqf index 73b16c1..6c4baed 100644 --- a/addons/msp/XEH_preInit.sqf +++ b/addons/msp/XEH_preInit.sqf @@ -12,6 +12,7 @@ GVAR(classnames) = createHashMap; GVAR(contestValues) = createHashMapFromArray [[west,[0,0,0,0,0,false]],[east,[0,0,0,0,0,false]],[resistance,[0,0,0,0,0,false]],[civilian,[0,0,0,0,0,false]]]; GVAR(contestHandles) = createHashMap; GVAR(contestCheckRunning) = createHashMapFromArray [[west,false],[east,false],[resistance,false],[civilian,false]]; + [ QGVAR(enable), "CHECKBOX", @@ -461,7 +462,7 @@ GVAR(contestCheckRunning) = createHashMapFromArray [[west,false],[east,false],[r [ QGVAR(progresbarTimeSetup), "SLIDER", - [localize "STR_tunres_MSP_CBA_setup_progresbar", localize "STR_tunres_MSP_CBA_tooltip_setup_progresbar"], + [localize "STR_tunres_MSP_CBA_setup_progresbar", localize "STR_tunres_MSP_CBA_tooltip_setup_ProgressBar"], [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_progres"], [0, 60, 5, 0], 1, diff --git a/addons/msp/eh list.txt b/addons/msp/eh list.txt index 532c020..039a15e 100644 --- a/addons/msp/eh list.txt +++ b/addons/msp/eh list.txt @@ -1,3 +1,3 @@ EH Name | locality | params -tunres_msp_EH_contestedUpdate - global - Side, NewStatus, OldStatus, enemyCount, enemyCountMin, FriendlyCount, Was MSP setup +tunres_msp_EH_contestedUpdate - global - Side, NewStatus, OldStatus, enemyCount, enemyCountMin, FriendlyCount tunres_msp_EH_mspStatusUpdate - global - MSP , True: Setup MSP. False: Pack MSP \ No newline at end of file diff --git a/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf index 1e89e54..8616d47 100644 --- a/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf @@ -19,12 +19,13 @@ params ["_target", "_setup"]; private ["_text", "_time", "_conditio"]; if (_setup) then { - [_target] call FUNC(createContestZoneMarkers); + [_target] call FUNC(checkContestZoneArea); _text = localize "STR_tunres_MSP_fnc_startUpdateDeployementStatus_setting"; _conditio = { private _msp = (_args select 0); driver _msp isEqualTo player && alive _msp && + insideBuilding player isEqualTo 0 && !(GVAR(deployementStatus) get playerSide) }; _time = GVAR(progresbarTimeSetup); @@ -32,7 +33,6 @@ if (_setup) then { _text = localize "STR_tunres_MSP_fnc_startUpdateDeployementStatus_packing"; _conditio = { private _msp = (_args select 0); - driver _msp isEqualTo player && alive _msp && (GVAR(deployementStatus) get playerSide) }; @@ -44,4 +44,4 @@ private _code = { openMap false; }; -[_time, [_target, _setup], _code, {hint "Aborted!";}, _text, _conditio, ["notOnMap","isnotinside"]] call ace_common_fnc_progressBar; \ No newline at end of file +[_time, [_target, _setup], _code, {(localize "STR_tunres_MSP_DeployementAborted") call CBA_fnc_notify}, _text, _conditio, ["notOnMap","isnotinside"]] call ace_common_fnc_progressBar; \ No newline at end of file diff --git a/addons/respawn/XEH_postInit_client.sqf b/addons/respawn/XEH_postInit_client.sqf index 79c46d6..5821f2d 100644 --- a/addons/respawn/XEH_postInit_client.sqf +++ b/addons/respawn/XEH_postInit_client.sqf @@ -3,7 +3,9 @@ [{!isNull player && ADDON }, { - [] call FUNC(briefingNotes); + if (GVAR(enable)) then { + [] call FUNC(briefingNotes); + }; }] call CBA_fnc_waitUntilAndExecute; if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (IE zeus) @@ -48,9 +50,9 @@ if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (I addMissionEventHandler ["Map", { params ["_mapIsOpened", "_mapIsForced"]; - [] call FUNC(marker_update); + [] call FUNC(updateRespawnMarkers); }]; [] call FUNC(killJIP); -[] call FUNC(marker_update); +[] call FUNC(updateRespawnMarkers); [] call FUNC(radioSettings_tfar); diff --git a/addons/respawn/functions/fnc_openTeleportMenu.sqf b/addons/respawn/functions/fnc_openTeleportMenu.sqf index dfea2e0..d57bcdd 100644 --- a/addons/respawn/functions/fnc_openTeleportMenu.sqf +++ b/addons/respawn/functions/fnc_openTeleportMenu.sqf @@ -15,7 +15,7 @@ params ["_target"]; createDialog "TP_Dialog"; -[] call FUNC(marker_update); +[] call FUNC(updateRespawnMarkers); private _listIDC = 300001; diff --git a/addons/respawn/functions/fnc_updateRespawnPoint.sqf b/addons/respawn/functions/fnc_updateRespawnPoint.sqf index 4e03cf2..2843852 100644 --- a/addons/respawn/functions/fnc_updateRespawnPoint.sqf +++ b/addons/respawn/functions/fnc_updateRespawnPoint.sqf @@ -4,7 +4,7 @@ * * Arguments: * 0: Side - * 1: False: Rertur to original pos. True: Update to new given pos (default: false) + * 1: False: Return to original pos. True: Update to new given pos (default: false) * 2: New position (default: [0,0,0]) * * Return Value: @@ -30,5 +30,5 @@ if (_newPos isEqualTo [0,0,0] || !_update) then { _marker setMarkerPos _newPos; -//Forsce players to update markers -[] remoteExecCall [QFUNC(marker_update), -2, false]; \ No newline at end of file +//Force players to update markers +[] remoteExecCall [QFUNC(updateRespawnMarkers), _side, false]; \ No newline at end of file From 3b9c6ac411fae1c4b88fb4fc455e2502dfe1909e Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 23 May 2024 22:53:06 +0300 Subject: [PATCH 085/228] marker name macro --- addons/main/script_macros.hpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 6de0f89..9e3cf7c 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -8,6 +8,14 @@ #define PREP(fncName) [QPATHTOF(functions\DOUBLES(fnc,fncName).sqf), QFUNC(fncName)] call CBA_fnc_compileFunction #endif +// +#define MARKER_NAME_CONFIG(var1) QUOTE(DOUBLES(ADDON,var1)) +#define MARKER_NAME(var1) FORMAT_2("%1_%2",QUOTE(ADDON),var1) + +//AAR enabled check +#define AAR_IS_ENABLED !isnil "afi_aar2" //AAR update macro -#define AAR_UPDATE(OBJ,VARNAME,VALUE) if ( !isnil "afi_aar2" ) then { [OBJ, VARNAME, VALUE] call afi_aar2_fnc_addcustomdata; }; \ No newline at end of file +#define AAR_UPDATE(OBJ,VARNAME,VALUE) if ( AAR_IS_ENABLED ) then { [OBJ, VARNAME, VALUE] call afi_aar2_fnc_addcustomdata; } +//AAR event +#define AAR_EVENT(TEXT,INSTIGATOR,TARGET,POI) if ( AAR_IS_ENABLED ) then { if (isServer) then { [TEXT,INSTIGATOR,TARGET,POI] call afi_aar2_fnc_addCustomEvent;} else {[TEXT,INSTIGATOR,TARGET,POI] remoteExecCall ["afi_aar2_fnc_addCustomEvent", 2]} }; From caf0ec7e4d94cb559baa49f2735f2db53b6e18e3 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 23 May 2024 22:54:25 +0300 Subject: [PATCH 086/228] AAR Events --- addons/msp/functions/fnc_contestedCheck.sqf | 15 ++++++++++----- .../msp/functions/fnc_updateDeployementStatus.sqf | 14 +++++++------- addons/respawn/functions/fnc_doRespawnWave.sqf | 9 ++++++++- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index 28bd9fe..1eaa68e 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -10,11 +10,10 @@ * Example: * [] call tunres_MSP_fnc_contestedCheck */ -// private _result = diag_codePerformance [{ #include "script_component.hpp" -params[["_side", nil,[west]],["_mspSetup", false]]; +params[["_side", nil,[west]]]; -if (!isServer) then {}; +if (!isServer) exitWith {}; private _oldAllowRespawnStatus = GVAR(allowRespawn) get _side; GVAR(allowRespawn) set [_side, false]; @@ -55,17 +54,23 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { if (_enemiesInAreaMin > 0 || _enemiesInArea > _friendliesInArea) then { _isContested = true; }; + AAR_UPDATE(_msp,"Enemy Count",_enemiesInArea); AAR_UPDATE(_msp,"Enemy Count Min",_enemiesInAreaMin); AAR_UPDATE(_msp,"Friendly Count",_friendliesInArea); AAR_UPDATE(_msp,"Is contested",_isContested); private _oldContestedStatus = GVAR(contestedStatus) get _side; + if (_oldContestedStatus isNotEqualTo _isContested) then { + + AAR_EVENT(FORMAT_1(localize ARG_1(ARR_2(["STR_tunres_MSP_AAR_MSP_notContested","STR_tunres_MSP_AAR_MSP_isContested"]),_isContested),str _side),_msp,nil,nil); AAR_UPDATE(_msp,"Is contested",_isContested); + GVAR(contestedStatus) set [_side, _isContested]; publicVariable QGVAR(contestedStatus); _msp setVariable [QGVAR(isContested), _isContested, true]; + private _whoToNotify = [_side, GVAR(contestedNotification)] call FUNC(whoToNotify); if (_whoToNotify isNotEqualTo [] ) then { if (_isContested) then { @@ -77,8 +82,8 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { }; }; }; - [QGVAR(EH_mspStatusUpdate), [_side, _isContested, _oldContestedStatus, _enemiesInArea, _enemiesInAreaMin, _friendliesInArea, _mspSetup]] call CBA_fnc_globalEvent; - private _debugText = format ["Contested summary. Side: %1, NewStatus: %2, OldStatus: %3, enemyCount: %4, enemyCountMin: %5, FriendlyCount: %6, Was MSP setup: %7",_side, _isContested, _oldContestedStatus, _enemiesInArea, _enemiesInAreaMin, _friendliesInArea, _mspSetup]; + [QGVAR(EH_mspStatusUpdate), [_side, _isContested, _oldContestedStatus, _enemiesInArea, _enemiesInAreaMin, _friendliesInArea]] call CBA_fnc_globalEvent; + private _debugText = format ["Contested summary. Side: %1, NewStatus: %2, OldStatus: %3, enemyCount: %4, enemyCountMin: %5, FriendlyCount: %6",_side, _isContested, _oldContestedStatus, _enemiesInArea, _enemiesInAreaMin, _friendliesInArea]; LOG(_debugText); } else { if (_mspDeployementStatus) then { diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index aa57f3d..46b74d4 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -52,7 +52,7 @@ if (_setup) then { //Unlock vehicle [_msp, 0] remoteExecCall ["lock", _msp]; - _msp = objNull; + }; private _pos = getpos _msp; @@ -62,16 +62,16 @@ private _pos = getpos _msp; _msp setVariable [QGVAR(isMSP), _setup, true]; GVAR(deployementStatus) set [_side, _setup]; publicVariable QGVAR(deployementStatus); -GVAR(activeVehicle) set [_side, _msp]; +GVAR(activeVehicle) set [_side, [objNull, _msp] select _setup]; publicVariable QGVAR(activeVehicle); -if (_setup) then { - [_side, true] remoteExecCall [QFUNC(contestedCheck), 2]; - [_side, true] remoteExecCall [QFUNC(startContestedChecks), 2]; -} else { +AAR_EVENT(FORMAT_1(localize ARG_1((ARR_2(["STR_tunres_MSP_AAR_MSP_Packed","STR_tunres_MSP_AAR_MSP_Deployed"])),_setup),str _side),_msp,player,nil); + +//Change deployement status +if !(_setup) then { GVAR(contestedStatus) set [_side, false]; publicVariable QGVAR(contestedStatus); - [_side, false] remoteExecCall [QFUNC(startContestedChecks), 2]; }; +[_side, _setup] remoteExecCall [QFUNC(startContestedChecks), 2]; [QGVAR(EH_mspStatusUpdate), [_msp, _setup]] call CBA_fnc_globalEvent; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_doRespawnWave.sqf b/addons/respawn/functions/fnc_doRespawnWave.sqf index 68f264d..71f550e 100644 --- a/addons/respawn/functions/fnc_doRespawnWave.sqf +++ b/addons/respawn/functions/fnc_doRespawnWave.sqf @@ -87,8 +87,15 @@ if (count _waitingRespawn > 0) then { private _debugText = format ["Side %1 all respawn units moved. Respawned: %2. Total count is: %3", _side, _waitingRespawnCount, _totalRespawnCount]; INFO(_debugText); - + [QGVAR(EH_respawnWave), [_side, _waitingRespawn]] call CBA_fnc_serverEvent; + + if (GVAR(respawnType) isEqualTo 1) then { + AAR_EVENT(FORMAT_4(localize "STR_tunres_Respawn_AAR_RespawnWaveTickets",str _side,_waitingRespawnCount,_totalRespawnCount,[_side] call FUNC(getTicketCount)),_msp,nil,nil); + } else { + AAR_EVENT(FORMAT_3(localize "STR_tunres_Respawn_AAR_RespawnWave",str _side,_waitingRespawnCount,_totalRespawnCount),_msp,nil,nil); + }; + } else { //No one at respawn if (count _waitingRespawnDelayed > 0) then { From 5a556633834d22347238ccf4d746fdc3cd50d42e Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 23 May 2024 22:54:48 +0300 Subject: [PATCH 087/228] add ace action to check contest status --- addons/msp/functions/fnc_addAceActions.sqf | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/addons/msp/functions/fnc_addAceActions.sqf b/addons/msp/functions/fnc_addAceActions.sqf index 5e1aa50..9c1961d 100644 --- a/addons/msp/functions/fnc_addAceActions.sqf +++ b/addons/msp/functions/fnc_addAceActions.sqf @@ -41,20 +41,24 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { private _chekTime = ["Check Respawn Time", "Check Respawn Time", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", EFUNC(respawn,remainingWaitTimeNotification), _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; //Check contest area - private _checkArea = ["Check contest area", "Check contest area", "a3\ui_f\data\igui\cfg\simpletasks\types\map_ca.paa", {[_target] call FUNC(createContestZoneMarkers);}, _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; + private _checkArea = ["Check contest area", "Check contest area", "a3\ui_f\data\igui\cfg\simpletasks\types\map_ca.paa", {[_target] call FUNC(checkContestZoneArea);}, _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; + + //Check if contested + private _checkContest= ["Check if MSP contested", "Check if MSP contested", "", {format[localize "STR_tunres_MSP_checkIfMSPContested", _target getVariable [QGVAR(isContested), false]] call cba_fnc_notify}, _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; //Ace inteaction [_vehicle, 1, ["ACE_SelfActions"], _createMSP] call ace_interact_menu_fnc_addActionToClass; [_vehicle, 0, ["ACE_MainActions","tunres_respawnAction"], _removeMSP] call ace_interact_menu_fnc_addActionToClass; [_vehicle, 0, ["ACE_MainActions","tunres_respawnAction"], _chekTime] call ace_interact_menu_fnc_addActionToClass; [_vehicle, 0, ["ACE_MainActions","tunres_respawnAction"], _checkArea] call ace_interact_menu_fnc_addActionToClass; + [_vehicle, 0, ["ACE_MainActions","tunres_respawnAction"], _checkContest] call ace_interact_menu_fnc_addActionToClass; //TP. I hate this system already. [_vehicle, "InitPost", { params ["_entity"]; - private _menu_condition = "alive _target && {_target getVariable ['tunres_msp_isMSP', false]} && {!(_target getVariable ['tunres_msp_isContested', false])}"; - private _tp_conditionText = " private _msp = "+ QGVAR(activeVehicle) +"get playerSide; private _status = _msp getVariable ['tunres_msp_isContested', false]; (_target isNotEqualTo _msp && _obj getVariable ['tunres_msp_isMSP', false] && !_status) "; + private _menu_condition = "alive _target && {_target getVariable [ '"+ QGVAR(isMSP) +"' , false]} && {!(_target getVariable ['tunres_msp_isContested', false])}"; + private _tp_conditionText = " private _msp = "+ QGVAR(activeVehicle) +" get playerSide; private _status = _msp getVariable ['tunres_msp_isContested', false]; (_target isNotEqualTo _msp && _obj getVariable [ '"+ QGVAR(isMSP) +"' , false] && !_status) "; [_entity, _tp_conditionText, localize "STR_tunres_MSP_TpText", false, nil, [playerSide], true, _menu_condition, false, ["ACE_MainActions","tunres_respawnAction"]] call EFUNC(respawn,addCustomTeleporter); From 929b9548303d9e493d262c51b785b12a9ac4147f Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 23 May 2024 22:55:08 +0300 Subject: [PATCH 088/228] contest area check create marker fnc --- .../functions/fnc_createLocalMarker.sqf | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/addons/respawn/functions/fnc_createLocalMarker.sqf b/addons/respawn/functions/fnc_createLocalMarker.sqf index 69236e6..d8806bf 100644 --- a/addons/respawn/functions/fnc_createLocalMarker.sqf +++ b/addons/respawn/functions/fnc_createLocalMarker.sqf @@ -7,26 +7,47 @@ * 0: Marker name * 1: Position * 2: Marker text - * 3: Icon + * 3: Icon/brush https://community.bistudio.com/wiki/setMarkerBrushLocal https://community.bistudio.com/wiki/setMarkerTypeLocal * 4: Color * 5: Alpha + * 6: Priority + * 7: Shape (Default: "ICON") "ICON", "RECTANGLE", "ELLIPSE", "POLYLINE" + * 8: Size [a-axis, b-axis] + * 9: Direction * * Return Value: * * Example: - * ["RespawnPosLocal", _pos, "Respawn", "respawn_inf", _color, 1] call tunres_Respawn_fnc_createLocalMarker + * [QGVAR(RespawnPosLocal), _pos, "Respawn", "respawn_inf", _color, 1] call tunres_Respawn_fnc_createLocalMarker */ #include "script_component.hpp" params [["_name", nil, [""]], ["_pos", nil, [[]]], ["_text", nil, [""]], - ["_icon", nil, [""]], - ["_color", nil, [""]], - ["_alpha", 0, [0]]]; + ["_icon", nil, [""]], + ["_color", "Default", [""]], + ["_alpha", 0, [0]], + ["_priority", 0, [0]], + ["_shape", "ICON", [""]], + ["_size", [1,1], [[]], 2], + ["_dir", 0, [0]]]; + if (!hasInterface) exitWith {}; private _marker = createMarkerLocal [_name, _pos]; -_marker setMarkerTextLocal _text; +_marker setMarkerShapeLocal _shape; + +if (toLower _shape isEqualTo "icon") then { + _marker setMarkerTypeLocal _icon; + _marker setMarkerTextLocal _text; +} else { + _marker setMarkerBrushLocal _icon; +}; + +_marker setMarkerSizeLocal _size; +_marker setMarkerDirLocal _dir; _marker setMarkerColorLocal _color; -_marker setMarkerTypeLocal _icon; -_marker setMarkerAlphaLocal _alpha; \ No newline at end of file +_marker setMarkerAlphaLocal _alpha; +_marker setMarkerDrawPriority _priority; + +_marker \ No newline at end of file From ba827059956155c22e728364f5b8201cad240abd Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 23 May 2024 22:55:38 +0300 Subject: [PATCH 089/228] Use marker name macro --- addons/respawn/functions/fnc_addCustomTeleporter.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/respawn/functions/fnc_addCustomTeleporter.sqf b/addons/respawn/functions/fnc_addCustomTeleporter.sqf index 3e9322a..b12ce0a 100644 --- a/addons/respawn/functions/fnc_addCustomTeleporter.sqf +++ b/addons/respawn/functions/fnc_addCustomTeleporter.sqf @@ -45,8 +45,8 @@ GVAR(teleportPoints) pushBackUnique _obj; if (_createMarker) then { - private _markerName = format["tunres_respawn_%1",_name]; - private _marker = [_markerName, getpos _obj, "ICON", [1, 1], "TYPE:", _markerIcon, "TEXT:", _name] call CBA_fnc_createMarker; + private _markerName = MARKER_NAME(_name); + private _marker = [_markerName, getpos _obj, _name, _markerIcon, nil, 1, 100] call FUNC(createLocalMarker); _obj setVariable [QGVAR(markerName), _marker]; }; From f7744f15498c02bf7e1009699a71d0a250cf2dc0 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 23 May 2024 22:55:53 +0300 Subject: [PATCH 090/228] Add flag pole hash --- addons/respawn/XEH_preInit.sqf | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index dc6ceff..2d1aa97 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -5,7 +5,7 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; -private _waitingRespawnEmptyArray= [[west,[]],[east,[]],[resistance,[]],[civilian,[]]]; +private _waitingRespawnEmptyArray = [[west,[]],[east,[]],[resistance,[]],[civilian,[]]]; private _waitTimesPreArray = [[west,0],[east,0],[resistance,0],[civilian,0]]; private _emptyFalseArray = [[west,false],[east,false],[resistance,false],[civilian,false]]; private _emptyTrueArray = [[west,true],[east,true],[resistance,true],[civilian,true]]; @@ -46,10 +46,14 @@ GVAR(allowedSpectateSidesEast) = [east]; GVAR(allowedSpectateSidesResistance) = [resistance]; GVAR(allowedSpectateSidesCivilian) = [civilian]; -ISNILS(GVAR(endRespawns),false); +//flag poles [mainbase,waitingrea] +GVAR(flagPoles) = createHashMapFromArray [[west,[objNull,objNull]],[east,[objNull,objNull]],[resistance,[objNull,objNull]],[civilian,[objNull,objNull]]]; + +ISNILS(GVAR(endRespawns),false); GVAR(selfTPmenuOpenObj) = objNull; + [ QGVAR(enable), // Unique setting name. Matches resulting variable name "CHECKBOX", // Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" From a20ce5ee00c3159bc4bc6001f69502f107104839 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 23 May 2024 22:56:02 +0300 Subject: [PATCH 091/228] fix module names --- addons/respawn/config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/respawn/config.cpp b/addons/respawn/config.cpp index d451f64..7e70f03 100644 --- a/addons/respawn/config.cpp +++ b/addons/respawn/config.cpp @@ -4,7 +4,7 @@ class CfgPatches { class ADDON { name = COMPONENT_NAME; - units[] = {QGVAR(Module_waitingarea), QGVAR(Module_Respawn_point), QGVAR(tunres_Respawn_Module_teleportPoint)}; + units[] = {QGVAR(moduleWaitingArea), QGVAR(moduleRespawnPoint), QGVAR(moduleTeleportPoint)}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"tunres_main","A3_Modules_F","3DEN","ace_interaction","ace_interact_menu"}; From b5f484c82100901ce72400e5f475faffa283151d Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 23 May 2024 22:57:19 +0300 Subject: [PATCH 092/228] Module additions - Fix module names. - Use marker name macro - Add custom flag texture option --- addons/respawn/CfgVehicles.hpp | 46 ++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/addons/respawn/CfgVehicles.hpp b/addons/respawn/CfgVehicles.hpp index 4015fb3..dc100f7 100644 --- a/addons/respawn/CfgVehicles.hpp +++ b/addons/respawn/CfgVehicles.hpp @@ -20,7 +20,7 @@ class CfgVehicles }; }; - class GVAR(Module_waitingarea): Module_F + class GVAR(moduleWaitingArea): Module_F { scope = 2; // Editor visibility; 2 will show it in the menu, 1 will hide it. scopeCurator = 1; @@ -29,7 +29,7 @@ class CfgVehicles category = "tunres_Respawn"; // Name of function triggered once conditions are met - function = QFUNC(module_waitingarea); + function = QFUNC(moduleWaitingArea); // Execution priority, modules with lower number are executed first. 0 is used when the attribute is undefined functionPriority = 10; // 0 for server only execution, 1 for global execution, 2 for persistent global execution @@ -46,7 +46,7 @@ class CfgVehicles { class respawn_side: Combo { - property = QGVAR(module_waiting_area_side); + property = QGVAR(module_side); displayName = "Side"; // Argument label tooltip = "$STR_tunres_Respawn_Module_tooltip_WaitingArea"; // Tooltip description typeName = "STRING"; // Value type, can be "NUMBER", "STRING" or "BOOL" @@ -60,6 +60,16 @@ class CfgVehicles class civilian {name = "civilian"; value = "respawn_civilian";}; }; }; + class flag_texture: Edit + { + property = QGVAR(flag_texture); + displayName = "Flag texture"; + tooltip = "$STR_tunres_Respawn_Module_tooltip_flagTexture"; + typeName = "STRING"; + // Default text filled in the input box + // Because it is an expression, to return a String one must have a string within a string + defaultValue = """"""; + }; class ModuleDescription: ModuleDescription{}; }; class ModuleDescription: ModuleDescription @@ -69,18 +79,18 @@ class CfgVehicles }; }; - class GVAR(Module_Respawn_point): GVAR(Module_waitingarea) + class GVAR(moduleRespawnPoint): GVAR(moduleWaitingArea) { displayName = "$STR_tunres_Respawn_Module_DisplayName_SpawnPoint"; // Name displayed in the menu icon = "\a3\modules_f\data\portraitrespawn_ca.paa"; // Name of function triggered once conditions are met - function = QFUNC(module_respawnpos); + function = QFUNC(moduleRespawnPoint); class Attributes: AttributesBase { class respawn_side: Combo { - property = QGVAR(module_respawn_point_side); + property = QGVAR(module_side); displayName = "Side"; // Argument label tooltip = "$STR_tunres_Respawn_Module_tooltip_SpawnPoint"; // Tooltip description typeName = "STRING"; // Value type, can be "NUMBER", "STRING" or "BOOL" @@ -88,12 +98,22 @@ class CfgVehicles class Values { class none {name = "none"; value = "none";}; // Listbox item - class west {name = "west"; value = "tunres_respawn_west";}; - class east {name = "east"; value = "tunres_respawn_east";}; - class resistance {name = "resistance"; value = "tunres_respawn_guerrila";}; - class civilian {name = "civilian"; value = "tunres_respawn_civilian";}; + class west {name = "west"; value = MARKER_NAME_CONFIG(west);}; + class east {name = "east"; value = MARKER_NAME_CONFIG(east);}; + class resistance {name = "resistance"; value = MARKER_NAME_CONFIG(resistance);}; + class civilian {name = "civilian"; value = MARKER_NAME_CONFIG(civilian);}; }; }; + class flag_texture: Edit + { + property = QGVAR(flag_texture); + displayName = "Flag texture"; + tooltip = "$STR_tunres_Respawn_Module_tooltip_flagTexture"; + typeName = "STRING"; + // Default text filled in the input box + // Because it is an expression, to return a String one must have a string within a string + defaultValue = """"""; + }; class ModuleDescription: ModuleDescription{}; }; class ModuleDescription: ModuleDescription @@ -103,7 +123,7 @@ class CfgVehicles }; }; - class GVAR(tunres_Respawn_Module_teleportPoint): GVAR(Module_waitingarea) + class GVAR(moduleTeleportPoint): GVAR(moduleWaitingArea) { displayName = "$STR_tunres_Respawn_Module_DisplayName_teleportPoint"; // Name displayed in the menu // 0 for server only execution, 1 for global execution, 2 for persistent global execution @@ -111,7 +131,7 @@ class CfgVehicles // 1 for module waiting until all synced triggers are activated //isTriggerActivated = 1; // Name of function triggered once conditions are met - function = QFUNC(module_teleporter); + function = QFUNC(moduleTeleport); icon = "\a3\ui_f\data\map\groupicons\badge_gs.paa"; class Attributes: AttributesBase @@ -194,7 +214,7 @@ class CfgVehicles displayName = "Allow Check Tickets"; typeName = "BOOL"; //tooltip = $STR_tunres_Respawn_Module_tooltip_teleportCreateMarker; - defaultValue = "true"; + defaultValue = "false"; }; class GVAR(teleportEnableWest): Checkbox From 9449ee2d3cf9e1b67b0c721adeedb2b716f4edca Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 23 May 2024 22:57:28 +0300 Subject: [PATCH 093/228] fix variables --- addons/msp/functions/fnc_startContestedChecks.sqf | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/addons/msp/functions/fnc_startContestedChecks.sqf b/addons/msp/functions/fnc_startContestedChecks.sqf index 5ebc7b9..e055435 100644 --- a/addons/msp/functions/fnc_startContestedChecks.sqf +++ b/addons/msp/functions/fnc_startContestedChecks.sqf @@ -29,20 +29,22 @@ if (_start) then { private _reportEnemiesEnabled = _values param [5]; private _handleContest = [{ + params["_side"]; if !(GVAR(disableContestedCheck)) then { private _mspDeployementStatus = GVAR(deployementStatus) get _side; if (_mspDeployementStatus) then { - [_args] call FUNC(contestedCheck); + [_side] call FUNC(contestedCheck); } else { ERROR("Tried to run contested check, while msp was not deployed!!"); }; }; - }, _contestedCheckInterval, [_side]] call CBA_fnc_addPerFrameHandler; + }, _contestedCheckInterval, _side] call CBA_fnc_addPerFrameHandler; //Report enemies loop thing private _handleReport = nil; if (_reportEnemiesEnabled) then { _handleReport = [{ + params["_side"]; //So that this does not run, when contest update is offline if !(GVAR(disableContestedCheck)) then { private _side = _args; @@ -61,7 +63,7 @@ if (_start) then { ERROR("Tried to run report enemies, while msp was not deployed!!"); }; }; - }, _reportEnemiesInterval, [_side]] call CBA_fnc_addPerFrameHandler; + }, _reportEnemiesInterval, _side] call CBA_fnc_addPerFrameHandler; }; GVAR(contestHandles) set [_side,[_handleContest,_handleReport]]; } else { @@ -72,8 +74,9 @@ if (_start) then { private _values = GVAR(contestHandles) get _side; { - if (!isNil _x) then { - [_x] call CBA_fnc_removePerFrameHandler; + private _handle = _x; + if (!isNil {_handle}) then { + [_handle] call CBA_fnc_removePerFrameHandler; }; } forEach _values; }; From acb426cc98286f2d36a92a2964891ef93f16825c Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 13 Jun 2024 22:16:23 +0300 Subject: [PATCH 094/228] Clean stringtable & briefing --- addons/main/Stringtable.xml | 380 +++++++++++------- addons/msp/functions/fnc_briefingNotes.sqf | 28 +- .../respawn/functions/fnc_briefingNotes.sqf | 40 +- 3 files changed, 259 insertions(+), 189 deletions(-) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index 8fead5c..0ab1c07 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -3,8 +3,8 @@ - Time between respawn waves (minutes) - Time between respawn waves (minutes) + Respawn wave interval (minutes) + Respawn wave interval (minutes) Time after JIP are killed and moved to respawn (minutes) @@ -15,20 +15,20 @@ Enable kill JIP system - Ticket count for either for whole side or each player in that side. - Ticket count for either for whole side or each player in that side. + Ticket count for either the entire side or each player on that side + Ticket count for either the entire side or each player on that side - "SQF Gearscript": Needs two variables set "tunres_Respawn_Role" which works as parameter and "tunres_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using tunres_Respawn_fnc_savegear function. None: No gearscripts run. People will spawn witouth any gear, use eventhandler "tunres_respawn_EH_unitRespawned " to give your gears. - "SQF Gearscript": Needs two variables set "tunres_Respawn_Role" which works as parameter and "tunres_Respawn_GearPath" which is filepath. "Potato Tool": just calls its own function "Save gear": Load same loadout which is saved at mission start or it can be updated during mission using tunres_Respawn_fnc_savegear function. None: No gearscripts run. People will spawn witouth any gear, use eventhandler "tunres_respawn_EH_unitRespawned " to give your gears. + "SQF Gearscript": Requires two variables to be set: "tunres_Respawn_Role," which serves as a parameter, and "tunres_Respawn_GearPath," which denotes the file path. "Potato Tool": Simply invokes its own function. "Save gear": Loads the same loadout saved at mission start, or it can be updated during the mission using the "tunres_Respawn_fnc_savegear" function. None: No gear scripts are executed. Players will spawn without any gear. Utilize the event handler "tunres_respawn_EH_unitRespawned" to provide gear. + "SQF Gearscript": Requires two variables to be set: "tunres_Respawn_Role," which serves as a parameter, and "tunres_Respawn_GearPath," which denotes the file path. "Potato Tool": Simply invokes its own function. "Save gear": Loads the same loadout saved at mission start, or it can be updated during the mission using the "tunres_Respawn_fnc_savegear" function. None: No gear scripts are executed. Players will spawn without any gear. Utilize the event handler "tunres_respawn_EH_unitRespawned" to provide gear. - "Default" : Endless waves. "Side tickets": Side shares ticket pool. . "Player tickets": Each player has own ticket pool - "Default" : Endless waves. "Side tickets": Side shares ticket pool. . "Player tickets": Each player has own ticket pool + "Endless waves": Endless waves. "Side tickets": Side shares a ticket pool. Player tickets": Each player has their own ticket pool. + "Endless waves": Endless waves. "Side tickets": Side shares a ticket pool. Player tickets": Each player has their own ticket pool. - Enable this cameramode for spectators - Enable this cameramode for spectators + Enable this camera mode for spectators + Enable this camera mode for spectators TUN - Respawn System @@ -63,68 +63,68 @@ Enable Respawn System - Enable Respawn System for mission. - Enable Respawn System for mission. + Activate Respawn System for the mission. + Activate Respawn System for the mission. - Allow checking remaining tickets from this place - Allow checking remaining tickets from this place + Enable checking remaining tickets from this location. + Enable checking remaining tickets from this location. - Only forced respawn waves. No timer! - Only forced respawn waves. No timer! + Only forced respawn waves. No timer involved. + Only forced respawn waves. No timer involved. - If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. - If remaining respawn time is less than percent specified here, player skips the next wave. Ie. if wave interval is 20min and this is set to 50% and player dies after there is less than 10 minutes remaining until next respawn, player will skip the next wave and needs to wait for the following one. 0 = Disabled. + If the remaining respawn time is less than the specified percentage here, the player will skip the next wave. For example, if the wave interval is 20 minutes and this is set to 50%, and a player dies when there are less than 10 minutes remaining until the next respawn, the player will skip the next wave and needs to wait for the following one. Set to 0 to disable this feature. + If the remaining respawn time is less than the specified percentage here, the player will skip the next wave. For example, if the wave interval is 20 minutes and this is set to 50%, and a player dies when there are less than 10 minutes remaining until the next respawn, the player will skip the next wave and needs to wait for the following one. Set to 0 to disable this feature. - Range for waitingarea. Default 100m - Range for waitingarea. Default 100m + Range for Waiting Area. Default is 100m. + Range for Waiting Area. Default is 100m. - Your remaining tickets: - Your remaining tickets: + Remaining Tickets: + Remaining Tickets: Remaining tickets for your side: Remaining tickets for your side: - You are respawning! Standby. - You are respawning! Standby. + You are respawning! Please standby. + You are respawning! Please standby. - Contested settings West - Contested settings West + Contested settings for the West + Spectator allowed sides for West - Contested settings East - Contested settings East + Contested settings for the East + Contested settings for the East - Contested settings Resistance - Contested settings Resistance + Contested settings for the Resistance + Contested settings for the Resistance - Contested settings Civilian - Contested settings Civilian + Contested settings for the Civilian + Contested settings for the Civilian - Spectator allowed sides for west - Spectator allowed sides for west + Spectator allowed sides for West + Spectator allowed sides for West - Spectator allowed sides for east - Spectator allowed sides for east + Spectator allowed sides for East + Spectator allowed sides for East - Spectator allowed sides for resistance - Spectator allowed sides for resistance + Spectator allowed sides for Resistance + Spectator allowed sides for Resistance - Spectator allowed sides for civilian - Spectator allowed sides for civilian + Spectator allowed sides for Civilian + Spectator allowed sides for Civilian Allow this side to be spectated @@ -147,12 +147,12 @@ __%1__ MSP is no longer contested - Respawn wave for __%1__. %2 units respawned. Total respawn count is %3 - Respawn wave for __%1__. %2 units respawned. Total respawn count is %3 + Respawn wave for __%1__. %2 units respawned. Total respawn count is %3. + Respawn wave for __%1__. %2 units respawned. Total respawn count is %3. - Respawn wave for __%1__. %2 units respawned. Total respawn count is %3 and tickets left %4 - Respawn wave for __%1__. %2 units respawned. Total respawn count is %3 and tickets left %4 + Respawn wave for __%1__. %2 units respawned. Total respawn count is %3 and tickets left %4. + Respawn wave for __%1__. %2 units respawned. Total respawn count is %3 and tickets left %4. MSP deployement aborted! @@ -171,8 +171,80 @@ Main base - To use custom texture, give path to it in non string format. If left empty or invalid paht, uses default side color - To use custom texture, give path to it in non string format. If left empty or invalid paht, uses default side color + To use a custom texture, provide the path to it in a non-string format. If left empty or if an invalid path is given, the default side color will be used. + To use a custom texture, provide the path to it in a non-string format. If left empty or if an invalid path is given, the default side color will be used. + + + Enable contest area check. + Enable contest area check. + + + Disable contest area check. + Disable contest area check. + + + After enabling, you can click on the map during the briefing, and it will create contest area markers. + After enabling, you can click on the map during the briefing, and it will create contest area markers. + + + MSP check contest area + MSP check contest area + + + MSP settings + MSP settings + + + MSP info + MSP info + + + You can check remaining tickets from MSP using ACE actions. + You can check remaining tickets from MSP using ACE actions. + + + Ticket count: %2 (<font color="#004c99">West</font>) + Ticket count: %2 (<font color="#004c99">West</font>) + + + Ticket count: %2 (<font color="#7f0000">East</font>) + Ticket count: %2 (<font color="#7f0000">East</font>) + + + Ticket count: %2 (<font color="#007f00">Resistance</font>) + Ticket count: %2 (<font color="#007f00">Resistance</font>) + + + Ticket count: %2 (<font color="#66007f">Civilian</font>) + Ticket count: %2 (<font color="#66007f">Civilian</font>) + + + You can check remaining tickets from the main base (flagpole) using ACE actions. + You can check remaining tickets from the main base (flagpole) using ACE actions. + + + For <font color="#004c99">West</font> is %2min + For <font color="#004c99">West</font> is %2min + + + For <font color="#7f0000">East</font> is %2min + For <font color="#7f0000">East</font> is %2min + + + For <font color="#007f00">Resistance</font> is %2min + For <font color="#007f00">Resistance</font> is %2min + + + For <font color="#66007f">Civilian</font> is %2min + For <font color="#66007f">Civilian</font> is %2min + + + Tickets + Tickets + + + Respawn settings + Respawn settings @@ -211,8 +283,8 @@ Open teleportmenu - <t color='#FF0000'>Open teleportmenu</t> - <t color='#FF0000'>Open teleportmenu</t> + <t color='#FF0000'>Open teleport menu</t> + <t color='#FF0000'>Open teleport menu</t> Main Base @@ -221,28 +293,28 @@ - Put this module where you want respawn point to be for this side. - Put this module where you want respawn point to be for this side. + Place this module where you want the respawn point to be for this side. + Place this module where you want the respawn point to be for this side. Spawn Point Spawn Point - Choose side for this spawn point - Choose side for this spawn point + Choose the side for this spawn point + Choose the side for this spawn point Tun Respawn Tun Respawn - Respawn Position module do not have side set - Respawn Position module do not have side set + The Respawn Position module does not have a side set. + The Respawn Position module does not have a side set. - There is already "%1" marker. You either have multiple respawn point modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple respawn point modules with same settings or marker named that. Either way, remove it. + There is already a '%1' marker. You either have multiple respawn point modules with the same settings or a marker named that. Either way, please remove it. + There is already a '%1' marker. You either have multiple respawn point modules with the same settings or a marker named that. Either way, please remove it. @@ -255,58 +327,58 @@ Teleport network point. - Marker icon, must be in non string format. Default: hd_start - Marker icon, must be in non string format. Default: hd_start + Marker icon must be in a non-string format. Default: hd_start + Marker icon must be in a non-string format. Default: hd_start - Create marker for this teleport, for enabled sides. - Create marker for this teleport, for enabled sides. + Create a marker for this teleporter for the enabled sides. + Create a marker for this teleporter for the enabled sides. - When enabled, will use ace interaction. Otherwise will use addaction. - When enabled, will use ace interaction. Otherwise will use addaction. + When enabled, it will use ACE interaction. Otherwise, it will use addAction. + When enabled, it will use ACE interaction. Otherwise, it will use addAction. Name for teleport location Name for teleport location - Condition to enable/disable opening teleport menu. Must return true or flase. Default: true - Condition to enable/disable opening teleport menu. Must return true or flase. Default: true + Condition to enable/disable opening teleport menu. Must return true or false. Default: true + Condition to enable/disable opening teleport menu. Must return true or false. Default: true - Conditio to enable/disable TP location. (Code) Default: True - Conditio to enable/disable TP location. (Code) Default: True + Condition to enable/disable TP location. (Code) Default: True + Condition to enable/disable TP location. (Code) Default: True - Is this side allowed to use this teleportter. - Is this side allowed to use this teleportter. + Is this side allowed to use this teleporter? + Is this side allowed to use this teleporter? - Classname for object where action to teleport is. Non string format: Land_Sleeping_bag_blue_folded_F - Classname for object where action to teleport is. Non string format: Land_Sleeping_bag_blue_folded_F + Classname for the object where the action to teleport is. Non-string format: Land_Sleeping_bag_blue_folded_F + Classname for the object where the action to teleport is. Non-string format: Land_Sleeping_bag_blue_folded_F - There is already "%1" marker. You either have multiple Waiting Area modules with same settings or marker named that. Either way, remove it. - There is already "%1" marker. You either have multiple Waiting Area modules with same settings or marker named that. Either way, remove it. + There is already a '%1' marker. You either have multiple Waiting Area modules with the same settings or a marker named that. Please remove it. + There is already a '%1' marker. You either have multiple Waiting Area modules with the same settings or a marker named that. Please remove it. - Waiting area module do not have side set - Waiting area module do not have side set + The Waiting Area module does not have a side set + The Waiting Area module does not have a side set Waiting Area Waiting Area - Put this module where you want respawn waiting area to be for this side. - Put this module where you want respawn waiting area to be for this side. + Place this module where you want the respawn waiting area to be for this side. + Place this module where you want the respawn waiting area to be for this side. - Choose side for this waiting area - Choose side for this waiting area + Choose the side for this waiting area + Choose the side for this waiting area @@ -329,8 +401,8 @@ Enable briefing notes - Create briefing tab where all these settings are show. - Create briefing tab where all these settings are show. + Create a briefing tab displaying all these settings. + Create a briefing tab displaying all these settings. Show respawn type @@ -341,20 +413,20 @@ Show respawn wave time - When enabled, wave interval time will be shown in briefing notes. - When enabled, wave interval time will be shown in briefing notes. + When enabled, the wave interval time will be shown in the briefing notes. + When enabled, the wave interval time will be shown in the briefing notes. - When enabled, starting ticket count will be shown in briefing notes. - When enabled, starting ticket count will be shown in briefing notes. + When enabled, the starting ticket count will be shown in the briefing notes. + When enabled, the starting ticket count will be shown in the briefing notes. - When enabled, respawn type will be shown in briefing notes. - When enabled, respawn type will be shown in briefing notes. + When enabled, the respawn type will be shown in the briefing notes. + When enabled, the respawn type will be shown in the briefing notes. - Show this side for all. Own side is aways shown, if show tickets is enabled. Also it that is disabled, none of the sides tickets are shown. - Show this side for all. Own side is aways shown, if show tickets is enabled. Also it that is disabled, none of the sides tickets are shown. + Show this side for all. Own side is always shown, if 'show tickets' is enabled. Also, if that is disabled, none of the sides' tickets are shown. + Show this side for all. Own side is always shown, if 'show tickets' is enabled. Also, if that is disabled, none of the sides' tickets are shown. Show west data to all @@ -373,70 +445,70 @@ Show civilian data to all - Mission has an <font size='16'>wave respawn</font> with <font size='16'>unlimited tickets</font> for <font size='16'>each side</font>. - Mission has an <font size='16'>wave respawn</font> with <font size='16'>unlimited tickets</font> for <font size='16'>each side</font>. + The mission has unlimited tickets for each side. + The mission has unlimited tickets for each side. - Mission has an <font size='16'>wave respawn</font> with <font size='16'>limited tickets</font> for <font size='16'>each side</font>. - Mission has an <font size='16'>wave respawn</font> with <font size='16'>limited tickets</font> for <font size='16'>each side</font>. + The mission has limited tickets for each side. + The mission has limited tickets for each side. - Mission has an <font size='16'>wave respawn</font> with <font size='16'>limited tickets</font> for <font size='16'>each player</font>. - Mission has an <font size='16'>wave respawn</font> with <font size='16'>limited tickets</font> for <font size='16'>each player</font>. + The mission has limited tickets for each player. + The mission has limited tickets for each player. - Mission uses only forced respawn waves. So no respawn timer. - Mission uses only forced respawn waves. So no respawn timer. + The mission only uses forced respawn waves, so there is no respawn timer. + The mission only uses forced respawn waves, so there is no respawn timer. - %1<br/><br/>JIP players will be killed and move to respawn after <font size='16'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. - %1<br/><br/>JIP players will be killed and move to respawn after <font size='16'>%2min</font> from mission start. If player disconnected earlier, it wont use ticket. + JIP players will be killed and moved to respawn after %2min from mission start. If a player disconnects earlier, it won't use a ticket. + JIP players will be killed and moved to respawn after %2min from mission start. If a player disconnects earlier, it won't use a ticket. - JIP players are not killed and moved to respawn when they join game. - JIP players are not killed and moved to respawn when they join game. + JIP players are not killed and moved to respawn when they join the game. + JIP players are not killed and moved to respawn when they join the game. - %1<br/><br/>When MSP has been deployed, it will report enemies every <font size='16'>%2s</font>, if there is any inside <font size='16'>%3</font> meter radius. - %1<br/><br/>When MSP has been deployed, it will report enemies every <font size='16'>%2s</font>, if there is any inside <font size='16'>%3</font> meter radius. + Once the MSP is deployed, it will report the presence of enemies within a %3 meter radius every %2 seconds. + Once the MSP is deployed, it will report the presence of enemies within a %3 meter radius every %2 seconds. - Reporting enemies near MSP is disabled. - Reporting enemies near MSP is disabled. + The MSP's enemy reporting feature is disabled for this mission. + The MSP's enemy reporting feature is disabled for this mission. - %1<br/><br/>MSP contested status is updated every <font size='16'>%2s</font>.<br/>It will get contested if there is more enemis inside <font size='16'>%3m</font> radius or even one enemy is <font size='16'>%4m</font> away from it. - %1<br/><br/>MSP contested status is updated every <font size='16'>%2s</font>.<br/>It will get contested if there is more enemis inside <font size='16'>%3m</font> radius or even one enemy is <font size='16'>%4m</font> away from it. + MSP contested status is updated every %2s.<br/>It will be contested if there are more enemies inside a %3m radius or even if one enemy is %4m away from it. + MSP contested status is updated every %2s.<br/>It will be contested if there are more enemies inside a %3m radius or even if one enemy is %4m away from it. - %1<br/><br/>MSP vehicle is <font size='16'>%2</font> - %1<br/><br/>MSP vehicle is <font size='16'>%2</font> + MSP vehicle is: %2. + MSP vehicle is: %2. - %1<br/><br/>This mission has <font size='16'>delayed respawn on.</font> <br/>If there is <font size='16'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font size='16'>you will skip it.</font> - %1<br/><br/>This mission has <font size='16'>delayed respawn on.</font> <br/>If there is <font size='16'>less than %2min (%3%5 from %4min)</font> time left for next wave, <font size='16'>you will skip it.</font> + This mission has delayed respawn on. If there is less than %2min (%3%5 from %4min) remaining until the next wave, you will skip it. + This mission has delayed respawn on. If there is less than %2min (%3%5 from %4min) remaining until the next wave, you will skip it. - <br/><br/>This mission has <font size='16'>delayed respawn off.</font> - <br/><br/>This mission has <font size='16'>delayed respawn off.</font> + This mission has delayed respawn off. + This mission has delayed respawn off. - Mobile Spawn Point (MSP) has been <font size='16'>enabled</font> to this mission for your side. - Mobile Spawn Point (MSP) has been <font size='16'>enabled</font> to this mission for your side. + Mobile Spawn Point (MSP) has been enabled for your side in this mission. + Mobile Spawn Point (MSP) has been enabled for your side in this mission. - Mobile Spawn Point (MSP) has been enabled for this mission, but <font size='16'>your side does not have MSP.</font> - Mobile Spawn Point (MSP) has been enabled for this mission, but <font size='16'>your side does not have MSP.</font> + Mobile Spawn Point (MSP) has been enabled for this mission, but your side does not have MSP. + Mobile Spawn Point (MSP) has been enabled for this mission, but your side does not have MSP. - <br/><br/>If there is MSP or custom teleport points in this mission, you can accses teleport menu always from Main Base and uncontested MSP using ace action menu. Custom teleport points might have different conditions and uses either vanilla action menu or ace action menu. - <br/><br/>If there is MSP or custom teleport points in this mission, you can accses teleport menu always from Main Base and uncontested MSP using ace action menu. Custom teleport points might have different conditions and uses either vanilla action menu or ace action menu. + If there is an MSP or custom teleport points in this mission, you can access the teleport menu from the Main Base and uncontested MSP using the ACE action menu.<br/>Custom teleport points might have different conditions and use either the vanilla action menu or ACE action menu, depending on how the mission maker has it set up. + If there is an MSP or custom teleport points in this mission, you can access the teleport menu from the Main Base and uncontested MSP using the ACE action menu.<br/>Custom teleport points might have different conditions and use either the vanilla action menu or ACE action menu, depending on how the mission maker has it set up. - Default - Default + Endless waves + Endless waves Side tickets @@ -465,20 +537,20 @@ Deploy time - Time that it takes to deploy MSP (seconds) - Time that it takes to deploy MSP (seconds) + Time it takes to deploy MSP (seconds) + Time it takes to deploy MSP (seconds) - Time that it takes to pack MSP (seconds) - Time that it takes to pack MSP (seconds) + Time it takes to pack MSP (seconds) + Time it takes to pack MSP (seconds) Enable MSP Enable MSP - Check tickets from msp - Check tickets from msp + Check tickets from MSP + Check tickets from MSP Enable MSP system @@ -541,30 +613,30 @@ Civilian MSP Classname - Put vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use non-string version of classname like: B_MRAP_01_F. Only one type of vehicle is supported currently - Put vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use non-string version of classname like: B_MRAP_01_F. Only one type of vehicle is supported currently + Put the vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use the non-string version of the classname like: B_MRAP_01_F. Only one type of vehicle is supported currently. + Put the vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use the non-string version of the classname like: B_MRAP_01_F. Only one type of vehicle is supported currently. - When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters), for this side - When there are enemies inside this radius, MSP are always disabled, even if there are more friendlies in max range (meters), for this side + When there are enemies inside this radius, MSP is always disabled, even if there are more friendlies within the maximum range (in meters), for this side. + When there are enemies inside this radius, MSP is always disabled, even if there are more friendlies within the maximum range (in meters), for this side. - Interval for when server updates the contested status for MSP, for this side - Interval for when server updates the contested status for MSP, for this side + Interval for when the server updates the contested status for MSP, for this side + Interval for when the server updates the contested status for MSP, for this side - Radius where there needs to be more enemies than allies to disable MSP (meters), for this side - Radius where there needs to be more enemies than allies to disable MSP (meters), for this side + Radius where there need to be more enemies than allies to disable MSP (meters), for this side + Radius where there need to be more enemies than allies to disable MSP (meters), for this side - Min Contested Radius - Min Contested Radius + Minimum Contested Radius + Minimum Contested Radius - Max Contested Radius - Max Contested Radius + Maximum Contested Radius + Maximum Contested Radius Contested Check Interval @@ -577,12 +649,12 @@ Range from MSP where enemies are reported (meters), for this side - Interval when server check if there is enemies near MSP, for this side - Interval when server check if there is enemies near MSP, for this side + Interval when the server checks if there are enemies near MSP, for this side + Interval when the server checks if there are enemies near MSP, for this side - Enable Report Enemies near MSP, for this side - Enable Report Enemies near MSP, for this side + Enable Reporting Enemies near MSP, for this side + Enable Reporting Enemies near MSP, for this side Report Enemies Interval @@ -615,28 +687,28 @@ - Who gets notification from MSP deploy/pack? - Who gets notification from MSP deploy/pack? + Who receives MSP deploy/pack notifications? + Who receives MSP deploy/pack notifications? - Who gets notification when MSP contested? - Who gets notification when MSP contested? + Who receives notifications when MSP is contested? + Who receives notifications when MSP is contested? - Who to notify when enemies near MSP? - Who to notify when enemies near MSP? + Who should be notified when enemies are near MSP? + Who should be notified when enemies are near MSP? - When MSP is setup or packed up, who whil recive notification from it. Default: Group Leader - When MSP is setup or packed up, who whil recive notification from it. Default: Group Leader + When MSP is deployed or packed up, who will receive notifications from it. Default: Group Leader + When MSP is deployed or packed up, who will receive notifications from it. Default: Group Leader - When MSP is contested, who whil recive notification from it. Default: Group Leader - When MSP is contested, who whil recive notification from it. Default: Group Leader + When MSP is contested, who will receive notifications from it. Default: Group Leader + When MSP is contested, who will receive notifications from it. Default: Group Leader - When there is enemies near MSP, who whil recive notification from it. Default: Group Leader - When there is enemies near MSP, who whil recive notification from it. Default: Group Leader + When enemies are near MSP, who will receive notifications from it. Default: Group Leader + When enemies are near MSP, who will receive notifications from it. Default: Group Leader Notifications diff --git a/addons/msp/functions/fnc_briefingNotes.sqf b/addons/msp/functions/fnc_briefingNotes.sqf index bc77ba5..4322198 100644 --- a/addons/msp/functions/fnc_briefingNotes.sqf +++ b/addons/msp/functions/fnc_briefingNotes.sqf @@ -17,28 +17,28 @@ if (playerSide isEqualTo sideLogic || !hasInterface) exitWith { }; // Exit if a private _vehicle = GVAR(classnames) get playerSide; -private _text = "MSP settings
"; +private _text = ""+ localize "STR_tunres_MSP_Briefing_Header" +"
"; if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { private _values = GVAR(contestValues) get playerSide; _values params ["_reportEnemiesInterval", "_reportEnemiesRange", "_contestedRadiusMax", "_contestedRadiusMin", "_contestedCheckInterval", "_reportEnemiesEnabled"]; - _text = format ["%1
%2",_text, localize "STR_tunres_Respawn_Briefing_MspEnabled"]; + _text = format ["%1
- %2",_text, localize "STR_tunres_Respawn_Briefing_MspEnabled"]; if (_reportEnemiesEnabled) then { - _text = format [localize "STR_tunres_Respawn_Briefing_reportEnemiesEnabled",_text, _reportEnemiesInterval, _reportEnemiesRange]; + _text = format [("%1

- " + localize "STR_tunres_Respawn_Briefing_reportEnemiesEnabled"),_text, _reportEnemiesInterval, _reportEnemiesRange]; } else { - _text = format ["%1
%2",_text, localize "STR_tunres_Respawn_Briefing_reportEnemiesDisabled"]; + _text = format ["%1

- %2",_text, localize "STR_tunres_Respawn_Briefing_reportEnemiesDisabled"]; }; if (GVAR(allowCheckTicketsMSP)) then { - _text = format ["%1
You can check remaining tickets from MSP (using ace actions).",_text]; + _text = format [("%1

- " + localize "STR_tunres_MSP_Briefing_CheckTicketsMsp"),_text]; }; - _text = format [localize "STR_tunres_Respawn_Briefing_ContestedCheck",_text, _contestedCheckInterval, _contestedRadiusMax, _contestedRadiusMin]; - _text = format [localize "STR_tunres_Respawn_Briefing_MspVehicle",_text, getText (configFile >> "CfgVehicles" >> _vehicle >> "displayName")]; + _text = format ["%1

- "+ localize "STR_tunres_Respawn_Briefing_ContestedCheck",_text, _contestedCheckInterval, _contestedRadiusMax, _contestedRadiusMin]; + _text = format ["%1

- "+ localize "STR_tunres_Respawn_Briefing_MspVehicle",_text, getText (configFile >> "CfgVehicles" >> _vehicle >> "displayName")]; } else { - _text = format ["%1
%2",_text, localize "STR_tunres_Respawn_Briefing_MspDisabled"]; + _text = format ["%1
- %2",_text, localize "STR_tunres_Respawn_Briefing_MspDisabled"]; }; _text = format ["%1

Powered By TuntematonEngine v%2.%3.%4", _text, MAJOR, MINOR, PATCH]; @@ -48,12 +48,10 @@ if !(player diarySubjectExists "Respawn info") then { player createDiarySubject ["Respawn info","Tun - Respawn info"]; }; -player createDiaryRecord ["Respawn info",["MSP info", _text]]; +player createDiaryRecord ["Respawn info",[localize "STR_tunres_MSP_Briefing_Category", _text]]; -player createDiaryRecord ["Respawn info",["MSP check contest area", -"After enabling, you can click on map and it will create area markers. -

Enable contest area check. -

Disable contest area check. - -" +player createDiaryRecord ["Respawn info",[localize "STR_tunres_MSP_Briefing_AreaContestCheckCategory", +localize "STR_tunres_MSP_Briefing_AreaContestCheckText" +" +

"+ localize "STR_tunres_MSP_Briefing_EnableAreaContestCheck" +" +

"+ localize "STR_tunres_MSP_Briefing_DisableAreaContestCheck" +"" ]]; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_briefingNotes.sqf b/addons/respawn/functions/fnc_briefingNotes.sqf index faa7de8..bc4b7f7 100644 --- a/addons/respawn/functions/fnc_briefingNotes.sqf +++ b/addons/respawn/functions/fnc_briefingNotes.sqf @@ -15,21 +15,21 @@ if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (IE zeus) -private _text = "Respawn settings
"; +private _text = ""+ localize "STR_tunres_Respawn_Briefing_Header"+"
"; if (GVAR(briefingEnableShowRespawnType)) then { if ( GVAR(forcedRespawn) ) then { - _text = format ["%1
%2",_text, localize "STR_tunres_Respawn_Briefing_onlyForcedWaves"]; + _text = format ["%1
- %2",_text, localize "STR_tunres_Respawn_Briefing_onlyForcedWaves"]; }; switch (GVAR(respawnType)) do { case 0: { - _text = format ["
%1
%2",_text, localize "STR_tunres_Respawn_Briefing_default"]; + _text = format ["
%1
- %2",_text, localize "STR_tunres_Respawn_Briefing_default"]; }; case 1: { - _text = format ["
%1
%2",_text, localize "STR_tunres_Respawn_Briefing_sidetickets"]; + _text = format ["
%1
- %2",_text, localize "STR_tunres_Respawn_Briefing_sidetickets"]; }; case 2: { - _text = format ["
%1
%2",_text, localize "STR_tunres_Respawn_Briefing_playertickets"]; + _text = format ["
%1
- %2",_text, localize "STR_tunres_Respawn_Briefing_playertickets"]; }; default { }; }; @@ -39,19 +39,19 @@ if (GVAR(briefingEnableShowTime)) then { private _waveLenghtTimeHash = GVAR(waveLenghtTimes); _text = format ["%1

Wave interval",_text]; if (playerSide isEqualTo west || GVAR(briefingEnableShowOtherSidesDataWest)) then { - _text = format ["%1
For West is %2min",_text, _waveLenghtTimeHash get west]; + _text = format ["%1
- "+localize "STR_tunres_Respawn_Briefing_WaveTime_west",_text, _waveLenghtTimeHash get west]; }; if (playerSide isEqualTo east || GVAR(briefingEnableShowOtherSidesDataEast)) then { - _text = format ["%1
For East is %2min",_text,_waveLenghtTimeHash get east]; + _text = format ["%1
- "+localize "STR_tunres_Respawn_Briefing_WaveTime_east",_text,_waveLenghtTimeHash get east]; }; if (playerSide isEqualTo resistance || GVAR(briefingEnableShowOtherSidesDataResistance)) then { - _text = format ["%1
For Resistance is %2min",_text, _waveLenghtTimeHash get resistance]; + _text = format ["%1
- "+localize "STR_tunres_Respawn_Briefing_WaveTime_resistance",_text, _waveLenghtTimeHash get resistance]; }; if (playerSide isEqualTo civilian || GVAR(briefingEnableShowOtherSidesDataCivilian)) then { - _text = format ["%1
For Civilian is %2min",_text, _waveLenghtTimeHash get civilian]; + _text = format ["%1
- "+localize "STR_tunres_Respawn_Briefing_WaveTime_civilian",_text, _waveLenghtTimeHash get civilian]; }; private _delayedRespawn = GVAR(delayedRespawn); @@ -60,43 +60,43 @@ if (GVAR(briefingEnableShowTime)) then { _respawnTime = _respawnTime * 60; private _delayedTime = [(_respawnTime * (_delayedRespawn / 100)), "M:SS"] call CBA_fnc_formatElapsedTime; _respawnTime = [_respawnTime, "M:SS"] call CBA_fnc_formatElapsedTime; - _text = format [localize "STR_tunres_Respawn_Briefing_DelayedRespawn",_text, _delayedTime, _delayedRespawn, _respawnTime, "%"]; + _text = format ["%1

- " + localize "STR_tunres_Respawn_Briefing_DelayedRespawn",_text, _delayedTime, _delayedRespawn, _respawnTime, "%"]; } else { - _text = _text + localize "STR_tunres_Respawn_Briefing_DelayedRespawnOff"; + _text = _text + "

- " + localize "STR_tunres_Respawn_Briefing_DelayedRespawnOff"; }; }; if (GVAR(briefingEnableShowTickets) && { GVAR(respawnType) isNotEqualTo 0}) then { - _text = format ["%1

Tickets",_text]; + _text = format ["%1

"+ localize "STR_tunres_Respawn_Briefing_Category_Tickets" +"",_text]; if (playerSide isEqualTo west || GVAR(briefingEnableShowOtherSidesDataWest)) then { - _text = format ["%1
Ticket count: %2 (West)",_text, GVAR(initialTicketsWest)]; + _text = format ["%1
- "+localize "STR_tunres_Respawn_Briefing_TicketCount_west",_text, GVAR(initialTicketsWest)]; }; if (playerSide isEqualTo east || GVAR(briefingEnableShowOtherSidesDataEast)) then { - _text = format ["%1
Ticket count: %2 (East)",_text, GVAR(initialTicketsEast)]; + _text = format ["%1
- "+localize "STR_tunres_Respawn_Briefing_TicketCount_east",_text, GVAR(initialTicketsEast)]; }; if (playerSide isEqualTo resistance || GVAR(briefingEnableShowOtherSidesDataResistance)) then { - _text = format ["%1
Ticket count: %2 (Resistance)",_text, GVAR(initialTicketsResistance)]; + _text = format ["%1
- "+localize "STR_tunres_Respawn_Briefing_TicketCount_resistance",_text, GVAR(initialTicketsResistance)]; }; if (playerSide isEqualTo civilian || GVAR(briefingEnableShowOtherSidesDataCivilian)) then { - _text = format ["%1
Ticket count: %2 (Civilian)",_text, GVAR(initialTicketsCivilian)]; + _text = format ["%1
- "+localize "STR_tunres_Respawn_Briefing_TicketCount_civilian",_text, GVAR(initialTicketsCivilian)]; }; if (GVAR(allowCheckTicketsBase)) then { - _text = format ["%1
You can check remaining tickets from mainbase (flagpole, using ace actions).",_text]; + _text = format ["%1

- "+ localize "STR_tunres_Respawn_Briefing_CheckTicketsMainbase",_text]; }; }; if (GVAR(killJIP)) then { - _text = format [localize "STR_tunres_Respawn_Briefing_killJipEnabled",_text, GVAR(killJipTime)]; + _text = format [("%1

- "+localize "STR_tunres_Respawn_Briefing_killJipEnabled"),_text, GVAR(killJipTime)]; } else { - _text = format ["%1

%2",_text, localize "STR_tunres_Respawn_Briefing_killJipDisabled"]; + _text = format ["%1

- %2",_text, localize "STR_tunres_Respawn_Briefing_killJipDisabled"]; }; -_text = _text + localize "STR_tunres_Respawn_Briefing_teleportNetwork"; +_text = _text + "

" + localize "STR_tunres_Respawn_Briefing_teleportNetwork"; _text = format ["%1

Powered By TuntematonEngine v%2.%3.%4", _text, MAJOR, MINOR, PATCH]; //player createDiaryRecord ["Diary",["Respawn info",_text]]; From 6e60073b8a197bc59f655082d39918bbf4248f82 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 13 Jun 2024 22:50:35 +0300 Subject: [PATCH 095/228] Unify and add missing roundings --- addons/respawn/XEH_preInit.sqf | 41 +++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index 2d1aa97..1f0bf09 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -85,7 +85,8 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(killJipTime) = round _value; + _value = round _value; + GVAR(killJipTime) = _value; }, true ] call CBA_Settings_fnc_init; @@ -132,7 +133,8 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(delayedRespawn) = round _value; + _value = round _value; + GVAR(delayedRespawn) = _value; }, true ] call CBA_Settings_fnc_init; @@ -146,7 +148,8 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(waitingAreaRange) = round _value; + _value = round _value; + GVAR(waitingAreaRange) = _value; }, true ] call CBA_Settings_fnc_init; @@ -161,7 +164,9 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(waveLenghtTimes) set [west, round _value]; + _value = round _value; + GVAR(initialWaveTimeWest) = _value; + GVAR(waveLenghtTimes) set [west, _value]; }, true ] call CBA_Settings_fnc_init; @@ -175,7 +180,9 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(waveLenghtTimes) set [east, round _value]; + _value = round _value; + GVAR(initialWaveTimeEast) = _value; + GVAR(waveLenghtTimes) set [east, _value]; }, true ] call CBA_Settings_fnc_init; @@ -189,7 +196,9 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(waveLenghtTimes) set [resistance, round _value]; + _value = round _value; + GVAR(initialWaveTimeResistance) = _value; + GVAR(waveLenghtTimes) set [resistance, _value]; }, true ] call CBA_Settings_fnc_init; @@ -203,7 +212,9 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(waveLenghtTimes) set [civilian, round _value]; + _value = round _value; + GVAR(initialWaveTimeCivilian) = _value; + GVAR(waveLenghtTimes) set [civilian, _value]; }, true ] call CBA_Settings_fnc_init; @@ -450,7 +461,9 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(tickets) set [west, round _value]; + _value = round _value; + GVAR(initialTicketsWest) = _value; + GVAR(tickets) set [west, _value]; }, true ] call CBA_Settings_fnc_init; @@ -464,7 +477,9 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(tickets) set [east, round _value]; + _value = round _value; + GVAR(initialTicketsEast) = _value; + GVAR(tickets) set [east, _value]; }, true ] call CBA_Settings_fnc_init; @@ -478,7 +493,9 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(tickets) set [resistance, round _value]; + _value = round _value; + GVAR(initialTicketsResistance) = _value; + GVAR(tickets) set [resistance, _value]; }, true ] call CBA_Settings_fnc_init; @@ -492,7 +509,9 @@ GVAR(selfTPmenuOpenObj) = objNull; 1, { params ["_value"]; - GVAR(tickets) set [civilian, round _value]; + _value = round _value; + GVAR(initialTicketsCivilian) = _value; + GVAR(tickets) set [civilian, _value]; }, true ] call CBA_Settings_fnc_init; From 17636b7a855058580881786d5c4099b55e37874b Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 13 Jun 2024 22:50:55 +0300 Subject: [PATCH 096/228] fix wrong variable name --- addons/respawn/functions/fnc_delayedRespawn.sqf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/respawn/functions/fnc_delayedRespawn.sqf b/addons/respawn/functions/fnc_delayedRespawn.sqf index ffcff74..03142b2 100644 --- a/addons/respawn/functions/fnc_delayedRespawn.sqf +++ b/addons/respawn/functions/fnc_delayedRespawn.sqf @@ -27,11 +27,12 @@ if (GVAR(delayedRespawn) > 0) then { _unit setVariable [QGVAR(skipNextWave), _skip, true]; if (_skip) then { + LOG("Skipped respawn wave"); private _waitingRespawnDelayedHash = GVAR(waitingRespawnDelayedList); private _waitingRespawnDelayed = _waitingRespawnDelayedHash get _side; PUSH(_waitingRespawnDelayed,_unit); FILTER(_waitingRespawnDelayed,(!isnull _x && _x in allPlayers && alive _x )); - _waitingRespawnDelayed set [_side, _waitingRespawnDelayed]; + _waitingRespawnDelayedHash set [_side, _waitingRespawnDelayed]; publicVariable QGVAR(waitingRespawnDelayedList); }; From c20af9f4c8a692574555b30ec8968d3e30ed2bea Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 13 Jun 2024 22:51:19 +0300 Subject: [PATCH 097/228] Fix missing contest area marker deleting --- addons/msp/functions/fnc_checkContestZoneArea.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/msp/functions/fnc_checkContestZoneArea.sqf b/addons/msp/functions/fnc_checkContestZoneArea.sqf index 276fae8..985ef74 100644 --- a/addons/msp/functions/fnc_checkContestZoneArea.sqf +++ b/addons/msp/functions/fnc_checkContestZoneArea.sqf @@ -27,7 +27,7 @@ GVAR(contestMarkerMapEH) = addMissionEventHandler ["Map", { params ["_mapIsOpened", "_mapIsForced"]; if !(_mapIsOpened) then { removeMissionEventHandler ["Map", GVAR(contestMarkerMapEH)]; - + [] call FUNC(deleteContestZoneMarkers); QEGVAR(Respawn,RespawnPosLocal) setMarkerAlphaLocal 1; }; }]; From c2a2e9ec05bfa9f35fb4ef28680edbc80cf9ab78 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 14 Jun 2024 23:37:33 +0300 Subject: [PATCH 098/228] Change hash systems Changed hash templates to macros. Moved some hashs to server only. Cleaning --- addons/main/script_macros.hpp | 7 +++++++ addons/respawn/XEH_postInit.sqf | 4 +++- addons/respawn/XEH_postInit_client.sqf | 2 ++ addons/respawn/XEH_preInit.sqf | 24 +++++------------------- addons/respawn/XEH_preInit_server.sqf | 11 ++++++++++- 5 files changed, 27 insertions(+), 21 deletions(-) diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 9e3cf7c..c730d46 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -19,3 +19,10 @@ #define AAR_UPDATE(OBJ,VARNAME,VALUE) if ( AAR_IS_ENABLED ) then { [OBJ, VARNAME, VALUE] call afi_aar2_fnc_addcustomdata; } //AAR event #define AAR_EVENT(TEXT,INSTIGATOR,TARGET,POI) if ( AAR_IS_ENABLED ) then { if (isServer) then { [TEXT,INSTIGATOR,TARGET,POI] call afi_aar2_fnc_addCustomEvent;} else {[TEXT,INSTIGATOR,TARGET,POI] remoteExecCall ["afi_aar2_fnc_addCustomEvent", 2]} }; + + +//Hash template macros +#define EMPTY_ARRAY_FOR_SIDES [[west,[]],[east,[]],[resistance,[]],[civilian,[]]] +#define ZEROS_FOR_SIDES [[west,0],[east,0],[resistance,0],[civilian,0]] +#define FALSES_FOR_SIDES [[west,false],[east,false],[resistance,false],[civilian,false]] +#define TRUES_FOR_SIDES [[west,true],[east,true],[resistance,true],[civilian,true]] \ No newline at end of file diff --git a/addons/respawn/XEH_postInit.sqf b/addons/respawn/XEH_postInit.sqf index 4c4489e..df6e643 100644 --- a/addons/respawn/XEH_postInit.sqf +++ b/addons/respawn/XEH_postInit.sqf @@ -1,3 +1,5 @@ #include "script_component.hpp" if !(GVAR(enable)) exitWith { INFO("TUN Respawn Disabled"); }; -INFO("TUN Respawn Enabled"); \ No newline at end of file +INFO("TUN Respawn Enabled"); + +ISNILS(GVAR(endRespawns),false); \ No newline at end of file diff --git a/addons/respawn/XEH_postInit_client.sqf b/addons/respawn/XEH_postInit_client.sqf index 5821f2d..cf0abb8 100644 --- a/addons/respawn/XEH_postInit_client.sqf +++ b/addons/respawn/XEH_postInit_client.sqf @@ -1,5 +1,7 @@ #include "script_component.hpp" +GVAR(selfTPmenuOpenObj) = objNull; + [{!isNull player && ADDON }, { diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index 1f0bf09..6264143 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -5,14 +5,9 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; -private _waitingRespawnEmptyArray = [[west,[]],[east,[]],[resistance,[]],[civilian,[]]]; -private _waitTimesPreArray = [[west,0],[east,0],[resistance,0],[civilian,0]]; -private _emptyFalseArray = [[west,false],[east,false],[resistance,false],[civilian,false]]; -private _emptyTrueArray = [[west,true],[east,true],[resistance,true],[civilian,true]]; - //cba_missiontime time when next wave happens. -GVAR(nextWaveTimes) = createHashMapFromArray _waitTimesPreArray; +GVAR(nextWaveTimes) = createHashMapFromArray ZEROS_FOR_SIDES; //Respawn wave lenght times GVAR(waveLenghtTimes) = createHashMap; @@ -24,20 +19,12 @@ GVAR(tickets) = createHashMap; GVAR(waitingArea) = createHashMap; //Which side has respawn system started -GVAR(enabledSides) = createHashMapFromArray _emptyFalseArray; - -//Respawn waiting area unit arrays -GVAR(waitingRespawnList) = createHashMapFromArray _waitingRespawnEmptyArray; -GVAR(waitingRespawnDelayedList) = createHashMapFromArray _waitingRespawnEmptyArray; - -//Total respawn count (log stuff) -GVAR(totalRespawnCount) = createHashMapFromArray _waitTimesPreArray; +GVAR(enabledSides) = createHashMapFromArray FALSES_FOR_SIDES; //Allow respawn for each side -GVAR(allowRespawn) = createHashMapFromArray _emptyTrueArray; +GVAR(allowRespawn) = createHashMapFromArray TRUES_FOR_SIDES; -GVAR(disconnectedPlayers) = createHashMapFromArray _waitingRespawnEmptyArray; -GVAR(timerRunning) = createHashMapFromArray _emptyFalseArray; +GVAR(timerRunning) = createHashMapFromArray FALSES_FOR_SIDES; ISNILS(GVAR(teleportPoints),[]); //allowed sides to spectate @@ -50,8 +37,7 @@ GVAR(allowedSpectateSidesCivilian) = [civilian]; GVAR(flagPoles) = createHashMapFromArray [[west,[objNull,objNull]],[east,[objNull,objNull]],[resistance,[objNull,objNull]],[civilian,[objNull,objNull]]]; -ISNILS(GVAR(endRespawns),false); -GVAR(selfTPmenuOpenObj) = objNull; + [ diff --git a/addons/respawn/XEH_preInit_server.sqf b/addons/respawn/XEH_preInit_server.sqf index f8a3298..68cba83 100644 --- a/addons/respawn/XEH_preInit_server.sqf +++ b/addons/respawn/XEH_preInit_server.sqf @@ -1,3 +1,12 @@ #include "script_component.hpp" -GVAR(respawnPointsHash) = createHashMap; \ No newline at end of file +GVAR(respawnPointsHash) = createHashMap; + +GVAR(disconnectedPlayers) = createHashMapFromArray EMPTY_ARRAY_FOR_SIDES; + +//Respawn waiting area unit arrays +GVAR(waitingRespawnList) = createHashMapFromArray EMPTY_ARRAY_FOR_SIDES; +GVAR(waitingRespawnDelayedList) = createHashMapFromArray EMPTY_ARRAY_FOR_SIDES; + +//Total respawn count (log stuff) +GVAR(totalRespawnCount) = createHashMapFromArray ZEROS_FOR_SIDES; \ No newline at end of file From c20a7c924456eca669a5bbf2910601ac9546f212 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 14 Jun 2024 23:37:49 +0300 Subject: [PATCH 099/228] Change to use existing function --- addons/respawn/functions/fnc_respawnUnit.sqf | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/addons/respawn/functions/fnc_respawnUnit.sqf b/addons/respawn/functions/fnc_respawnUnit.sqf index f60887e..204f3b6 100644 --- a/addons/respawn/functions/fnc_respawnUnit.sqf +++ b/addons/respawn/functions/fnc_respawnUnit.sqf @@ -17,15 +17,7 @@ params [["_side", nil, [west]], ["_unit", objnull, [objnull]]]; private _respawnPointsHash = GVAR(respawnPointsHash); private _respawnPosition = getMarkerPos ((_respawnPointsHash get _side) select 0); -private _waitingRespawnHash = GVAR(waitingRespawnList); -private _unitList = _waitingRespawnHash get _side; - -if (isnull _unit || !(_unit in allPlayers) || !alive _unit ) exitWith { - _waitingRespawnHash set [_side, _unitList]; -}; - -_unitList deleteAt (_unitList find _unit); -_waitingRespawnHash set [_side, _unitList]; +[_unit, false, _side, false] call FUNC(updateWaitingRespawnList); _unit setVariable [QGVAR(isWaitingRespawn), false, true]; private _text = localize "STR_tunres_Respawn_FNC_moveRespawnText"; From 58df427b0420a733ea5850c66a47a50359398a9c Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 14 Jun 2024 23:38:29 +0300 Subject: [PATCH 100/228] Now actually add/remove units from unit list --- .../fnc_updateWaitingRespawnList.sqf | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf index 46ac4cc..b2e2660 100644 --- a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf +++ b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf @@ -5,30 +5,36 @@ * Arguments: * 0: unit to add or remove * 1: true to add, false to remove + * 2: Unit side + * 3: true/false to publicVariable unit list * * Return Value: * none * * Example: - * [player] call tunres_Respawn_fnc_updateWaitingRespawnList + * [player] call tunres_Respawn_fnc_updateWaitingRespawnList */ #include "script_component.hpp" -params [["_player", nil, [objNull]], ["_addPlayer", nil, [false]], ["_side", nil, [west]]]; +params [["_player", nil, [objNull]], ["_addPlayer", nil, [false]], ["_side", nil, [west]], ["_doPublicVar", true, [true]]]; -private _skip = [_player, _side] call FUNC(delayedRespawn); +if (isnull _player || !(_player in allPlayers) || !alive _player ) exitWith { + LOG("Tried to add unit what is not there"); +}; -if !(_skip) then { - private _waitingRespawnHash = GVAR(waitingRespawnList); - private _unitList = _waitingRespawnHash get _side; +private _unitSkipsNextWave = [_player, _side] call FUNC(delayedRespawn); +private _unitListHash = [GVAR(waitingRespawnDelayedList), GVAR(waitingRespawnList)] select _unitSkipsNextWave; +private _unitList = _unitListHash get _side; +FILTER(_unitList,(!isnull _x && _x in allPlayers && alive _x )); - FILTER(_unitList,(!isnull _x && _x in allPlayers && alive _x )); +if (_addPlayer) then { + _unitList pushBackUnique _player; +} else { + _unitList deleteAt (_unitList find _player); +}; - if (_addPlayer) then { - _unitList pushBackUnique _player; - } else { - _unitList deleteAt (_unitList find _player); - }; +_unitListHash set [_side, _unitList]; - _waitingRespawnHash set [_side, _unitList]; - publicVariable QGVAR(waitingRespawnList); -}; \ No newline at end of file +// //this is for not broadcasting on every player on respawn wave. +// if (_doPublicVar) then { +// publicVariable [QGVAR(waitingRespawnDelayedList), QGVAR(waitingRespawnList)] select _unitSkipsNextWave; +// }; \ No newline at end of file From 618909c1f13a3112ff28437bae889bdddb8e8c97 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 14 Jun 2024 23:38:59 +0300 Subject: [PATCH 101/228] Fix overlapping feature with other function --- addons/respawn/functions/fnc_delayedRespawn.sqf | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/addons/respawn/functions/fnc_delayedRespawn.sqf b/addons/respawn/functions/fnc_delayedRespawn.sqf index 03142b2..b342690 100644 --- a/addons/respawn/functions/fnc_delayedRespawn.sqf +++ b/addons/respawn/functions/fnc_delayedRespawn.sqf @@ -26,14 +26,4 @@ if (GVAR(delayedRespawn) > 0) then { _unit setVariable [QGVAR(skipNextWave), _skip, true]; -if (_skip) then { - LOG("Skipped respawn wave"); - private _waitingRespawnDelayedHash = GVAR(waitingRespawnDelayedList); - private _waitingRespawnDelayed = _waitingRespawnDelayedHash get _side; - PUSH(_waitingRespawnDelayed,_unit); - FILTER(_waitingRespawnDelayed,(!isnull _x && _x in allPlayers && alive _x )); - _waitingRespawnDelayedHash set [_side, _waitingRespawnDelayed]; - publicVariable QGVAR(waitingRespawnDelayedList); -}; - _skip \ No newline at end of file From d2b2c78a0ecc7d94dd64c747956ad27f3f4058e6 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 14 Jun 2024 23:39:30 +0300 Subject: [PATCH 102/228] Use hashs macros --- addons/msp/XEH_preInit_server.sqf | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/addons/msp/XEH_preInit_server.sqf b/addons/msp/XEH_preInit_server.sqf index fc44523..0340e9f 100644 --- a/addons/msp/XEH_preInit_server.sqf +++ b/addons/msp/XEH_preInit_server.sqf @@ -1,16 +1,14 @@ #include "script_component.hpp" //only executed on server -private _emptyFalseArray = [[west,false],[east,false],[resistance,false],[civilian,false]]; - missionNamespace setVariable [QGVAR(disableContestedCheck), false, true]; //Contested status -GVAR(contestedStatus) = createHashMapFromArray _emptyFalseArray; +GVAR(contestedStatus) = createHashMapFromArray FALSES_FOR_SIDES; publicVariable QGVAR(contestedStatus); //MSP status. If true, msp is setup -GVAR(deployementStatus) = createHashMapFromArray _emptyFalseArray; +GVAR(deployementStatus) = createHashMapFromArray FALSES_FOR_SIDES; publicVariable QGVAR(deployementStatus); //MSP vehicle From 8a5f300bd1456ea33fa416eb47ca14d03f65a6c1 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 14 Jun 2024 23:39:50 +0300 Subject: [PATCH 103/228] Update header --- .../msp/functions/fnc_deleteContestZoneMarkers.sqf | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/addons/msp/functions/fnc_deleteContestZoneMarkers.sqf b/addons/msp/functions/fnc_deleteContestZoneMarkers.sqf index e834165..6bed9ef 100644 --- a/addons/msp/functions/fnc_deleteContestZoneMarkers.sqf +++ b/addons/msp/functions/fnc_deleteContestZoneMarkers.sqf @@ -3,24 +3,17 @@ * [Description] * * Arguments: - * 0: The first argument - * 1: The second argument - * 2: Multiple input types - * 3: Optional input (default: true) - * 4: Optional input with multiple types (default: {true}) - * 5: Not mandatory input (default: nil) + * None * * Return Value: * The return value * * Example: - * ["something", player] call tunres_MSP_fnc_deleteContestZoneMarkers - * - * Public: [Yes/No] + * [] call tunres_MSP_fnc_deleteContestZoneMarkers + */ #include "script_component.hpp" - deleteMarkerLocal QGVAR(contestMarkerMapMax); deleteMarkerLocal QGVAR(contestMarkerMapMin); deleteMarkerLocal QGVAR(contestMarkerMapMinText); From c5ba1b2d8bbd883b908fb7edc87978551bad4669 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 14 Jun 2024 23:40:19 +0300 Subject: [PATCH 104/228] Remove useless variable definition --- addons/respawn/functions/fnc_getTicketCount.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/respawn/functions/fnc_getTicketCount.sqf b/addons/respawn/functions/fnc_getTicketCount.sqf index 7c7dd84..6c9b14d 100644 --- a/addons/respawn/functions/fnc_getTicketCount.sqf +++ b/addons/respawn/functions/fnc_getTicketCount.sqf @@ -15,7 +15,7 @@ #include "script_component.hpp" if (!isServer) exitWith { }; params [["_side", nil, [west]], ["_player", objNull, [objNull]], ["_doHint", false, [true]]]; -private _ticketCount = -1; +private "_ticketCount"; switch (GVAR(respawnType)) do { case 1: { private _hash = GVAR(tickets); From 405cacf6cbd53766de020e94d60a22e9719253f2 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 14 Jun 2024 23:41:49 +0300 Subject: [PATCH 105/228] Tweak some variable usage --- addons/respawn/functions/fnc_doRespawnWave.sqf | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/addons/respawn/functions/fnc_doRespawnWave.sqf b/addons/respawn/functions/fnc_doRespawnWave.sqf index 71f550e..e584c08 100644 --- a/addons/respawn/functions/fnc_doRespawnWave.sqf +++ b/addons/respawn/functions/fnc_doRespawnWave.sqf @@ -14,7 +14,6 @@ */ #include "script_component.hpp" params [["_side", nil, [west]], ["_forceAll", false, [false]]]; -private ["_respawn_waitingarea", "_respawn_gearPath"]; if (!isServer) exitWith { }; @@ -51,16 +50,18 @@ if (count _waitingRespawn > 0) then { //move [{ - _args params ["_side"]; - private _waitingRespawnHash = GVAR(waitingRespawnList); + _args params ["_side", "_waitingRespawnHash", "_waitingRespawnDelayedHash"]; + //private _waitingRespawnHash = GVAR(waitingRespawnList); private _unitList = _waitingRespawnHash get _side; - + private _text = format["respawn unit list: %1",_unitList]; + LOG(_text); //when done, remove and move delayed units to main var if ((count _unitList) isEqualTo 0) exitWith { + LOG("No more units to respawn"); [_handle] call CBA_fnc_removePerFrameHandler; - private _waitingRespawnDelayedHash = GVAR(waitingRespawnDelayedList); + //private _waitingRespawnDelayedHash = GVAR(waitingRespawnDelayedList); private _waitingRespawnDelayed = _waitingRespawnDelayedHash get _side; { @@ -76,9 +77,10 @@ if (count _waitingRespawn > 0) then { }; private _unit = _unitList select 0; - + private _text = format["respawn unit: %1",_unit]; + LOG(_text); [_side, _unit] call FUNC(respawnUnit); - }, 0.2, [ _side]] call CBA_fnc_addPerFrameHandler; + }, 0.2, [_side, _waitingRespawnHash, _waitingRespawnDelayedHash]] call CBA_fnc_addPerFrameHandler; private _waitingRespawnCount = count _waitingRespawn; From 0079b1cc1ca9859339e330ba95207b8705ae9931 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 14 Jun 2024 23:42:06 +0300 Subject: [PATCH 106/228] Update stringtable --- addons/main/Stringtable.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index 0ab1c07..1793663 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -246,6 +246,10 @@ Respawn settings Respawn settings + + You are going to skip the next respawn wave. + You are going to skip the next respawn wave. + From a4d1aa58235d803427657dc602a0cf9e08549633 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 14 Jun 2024 23:44:34 +0300 Subject: [PATCH 107/228] Tweak variable usage --- addons/respawn/functions/fnc_waitingArea.sqf | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 21ce595..0fe4dba 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -24,15 +24,15 @@ private _respawnWaitingarea = (GVAR(waitingArea) get _playerSide) select 1; GVAR(firstMark) = true; [{ - params ["_respawnWaitingarea"]; + params ["_respawnWaitingarea", "_playerSide"]; if !( player getvariable QGVAR(isWaitingRespawn) ) exitWith { [_handle] call CBA_fnc_removePerFrameHandler; }; - private _playerSide = playerSide; + private _playerSkipsWave = player getVariable [QGVAR(skipNextWave), nil]; //Show remaining time private _hashWaitTime = GVAR(nextWaveTimes); private _waitTime = _hashWaitTime get _playerSide; private _remainingWaitTime = round (_waitTime - cba_missiontime); - if (player getVariable [QGVAR(skipNextWave), false]) then { + if (_playerSkipsWave) then { private _hashWaveLenght = GVAR(waveLenghtTimes); private _waveLenght = _hashWaveLenght get _playerSide; _remainingWaitTime = _remainingWaitTime + _waveLenght; @@ -47,14 +47,15 @@ GVAR(firstMark) = true; playSound "TacticalPing"; }; + private _allowRespawn = GVAR(allowRespawn) get _playerSide; private _text = format ["%1", localize "STR_tunres_Respawn_FNC_only_forced_waves"]; - if (_remainingWaitTime >= 0 && { GVAR(allowRespawn) get _playerSide }) then { + if (_remainingWaitTime >= 0 && { _allowRespawn }) then { _text = format ["%2
%1
", ([_remainingWaitTime] call CBA_fnc_formatElapsedTime), localize "STR_tunres_Respawn_FNC_remaining_time"]; } else { - if (player getvariable [QGVAR(isWaitingRespawn), true] && { !(GVAR(forcedRespawn)) } && { !(GVAR(allowRespawn) get _playerSide) }) then { + if (player getvariable [QGVAR(isWaitingRespawn), true] && { !(GVAR(forcedRespawn)) } && { !_allowRespawn }) then { _text = format ["%1", localize "STR_tunres_Respawn_FNC_RespawnDisabled"]; } else { - _text = format ["Something is vevy vevy wrong. time: %1 - allowRespawn: %2 - forced respawn: %3 ", _remainingWaitTime, GVAR(allowRespawn) get playerSid, GVAR(forcedRespawn)]; + _text = format ["Something is vevy vevy wrong. time: %1 - allowRespawn: %2 - forced respawn: %3 ", _remainingWaitTime, _allowRespawn, GVAR(forcedRespawn)]; }; }; @@ -86,4 +87,4 @@ GVAR(firstMark) = true; "Get over here!" call CBA_fnc_notify; }; -}, 1, _respawnWaitingarea] call CBA_fnc_addPerFrameHandler; \ No newline at end of file +}, 1, [_respawnWaitingarea, _playerSide]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file From 0fb608bb0fdd977dd3acf36bcf76e7bb9d88f592 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 14 Jun 2024 23:45:16 +0300 Subject: [PATCH 108/228] Single variable notification --- addons/respawn/functions/fnc_waitingArea.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 0fe4dba..4d345f0 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -38,8 +38,8 @@ GVAR(firstMark) = true; _remainingWaitTime = _remainingWaitTime + _waveLenght; }; - if (GVAR(firstMark) && {_remainingWaitTime <= 20} ) then { - GVAR(firstMark) = false; + if ((GVAR(mark) < 1 && _remainingWaitTime <= 20) || (GVAR(mark) < 2 && _remainingWaitTime <= 10) )then { + INC(GVAR(mark)); playSound "Orange_PhoneCall_Ringtone"; }; From 488cf3892a616f284bd2bc68aad162ddddca124f Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 14 Jun 2024 23:46:53 +0300 Subject: [PATCH 109/228] Single variable notification pt2 --- addons/respawn/functions/fnc_waitingArea.sqf | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 4d345f0..80133fc 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -21,7 +21,6 @@ if (isDedicated || !(_playerSide in [west,east,resistance,civilian]) ) exitWith [player, true, _playerSide] remoteExecCall [QFUNC(updateWaitingRespawnList),2]; private _respawnWaitingarea = (GVAR(waitingArea) get _playerSide) select 1; -GVAR(firstMark) = true; [{ params ["_respawnWaitingarea", "_playerSide"]; From b8d950468f6084c6ac2a57a9282f1ea3f483e717 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 14 Jun 2024 23:48:39 +0300 Subject: [PATCH 110/228] Single variable notification pt2 --- addons/respawn/functions/fnc_waitingArea.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 80133fc..6eb1493 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -21,6 +21,7 @@ if (isDedicated || !(_playerSide in [west,east,resistance,civilian]) ) exitWith [player, true, _playerSide] remoteExecCall [QFUNC(updateWaitingRespawnList),2]; private _respawnWaitingarea = (GVAR(waitingArea) get _playerSide) select 1; +GVAR(mark) = 0; [{ params ["_respawnWaitingarea", "_playerSide"]; From 460f2ec55e6b748898b99d413e7e23d3a4991f11 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 14 Jun 2024 23:49:43 +0300 Subject: [PATCH 111/228] Fix wrong time for delayed respawn --- addons/respawn/functions/fnc_waitingArea.sqf | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 6eb1493..06b150d 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -35,7 +35,6 @@ GVAR(mark) = 0; if (_playerSkipsWave) then { private _hashWaveLenght = GVAR(waveLenghtTimes); private _waveLenght = _hashWaveLenght get _playerSide; - _remainingWaitTime = _remainingWaitTime + _waveLenght; }; if ((GVAR(mark) < 1 && _remainingWaitTime <= 20) || (GVAR(mark) < 2 && _remainingWaitTime <= 10) )then { From 33070f8288819376eaa7f942cc73bbeedb838eeb Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 14 Jun 2024 23:52:14 +0300 Subject: [PATCH 112/228] Fix time for delayed respawn --- addons/respawn/functions/fnc_waitingArea.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 06b150d..4ecd56f 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -35,6 +35,7 @@ GVAR(mark) = 0; if (_playerSkipsWave) then { private _hashWaveLenght = GVAR(waveLenghtTimes); private _waveLenght = _hashWaveLenght get _playerSide; + _remainingWaitTime = _remainingWaitTime + (_waveLenght*60); }; if ((GVAR(mark) < 1 && _remainingWaitTime <= 20) || (GVAR(mark) < 2 && _remainingWaitTime <= 10) )then { From a5ee691709a5bed0505e0430d1da70ac9c56865e Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 15 Jun 2024 14:32:50 +0300 Subject: [PATCH 113/228] Merge functio to one --- addons/respawn/XEH_PREP.hpp | 3 +- .../functions/fnc_setPlayerTicketCount.sqf | 26 ----------- .../functions/fnc_setSideTicketCount.sqf | 25 ----------- .../respawn/functions/fnc_setTicketCount.sqf | 45 +++++++++++++++++++ 4 files changed, 46 insertions(+), 53 deletions(-) delete mode 100644 addons/respawn/functions/fnc_setPlayerTicketCount.sqf delete mode 100644 addons/respawn/functions/fnc_setSideTicketCount.sqf create mode 100644 addons/respawn/functions/fnc_setTicketCount.sqf diff --git a/addons/respawn/XEH_PREP.hpp b/addons/respawn/XEH_PREP.hpp index 068c278..5ae76cc 100644 --- a/addons/respawn/XEH_PREP.hpp +++ b/addons/respawn/XEH_PREP.hpp @@ -27,8 +27,7 @@ PREP(remainingWaitTimeNotification); PREP(removegear); PREP(respawnUnit); PREP(savegear); -PREP(setPlayerTicketCount); -PREP(setSideTicketCount); +PREP(setTicketCount); PREP(startSpectator); PREP(teleportButton); PREP(teleportOnLBSelChanged); diff --git a/addons/respawn/functions/fnc_setPlayerTicketCount.sqf b/addons/respawn/functions/fnc_setPlayerTicketCount.sqf deleted file mode 100644 index 02533f7..0000000 --- a/addons/respawn/functions/fnc_setPlayerTicketCount.sqf +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Author: [Tuntematon] - * [Description] - * - * Arguments: - * 0: Player who to add tickets - * 1: New ticket count - * - * Return Value: - * - * Example: - * [player, 10] call tunres_Respawn_fnc_setPlayerTicketCount - */ -#include "script_component.hpp" -if (!isServer) exitWith { }; -params ["_player", "_count"]; - -if (GVAR(respawnType) isEqualTo 2) then { - private _hash = GVAR(playerTicektsHash); - private _playerUID = getPlayerUID _player; - _hash set [_playerUID, _count]; - breakWith true; -} else { - ERROR("Tried to set player tickest, when not using player tickest"); - breakWith false; -}; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_setSideTicketCount.sqf b/addons/respawn/functions/fnc_setSideTicketCount.sqf deleted file mode 100644 index d193dad..0000000 --- a/addons/respawn/functions/fnc_setSideTicketCount.sqf +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Author: [Tuntematon] - * [Description] - * - * Arguments: - * 0: Side to add tickets - * 1: New ticket count - * - * Return Value: - * True on success - * Example: - * [west, 10] call tunres_Respawn_fnc_setSideTicketCount - */ -#include "script_component.hpp" -if (!isServer) exitWith { }; -params ["_side", "_count"]; - -if (GVAR(respawnType) isEqualTo 1) then { - GVAR(tickets) set [_side, _count]; - publicVariable QGVAR(tickets); - breakWith true; -} else { - ERROR("Tried to set side tickest, when not using side tickest"); - breakWith false; -}; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_setTicketCount.sqf b/addons/respawn/functions/fnc_setTicketCount.sqf new file mode 100644 index 0000000..c861d6c --- /dev/null +++ b/addons/respawn/functions/fnc_setTicketCount.sqf @@ -0,0 +1,45 @@ +/* + * Author: [Tuntematon] + * [Description] + * + * Arguments: + * 0: Side/player to add tickets + * 1: New ticket count + * + * Return Value: + * True on success + * Example: + * [west, 10] call tunres_Respawn_fnc_setTicketCount + */ +#include "script_component.hpp" +if (!isServer) exitWith { }; +params [["_target", nil, [objnull, west]], ["_count", nil, [0]]]; + +switch (GVAR(respawnType)) do { + case 1: { + if (IS_SIDE(_target)) then { + GVAR(tickets) set [_target, _count]; + publicVariable QGVAR(tickets); + breakWith true; + } else { + ERROR("Tried to set side tickest, but did not give side"); + breakWith false; + }; + }; + + case 2: { + if (_target in allPlayers) then { + private _hash = GVAR(playerTicektsHash); + private _playerUID = getPlayerUID _target; + _hash set [_playerUID, _count]; + breakWith true; + } else { + ERROR("Tried to set player tickest, but did not give player"); + breakWith false; + }; + }; + + default { + LOG("Tried to change ticket count, while not using tickets"); + }; +}; \ No newline at end of file From 1ff3285903eb7bb566bf8f5c1c895b5aa2e01948 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 15 Jun 2024 14:34:05 +0300 Subject: [PATCH 114/228] Add check to not run this if not enabled --- addons/respawn/XEH_postInit_client.sqf | 31 ++++++++++++-------------- addons/respawn/XEH_postInit_server.sqf | 5 ++++- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/addons/respawn/XEH_postInit_client.sqf b/addons/respawn/XEH_postInit_client.sqf index cf0abb8..e8e8fb7 100644 --- a/addons/respawn/XEH_postInit_client.sqf +++ b/addons/respawn/XEH_postInit_client.sqf @@ -1,25 +1,21 @@ #include "script_component.hpp" -GVAR(selfTPmenuOpenObj) = objNull; - [{!isNull player && ADDON }, { - if (GVAR(enable)) then { - [] call FUNC(briefingNotes); - }; -}] call CBA_fnc_waitUntilAndExecute; + if (!GVAR(enable)) exitWith { }; // Exit if not enabled + + [] call FUNC(briefingNotes); -if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (IE zeus) + if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (IE zeus) + GVAR(selfTPmenuOpenObj) = objNull; -[{!isNull player }, { if (GVAR(gearscriptType) isEqualTo 2) then { [] call FUNC(savegear); }; private _conditio = { private _return = false; - { private _obj = _x; if (player distance2D _obj < 15) then { @@ -39,6 +35,7 @@ if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (I //Add respawn eh [player, "Respawn", { + params ["_newObject","_oldObject"]; [] call FUNC(removegear); player setVariable [QGVAR(isWaitingRespawn), true, true]; [] call FUNC(waitingArea); @@ -48,13 +45,13 @@ if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (I [player, "killed", { [] call FUNC(onPlayerKilled); }] call CBA_fnc_addBISEventHandler; -}] call CBA_fnc_waitUntilAndExecute; -addMissionEventHandler ["Map", { - params ["_mapIsOpened", "_mapIsForced"]; - [] call FUNC(updateRespawnMarkers); -}]; + addMissionEventHandler ["Map", { + params ["_mapIsOpened", "_mapIsForced"]; + [] call FUNC(updateRespawnMarkers); + }]; -[] call FUNC(killJIP); -[] call FUNC(updateRespawnMarkers); -[] call FUNC(radioSettings_tfar); + [] call FUNC(killJIP); + [] call FUNC(updateRespawnMarkers); + [] call FUNC(radioSettings_tfar); +}] call CBA_fnc_waitUntilAndExecute; \ No newline at end of file diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 01fc548..2b84e40 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -1,5 +1,8 @@ #include "script_component.hpp" + +if (GVAR(enable)) exitwith { }; + if (GVAR(respawnType) isEqualTo 2) then { GVAR(playerTicektsHash) = createHashMap; AAR_UPDATE("west","Player tickets",(round GVAR(initialTicketsWest))); @@ -83,4 +86,4 @@ if ( !isnil "afi_aar2" ) then { }, 10] call CBA_fnc_addPerFrameHandler; }; }] call CBA_fnc_waitUntilAndExecute; -}; \ No newline at end of file +}; From 658e40deb1c2e7b8a9a6d0fb5e6c1cf84979f6cb Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 15 Jun 2024 14:35:47 +0300 Subject: [PATCH 115/228] Add system to handle respawning in respawn No tickets used if respawning in respawn and body will be deleted --- addons/respawn/XEH_postInit_client.sqf | 6 ++++++ addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf | 6 ++++++ addons/respawn/functions/fnc_waitingArea.sqf | 7 +++++++ 3 files changed, 19 insertions(+) diff --git a/addons/respawn/XEH_postInit_client.sqf b/addons/respawn/XEH_postInit_client.sqf index e8e8fb7..c2c5a00 100644 --- a/addons/respawn/XEH_postInit_client.sqf +++ b/addons/respawn/XEH_postInit_client.sqf @@ -43,6 +43,12 @@ ADDON // Add killed EH [player, "killed", { + params ["_unit", "_killer", "_instigator", "_useEffects"]; + _test = format["testi juttu: %1",player getvariable [QGVAR(isWaitingRespawn), false]]; + LOG(_test); + if (player getvariable [QGVAR(isWaitingRespawn), false]) then { + GVAR(uselesBody) = _unit; + }; [] call FUNC(onPlayerKilled); }] call CBA_fnc_addBISEventHandler; diff --git a/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf b/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf index 77c1305..2adbce3 100644 --- a/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf +++ b/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf @@ -29,6 +29,12 @@ if (GVAR(disconnectedPlayers) getOrDefault [_playerUID, false]) exitWith { [5] remoteExecCall ["setPlayerRespawnTime", _player]; }; +//Player was already in respawn area. +if ( _player getvariable [QGVAR(isWaitingRespawn), false]) exitWith { + LOG("Player already waiting respawn"); + [1] remoteExecCall ["setPlayerRespawnTime", _player]; +}; + private _remainingTickets = [_side, _player, false] call FUNC(getTicketCount); if !( _remainingTickets > 0 ) exitWith { diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 4ecd56f..572d44d 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -18,6 +18,13 @@ private _playerSide = playerSide; if (isDedicated || !(_playerSide in [west,east,resistance,civilian]) ) exitWith { }; //tell server to add this player to list +if (isNil QGVAR(uselesBody)) then { + player setVariable [QGVAR(skipNextWave), nil]; +} else { + deleteVehicle GVAR(uselesBody); + GVAR(uselesBody) = nil; +}; + [player, true, _playerSide] remoteExecCall [QFUNC(updateWaitingRespawnList),2]; private _respawnWaitingarea = (GVAR(waitingArea) get _playerSide) select 1; From ad6fba09ae593b02ea5217beb5c84d7d68822058 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 15 Jun 2024 14:38:02 +0300 Subject: [PATCH 116/228] Convert to use stringtable and unified variable naming --- addons/main/Stringtable.xml | 48 +++++++++++++++++-- addons/msp/functions/fnc_addAceActions.sqf | 27 ++++++----- addons/msp/functions/fnc_briefingNotes.sqf | 9 ++-- addons/respawn/TP_dialog.hpp | 14 +++--- .../functions/fnc_addActionsPlayer.sqf | 2 +- .../respawn/functions/fnc_addMainAction.sqf | 6 +-- .../respawn/functions/fnc_briefingNotes.sqf | 7 ++- .../functions/fnc_openTeleportMenu.sqf | 2 +- .../fnc_updateWaitingRespawnList.sqf | 5 +- 9 files changed, 80 insertions(+), 40 deletions(-) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index 1793663..cf1ab0d 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -158,10 +158,6 @@ MSP deployement aborted! MSP deployement aborted! - - MSP contest status: %1 - MSP contest status: %1 - Respawn point Respawn point @@ -250,6 +246,50 @@ You are going to skip the next respawn wave. You are going to skip the next respawn wave. + + Check if MSP is contested + Check if MSP is contested + + + Check contest area + Check contest area + + + Check respawn time until the next wave + Check respawn time until the next wave + + + Pack MSP + Pack MSP + + + Deploy MSP + Deploy MSP + + + Respawn Actions + Respawn Actions + + + Main + Main + + + Respawn settings + Respawn settings + + + Tun - Respawn settings + Tun - Respawn settings + + + MSP is contested + MSP is contested + + + MSP is not contested + MSP is not contested + diff --git a/addons/msp/functions/fnc_addAceActions.sqf b/addons/msp/functions/fnc_addAceActions.sqf index 9c1961d..e80cbb6 100644 --- a/addons/msp/functions/fnc_addAceActions.sqf +++ b/addons/msp/functions/fnc_addAceActions.sqf @@ -17,7 +17,7 @@ if (playerSide isEqualTo sideLogic || !hasInterface) exitWith { }; // Exit if a private _vehicle = GVAR(classnames) get playerSide; -private _actionMain = ["tunres_respawnAction", "Respawn Actions", "\a3\Modules_F_Curator\Data\portraitRespawnTickets_ca.paa", {true}, {true}] call ace_interact_menu_fnc_createAction; +private _actionMain = [QEGVAR(main,respawnAction), localize "STR_tunres_MSP_AceAction_RespawnActions", "\a3\Modules_F_Curator\Data\portraitRespawnTickets_ca.paa", {true}, {true}] call ace_interact_menu_fnc_createAction; [_vehicle, 0, ["ACE_MainActions"], _actionMain] call ace_interact_menu_fnc_addActionToClass; //check that class exist @@ -29,29 +29,32 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { { speed player isEqualTo 0 } && {!((GVAR(deployementStatus) getOrDefault [playerSide, false]))} }; - _createMSP = ["Set up MSP", "Set up MSP", "\a3\3den\data\cfgwaypoints\unload_ca.paa", {[_target, true] call FUNC(startUpdateDeployementStatus);}, _create_condition, {}, [], [0, 0, 0], 2, [false, true, false, false, false]] call ace_interact_menu_fnc_createAction; + _createMSP = ["Set up MSP", localize "STR_tunres_MSP_AceAction_DeployMSP", "\a3\3den\data\cfgwaypoints\unload_ca.paa", {[_target, true] call FUNC(startUpdateDeployementStatus);}, _create_condition, {}, [], [0, 0, 0], 2, [false, true, false, false, false]] call ace_interact_menu_fnc_createAction; //remove msp action private _remove_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide} && {_target getVariable [QGVAR(isMSP), false]} }; - _removeMSP = ["Pack MSP", "Pack MSP", "\a3\3den\data\cfgwaypoints\load_ca.paa", {[_target, false] call FUNC(startUpdateDeployementStatus);}, _remove_condition, {}, [], [0, 0, 0], 2, [false, true, false, false, false]] call ace_interact_menu_fnc_createAction; + _removeMSP = ["Pack MSP", localize "STR_tunres_MSP_AceAction_PackMSP", "\a3\3den\data\cfgwaypoints\load_ca.paa", {[_target, false] call FUNC(startUpdateDeployementStatus);}, _remove_condition, {}, [], [0, 0, 0], 2, [false, true, false, false, false]] call ace_interact_menu_fnc_createAction; private _aliveAndSameSideConditio = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; //check time - private _chekTime = ["Check Respawn Time", "Check Respawn Time", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", EFUNC(respawn,remainingWaitTimeNotification), _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; + private _chekTime = ["Check Respawn Time", localize "STR_tunres_Respawn_AceAction_CheckNextWaveTime", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", EFUNC(respawn,remainingWaitTimeNotification), _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; //Check contest area - private _checkArea = ["Check contest area", "Check contest area", "a3\ui_f\data\igui\cfg\simpletasks\types\map_ca.paa", {[_target] call FUNC(checkContestZoneArea);}, _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; + private _checkArea = ["Check contest area", localize "STR_tunres_MSP_AceAction_CheckMspContestedArea", "a3\ui_f\data\igui\cfg\simpletasks\types\map_ca.paa", {[_target] call FUNC(checkContestZoneArea);}, _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; //Check if contested - private _checkContest= ["Check if MSP contested", "Check if MSP contested", "", {format[localize "STR_tunres_MSP_checkIfMSPContested", _target getVariable [QGVAR(isContested), false]] call cba_fnc_notify}, _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; + private _checkContest= ["Check if MSP contested", localize "STR_tunres_MSP_AceAction_CheckIfMspContested", "", { + private _text = localize (["STR_tunres_MSP_NotContested","STR_tunres_MSP_IsContested"] select (_target getVariable [QGVAR(isContested), false])); + _text call cba_fnc_notify; + }, _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; //Ace inteaction [_vehicle, 1, ["ACE_SelfActions"], _createMSP] call ace_interact_menu_fnc_addActionToClass; - [_vehicle, 0, ["ACE_MainActions","tunres_respawnAction"], _removeMSP] call ace_interact_menu_fnc_addActionToClass; - [_vehicle, 0, ["ACE_MainActions","tunres_respawnAction"], _chekTime] call ace_interact_menu_fnc_addActionToClass; - [_vehicle, 0, ["ACE_MainActions","tunres_respawnAction"], _checkArea] call ace_interact_menu_fnc_addActionToClass; - [_vehicle, 0, ["ACE_MainActions","tunres_respawnAction"], _checkContest] call ace_interact_menu_fnc_addActionToClass; + [_vehicle, 0, ["ACE_MainActions",QEGVAR(main,respawnAction)], _removeMSP] call ace_interact_menu_fnc_addActionToClass; + [_vehicle, 0, ["ACE_MainActions",QEGVAR(main,respawnAction)], _chekTime] call ace_interact_menu_fnc_addActionToClass; + [_vehicle, 0, ["ACE_MainActions",QEGVAR(main,respawnAction)], _checkArea] call ace_interact_menu_fnc_addActionToClass; + [_vehicle, 0, ["ACE_MainActions",QEGVAR(main,respawnAction)], _checkContest] call ace_interact_menu_fnc_addActionToClass; //TP. I hate this system already. [_vehicle, "InitPost", { @@ -60,7 +63,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { private _menu_condition = "alive _target && {_target getVariable [ '"+ QGVAR(isMSP) +"' , false]} && {!(_target getVariable ['tunres_msp_isContested', false])}"; private _tp_conditionText = " private _msp = "+ QGVAR(activeVehicle) +" get playerSide; private _status = _msp getVariable ['tunres_msp_isContested', false]; (_target isNotEqualTo _msp && _obj getVariable [ '"+ QGVAR(isMSP) +"' , false] && !_status) "; - [_entity, _tp_conditionText, localize "STR_tunres_MSP_TpText", false, nil, [playerSide], true, _menu_condition, false, ["ACE_MainActions","tunres_respawnAction"]] call EFUNC(respawn,addCustomTeleporter); + [_entity, _tp_conditionText, localize "STR_tunres_MSP_TpText", false, nil, [playerSide], true, _menu_condition, false, ["ACE_MainActions",QEGVAR(main,respawnAction)]] call EFUNC(respawn,addCustomTeleporter); }, false, [], true] call CBA_fnc_addClassEventHandler; @@ -70,7 +73,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { }; private _remaining_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; _remainingTickets = [localize "STR_tunres_Respawn_CheckTickets", localize "STR_tunres_Respawn_CheckTickets", "\a3\modules_f_curator\data\portraitmissionname_ca.paa", _remaining_action, _remaining_condition] call ace_interact_menu_fnc_createAction; - [_vehicle, 0, ["ACE_MainActions","tunres_respawnAction"], _remainingTickets] call ace_interact_menu_fnc_addActionToClass; + [_vehicle, 0, ["ACE_MainActions",QEGVAR(main,respawnAction)], _remainingTickets] call ace_interact_menu_fnc_addActionToClass; }; } else { private _errorText = format ["(tunres_MSP_fnc_addAceActions) Tried to add following classname as MSP: %1. But it does not exist",_vehicle]; diff --git a/addons/msp/functions/fnc_briefingNotes.sqf b/addons/msp/functions/fnc_briefingNotes.sqf index 4322198..3081e2d 100644 --- a/addons/msp/functions/fnc_briefingNotes.sqf +++ b/addons/msp/functions/fnc_briefingNotes.sqf @@ -43,14 +43,13 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { _text = format ["%1

Powered By TuntematonEngine v%2.%3.%4", _text, MAJOR, MINOR, PATCH]; -//player createDiaryRecord ["Diary",["Respawn info",_text]]; -if !(player diarySubjectExists "Respawn info") then { - player createDiarySubject ["Respawn info","Tun - Respawn info"]; +if !(player diarySubjectExists QEGVAR(main,briefing)) then { + player createDiarySubject [QEGVAR(main,briefing),localize "STR_tunres_Respawn_Briefing_RespawnMainCategory"]; }; -player createDiaryRecord ["Respawn info",[localize "STR_tunres_MSP_Briefing_Category", _text]]; +player createDiaryRecord [QEGVAR(main,briefing),[localize "STR_tunres_MSP_Briefing_Category", _text]]; -player createDiaryRecord ["Respawn info",[localize "STR_tunres_MSP_Briefing_AreaContestCheckCategory", +player createDiaryRecord [QEGVAR(main,briefing),[localize "STR_tunres_MSP_Briefing_AreaContestCheckCategory", localize "STR_tunres_MSP_Briefing_AreaContestCheckText" +"

"+ localize "STR_tunres_MSP_Briefing_EnableAreaContestCheck" +"

"+ localize "STR_tunres_MSP_Briefing_DisableAreaContestCheck" +"" diff --git a/addons/respawn/TP_dialog.hpp b/addons/respawn/TP_dialog.hpp index 35930e3..9c862e4 100644 --- a/addons/respawn/TP_dialog.hpp +++ b/addons/respawn/TP_dialog.hpp @@ -1,12 +1,12 @@ //Exported via Arma Dialog Creator (https://github.com/kayler-renslow/arma-dialog-creator) -class TP_Dialog +class GVAR(TP_Dialog) { idd = 300000; class ControlsBackground { - class tunres_respawn_tp_background : RscBackgroundGUI + class GVAR(tp_background) : RscBackgroundGUI { idc = -1; x = "safeZoneX + safeZoneW * 0.345275"; @@ -19,17 +19,17 @@ class TP_Dialog }; class Controls { - class tunres_respawn_tp_list : RscListBox + class GVAR(tp_list) : RscListBox { idc = 300001; x = "safeZoneX + safeZoneW * 0.365905"; y = "safeZoneY + safeZoneH * 0.291065"; w = "safeZoneW * 0.113465"; h = "safeZoneH * 0.417871"; - onLBSelChanged = "params ['_control', '_selectedIndex']; [_control, _selectedIndex] call tunres_Respawn_fnc_teleportOnLBSelChanged"; + onLBSelChanged = QUOTE(ARR_3(params ['_control','_selectedIndex']; [_control,_selectedIndex] call FUNC(teleportOnLBSelChanged);)); colorBackground[] = {0.302, 0.302, 0.302, 1}; }; - class tunres_respawn_tp_button : RscButton + class GVAR(tp_button) : RscButton { idc = 300002; x = "safeZoneX + safeZoneW * 0.58252"; @@ -44,7 +44,7 @@ class TP_Dialog colorFocused2[] = GUI_BCG_COLOR; }; - class tunres_respawn_tp_header : RscTitle + class GVAR(tp_header) : RscTitle { idc = -1; x = "safeZoneX + safeZoneW * 0.489685"; @@ -60,7 +60,7 @@ class TP_Dialog shadow = 2; }; - class tunres_respawn_tp_minimap : RscMapControl + class GVAR(tp_minimap) : RscMapControl { idc = 300003; x = "safeZoneX + safeZoneW * 0.489685"; diff --git a/addons/respawn/functions/fnc_addActionsPlayer.sqf b/addons/respawn/functions/fnc_addActionsPlayer.sqf index 336aada..29e4b89 100644 --- a/addons/respawn/functions/fnc_addActionsPlayer.sqf +++ b/addons/respawn/functions/fnc_addActionsPlayer.sqf @@ -22,7 +22,7 @@ if (GVAR(allowCheckTicketsBase)) then { }; //private _timer_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; -private _chekTime = ["Check Respawn Time", "Check Respawn Time", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", FUNC(remainingWaitTimeNotification), {true}] call ace_interact_menu_fnc_createAction; +private _chekTime = ["Check Respawn Time", localize "STR_tunres_Respawn_AceAction_CheckNextWaveTime", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", FUNC(remainingWaitTimeNotification), {true}] call ace_interact_menu_fnc_createAction; [_object, 0, _actionPath, _chekTime] call ace_interact_menu_fnc_addActionToObject; // Add tp action diff --git a/addons/respawn/functions/fnc_addMainAction.sqf b/addons/respawn/functions/fnc_addMainAction.sqf index a1873ae..7a7fd56 100644 --- a/addons/respawn/functions/fnc_addMainAction.sqf +++ b/addons/respawn/functions/fnc_addMainAction.sqf @@ -21,14 +21,14 @@ private _parentAction = [_object] call FUNC(getParentAction); if (count _parentAction isEqualTo 0) then { private _offSet = [_object] call FUNC(getOffSet); _parentAction = ["tunres_respawn_BaseAceAction"]; - private _actionBase = ["tunres_respawn_BaseAceAction", "Main", "", {true}, {true}, nil, nil, _offSet, 8] call ace_interact_menu_fnc_createAction; + private _actionBase = ["tunres_respawn_BaseAceAction", localize "STR_tunres_Respawn_AceAction_Main", "", {true}, {true}, nil, nil, _offSet, 8] call ace_interact_menu_fnc_createAction; [_object, 0, [], _actionBase] call ace_interact_menu_fnc_addActionToObject; }; -private _actionPath = _parentAction + ["tunres_respawnAction"]; +private _actionPath = _parentAction + [QEGVAR(main,respawnAction)]; //Add main action -private _actionMain = ["tunres_respawnAction", "Respawn Actions", "\a3\modules_f\data\portraitrespawn_ca.paa", {true}, {true}] call ace_interact_menu_fnc_createAction; +private _actionMain = [QEGVAR(main,respawnAction), localize "STR_tunres_MSP_AceAction_RespawnActions", "\a3\modules_f\data\portraitrespawn_ca.paa", {true}, {true}] call ace_interact_menu_fnc_createAction; [_object, 0, _parentAction, _actionMain] call ace_interact_menu_fnc_addActionToObject; _actionPath \ No newline at end of file diff --git a/addons/respawn/functions/fnc_briefingNotes.sqf b/addons/respawn/functions/fnc_briefingNotes.sqf index bc4b7f7..eb011d0 100644 --- a/addons/respawn/functions/fnc_briefingNotes.sqf +++ b/addons/respawn/functions/fnc_briefingNotes.sqf @@ -99,9 +99,8 @@ if (GVAR(killJIP)) then { _text = _text + "

" + localize "STR_tunres_Respawn_Briefing_teleportNetwork"; _text = format ["%1

Powered By TuntematonEngine v%2.%3.%4", _text, MAJOR, MINOR, PATCH]; -//player createDiaryRecord ["Diary",["Respawn info",_text]]; -if !(player diarySubjectExists "Respawn info") then { - player createDiarySubject ["Respawn info","Tun - Respawn info"]; +if !(player diarySubjectExists QEGVAR(main,briefing)) then { + player createDiarySubject [QEGVAR(main,briefing),localize "STR_tunres_Respawn_Briefing_RespawnMainCategory"]; }; -player createDiaryRecord ["Respawn info",["Respawn info", _text]]; \ No newline at end of file +player createDiaryRecord [QEGVAR(main,briefing),[localize "STR_tunres_Respawn_Briefing_RespawnInfoTab", _text]]; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_openTeleportMenu.sqf b/addons/respawn/functions/fnc_openTeleportMenu.sqf index d57bcdd..d6f77ba 100644 --- a/addons/respawn/functions/fnc_openTeleportMenu.sqf +++ b/addons/respawn/functions/fnc_openTeleportMenu.sqf @@ -13,7 +13,7 @@ */ #include "script_component.hpp" params ["_target"]; -createDialog "TP_Dialog"; +createDialog QGVAR(TP_Dialog); [] call FUNC(updateRespawnMarkers); diff --git a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf index b2e2660..2cd0591 100644 --- a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf +++ b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf @@ -21,10 +21,9 @@ if (isnull _player || !(_player in allPlayers) || !alive _player ) exitWith { LOG("Tried to add unit what is not there"); }; -private _unitSkipsNextWave = [_player, _side] call FUNC(delayedRespawn); -private _unitListHash = [GVAR(waitingRespawnDelayedList), GVAR(waitingRespawnList)] select _unitSkipsNextWave; +private _unitSkipsNextWave = _player getVariable [QGVAR(skipNextWave), [_player, _side] call FUNC(delayedRespawn)]; +private _unitListHash = [GVAR(waitingRespawnList), GVAR(waitingRespawnDelayedList)] select _unitSkipsNextWave; private _unitList = _unitListHash get _side; -FILTER(_unitList,(!isnull _x && _x in allPlayers && alive _x )); if (_addPlayer) then { _unitList pushBackUnique _player; From 6802dd682c92cd168f416728ff7fbbc48901fd74 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 15 Jun 2024 14:40:05 +0300 Subject: [PATCH 117/228] Cleaning --- addons/msp/XEH_preInit.sqf | 2 +- addons/msp/functions/fnc_startContestedChecks.sqf | 10 +++++----- addons/respawn/config.cpp | 1 - addons/respawn/functions/fnc_doRespawnWave.sqf | 11 ++--------- addons/respawn/functions/fnc_respawnUnit.sqf | 3 ++- .../functions/fnc_updateWaitingRespawnList.sqf | 7 +------ 6 files changed, 11 insertions(+), 23 deletions(-) diff --git a/addons/msp/XEH_preInit.sqf b/addons/msp/XEH_preInit.sqf index 6c4baed..e5bb321 100644 --- a/addons/msp/XEH_preInit.sqf +++ b/addons/msp/XEH_preInit.sqf @@ -11,7 +11,7 @@ GVAR(classnames) = createHashMap; //reportEnemiesInterval 0 - reportEnemiesRange 1 - contestedRadiusMax 2 - contestedRadiusMin 3 - contestedCheckInterval 4 - reportEnemiesEnabled 5 GVAR(contestValues) = createHashMapFromArray [[west,[0,0,0,0,0,false]],[east,[0,0,0,0,0,false]],[resistance,[0,0,0,0,0,false]],[civilian,[0,0,0,0,0,false]]]; GVAR(contestHandles) = createHashMap; -GVAR(contestCheckRunning) = createHashMapFromArray [[west,false],[east,false],[resistance,false],[civilian,false]]; +GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; [ QGVAR(enable), diff --git a/addons/msp/functions/fnc_startContestedChecks.sqf b/addons/msp/functions/fnc_startContestedChecks.sqf index e055435..4796c01 100644 --- a/addons/msp/functions/fnc_startContestedChecks.sqf +++ b/addons/msp/functions/fnc_startContestedChecks.sqf @@ -24,12 +24,12 @@ if (_start) then { }; private _values = GVAR(contestValues) get _side; - private _reportEnemiesInterval = _values param [0]; - private _contestedCheckInterval = _values param [4]; - private _reportEnemiesEnabled = _values param [5]; + private _reportEnemiesInterval = _values select 0; + private _contestedCheckInterval = _values select 4; + private _reportEnemiesEnabled = _values select 5; private _handleContest = [{ - params["_side"]; + _args params["_side"]; if !(GVAR(disableContestedCheck)) then { private _mspDeployementStatus = GVAR(deployementStatus) get _side; if (_mspDeployementStatus) then { @@ -44,7 +44,7 @@ if (_start) then { private _handleReport = nil; if (_reportEnemiesEnabled) then { _handleReport = [{ - params["_side"]; + _args params["_side"]; //So that this does not run, when contest update is offline if !(GVAR(disableContestedCheck)) then { private _side = _args; diff --git a/addons/respawn/config.cpp b/addons/respawn/config.cpp index 7e70f03..691a287 100644 --- a/addons/respawn/config.cpp +++ b/addons/respawn/config.cpp @@ -29,7 +29,6 @@ class CfgFactionClasses #include "TP_dialog.hpp" #include "CfgVehicles.hpp" - class CfgRespawnTemplates { class ADDON { displayName = "Tun wave respawn"; diff --git a/addons/respawn/functions/fnc_doRespawnWave.sqf b/addons/respawn/functions/fnc_doRespawnWave.sqf index e584c08..5e5c3ea 100644 --- a/addons/respawn/functions/fnc_doRespawnWave.sqf +++ b/addons/respawn/functions/fnc_doRespawnWave.sqf @@ -51,10 +51,9 @@ if (count _waitingRespawn > 0) then { //move [{ _args params ["_side", "_waitingRespawnHash", "_waitingRespawnDelayedHash"]; - //private _waitingRespawnHash = GVAR(waitingRespawnList); + private _unitList = _waitingRespawnHash get _side; - private _text = format["respawn unit list: %1",_unitList]; - LOG(_text); + //when done, remove and move delayed units to main var if ((count _unitList) isEqualTo 0) exitWith { @@ -71,9 +70,6 @@ if (count _waitingRespawn > 0) then { _waitingRespawnHash set [_side, _waitingRespawnDelayed]; _waitingRespawnDelayedHash set [_side, []]; - - publicVariable QGVAR(waitingRespawnList); - publicVariable QGVAR(waitingRespawnDelayedList); }; private _unit = _unitList select 0; @@ -82,7 +78,6 @@ if (count _waitingRespawn > 0) then { [_side, _unit] call FUNC(respawnUnit); }, 0.2, [_side, _waitingRespawnHash, _waitingRespawnDelayedHash]] call CBA_fnc_addPerFrameHandler; - private _waitingRespawnCount = count _waitingRespawn; _totalRespawnCount = _totalRespawnCount + _waitingRespawnCount; _totalRespawnCountHash set [_side, _totalRespawnCount]; @@ -107,8 +102,6 @@ if (count _waitingRespawn > 0) then { } forEach _waitingRespawnDelayed; _waitingRespawnHash set [_side, _waitingRespawnDelayed]; _waitingRespawnDelayedHash set [_side, []]; - publicVariable QGVAR(waitingRespawnList); - publicVariable QGVAR(waitingRespawnDelayedList); }; }; diff --git a/addons/respawn/functions/fnc_respawnUnit.sqf b/addons/respawn/functions/fnc_respawnUnit.sqf index 204f3b6..89324c0 100644 --- a/addons/respawn/functions/fnc_respawnUnit.sqf +++ b/addons/respawn/functions/fnc_respawnUnit.sqf @@ -17,9 +17,10 @@ params [["_side", nil, [west]], ["_unit", objnull, [objnull]]]; private _respawnPointsHash = GVAR(respawnPointsHash); private _respawnPosition = getMarkerPos ((_respawnPointsHash get _side) select 0); -[_unit, false, _side, false] call FUNC(updateWaitingRespawnList); +[_unit, false, _side] call FUNC(updateWaitingRespawnList); _unit setVariable [QGVAR(isWaitingRespawn), false, true]; + private _text = localize "STR_tunres_Respawn_FNC_moveRespawnText"; [_unit, _respawnPosition, _text, 20, true] call FUNC(teleportUnit); diff --git a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf index 2cd0591..acc4c88 100644 --- a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf +++ b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf @@ -6,7 +6,6 @@ * 0: unit to add or remove * 1: true to add, false to remove * 2: Unit side - * 3: true/false to publicVariable unit list * * Return Value: * none @@ -15,7 +14,7 @@ * [player] call tunres_Respawn_fnc_updateWaitingRespawnList */ #include "script_component.hpp" -params [["_player", nil, [objNull]], ["_addPlayer", nil, [false]], ["_side", nil, [west]], ["_doPublicVar", true, [true]]]; +params [["_player", nil, [objNull]], ["_addPlayer", nil, [false]], ["_side", nil, [west]]]; if (isnull _player || !(_player in allPlayers) || !alive _player ) exitWith { LOG("Tried to add unit what is not there"); @@ -33,7 +32,3 @@ if (_addPlayer) then { _unitListHash set [_side, _unitList]; -// //this is for not broadcasting on every player on respawn wave. -// if (_doPublicVar) then { -// publicVariable [QGVAR(waitingRespawnDelayedList), QGVAR(waitingRespawnList)] select _unitSkipsNextWave; -// }; \ No newline at end of file From a2a949dbac8675b8ce9c25e464ff0a3f23794941 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 15 Jun 2024 14:40:30 +0300 Subject: [PATCH 118/228] Add filttering both respawn list --- addons/respawn/functions/fnc_updateWaitingRespawnList.sqf | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf index acc4c88..988976a 100644 --- a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf +++ b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf @@ -32,3 +32,9 @@ if (_addPlayer) then { _unitListHash set [_side, _unitList]; +{ + private _hash = _x; + private _unitList = _hash get _side; + FILTER(_unitList,(!isnull _x && _x in allPlayers && alive _x )); + _hash set [_side, _unitList]; +} forEach [GVAR(waitingRespawnList), GVAR(waitingRespawnDelayedList)]; \ No newline at end of file From e0ddf490756d9a6795a4c648d7eb3f2d86f169fb Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 15 Jun 2024 14:41:32 +0300 Subject: [PATCH 119/228] Fix god mode during TP/Respawn --- addons/respawn/functions/fnc_teleportButton.sqf | 2 +- addons/respawn/functions/fnc_teleportUnit.sqf | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/respawn/functions/fnc_teleportButton.sqf b/addons/respawn/functions/fnc_teleportButton.sqf index 52fa331..2f6fa2d 100644 --- a/addons/respawn/functions/fnc_teleportButton.sqf +++ b/addons/respawn/functions/fnc_teleportButton.sqf @@ -34,7 +34,7 @@ private _text = format["%1 %2", localize "STR_tunres_Respawn_Teleporting", _tele if (_teleportConditio) then { closeDialog 2; GVAR(tpMenuOpenedFrom) = objNull; - [player, _destination, _text, 10, true] call FUNC(teleportUnit); + [player, _destination, _text, 10, true, 15] call FUNC(teleportUnit); } else { (localize "STR_tunres_Respawn_Teleport_Disabled") call CBA_fnc_notify; }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_teleportUnit.sqf b/addons/respawn/functions/fnc_teleportUnit.sqf index e74eda9..f39ff6a 100644 --- a/addons/respawn/functions/fnc_teleportUnit.sqf +++ b/addons/respawn/functions/fnc_teleportUnit.sqf @@ -20,15 +20,15 @@ params [["_unit", objNull, [objNull]], ["_destination", [0,0,0], [[]]], ["_text", "", [""]], ["_range", 10, [0]], - ["_godMode", false, [false], - ["_godModeLenght", 30, [0]]] + ["_godMode", false, [false]], + ["_godModeLenght", 30, [0]] ]; if (_godMode) then { - player allowDamage true; + player allowDamage false; LOG("Enable god mode"); [{ - player allowDamage false; + player allowDamage true; LOG("Disable god mode"); }, [], _godModeLenght] call CBA_fnc_waitAndExecute; }; From 8a8db7476ec603692a8a869cc3c44f1c4effd394 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 15 Jun 2024 14:43:12 +0300 Subject: [PATCH 120/228] Cleaned variables and info text system --- addons/respawn/functions/fnc_waitingArea.sqf | 39 ++++++++++---------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 572d44d..1cee2b0 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -17,6 +17,8 @@ private _playerSide = playerSide; if (isDedicated || !(_playerSide in [west,east,resistance,civilian]) ) exitWith { }; +LOG("Start waiting area"); + //tell server to add this player to list if (isNil QGVAR(uselesBody)) then { player setVariable [QGVAR(skipNextWave), nil]; @@ -28,12 +30,21 @@ if (isNil QGVAR(uselesBody)) then { [player, true, _playerSide] remoteExecCall [QFUNC(updateWaitingRespawnList),2]; private _respawnWaitingarea = (GVAR(waitingArea) get _playerSide) select 1; +private _waitingRange = GVAR(waitingAreaRange); +private _respawnType = GVAR(respawnType); GVAR(mark) = 0; [{ - params ["_respawnWaitingarea", "_playerSide"]; - if !( player getvariable QGVAR(isWaitingRespawn) ) exitWith { [_handle] call CBA_fnc_removePerFrameHandler; }; + _args params ["_respawnWaitingarea", "_playerSide", "_waitingRange", "_respawnType"]; + if !( player getvariable QGVAR(isWaitingRespawn) ) exitWith { + [_handle] call CBA_fnc_removePerFrameHandler; + }; + private _playerSkipsWave = player getVariable [QGVAR(skipNextWave), nil]; + + //Skip respawn due to slow variable init + if (isNil "_playerSkipsWave") exitWith {}; + //Show remaining time private _hashWaitTime = GVAR(nextWaveTimes); private _waitTime = _hashWaitTime get _playerSide; @@ -66,32 +77,22 @@ GVAR(mark) = 0; }; }; - private _usesTickets = false; - private "_tickets"; - private "_ticketsTypeText"; - if (GVAR(respawnType) isEqualTo 1) then { - _tickets = GVAR(tickets) get _playerSide; - _ticketsTypeText = localize "STR_tunres_Respawan_RemainingTicketsSide"; - _usesTickets = true; - } else { - if (GVAR(respawnType) isEqualTo 2) then { - _tickets = GVAR(tickets) get _playerSide; - _ticketsTypeText = localize "STR_tunres_Respawan_RemainingTicketsPlayer"; - _usesTickets = true; - }; + if (_playerSkipsWave) then { + _text = format["%1
%2", _text, localize "STR_tunres_Respawn_FNC_playerSkipsWave"]; }; - if (_usesTickets) then { + if (_respawnType in [1,2]) then { + private _tickets = GVAR(tickets) get _playerSide; + DEC(_respawnType); // so it works on select + private _ticketsTypeText = localize (["STR_tunres_Respawan_RemainingTicketsSide", "STR_tunres_Respawan_RemainingTicketsPlayer"] select _respawnType); _text = format["%1
%2 %3", _text, _ticketsTypeText, _tickets]; }; [_text,0,0,1,0] spawn BIS_fnc_dynamicText; //make sure that player is still in area - private _waitingRange = GVAR(waitingAreaRange); if !(player inArea [_respawnWaitingarea, _waitingRange, _waitingRange, 0, false]) then { player setPos ([_respawnWaitingarea, (_waitingRange / 2)] call CBA_fnc_randPos); "Get over here!" call CBA_fnc_notify; }; - -}, 1, [_respawnWaitingarea, _playerSide]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file +}, 1, [_respawnWaitingarea, _playerSide, _waitingRange,_respawnType]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file From 0f12cec4c46659a543be3ed332ec63f9a5cf89bc Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 15 Jun 2024 14:44:58 +0300 Subject: [PATCH 121/228] Template is not needed --- template/addon_template/$PBOPREFIX$ | 1 - template/addon_template/CfgEventHandlers.hpp | 19 ------------------- template/addon_template/XEH_PREP.hpp | 1 - template/addon_template/XEH_postInit.sqf | 1 - .../addon_template/XEH_postInit_client.sqf | 4 ---- template/addon_template/XEH_preInit.sqf | 8 -------- .../addon_template/XEH_preInit_server.sqf | 2 -- template/addon_template/XEH_preStart.sqf | 2 -- template/addon_template/config.cpp | 17 ----------------- .../functions/fnc_printAddonSetupReminder.sqf | 5 ----- .../functions/script_component.hpp | 1 - template/addon_template/script_component.hpp | 15 --------------- 12 files changed, 76 deletions(-) delete mode 100644 template/addon_template/$PBOPREFIX$ delete mode 100644 template/addon_template/CfgEventHandlers.hpp delete mode 100644 template/addon_template/XEH_PREP.hpp delete mode 100644 template/addon_template/XEH_postInit.sqf delete mode 100644 template/addon_template/XEH_postInit_client.sqf delete mode 100644 template/addon_template/XEH_preInit.sqf delete mode 100644 template/addon_template/XEH_preInit_server.sqf delete mode 100644 template/addon_template/XEH_preStart.sqf delete mode 100644 template/addon_template/config.cpp delete mode 100644 template/addon_template/functions/fnc_printAddonSetupReminder.sqf delete mode 100644 template/addon_template/functions/script_component.hpp delete mode 100644 template/addon_template/script_component.hpp diff --git a/template/addon_template/$PBOPREFIX$ b/template/addon_template/$PBOPREFIX$ deleted file mode 100644 index c4f5b54..0000000 --- a/template/addon_template/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -x\TunRes\addons\addon_template diff --git a/template/addon_template/CfgEventHandlers.hpp b/template/addon_template/CfgEventHandlers.hpp deleted file mode 100644 index 67fa1ae..0000000 --- a/template/addon_template/CfgEventHandlers.hpp +++ /dev/null @@ -1,19 +0,0 @@ -class Extended_PreStart_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_preStart)); - }; -}; - -class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_preInit)); - serverInit = QUOTE(call COMPILE_FILE(XEH_preInit_server)); - }; -}; - -class Extended_PostInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_postInit)); - clientInit = QUOTE(call COMPILE_FILE(XEH_postInit_client)); - }; -}; diff --git a/template/addon_template/XEH_PREP.hpp b/template/addon_template/XEH_PREP.hpp deleted file mode 100644 index 24fa227..0000000 --- a/template/addon_template/XEH_PREP.hpp +++ /dev/null @@ -1 +0,0 @@ -PREP(printAddonSetupReminder); diff --git a/template/addon_template/XEH_postInit.sqf b/template/addon_template/XEH_postInit.sqf deleted file mode 100644 index 421c54b..0000000 --- a/template/addon_template/XEH_postInit.sqf +++ /dev/null @@ -1 +0,0 @@ -#include "script_component.hpp" diff --git a/template/addon_template/XEH_postInit_client.sqf b/template/addon_template/XEH_postInit_client.sqf deleted file mode 100644 index 90929f0..0000000 --- a/template/addon_template/XEH_postInit_client.sqf +++ /dev/null @@ -1,4 +0,0 @@ -#include "script_component.hpp" -// only executed on client - -call FUNC(printAddonSetupReminder); diff --git a/template/addon_template/XEH_preInit.sqf b/template/addon_template/XEH_preInit.sqf deleted file mode 100644 index ecb5d0c..0000000 --- a/template/addon_template/XEH_preInit.sqf +++ /dev/null @@ -1,8 +0,0 @@ -#include "script_component.hpp" -ADDON = false; - -PREP_RECOMPILE_START; -#include "XEH_PREP.hpp" -PREP_RECOMPILE_END; - -ADDON = true; diff --git a/template/addon_template/XEH_preInit_server.sqf b/template/addon_template/XEH_preInit_server.sqf deleted file mode 100644 index ea99354..0000000 --- a/template/addon_template/XEH_preInit_server.sqf +++ /dev/null @@ -1,2 +0,0 @@ -#include "script_component.hpp" -//only executed on server diff --git a/template/addon_template/XEH_preStart.sqf b/template/addon_template/XEH_preStart.sqf deleted file mode 100644 index a51262a..0000000 --- a/template/addon_template/XEH_preStart.sqf +++ /dev/null @@ -1,2 +0,0 @@ -#include "script_component.hpp" -#include "XEH_PREP.hpp" diff --git a/template/addon_template/config.cpp b/template/addon_template/config.cpp deleted file mode 100644 index 0f52a03..0000000 --- a/template/addon_template/config.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "script_component.hpp" - -// information on this addon specifically -class CfgPatches { - class ADDON { - name = COMPONENT_NAME; - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"TunRes_main"}; - authors[] = {"Your Name", "Other Author"}; // sub array of authors, considered for the specific addon, can be removed or left empty {} - VERSION_CONFIG; - }; -}; - -// configs go here -#include "CfgEventHandlers.hpp" diff --git a/template/addon_template/functions/fnc_printAddonSetupReminder.sqf b/template/addon_template/functions/fnc_printAddonSetupReminder.sqf deleted file mode 100644 index 5a5ac38..0000000 --- a/template/addon_template/functions/fnc_printAddonSetupReminder.sqf +++ /dev/null @@ -1,5 +0,0 @@ -#include "script_component.hpp" - -// simple function to print name of addon to systemChat using the ADDON macro - -systemChat format ["Don't forget to set up your new template addon '%1'!", 'ADDON']; diff --git a/template/addon_template/functions/script_component.hpp b/template/addon_template/functions/script_component.hpp deleted file mode 100644 index d42d310..0000000 --- a/template/addon_template/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\x\TunRes\addons\addon_template\script_component.hpp" \ No newline at end of file diff --git a/template/addon_template/script_component.hpp b/template/addon_template/script_component.hpp deleted file mode 100644 index a659c5f..0000000 --- a/template/addon_template/script_component.hpp +++ /dev/null @@ -1,15 +0,0 @@ -#define COMPONENT addon_template -#define COMPONENT_BEAUTIFIED Addon_Template -#include "\x\TunRes\addons\main\script_mod.hpp" - -// #define DEBUG_MODE_FULL -#define DISABLE_COMPILE_CACHE - -#ifdef DEBUG_ENABLED_ADDON_TEMPLATE - #define DEBUG_MODE_FULL -#endif - #ifdef DEBUG_SETTINGS_ADDON_TEMPLATE - #define DEBUG_SETTINGS DEBUG_SETTINGS_ADDON_TEMPLATE -#endif - -#include "\x\TunRes\addons\main\script_macros.hpp" From 5b3bde8a5a77142a56285e17587d1a628c2469ae Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 15 Jun 2024 14:47:05 +0300 Subject: [PATCH 122/228] Update .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 52aaca3..99ceb87 100644 --- a/.gitignore +++ b/.gitignore @@ -19,9 +19,10 @@ extensions/vcproj32/* extensions/vcproj64/* hemtt hemtt.exe +pohja.sqf release/* releases/* sqfvm.exe texHeaders.bin Thumbs.db -tools/temp +tools/temp \ No newline at end of file From b791d7afcf6674196ab887e22584bf68af9a874f Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 15 Jun 2024 14:48:32 +0300 Subject: [PATCH 123/228] Delete addons/msp/functions/pohja.sqf --- addons/msp/functions/pohja.sqf | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 addons/msp/functions/pohja.sqf diff --git a/addons/msp/functions/pohja.sqf b/addons/msp/functions/pohja.sqf deleted file mode 100644 index d5935f3..0000000 --- a/addons/msp/functions/pohja.sqf +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Author: [Tuntematon] - * [Description] - * - * Arguments: - * 0: The first argument - * 1: The second argument - * 2: Multiple input types - * 3: Optional input (default: true) - * 4: Optional input with multiple types (default: {true}) - * 5: Not mandatory input (default: nil) - * - * Return Value: - * The return value - * - * Example: - * ["something", player] call tunres_MSP_fnc_imanexample - * - * Public: [Yes/No] - */ -#include "script_component.hpp" From a1737d66562a908810ef9dc9a37f097636730fce Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 15 Jun 2024 14:48:45 +0300 Subject: [PATCH 124/228] Delete addons/respawn/functions/pohja.sqf --- addons/respawn/functions/pohja.sqf | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 addons/respawn/functions/pohja.sqf diff --git a/addons/respawn/functions/pohja.sqf b/addons/respawn/functions/pohja.sqf deleted file mode 100644 index c6f56eb..0000000 --- a/addons/respawn/functions/pohja.sqf +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Author: [Tuntematon] - * [Description] - * - * Arguments: - * 0: The first argument - * 1: The second argument - * 2: Multiple input types - * 3: Optional input (default: true) - * 4: Optional input with multiple types (default: {true}) - * 5: Not mandatory input (default: nil) - * - * Return Value: - * The return value - * - * Example: - * ["something", player] call tunres_Respawn_fnc_imanexample - * - * Public: [Yes/No] - */ -#include "script_component.hpp" From 7772861018c1e5413f7a588dffe1445fd9d487f0 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 15 Jun 2024 17:56:45 +0300 Subject: [PATCH 125/228] Update --- .gitignore | 1 + .hemtt/project.toml | 7 ++----- addons/main/script_version.hpp | 2 +- build.bat | 2 +- build_release.bat | 2 +- buld_test.bat | 3 +-- mod.cpp | 4 ++-- 7 files changed, 9 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 99ceb87..4633874 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ pohja.sqf release/* releases/* sqfvm.exe +template/* texHeaders.bin Thumbs.db tools/temp \ No newline at end of file diff --git a/.hemtt/project.toml b/.hemtt/project.toml index e277670..1d669c1 100644 --- a/.hemtt/project.toml +++ b/.hemtt/project.toml @@ -10,7 +10,7 @@ include = [ ] [version] -git_hash = 0 +git_hash = 8 [binarize] enabled = true @@ -25,11 +25,8 @@ workshop = [ "894678801", # TFAR ] parameters = [ - "-skipIntro", # These parameters are passed to the Arma 3 executable - "-noSplash", # They do not need to be added to your list - "-showScriptErrors", # You can add additional parameters here - "-debug", "-filePatching", + "-noPause", "C:\\Users\\mikal\\Documents\\Arma 3 - Other Profiles\\Tuntematon\\missions\\TUN_Respawn_System.Stratis\\mission.sqm", # Launch into existing Editor Mission - \\ needed ] diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index 3dae7be..cb62fcf 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 1 #define MINOR 8 #define PATCH 0 -#define BUILD 20231227 \ No newline at end of file +#define BUILD 0 \ No newline at end of file diff --git a/build.bat b/build.bat index 7ad855a..4ee59d6 100644 --- a/build.bat +++ b/build.bat @@ -1,3 +1,3 @@ @echo off -hemtt build --no-bin -vv +hemtt build -vv pause diff --git a/build_release.bat b/build_release.bat index a45dc46..08e138d 100644 --- a/build_release.bat +++ b/build_release.bat @@ -1,3 +1,3 @@ @echo off -hemtt.exe release --no-bin -vv +hemtt.exe release -vv pause diff --git a/buld_test.bat b/buld_test.bat index 96b1793..a84832a 100644 --- a/buld_test.bat +++ b/buld_test.bat @@ -1,3 +1,2 @@ @echo off -hemtt launch -pause \ No newline at end of file +hemtt launch \ No newline at end of file diff --git a/mod.cpp b/mod.cpp index 0583a3a..07f849f 100644 --- a/mod.cpp +++ b/mod.cpp @@ -10,8 +10,8 @@ hidePicture = "false"; // Hide the extension menu logoSmall = "data\afilogo.paa"; // Display next to the item added by the mod 64x64 logo = "data\afilogo.paa"; // Logo displayed in the main menu 128x128 logoOver = "data\afilogo.paa"; // When the mouse is over, in the main menu 128x128 -tooltip = "Customisable wave based respawn system"; -tooltipOwned = "Customisable wave based respawn system"; // Tool tip displayed when the mouse is left over, in the main menu +tooltip = "Customizable wave-based respawn system"; +tooltipOwned = "Customizable wave-based respawn system"; // Tool tip displayed when the mouse is left over, in the main menu overview = "Tun Respawn System v0.0.0"; // Overview text, displayed from the extension menu description = "It's unclear where this will show"; // Probably in context with action action = "https://github.com/tuntematonjr/Tun-Respawn-System"; // Website URL, that can accessed from the expansions menu From f8212e9284acc143a8faf9051f1d2bede258da4d Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 16 Jun 2024 11:58:49 +0300 Subject: [PATCH 126/228] add fnc to clients get tickets remaining --- addons/respawn/XEH_PREP.hpp | 1 + .../functions/fnc_getTicketCountClient.sqf | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 addons/respawn/functions/fnc_getTicketCountClient.sqf diff --git a/addons/respawn/XEH_PREP.hpp b/addons/respawn/XEH_PREP.hpp index 5ae76cc..a98960a 100644 --- a/addons/respawn/XEH_PREP.hpp +++ b/addons/respawn/XEH_PREP.hpp @@ -16,6 +16,7 @@ PREP(forceRespawnWave); PREP(getOffSet); PREP(getParentAction); PREP(getTicketCount); +PREP(getTicketCountClient); PREP(killJIP); PREP(moduleRespawnPoint); PREP(moduleTeleport); diff --git a/addons/respawn/functions/fnc_getTicketCountClient.sqf b/addons/respawn/functions/fnc_getTicketCountClient.sqf new file mode 100644 index 0000000..0903fe2 --- /dev/null +++ b/addons/respawn/functions/fnc_getTicketCountClient.sqf @@ -0,0 +1,38 @@ +/* + * Author: [Tuntematon] + * [Description] + * + * Arguments: + * 0: Do hint (optional) + * + * Return Value: + * ticket count + * Example: + * [false] call tunres_Respawn_fnc_getTicketCountClient + */ +#include "script_component.hpp" +if (!hasInterface) exitWith { }; +params [["_doHint", false, [true]]]; +private _side = playerSide; + +GVAR(playerTickets) + +private _ticketCount = switch (GVAR(respawnType)) do { + case 1: { //Side ticket + private _hash = GVAR(tickets); + _hash get _side; + }; + case 2: { // Player tickets + missionNamespace getVariable [QGVAR(playerTickets), GVAR(tickets) get _side]; + }; + default { + breakWith "Not using tickest"; + }; +}; + +if (_doHint && !isNull player) then { + private _text = format["%1 %2",localize "STR_tunres_Respawn_RemainingTicketsText", str _ticketCount]; + _text remoteExecCall ["CBA_fnc_notify", player]; +}; + +_ticketCount \ No newline at end of file From 474a36682791c68266003afcd678afe08dd3960d Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 16 Jun 2024 11:59:23 +0300 Subject: [PATCH 127/228] Fix wrong variable usage --- addons/respawn/XEH_postInit_server.sqf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 2b84e40..4ec1b60 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -1,7 +1,8 @@ #include "script_component.hpp" - -if (GVAR(enable)) exitwith { }; +if (!GVAR(enable)) exitwith { + INFO("Respawn not enabled, server exit"); +}; if (GVAR(respawnType) isEqualTo 2) then { GVAR(playerTicektsHash) = createHashMap; From 465470a0a0d7c97f9dc2939b20d841c0f341af18 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 16 Jun 2024 11:59:45 +0300 Subject: [PATCH 128/228] Move hash creating to preinit --- addons/respawn/XEH_postInit_server.sqf | 2 +- addons/respawn/XEH_preInit_server.sqf | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 4ec1b60..95e8aa3 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -5,7 +5,7 @@ if (!GVAR(enable)) exitwith { }; if (GVAR(respawnType) isEqualTo 2) then { - GVAR(playerTicektsHash) = createHashMap; + LOG("Init aar for player tickets"); AAR_UPDATE("west","Player tickets",(round GVAR(initialTicketsWest))); AAR_UPDATE("east","Player tickets",(round GVAR(initialTicketsEast))); AAR_UPDATE("guer","Player tickets",(round GVAR(initialTicketsResistance))); diff --git a/addons/respawn/XEH_preInit_server.sqf b/addons/respawn/XEH_preInit_server.sqf index 68cba83..5e954a2 100644 --- a/addons/respawn/XEH_preInit_server.sqf +++ b/addons/respawn/XEH_preInit_server.sqf @@ -1,6 +1,7 @@ #include "script_component.hpp" GVAR(respawnPointsHash) = createHashMap; +GVAR(playerTicektsHash) = createHashMap; GVAR(disconnectedPlayers) = createHashMapFromArray EMPTY_ARRAY_FOR_SIDES; From d60673b1710525f1a07ccde76b67564df328259c Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 16 Jun 2024 12:00:58 +0300 Subject: [PATCH 129/228] Change to use fnc made for changing ticket counts --- addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf b/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf index 2adbce3..3fb44de 100644 --- a/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf +++ b/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf @@ -48,14 +48,10 @@ DEC(_remainingTickets); if (_respawnType isEqualTo 1) then { private _sideSTR = str _side; AAR_UPDATE(_sideSTR,"Side tickets",_remainingTickets); - GVAR(tickets) set [_side, _remainingTickets]; - publicVariable QGVAR(tickets); + [_side, _remainingTickets] call FUNC(setTicketCount); } else { AAR_UPDATE(_player,"Player tickets",_remainingTickets); - GVAR(playerTicektsHash) set [_playerUID, _remainingTickets]; - - private _text = format["%1 %2",localize "STR_tunres_Respawn_RemainingTicketsText", str _remainingTickets]; - _text remoteExecCall ["CBA_fnc_notify", _player]; + [_player, _remainingTickets] call FUNC(setTicketCount); }; [5] remoteExecCall ["setPlayerRespawnTime", _player]; \ No newline at end of file From 0e638826accdc5a071945d8b720c653958013d06 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 16 Jun 2024 12:01:48 +0300 Subject: [PATCH 130/228] Stupid way to send player tickets to players whitout whole sending whole hash --- addons/respawn/XEH_PREP.hpp | 1 + .../respawn/functions/fnc_setTicketCount.sqf | 1 + .../fnc_updateClientsTicketCount.sqf | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+) create mode 100644 addons/respawn/functions/fnc_updateClientsTicketCount.sqf diff --git a/addons/respawn/XEH_PREP.hpp b/addons/respawn/XEH_PREP.hpp index a98960a..e63d9d4 100644 --- a/addons/respawn/XEH_PREP.hpp +++ b/addons/respawn/XEH_PREP.hpp @@ -34,6 +34,7 @@ PREP(teleportButton); PREP(teleportOnLBSelChanged); PREP(teleportUnit); PREP(timer); +PREP(updateClientsTicketCount); PREP(updateRespawnMarkers); PREP(updateRespawnPoint); PREP(updateWaitingRespawnList); diff --git a/addons/respawn/functions/fnc_setTicketCount.sqf b/addons/respawn/functions/fnc_setTicketCount.sqf index c861d6c..981db39 100644 --- a/addons/respawn/functions/fnc_setTicketCount.sqf +++ b/addons/respawn/functions/fnc_setTicketCount.sqf @@ -32,6 +32,7 @@ switch (GVAR(respawnType)) do { private _hash = GVAR(playerTicektsHash); private _playerUID = getPlayerUID _target; _hash set [_playerUID, _count]; + [_count] remoteExecCall [QFUNC(updateClientsTicketCount), _target]; breakWith true; } else { ERROR("Tried to set player tickest, but did not give player"); diff --git a/addons/respawn/functions/fnc_updateClientsTicketCount.sqf b/addons/respawn/functions/fnc_updateClientsTicketCount.sqf new file mode 100644 index 0000000..5f9a862 --- /dev/null +++ b/addons/respawn/functions/fnc_updateClientsTicketCount.sqf @@ -0,0 +1,19 @@ +/* + * Author: [Tuntematon] + * [Description] + * This is to just to update clients ticket count for player specific tickest + * + * Arguments: + * 0: Ticket count + * + * Return Value: + * + * + * Example: + * ["something", player] call tunres_Respawn_fnc_updateClientsTicketCount + */ +#include "script_component.hpp" + +params ["_ticketCount"]; + +GVAR(playerTickets) = _ticketCount; \ No newline at end of file From 0fe96dc283d6ac14c90bb304e95a008493f6afa3 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 16 Jun 2024 12:02:06 +0300 Subject: [PATCH 131/228] Fix typos --- addons/main/Stringtable.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index cf1ab0d..8426f14 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -82,10 +82,6 @@ Range for Waiting Area. Default is 100m. Range for Waiting Area. Default is 100m. - - Remaining Tickets: - Remaining Tickets: - Remaining tickets for your side: Remaining tickets for your side: @@ -290,6 +286,10 @@ MSP is not contested MSP is not contested + + Your remaining tickets: + Your remaining tickets: + From 1b53d34393d6c38e08d96057d4022d4b37e49224 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 16 Jun 2024 12:02:54 +0300 Subject: [PATCH 132/228] Change to use the FNC for this --- addons/respawn/functions/fnc_waitingArea.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 1cee2b0..c9eefcc 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -82,7 +82,7 @@ GVAR(mark) = 0; }; if (_respawnType in [1,2]) then { - private _tickets = GVAR(tickets) get _playerSide; + private _tickets = [false] call FUNC(getTicketCountClient); DEC(_respawnType); // so it works on select private _ticketsTypeText = localize (["STR_tunres_Respawan_RemainingTicketsSide", "STR_tunres_Respawan_RemainingTicketsPlayer"] select _respawnType); _text = format["%1
%2 %3", _text, _ticketsTypeText, _tickets]; From ab2d0514f4b4723139a351d5ab9099d0d5e4c5d8 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 16 Jun 2024 12:03:17 +0300 Subject: [PATCH 133/228] Remove debug --- addons/respawn/XEH_postInit_client.sqf | 2 -- 1 file changed, 2 deletions(-) diff --git a/addons/respawn/XEH_postInit_client.sqf b/addons/respawn/XEH_postInit_client.sqf index c2c5a00..07120bc 100644 --- a/addons/respawn/XEH_postInit_client.sqf +++ b/addons/respawn/XEH_postInit_client.sqf @@ -44,8 +44,6 @@ ADDON // Add killed EH [player, "killed", { params ["_unit", "_killer", "_instigator", "_useEffects"]; - _test = format["testi juttu: %1",player getvariable [QGVAR(isWaitingRespawn), false]]; - LOG(_test); if (player getvariable [QGVAR(isWaitingRespawn), false]) then { GVAR(uselesBody) = _unit; }; From 5555fd0d04ca3a21ac584484b38f0fee2acc7b75 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 16 Jun 2024 12:05:20 +0300 Subject: [PATCH 134/228] Fix deleting multiple PFH for respawning while being at respawn --- addons/respawn/XEH_postInit_client.sqf | 4 +++- addons/respawn/functions/fnc_waitingArea.sqf | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/respawn/XEH_postInit_client.sqf b/addons/respawn/XEH_postInit_client.sqf index 07120bc..5af3b56 100644 --- a/addons/respawn/XEH_postInit_client.sqf +++ b/addons/respawn/XEH_postInit_client.sqf @@ -44,7 +44,9 @@ ADDON // Add killed EH [player, "killed", { params ["_unit", "_killer", "_instigator", "_useEffects"]; - if (player getvariable [QGVAR(isWaitingRespawn), false]) then { + if (player getvariable [QGVAR(isWaitingRespawn), false]) then { + [GVAR(waitingAreaPFH)] call CBA_fnc_removePerFrameHandler; + GVAR(waitingAreaPFH) = nil; GVAR(uselesBody) = _unit; }; [] call FUNC(onPlayerKilled); diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index c9eefcc..9453932 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -34,9 +34,10 @@ private _waitingRange = GVAR(waitingAreaRange); private _respawnType = GVAR(respawnType); GVAR(mark) = 0; -[{ +GVAR(waitingAreaPFH) = [{ _args params ["_respawnWaitingarea", "_playerSide", "_waitingRange", "_respawnType"]; if !( player getvariable QGVAR(isWaitingRespawn) ) exitWith { + GVAR(waitingAreaPFH) = nil; [_handle] call CBA_fnc_removePerFrameHandler; }; From 4f1c01ecfe120f2fc941f1619e5131f07632938b Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 16 Jun 2024 12:05:27 +0300 Subject: [PATCH 135/228] Comments --- addons/respawn/functions/fnc_getTicketCount.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/respawn/functions/fnc_getTicketCount.sqf b/addons/respawn/functions/fnc_getTicketCount.sqf index 6c9b14d..57a505e 100644 --- a/addons/respawn/functions/fnc_getTicketCount.sqf +++ b/addons/respawn/functions/fnc_getTicketCount.sqf @@ -17,11 +17,11 @@ if (!isServer) exitWith { }; params [["_side", nil, [west]], ["_player", objNull, [objNull]], ["_doHint", false, [true]]]; private "_ticketCount"; switch (GVAR(respawnType)) do { - case 1: { + case 1: { //Side ticket private _hash = GVAR(tickets); _ticketCount = _hash get _side; }; - case 2: { + case 2: { // Player tickets if (!isNull _player) then { private _hash = GVAR(playerTicektsHash); private _playerUID = getPlayerUID _player; @@ -46,4 +46,4 @@ if (_doHint && !isNull _player) then { _text remoteExecCall ["CBA_fnc_notify", _player]; }; -_ticketCount \ No newline at end of file +_ticketCount From dc0e2e7cb36c4caa3113df5bc742c2ec91d7a2d0 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 16 Jun 2024 12:06:54 +0300 Subject: [PATCH 136/228] Update waitingListupdating Move filtering to top. Check for delayed respawn only for new guys --- .../fnc_updateWaitingRespawnList.sqf | 23 +++++++++++-------- addons/respawn/functions/fnc_waitingArea.sqf | 4 +--- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf index 988976a..371a82a 100644 --- a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf +++ b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf @@ -20,8 +20,18 @@ if (isnull _player || !(_player in allPlayers) || !alive _player ) exitWith { LOG("Tried to add unit what is not there"); }; -private _unitSkipsNextWave = _player getVariable [QGVAR(skipNextWave), [_player, _side] call FUNC(delayedRespawn)]; -private _unitListHash = [GVAR(waitingRespawnList), GVAR(waitingRespawnDelayedList)] select _unitSkipsNextWave; +{ + private _hash = _x; + private _unitList = _hash get _side; + FILTER(_unitList,(!isnull _x && _x in allPlayers && alive _x )); + _hash set [_side, _unitList]; +} forEach [GVAR(waitingRespawnList), GVAR(waitingRespawnDelayedList)]; + +if (isNil {_player getVariable [QGVAR(skipNextWave), nil]}) then { + [_player, _side] call FUNC(delayedRespawn) +}; + +private _unitListHash = [GVAR(waitingRespawnList), GVAR(waitingRespawnDelayedList)] select (_player getVariable [QGVAR(skipNextWave), false]); private _unitList = _unitListHash get _side; if (_addPlayer) then { @@ -30,11 +40,4 @@ if (_addPlayer) then { _unitList deleteAt (_unitList find _player); }; -_unitListHash set [_side, _unitList]; - -{ - private _hash = _x; - private _unitList = _hash get _side; - FILTER(_unitList,(!isnull _x && _x in allPlayers && alive _x )); - _hash set [_side, _unitList]; -} forEach [GVAR(waitingRespawnList), GVAR(waitingRespawnDelayedList)]; \ No newline at end of file +_unitListHash set [_side, _unitList]; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 9453932..61df9a9 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -20,9 +20,7 @@ if (isDedicated || !(_playerSide in [west,east,resistance,civilian]) ) exitWith LOG("Start waiting area"); //tell server to add this player to list -if (isNil QGVAR(uselesBody)) then { - player setVariable [QGVAR(skipNextWave), nil]; -} else { +if (!isNil QGVAR(uselesBody)) then { deleteVehicle GVAR(uselesBody); GVAR(uselesBody) = nil; }; From bce4d17a20550914aeeff5ed0a5c687e285ec502 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 16 Jun 2024 12:15:01 +0300 Subject: [PATCH 137/228] update hash variable names to include hahs --- addons/msp/XEH_preInit.sqf | 112 +++++++++--------- addons/msp/XEH_preInit_server.sqf | 12 +- addons/msp/functions/fnc_addAceActions.sqf | 6 +- addons/msp/functions/fnc_addEventHandlers.sqf | 14 +-- addons/msp/functions/fnc_briefingNotes.sqf | 4 +- addons/msp/functions/fnc_contestedCheck.sqf | 26 ++-- .../fnc_createContestZoneMarkers.sqf | 2 +- .../functions/fnc_startContestedChecks.sqf | 18 +-- .../fnc_startUpdateDeployementStatus.sqf | 4 +- .../functions/fnc_updateDeployementStatus.sqf | 12 +- addons/respawn/XEH_postInit_server.sqf | 8 +- addons/respawn/XEH_preInit.sqf | 37 +++--- addons/respawn/XEH_preInit_server.sqf | 8 +- .../functions/fnc_bleedTicketCountOnDeath.sqf | 4 +- .../respawn/functions/fnc_briefingNotes.sqf | 2 +- .../respawn/functions/fnc_delayedRespawn.sqf | 4 +- .../respawn/functions/fnc_doRespawnWave.sqf | 8 +- .../respawn/functions/fnc_getTicketCount.sqf | 4 +- .../functions/fnc_getTicketCountClient.sqf | 4 +- .../functions/fnc_moduleRespawnPoint.sqf | 10 +- .../functions/fnc_moduleWaitingArea.sqf | 10 +- .../fnc_remainingWaitTimeNotification.sqf | 2 +- .../respawn/functions/fnc_setTicketCount.sqf | 4 +- addons/respawn/functions/fnc_timer.sqf | 20 ++-- .../fnc_updateWaitingRespawnList.sqf | 4 +- addons/respawn/functions/fnc_waitingArea.sqf | 8 +- 26 files changed, 171 insertions(+), 176 deletions(-) diff --git a/addons/msp/XEH_preInit.sqf b/addons/msp/XEH_preInit.sqf index e5bb321..357fd8d 100644 --- a/addons/msp/XEH_preInit.sqf +++ b/addons/msp/XEH_preInit.sqf @@ -6,12 +6,12 @@ PREP_RECOMPILE_START; PREP_RECOMPILE_END; //Msp classnames -GVAR(classnames) = createHashMap; +GVAR(classnamesHash) = createHashMap; //reportEnemiesInterval 0 - reportEnemiesRange 1 - contestedRadiusMax 2 - contestedRadiusMin 3 - contestedCheckInterval 4 - reportEnemiesEnabled 5 -GVAR(contestValues) = createHashMapFromArray [[west,[0,0,0,0,0,false]],[east,[0,0,0,0,0,false]],[resistance,[0,0,0,0,0,false]],[civilian,[0,0,0,0,0,false]]]; -GVAR(contestHandles) = createHashMap; -GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; +GVAR(contestValuesHash) = createHashMapFromArray [[west,[0,0,0,0,0,false]],[east,[0,0,0,0,0,false]],[resistance,[0,0,0,0,0,false]],[civilian,[0,0,0,0,0,false]]]; +GVAR(contestHandlesHash) = createHashMap; +GVAR(contestCheckRunningHash) = createHashMapFromArray FALSES_FOR_SIDES; [ QGVAR(enable), @@ -44,9 +44,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; 1, { params ["_value"]; - private _array = GVAR(contestValues) get west; + private _array = GVAR(contestValuesHash) get west; _array set [5, _value]; - GVAR(contestValues) set [west, _array]; + GVAR(contestValuesHash) set [west, _array]; }, true ] call CBA_Settings_fnc_init; @@ -60,9 +60,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; 1, { params ["_value"]; - private _array = GVAR(contestValues) get east; + private _array = GVAR(contestValuesHash) get east; _array set [5, _value]; - GVAR(contestValues) set [east, _array]; + GVAR(contestValuesHash) set [east, _array]; }, true ] call CBA_Settings_fnc_init; @@ -76,9 +76,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; 1, { params ["_value"]; - private _array = GVAR(contestValues) get resistance; + private _array = GVAR(contestValuesHash) get resistance; _array set [5, _value]; - GVAR(contestValues) set [resistance, _array]; + GVAR(contestValuesHash) set [resistance, _array]; }, true ] call CBA_Settings_fnc_init; @@ -92,9 +92,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; 1, { params ["_value"]; - private _array = GVAR(contestValues) get civilian; + private _array = GVAR(contestValuesHash) get civilian; _array set [5, _value]; - GVAR(contestValues) set [civilian, _array]; + GVAR(contestValuesHash) set [civilian, _array]; }, true ] call CBA_Settings_fnc_init; @@ -110,9 +110,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(reportEnemiesIntervalWest) = _value; - private _array = GVAR(contestValues) get west; + private _array = GVAR(contestValuesHash) get west; _array set [0, _value]; - GVAR(contestValues) set [west, _array]; + GVAR(contestValuesHash) set [west, _array]; }, true ] call CBA_Settings_fnc_init; @@ -128,9 +128,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(reportEnemiesIntervalEast) = _value; - private _array = GVAR(contestValues) get east; + private _array = GVAR(contestValuesHash) get east; _array set [0, _value]; - GVAR(contestValues) set [east, _array]; + GVAR(contestValuesHash) set [east, _array]; }, true ] call CBA_Settings_fnc_init; @@ -146,9 +146,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(reportEnemiesIntervalResistance) = _value; - private _array = GVAR(contestValues) get resistance; + private _array = GVAR(contestValuesHash) get resistance; _array set [0, _value]; - GVAR(contestValues) set [resistance, _array]; + GVAR(contestValuesHash) set [resistance, _array]; }, true ] call CBA_Settings_fnc_init; @@ -164,9 +164,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(reportEnemiesIntervalCivilian) = _value; - private _array = GVAR(contestValues) get civilian; + private _array = GVAR(contestValuesHash) get civilian; _array set [0, _value]; - GVAR(contestValues) set [civilian, _array]; + GVAR(contestValuesHash) set [civilian, _array]; }, true ] call CBA_Settings_fnc_init; @@ -182,9 +182,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(reportEnemiesRangeWest) = _value; - private _array = GVAR(contestValues) get west; + private _array = GVAR(contestValuesHash) get west; _array set [1, _value]; - GVAR(contestValues) set [west, _array]; + GVAR(contestValuesHash) set [west, _array]; }, false ] call CBA_Settings_fnc_init; @@ -200,9 +200,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(reportEnemiesRangeEast) = _value; - private _array = GVAR(contestValues) get east; + private _array = GVAR(contestValuesHash) get east; _array set [1, _value]; - GVAR(contestValues) set [east, _array]; + GVAR(contestValuesHash) set [east, _array]; }, false ] call CBA_Settings_fnc_init; @@ -218,9 +218,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(reportEnemiesRangeResistance) = _value; - private _array = GVAR(contestValues) get resistance; + private _array = GVAR(contestValuesHash) get resistance; _array set [1, _value]; - GVAR(contestValues) set [resistance, _array]; + GVAR(contestValuesHash) set [resistance, _array]; }, false ] call CBA_Settings_fnc_init; @@ -236,9 +236,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(reportEnemiesRangeCivilian) = _value; - private _array = GVAR(contestValues) get civilian; + private _array = GVAR(contestValuesHash) get civilian; _array set [1, _value]; - GVAR(contestValues) set [civilian, _array]; + GVAR(contestValuesHash) set [civilian, _array]; }, false ] call CBA_Settings_fnc_init; @@ -254,9 +254,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(contestedRadiusMaxWest) = _value; - private _array = GVAR(contestValues) get west; + private _array = GVAR(contestValuesHash) get west; _array set [2, _value]; - GVAR(contestValues) set [west, _array]; + GVAR(contestValuesHash) set [west, _array]; }, false ] call CBA_Settings_fnc_init; @@ -272,9 +272,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(contestedRadiusMaxEast) = _value; - private _array = GVAR(contestValues) get east; + private _array = GVAR(contestValuesHash) get east; _array set [2, _value]; - GVAR(contestValues) set [east, _array]; + GVAR(contestValuesHash) set [east, _array]; }, false ] call CBA_Settings_fnc_init; @@ -290,9 +290,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(contestedRadiusMaxResistance) = _value; - private _array = GVAR(contestValues) get resistance; + private _array = GVAR(contestValuesHash) get resistance; _array set [2, _value]; - GVAR(contestValues) set [resistance, _array]; + GVAR(contestValuesHash) set [resistance, _array]; }, false ] call CBA_Settings_fnc_init; @@ -308,9 +308,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(contestedRadiusMaxCivilian) = _value; - private _array = GVAR(contestValues) get civilian; + private _array = GVAR(contestValuesHash) get civilian; _array set [2, _value]; - GVAR(contestValues) set [civilian, _array]; + GVAR(contestValuesHash) set [civilian, _array]; }, false ] call CBA_Settings_fnc_init; @@ -326,9 +326,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(contestedRadiusMinWest) = _value; - private _array = GVAR(contestValues) get west; + private _array = GVAR(contestValuesHash) get west; _array set [3, _value]; - GVAR(contestValues) set [west, _array]; + GVAR(contestValuesHash) set [west, _array]; }, false ] call CBA_Settings_fnc_init; @@ -344,9 +344,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(contestedRadiusMinEast) = _value; - private _array = GVAR(contestValues) get east; + private _array = GVAR(contestValuesHash) get east; _array set [3, _value]; - GVAR(contestValues) set [east, _array]; + GVAR(contestValuesHash) set [east, _array]; }, false ] call CBA_Settings_fnc_init; @@ -362,9 +362,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(contestedRadiusMinResistance) = _value; - private _array = GVAR(contestValues) get resistance; + private _array = GVAR(contestValuesHash) get resistance; _array set [3, _value]; - GVAR(contestValues) set [resistance, _array]; + GVAR(contestValuesHash) set [resistance, _array]; }, false ] call CBA_Settings_fnc_init; @@ -380,9 +380,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(contestedRadiusMinCivilian) = _value; - private _array = GVAR(contestValues) get civilian; + private _array = GVAR(contestValuesHash) get civilian; _array set [3, _value]; - GVAR(contestValues) set [civilian, _array]; + GVAR(contestValuesHash) set [civilian, _array]; }, false ] call CBA_Settings_fnc_init; @@ -398,9 +398,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(contestedCheckIntervalWest) = _value; - private _array = GVAR(contestValues) get west; + private _array = GVAR(contestValuesHash) get west; _array set [4, _value]; - GVAR(contestValues) set [west, _array]; + GVAR(contestValuesHash) set [west, _array]; }, true ] call CBA_Settings_fnc_init; @@ -416,9 +416,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(contestedCheckIntervalEast) = _value; - private _array = GVAR(contestValues) get east; + private _array = GVAR(contestValuesHash) get east; _array set [4, _value]; - GVAR(contestValues) set [west, _array]; + GVAR(contestValuesHash) set [west, _array]; }, true ] call CBA_Settings_fnc_init; @@ -434,9 +434,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(contestedCheckIntervalResistance) = _value; - private _array = GVAR(contestValues) get resistance; + private _array = GVAR(contestValuesHash) get resistance; _array set [4, _value]; - GVAR(contestValues) set [resistance, _array]; + GVAR(contestValuesHash) set [resistance, _array]; }, true ] call CBA_Settings_fnc_init; @@ -452,9 +452,9 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; params ["_value"]; _value = round _value; GVAR(contestedCheckIntervalCivilian) = _value; - private _array = GVAR(contestValues) get civilian; + private _array = GVAR(contestValuesHash) get civilian; _array set [4, _value]; - GVAR(contestValues) set [civilian, _array]; + GVAR(contestValuesHash) set [civilian, _array]; }, true ] call CBA_Settings_fnc_init; @@ -496,7 +496,7 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; 1, { params ["_value"]; - GVAR(classnames) set [east , _value]; + GVAR(classnamesHash) set [east , _value]; }, true ] call CBA_Settings_fnc_init; @@ -510,7 +510,7 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; 1, { params ["_value"]; - GVAR(classnames) set [west , _value]; + GVAR(classnamesHash) set [west , _value]; }, true ] call CBA_Settings_fnc_init; @@ -524,7 +524,7 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; 1, { params ["_value"]; - GVAR(classnames) set [resistance , _value]; + GVAR(classnamesHash) set [resistance , _value]; }, true ] call CBA_Settings_fnc_init; @@ -538,7 +538,7 @@ GVAR(contestCheckRunning) = createHashMapFromArray FALSES_FOR_SIDES; 1, { params ["_value"]; - GVAR(classnames) set [civilian , _value]; + GVAR(classnamesHash) set [civilian , _value]; }, true ] call CBA_Settings_fnc_init; diff --git a/addons/msp/XEH_preInit_server.sqf b/addons/msp/XEH_preInit_server.sqf index 0340e9f..09bb433 100644 --- a/addons/msp/XEH_preInit_server.sqf +++ b/addons/msp/XEH_preInit_server.sqf @@ -4,16 +4,16 @@ missionNamespace setVariable [QGVAR(disableContestedCheck), false, true]; //Contested status -GVAR(contestedStatus) = createHashMapFromArray FALSES_FOR_SIDES; -publicVariable QGVAR(contestedStatus); +GVAR(contestedStatusHash) = createHashMapFromArray FALSES_FOR_SIDES; +publicVariable QGVAR(contestedStatusHash); //MSP status. If true, msp is setup -GVAR(deployementStatus) = createHashMapFromArray FALSES_FOR_SIDES; -publicVariable QGVAR(deployementStatus); +GVAR(deployementStatusHash) = createHashMapFromArray FALSES_FOR_SIDES; +publicVariable QGVAR(deployementStatusHash); //MSP vehicle -GVAR(activeVehicle) = createHashMapFromArray [[west, objNull],[east, objNull],[resistance, objNull],[civilian, objNull]]; -publicVariable QGVAR(activeVehicle); +GVAR(activeVehicleHash) = createHashMapFromArray [[west, objNull],[east, objNull],[resistance, objNull],[civilian, objNull]]; +publicVariable QGVAR(activeVehicleHash); //Contested stuff GVAR(contestedCheckHash) = createHashMapFromArray [[west,[0,0,0]],[east,[0,0,0]],[resistance,[0,0,0]],[civilian,[0,0,0]]]; \ No newline at end of file diff --git a/addons/msp/functions/fnc_addAceActions.sqf b/addons/msp/functions/fnc_addAceActions.sqf index e80cbb6..3b69f72 100644 --- a/addons/msp/functions/fnc_addAceActions.sqf +++ b/addons/msp/functions/fnc_addAceActions.sqf @@ -15,7 +15,7 @@ #include "script_component.hpp" if (playerSide isEqualTo sideLogic || !hasInterface) exitWith { }; // Exit if a virtual entity (IE zeus) -private _vehicle = GVAR(classnames) get playerSide; +private _vehicle = GVAR(classnamesHash) get playerSide; private _actionMain = [QEGVAR(main,respawnAction), localize "STR_tunres_MSP_AceAction_RespawnActions", "\a3\Modules_F_Curator\Data\portraitRespawnTickets_ca.paa", {true}, {true}] call ace_interact_menu_fnc_createAction; [_vehicle, 0, ["ACE_MainActions"], _actionMain] call ace_interact_menu_fnc_addActionToClass; @@ -27,7 +27,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { {_target getVariable QGVAR(side) isEqualTo playerSide} && { driver _target isEqualTo player} && { speed player isEqualTo 0 } && - {!((GVAR(deployementStatus) getOrDefault [playerSide, false]))} + {!((GVAR(deployementStatusHash) getOrDefault [playerSide, false]))} }; _createMSP = ["Set up MSP", localize "STR_tunres_MSP_AceAction_DeployMSP", "\a3\3den\data\cfgwaypoints\unload_ca.paa", {[_target, true] call FUNC(startUpdateDeployementStatus);}, _create_condition, {}, [], [0, 0, 0], 2, [false, true, false, false, false]] call ace_interact_menu_fnc_createAction; @@ -61,7 +61,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { params ["_entity"]; private _menu_condition = "alive _target && {_target getVariable [ '"+ QGVAR(isMSP) +"' , false]} && {!(_target getVariable ['tunres_msp_isContested', false])}"; - private _tp_conditionText = " private _msp = "+ QGVAR(activeVehicle) +" get playerSide; private _status = _msp getVariable ['tunres_msp_isContested', false]; (_target isNotEqualTo _msp && _obj getVariable [ '"+ QGVAR(isMSP) +"' , false] && !_status) "; + private _tp_conditionText = " private _msp = "+ QGVAR(activeVehicleHash) +" get playerSide; private _status = _msp getVariable ['tunres_msp_isContested', false]; (_target isNotEqualTo _msp && _obj getVariable [ '"+ QGVAR(isMSP) +"' , false] && !_status) "; [_entity, _tp_conditionText, localize "STR_tunres_MSP_TpText", false, nil, [playerSide], true, _menu_condition, false, ["ACE_MainActions",QEGVAR(main,respawnAction)]] call EFUNC(respawn,addCustomTeleporter); diff --git a/addons/msp/functions/fnc_addEventHandlers.sqf b/addons/msp/functions/fnc_addEventHandlers.sqf index 4223339..460b686 100644 --- a/addons/msp/functions/fnc_addEventHandlers.sqf +++ b/addons/msp/functions/fnc_addEventHandlers.sqf @@ -15,7 +15,7 @@ #include "script_component.hpp" { private _side = _x; - private _vehicle = GVAR(classnames) get _side; + private _vehicle = GVAR(classnamesHash) get _side; //check that class exist if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { @@ -29,9 +29,9 @@ _side = _x; break; }; - } forEach GVAR(classnames); + } forEach GVAR(classnamesHash); - private _values = GVAR(contestValues) get _side; + private _values = GVAR(contestValuesHash) get _side; private _reportEnemiesRange = _values param [1]; private _contestedRadiusMax = _values param [2]; private _contestedRadiusMin = _values param [3]; @@ -62,10 +62,10 @@ deleteVehicle _x; } forEach (_unit getVariable QGVAR(objects)); - GVAR(deployementStatus) set [_side, false]; - publicVariable QGVAR(deployementStatus); - GVAR(activeVehicle) set [_side, objNull]; - publicVariable QGVAR(activeVehicle); + GVAR(deployementStatusHash) set [_side, false]; + publicVariable QGVAR(deployementStatusHash); + GVAR(activeVehicleHash) set [_side, objNull]; + publicVariable QGVAR(activeVehicleHash); //Do marker update [_side, false] remoteExecCall ["tunres_respawn_fnc_updateRespawnPoint", 2]; diff --git a/addons/msp/functions/fnc_briefingNotes.sqf b/addons/msp/functions/fnc_briefingNotes.sqf index 3081e2d..2537c33 100644 --- a/addons/msp/functions/fnc_briefingNotes.sqf +++ b/addons/msp/functions/fnc_briefingNotes.sqf @@ -15,13 +15,13 @@ if (playerSide isEqualTo sideLogic || !hasInterface) exitWith { }; // Exit if a virtual entity (IE zeus) -private _vehicle = GVAR(classnames) get playerSide; +private _vehicle = GVAR(classnamesHash) get playerSide; private _text = ""+ localize "STR_tunres_MSP_Briefing_Header" +"
"; if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { - private _values = GVAR(contestValues) get playerSide; + private _values = GVAR(contestValuesHash) get playerSide; _values params ["_reportEnemiesInterval", "_reportEnemiesRange", "_contestedRadiusMax", "_contestedRadiusMin", "_contestedCheckInterval", "_reportEnemiesEnabled"]; _text = format ["%1
- %2",_text, localize "STR_tunres_Respawn_Briefing_MspEnabled"]; diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index 1eaa68e..e073927 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -14,18 +14,18 @@ params[["_side", nil,[west]]]; if (!isServer) exitWith {}; -private _oldAllowRespawnStatus = GVAR(allowRespawn) get _side; -GVAR(allowRespawn) set [_side, false]; +private _oldAllowRespawnStatus = GVAR(allowRespawnHash) get _side; +GVAR(allowRespawnHash) set [_side, false]; -private _values = GVAR(contestValues) get _side; +private _values = GVAR(contestValuesHash) get _side; private _contestedRadiusMax = _values param [2]; private _contestedRadiusMin = _values param [3]; private _hash = GVAR(contestedCheckHash); private _allUnits = units west + units east + units resistance + units civilian; -private _mspDeployementStatus = GVAR(deployementStatus) get _side; -private _msp = GVAR(activeVehicle) get _side; +private _mspDeployementStatus = GVAR(deployementStatusHash) get _side; +private _msp = GVAR(activeVehicleHash) get _side; if ( _mspDeployementStatus && { !(isNull _msp) } ) then { @@ -60,15 +60,15 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { AAR_UPDATE(_msp,"Friendly Count",_friendliesInArea); AAR_UPDATE(_msp,"Is contested",_isContested); - private _oldContestedStatus = GVAR(contestedStatus) get _side; + private _oldContestedStatus = GVAR(contestedStatusHash) get _side; if (_oldContestedStatus isNotEqualTo _isContested) then { AAR_EVENT(FORMAT_1(localize ARG_1(ARR_2(["STR_tunres_MSP_AAR_MSP_notContested","STR_tunres_MSP_AAR_MSP_isContested"]),_isContested),str _side),_msp,nil,nil); AAR_UPDATE(_msp,"Is contested",_isContested); - GVAR(contestedStatus) set [_side, _isContested]; - publicVariable QGVAR(contestedStatus); + GVAR(contestedStatusHash) set [_side, _isContested]; + publicVariable QGVAR(contestedStatusHash); _msp setVariable [QGVAR(isContested), _isContested, true]; private _whoToNotify = [_side, GVAR(contestedNotification)] call FUNC(whoToNotify); @@ -87,13 +87,13 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { LOG(_debugText); } else { if (_mspDeployementStatus) then { - GVAR(deployementStatus) set [_side, false]; - publicVariable QGVAR(deployementStatus); - GVAR(contestedStatus) set [_side, false]; - publicVariable QGVAR(contestedStatus); + GVAR(deployementStatusHash) set [_side, false]; + publicVariable QGVAR(deployementStatusHash); + GVAR(contestedStatusHash) set [_side, false]; + publicVariable QGVAR(contestedStatusHash); private _text = "MSP Object Disapeared" + str _side; ERROR(_text); }; }; -GVAR(allowRespawn) set [_side, _oldAllowRespawnStatus]; \ No newline at end of file +GVAR(allowRespawnHash) set [_side, _oldAllowRespawnStatus]; \ No newline at end of file diff --git a/addons/msp/functions/fnc_createContestZoneMarkers.sqf b/addons/msp/functions/fnc_createContestZoneMarkers.sqf index 9db6417..4a6fd93 100644 --- a/addons/msp/functions/fnc_createContestZoneMarkers.sqf +++ b/addons/msp/functions/fnc_createContestZoneMarkers.sqf @@ -18,7 +18,7 @@ if (playerSide isEqualTo sideLogic || !hasInterface) exitWith { }; params["_pos"]; -private _values = GVAR(contestValues) get playerSide; +private _values = GVAR(contestValuesHash) get playerSide; private _reportEnemiesRange = _values param [1]; private _contestedRadiusMax = _values param [2]; private _contestedRadiusMin = _values param [3]; diff --git a/addons/msp/functions/fnc_startContestedChecks.sqf b/addons/msp/functions/fnc_startContestedChecks.sqf index 4796c01..3865630 100644 --- a/addons/msp/functions/fnc_startContestedChecks.sqf +++ b/addons/msp/functions/fnc_startContestedChecks.sqf @@ -19,11 +19,11 @@ params ["_side", "_start"]; if (!isServer) then {}; if (_start) then { - if (GVAR(contestCheckRunning) getOrDefault [_side, false]) exitWith { + if (GVAR(contestCheckRunningHash) getOrDefault [_side, false]) exitWith { ERROR("Tried to start contested check, while it was already on!!"); }; - private _values = GVAR(contestValues) get _side; + private _values = GVAR(contestValuesHash) get _side; private _reportEnemiesInterval = _values select 0; private _contestedCheckInterval = _values select 4; private _reportEnemiesEnabled = _values select 5; @@ -31,7 +31,7 @@ if (_start) then { private _handleContest = [{ _args params["_side"]; if !(GVAR(disableContestedCheck)) then { - private _mspDeployementStatus = GVAR(deployementStatus) get _side; + private _mspDeployementStatus = GVAR(deployementStatusHash) get _side; if (_mspDeployementStatus) then { [_side] call FUNC(contestedCheck); } else { @@ -49,8 +49,8 @@ if (_start) then { if !(GVAR(disableContestedCheck)) then { private _side = _args; private _hash = GVAR(contestedCheckHash); - private _contestedStatus = GVAR(contestedStatus) get _side; - private _mspStatus = GVAR(deployementStatus) get _side; + private _contestedStatus = GVAR(contestedStatusHash) get _side; + private _mspStatus = GVAR(deployementStatusHash) get _side; if (_mspStatus) then { private _enemyCount = (_hash get _side) select 0; if (_enemyCount > 0 && !_contestedStatus) then { @@ -65,14 +65,14 @@ if (_start) then { }; }, _reportEnemiesInterval, _side] call CBA_fnc_addPerFrameHandler; }; - GVAR(contestHandles) set [_side,[_handleContest,_handleReport]]; + GVAR(contestHandlesHash) set [_side,[_handleContest,_handleReport]]; } else { - if !(GVAR(contestCheckRunning) getOrDefault [_side, false]) exitWith { + if !(GVAR(contestCheckRunningHash) getOrDefault [_side, false]) exitWith { ERROR("Tried to stop contested check, while it was already off!!"); }; - private _values = GVAR(contestHandles) get _side; + private _values = GVAR(contestHandlesHash) get _side; { private _handle = _x; if (!isNil {_handle}) then { @@ -81,4 +81,4 @@ if (_start) then { } forEach _values; }; -GVAR(contestCheckRunning) set [_side, _start]; \ No newline at end of file +GVAR(contestCheckRunningHash) set [_side, _start]; \ No newline at end of file diff --git a/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf index 8616d47..cb1ccd5 100644 --- a/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf @@ -26,7 +26,7 @@ if (_setup) then { driver _msp isEqualTo player && alive _msp && insideBuilding player isEqualTo 0 && - !(GVAR(deployementStatus) get playerSide) + !(GVAR(deployementStatusHash) get playerSide) }; _time = GVAR(progresbarTimeSetup); } else { @@ -34,7 +34,7 @@ if (_setup) then { _conditio = { private _msp = (_args select 0); alive _msp && - (GVAR(deployementStatus) get playerSide) + (GVAR(deployementStatusHash) get playerSide) }; _time = GVAR(progresbarTimePack); }; diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index 46b74d4..68934f4 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -60,17 +60,17 @@ private _pos = getpos _msp; [_side, _setup, _pos] remoteExecCall [QEFUNC(respawn,updateRespawnPoint), 2]; _msp setVariable [QGVAR(isMSP), _setup, true]; -GVAR(deployementStatus) set [_side, _setup]; -publicVariable QGVAR(deployementStatus); -GVAR(activeVehicle) set [_side, [objNull, _msp] select _setup]; -publicVariable QGVAR(activeVehicle); +GVAR(deployementStatusHash) set [_side, _setup]; +publicVariable QGVAR(deployementStatusHash); +GVAR(activeVehicleHash) set [_side, [objNull, _msp] select _setup]; +publicVariable QGVAR(activeVehicleHash); AAR_EVENT(FORMAT_1(localize ARG_1((ARR_2(["STR_tunres_MSP_AAR_MSP_Packed","STR_tunres_MSP_AAR_MSP_Deployed"])),_setup),str _side),_msp,player,nil); //Change deployement status if !(_setup) then { - GVAR(contestedStatus) set [_side, false]; - publicVariable QGVAR(contestedStatus); + GVAR(contestedStatusHash) set [_side, false]; + publicVariable QGVAR(contestedStatusHash); }; [_side, _setup] remoteExecCall [QFUNC(startContestedChecks), 2]; diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 95e8aa3..081d590 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -19,7 +19,7 @@ if (GVAR(respawnType) isNotEqualTo 0) then { params ["_id", "_uid", "_name", "_jip", "_owner"]; if (cba_missiontime > (GVAR(killJipTime) * 60) && GVAR(killJIP)) then { - GVAR(disconnectedPlayers) set [_uid, true]; + GVAR(disconnectedPlayersHash) set [_uid, true]; }; }]; }; @@ -39,8 +39,8 @@ if ( !isnil "afi_aar2" ) then { if (missionNamespace getVariable ["afi_aar2", false]) then { if ((GVAR(respawnType) isEqualTo 1)) then { - private _hashTickets = GVAR(tickets); - private _enabledSideHash = GVAR(enabledSides); + private _hashTickets = GVAR(ticketsHash); + private _enabledSideHash = GVAR(enabledSidesHash); if (_enabledSideHash getOrDefault [west, false]) then { private _ticektsWest = _hashTickets get west; @@ -64,7 +64,7 @@ if ( !isnil "afi_aar2" ) then { }; [{ - private _enabledSideHash = GVAR(enabledSides); + private _enabledSideHash = GVAR(enabledSidesHash); if (_enabledSideHash getOrDefault [west, false]) then { private _time = (_hashTime get west); AAR_UPDATE("west","Next respawn wave",_time); diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index 6264143..adb14ab 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -5,26 +5,25 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; - //cba_missiontime time when next wave happens. -GVAR(nextWaveTimes) = createHashMapFromArray ZEROS_FOR_SIDES; +GVAR(nextWaveTimesHash) = createHashMapFromArray ZEROS_FOR_SIDES; //Respawn wave lenght times -GVAR(waveLenghtTimes) = createHashMap; +GVAR(waveLenghtTimesHash) = createHashMap; //Tickets -GVAR(tickets) = createHashMap; +GVAR(ticketsHash) = createHashMap; //Waiting area stuff -GVAR(waitingArea) = createHashMap; +GVAR(waitingAreaHash) = createHashMap; //Which side has respawn system started -GVAR(enabledSides) = createHashMapFromArray FALSES_FOR_SIDES; +GVAR(enabledSidesHash) = createHashMapFromArray FALSES_FOR_SIDES; //Allow respawn for each side -GVAR(allowRespawn) = createHashMapFromArray TRUES_FOR_SIDES; +GVAR(allowRespawnHash) = createHashMapFromArray TRUES_FOR_SIDES; -GVAR(timerRunning) = createHashMapFromArray FALSES_FOR_SIDES; +GVAR(timerRunningHash) = createHashMapFromArray FALSES_FOR_SIDES; ISNILS(GVAR(teleportPoints),[]); //allowed sides to spectate @@ -34,11 +33,7 @@ GVAR(allowedSpectateSidesResistance) = [resistance]; GVAR(allowedSpectateSidesCivilian) = [civilian]; //flag poles [mainbase,waitingrea] -GVAR(flagPoles) = createHashMapFromArray [[west,[objNull,objNull]],[east,[objNull,objNull]],[resistance,[objNull,objNull]],[civilian,[objNull,objNull]]]; - - - - +GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[objNull,objNull]],[resistance,[objNull,objNull]],[civilian,[objNull,objNull]]]; [ QGVAR(enable), // Unique setting name. Matches resulting variable name @@ -152,7 +147,7 @@ GVAR(flagPoles) = createHashMapFromArray [[west,[objNull,objNull]],[east,[objNul params ["_value"]; _value = round _value; GVAR(initialWaveTimeWest) = _value; - GVAR(waveLenghtTimes) set [west, _value]; + GVAR(waveLenghtTimesHash) set [west, _value]; }, true ] call CBA_Settings_fnc_init; @@ -168,7 +163,7 @@ GVAR(flagPoles) = createHashMapFromArray [[west,[objNull,objNull]],[east,[objNul params ["_value"]; _value = round _value; GVAR(initialWaveTimeEast) = _value; - GVAR(waveLenghtTimes) set [east, _value]; + GVAR(waveLenghtTimesHash) set [east, _value]; }, true ] call CBA_Settings_fnc_init; @@ -184,7 +179,7 @@ GVAR(flagPoles) = createHashMapFromArray [[west,[objNull,objNull]],[east,[objNul params ["_value"]; _value = round _value; GVAR(initialWaveTimeResistance) = _value; - GVAR(waveLenghtTimes) set [resistance, _value]; + GVAR(waveLenghtTimesHash) set [resistance, _value]; }, true ] call CBA_Settings_fnc_init; @@ -200,7 +195,7 @@ GVAR(flagPoles) = createHashMapFromArray [[west,[objNull,objNull]],[east,[objNul params ["_value"]; _value = round _value; GVAR(initialWaveTimeCivilian) = _value; - GVAR(waveLenghtTimes) set [civilian, _value]; + GVAR(waveLenghtTimesHash) set [civilian, _value]; }, true ] call CBA_Settings_fnc_init; @@ -449,7 +444,7 @@ GVAR(flagPoles) = createHashMapFromArray [[west,[objNull,objNull]],[east,[objNul params ["_value"]; _value = round _value; GVAR(initialTicketsWest) = _value; - GVAR(tickets) set [west, _value]; + GVAR(ticketsHash) set [west, _value]; }, true ] call CBA_Settings_fnc_init; @@ -465,7 +460,7 @@ GVAR(flagPoles) = createHashMapFromArray [[west,[objNull,objNull]],[east,[objNul params ["_value"]; _value = round _value; GVAR(initialTicketsEast) = _value; - GVAR(tickets) set [east, _value]; + GVAR(ticketsHash) set [east, _value]; }, true ] call CBA_Settings_fnc_init; @@ -481,7 +476,7 @@ GVAR(flagPoles) = createHashMapFromArray [[west,[objNull,objNull]],[east,[objNul params ["_value"]; _value = round _value; GVAR(initialTicketsResistance) = _value; - GVAR(tickets) set [resistance, _value]; + GVAR(ticketsHash) set [resistance, _value]; }, true ] call CBA_Settings_fnc_init; @@ -497,7 +492,7 @@ GVAR(flagPoles) = createHashMapFromArray [[west,[objNull,objNull]],[east,[objNul params ["_value"]; _value = round _value; GVAR(initialTicketsCivilian) = _value; - GVAR(tickets) set [civilian, _value]; + GVAR(ticketsHash) set [civilian, _value]; }, true ] call CBA_Settings_fnc_init; diff --git a/addons/respawn/XEH_preInit_server.sqf b/addons/respawn/XEH_preInit_server.sqf index 5e954a2..72bf204 100644 --- a/addons/respawn/XEH_preInit_server.sqf +++ b/addons/respawn/XEH_preInit_server.sqf @@ -3,11 +3,11 @@ GVAR(respawnPointsHash) = createHashMap; GVAR(playerTicektsHash) = createHashMap; -GVAR(disconnectedPlayers) = createHashMapFromArray EMPTY_ARRAY_FOR_SIDES; +GVAR(disconnectedPlayersHash) = createHashMapFromArray EMPTY_ARRAY_FOR_SIDES; //Respawn waiting area unit arrays -GVAR(waitingRespawnList) = createHashMapFromArray EMPTY_ARRAY_FOR_SIDES; -GVAR(waitingRespawnDelayedList) = createHashMapFromArray EMPTY_ARRAY_FOR_SIDES; +GVAR(waitingRespawnListHash) = createHashMapFromArray EMPTY_ARRAY_FOR_SIDES; +GVAR(waitingRespawnDelayedListHash) = createHashMapFromArray EMPTY_ARRAY_FOR_SIDES; //Total respawn count (log stuff) -GVAR(totalRespawnCount) = createHashMapFromArray ZEROS_FOR_SIDES; \ No newline at end of file +GVAR(totalRespawnCountHash) = createHashMapFromArray ZEROS_FOR_SIDES; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf b/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf index 3fb44de..8c3804d 100644 --- a/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf +++ b/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf @@ -24,8 +24,8 @@ if (_respawnType isEqualTo 0) exitWith { private _playerUID = getPlayerUID _player; //if player disconnected and came back. So no ticket wasted. -if (GVAR(disconnectedPlayers) getOrDefault [_playerUID, false]) exitWith { - GVAR(disconnectedPlayers) set [_uid, false]; +if (GVAR(disconnectedPlayersHash) getOrDefault [_playerUID, false]) exitWith { + GVAR(disconnectedPlayersHash) set [_uid, false]; [5] remoteExecCall ["setPlayerRespawnTime", _player]; }; diff --git a/addons/respawn/functions/fnc_briefingNotes.sqf b/addons/respawn/functions/fnc_briefingNotes.sqf index eb011d0..08f0b41 100644 --- a/addons/respawn/functions/fnc_briefingNotes.sqf +++ b/addons/respawn/functions/fnc_briefingNotes.sqf @@ -36,7 +36,7 @@ if (GVAR(briefingEnableShowRespawnType)) then { }; if (GVAR(briefingEnableShowTime)) then { - private _waveLenghtTimeHash = GVAR(waveLenghtTimes); + private _waveLenghtTimeHash = GVAR(waveLenghtTimesHash); _text = format ["%1

Wave interval",_text]; if (playerSide isEqualTo west || GVAR(briefingEnableShowOtherSidesDataWest)) then { _text = format ["%1
- "+localize "STR_tunres_Respawn_Briefing_WaveTime_west",_text, _waveLenghtTimeHash get west]; diff --git a/addons/respawn/functions/fnc_delayedRespawn.sqf b/addons/respawn/functions/fnc_delayedRespawn.sqf index b342690..1469042 100644 --- a/addons/respawn/functions/fnc_delayedRespawn.sqf +++ b/addons/respawn/functions/fnc_delayedRespawn.sqf @@ -17,8 +17,8 @@ params ["_unit", "_side"]; private _skip = false; if (GVAR(delayedRespawn) > 0) then { - private _hashWaitTime = GVAR(nextWaveTimes); - private _hashWaveLenght = GVAR(waveLenghtTimes); + private _hashWaitTime = GVAR(nextWaveTimesHash); + private _hashWaveLenght = GVAR(waveLenghtTimesHash); private _time = _hashWaitTime get _side; private _waveLenghtTime = _hashWaveLenght get _side; _skip = ((_time - cba_missiontime) < ((_waveLenghtTime * 60) * (GVAR(delayedRespawn) / 100))); diff --git a/addons/respawn/functions/fnc_doRespawnWave.sqf b/addons/respawn/functions/fnc_doRespawnWave.sqf index 5e5c3ea..5c3e77e 100644 --- a/addons/respawn/functions/fnc_doRespawnWave.sqf +++ b/addons/respawn/functions/fnc_doRespawnWave.sqf @@ -17,10 +17,10 @@ params [["_side", nil, [west]], ["_forceAll", false, [false]]]; if (!isServer) exitWith { }; -private _totalRespawnCountHash = GVAR(totalRespawnCount); +private _totalRespawnCountHash = GVAR(totalRespawnCountHash); private _totalRespawnCount = _totalRespawnCountHash get _side; -private _waitingRespawnHash = GVAR(waitingRespawnList); -private _waitingRespawnDelayedHash = GVAR(waitingRespawnDelayedList); +private _waitingRespawnHash = GVAR(waitingRespawnListHash); +private _waitingRespawnDelayedHash = GVAR(waitingRespawnDelayedListHash); private _waitingRespawn = _waitingRespawnHash get _side; private _waitingRespawnDelayed = _waitingRespawnDelayedHash get _side; @@ -60,7 +60,7 @@ if (count _waitingRespawn > 0) then { LOG("No more units to respawn"); [_handle] call CBA_fnc_removePerFrameHandler; - //private _waitingRespawnDelayedHash = GVAR(waitingRespawnDelayedList); + //private _waitingRespawnDelayedHash = GVAR(waitingRespawnDelayedListHash); private _waitingRespawnDelayed = _waitingRespawnDelayedHash get _side; { diff --git a/addons/respawn/functions/fnc_getTicketCount.sqf b/addons/respawn/functions/fnc_getTicketCount.sqf index 57a505e..92afb19 100644 --- a/addons/respawn/functions/fnc_getTicketCount.sqf +++ b/addons/respawn/functions/fnc_getTicketCount.sqf @@ -18,7 +18,7 @@ params [["_side", nil, [west]], ["_player", objNull, [objNull]], ["_doHint", fal private "_ticketCount"; switch (GVAR(respawnType)) do { case 1: { //Side ticket - private _hash = GVAR(tickets); + private _hash = GVAR(ticketsHash); _ticketCount = _hash get _side; }; case 2: { // Player tickets @@ -28,7 +28,7 @@ switch (GVAR(respawnType)) do { _ticketCount = _hash getOrDefault [_playerUID, -10]; if (_ticketCount isEqualTo -10) then { - _ticketCount = GVAR(tickets) get _side; + _ticketCount = GVAR(ticketsHash) get _side; _hash set [_playerUID, _ticketCount, true]; }; } else { diff --git a/addons/respawn/functions/fnc_getTicketCountClient.sqf b/addons/respawn/functions/fnc_getTicketCountClient.sqf index 0903fe2..4fa002b 100644 --- a/addons/respawn/functions/fnc_getTicketCountClient.sqf +++ b/addons/respawn/functions/fnc_getTicketCountClient.sqf @@ -19,11 +19,11 @@ GVAR(playerTickets) private _ticketCount = switch (GVAR(respawnType)) do { case 1: { //Side ticket - private _hash = GVAR(tickets); + private _hash = GVAR(ticketsHash); _hash get _side; }; case 2: { // Player tickets - missionNamespace getVariable [QGVAR(playerTickets), GVAR(tickets) get _side]; + missionNamespace getVariable [QGVAR(playerTickets), GVAR(ticketsHash) get _side]; }; default { breakWith "Not using tickest"; diff --git a/addons/respawn/functions/fnc_moduleRespawnPoint.sqf b/addons/respawn/functions/fnc_moduleRespawnPoint.sqf index b982acd..f330b5c 100644 --- a/addons/respawn/functions/fnc_moduleRespawnPoint.sqf +++ b/addons/respawn/functions/fnc_moduleRespawnPoint.sqf @@ -62,18 +62,18 @@ switch (_markername) do { }; }; -private _values = GVAR(flagPoles) get _side; +private _values = GVAR(flagPolesHash) get _side; _values set [0, _flag]; -GVAR(flagPoles) set [_side, _values]; -publicVariable QGVAR(flagPoles); +GVAR(flagPolesHash) set [_side, _values]; +publicVariable QGVAR(flagPolesHash); //Set flag texure, if given texture exist if (fileExists _flagTexture) then { _flag setFlagTexture _flagTexture; }; -GVAR(enabledSides) set [_side, true]; -publicVariable QGVAR(enabledSides); +GVAR(enabledSidesHash) set [_side, true]; +publicVariable QGVAR(enabledSidesHash); GVAR(respawnPointsHash) set [_side, [_markername, _pos]]; publicVariable QGVAR(respawnPointsHash); diff --git a/addons/respawn/functions/fnc_moduleWaitingArea.sqf b/addons/respawn/functions/fnc_moduleWaitingArea.sqf index 6f7d4a1..1ddd09b 100644 --- a/addons/respawn/functions/fnc_moduleWaitingArea.sqf +++ b/addons/respawn/functions/fnc_moduleWaitingArea.sqf @@ -80,12 +80,12 @@ if (fileExists _flagTexture) then { }, _side] call CBA_fnc_waitUntilAndExecute; -private _values = GVAR(flagPoles) get _side; +private _values = GVAR(flagPolesHash) get _side; _values set [1, _flag]; -GVAR(flagPoles) set [_side, _values]; -publicVariable QGVAR(flagPoles); +GVAR(flagPolesHash) set [_side, _values]; +publicVariable QGVAR(flagPolesHash); -GVAR(waitingArea) set [_side, [_markername, _logic, _pos]]; -publicVariable QGVAR(waitingArea); +GVAR(waitingAreaHash) set [_side, [_markername, _logic, _pos]]; +publicVariable QGVAR(waitingAreaHash); // Module function is executed by spawn command, so returned value is not necessary, but it's good practice. true \ No newline at end of file diff --git a/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf b/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf index 340baba..df69ef5 100644 --- a/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf +++ b/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf @@ -14,6 +14,6 @@ */ #include "script_component.hpp" -private _hash = GVAR(nextWaveTimes); +private _hash = GVAR(nextWaveTimesHash); private _waitTime = (_hash get playerSide) - cba_missiontime; format [localize "STR_tunres_MSP_remaining_time", [_waitTime] call CBA_fnc_formatElapsedTime] call CBA_fnc_notify; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_setTicketCount.sqf b/addons/respawn/functions/fnc_setTicketCount.sqf index 981db39..79d335d 100644 --- a/addons/respawn/functions/fnc_setTicketCount.sqf +++ b/addons/respawn/functions/fnc_setTicketCount.sqf @@ -18,8 +18,8 @@ params [["_target", nil, [objnull, west]], ["_count", nil, [0]]]; switch (GVAR(respawnType)) do { case 1: { if (IS_SIDE(_target)) then { - GVAR(tickets) set [_target, _count]; - publicVariable QGVAR(tickets); + GVAR(ticketsHash) set [_target, _count]; + publicVariable QGVAR(ticketsHash); breakWith true; } else { ERROR("Tried to set side tickest, but did not give side"); diff --git a/addons/respawn/functions/fnc_timer.sqf b/addons/respawn/functions/fnc_timer.sqf index 50de4e8..c2c548e 100644 --- a/addons/respawn/functions/fnc_timer.sqf +++ b/addons/respawn/functions/fnc_timer.sqf @@ -19,27 +19,27 @@ if (!isServer) exitWith { }; if (GVAR(forcedRespawn)) exitWith { INFO("No timer, Only forced waves"); }; -private _hashWaitTime = GVAR(nextWaveTimes); -private _hashWaveLenght = GVAR(waveLenghtTimes); +private _hashWaitTime = GVAR(nextWaveTimesHash); +private _hashWaveLenght = GVAR(waveLenghtTimesHash); private _time = round ((_hashWaitTime get _side) + (_hashWaveLenght get _side) * 60); _hashWaitTime set [_side, _time]; -publicVariable QGVAR(nextWaveTimes); +publicVariable QGVAR(nextWaveTimesHash); -if !( GVAR(timerRunning) getOrDefault [_side, false]) then { - GVAR(timerRunning) set [_side, true]; - publicVariable QGVAR(timerRunning); +if !( GVAR(timerRunningHash) getOrDefault [_side, false]) then { + GVAR(timerRunningHash) set [_side, true]; + publicVariable QGVAR(timerRunningHash); [{ _this params["_side"]; - GVAR(allowRespawn) get _side && - { cba_missiontime >= GVAR(nextWaveTimes) get _side } + GVAR(allowRespawnHash) get _side && + { cba_missiontime >= GVAR(nextWaveTimesHash) get _side } }, { _this params["_side"]; if (EGVAR(msp,enable)) then { [_side] call EFUNC(msp,contestedCheck); }; - GVAR(timerRunning) set [_side, false]; - publicVariable QGVAR(timerRunning); + GVAR(timerRunningHash) set [_side, false]; + publicVariable QGVAR(timerRunningHash); [_side] call FUNC(doRespawnWave); [_side] call FUNC(timer); }, [_side]] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf index 371a82a..a454b7f 100644 --- a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf +++ b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf @@ -25,13 +25,13 @@ if (isnull _player || !(_player in allPlayers) || !alive _player ) exitWith { private _unitList = _hash get _side; FILTER(_unitList,(!isnull _x && _x in allPlayers && alive _x )); _hash set [_side, _unitList]; -} forEach [GVAR(waitingRespawnList), GVAR(waitingRespawnDelayedList)]; +} forEach [GVAR(waitingRespawnListHash), GVAR(waitingRespawnDelayedListHash)]; if (isNil {_player getVariable [QGVAR(skipNextWave), nil]}) then { [_player, _side] call FUNC(delayedRespawn) }; -private _unitListHash = [GVAR(waitingRespawnList), GVAR(waitingRespawnDelayedList)] select (_player getVariable [QGVAR(skipNextWave), false]); +private _unitListHash = [GVAR(waitingRespawnListHash), GVAR(waitingRespawnDelayedListHash)] select (_player getVariable [QGVAR(skipNextWave), false]); private _unitList = _unitListHash get _side; if (_addPlayer) then { diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 61df9a9..c44d3e4 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -27,7 +27,7 @@ if (!isNil QGVAR(uselesBody)) then { [player, true, _playerSide] remoteExecCall [QFUNC(updateWaitingRespawnList),2]; -private _respawnWaitingarea = (GVAR(waitingArea) get _playerSide) select 1; +private _respawnWaitingarea = (GVAR(waitingAreaHash) get _playerSide) select 1; private _waitingRange = GVAR(waitingAreaRange); private _respawnType = GVAR(respawnType); GVAR(mark) = 0; @@ -45,12 +45,12 @@ GVAR(waitingAreaPFH) = [{ if (isNil "_playerSkipsWave") exitWith {}; //Show remaining time - private _hashWaitTime = GVAR(nextWaveTimes); + private _hashWaitTime = GVAR(nextWaveTimesHash); private _waitTime = _hashWaitTime get _playerSide; private _remainingWaitTime = round (_waitTime - cba_missiontime); if (_playerSkipsWave) then { - private _hashWaveLenght = GVAR(waveLenghtTimes); + private _hashWaveLenght = GVAR(waveLenghtTimesHash); private _waveLenght = _hashWaveLenght get _playerSide; _remainingWaitTime = _remainingWaitTime + (_waveLenght*60); }; @@ -64,7 +64,7 @@ GVAR(waitingAreaPFH) = [{ playSound "TacticalPing"; }; - private _allowRespawn = GVAR(allowRespawn) get _playerSide; + private _allowRespawn = GVAR(allowRespawnHash) get _playerSide; private _text = format ["%1", localize "STR_tunres_Respawn_FNC_only_forced_waves"]; if (_remainingWaitTime >= 0 && { _allowRespawn }) then { _text = format ["%2
%1
", ([_remainingWaitTime] call CBA_fnc_formatElapsedTime), localize "STR_tunres_Respawn_FNC_remaining_time"]; From 8dfaf4e689283058f657fdb5de1e2873c8caa337 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 16 Jun 2024 12:17:41 +0300 Subject: [PATCH 138/228] fix variable --- addons/respawn/functions/fnc_getTicketCountClient.sqf | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/addons/respawn/functions/fnc_getTicketCountClient.sqf b/addons/respawn/functions/fnc_getTicketCountClient.sqf index 4fa002b..78c9c13 100644 --- a/addons/respawn/functions/fnc_getTicketCountClient.sqf +++ b/addons/respawn/functions/fnc_getTicketCountClient.sqf @@ -15,15 +15,13 @@ if (!hasInterface) exitWith { }; params [["_doHint", false, [true]]]; private _side = playerSide; -GVAR(playerTickets) - private _ticketCount = switch (GVAR(respawnType)) do { case 1: { //Side ticket private _hash = GVAR(ticketsHash); - _hash get _side; + _hash get _side }; case 2: { // Player tickets - missionNamespace getVariable [QGVAR(playerTickets), GVAR(ticketsHash) get _side]; + missionNamespace getVariable [QGVAR(playerTickets), GVAR(ticketsHash) get _side] }; default { breakWith "Not using tickest"; From 1e7cc3c0a3d3bed1c109c25194bcce60c33fe56d Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 16 Jun 2024 19:00:36 +0300 Subject: [PATCH 139/228] Fix respawn spectator modes&sides --- addons/main/script_macros.hpp | 8 +- addons/respawn/XEH_preInit.sqf | 75 ++++++++++++++----- .../respawn/functions/fnc_startSpectator.sqf | 28 +++---- 3 files changed, 74 insertions(+), 37 deletions(-) diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index c730d46..1a852e5 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -25,4 +25,10 @@ #define EMPTY_ARRAY_FOR_SIDES [[west,[]],[east,[]],[resistance,[]],[civilian,[]]] #define ZEROS_FOR_SIDES [[west,0],[east,0],[resistance,0],[civilian,0]] #define FALSES_FOR_SIDES [[west,false],[east,false],[resistance,false],[civilian,false]] -#define TRUES_FOR_SIDES [[west,true],[east,true],[resistance,true],[civilian,true]] \ No newline at end of file +#define TRUES_FOR_SIDES [[west,true],[east,true],[resistance,true],[civilian,true]] + +//Spectator modes +#define MODE_FREE 0 +#define MODE_FPS 1 +#define MODE_FOLLOW 2 +#define ALL_MODES [MODE_FREE,MODE_FPS,MODE_FOLLOW] \ No newline at end of file diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index adb14ab..746431d 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -27,10 +27,8 @@ GVAR(timerRunningHash) = createHashMapFromArray FALSES_FOR_SIDES; ISNILS(GVAR(teleportPoints),[]); //allowed sides to spectate -GVAR(allowedSpectateSidesWest) = [west]; -GVAR(allowedSpectateSidesEast) = [east]; -GVAR(allowedSpectateSidesResistance) = [resistance]; -GVAR(allowedSpectateSidesCivilian) = [civilian]; +GVAR(allowedSpectateSidesHash) = createHashMapFromArray EMPTY_ARRAY_FOR_SIDES; +GVAR(allowedSpectateCameraModes) = []; //flag poles [mainbase,waitingrea] GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[objNull,objNull]],[resistance,[objNull,objNull]],[civilian,[objNull,objNull]]]; @@ -208,7 +206,12 @@ GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[ob [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], true, 1, - {}, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateCameraModes) pushBackUnique MODE_FPS; + }; + }, true ] call CBA_Settings_fnc_init; @@ -219,7 +222,12 @@ GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[ob [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], true, 1, - {}, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateCameraModes) pushBackUnique MODE_FOLLOW; + }; + }, true ] call CBA_Settings_fnc_init; @@ -230,7 +238,12 @@ GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[ob [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], true, 1, - {}, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateCameraModes) pushBackUnique MODE_FREE; + }; + }, true ] call CBA_Settings_fnc_init; @@ -245,7 +258,9 @@ GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[ob { params ["_value"]; if (_value) then { - GVAR(allowedSpectateSidesWest) pushBack east; + private _values = GVAR(allowedSpectateSidesHash) get west; + _values pushBackUnique east; + GVAR(allowedSpectateSidesHash) set [west, _values]; }; }, true @@ -261,7 +276,9 @@ GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[ob { params ["_value"]; if (_value) then { - GVAR(allowedSpectateSidesWest) pushBack resistance; + private _values = GVAR(allowedSpectateSidesHash) get west; + _values pushBackUnique resistance; + GVAR(allowedSpectateSidesHash) set [west, _values]; }; }, true @@ -277,7 +294,9 @@ GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[ob { params ["_value"]; if (_value) then { - GVAR(allowedSpectateSidesWest) pushBack civilian; + private _values = GVAR(allowedSpectateSidesHash) get west; + _values pushBackUnique civilian; + GVAR(allowedSpectateSidesHash) set [west, _values]; }; }, true @@ -294,7 +313,9 @@ GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[ob { params ["_value"]; if (_value) then { - GVAR(allowedSpectateSidesEast) pushBack west; + private _values = GVAR(allowedSpectateSidesHash) get east; + _values pushBackUnique west; + GVAR(allowedSpectateSidesHash) set [east, _values]; }; }, true @@ -310,7 +331,9 @@ GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[ob { params ["_value"]; if (_value) then { - GVAR(allowedSpectateSidesEast) pushBack resistance; + private _values = GVAR(allowedSpectateSidesHash) get east; + _values pushBackUnique resistance; + GVAR(allowedSpectateSidesHash) set [east, _values]; }; }, true @@ -326,7 +349,9 @@ GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[ob { params ["_value"]; if (_value) then { - GVAR(allowedSpectateSidesEast) pushBack civilian; + private _values = GVAR(allowedSpectateSidesHash) get east; + _values pushBackUnique civilian; + GVAR(allowedSpectateSidesHash) set [east, _values]; }; }, true @@ -343,7 +368,9 @@ GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[ob { params ["_value"]; if (_value) then { - GVAR(allowedSpectateSidesResistance) pushBack west; + private _values = GVAR(allowedSpectateSidesHash) get resistance; + _values pushBackUnique west; + GVAR(allowedSpectateSidesHash) set [resistance, _values]; }; }, true @@ -359,7 +386,9 @@ GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[ob { params ["_value"]; if (_value) then { - GVAR(allowedSpectateSidesResistance) pushBack east; + private _values = GVAR(allowedSpectateSidesHash) get resistance; + _values pushBackUnique east; + GVAR(allowedSpectateSidesHash) set [resistance, _values]; }; }, true @@ -376,7 +405,9 @@ GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[ob { params ["_value"]; if (_value) then { - GVAR(allowedSpectateSidesResistance) pushBack civilian; + private _values = GVAR(allowedSpectateSidesHash) get resistance; + _values pushBackUnique civilian; + GVAR(allowedSpectateSidesHash) set [resistance, _values]; }; }, true @@ -393,7 +424,9 @@ GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[ob { params ["_value"]; if (_value) then { - GVAR(allowedSpectateSidesCivilian) pushBack west; + private _values = GVAR(allowedSpectateSidesHash) get civilian; + _values pushBackUnique west; + GVAR(allowedSpectateSidesHash) set [civilian, _values]; }; }, true @@ -409,7 +442,9 @@ GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[ob { params ["_value"]; if (_value) then { - GVAR(allowedSpectateSidesCivilian) pushBack east; + private _values = GVAR(allowedSpectateSidesHash) get civilian; + _values pushBackUnique east; + GVAR(allowedSpectateSidesHash) set [civilian, _values]; }; }, true @@ -426,7 +461,9 @@ GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[ob { params ["_value"]; if (_value) then { - GVAR(allowedSpectateSidesCivilian) pushBack resistance; + private _values = GVAR(allowedSpectateSidesHash) get civilian; + _values pushBackUnique resistance; + GVAR(allowedSpectateSidesHash) set [civilian, _values]; }; }, true diff --git a/addons/respawn/functions/fnc_startSpectator.sqf b/addons/respawn/functions/fnc_startSpectator.sqf index 84dcd1c..efe81ff 100644 --- a/addons/respawn/functions/fnc_startSpectator.sqf +++ b/addons/respawn/functions/fnc_startSpectator.sqf @@ -15,31 +15,25 @@ #include "script_component.hpp" if (!hasInterface) exitWith { }; +LOG("Start spectator"); -private _allowedSides = switch (playerSide) do { - case west: { GVAR(allowedSpectateSidesWest) }; - case east: { GVAR(allowedSpectateSidesEast) }; - case resistance: { GVAR(allowedSpectateSidesResistance) }; - case civilian: { GVAR(allowedSpectateSidesCivilian) }; - default { [west, east, resistance, civilian] }; -}; +private _allowedSides = +GVAR(allowedSpectateSidesHash) get playerSide; +_allowedSides pushBackUnique playerSide; + +private _notAllowedSides = [west, east, resistance, civilian] - _allowedSides; // use ace spectator if using ace if ((isClass(configFile >> "CfgPatches" >> "ace_main"))) then { [] call ace_spectator_fnc_setSpectator; //force spectator - [_allowedSides, [west, east, resistance, civilian]] call ace_spectator_fnc_updateSides; + //Set allowed sides + [_allowedSides, _notAllowedSides] call ace_spectator_fnc_updateSides; //Set camera modes - [[], [0,1,2]] call ace_spectator_fnc_updateCameraModes; - - private _Cameramodes = []; - - if (GVAR(spectateCameramode1st)) then { _Cameramodes pushBack 0; }; - if (GVAR(spectateCameramode3th)) then { _Cameramodes pushBack 1; }; - if (GVAR(spectateCameramodeFree)) then { _Cameramodes pushBack 2; }; - - [_Cameramodes, []] call ace_spectator_fnc_updateCameraModes; + private _allowedCameraModes = +GVAR(allowedSpectateCameraModes); + private _notAllowedCameraModes = ALL_MODES - _allowedCameraModes; + + [_allowedCameraModes, _notAllowedCameraModes] call ace_spectator_fnc_updateCameraModes; } else { ["Initialize", [ player, From df1e15928ee717030f6d49edb34dc0b4e267b31e Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 16 Jun 2024 19:00:44 +0300 Subject: [PATCH 140/228] Logs --- addons/respawn/functions/fnc_respawnUnit.sqf | 1 + addons/respawn/functions/fnc_updateWaitingRespawnList.sqf | 1 + addons/respawn/functions/fnc_waitingArea.sqf | 1 + 3 files changed, 3 insertions(+) diff --git a/addons/respawn/functions/fnc_respawnUnit.sqf b/addons/respawn/functions/fnc_respawnUnit.sqf index 89324c0..ef5aa25 100644 --- a/addons/respawn/functions/fnc_respawnUnit.sqf +++ b/addons/respawn/functions/fnc_respawnUnit.sqf @@ -20,6 +20,7 @@ private _respawnPosition = getMarkerPos ((_respawnPointsHash get _side) select 0 [_unit, false, _side] call FUNC(updateWaitingRespawnList); _unit setVariable [QGVAR(isWaitingRespawn), false, true]; +player setVariable [QGVAR(skipNextWave), nil]; private _text = localize "STR_tunres_Respawn_FNC_moveRespawnText"; diff --git a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf index a454b7f..1747868 100644 --- a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf +++ b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf @@ -28,6 +28,7 @@ if (isnull _player || !(_player in allPlayers) || !alive _player ) exitWith { } forEach [GVAR(waitingRespawnListHash), GVAR(waitingRespawnDelayedListHash)]; if (isNil {_player getVariable [QGVAR(skipNextWave), nil]}) then { + LOG("Check if unit needs to be at delayed respawn"); [_player, _side] call FUNC(delayedRespawn) }; diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index c44d3e4..8fd3414 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -21,6 +21,7 @@ LOG("Start waiting area"); //tell server to add this player to list if (!isNil QGVAR(uselesBody)) then { + LOG("Delete old body"); deleteVehicle GVAR(uselesBody); GVAR(uselesBody) = nil; }; From 241587e1b759f7fe8a78c92e277b28713bd74ad4 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 8 Aug 2024 21:17:45 +0300 Subject: [PATCH 141/228] Create sqflint.yml --- .github/workflows/sqflint.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/sqflint.yml diff --git a/.github/workflows/sqflint.yml b/.github/workflows/sqflint.yml new file mode 100644 index 0000000..a2d0daf --- /dev/null +++ b/.github/workflows/sqflint.yml @@ -0,0 +1,17 @@ +# main.yml +name: CI + +on: + push: + branches: + - master + pull_request: ~ + +jobs: + test-sqflint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + + - uses: arma-actions/sqflint@v1.0 + name: Validate with SQFLint \ No newline at end of file From 88ee9b2c81f4ff4c6cec92a2b19bb3a3ea1779ae Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 31 Aug 2024 21:12:29 +0300 Subject: [PATCH 142/228] Fix ace action conditions --- addons/msp/functions/fnc_addAceActions.sqf | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/addons/msp/functions/fnc_addAceActions.sqf b/addons/msp/functions/fnc_addAceActions.sqf index 3b69f72..d020ad9 100644 --- a/addons/msp/functions/fnc_addAceActions.sqf +++ b/addons/msp/functions/fnc_addAceActions.sqf @@ -35,7 +35,8 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { private _remove_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide} && {_target getVariable [QGVAR(isMSP), false]} }; _removeMSP = ["Pack MSP", localize "STR_tunres_MSP_AceAction_PackMSP", "\a3\3den\data\cfgwaypoints\load_ca.paa", {[_target, false] call FUNC(startUpdateDeployementStatus);}, _remove_condition, {}, [], [0, 0, 0], 2, [false, true, false, false, false]] call ace_interact_menu_fnc_createAction; - private _aliveAndSameSideConditio = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; + private _aliveAndSameSideConditio = {alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; + private _aliveAndSameSideAndIsMSPConditio = {alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide} && _target getVariable [QGVAR(isMSP), false]}; //check time private _chekTime = ["Check Respawn Time", localize "STR_tunres_Respawn_AceAction_CheckNextWaveTime", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", EFUNC(respawn,remainingWaitTimeNotification), _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; @@ -47,7 +48,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { private _checkContest= ["Check if MSP contested", localize "STR_tunres_MSP_AceAction_CheckIfMspContested", "", { private _text = localize (["STR_tunres_MSP_NotContested","STR_tunres_MSP_IsContested"] select (_target getVariable [QGVAR(isContested), false])); _text call cba_fnc_notify; - }, _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; + }, _aliveAndSameSideAndIsMSPConditio] call ace_interact_menu_fnc_createAction; //Ace inteaction [_vehicle, 1, ["ACE_SelfActions"], _createMSP] call ace_interact_menu_fnc_addActionToClass; @@ -59,12 +60,10 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { //TP. I hate this system already. [_vehicle, "InitPost", { params ["_entity"]; - - private _menu_condition = "alive _target && {_target getVariable [ '"+ QGVAR(isMSP) +"' , false]} && {!(_target getVariable ['tunres_msp_isContested', false])}"; - private _tp_conditionText = " private _msp = "+ QGVAR(activeVehicleHash) +" get playerSide; private _status = _msp getVariable ['tunres_msp_isContested', false]; (_target isNotEqualTo _msp && _obj getVariable [ '"+ QGVAR(isMSP) +"' , false] && !_status) "; + private _menu_condition = toString {alive _target && {_target getVariable [QGVAR(isMSP), false]} && {!(_target getVariable [QGVAR(isContested), false])}}; + private _tp_conditionText = toString {private _msp = GVAR(activeVehicleHash) get playerSide; private _status = _msp getVariable [QGVAR(isContested), false]; (_target isNotEqualTo _msp && _obj getVariable [QGVAR(isMSP), false] && !_status)}; [_entity, _tp_conditionText, localize "STR_tunres_MSP_TpText", false, nil, [playerSide], true, _menu_condition, false, ["ACE_MainActions",QEGVAR(main,respawnAction)]] call EFUNC(respawn,addCustomTeleporter); - }, false, [], true] call CBA_fnc_addClassEventHandler; if (GVAR(allowCheckTicketsMSP) && EGVAR(respawn,respawnType) isNotEqualTo 0) then { From 782cd71221afac125eaf4a3d2efeaabb696ab37f Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 31 Aug 2024 21:13:16 +0300 Subject: [PATCH 143/228] update versions --- .hemtt/project.toml | 2 +- addons/main/script_version.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.hemtt/project.toml b/.hemtt/project.toml index 1d669c1..b2809c9 100644 --- a/.hemtt/project.toml +++ b/.hemtt/project.toml @@ -10,7 +10,7 @@ include = [ ] [version] -git_hash = 8 +git_hash = 0 [binarize] enabled = true diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index cb62fcf..c493ffd 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 1 #define MINOR 8 #define PATCH 0 -#define BUILD 0 \ No newline at end of file +#define BUILD 3 \ No newline at end of file From 0d2e4840584275db3acb1a4dfc066dbcb298c528 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 31 Aug 2024 21:25:33 +0300 Subject: [PATCH 144/228] test logs to aar macros --- addons/main/script_macros.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 1a852e5..12a02b2 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -16,9 +16,9 @@ //AAR enabled check #define AAR_IS_ENABLED !isnil "afi_aar2" //AAR update macro -#define AAR_UPDATE(OBJ,VARNAME,VALUE) if ( AAR_IS_ENABLED ) then { [OBJ, VARNAME, VALUE] call afi_aar2_fnc_addcustomdata; } +#define AAR_UPDATE(OBJ,VARNAME,VALUE) if ( AAR_IS_ENABLED ) then { [OBJ, VARNAME, VALUE] call afi_aar2_fnc_addcustomdata; LOG("aar update thing done")} else {LOG("Skip aar update")} //AAR event -#define AAR_EVENT(TEXT,INSTIGATOR,TARGET,POI) if ( AAR_IS_ENABLED ) then { if (isServer) then { [TEXT,INSTIGATOR,TARGET,POI] call afi_aar2_fnc_addCustomEvent;} else {[TEXT,INSTIGATOR,TARGET,POI] remoteExecCall ["afi_aar2_fnc_addCustomEvent", 2]} }; +#define AAR_EVENT(TEXT,INSTIGATOR,TARGET,POI) if ( AAR_IS_ENABLED ) then { if (isServer) then { [TEXT,INSTIGATOR,TARGET,POI] call afi_aar2_fnc_addCustomEvent;LOG("AAR servuri eventti")} else {[TEXT,INSTIGATOR,TARGET,POI] remoteExecCall ["afi_aar2_fnc_addCustomEvent", 2]; LOG("Remote event to servuri AAR")}; LOG("aar thing done")} else {LOG("Skip eventti aar")} //Hash template macros From 0205c9b99797dfcee56e67522a9756721813f862 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 3 Sep 2024 17:56:57 +0300 Subject: [PATCH 145/228] Hemtt auto convert cases --- addons/respawn/XEH_postInit_client.sqf | 2 +- addons/respawn/XEH_postInit_server.sqf | 4 ++-- addons/respawn/functions/fnc_blackscreen.sqf | 2 +- addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf | 2 +- addons/respawn/functions/fnc_doRespawnWave.sqf | 4 ++-- addons/respawn/functions/fnc_getParentAction.sqf | 4 ++-- addons/respawn/functions/fnc_removegear.sqf | 4 ++-- addons/respawn/functions/fnc_respawnUnit.sqf | 2 +- addons/respawn/functions/fnc_setTicketCount.sqf | 2 +- addons/respawn/functions/fnc_updateRespawnMarkers.sqf | 2 +- addons/respawn/functions/fnc_updateWaitingRespawnList.sqf | 4 ++-- addons/respawn/functions/fnc_waitingArea.sqf | 4 ++-- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/addons/respawn/XEH_postInit_client.sqf b/addons/respawn/XEH_postInit_client.sqf index 5af3b56..ce361fa 100644 --- a/addons/respawn/XEH_postInit_client.sqf +++ b/addons/respawn/XEH_postInit_client.sqf @@ -44,7 +44,7 @@ ADDON // Add killed EH [player, "killed", { params ["_unit", "_killer", "_instigator", "_useEffects"]; - if (player getvariable [QGVAR(isWaitingRespawn), false]) then { + if (player getVariable [QGVAR(isWaitingRespawn), false]) then { [GVAR(waitingAreaPFH)] call CBA_fnc_removePerFrameHandler; GVAR(waitingAreaPFH) = nil; GVAR(uselesBody) = _unit; diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 081d590..065065d 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" -if (!GVAR(enable)) exitwith { +if (!GVAR(enable)) exitWith { INFO("Respawn not enabled, server exit"); }; @@ -34,7 +34,7 @@ addMissionEventHandler ["HandleDisconnect", { }]; //AAR times -if ( !isnil "afi_aar2" ) then { +if ( !isNil "afi_aar2" ) then { [{cba_missiontime > 10}, { if (missionNamespace getVariable ["afi_aar2", false]) then { diff --git a/addons/respawn/functions/fnc_blackscreen.sqf b/addons/respawn/functions/fnc_blackscreen.sqf index 2701d47..0c72958 100644 --- a/addons/respawn/functions/fnc_blackscreen.sqf +++ b/addons/respawn/functions/fnc_blackscreen.sqf @@ -23,7 +23,7 @@ params [["_text",""],["_duration", 10]]; _camera = "camera" camCreate [(getPos player select 0),(getPos player select 1),100]; _camera cameraEffect ["internal","back"]; -_camera camSetFOV 0.700; +_camera camSetFov 0.700; _camera camSetTarget player; _camera camCommit 0; diff --git a/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf b/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf index 8c3804d..7aea492 100644 --- a/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf +++ b/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf @@ -30,7 +30,7 @@ if (GVAR(disconnectedPlayersHash) getOrDefault [_playerUID, false]) exitWith { }; //Player was already in respawn area. -if ( _player getvariable [QGVAR(isWaitingRespawn), false]) exitWith { +if ( _player getVariable [QGVAR(isWaitingRespawn), false]) exitWith { LOG("Player already waiting respawn"); [1] remoteExecCall ["setPlayerRespawnTime", _player]; }; diff --git a/addons/respawn/functions/fnc_doRespawnWave.sqf b/addons/respawn/functions/fnc_doRespawnWave.sqf index 5c3e77e..b5385e1 100644 --- a/addons/respawn/functions/fnc_doRespawnWave.sqf +++ b/addons/respawn/functions/fnc_doRespawnWave.sqf @@ -27,8 +27,8 @@ private _waitingRespawnDelayed = _waitingRespawnDelayedHash get _side; if (count _waitingRespawn > 0 || count _waitingRespawnDelayed > 0) then { //Filter ghost units out - FILTER(_waitingRespawn,(!isnull _x && _x in allPlayers && alive _x )); - FILTER(_waitingRespawnDelayed,(!isnull _x && _x in allPlayers && alive _x )); + FILTER(_waitingRespawn,(!isNull _x && _x in allPlayers && alive _x )); + FILTER(_waitingRespawnDelayed,(!isNull _x && _x in allPlayers && alive _x )); //If forced all, clears delayed respawn if (_forceAll) then { diff --git a/addons/respawn/functions/fnc_getParentAction.sqf b/addons/respawn/functions/fnc_getParentAction.sqf index a9cec01..09142e7 100644 --- a/addons/respawn/functions/fnc_getParentAction.sqf +++ b/addons/respawn/functions/fnc_getParentAction.sqf @@ -18,8 +18,8 @@ params [["_object", objNull,[objNull]]]; private _parentAction = []; //check if there is base actions made in config, if not checks if there is made with script -if (isClass(configFile >> "CfgVehicles" >> typeof _object >> "ACE_Actions")) then { - _parentAction = [configName (("true" configClasses (configFile >> "CfgVehicles" >> typeof _object >> "ACE_Actions")) select 0)]; +if (isClass(configFile >> "CfgVehicles" >> typeOf _object >> "ACE_Actions")) then { + _parentAction = [configName (("true" configClasses (configFile >> "CfgVehicles" >> typeOf _object >> "ACE_Actions")) select 0)]; } else { private _allActions = _object getVariable ["ace_interact_menu_actions", []]; { diff --git a/addons/respawn/functions/fnc_removegear.sqf b/addons/respawn/functions/fnc_removegear.sqf index 6d9a13f..656eb4b 100644 --- a/addons/respawn/functions/fnc_removegear.sqf +++ b/addons/respawn/functions/fnc_removegear.sqf @@ -23,5 +23,5 @@ removeGoggles player; removeVest player; removeBackpack player; player linkItem "itemMap"; -player linkitem "itemWatch"; -player linkitem "ItemCompass"; \ No newline at end of file +player linkItem "itemWatch"; +player linkItem "ItemCompass"; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_respawnUnit.sqf b/addons/respawn/functions/fnc_respawnUnit.sqf index ef5aa25..31b6390 100644 --- a/addons/respawn/functions/fnc_respawnUnit.sqf +++ b/addons/respawn/functions/fnc_respawnUnit.sqf @@ -13,7 +13,7 @@ * [_side, _unit] call tunres_Respawn_fnc_respawnUnit */ #include "script_component.hpp" -params [["_side", nil, [west]], ["_unit", objnull, [objnull]]]; +params [["_side", nil, [west]], ["_unit", objNull, [objNull]]]; private _respawnPointsHash = GVAR(respawnPointsHash); private _respawnPosition = getMarkerPos ((_respawnPointsHash get _side) select 0); diff --git a/addons/respawn/functions/fnc_setTicketCount.sqf b/addons/respawn/functions/fnc_setTicketCount.sqf index 79d335d..3937f25 100644 --- a/addons/respawn/functions/fnc_setTicketCount.sqf +++ b/addons/respawn/functions/fnc_setTicketCount.sqf @@ -13,7 +13,7 @@ */ #include "script_component.hpp" if (!isServer) exitWith { }; -params [["_target", nil, [objnull, west]], ["_count", nil, [0]]]; +params [["_target", nil, [objNull, west]], ["_count", nil, [0]]]; switch (GVAR(respawnType)) do { case 1: { diff --git a/addons/respawn/functions/fnc_updateRespawnMarkers.sqf b/addons/respawn/functions/fnc_updateRespawnMarkers.sqf index df10e5f..05676ed 100644 --- a/addons/respawn/functions/fnc_updateRespawnMarkers.sqf +++ b/addons/respawn/functions/fnc_updateRespawnMarkers.sqf @@ -31,7 +31,7 @@ if ((getMarkerPos _localRespawnPosMarker) distance2D (getMarkerPos _localMainBas }; //maker marker bigger, if waiting respawn just because -if (player getvariable [QGVAR(isWaitingRespawn), false]) then { +if (player getVariable [QGVAR(isWaitingRespawn), false]) then { _localRespawnPosMarker setMarkerSizeLocal [3,3]; } else { _localRespawnPosMarker setMarkerSizeLocal [1,1]; diff --git a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf index 1747868..c2f4f8f 100644 --- a/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf +++ b/addons/respawn/functions/fnc_updateWaitingRespawnList.sqf @@ -16,14 +16,14 @@ #include "script_component.hpp" params [["_player", nil, [objNull]], ["_addPlayer", nil, [false]], ["_side", nil, [west]]]; -if (isnull _player || !(_player in allPlayers) || !alive _player ) exitWith { +if (isNull _player || !(_player in allPlayers) || !alive _player ) exitWith { LOG("Tried to add unit what is not there"); }; { private _hash = _x; private _unitList = _hash get _side; - FILTER(_unitList,(!isnull _x && _x in allPlayers && alive _x )); + FILTER(_unitList,(!isNull _x && _x in allPlayers && alive _x )); _hash set [_side, _unitList]; } forEach [GVAR(waitingRespawnListHash), GVAR(waitingRespawnDelayedListHash)]; diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 8fd3414..cc05c8d 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -35,7 +35,7 @@ GVAR(mark) = 0; GVAR(waitingAreaPFH) = [{ _args params ["_respawnWaitingarea", "_playerSide", "_waitingRange", "_respawnType"]; - if !( player getvariable QGVAR(isWaitingRespawn) ) exitWith { + if !( player getVariable QGVAR(isWaitingRespawn) ) exitWith { GVAR(waitingAreaPFH) = nil; [_handle] call CBA_fnc_removePerFrameHandler; }; @@ -70,7 +70,7 @@ GVAR(waitingAreaPFH) = [{ if (_remainingWaitTime >= 0 && { _allowRespawn }) then { _text = format ["%2
%1
", ([_remainingWaitTime] call CBA_fnc_formatElapsedTime), localize "STR_tunres_Respawn_FNC_remaining_time"]; } else { - if (player getvariable [QGVAR(isWaitingRespawn), true] && { !(GVAR(forcedRespawn)) } && { !_allowRespawn }) then { + if (player getVariable [QGVAR(isWaitingRespawn), true] && { !(GVAR(forcedRespawn)) } && { !_allowRespawn }) then { _text = format ["%1", localize "STR_tunres_Respawn_FNC_RespawnDisabled"]; } else { _text = format ["Something is vevy vevy wrong. time: %1 - allowRespawn: %2 - forced respawn: %3 ", _remainingWaitTime, _allowRespawn, GVAR(forcedRespawn)]; From f15fcc0835fe0a3c6d7af1279746a744e632bf68 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 3 Sep 2024 17:57:27 +0300 Subject: [PATCH 146/228] positions to ASL positions --- addons/msp/functions/fnc_checkContestZoneArea.sqf | 2 +- addons/msp/functions/fnc_contestedCheck.sqf | 4 ++-- addons/msp/functions/fnc_createContestZoneMarkers.sqf | 6 +++--- addons/msp/functions/fnc_createMspProps.sqf | 2 +- addons/msp/functions/fnc_updateDeployementStatus.sqf | 2 +- addons/respawn/functions/fnc_addCustomTeleporter.sqf | 2 +- addons/respawn/functions/fnc_blackscreen.sqf | 2 +- addons/respawn/functions/fnc_moduleRespawnPoint.sqf | 2 +- addons/respawn/functions/fnc_moduleTeleport.sqf | 2 +- addons/respawn/functions/fnc_moduleWaitingArea.sqf | 4 ++-- addons/respawn/functions/fnc_teleportButton.sqf | 2 +- addons/respawn/functions/fnc_teleportUnit.sqf | 2 +- addons/respawn/functions/fnc_waitingArea.sqf | 2 +- 13 files changed, 17 insertions(+), 17 deletions(-) diff --git a/addons/msp/functions/fnc_checkContestZoneArea.sqf b/addons/msp/functions/fnc_checkContestZoneArea.sqf index 985ef74..4548c73 100644 --- a/addons/msp/functions/fnc_checkContestZoneArea.sqf +++ b/addons/msp/functions/fnc_checkContestZoneArea.sqf @@ -19,7 +19,7 @@ if (playerSide isEqualTo sideLogic || !hasInterface) exitWith { }; params[["_target", player]]; openMap true; -private _pos = getPos _target; +private _pos = getPosASL _target; [_pos] call FUNC(createContestZoneMarkers); diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index e073927..d9908ca 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -42,7 +42,7 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { }; } forEach _sidesToCheck; - private _pos = getpos _msp; + private _pos = getPosASL _msp; private _unitsInArea = _allunits inAreaArray [_pos, _contestedRadiusMax, _contestedRadiusMax, 0, false, (_contestedRadiusMax/2)]; private _enemiesInArea = _unitsInArea select {(side _x) in _enemySides}; private _friendliesInArea = (count _unitsInArea) - (count _enemiesInArea); @@ -77,7 +77,7 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { [_side, false] call EFUNC(respawn,updateRespawnPoint); (call compile (localize "STR_tunres_MSP_FNC_Contested_hint")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; } else { - [_side, true, (getPos _msp) ] call EFUNC(respawn,updateRespawnPoint); + [_side, true, (getPosASL _msp) ] call EFUNC(respawn,updateRespawnPoint); (call compile (localize "STR_tunres_MSP_FNC_secured_hint")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; }; }; diff --git a/addons/msp/functions/fnc_createContestZoneMarkers.sqf b/addons/msp/functions/fnc_createContestZoneMarkers.sqf index 4a6fd93..7700fc6 100644 --- a/addons/msp/functions/fnc_createContestZoneMarkers.sqf +++ b/addons/msp/functions/fnc_createContestZoneMarkers.sqf @@ -23,9 +23,9 @@ private _reportEnemiesRange = _values param [1]; private _contestedRadiusMax = _values param [2]; private _contestedRadiusMin = _values param [3]; -private _posMax = _pos getPos [_contestedRadiusMax, 100]; -private _posMin = _pos getPos [_contestedRadiusMin, 90]; -private _posReport = _pos getPos [_reportEnemiesRange, 80]; +private _posMax = _pos getPosASL [_contestedRadiusMax, 100]; +private _posMin = _pos getPosASL [_contestedRadiusMin, 90]; +private _posReport = _pos getPosASL [_reportEnemiesRange, 80]; // * 0: Marker name diff --git a/addons/msp/functions/fnc_createMspProps.sqf b/addons/msp/functions/fnc_createMspProps.sqf index 4aaece8..de6c53b 100644 --- a/addons/msp/functions/fnc_createMspProps.sqf +++ b/addons/msp/functions/fnc_createMspProps.sqf @@ -21,5 +21,5 @@ params ["_msp"]; _net = "CamoNet_BLUFOR_open_F" createVehicle [0,0,0]; _net attachTo [_msp,[0,0,0]]; _net setDir 90; -_net setPos getPos _net; +_net setPosASL getPosASL _net; _msp setVariable [QGVAR(objects), [_net], true]; \ No newline at end of file diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index 68934f4..38dea81 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -55,7 +55,7 @@ if (_setup) then { }; -private _pos = getpos _msp; +private _pos = getPosASL _msp; [_side, _setup, _pos] remoteExecCall [QEFUNC(respawn,updateRespawnPoint), 2]; diff --git a/addons/respawn/functions/fnc_addCustomTeleporter.sqf b/addons/respawn/functions/fnc_addCustomTeleporter.sqf index b12ce0a..781a151 100644 --- a/addons/respawn/functions/fnc_addCustomTeleporter.sqf +++ b/addons/respawn/functions/fnc_addCustomTeleporter.sqf @@ -46,7 +46,7 @@ if (_createMarker) then { private _markerName = MARKER_NAME(_name); - private _marker = [_markerName, getpos _obj, _name, _markerIcon, nil, 1, 100] call FUNC(createLocalMarker); + private _marker = [_markerName, getPosASL _obj, _name, _markerIcon, nil, 1, 100] call FUNC(createLocalMarker); _obj setVariable [QGVAR(markerName), _marker]; }; diff --git a/addons/respawn/functions/fnc_blackscreen.sqf b/addons/respawn/functions/fnc_blackscreen.sqf index 0c72958..a1062a7 100644 --- a/addons/respawn/functions/fnc_blackscreen.sqf +++ b/addons/respawn/functions/fnc_blackscreen.sqf @@ -21,7 +21,7 @@ params [["_text",""],["_duration", 10]]; [format [" %1", _text],-1, -1, _duration] spawn BIS_fnc_dynamicText; -_camera = "camera" camCreate [(getPos player select 0),(getPos player select 1),100]; +_camera = "camera" camCreate [(getPosASL player select 0),(getPosASL player select 1),100]; _camera cameraEffect ["internal","back"]; _camera camSetFov 0.700; _camera camSetTarget player; diff --git a/addons/respawn/functions/fnc_moduleRespawnPoint.sqf b/addons/respawn/functions/fnc_moduleRespawnPoint.sqf index f330b5c..b7b2866 100644 --- a/addons/respawn/functions/fnc_moduleRespawnPoint.sqf +++ b/addons/respawn/functions/fnc_moduleRespawnPoint.sqf @@ -21,7 +21,7 @@ private _logic = param [0,objNull,[objNull]]; private _markername = _logic getVariable ["respawn_side","none"]; private _flagTexture = _logic getVariable ["flag_texture",""]; -private _pos = getPos _logic; +private _pos = getPosASL _logic; if (_markername isEqualTo "none") exitWith { hint localize "STR_tunres_Respawn_Module_RespanPos_novalue"; false }; // Exit if no side private _marker = ""; diff --git a/addons/respawn/functions/fnc_moduleTeleport.sqf b/addons/respawn/functions/fnc_moduleTeleport.sqf index 34fd1d3..d7ed754 100644 --- a/addons/respawn/functions/fnc_moduleTeleport.sqf +++ b/addons/respawn/functions/fnc_moduleTeleport.sqf @@ -17,7 +17,7 @@ private _logic = param [0,objNull,[objNull]]; if (isServer) then { private _obj = _logic getVariable [QGVAR(teleportPointOBJ), "FlagPole_F"]; - _obj = _obj createVehicle getpos _logic; + _obj = _obj createVehicle getPosASL _logic; _logic setVariable [QGVAR(teleportObject), _obj, true]; }; diff --git a/addons/respawn/functions/fnc_moduleWaitingArea.sqf b/addons/respawn/functions/fnc_moduleWaitingArea.sqf index 1ddd09b..f57cf16 100644 --- a/addons/respawn/functions/fnc_moduleWaitingArea.sqf +++ b/addons/respawn/functions/fnc_moduleWaitingArea.sqf @@ -28,14 +28,14 @@ if (_markername isEqualTo "none") exitWith { // Exit if no side }; if (getMarkerColor _markername isEqualTo "") then { - _marker = [_markername, getPos _logic, "icon", [1, 1], "PERSIST", "TYPE:", "Empty"] call CBA_fnc_createMarker; + _marker = [_markername, getPosASL _logic, "icon", [1, 1], "PERSIST", "TYPE:", "Empty"] call CBA_fnc_createMarker; _marker setMarkerAlpha 0; } else { private _errorText = format [(localize "STR_tunres_Respawn_Module_WaitingArea_MultipleMarkers"), _markername]; ERROR_MSG(_errorText); }; -private _pos = getPos _logic; +private _pos = getPosASL _logic; private _flag = objNull; private _side = nil; diff --git a/addons/respawn/functions/fnc_teleportButton.sqf b/addons/respawn/functions/fnc_teleportButton.sqf index 2f6fa2d..d2e2546 100644 --- a/addons/respawn/functions/fnc_teleportButton.sqf +++ b/addons/respawn/functions/fnc_teleportButton.sqf @@ -28,7 +28,7 @@ private _teleportConditio = call compile (_teleportConditioText); private _teleportName = _obj getVariable [QGVAR(teleportName), "TP"]; -private _destination = getpos _obj; +private _destination = getPosASL _obj; private _text = format["%1 %2", localize "STR_tunres_Respawn_Teleporting", _teleportName]; if (_teleportConditio) then { diff --git a/addons/respawn/functions/fnc_teleportUnit.sqf b/addons/respawn/functions/fnc_teleportUnit.sqf index f39ff6a..67d3b25 100644 --- a/addons/respawn/functions/fnc_teleportUnit.sqf +++ b/addons/respawn/functions/fnc_teleportUnit.sqf @@ -35,7 +35,7 @@ if (_godMode) then { [_text, 10] remoteExecCall [QFUNC(blackscreen), _unit]; // make player screen black and prevent them moving right away so server can keep up. -_unit setPos ([_destination, _range] call CBA_fnc_randPos); +_unit setPosASL ([_destination, _range] call CBA_fnc_randPos); [QGVAR(EH_unitTeleported), [_unit, _destination]] call CBA_fnc_serverEvent; diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index cc05c8d..a57f4bf 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -92,7 +92,7 @@ GVAR(waitingAreaPFH) = [{ //make sure that player is still in area if !(player inArea [_respawnWaitingarea, _waitingRange, _waitingRange, 0, false]) then { - player setPos ([_respawnWaitingarea, (_waitingRange / 2)] call CBA_fnc_randPos); + player setPosASL ([_respawnWaitingarea, (_waitingRange / 2)] call CBA_fnc_randPos); "Get over here!" call CBA_fnc_notify; }; }, 1, [_respawnWaitingarea, _playerSide, _waitingRange,_respawnType]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file From b85acd2ffd355c81559c97c741ae48ee2f21e04c Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 3 Sep 2024 18:03:08 +0300 Subject: [PATCH 147/228] Revert mass change error --- addons/msp/functions/fnc_createContestZoneMarkers.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/msp/functions/fnc_createContestZoneMarkers.sqf b/addons/msp/functions/fnc_createContestZoneMarkers.sqf index 7700fc6..4a6fd93 100644 --- a/addons/msp/functions/fnc_createContestZoneMarkers.sqf +++ b/addons/msp/functions/fnc_createContestZoneMarkers.sqf @@ -23,9 +23,9 @@ private _reportEnemiesRange = _values param [1]; private _contestedRadiusMax = _values param [2]; private _contestedRadiusMin = _values param [3]; -private _posMax = _pos getPosASL [_contestedRadiusMax, 100]; -private _posMin = _pos getPosASL [_contestedRadiusMin, 90]; -private _posReport = _pos getPosASL [_reportEnemiesRange, 80]; +private _posMax = _pos getPos [_contestedRadiusMax, 100]; +private _posMin = _pos getPos [_contestedRadiusMin, 90]; +private _posReport = _pos getPos [_reportEnemiesRange, 80]; // * 0: Marker name From 2b8251d6c5f9f329cf2b9da2a77491796c2a54ac Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 3 Sep 2024 18:14:40 +0300 Subject: [PATCH 148/228] case sensivity --- addons/main/script_macros.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 12a02b2..8aec0e4 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -14,7 +14,7 @@ #define MARKER_NAME(var1) FORMAT_2("%1_%2",QUOTE(ADDON),var1) //AAR enabled check -#define AAR_IS_ENABLED !isnil "afi_aar2" +#define AAR_IS_ENABLED !isNil "afi_aar2" //AAR update macro #define AAR_UPDATE(OBJ,VARNAME,VALUE) if ( AAR_IS_ENABLED ) then { [OBJ, VARNAME, VALUE] call afi_aar2_fnc_addcustomdata; LOG("aar update thing done")} else {LOG("Skip aar update")} //AAR event From 0aa5d0d72b83a9ee6f0efb8e5e490e75eb12d14b Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 4 Sep 2024 22:45:22 +0300 Subject: [PATCH 149/228] split cba settings to include --- addons/msp/XEH_preInit.sqf | 563 +------------------------- addons/msp/initSettings.inc.sqf | 562 ++++++++++++++++++++++++++ addons/respawn/XEH_preInit.sqf | 601 +--------------------------- addons/respawn/initSettings.inc.sqf | 600 +++++++++++++++++++++++++++ 4 files changed, 1164 insertions(+), 1162 deletions(-) create mode 100644 addons/msp/initSettings.inc.sqf create mode 100644 addons/respawn/initSettings.inc.sqf diff --git a/addons/msp/XEH_preInit.sqf b/addons/msp/XEH_preInit.sqf index 357fd8d..83969cb 100644 --- a/addons/msp/XEH_preInit.sqf +++ b/addons/msp/XEH_preInit.sqf @@ -13,567 +13,6 @@ GVAR(contestValuesHash) = createHashMapFromArray [[west,[0,0,0,0,0,false]],[east GVAR(contestHandlesHash) = createHashMap; GVAR(contestCheckRunningHash) = createHashMapFromArray FALSES_FOR_SIDES; -[ - QGVAR(enable), - "CHECKBOX", - [localize "STR_tunres_MSP_CBA_Enable", localize "STR_tunres_MSP_CBA_tooltip_Enable"], - localize "STR_tunres_MSP_CBA_Category_main", - false, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(allowCheckTicketsMSP), - "CHECKBOX", - [localize "STR_tunres_MSP_CBA_allowCheckTicketsMSP", localize "STR_tunres_Respawn_CBA_tooltip_CheckTickets"], - localize "STR_tunres_MSP_CBA_Category_main", - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(reportEnemiesEnabledWest), - "CHECKBOX", - [(localize "STR_tunres_MSP_CBA_reportEnemiesEnabled") + " West", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], - true, - 1, - { - params ["_value"]; - private _array = GVAR(contestValuesHash) get west; - _array set [5, _value]; - GVAR(contestValuesHash) set [west, _array]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(reportEnemiesEnabledEast), - "CHECKBOX", - [(localize "STR_tunres_MSP_CBA_reportEnemiesEnabled") + " East", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], - true, - 1, - { - params ["_value"]; - private _array = GVAR(contestValuesHash) get east; - _array set [5, _value]; - GVAR(contestValuesHash) set [east, _array]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(reportEnemiesEnabledResistance), - "CHECKBOX", - [(localize "STR_tunres_MSP_CBA_reportEnemiesEnabled") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], - true, - 1, - { - params ["_value"]; - private _array = GVAR(contestValuesHash) get resistance; - _array set [5, _value]; - GVAR(contestValuesHash) set [resistance, _array]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(reportEnemiesEnabledCivilian), - "CHECKBOX", - [(localize "STR_tunres_MSP_CBA_reportEnemiesEnabled" + " Civilian"), localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], - true, - 1, - { - params ["_value"]; - private _array = GVAR(contestValuesHash) get civilian; - _array set [5, _value]; - GVAR(contestValuesHash) set [civilian, _array]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(reportEnemiesIntervalWest), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_reportEnemiesIntervala") + " West", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], - [1, 600, 60, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(reportEnemiesIntervalWest) = _value; - private _array = GVAR(contestValuesHash) get west; - _array set [0, _value]; - GVAR(contestValuesHash) set [west, _array]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(reportEnemiesIntervalEast), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_reportEnemiesIntervala") + " East", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], - [1, 600, 60, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(reportEnemiesIntervalEast) = _value; - private _array = GVAR(contestValuesHash) get east; - _array set [0, _value]; - GVAR(contestValuesHash) set [east, _array]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(reportEnemiesIntervalResistance), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_reportEnemiesIntervala") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], - [1, 600, 60, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(reportEnemiesIntervalResistance) = _value; - private _array = GVAR(contestValuesHash) get resistance; - _array set [0, _value]; - GVAR(contestValuesHash) set [resistance, _array]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(reportEnemiesIntervalCivilian), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_reportEnemiesIntervala") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], - [1, 600, 60, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(reportEnemiesIntervalCivilian) = _value; - private _array = GVAR(contestValuesHash) get civilian; - _array set [0, _value]; - GVAR(contestValuesHash) set [civilian, _array]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(reportEnemiesRangeWest), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_reportEnemiesRange") + " West", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], - [0, 5000, 500, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(reportEnemiesRangeWest) = _value; - private _array = GVAR(contestValuesHash) get west; - _array set [1, _value]; - GVAR(contestValuesHash) set [west, _array]; - }, - false -] call CBA_Settings_fnc_init; - -[ - QGVAR(reportEnemiesRangeEast), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_reportEnemiesRange") + " East", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], - [0, 5000, 500, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(reportEnemiesRangeEast) = _value; - private _array = GVAR(contestValuesHash) get east; - _array set [1, _value]; - GVAR(contestValuesHash) set [east, _array]; - }, - false -] call CBA_Settings_fnc_init; - -[ - QGVAR(reportEnemiesRangeResistance), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_reportEnemiesRange") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], - [0, 5000, 500, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(reportEnemiesRangeResistance) = _value; - private _array = GVAR(contestValuesHash) get resistance; - _array set [1, _value]; - GVAR(contestValuesHash) set [resistance, _array]; - }, - false -] call CBA_Settings_fnc_init; - -[ - QGVAR(reportEnemiesRangeCivilian), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_reportEnemiesRange") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], - [0, 5000, 500, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(reportEnemiesRangeCivilian) = _value; - private _array = GVAR(contestValuesHash) get civilian; - _array set [1, _value]; - GVAR(contestValuesHash) set [civilian, _array]; - }, - false -] call CBA_Settings_fnc_init; - -[ - QGVAR(contestedRadiusMaxWest), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedRadiusMax") + " West", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], - [0, 3000, 500, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(contestedRadiusMaxWest) = _value; - private _array = GVAR(contestValuesHash) get west; - _array set [2, _value]; - GVAR(contestValuesHash) set [west, _array]; - }, - false -] call CBA_Settings_fnc_init; - -[ - QGVAR(contestedRadiusMaxEast), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedRadiusMax") + " East", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], - [0, 3000, 500, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(contestedRadiusMaxEast) = _value; - private _array = GVAR(contestValuesHash) get east; - _array set [2, _value]; - GVAR(contestValuesHash) set [east, _array]; - }, - false -] call CBA_Settings_fnc_init; - -[ - QGVAR(contestedRadiusMaxResistance), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedRadiusMax") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], - [0, 3000, 500, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(contestedRadiusMaxResistance) = _value; - private _array = GVAR(contestValuesHash) get resistance; - _array set [2, _value]; - GVAR(contestValuesHash) set [resistance, _array]; - }, - false -] call CBA_Settings_fnc_init; - -[ - QGVAR(contestedRadiusMaxCivilian), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedRadiusMax") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], - [0, 3000, 500, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(contestedRadiusMaxCivilian) = _value; - private _array = GVAR(contestValuesHash) get civilian; - _array set [2, _value]; - GVAR(contestValuesHash) set [civilian, _array]; - }, - false -] call CBA_Settings_fnc_init; - -[ - QGVAR(contestedRadiusMinWest), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedRadiusMin") + " West", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], - [0, 3000, 200, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(contestedRadiusMinWest) = _value; - private _array = GVAR(contestValuesHash) get west; - _array set [3, _value]; - GVAR(contestValuesHash) set [west, _array]; - }, - false -] call CBA_Settings_fnc_init; - -[ - QGVAR(contestedRadiusMinEast), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedRadiusMin") + " East", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], - [0, 3000, 200, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(contestedRadiusMinEast) = _value; - private _array = GVAR(contestValuesHash) get east; - _array set [3, _value]; - GVAR(contestValuesHash) set [east, _array]; - }, - false -] call CBA_Settings_fnc_init; - -[ - QGVAR(contestedRadiusMinResistance), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedRadiusMin") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], - [0, 3000, 200, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(contestedRadiusMinResistance) = _value; - private _array = GVAR(contestValuesHash) get resistance; - _array set [3, _value]; - GVAR(contestValuesHash) set [resistance, _array]; - }, - false -] call CBA_Settings_fnc_init; - -[ - QGVAR(contestedRadiusMinCivilian), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedRadiusMin") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], - [0, 3000, 200, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(contestedRadiusMinCivilian) = _value; - private _array = GVAR(contestValuesHash) get civilian; - _array set [3, _value]; - GVAR(contestValuesHash) set [civilian, _array]; - }, - false -] call CBA_Settings_fnc_init; - -[ - QGVAR(contestedCheckIntervalWest), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedCheckInterval") + " West", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], - [1, 600, 20, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(contestedCheckIntervalWest) = _value; - private _array = GVAR(contestValuesHash) get west; - _array set [4, _value]; - GVAR(contestValuesHash) set [west, _array]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(contestedCheckIntervalEast), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedCheckInterval") + " East", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], - [1, 600, 20, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(contestedCheckIntervalEast) = _value; - private _array = GVAR(contestValuesHash) get east; - _array set [4, _value]; - GVAR(contestValuesHash) set [west, _array]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(contestedCheckIntervalResistance), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedCheckInterval") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], - [1, 600, 20, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(contestedCheckIntervalResistance) = _value; - private _array = GVAR(contestValuesHash) get resistance; - _array set [4, _value]; - GVAR(contestValuesHash) set [resistance, _array]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(contestedCheckIntervalCivilian), - "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedCheckInterval") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], - [1, 600, 20, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(contestedCheckIntervalCivilian) = _value; - private _array = GVAR(contestValuesHash) get civilian; - _array set [4, _value]; - GVAR(contestValuesHash) set [civilian, _array]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(progresbarTimeSetup), - "SLIDER", - [localize "STR_tunres_MSP_CBA_setup_progresbar", localize "STR_tunres_MSP_CBA_tooltip_setup_ProgressBar"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_progres"], - [0, 60, 5, 0], - 1, - { - params ["_value"]; - GVAR(progresbarTimeSetup) = round _value; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(progresbarTimePack), - "SLIDER", - [localize "STR_tunres_MSP_CBA_pack_progresbar", localize "STR_tunres_MSP_CBA_tooltip_pack_progresbar"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_progres"], - [0, 60, 5, 0], - 1, - { - params ["_value"]; - GVAR(progresbarTimePack) = round _value; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(clasnamesEast), - "EDITBOX", - [localize "STR_tunres_MSP_CBA_classname_east", localize "STR_tunres_MSP_CBA_tooltip_classname"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], - "O_Truck_03_transport_F", - 1, - { - params ["_value"]; - GVAR(classnamesHash) set [east , _value]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(clasnamesWest), - "EDITBOX", - [localize "STR_tunres_MSP_CBA_classname_west", localize "STR_tunres_MSP_CBA_tooltip_classname"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], - "B_Truck_01_transport_F", - 1, - { - params ["_value"]; - GVAR(classnamesHash) set [west , _value]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(clasnamesResistance), - "EDITBOX", - [localize "STR_tunres_MSP_CBA_classname_resistance", localize "STR_tunres_MSP_CBA_tooltip_classname"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], - "I_Truck_02_transport_F", - 1, - { - params ["_value"]; - GVAR(classnamesHash) set [resistance , _value]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(clasnamesCivilian), - "EDITBOX", - [localize "STR_tunres_MSP_CBA_classname_civilian", localize "STR_tunres_MSP_CBA_tooltip_classname"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], - "C_Truck_02_transport_F", - 1, - { - params ["_value"]; - GVAR(classnamesHash) set [civilian , _value]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(setupNotification), - "LIST", - [localize "STR_tunres_MSP_CBA_whoGetsSetUpNotification", localize "STR_tunres_MSP_CBA_whoGetsSetUpNotification_Tooltip"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_notificationCategory"], - [[0, 1], ["Group Leaders", "Side"], 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(contestedNotification), - "LIST", - [localize "STR_tunres_MSP_CBA_whoGetsContestedNotification", localize "STR_tunres_MSP_CBA_whoGetsContestedNotification_Tooltip"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_notificationCategory"], - [[0, 1], ["Group Leaders", "Side"], 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(reportEnemiesNotification), - "LIST", - [localize "STR_tunres_MSP_CBA_whoGetsReportEnemiesNotification", localize "STR_tunres_MSP_CBA_whoGetsReportEnemies_Tooltip"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_notificationCategory"], - [[0, 1], ["Group Leaders", "Side"], 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; +#include "initSettings.inc.sqf" ADDON = true; \ No newline at end of file diff --git a/addons/msp/initSettings.inc.sqf b/addons/msp/initSettings.inc.sqf new file mode 100644 index 0000000..187e423 --- /dev/null +++ b/addons/msp/initSettings.inc.sqf @@ -0,0 +1,562 @@ +[ + QGVAR(enable), + "CHECKBOX", + [localize "STR_tunres_MSP_CBA_Enable", localize "STR_tunres_MSP_CBA_tooltip_Enable"], + localize "STR_tunres_MSP_CBA_Category_main", + false, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(allowCheckTicketsMSP), + "CHECKBOX", + [localize "STR_tunres_MSP_CBA_allowCheckTicketsMSP", localize "STR_tunres_Respawn_CBA_tooltip_CheckTickets"], + localize "STR_tunres_MSP_CBA_Category_main", + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesEnabledWest), + "CHECKBOX", + [(localize "STR_tunres_MSP_CBA_reportEnemiesEnabled") + " West", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], + true, + 1, + { + params ["_value"]; + private _array = GVAR(contestValuesHash) get west; + _array set [5, _value]; + GVAR(contestValuesHash) set [west, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesEnabledEast), + "CHECKBOX", + [(localize "STR_tunres_MSP_CBA_reportEnemiesEnabled") + " East", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + true, + 1, + { + params ["_value"]; + private _array = GVAR(contestValuesHash) get east; + _array set [5, _value]; + GVAR(contestValuesHash) set [east, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesEnabledResistance), + "CHECKBOX", + [(localize "STR_tunres_MSP_CBA_reportEnemiesEnabled") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], + true, + 1, + { + params ["_value"]; + private _array = GVAR(contestValuesHash) get resistance; + _array set [5, _value]; + GVAR(contestValuesHash) set [resistance, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesEnabledCivilian), + "CHECKBOX", + [(localize "STR_tunres_MSP_CBA_reportEnemiesEnabled" + " Civilian"), localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], + true, + 1, + { + params ["_value"]; + private _array = GVAR(contestValuesHash) get civilian; + _array set [5, _value]; + GVAR(contestValuesHash) set [civilian, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesIntervalWest), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_reportEnemiesIntervala") + " West", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], + [1, 600, 60, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(reportEnemiesIntervalWest) = _value; + private _array = GVAR(contestValuesHash) get west; + _array set [0, _value]; + GVAR(contestValuesHash) set [west, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesIntervalEast), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_reportEnemiesIntervala") + " East", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + [1, 600, 60, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(reportEnemiesIntervalEast) = _value; + private _array = GVAR(contestValuesHash) get east; + _array set [0, _value]; + GVAR(contestValuesHash) set [east, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesIntervalResistance), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_reportEnemiesIntervala") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], + [1, 600, 60, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(reportEnemiesIntervalResistance) = _value; + private _array = GVAR(contestValuesHash) get resistance; + _array set [0, _value]; + GVAR(contestValuesHash) set [resistance, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesIntervalCivilian), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_reportEnemiesIntervala") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], + [1, 600, 60, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(reportEnemiesIntervalCivilian) = _value; + private _array = GVAR(contestValuesHash) get civilian; + _array set [0, _value]; + GVAR(contestValuesHash) set [civilian, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesRangeWest), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_reportEnemiesRange") + " West", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], + [0, 5000, 500, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(reportEnemiesRangeWest) = _value; + private _array = GVAR(contestValuesHash) get west; + _array set [1, _value]; + GVAR(contestValuesHash) set [west, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesRangeEast), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_reportEnemiesRange") + " East", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + [0, 5000, 500, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(reportEnemiesRangeEast) = _value; + private _array = GVAR(contestValuesHash) get east; + _array set [1, _value]; + GVAR(contestValuesHash) set [east, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesRangeResistance), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_reportEnemiesRange") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], + [0, 5000, 500, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(reportEnemiesRangeResistance) = _value; + private _array = GVAR(contestValuesHash) get resistance; + _array set [1, _value]; + GVAR(contestValuesHash) set [resistance, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesRangeCivilian), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_reportEnemiesRange") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], + [0, 5000, 500, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(reportEnemiesRangeCivilian) = _value; + private _array = GVAR(contestValuesHash) get civilian; + _array set [1, _value]; + GVAR(contestValuesHash) set [civilian, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedRadiusMaxWest), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedRadiusMax") + " West", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], + [0, 3000, 500, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedRadiusMaxWest) = _value; + private _array = GVAR(contestValuesHash) get west; + _array set [2, _value]; + GVAR(contestValuesHash) set [west, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedRadiusMaxEast), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedRadiusMax") + " East", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + [0, 3000, 500, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedRadiusMaxEast) = _value; + private _array = GVAR(contestValuesHash) get east; + _array set [2, _value]; + GVAR(contestValuesHash) set [east, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedRadiusMaxResistance), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedRadiusMax") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], + [0, 3000, 500, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedRadiusMaxResistance) = _value; + private _array = GVAR(contestValuesHash) get resistance; + _array set [2, _value]; + GVAR(contestValuesHash) set [resistance, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedRadiusMaxCivilian), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedRadiusMax") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], + [0, 3000, 500, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedRadiusMaxCivilian) = _value; + private _array = GVAR(contestValuesHash) get civilian; + _array set [2, _value]; + GVAR(contestValuesHash) set [civilian, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedRadiusMinWest), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedRadiusMin") + " West", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], + [0, 3000, 200, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedRadiusMinWest) = _value; + private _array = GVAR(contestValuesHash) get west; + _array set [3, _value]; + GVAR(contestValuesHash) set [west, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedRadiusMinEast), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedRadiusMin") + " East", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + [0, 3000, 200, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedRadiusMinEast) = _value; + private _array = GVAR(contestValuesHash) get east; + _array set [3, _value]; + GVAR(contestValuesHash) set [east, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedRadiusMinResistance), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedRadiusMin") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], + [0, 3000, 200, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedRadiusMinResistance) = _value; + private _array = GVAR(contestValuesHash) get resistance; + _array set [3, _value]; + GVAR(contestValuesHash) set [resistance, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedRadiusMinCivilian), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedRadiusMin") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], + [0, 3000, 200, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedRadiusMinCivilian) = _value; + private _array = GVAR(contestValuesHash) get civilian; + _array set [3, _value]; + GVAR(contestValuesHash) set [civilian, _array]; + }, + false +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedCheckIntervalWest), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedCheckInterval") + " West", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], + [1, 600, 20, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedCheckIntervalWest) = _value; + private _array = GVAR(contestValuesHash) get west; + _array set [4, _value]; + GVAR(contestValuesHash) set [west, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedCheckIntervalEast), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedCheckInterval") + " East", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + [1, 600, 20, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedCheckIntervalEast) = _value; + private _array = GVAR(contestValuesHash) get east; + _array set [4, _value]; + GVAR(contestValuesHash) set [west, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedCheckIntervalResistance), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedCheckInterval") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], + [1, 600, 20, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedCheckIntervalResistance) = _value; + private _array = GVAR(contestValuesHash) get resistance; + _array set [4, _value]; + GVAR(contestValuesHash) set [resistance, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedCheckIntervalCivilian), + "SLIDER", + [(localize "STR_tunres_MSP_CBA_contestedCheckInterval") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], + [1, 600, 20, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(contestedCheckIntervalCivilian) = _value; + private _array = GVAR(contestValuesHash) get civilian; + _array set [4, _value]; + GVAR(contestValuesHash) set [civilian, _array]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(progresbarTimeSetup), + "SLIDER", + [localize "STR_tunres_MSP_CBA_setup_progresbar", localize "STR_tunres_MSP_CBA_tooltip_setup_ProgressBar"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_progres"], + [0, 60, 5, 0], + 1, + { + params ["_value"]; + GVAR(progresbarTimeSetup) = round _value; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(progresbarTimePack), + "SLIDER", + [localize "STR_tunres_MSP_CBA_pack_progresbar", localize "STR_tunres_MSP_CBA_tooltip_pack_progresbar"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_progres"], + [0, 60, 5, 0], + 1, + { + params ["_value"]; + GVAR(progresbarTimePack) = round _value; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(clasnamesEast), + "EDITBOX", + [localize "STR_tunres_MSP_CBA_classname_east", localize "STR_tunres_MSP_CBA_tooltip_classname"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], + "O_Truck_03_transport_F", + 1, + { + params ["_value"]; + GVAR(classnamesHash) set [east , _value]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(clasnamesWest), + "EDITBOX", + [localize "STR_tunres_MSP_CBA_classname_west", localize "STR_tunres_MSP_CBA_tooltip_classname"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], + "B_Truck_01_transport_F", + 1, + { + params ["_value"]; + GVAR(classnamesHash) set [west , _value]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(clasnamesResistance), + "EDITBOX", + [localize "STR_tunres_MSP_CBA_classname_resistance", localize "STR_tunres_MSP_CBA_tooltip_classname"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], + "I_Truck_02_transport_F", + 1, + { + params ["_value"]; + GVAR(classnamesHash) set [resistance , _value]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(clasnamesCivilian), + "EDITBOX", + [localize "STR_tunres_MSP_CBA_classname_civilian", localize "STR_tunres_MSP_CBA_tooltip_classname"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], + "C_Truck_02_transport_F", + 1, + { + params ["_value"]; + GVAR(classnamesHash) set [civilian , _value]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(setupNotification), + "LIST", + [localize "STR_tunres_MSP_CBA_whoGetsSetUpNotification", localize "STR_tunres_MSP_CBA_whoGetsSetUpNotification_Tooltip"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_notificationCategory"], + [[0, 1], ["Group Leaders", "Side"], 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(contestedNotification), + "LIST", + [localize "STR_tunres_MSP_CBA_whoGetsContestedNotification", localize "STR_tunres_MSP_CBA_whoGetsContestedNotification_Tooltip"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_notificationCategory"], + [[0, 1], ["Group Leaders", "Side"], 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(reportEnemiesNotification), + "LIST", + [localize "STR_tunres_MSP_CBA_whoGetsReportEnemiesNotification", localize "STR_tunres_MSP_CBA_whoGetsReportEnemies_Tooltip"], + [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_notificationCategory"], + [[0, 1], ["Group Leaders", "Side"], 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; \ No newline at end of file diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index 746431d..e856ac2 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -33,605 +33,6 @@ GVAR(allowedSpectateCameraModes) = []; //flag poles [mainbase,waitingrea] GVAR(flagPolesHash) = createHashMapFromArray [[west,[objNull,objNull]],[east,[objNull,objNull]],[resistance,[objNull,objNull]],[civilian,[objNull,objNull]]]; -[ - QGVAR(enable), // Unique setting name. Matches resulting variable name - "CHECKBOX", // Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" - [localize "STR_tunres_Respawn_CBA_Enable", localize "STR_tunres_Respawn_CBA_tooltip_Enable"], // Display name or display name + tooltip (optional, default: same as setting name) - localize "STR_tunres_Respawn_CBA_Category_main", // Category for the settings menu + optional sub-category - false, // Extra properties of the setting depending of _settingType. - 1, // 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) - {}, // Script to execute when setting is changed. (optional) - true //Setting will be marked as needing mission restart after being changed. (optional, default false) -] call CBA_Settings_fnc_init; - -[ - QGVAR(killJIP), - "CHECKBOX", - ["Kill JIP", localize "STR_tunres_Respawn_CBA_tooltip_killjip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(killJipTime), - "SLIDER", - ["Kill JIP Time", localize "STR_tunres_Respawn_CBA_tooltip_killJipTime"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], - [1, 300, 20, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(killJipTime) = _value; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(respawnType), - "LIST", - ["Respawn Type", localize "STR_tunres_Respawn_CBA_tooltip_respawntypes"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], - [[0, 1, 2], [localize "STR_tunres_Respawn_Type_Default", localize "STR_tunres_Respawn_Type_Sidetickets", localize "STR_tunres_Respawn_Type_Playertickets"], 0], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(gearscriptType), - "LIST", - ["Gearscript type", localize "STR_tunres_Respawn_CBA_tooltip_gearscript"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], - [[0, 1, 2, 3], ["SQF Gearscript", "Potato Tool", "Save gear", "None"], 2], - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(forcedRespawn), - "CHECKBOX", - ["Only Forced Waves", localize "STR_tunres_Respawn_CBA_tooltip_forceRespawn"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], - false, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(delayedRespawn), - "SLIDER", - ["Delayed respawn", localize "STR_tunres_Respawn_CBA_tooltip_delayedRespawn"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], - [0, 100, 0, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(delayedRespawn) = _value; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(waitingAreaRange), - "SLIDER", - ["Waiting Area Range", localize "STR_tunres_Respawn_CBA_tooltip_waitingAreaRange"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], - [30, 300, 100, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(waitingAreaRange) = _value; - }, - true -] call CBA_Settings_fnc_init; - -//Wave times -[ - QGVAR(initialWaveTimeWest), - "SLIDER", - ["West", localize "STR_tunres_Respawn_CBA_tooltip_time"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], - [1, 60, 15, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(initialWaveTimeWest) = _value; - GVAR(waveLenghtTimesHash) set [west, _value]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(initialWaveTimeEast), - "SLIDER", - ["East", localize "STR_tunres_Respawn_CBA_tooltip_time"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], - [1, 60, 15, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(initialWaveTimeEast) = _value; - GVAR(waveLenghtTimesHash) set [east, _value]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(initialWaveTimeResistance), - "SLIDER", - ["Resistance", localize "STR_tunres_Respawn_CBA_tooltip_time"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], - [1, 60, 15, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(initialWaveTimeResistance) = _value; - GVAR(waveLenghtTimesHash) set [resistance, _value]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(initialWaveTimeCivilian), - "SLIDER", - ["Civilian", localize "STR_tunres_Respawn_CBA_tooltip_time"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], - [1, 60, 15, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(initialWaveTimeCivilian) = _value; - GVAR(waveLenghtTimesHash) set [civilian, _value]; - }, - true -] call CBA_Settings_fnc_init; - -//Spectator camera modes -[ - QGVAR(spectateCameramode1st), - "CHECKBOX", - ["1st", localize "STR_tunres_Respawn_CBA_tooltip_specta_modes"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], - true, - 1, - { - params ["_value"]; - if (_value) then { - GVAR(allowedSpectateCameraModes) pushBackUnique MODE_FPS; - }; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(spectateCameramode3th), - "CHECKBOX", - ["3th", localize "STR_tunres_Respawn_CBA_tooltip_specta_modes"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], - true, - 1, - { - params ["_value"]; - if (_value) then { - GVAR(allowedSpectateCameraModes) pushBackUnique MODE_FOLLOW; - }; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(spectateCameramodeFree), - "CHECKBOX", - ["Free", localize "STR_tunres_Respawn_CBA_tooltip_specta_modes"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], - true, - 1, - { - params ["_value"]; - if (_value) then { - GVAR(allowedSpectateCameraModes) pushBackUnique MODE_FREE; - }; - }, - true -] call CBA_Settings_fnc_init; - -//allow spectate west -[ - QGVAR(allowWestSpectateEast), - "CHECKBOX", - ["East", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesWest"], - true, - 1, - { - params ["_value"]; - if (_value) then { - private _values = GVAR(allowedSpectateSidesHash) get west; - _values pushBackUnique east; - GVAR(allowedSpectateSidesHash) set [west, _values]; - }; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(allowWestSpectateResistance), - "CHECKBOX", - ["Resistance", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesWest"], - true, - 1, - { - params ["_value"]; - if (_value) then { - private _values = GVAR(allowedSpectateSidesHash) get west; - _values pushBackUnique resistance; - GVAR(allowedSpectateSidesHash) set [west, _values]; - }; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(allowWestSpectateCivilian), - "CHECKBOX", - ["Civilian", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesWest"], - true, - 1, - { - params ["_value"]; - if (_value) then { - private _values = GVAR(allowedSpectateSidesHash) get west; - _values pushBackUnique civilian; - GVAR(allowedSpectateSidesHash) set [west, _values]; - }; - }, - true -] call CBA_Settings_fnc_init; - -//allow spectate east -[ - QGVAR(allowEastSpectateWest), - "CHECKBOX", - ["West", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesEast"], - true, - 1, - { - params ["_value"]; - if (_value) then { - private _values = GVAR(allowedSpectateSidesHash) get east; - _values pushBackUnique west; - GVAR(allowedSpectateSidesHash) set [east, _values]; - }; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(allowEastSpectateResistance), - "CHECKBOX", - ["Resistance", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesEast"], - true, - 1, - { - params ["_value"]; - if (_value) then { - private _values = GVAR(allowedSpectateSidesHash) get east; - _values pushBackUnique resistance; - GVAR(allowedSpectateSidesHash) set [east, _values]; - }; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(allowEastSpectateCivilian), - "CHECKBOX", - ["Civilian", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesEast"], - true, - 1, - { - params ["_value"]; - if (_value) then { - private _values = GVAR(allowedSpectateSidesHash) get east; - _values pushBackUnique civilian; - GVAR(allowedSpectateSidesHash) set [east, _values]; - }; - }, - true -] call CBA_Settings_fnc_init; - -//allow spectate resistance -[ - QGVAR(allowResistanceSpectateWest), - "CHECKBOX", - ["West", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesResistance"], - true, - 1, - { - params ["_value"]; - if (_value) then { - private _values = GVAR(allowedSpectateSidesHash) get resistance; - _values pushBackUnique west; - GVAR(allowedSpectateSidesHash) set [resistance, _values]; - }; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(allowResistanceSpectateEast), - "CHECKBOX", - ["East", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesResistance"], - true, - 1, - { - params ["_value"]; - if (_value) then { - private _values = GVAR(allowedSpectateSidesHash) get resistance; - _values pushBackUnique east; - GVAR(allowedSpectateSidesHash) set [resistance, _values]; - }; - }, - true -] call CBA_Settings_fnc_init; - - -[ - QGVAR(allowResistanceSpectateCivilian), - "CHECKBOX", - ["Civilian", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesResistance"], - true, - 1, - { - params ["_value"]; - if (_value) then { - private _values = GVAR(allowedSpectateSidesHash) get resistance; - _values pushBackUnique civilian; - GVAR(allowedSpectateSidesHash) set [resistance, _values]; - }; - }, - true -] call CBA_Settings_fnc_init; - -//allow spectate civilians -[ - QGVAR(allowCivilianSpectateWest), - "CHECKBOX", - ["West", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesCivilian"], - true, - 1, - { - params ["_value"]; - if (_value) then { - private _values = GVAR(allowedSpectateSidesHash) get civilian; - _values pushBackUnique west; - GVAR(allowedSpectateSidesHash) set [civilian, _values]; - }; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(allowCivilianSpectateEast), - "CHECKBOX", - ["East", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesCivilian"], - true, - 1, - { - params ["_value"]; - if (_value) then { - private _values = GVAR(allowedSpectateSidesHash) get civilian; - _values pushBackUnique east; - GVAR(allowedSpectateSidesHash) set [civilian, _values]; - }; - }, - true -] call CBA_Settings_fnc_init; - - -[ - QGVAR(allowCivilianSpectateResistance), - "CHECKBOX", - ["Resistance", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesCivilian"], - true, - 1, - { - params ["_value"]; - if (_value) then { - private _values = GVAR(allowedSpectateSidesHash) get civilian; - _values pushBackUnique resistance; - GVAR(allowedSpectateSidesHash) set [civilian, _values]; - }; - }, - true -] call CBA_Settings_fnc_init; - -//Ticket count -[ - QGVAR(initialTicketsWest), - "SLIDER", - ["West", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], - [0, 1000, 0, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(initialTicketsWest) = _value; - GVAR(ticketsHash) set [west, _value]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(initialTicketsEast), - "SLIDER", - ["East", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], - [0, 1000, 0, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(initialTicketsEast) = _value; - GVAR(ticketsHash) set [east, _value]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(initialTicketsResistance), - "SLIDER", - ["Resistance", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], - [0, 1000, 0, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(initialTicketsResistance) = _value; - GVAR(ticketsHash) set [resistance, _value]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(initialTicketsCivilian), - "SLIDER", - ["Civilian", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], - [0, 1000, 0, 0], - 1, - { - params ["_value"]; - _value = round _value; - GVAR(initialTicketsCivilian) = _value; - GVAR(ticketsHash) set [civilian, _value]; - }, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(allowCheckTicketsBase), - "CHECKBOX", - ["Main base", localize "STR_tunres_Respawn_CBA_tooltip_CheckTickets"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_checkTickets"], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -//Briefing notes -[ - QGVAR(briefingEnable), - "CHECKBOX", - [localize "STR_tunres_Respawn_CBA_Briefing_Enable", localize "STR_tunres_Respawn_CBA_Briefing_Enable_tooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(briefingEnableShowRespawnType), - "CHECKBOX", - [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowRespawType", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowRespawType_tooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(briefingEnableShowTickets), - "CHECKBOX", - [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTickets", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTickets_tooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(briefingEnableShowTime), - "CHECKBOX", - [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTime", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTime_tooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(briefingEnableShowOtherSidesDataWest), - "CHECKBOX", - [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_West", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(briefingEnableShowOtherSidesDataEast), - "CHECKBOX", - [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_East", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(briefingEnableShowOtherSidesDataResistance), - "CHECKBOX", - [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_Resistance", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], - true, - 1, - {}, - true -] call CBA_Settings_fnc_init; - -[ - QGVAR(briefingEnableShowOtherSidesDataCivilian), - "CHECKBOX", - [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_Civilian", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], - false, - 1, - {}, - true -] call CBA_Settings_fnc_init; +#include "initSettings.inc.sqf" ADDON = true; \ No newline at end of file diff --git a/addons/respawn/initSettings.inc.sqf b/addons/respawn/initSettings.inc.sqf new file mode 100644 index 0000000..36254db --- /dev/null +++ b/addons/respawn/initSettings.inc.sqf @@ -0,0 +1,600 @@ +[ + QGVAR(enable), // Unique setting name. Matches resulting variable name + "CHECKBOX", // Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" + [localize "STR_tunres_Respawn_CBA_Enable", localize "STR_tunres_Respawn_CBA_tooltip_Enable"], // Display name or display name + tooltip (optional, default: same as setting name) + localize "STR_tunres_Respawn_CBA_Category_main", // Category for the settings menu + optional sub-category + false, // Extra properties of the setting depending of _settingType. + 1, // 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) + {}, // Script to execute when setting is changed. (optional) + true //Setting will be marked as needing mission restart after being changed. (optional, default false) +] call CBA_Settings_fnc_init; + +[ + QGVAR(killJIP), + "CHECKBOX", + ["Kill JIP", localize "STR_tunres_Respawn_CBA_tooltip_killjip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(killJipTime), + "SLIDER", + ["Kill JIP Time", localize "STR_tunres_Respawn_CBA_tooltip_killJipTime"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], + [1, 300, 20, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(killJipTime) = _value; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(respawnType), + "LIST", + ["Respawn Type", localize "STR_tunres_Respawn_CBA_tooltip_respawntypes"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], + [[0, 1, 2], [localize "STR_tunres_Respawn_Type_Default", localize "STR_tunres_Respawn_Type_Sidetickets", localize "STR_tunres_Respawn_Type_Playertickets"], 0], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(gearscriptType), + "LIST", + ["Gearscript type", localize "STR_tunres_Respawn_CBA_tooltip_gearscript"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], + [[0, 1, 2, 3], ["SQF Gearscript", "Potato Tool", "Save gear", "None"], 2], + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(forcedRespawn), + "CHECKBOX", + ["Only Forced Waves", localize "STR_tunres_Respawn_CBA_tooltip_forceRespawn"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], + false, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(delayedRespawn), + "SLIDER", + ["Delayed respawn", localize "STR_tunres_Respawn_CBA_tooltip_delayedRespawn"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], + [0, 100, 0, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(delayedRespawn) = _value; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(waitingAreaRange), + "SLIDER", + ["Waiting Area Range", localize "STR_tunres_Respawn_CBA_tooltip_waitingAreaRange"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], + [30, 300, 100, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(waitingAreaRange) = _value; + }, + true +] call CBA_Settings_fnc_init; + +//Wave times +[ + QGVAR(initialWaveTimeWest), + "SLIDER", + ["West", localize "STR_tunres_Respawn_CBA_tooltip_time"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], + [1, 60, 15, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(initialWaveTimeWest) = _value; + GVAR(waveLenghtTimesHash) set [west, _value]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(initialWaveTimeEast), + "SLIDER", + ["East", localize "STR_tunres_Respawn_CBA_tooltip_time"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], + [1, 60, 15, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(initialWaveTimeEast) = _value; + GVAR(waveLenghtTimesHash) set [east, _value]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(initialWaveTimeResistance), + "SLIDER", + ["Resistance", localize "STR_tunres_Respawn_CBA_tooltip_time"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], + [1, 60, 15, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(initialWaveTimeResistance) = _value; + GVAR(waveLenghtTimesHash) set [resistance, _value]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(initialWaveTimeCivilian), + "SLIDER", + ["Civilian", localize "STR_tunres_Respawn_CBA_tooltip_time"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], + [1, 60, 15, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(initialWaveTimeCivilian) = _value; + GVAR(waveLenghtTimesHash) set [civilian, _value]; + }, + true +] call CBA_Settings_fnc_init; + +//Spectator camera modes +[ + QGVAR(spectateCameramode1st), + "CHECKBOX", + ["1st", localize "STR_tunres_Respawn_CBA_tooltip_specta_modes"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], + true, + 1, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateCameraModes) pushBackUnique MODE_FPS; + }; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(spectateCameramode3th), + "CHECKBOX", + ["3th", localize "STR_tunres_Respawn_CBA_tooltip_specta_modes"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], + true, + 1, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateCameraModes) pushBackUnique MODE_FOLLOW; + }; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(spectateCameramodeFree), + "CHECKBOX", + ["Free", localize "STR_tunres_Respawn_CBA_tooltip_specta_modes"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], + true, + 1, + { + params ["_value"]; + if (_value) then { + GVAR(allowedSpectateCameraModes) pushBackUnique MODE_FREE; + }; + }, + true +] call CBA_Settings_fnc_init; + +//allow spectate west +[ + QGVAR(allowWestSpectateEast), + "CHECKBOX", + ["East", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesWest"], + true, + 1, + { + params ["_value"]; + if (_value) then { + private _values = GVAR(allowedSpectateSidesHash) get west; + _values pushBackUnique east; + GVAR(allowedSpectateSidesHash) set [west, _values]; + }; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(allowWestSpectateResistance), + "CHECKBOX", + ["Resistance", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesWest"], + true, + 1, + { + params ["_value"]; + if (_value) then { + private _values = GVAR(allowedSpectateSidesHash) get west; + _values pushBackUnique resistance; + GVAR(allowedSpectateSidesHash) set [west, _values]; + }; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(allowWestSpectateCivilian), + "CHECKBOX", + ["Civilian", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesWest"], + true, + 1, + { + params ["_value"]; + if (_value) then { + private _values = GVAR(allowedSpectateSidesHash) get west; + _values pushBackUnique civilian; + GVAR(allowedSpectateSidesHash) set [west, _values]; + }; + }, + true +] call CBA_Settings_fnc_init; + +//allow spectate east +[ + QGVAR(allowEastSpectateWest), + "CHECKBOX", + ["West", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesEast"], + true, + 1, + { + params ["_value"]; + if (_value) then { + private _values = GVAR(allowedSpectateSidesHash) get east; + _values pushBackUnique west; + GVAR(allowedSpectateSidesHash) set [east, _values]; + }; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(allowEastSpectateResistance), + "CHECKBOX", + ["Resistance", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesEast"], + true, + 1, + { + params ["_value"]; + if (_value) then { + private _values = GVAR(allowedSpectateSidesHash) get east; + _values pushBackUnique resistance; + GVAR(allowedSpectateSidesHash) set [east, _values]; + }; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(allowEastSpectateCivilian), + "CHECKBOX", + ["Civilian", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesEast"], + true, + 1, + { + params ["_value"]; + if (_value) then { + private _values = GVAR(allowedSpectateSidesHash) get east; + _values pushBackUnique civilian; + GVAR(allowedSpectateSidesHash) set [east, _values]; + }; + }, + true +] call CBA_Settings_fnc_init; + +//allow spectate resistance +[ + QGVAR(allowResistanceSpectateWest), + "CHECKBOX", + ["West", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesResistance"], + true, + 1, + { + params ["_value"]; + if (_value) then { + private _values = GVAR(allowedSpectateSidesHash) get resistance; + _values pushBackUnique west; + GVAR(allowedSpectateSidesHash) set [resistance, _values]; + }; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(allowResistanceSpectateEast), + "CHECKBOX", + ["East", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesResistance"], + true, + 1, + { + params ["_value"]; + if (_value) then { + private _values = GVAR(allowedSpectateSidesHash) get resistance; + _values pushBackUnique east; + GVAR(allowedSpectateSidesHash) set [resistance, _values]; + }; + }, + true +] call CBA_Settings_fnc_init; + + +[ + QGVAR(allowResistanceSpectateCivilian), + "CHECKBOX", + ["Civilian", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesResistance"], + true, + 1, + { + params ["_value"]; + if (_value) then { + private _values = GVAR(allowedSpectateSidesHash) get resistance; + _values pushBackUnique civilian; + GVAR(allowedSpectateSidesHash) set [resistance, _values]; + }; + }, + true +] call CBA_Settings_fnc_init; + +//allow spectate civilians +[ + QGVAR(allowCivilianSpectateWest), + "CHECKBOX", + ["West", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesCivilian"], + true, + 1, + { + params ["_value"]; + if (_value) then { + private _values = GVAR(allowedSpectateSidesHash) get civilian; + _values pushBackUnique west; + GVAR(allowedSpectateSidesHash) set [civilian, _values]; + }; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(allowCivilianSpectateEast), + "CHECKBOX", + ["East", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesCivilian"], + true, + 1, + { + params ["_value"]; + if (_value) then { + private _values = GVAR(allowedSpectateSidesHash) get civilian; + _values pushBackUnique east; + GVAR(allowedSpectateSidesHash) set [civilian, _values]; + }; + }, + true +] call CBA_Settings_fnc_init; + + +[ + QGVAR(allowCivilianSpectateResistance), + "CHECKBOX", + ["Resistance", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesCivilian"], + true, + 1, + { + params ["_value"]; + if (_value) then { + private _values = GVAR(allowedSpectateSidesHash) get civilian; + _values pushBackUnique resistance; + GVAR(allowedSpectateSidesHash) set [civilian, _values]; + }; + }, + true +] call CBA_Settings_fnc_init; + +//Ticket count +[ + QGVAR(initialTicketsWest), + "SLIDER", + ["West", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], + [0, 1000, 0, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(initialTicketsWest) = _value; + GVAR(ticketsHash) set [west, _value]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(initialTicketsEast), + "SLIDER", + ["East", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], + [0, 1000, 0, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(initialTicketsEast) = _value; + GVAR(ticketsHash) set [east, _value]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(initialTicketsResistance), + "SLIDER", + ["Resistance", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], + [0, 1000, 0, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(initialTicketsResistance) = _value; + GVAR(ticketsHash) set [resistance, _value]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(initialTicketsCivilian), + "SLIDER", + ["Civilian", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], + [0, 1000, 0, 0], + 1, + { + params ["_value"]; + _value = round _value; + GVAR(initialTicketsCivilian) = _value; + GVAR(ticketsHash) set [civilian, _value]; + }, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(allowCheckTicketsBase), + "CHECKBOX", + ["Main base", localize "STR_tunres_Respawn_CBA_tooltip_CheckTickets"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_checkTickets"], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +//Briefing notes +[ + QGVAR(briefingEnable), + "CHECKBOX", + [localize "STR_tunres_Respawn_CBA_Briefing_Enable", localize "STR_tunres_Respawn_CBA_Briefing_Enable_tooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(briefingEnableShowRespawnType), + "CHECKBOX", + [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowRespawType", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowRespawType_tooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(briefingEnableShowTickets), + "CHECKBOX", + [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTickets", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTickets_tooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(briefingEnableShowTime), + "CHECKBOX", + [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTime", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTime_tooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(briefingEnableShowOtherSidesDataWest), + "CHECKBOX", + [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_West", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(briefingEnableShowOtherSidesDataEast), + "CHECKBOX", + [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_East", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(briefingEnableShowOtherSidesDataResistance), + "CHECKBOX", + [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_Resistance", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], + true, + 1, + {}, + true +] call CBA_Settings_fnc_init; + +[ + QGVAR(briefingEnableShowOtherSidesDataCivilian), + "CHECKBOX", + [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_Civilian", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip"], + [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], + false, + 1, + {}, + true +] call CBA_Settings_fnc_init; \ No newline at end of file From e58a7eff40d1a6d7946968784496ad523800a484 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 4 Sep 2024 22:46:15 +0300 Subject: [PATCH 150/228] split cfg vehicles to include --- addons/main/CfgVehicles.hpp | 16 ++++++++++++++++ addons/main/config.cpp | 17 +---------------- 2 files changed, 17 insertions(+), 16 deletions(-) create mode 100644 addons/main/CfgVehicles.hpp diff --git a/addons/main/CfgVehicles.hpp b/addons/main/CfgVehicles.hpp new file mode 100644 index 0000000..159096a --- /dev/null +++ b/addons/main/CfgVehicles.hpp @@ -0,0 +1,16 @@ +class CfgVehicles +{ + class FlagCarrierCore; + class FlagCarrier : FlagCarrierCore + { + class ACE_Actions { + class tunres_respawn_BaseAceAction { + displayName = "Main"; + condition = "true"; + statement = "true"; + position = "[0,-0.35,-2.4]"; + distance = 9; + }; + }; + }; +}; \ No newline at end of file diff --git a/addons/main/config.cpp b/addons/main/config.cpp index a84dca2..c62a711 100644 --- a/addons/main/config.cpp +++ b/addons/main/config.cpp @@ -14,6 +14,7 @@ class CfgPatches { }; }; +#include "CfgVehicles.hpp" // information on the whole mod (only needed once) class CfgMods { class PREFIX { @@ -42,19 +43,3 @@ class CfgMods { }; // Configs go here -class CfgVehicles -{ - class FlagCarrierCore; - class FlagCarrier : FlagCarrierCore - { - class ACE_Actions { - class tunres_respawn_BaseAceAction { - displayName = "Main"; - condition = "true"; - statement = "true"; - position = "[0,-0.35,-2.4]"; - distance = 9; - }; - }; - }; -}; \ No newline at end of file From 82d02c9d364867c301dd337f2c64c58353b1b0e7 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 4 Sep 2024 22:47:13 +0300 Subject: [PATCH 151/228] add sevrver preinit --- addons/main/CfgEventHandlers.hpp | 5 +++++ addons/main/config.cpp | 3 +++ 2 files changed, 8 insertions(+) create mode 100644 addons/main/CfgEventHandlers.hpp diff --git a/addons/main/CfgEventHandlers.hpp b/addons/main/CfgEventHandlers.hpp new file mode 100644 index 0000000..03b03e6 --- /dev/null +++ b/addons/main/CfgEventHandlers.hpp @@ -0,0 +1,5 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + serverInit = QUOTE(call COMPILE_FILE(XEH_preInit_server)); + }; +}; \ No newline at end of file diff --git a/addons/main/config.cpp b/addons/main/config.cpp index c62a711..b0abd61 100644 --- a/addons/main/config.cpp +++ b/addons/main/config.cpp @@ -14,7 +14,10 @@ class CfgPatches { }; }; +// configs go here +#include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" + // information on the whole mod (only needed once) class CfgMods { class PREFIX { From dfe825f27b4f80e856996688b7f950c4f4982fb2 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 4 Sep 2024 22:47:42 +0300 Subject: [PATCH 152/228] Not sure if this does anything --- addons/respawn/config.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/addons/respawn/config.cpp b/addons/respawn/config.cpp index 691a287..1dbc02d 100644 --- a/addons/respawn/config.cpp +++ b/addons/respawn/config.cpp @@ -29,16 +29,16 @@ class CfgFactionClasses #include "TP_dialog.hpp" #include "CfgVehicles.hpp" -class CfgRespawnTemplates { - class ADDON { - displayName = "Tun wave respawn"; - //onPlayerKilled = QFUNC(respawnTemplate); - //onPlayerRespawn = QFUNC(respawnTemplate); - respawnTypes[] = {3}; - respawnDelay = 99999; - respawnOnStart = 0; - respawnTemplates[] = { }; - disabledAI = 1; - respawn = 3; - }; -}; \ No newline at end of file +// class CfgRespawnTemplates { +// class ADDON { +// displayName = "Tun wave respawn"; +// //onPlayerKilled = QFUNC(respawnTemplate); +// //onPlayerRespawn = QFUNC(respawnTemplate); +// respawnTypes[] = {3}; +// respawnDelay = 99999; +// respawnOnStart = 0; +// respawnTemplates[] = { }; +// disabledAI = 1; +// respawn = 3; +// }; +// }; \ No newline at end of file From 78a75fc08e945beb34c6eb3d6d63288f749866b3 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 4 Sep 2024 22:48:12 +0300 Subject: [PATCH 153/228] add player param for AAR --- addons/msp/functions/fnc_startUpdateDeployementStatus.sqf | 2 +- addons/msp/functions/fnc_updateDeployementStatus.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf index cb1ccd5..0d26f56 100644 --- a/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf @@ -44,4 +44,4 @@ private _code = { openMap false; }; -[_time, [_target, _setup], _code, {(localize "STR_tunres_MSP_DeployementAborted") call CBA_fnc_notify}, _text, _conditio, ["notOnMap","isnotinside"]] call ace_common_fnc_progressBar; \ No newline at end of file +[_time, [_target, _setup, player], _code, {(localize "STR_tunres_MSP_DeployementAborted") call CBA_fnc_notify}, _text, _conditio, ["notOnMap","isnotinside"]] call ace_common_fnc_progressBar; \ No newline at end of file diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index 38dea81..5b11e91 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -17,7 +17,7 @@ if (!isServer) then {}; -params [["_msp", objNull, [objNull]], ["_setup", nil, [false]]]; +params [["_msp", objNull, [objNull]], ["_setup", nil, [false]], "_player"]; private _side = _msp getVariable QGVAR(side); private _whoToNotify = [_side, GVAR(setupNotification)] call FUNC(whoToNotify); From 21ea498d3ad346a44e0ac7538a2cd0d9ccc0d252 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 4 Sep 2024 23:02:09 +0300 Subject: [PATCH 154/228] use macro --- addons/main/script_macros.hpp | 2 ++ addons/msp/functions/fnc_addEventHandlers.sqf | 2 +- addons/msp/functions/fnc_contestedCheck.sqf | 2 +- addons/respawn/XEH_postInit_server.sqf | 2 +- addons/respawn/functions/fnc_waitingArea.sqf | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 8aec0e4..4bbe91c 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -21,6 +21,8 @@ #define AAR_EVENT(TEXT,INSTIGATOR,TARGET,POI) if ( AAR_IS_ENABLED ) then { if (isServer) then { [TEXT,INSTIGATOR,TARGET,POI] call afi_aar2_fnc_addCustomEvent;LOG("AAR servuri eventti")} else {[TEXT,INSTIGATOR,TARGET,POI] remoteExecCall ["afi_aar2_fnc_addCustomEvent", 2]; LOG("Remote event to servuri AAR")}; LOG("aar thing done")} else {LOG("Skip eventti aar")} +#define ALL_SIDES [west,east,resistance,civilian] + //Hash template macros #define EMPTY_ARRAY_FOR_SIDES [[west,[]],[east,[]],[resistance,[]],[civilian,[]]] #define ZEROS_FOR_SIDES [[west,0],[east,0],[resistance,0],[civilian,0]] diff --git a/addons/msp/functions/fnc_addEventHandlers.sqf b/addons/msp/functions/fnc_addEventHandlers.sqf index 460b686..6ae78e2 100644 --- a/addons/msp/functions/fnc_addEventHandlers.sqf +++ b/addons/msp/functions/fnc_addEventHandlers.sqf @@ -84,4 +84,4 @@ ERROR(_errorText); }; }; -} forEach [west,east,resistance,civilian]; \ No newline at end of file +} forEach ALL_SIDES; \ No newline at end of file diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index d9908ca..33ba19d 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -29,7 +29,7 @@ private _msp = GVAR(activeVehicleHash) get _side; if ( _mspDeployementStatus && { !(isNull _msp) } ) then { - private _sidesToCheck = [west,east,resistance,civilian] - [_side]; + private _sidesToCheck = ALL_SIDES - [_side]; private _friendlySides = [_side]; private _enemySides = []; diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 065065d..7d5f4af 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -34,7 +34,7 @@ addMissionEventHandler ["HandleDisconnect", { }]; //AAR times -if ( !isNil "afi_aar2" ) then { +if ( AAR_IS_ENABLED ) then { [{cba_missiontime > 10}, { if (missionNamespace getVariable ["afi_aar2", false]) then { diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index a57f4bf..def7662 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -15,7 +15,7 @@ #include "script_component.hpp" private _playerSide = playerSide; -if (isDedicated || !(_playerSide in [west,east,resistance,civilian]) ) exitWith { }; +if (isDedicated || !(_playerSide in ALL_SIDES) ) exitWith { }; LOG("Start waiting area"); From e9ea24f4f47cc0a3ce7f5035075474f2f8095d2b Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 4 Sep 2024 23:02:26 +0300 Subject: [PATCH 155/228] fix missing macro and make it simpler --- addons/respawn/XEH_postInit_server.sqf | 28 +++++++++----------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 7d5f4af..536efe3 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -65,25 +65,15 @@ if ( AAR_IS_ENABLED ) then { [{ private _enabledSideHash = GVAR(enabledSidesHash); - if (_enabledSideHash getOrDefault [west, false]) then { - private _time = (_hashTime get west); - AAR_UPDATE("west","Next respawn wave",_time); - }; - - if (_enabledSideHash getOrDefault [east, false]) then { - private _time = (_hashTime get east); - AAR_UPDATE("east","Next respawn wave",_time); - }; - - if (_enabledSideHash getOrDefault [resistance, false]) then { - private _time = (_hashTime get resistance); - AAR_UPDATE("guer","Next respawn wave",_time); - }; - - if (_enabledSideHash getOrDefault [civilian, false]) then { - private _time = (_hashTime get civilian); - AAR_UPDATE("civ","Next respawn wave",_time); - }; + private _hashTime = GVAR(nextWaveTimesHash); + { + private _side = _x; + if (_enabledSideHash getOrDefault [_side, false]) then { + private _time = (_hashTime get _side); + private _sideSTR = str _side; + AAR_UPDATE(_sideSTR,"Next respawn wave",_time); + }; + } forEach ALL_SIDES; }, 10] call CBA_fnc_addPerFrameHandler; }; }] call CBA_fnc_waitUntilAndExecute; From f6066b957b73642237507ce2f29b30dfdaa132eb Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 4 Sep 2024 23:03:42 +0300 Subject: [PATCH 156/228] show actual remaining time --- addons/respawn/XEH_postInit_server.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 536efe3..432ebf2 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -69,7 +69,7 @@ if ( AAR_IS_ENABLED ) then { { private _side = _x; if (_enabledSideHash getOrDefault [_side, false]) then { - private _time = (_hashTime get _side); + private _time = round((_hashTime get _side) - cba_missiontime); private _sideSTR = str _side; AAR_UPDATE(_sideSTR,"Next respawn wave",_time); }; From dd99ce09cd62e9d3a535640d9425355a5bf983be Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 4 Sep 2024 23:06:50 +0300 Subject: [PATCH 157/228] Make AAR use cba events probably was broken before too --- addons/main/XEH_preInit_server.sqf | 18 ++++++++++++++++++ addons/main/script_macros.hpp | 4 ++-- addons/msp/functions/fnc_contestedCheck.sqf | 9 +++++++-- .../functions/fnc_updateDeployementStatus.sqf | 7 ++++++- addons/respawn/functions/fnc_doRespawnWave.sqf | 9 ++++++--- 5 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 addons/main/XEH_preInit_server.sqf diff --git a/addons/main/XEH_preInit_server.sqf b/addons/main/XEH_preInit_server.sqf new file mode 100644 index 0000000..9346d8e --- /dev/null +++ b/addons/main/XEH_preInit_server.sqf @@ -0,0 +1,18 @@ +#include "script_component.hpp" +//only executed on server + +if (AAR_IS_ENABLED) then { + LOG("AAR eventit tulille"); + [QGVAR(AAR_EventEH), { + params["_text","_instigator","_target","_poi"]; + [_text,_instigator,_target,_poi] call afi_aar2_fnc_addCustomEvent; + LOG("AAR custom eventti lisätty"); + }] call CBA_fnc_addEventHandler; + + + [QGVAR(AAR_UpdateEH), { + params["_obj","_varName","_value"]; + [_obj, _varName, _value] call afi_aar2_fnc_addcustomdata; + LOG("AAR custom data lisätty"); + }] call CBA_fnc_addEventHandler; +}; \ No newline at end of file diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 4bbe91c..3c223f1 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -16,9 +16,9 @@ //AAR enabled check #define AAR_IS_ENABLED !isNil "afi_aar2" //AAR update macro -#define AAR_UPDATE(OBJ,VARNAME,VALUE) if ( AAR_IS_ENABLED ) then { [OBJ, VARNAME, VALUE] call afi_aar2_fnc_addcustomdata; LOG("aar update thing done")} else {LOG("Skip aar update")} +#define AAR_UPDATE(OBJ,VARNAME,VALUE) [QEGVAR(main,AAR_UpdateEH), [OBJ,VARNAME,VALUE]] call CBA_fnc_serverEvent //AAR event -#define AAR_EVENT(TEXT,INSTIGATOR,TARGET,POI) if ( AAR_IS_ENABLED ) then { if (isServer) then { [TEXT,INSTIGATOR,TARGET,POI] call afi_aar2_fnc_addCustomEvent;LOG("AAR servuri eventti")} else {[TEXT,INSTIGATOR,TARGET,POI] remoteExecCall ["afi_aar2_fnc_addCustomEvent", 2]; LOG("Remote event to servuri AAR")}; LOG("aar thing done")} else {LOG("Skip eventti aar")} +#define AAR_EVENT(TEXT,INSTIGATOR,TARGET,POI) [QEGVAR(main,AAR_EventEH), [TEXT,INSTIGATOR,TARGET,POI]] call CBA_fnc_serverEvent #define ALL_SIDES [west,east,resistance,civilian] diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index 33ba19d..91c7a7e 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -64,8 +64,13 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { if (_oldContestedStatus isNotEqualTo _isContested) then { - AAR_EVENT(FORMAT_1(localize ARG_1(ARR_2(["STR_tunres_MSP_AAR_MSP_notContested","STR_tunres_MSP_AAR_MSP_isContested"]),_isContested),str _side),_msp,nil,nil); - AAR_UPDATE(_msp,"Is contested",_isContested); + if (AAR_IS_ENABLED) then { + private _text = (localize(["STR_tunres_MSP_AAR_MSP_notContested","STR_tunres_MSP_AAR_MSP_isContested"] select _isContested)); + _text = format[_text, _side]; + + AAR_EVENT(_text,_msp,nil,nil); + AAR_UPDATE(_msp,"Is contested",_isContested); + }; GVAR(contestedStatusHash) set [_side, _isContested]; publicVariable QGVAR(contestedStatusHash); diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index 5b11e91..4356ee4 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -65,7 +65,12 @@ publicVariable QGVAR(deployementStatusHash); GVAR(activeVehicleHash) set [_side, [objNull, _msp] select _setup]; publicVariable QGVAR(activeVehicleHash); -AAR_EVENT(FORMAT_1(localize ARG_1((ARR_2(["STR_tunres_MSP_AAR_MSP_Packed","STR_tunres_MSP_AAR_MSP_Deployed"])),_setup),str _side),_msp,player,nil); +if (AAR_IS_ENABLED) then { + private _text = localize(["STR_tunres_MSP_AAR_MSP_Packed","STR_tunres_MSP_AAR_MSP_Deployed"] select _setup); + _text = format[_text, _side]; + + AAR_EVENT(_text,_msp,_player,nil); +}; //Change deployement status if !(_setup) then { diff --git a/addons/respawn/functions/fnc_doRespawnWave.sqf b/addons/respawn/functions/fnc_doRespawnWave.sqf index b5385e1..9386783 100644 --- a/addons/respawn/functions/fnc_doRespawnWave.sqf +++ b/addons/respawn/functions/fnc_doRespawnWave.sqf @@ -87,11 +87,14 @@ if (count _waitingRespawn > 0) then { [QGVAR(EH_respawnWave), [_side, _waitingRespawn]] call CBA_fnc_serverEvent; - if (GVAR(respawnType) isEqualTo 1) then { - AAR_EVENT(FORMAT_4(localize "STR_tunres_Respawn_AAR_RespawnWaveTickets",str _side,_waitingRespawnCount,_totalRespawnCount,[_side] call FUNC(getTicketCount)),_msp,nil,nil); +if (AAR_IS_ENABLED) then { + private _text = if (GVAR(respawnType) isEqualTo 1) then { + format[(localize "STR_tunres_Respawn_AAR_RespawnWaveTickets"), str _side, _waitingRespawnCount, _totalRespawnCount, [_side] call FUNC(getTicketCount)]; } else { - AAR_EVENT(FORMAT_3(localize "STR_tunres_Respawn_AAR_RespawnWave",str _side,_waitingRespawnCount,_totalRespawnCount),_msp,nil,nil); + format[(localize "STR_tunres_Respawn_AAR_RespawnWave"), str _side, _waitingRespawnCount, _totalRespawnCount] }; + AAR_EVENT(_text,_msp,nil,nil); +}; } else { //No one at respawn From 7f30c2cfa64acd78c0664291290bc03d4eb9f1d2 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 5 Sep 2024 15:54:49 +0300 Subject: [PATCH 158/228] update to support new notification system --- addons/msp/functions/fnc_whoToNotify.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/msp/functions/fnc_whoToNotify.sqf b/addons/msp/functions/fnc_whoToNotify.sqf index 11aec5c..01610e4 100644 --- a/addons/msp/functions/fnc_whoToNotify.sqf +++ b/addons/msp/functions/fnc_whoToNotify.sqf @@ -23,7 +23,7 @@ if (_type isEqualTo 0) then { }; } forEach allGroups; } else { - _whoToNotify = [_side]; + _whoToNotify = allPlayers select {side _x isEqualTo _side }; }; _whoToNotify \ No newline at end of file From 1e63ccf288206aa1b09bf21a4898e3bc9f319e0b Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 5 Sep 2024 15:55:15 +0300 Subject: [PATCH 159/228] prevent headless --- addons/msp/XEH_postInit_client.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/msp/XEH_postInit_client.sqf b/addons/msp/XEH_postInit_client.sqf index de00a81..84bfe24 100644 --- a/addons/msp/XEH_postInit_client.sqf +++ b/addons/msp/XEH_postInit_client.sqf @@ -1,4 +1,5 @@ #include "script_component.hpp" +if (!hasInterface) exitWith { }; [{!isNull player && ADDON From a5bcd0489ce6531884ea0227f9553ec02d9fac83 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 5 Sep 2024 16:36:52 +0300 Subject: [PATCH 160/228] Notifications use events now --- addons/main/Stringtable.xml | 24 ++++++++++++------- addons/msp/XEH_postInit_client.sqf | 7 +++++- addons/msp/functions/fnc_addAceActions.sqf | 2 +- addons/msp/functions/fnc_addEventHandlers.sqf | 3 ++- .../fnc_checkContestZoneMarkersBriefing.sqf | 4 ++-- addons/msp/functions/fnc_contestedCheck.sqf | 11 +++++---- .../functions/fnc_startContestedChecks.sqf | 2 +- .../fnc_startUpdateDeployementStatus.sqf | 2 +- .../functions/fnc_updateDeployementStatus.sqf | 16 ++++++------- .../respawn/functions/fnc_getTicketCount.sqf | 2 +- .../functions/fnc_getTicketCountClient.sqf | 2 +- .../fnc_remainingWaitTimeNotification.sqf | 3 ++- .../respawn/functions/fnc_teleportButton.sqf | 2 +- addons/respawn/functions/fnc_waitingArea.sqf | 2 +- 14 files changed, 48 insertions(+), 34 deletions(-) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index 8426f14..cc41ae1 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -290,6 +290,14 @@ Your remaining tickets: Your remaining tickets:
+ + Can't be used during mission! + Can't be used during mission! + + + Get over here! + Get over here! +
@@ -613,12 +621,12 @@ - [['MSP has been contested!'], ['Respawn position has been updated.']] - [['MSP has been contested!'], ['Respawn position has been updated.']] + MSP has been contested!\nRespawn position has been updated. + MSP has been contested!\nRespawn position has been updated. - [['MSP has been secured!'], ['Respawn position has been updated.']] - [['MSP has been secured!'], ['Respawn position has been updated.']] + MSP has been secured!\nRespawn position has been updated. + MSP has been secured!\nRespawn position has been updated. Enemies spotted near MSP! @@ -627,12 +635,12 @@ - [['MSP has been deployed!'], ['Respawn position has been updated.']] - [['MSP has been deployed!'], ['Respawn position has been updated.']] + MSP has been deployed!\nRespawn position has been updated. + MSP has been deployed!\nRespawn position has been updated. - [['MSP has been packed!'], ['Respawn position has been updated.']] - [['MSP has been packed!'], ['Respawn position has been updated.']] + MSP has been packed!\nRespawn position has been updated. + MSP has been packed!\nRespawn position has been updated. diff --git a/addons/msp/XEH_postInit_client.sqf b/addons/msp/XEH_postInit_client.sqf index 84bfe24..de9e1a3 100644 --- a/addons/msp/XEH_postInit_client.sqf +++ b/addons/msp/XEH_postInit_client.sqf @@ -8,4 +8,9 @@ ADDON [] call FUNC(briefingNotes); [] call FUNC(addAceActions); }; -}] call CBA_fnc_waitUntilAndExecute; \ No newline at end of file +}] call CBA_fnc_waitUntilAndExecute; + +[QGVAR(doNotification), { + params ["_text", ["_duration", 7]]; + [_text, false, _duration] call ace_common_fnc_displayText; +}] call CBA_fnc_addEventHandler; \ No newline at end of file diff --git a/addons/msp/functions/fnc_addAceActions.sqf b/addons/msp/functions/fnc_addAceActions.sqf index d020ad9..3a3663c 100644 --- a/addons/msp/functions/fnc_addAceActions.sqf +++ b/addons/msp/functions/fnc_addAceActions.sqf @@ -47,7 +47,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { //Check if contested private _checkContest= ["Check if MSP contested", localize "STR_tunres_MSP_AceAction_CheckIfMspContested", "", { private _text = localize (["STR_tunres_MSP_NotContested","STR_tunres_MSP_IsContested"] select (_target getVariable [QGVAR(isContested), false])); - _text call cba_fnc_notify; + [QGVAR(doNotification), [_text]] call CBA_fnc_localEvent; }, _aliveAndSameSideAndIsMSPConditio] call ace_interact_menu_fnc_createAction; //Ace inteaction diff --git a/addons/msp/functions/fnc_addEventHandlers.sqf b/addons/msp/functions/fnc_addEventHandlers.sqf index 6ae78e2..5e68f00 100644 --- a/addons/msp/functions/fnc_addEventHandlers.sqf +++ b/addons/msp/functions/fnc_addEventHandlers.sqf @@ -70,7 +70,8 @@ //Do marker update [_side, false] remoteExecCall ["tunres_respawn_fnc_updateRespawnPoint", 2]; - (localize "STR_tunres_MSP_destroyed") remoteExecCall ["CBA_fnc_notify", _side]; + private _whoToNotify = [_side, 1] call FUNC(whoToNotify); + [QGVAR(doNotification), [localize "STR_tunres_MSP_destroyed"], _whoToNotify] call CBA_fnc_targetEvent; }; }; diff --git a/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf b/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf index beb1249..0f739f0 100644 --- a/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf +++ b/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf @@ -22,8 +22,8 @@ params[["_enable", true]]; if (_enable) then { - if (cba_missiontime > 1) exitWith { - "Can't be used during mission!" call CBA_fnc_notify; + if (cba_missiontime > 1) exitWith { + [QGVAR(doNotification), [localize "STR_tunres_MSP_checkContestCantUse"]] call CBA_fnc_localEvent; }; if (!isNil QGVAR(checkContestZoneMarkersBriefingEH)) exitWith { diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index 91c7a7e..f458bbd 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -78,13 +78,14 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { private _whoToNotify = [_side, GVAR(contestedNotification)] call FUNC(whoToNotify); if (_whoToNotify isNotEqualTo [] ) then { - if (_isContested) then { - [_side, false] call EFUNC(respawn,updateRespawnPoint); - (call compile (localize "STR_tunres_MSP_FNC_Contested_hint")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; + [_side, !_isContested] call EFUNC(respawn,updateRespawnPoint); + + private _text = if (_isContested) then { + localize "STR_tunres_MSP_FNC_Contested_hint" } else { - [_side, true, (getPosASL _msp) ] call EFUNC(respawn,updateRespawnPoint); - (call compile (localize "STR_tunres_MSP_FNC_secured_hint")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; + localize "STR_tunres_MSP_FNC_secured_hint" }; + [QGVAR(doNotification), [_text], _whoToNotify] call CBA_fnc_targetEvent; }; }; [QGVAR(EH_mspStatusUpdate), [_side, _isContested, _oldContestedStatus, _enemiesInArea, _enemiesInAreaMin, _friendliesInArea]] call CBA_fnc_globalEvent; diff --git a/addons/msp/functions/fnc_startContestedChecks.sqf b/addons/msp/functions/fnc_startContestedChecks.sqf index 3865630..7ecc6ab 100644 --- a/addons/msp/functions/fnc_startContestedChecks.sqf +++ b/addons/msp/functions/fnc_startContestedChecks.sqf @@ -56,7 +56,7 @@ if (_start) then { if (_enemyCount > 0 && !_contestedStatus) then { private _whoToNotify = [_side, GVAR(reportEnemiesNotification)] call FUNC(whoToNotify); if (_whoToNotify isNotEqualTo [] ) then { - (localize "STR_tunres_MSP_FNC_enemies_near") remoteExecCall ["CBA_fnc_notify", _whoToNotify]; + [QGVAR(doNotification), [(localize "STR_tunres_MSP_FNC_enemies_near")], _whoToNotify] call CBA_fnc_targetEvent; }; }; } else { diff --git a/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf index 0d26f56..3ee86a3 100644 --- a/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf @@ -44,4 +44,4 @@ private _code = { openMap false; }; -[_time, [_target, _setup, player], _code, {(localize "STR_tunres_MSP_DeployementAborted") call CBA_fnc_notify}, _text, _conditio, ["notOnMap","isnotinside"]] call ace_common_fnc_progressBar; \ No newline at end of file +[_time, [_target, _setup, player], _code, {[QGVAR(doNotification), [localize "STR_tunres_MSP_DeployementAborted"]] call CBA_fnc_localEvent;}, _text, _conditio, ["notOnMap","isnotinside"]] call ace_common_fnc_progressBar; \ No newline at end of file diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index 4356ee4..a9b02ba 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -20,16 +20,11 @@ if (!isServer) then {}; params [["_msp", objNull, [objNull]], ["_setup", nil, [false]], "_player"]; private _side = _msp getVariable QGVAR(side); -private _whoToNotify = [_side, GVAR(setupNotification)] call FUNC(whoToNotify); + AAR_UPDATE(_msp,"Is active MSP",_setup); if (_setup) then { - - if (_whoToNotify isNotEqualTo [] ) then { - (call compile (localize "STR_tunres_MSP_FNC_setup_notification")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; - }; - [_msp] remoteExecCall [QFUNC(createMspProps), 2]; //force player out from MSP and LOCK it @@ -42,9 +37,6 @@ if (_setup) then { }, _msp] call CBA_fnc_waitUntilAndExecute; } else { - if (_whoToNotify isNotEqualTo [] ) then { - (call compile (localize "STR_tunres_MSP_FNC_pack_notification")) remoteExecCall ["CBA_fnc_notify", _whoToNotify]; - }; //Delete props { deleteVehicle _x; @@ -55,6 +47,12 @@ if (_setup) then { }; +private _whoToNotify = [_side, GVAR(setupNotification)] call FUNC(whoToNotify); +if (_whoToNotify isNotEqualTo [] ) then { + private _text = localize ["STR_tunres_MSP_FNC_pack_notification", "STR_tunres_MSP_FNC_setup_notification"] select _setup; + [QGVAR(doNotification), [_text], _whoToNotify] call CBA_fnc_targetEvent; +}; + private _pos = getPosASL _msp; [_side, _setup, _pos] remoteExecCall [QEFUNC(respawn,updateRespawnPoint), 2]; diff --git a/addons/respawn/functions/fnc_getTicketCount.sqf b/addons/respawn/functions/fnc_getTicketCount.sqf index 92afb19..fee29bb 100644 --- a/addons/respawn/functions/fnc_getTicketCount.sqf +++ b/addons/respawn/functions/fnc_getTicketCount.sqf @@ -43,7 +43,7 @@ switch (GVAR(respawnType)) do { if (_doHint && !isNull _player) then { private _text = format["%1 %2",localize "STR_tunres_Respawn_RemainingTicketsText", str _ticketCount]; - _text remoteExecCall ["CBA_fnc_notify", _player]; + [QGVAR(doNotification), [_text], _player] call CBA_fnc_targetEvent; }; _ticketCount diff --git a/addons/respawn/functions/fnc_getTicketCountClient.sqf b/addons/respawn/functions/fnc_getTicketCountClient.sqf index 78c9c13..2d17790 100644 --- a/addons/respawn/functions/fnc_getTicketCountClient.sqf +++ b/addons/respawn/functions/fnc_getTicketCountClient.sqf @@ -30,7 +30,7 @@ private _ticketCount = switch (GVAR(respawnType)) do { if (_doHint && !isNull player) then { private _text = format["%1 %2",localize "STR_tunres_Respawn_RemainingTicketsText", str _ticketCount]; - _text remoteExecCall ["CBA_fnc_notify", player]; + [QGVAR(doNotification), [_text]] call CBA_fnc_localEvent; }; _ticketCount \ No newline at end of file diff --git a/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf b/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf index df69ef5..1e0e007 100644 --- a/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf +++ b/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf @@ -16,4 +16,5 @@ private _hash = GVAR(nextWaveTimesHash); private _waitTime = (_hash get playerSide) - cba_missiontime; -format [localize "STR_tunres_MSP_remaining_time", [_waitTime] call CBA_fnc_formatElapsedTime] call CBA_fnc_notify; \ No newline at end of file +private _text = format [localize "STR_tunres_MSP_remaining_time", [_waitTime] call CBA_fnc_formatElapsedTime]; +[QGVAR(doNotification), [_text]] call CBA_fnc_localEvent; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_teleportButton.sqf b/addons/respawn/functions/fnc_teleportButton.sqf index d2e2546..6dda817 100644 --- a/addons/respawn/functions/fnc_teleportButton.sqf +++ b/addons/respawn/functions/fnc_teleportButton.sqf @@ -36,5 +36,5 @@ if (_teleportConditio) then { GVAR(tpMenuOpenedFrom) = objNull; [player, _destination, _text, 10, true, 15] call FUNC(teleportUnit); } else { - (localize "STR_tunres_Respawn_Teleport_Disabled") call CBA_fnc_notify; + [QGVAR(doNotification), [localize "STR_tunres_Respawn_Teleport_Disabled"]] call CBA_fnc_localEvent; }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index def7662..8eb406f 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -93,6 +93,6 @@ GVAR(waitingAreaPFH) = [{ //make sure that player is still in area if !(player inArea [_respawnWaitingarea, _waitingRange, _waitingRange, 0, false]) then { player setPosASL ([_respawnWaitingarea, (_waitingRange / 2)] call CBA_fnc_randPos); - "Get over here!" call CBA_fnc_notify; + [QGVAR(doNotification), [localize "STR_tunres_Respawn_youAreNotAllowedToLeave"]] call CBA_fnc_localEvent; }; }, 1, [_respawnWaitingarea, _playerSide, _waitingRange,_respawnType]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file From 4f2e540dc78a2193a3678b2417190e382a618ae4 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 5 Sep 2024 16:55:13 +0300 Subject: [PATCH 161/228] change base event to main --- addons/main/CfgEventHandlers.hpp | 7 +++++++ addons/main/XEH_postInit_client.sqf | 7 +++++++ addons/msp/XEH_postInit_client.sqf | 7 +------ addons/msp/functions/fnc_addAceActions.sqf | 4 ++-- addons/msp/functions/fnc_addEventHandlers.sqf | 2 +- .../msp/functions/fnc_checkContestZoneMarkersBriefing.sqf | 2 +- addons/msp/functions/fnc_contestedCheck.sqf | 2 +- addons/msp/functions/fnc_startContestedChecks.sqf | 2 +- addons/msp/functions/fnc_startUpdateDeployementStatus.sqf | 2 +- addons/msp/functions/fnc_updateDeployementStatus.sqf | 4 ++-- addons/respawn/functions/fnc_getTicketCount.sqf | 2 +- addons/respawn/functions/fnc_getTicketCountClient.sqf | 2 +- .../functions/fnc_remainingWaitTimeNotification.sqf | 2 +- addons/respawn/functions/fnc_teleportButton.sqf | 2 +- addons/respawn/functions/fnc_waitingArea.sqf | 2 +- 15 files changed, 29 insertions(+), 20 deletions(-) create mode 100644 addons/main/XEH_postInit_client.sqf diff --git a/addons/main/CfgEventHandlers.hpp b/addons/main/CfgEventHandlers.hpp index 03b03e6..622bfab 100644 --- a/addons/main/CfgEventHandlers.hpp +++ b/addons/main/CfgEventHandlers.hpp @@ -2,4 +2,11 @@ class Extended_PreInit_EventHandlers { class ADDON { serverInit = QUOTE(call COMPILE_FILE(XEH_preInit_server)); }; +}; + + +class Extended_PostInit_EventHandlers { + class ADDON { + clientInit = QUOTE(call COMPILE_FILE(XEH_postInit_client)); + }; }; \ No newline at end of file diff --git a/addons/main/XEH_postInit_client.sqf b/addons/main/XEH_postInit_client.sqf new file mode 100644 index 0000000..26505c8 --- /dev/null +++ b/addons/main/XEH_postInit_client.sqf @@ -0,0 +1,7 @@ +#include "script_component.hpp" +if (!hasInterface) exitWith { }; + +[QGVAR(doNotification), { + params ["_text", ["_duration", 7]]; + [_text, false, _duration] call ace_common_fnc_displayText; +}] call CBA_fnc_addEventHandler; \ No newline at end of file diff --git a/addons/msp/XEH_postInit_client.sqf b/addons/msp/XEH_postInit_client.sqf index de9e1a3..84bfe24 100644 --- a/addons/msp/XEH_postInit_client.sqf +++ b/addons/msp/XEH_postInit_client.sqf @@ -8,9 +8,4 @@ ADDON [] call FUNC(briefingNotes); [] call FUNC(addAceActions); }; -}] call CBA_fnc_waitUntilAndExecute; - -[QGVAR(doNotification), { - params ["_text", ["_duration", 7]]; - [_text, false, _duration] call ace_common_fnc_displayText; -}] call CBA_fnc_addEventHandler; \ No newline at end of file +}] call CBA_fnc_waitUntilAndExecute; \ No newline at end of file diff --git a/addons/msp/functions/fnc_addAceActions.sqf b/addons/msp/functions/fnc_addAceActions.sqf index 3a3663c..5b43668 100644 --- a/addons/msp/functions/fnc_addAceActions.sqf +++ b/addons/msp/functions/fnc_addAceActions.sqf @@ -47,7 +47,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { //Check if contested private _checkContest= ["Check if MSP contested", localize "STR_tunres_MSP_AceAction_CheckIfMspContested", "", { private _text = localize (["STR_tunres_MSP_NotContested","STR_tunres_MSP_IsContested"] select (_target getVariable [QGVAR(isContested), false])); - [QGVAR(doNotification), [_text]] call CBA_fnc_localEvent; + [QEGVAR(main,doNotification), [_text]] call CBA_fnc_localEvent; }, _aliveAndSameSideAndIsMSPConditio] call ace_interact_menu_fnc_createAction; //Ace inteaction @@ -71,7 +71,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { [] call EFUNC(respawn,checkTicketCount); }; private _remaining_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; - _remainingTickets = [localize "STR_tunres_Respawn_CheckTickets", localize "STR_tunres_Respawn_CheckTickets", "\a3\modules_f_curator\data\portraitmissionname_ca.paa", _remaining_action, _remaining_condition] call ace_interact_menu_fnc_createAction; + private _remainingTickets = [localize "STR_tunres_Respawn_CheckTickets", localize "STR_tunres_Respawn_CheckTickets", "\a3\modules_f_curator\data\portraitmissionname_ca.paa", _remaining_action, _remaining_condition] call ace_interact_menu_fnc_createAction; [_vehicle, 0, ["ACE_MainActions",QEGVAR(main,respawnAction)], _remainingTickets] call ace_interact_menu_fnc_addActionToClass; }; } else { diff --git a/addons/msp/functions/fnc_addEventHandlers.sqf b/addons/msp/functions/fnc_addEventHandlers.sqf index 5e68f00..ad000fb 100644 --- a/addons/msp/functions/fnc_addEventHandlers.sqf +++ b/addons/msp/functions/fnc_addEventHandlers.sqf @@ -71,7 +71,7 @@ [_side, false] remoteExecCall ["tunres_respawn_fnc_updateRespawnPoint", 2]; private _whoToNotify = [_side, 1] call FUNC(whoToNotify); - [QGVAR(doNotification), [localize "STR_tunres_MSP_destroyed"], _whoToNotify] call CBA_fnc_targetEvent; + [QEGVAR(main,doNotification), [localize "STR_tunres_MSP_destroyed"], _whoToNotify] call CBA_fnc_targetEvent; }; }; diff --git a/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf b/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf index 0f739f0..d6fce1e 100644 --- a/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf +++ b/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf @@ -23,7 +23,7 @@ params[["_enable", true]]; if (_enable) then { if (cba_missiontime > 1) exitWith { - [QGVAR(doNotification), [localize "STR_tunres_MSP_checkContestCantUse"]] call CBA_fnc_localEvent; + [QEGVAR(main,doNotification), [localize "STR_tunres_MSP_checkContestCantUse"]] call CBA_fnc_localEvent; }; if (!isNil QGVAR(checkContestZoneMarkersBriefingEH)) exitWith { diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index f458bbd..68254eb 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -85,7 +85,7 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { } else { localize "STR_tunres_MSP_FNC_secured_hint" }; - [QGVAR(doNotification), [_text], _whoToNotify] call CBA_fnc_targetEvent; + [QEGVAR(main,doNotification), [_text], _whoToNotify] call CBA_fnc_targetEvent; }; }; [QGVAR(EH_mspStatusUpdate), [_side, _isContested, _oldContestedStatus, _enemiesInArea, _enemiesInAreaMin, _friendliesInArea]] call CBA_fnc_globalEvent; diff --git a/addons/msp/functions/fnc_startContestedChecks.sqf b/addons/msp/functions/fnc_startContestedChecks.sqf index 7ecc6ab..8443ecc 100644 --- a/addons/msp/functions/fnc_startContestedChecks.sqf +++ b/addons/msp/functions/fnc_startContestedChecks.sqf @@ -56,7 +56,7 @@ if (_start) then { if (_enemyCount > 0 && !_contestedStatus) then { private _whoToNotify = [_side, GVAR(reportEnemiesNotification)] call FUNC(whoToNotify); if (_whoToNotify isNotEqualTo [] ) then { - [QGVAR(doNotification), [(localize "STR_tunres_MSP_FNC_enemies_near")], _whoToNotify] call CBA_fnc_targetEvent; + [QEGVAR(main,doNotification), [(localize "STR_tunres_MSP_FNC_enemies_near")], _whoToNotify] call CBA_fnc_targetEvent; }; }; } else { diff --git a/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf index 3ee86a3..fbdee54 100644 --- a/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf @@ -44,4 +44,4 @@ private _code = { openMap false; }; -[_time, [_target, _setup, player], _code, {[QGVAR(doNotification), [localize "STR_tunres_MSP_DeployementAborted"]] call CBA_fnc_localEvent;}, _text, _conditio, ["notOnMap","isnotinside"]] call ace_common_fnc_progressBar; \ No newline at end of file +[_time, [_target, _setup, player], _code, {[QEGVAR(main,doNotification), [localize "STR_tunres_MSP_DeployementAborted"]] call CBA_fnc_localEvent;}, _text, _conditio, ["notOnMap","isnotinside"]] call ace_common_fnc_progressBar; \ No newline at end of file diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index a9b02ba..d8b5e24 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -49,8 +49,8 @@ if (_setup) then { private _whoToNotify = [_side, GVAR(setupNotification)] call FUNC(whoToNotify); if (_whoToNotify isNotEqualTo [] ) then { - private _text = localize ["STR_tunres_MSP_FNC_pack_notification", "STR_tunres_MSP_FNC_setup_notification"] select _setup; - [QGVAR(doNotification), [_text], _whoToNotify] call CBA_fnc_targetEvent; + private _text = localize (["STR_tunres_MSP_FNC_pack_notification", "STR_tunres_MSP_FNC_setup_notification"] select _setup); + [QEGVAR(main,doNotification), [_text], _whoToNotify] call CBA_fnc_targetEvent; }; private _pos = getPosASL _msp; diff --git a/addons/respawn/functions/fnc_getTicketCount.sqf b/addons/respawn/functions/fnc_getTicketCount.sqf index fee29bb..f8dd280 100644 --- a/addons/respawn/functions/fnc_getTicketCount.sqf +++ b/addons/respawn/functions/fnc_getTicketCount.sqf @@ -43,7 +43,7 @@ switch (GVAR(respawnType)) do { if (_doHint && !isNull _player) then { private _text = format["%1 %2",localize "STR_tunres_Respawn_RemainingTicketsText", str _ticketCount]; - [QGVAR(doNotification), [_text], _player] call CBA_fnc_targetEvent; + [QEGVAR(main,doNotification), [_text], _player] call CBA_fnc_targetEvent; }; _ticketCount diff --git a/addons/respawn/functions/fnc_getTicketCountClient.sqf b/addons/respawn/functions/fnc_getTicketCountClient.sqf index 2d17790..350080f 100644 --- a/addons/respawn/functions/fnc_getTicketCountClient.sqf +++ b/addons/respawn/functions/fnc_getTicketCountClient.sqf @@ -30,7 +30,7 @@ private _ticketCount = switch (GVAR(respawnType)) do { if (_doHint && !isNull player) then { private _text = format["%1 %2",localize "STR_tunres_Respawn_RemainingTicketsText", str _ticketCount]; - [QGVAR(doNotification), [_text]] call CBA_fnc_localEvent; + [QEGVAR(main,doNotification), [_text]] call CBA_fnc_localEvent; }; _ticketCount \ No newline at end of file diff --git a/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf b/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf index 1e0e007..1bedeea 100644 --- a/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf +++ b/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf @@ -17,4 +17,4 @@ private _hash = GVAR(nextWaveTimesHash); private _waitTime = (_hash get playerSide) - cba_missiontime; private _text = format [localize "STR_tunres_MSP_remaining_time", [_waitTime] call CBA_fnc_formatElapsedTime]; -[QGVAR(doNotification), [_text]] call CBA_fnc_localEvent; \ No newline at end of file +[QEGVAR(main,doNotification), [_text]] call CBA_fnc_localEvent; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_teleportButton.sqf b/addons/respawn/functions/fnc_teleportButton.sqf index 6dda817..fd4e96b 100644 --- a/addons/respawn/functions/fnc_teleportButton.sqf +++ b/addons/respawn/functions/fnc_teleportButton.sqf @@ -36,5 +36,5 @@ if (_teleportConditio) then { GVAR(tpMenuOpenedFrom) = objNull; [player, _destination, _text, 10, true, 15] call FUNC(teleportUnit); } else { - [QGVAR(doNotification), [localize "STR_tunres_Respawn_Teleport_Disabled"]] call CBA_fnc_localEvent; + [QEGVAR(main,doNotification), [localize "STR_tunres_Respawn_Teleport_Disabled"]] call CBA_fnc_localEvent; }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 8eb406f..50d5ad6 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -93,6 +93,6 @@ GVAR(waitingAreaPFH) = [{ //make sure that player is still in area if !(player inArea [_respawnWaitingarea, _waitingRange, _waitingRange, 0, false]) then { player setPosASL ([_respawnWaitingarea, (_waitingRange / 2)] call CBA_fnc_randPos); - [QGVAR(doNotification), [localize "STR_tunres_Respawn_youAreNotAllowedToLeave"]] call CBA_fnc_localEvent; + [QEGVAR(main,doNotification), [localize "STR_tunres_Respawn_youAreNotAllowedToLeave"]] call CBA_fnc_localEvent; }; }, 1, [_respawnWaitingarea, _playerSide, _waitingRange,_respawnType]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file From 46ec2a3e1ac496fdd0365cdd6b78831bcf1ce27c Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 5 Sep 2024 17:08:27 +0300 Subject: [PATCH 162/228] Colors are easier to read --- addons/main/Stringtable.xml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index cc41ae1..9a9f604 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -195,40 +195,40 @@ You can check remaining tickets from MSP using ACE actions. - Ticket count: %2 (<font color="#004c99">West</font>) - Ticket count: %2 (<font color="#004c99">West</font>) + Ticket count: %2 (<font color="#0000FF">West</font>) + Ticket count: %2 (<font color="#0000FF">West</font>) - Ticket count: %2 (<font color="#7f0000">East</font>) - Ticket count: %2 (<font color="#7f0000">East</font>) + Ticket count: %2 (<font color="#E60000">East</font>) + Ticket count: %2 (<font color="#E60000">East</font>) - Ticket count: %2 (<font color="#007f00">Resistance</font>) - Ticket count: %2 (<font color="#007f00">Resistance</font>) + Ticket count: %2 (<font color="#00CC00">Resistance</font>) + Ticket count: %2 (<font color="#00CC00">Resistance</font>) - Ticket count: %2 (<font color="#66007f">Civilian</font>) - Ticket count: %2 (<font color="#66007f">Civilian</font>) + Ticket count: %2 (<font color="#B040A7">Civilian</font>) + Ticket count: %2 (<font color="#B040A7">Civilian</font>) You can check remaining tickets from the main base (flagpole) using ACE actions. You can check remaining tickets from the main base (flagpole) using ACE actions. - For <font color="#004c99">West</font> is %2min - For <font color="#004c99">West</font> is %2min + For <font color="#0000FF">West</font> is %2min + For <font color="#0000FF">West</font> is %2min - For <font color="#7f0000">East</font> is %2min - For <font color="#7f0000">East</font> is %2min + For <font color="#E60000">East</font> is %2min + For <font color="#E60000">East</font> is %2min - For <font color="#007f00">Resistance</font> is %2min - For <font color="#007f00">Resistance</font> is %2min + For <font color="#00CC00">Resistance</font> is %2min + For <font color="#00CC00">Resistance</font> is %2min - For <font color="#66007f">Civilian</font> is %2min - For <font color="#66007f">Civilian</font> is %2min + For <font color="#B040A7">Civilian</font> is %2min + For <font color="#B040A7">Civilian</font> is %2min Tickets From 029090c824b306c0a991821e64c8af79264941fc Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 5 Sep 2024 19:36:57 +0300 Subject: [PATCH 163/228] make update respawn point to use event --- addons/msp/functions/fnc_addEventHandlers.sqf | 4 ++-- addons/msp/functions/fnc_contestedCheck.sqf | 2 +- addons/msp/functions/fnc_updateDeployementStatus.sqf | 2 +- addons/respawn/XEH_postInit_server.sqf | 5 +++++ 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/addons/msp/functions/fnc_addEventHandlers.sqf b/addons/msp/functions/fnc_addEventHandlers.sqf index ad000fb..a71e0c6 100644 --- a/addons/msp/functions/fnc_addEventHandlers.sqf +++ b/addons/msp/functions/fnc_addEventHandlers.sqf @@ -67,8 +67,8 @@ GVAR(activeVehicleHash) set [_side, objNull]; publicVariable QGVAR(activeVehicleHash); - //Do marker update - [_side, false] remoteExecCall ["tunres_respawn_fnc_updateRespawnPoint", 2]; + //Update respawn point + [QEGVAR(respawn,updateRespawnPointEH), [_side, false]] call CBA_fnc_serverEvent; private _whoToNotify = [_side, 1] call FUNC(whoToNotify); [QEGVAR(main,doNotification), [localize "STR_tunres_MSP_destroyed"], _whoToNotify] call CBA_fnc_targetEvent; diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index 68254eb..aa7c9cf 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -78,7 +78,7 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { private _whoToNotify = [_side, GVAR(contestedNotification)] call FUNC(whoToNotify); if (_whoToNotify isNotEqualTo [] ) then { - [_side, !_isContested] call EFUNC(respawn,updateRespawnPoint); + [QEGVAR(respawn,updateRespawnPointEH), [_side, !_isContested]] call CBA_fnc_serverEvent; private _text = if (_isContested) then { localize "STR_tunres_MSP_FNC_Contested_hint" diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index d8b5e24..2d225a4 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -55,7 +55,7 @@ if (_whoToNotify isNotEqualTo [] ) then { private _pos = getPosASL _msp; -[_side, _setup, _pos] remoteExecCall [QEFUNC(respawn,updateRespawnPoint), 2]; +[QEGVAR(respawn,updateRespawnPointEH), [_side, _setup, _pos]] call CBA_fnc_serverEvent; _msp setVariable [QGVAR(isMSP), _setup, true]; GVAR(deployementStatusHash) set [_side, _setup]; diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 432ebf2..aafb2c1 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -78,3 +78,8 @@ if ( AAR_IS_ENABLED ) then { }; }] call CBA_fnc_waitUntilAndExecute; }; + +[QGVAR(updateRespawnPointEH), { + params["_side","_setup","_pos"]; + [_side, _setup, _pos] call FUNC(updateRespawnPoint); +}] call CBA_fnc_addEventHandler; \ No newline at end of file From 4051a3994238e6da676fd213e5bba4ac6e91e8a4 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 5 Sep 2024 19:42:04 +0300 Subject: [PATCH 164/228] start contested check uses event now --- addons/msp/XEH_postInit_server.sqf | 7 ++++++- addons/msp/functions/fnc_updateDeployementStatus.sqf | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/addons/msp/XEH_postInit_server.sqf b/addons/msp/XEH_postInit_server.sqf index 84f2529..c9d06bf 100644 --- a/addons/msp/XEH_postInit_server.sqf +++ b/addons/msp/XEH_postInit_server.sqf @@ -1 +1,6 @@ -#include "script_component.hpp" \ No newline at end of file +#include "script_component.hpp" + +[QGVAR(startContestedChecksEH), { + params ["_side", "_start"]; + [_side, _start] call FUNC(startContestedChecks); +}] call CBA_fnc_addEventHandler; \ No newline at end of file diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index 2d225a4..245f0b4 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -76,5 +76,5 @@ if !(_setup) then { publicVariable QGVAR(contestedStatusHash); }; -[_side, _setup] remoteExecCall [QFUNC(startContestedChecks), 2]; +[QGVAR(startContestedChecksEH), [_side, _setup]] call CBA_fnc_serverEvent; [QGVAR(EH_mspStatusUpdate), [_msp, _setup]] call CBA_fnc_globalEvent; \ No newline at end of file From 371d22946870776ca7c0bfc393a6d0be1247c2e2 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 5 Sep 2024 19:51:41 +0300 Subject: [PATCH 165/228] start spectator uses EH now --- addons/respawn/XEH_postInit_client.sqf | 6 +++++- addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf | 2 +- addons/respawn/functions/fnc_onPlayerKilled.sqf | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/addons/respawn/XEH_postInit_client.sqf b/addons/respawn/XEH_postInit_client.sqf index ce361fa..87433e6 100644 --- a/addons/respawn/XEH_postInit_client.sqf +++ b/addons/respawn/XEH_postInit_client.sqf @@ -60,4 +60,8 @@ ADDON [] call FUNC(killJIP); [] call FUNC(updateRespawnMarkers); [] call FUNC(radioSettings_tfar); -}] call CBA_fnc_waitUntilAndExecute; \ No newline at end of file +}] call CBA_fnc_waitUntilAndExecute; + +[QGVAR(startSpectatorEH), { + [] call FUNC(startSpectator); +}] call CBA_fnc_addEventHandler; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf b/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf index 7aea492..8686cdd 100644 --- a/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf +++ b/addons/respawn/functions/fnc_bleedTicketCountOnDeath.sqf @@ -39,7 +39,7 @@ private _remainingTickets = [_side, _player, false] call FUNC(getTicketCount); if !( _remainingTickets > 0 ) exitWith { [{ - remoteExecCall [QFUNC(startSpectator), _this]; + [QGVAR(startSpectatorEH), "", _this] call CBA_fnc_targetEvent; }, _player, 5] call CBA_fnc_waitAndExecute; }; diff --git a/addons/respawn/functions/fnc_onPlayerKilled.sqf b/addons/respawn/functions/fnc_onPlayerKilled.sqf index 8ef3e71..ce6a1aa 100644 --- a/addons/respawn/functions/fnc_onPlayerKilled.sqf +++ b/addons/respawn/functions/fnc_onPlayerKilled.sqf @@ -20,7 +20,7 @@ setPlayerRespawnTime 99999; if (GVAR(endRespawns)) exitWith { [{ - remoteExecCall [QFUNC(startSpectator), _this]; + [QGVAR(startSpectatorEH), "", _this] call CBA_fnc_targetEvent; }, player, 5] call CBA_fnc_waitAndExecute; }; From 41b3222c3485544cc7fd31f6afeb708a425ad8bd Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 5 Sep 2024 20:01:05 +0300 Subject: [PATCH 166/228] updateWaitingRespawnList uses eh now --- addons/respawn/XEH_postInit_server.sqf | 5 +++++ addons/respawn/functions/fnc_respawnUnit.sqf | 2 +- addons/respawn/functions/fnc_waitingArea.sqf | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index aafb2c1..93d168e 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -82,4 +82,9 @@ if ( AAR_IS_ENABLED ) then { [QGVAR(updateRespawnPointEH), { params["_side","_setup","_pos"]; [_side, _setup, _pos] call FUNC(updateRespawnPoint); +}] call CBA_fnc_addEventHandler; + +[QGVAR(updateWaitingRespawnListEH), { + params["_player","_addPlayer","_side"]; + [_player, _addPlayer, _side] call FUNC(updateWaitingRespawnList); }] call CBA_fnc_addEventHandler; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_respawnUnit.sqf b/addons/respawn/functions/fnc_respawnUnit.sqf index 31b6390..7459a4b 100644 --- a/addons/respawn/functions/fnc_respawnUnit.sqf +++ b/addons/respawn/functions/fnc_respawnUnit.sqf @@ -17,7 +17,7 @@ params [["_side", nil, [west]], ["_unit", objNull, [objNull]]]; private _respawnPointsHash = GVAR(respawnPointsHash); private _respawnPosition = getMarkerPos ((_respawnPointsHash get _side) select 0); -[_unit, false, _side] call FUNC(updateWaitingRespawnList); +[QGVAR(updateWaitingRespawnListEH), [_unit, false, _side]] call CBA_fnc_serverEvent; _unit setVariable [QGVAR(isWaitingRespawn), false, true]; player setVariable [QGVAR(skipNextWave), nil]; diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 50d5ad6..d2d019f 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -26,7 +26,7 @@ if (!isNil QGVAR(uselesBody)) then { GVAR(uselesBody) = nil; }; -[player, true, _playerSide] remoteExecCall [QFUNC(updateWaitingRespawnList),2]; +[QGVAR(updateWaitingRespawnListEH), [player, true, _playerSide]] call CBA_fnc_serverEvent; private _respawnWaitingarea = (GVAR(waitingAreaHash) get _playerSide) select 1; private _waitingRange = GVAR(waitingAreaRange); From eaa66dbd00ee621d426ddbb346553a153704525b Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 5 Sep 2024 20:06:56 +0300 Subject: [PATCH 167/228] respawnUnit uses event --- addons/respawn/XEH_postInit_server.sqf | 9 ++++++++- addons/respawn/functions/fnc_doRespawnWave.sqf | 2 +- addons/respawn/functions/fnc_forceRespawnPlayer.sqf | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 93d168e..06d7f69 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -87,4 +87,11 @@ if ( AAR_IS_ENABLED ) then { [QGVAR(updateWaitingRespawnListEH), { params["_player","_addPlayer","_side"]; [_player, _addPlayer, _side] call FUNC(updateWaitingRespawnList); -}] call CBA_fnc_addEventHandler; \ No newline at end of file +}] call CBA_fnc_addEventHandler; + +[QGVAR(respawnUnitEH), { + params["_side","_unit"]; + [_side, _unit] call FUNC(respawnUnit); +}] call CBA_fnc_addEventHandler; + +[QGVAR(respawnUnitEH), [_unit, false, _side]] call CBA_fnc_serverEvent; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_doRespawnWave.sqf b/addons/respawn/functions/fnc_doRespawnWave.sqf index 9386783..e3d2725 100644 --- a/addons/respawn/functions/fnc_doRespawnWave.sqf +++ b/addons/respawn/functions/fnc_doRespawnWave.sqf @@ -75,7 +75,7 @@ if (count _waitingRespawn > 0) then { private _unit = _unitList select 0; private _text = format["respawn unit: %1",_unit]; LOG(_text); - [_side, _unit] call FUNC(respawnUnit); + [QGVAR(respawnUnitEH), [_side, _unit]] call CBA_fnc_serverEvent; }, 0.2, [_side, _waitingRespawnHash, _waitingRespawnDelayedHash]] call CBA_fnc_addPerFrameHandler; private _waitingRespawnCount = count _waitingRespawn; diff --git a/addons/respawn/functions/fnc_forceRespawnPlayer.sqf b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf index 51767ea..673bb60 100644 --- a/addons/respawn/functions/fnc_forceRespawnPlayer.sqf +++ b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf @@ -20,4 +20,4 @@ if !(player getVariable [QGVAR(isWaitingRespawn),false]) exitWith { player setVariable [QGVAR(skipNextWave), false, true]; -[playerSide, player] remoteExecCall [QFUNC(respawnUnit), 2]; \ No newline at end of file +[QGVAR(respawnUnitEH), [playerSide, player]] call CBA_fnc_serverEvent; \ No newline at end of file From a808a7d2e7e26867da9a7ff5396854ad77fc476d Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Thu, 5 Sep 2024 22:08:30 +0300 Subject: [PATCH 168/228] stylepoints 6/5 --- addons/main/CfgEventHandlers.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/main/CfgEventHandlers.hpp b/addons/main/CfgEventHandlers.hpp index 622bfab..bd480e9 100644 --- a/addons/main/CfgEventHandlers.hpp +++ b/addons/main/CfgEventHandlers.hpp @@ -4,7 +4,6 @@ class Extended_PreInit_EventHandlers { }; }; - class Extended_PostInit_EventHandlers { class ADDON { clientInit = QUOTE(call COMPILE_FILE(XEH_postInit_client)); From b229741461810724eae39ea50ba83e9d9b7ae328 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 8 Sep 2024 21:28:25 +0300 Subject: [PATCH 169/228] Tweak wording --- addons/main/Stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index 9a9f604..2f70ef8 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -147,8 +147,8 @@ Respawn wave for __%1__. %2 units respawned. Total respawn count is %3. - Respawn wave for __%1__. %2 units respawned. Total respawn count is %3 and tickets left %4. - Respawn wave for __%1__. %2 units respawned. Total respawn count is %3 and tickets left %4. + Respawn wave for __%1__. %2 units have respawned. Total respawns so far: %3. Remaining tickets: %4. + Respawn wave for __%1__. %2 units have respawned. Total respawns so far: %3. Remaining tickets: %4. MSP deployement aborted! From 2613ffbd898d798585eb82d204b82691b5fc70d7 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 8 Sep 2024 21:29:25 +0300 Subject: [PATCH 170/228] New aar events for forced things --- addons/main/Stringtable.xml | 8 ++++++++ addons/respawn/functions/fnc_forceRespawnPlayer.sqf | 2 ++ addons/respawn/functions/fnc_forceRespawnWave.sqf | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index 2f70ef8..5ae5ea3 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -298,6 +298,14 @@ Get over here! Get over here! + + __inst__ has been force respawned. + __inst__ has been force respawned. + + + __%1__ has been force respawned. + __%1__ has been force respawned. + diff --git a/addons/respawn/functions/fnc_forceRespawnPlayer.sqf b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf index 673bb60..f273652 100644 --- a/addons/respawn/functions/fnc_forceRespawnPlayer.sqf +++ b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf @@ -18,6 +18,8 @@ if !(player getVariable [QGVAR(isWaitingRespawn),false]) exitWith { ERROR("Tried to force respawn unit, whichs is not at respawn"); }; +AAR_EVENT((localize"STR_tunres_Respawn_playerForceRespawned"),player,nil,nil); + player setVariable [QGVAR(skipNextWave), false, true]; [QGVAR(respawnUnitEH), [playerSide, player]] call CBA_fnc_serverEvent; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_forceRespawnWave.sqf b/addons/respawn/functions/fnc_forceRespawnWave.sqf index 3f252fc..6dda523 100644 --- a/addons/respawn/functions/fnc_forceRespawnWave.sqf +++ b/addons/respawn/functions/fnc_forceRespawnWave.sqf @@ -19,6 +19,10 @@ if (!isServer) exitWith { }; params [["_side", nil, [east]], ["_reset", false, [false]]]; +private _text = format[localize"STR_tunres_Respawn_sideForceRespawned",str _side]; + +AAR_EVENT(_text,nil,nil,nil); + [_side, true] call FUNC(doRespawnWave); if (_reset && { !(GVAR(forcedRespawn)) }) then { From 069438a23acb5c62a150ff8fa85e5080cab6a4e4 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 8 Sep 2024 21:31:19 +0300 Subject: [PATCH 171/228] split counting respawn to own fnc --- addons/respawn/XEH_PREP.hpp | 1 + .../respawn/functions/fnc_doRespawnWave.sqf | 8 +++---- .../functions/fnc_upddateRespawnCount.sqf | 24 +++++++++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 addons/respawn/functions/fnc_upddateRespawnCount.sqf diff --git a/addons/respawn/XEH_PREP.hpp b/addons/respawn/XEH_PREP.hpp index e63d9d4..70fa1d9 100644 --- a/addons/respawn/XEH_PREP.hpp +++ b/addons/respawn/XEH_PREP.hpp @@ -38,4 +38,5 @@ PREP(updateClientsTicketCount); PREP(updateRespawnMarkers); PREP(updateRespawnPoint); PREP(updateWaitingRespawnList); +PREP(upddateRespawnCount); PREP(waitingArea); \ No newline at end of file diff --git a/addons/respawn/functions/fnc_doRespawnWave.sqf b/addons/respawn/functions/fnc_doRespawnWave.sqf index e3d2725..8962071 100644 --- a/addons/respawn/functions/fnc_doRespawnWave.sqf +++ b/addons/respawn/functions/fnc_doRespawnWave.sqf @@ -17,8 +17,7 @@ params [["_side", nil, [west]], ["_forceAll", false, [false]]]; if (!isServer) exitWith { }; -private _totalRespawnCountHash = GVAR(totalRespawnCountHash); -private _totalRespawnCount = _totalRespawnCountHash get _side; +private _totalRespawnCount = GVAR(totalRespawnCountHash) get _side; private _waitingRespawnHash = GVAR(waitingRespawnListHash); private _waitingRespawnDelayedHash = GVAR(waitingRespawnDelayedListHash); private _waitingRespawn = _waitingRespawnHash get _side; @@ -79,8 +78,7 @@ if (count _waitingRespawn > 0) then { }, 0.2, [_side, _waitingRespawnHash, _waitingRespawnDelayedHash]] call CBA_fnc_addPerFrameHandler; private _waitingRespawnCount = count _waitingRespawn; - _totalRespawnCount = _totalRespawnCount + _waitingRespawnCount; - _totalRespawnCountHash set [_side, _totalRespawnCount]; + _totalRespawnCount = [_waitingRespawnCount] call FUNC(upddateRespawnCount); private _debugText = format ["Side %1 all respawn units moved. Respawned: %2. Total count is: %3", _side, _waitingRespawnCount, _totalRespawnCount]; INFO(_debugText); @@ -89,7 +87,7 @@ if (count _waitingRespawn > 0) then { if (AAR_IS_ENABLED) then { private _text = if (GVAR(respawnType) isEqualTo 1) then { - format[(localize "STR_tunres_Respawn_AAR_RespawnWaveTickets"), str _side, _waitingRespawnCount, _totalRespawnCount, [_side] call FUNC(getTicketCount)]; + format[(localize "STR_tunres_Respawn_AAR_RespawnWaveTickets"), str _side, _waitingRespawnCount, _totalRespawnCount, [_side] call FUNC(getTicketCount)] } else { format[(localize "STR_tunres_Respawn_AAR_RespawnWave"), str _side, _waitingRespawnCount, _totalRespawnCount] }; diff --git a/addons/respawn/functions/fnc_upddateRespawnCount.sqf b/addons/respawn/functions/fnc_upddateRespawnCount.sqf new file mode 100644 index 0000000..634f379 --- /dev/null +++ b/addons/respawn/functions/fnc_upddateRespawnCount.sqf @@ -0,0 +1,24 @@ +/* + * Author: [Tuntematon] + * [Description] + * + * + * Arguments: + * How many need to bee adden + * + * Return Value: + * How many has respawned + * + * Example: + * [] call tunres_Respawn_fnc_upddateRespawnCount + */ +#include "script_component.hpp" + +params[["_howManyRespawned", 0, [0]]]; + +private _totalRespawnCountHash = GVAR(totalRespawnCountHash); +private _totalRespawnCount = _totalRespawnCountHash get _side; +_totalRespawnCount = _totalRespawnCount + _howManyRespawned; +_totalRespawnCountHash set [_side, _totalRespawnCount]; + +_totalRespawnCount \ No newline at end of file From 9db465e452934154354527b6b27318f3889ff6dd Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 8 Sep 2024 21:31:32 +0300 Subject: [PATCH 172/228] add forced units to counted respawns --- addons/respawn/functions/fnc_forceRespawnPlayer.sqf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/respawn/functions/fnc_forceRespawnPlayer.sqf b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf index f273652..e8cd906 100644 --- a/addons/respawn/functions/fnc_forceRespawnPlayer.sqf +++ b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf @@ -22,4 +22,6 @@ AAR_EVENT((localize"STR_tunres_Respawn_playerForceRespawned"),player,nil,nil); player setVariable [QGVAR(skipNextWave), false, true]; +[1] call FUNC(upddateRespawnCount); + [QGVAR(respawnUnitEH), [playerSide, player]] call CBA_fnc_serverEvent; \ No newline at end of file From c38424c4a85cf67d179e6f91d63443d53ae71647 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 8 Sep 2024 21:31:57 +0300 Subject: [PATCH 173/228] make some variables only for server --- addons/msp/XEH_preInit.sqf | 5 ----- addons/msp/XEH_preInit_server.sqf | 7 ++++++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/msp/XEH_preInit.sqf b/addons/msp/XEH_preInit.sqf index 83969cb..14e2510 100644 --- a/addons/msp/XEH_preInit.sqf +++ b/addons/msp/XEH_preInit.sqf @@ -8,11 +8,6 @@ PREP_RECOMPILE_END; //Msp classnames GVAR(classnamesHash) = createHashMap; -//reportEnemiesInterval 0 - reportEnemiesRange 1 - contestedRadiusMax 2 - contestedRadiusMin 3 - contestedCheckInterval 4 - reportEnemiesEnabled 5 -GVAR(contestValuesHash) = createHashMapFromArray [[west,[0,0,0,0,0,false]],[east,[0,0,0,0,0,false]],[resistance,[0,0,0,0,0,false]],[civilian,[0,0,0,0,0,false]]]; -GVAR(contestHandlesHash) = createHashMap; -GVAR(contestCheckRunningHash) = createHashMapFromArray FALSES_FOR_SIDES; - #include "initSettings.inc.sqf" ADDON = true; \ No newline at end of file diff --git a/addons/msp/XEH_preInit_server.sqf b/addons/msp/XEH_preInit_server.sqf index 09bb433..2395e13 100644 --- a/addons/msp/XEH_preInit_server.sqf +++ b/addons/msp/XEH_preInit_server.sqf @@ -16,4 +16,9 @@ GVAR(activeVehicleHash) = createHashMapFromArray [[west, objNull],[east, objNull publicVariable QGVAR(activeVehicleHash); //Contested stuff -GVAR(contestedCheckHash) = createHashMapFromArray [[west,[0,0,0]],[east,[0,0,0]],[resistance,[0,0,0]],[civilian,[0,0,0]]]; \ No newline at end of file +GVAR(contestedCheckHash) = createHashMapFromArray [[west,[0,0,0]],[east,[0,0,0]],[resistance,[0,0,0]],[civilian,[0,0,0]]]; + +//reportEnemiesInterval 0 - reportEnemiesRange 1 - contestedRadiusMax 2 - contestedRadiusMin 3 - contestedCheckInterval 4 - reportEnemiesEnabled 5 +GVAR(contestValuesHash) = createHashMapFromArray [[west,[0,0,0,0,0,false]],[east,[0,0,0,0,0,false]],[resistance,[0,0,0,0,0,false]],[civilian,[0,0,0,0,0,false]]]; +GVAR(contestHandlesHash) = createHashMap; +GVAR(contestCheckRunningHash) = createHashMapFromArray FALSES_FOR_SIDES; \ No newline at end of file From bb90d1c4031920586cda7aa91160d242352a1b09 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 8 Sep 2024 21:32:07 +0300 Subject: [PATCH 174/228] fix wrong position type --- addons/msp/functions/fnc_contestedCheck.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index aa7c9cf..4772e2c 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -42,7 +42,7 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { }; } forEach _sidesToCheck; - private _pos = getPosASL _msp; + private _pos = ASLToAGL (getPosASL _msp); private _unitsInArea = _allunits inAreaArray [_pos, _contestedRadiusMax, _contestedRadiusMax, 0, false, (_contestedRadiusMax/2)]; private _enemiesInArea = _unitsInArea select {(side _x) in _enemySides}; private _friendliesInArea = (count _unitsInArea) - (count _enemiesInArea); From 49331de27d4cd55520b19294a3ad889ed94e9739 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 8 Sep 2024 21:32:17 +0300 Subject: [PATCH 175/228] debug logs to macros --- addons/main/script_macros.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 3c223f1..e5d3152 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -14,11 +14,11 @@ #define MARKER_NAME(var1) FORMAT_2("%1_%2",QUOTE(ADDON),var1) //AAR enabled check -#define AAR_IS_ENABLED !isNil "afi_aar2" +#define AAR_IS_ENABLED LOG("AAR enabled"); !isNil "afi_aar2" //AAR update macro -#define AAR_UPDATE(OBJ,VARNAME,VALUE) [QEGVAR(main,AAR_UpdateEH), [OBJ,VARNAME,VALUE]] call CBA_fnc_serverEvent +#define AAR_UPDATE(OBJ,VARNAME,VALUE) LOG("AAR update macro"); [QEGVAR(main,AAR_UpdateEH), [OBJ,VARNAME,VALUE]] call CBA_fnc_serverEvent //AAR event -#define AAR_EVENT(TEXT,INSTIGATOR,TARGET,POI) [QEGVAR(main,AAR_EventEH), [TEXT,INSTIGATOR,TARGET,POI]] call CBA_fnc_serverEvent +#define AAR_EVENT(TEXT,INSTIGATOR,TARGET,POI) LOG("AAR eventti macro"); [QEGVAR(main,AAR_EventEH), [TEXT,INSTIGATOR,TARGET,POI]] call CBA_fnc_serverEvent #define ALL_SIDES [west,east,resistance,civilian] From 816584680367c57d3ffa777d2cead5f64088b2c3 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 8 Sep 2024 21:32:28 +0300 Subject: [PATCH 176/228] clean --- addons/msp/functions/fnc_startContestedChecks.sqf | 2 +- addons/msp/functions/fnc_updateDeployementStatus.sqf | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/addons/msp/functions/fnc_startContestedChecks.sqf b/addons/msp/functions/fnc_startContestedChecks.sqf index 8443ecc..2805fc8 100644 --- a/addons/msp/functions/fnc_startContestedChecks.sqf +++ b/addons/msp/functions/fnc_startContestedChecks.sqf @@ -16,7 +16,7 @@ */ #include "script_component.hpp" params ["_side", "_start"]; -if (!isServer) then {}; +if (!isServer) exitWith {}; if (_start) then { if (GVAR(contestCheckRunningHash) getOrDefault [_side, false]) exitWith { diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index 245f0b4..12c2ca8 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -20,8 +20,6 @@ if (!isServer) then {}; params [["_msp", objNull, [objNull]], ["_setup", nil, [false]], "_player"]; private _side = _msp getVariable QGVAR(side); - - AAR_UPDATE(_msp,"Is active MSP",_setup); if (_setup) then { From f7cafd66ef4cc1ff35c7f2f12af7681873c422c3 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 8 Sep 2024 21:37:59 +0300 Subject: [PATCH 177/228] fix macros --- addons/main/script_macros.hpp | 2 +- addons/respawn/functions/fnc_forceRespawnPlayer.sqf | 2 +- addons/respawn/functions/fnc_forceRespawnWave.sqf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index e5d3152..bb34bd1 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -14,7 +14,7 @@ #define MARKER_NAME(var1) FORMAT_2("%1_%2",QUOTE(ADDON),var1) //AAR enabled check -#define AAR_IS_ENABLED LOG("AAR enabled"); !isNil "afi_aar2" +#define AAR_IS_ENABLED !isNil "afi_aar2" //AAR update macro #define AAR_UPDATE(OBJ,VARNAME,VALUE) LOG("AAR update macro"); [QEGVAR(main,AAR_UpdateEH), [OBJ,VARNAME,VALUE]] call CBA_fnc_serverEvent //AAR event diff --git a/addons/respawn/functions/fnc_forceRespawnPlayer.sqf b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf index e8cd906..62e27d9 100644 --- a/addons/respawn/functions/fnc_forceRespawnPlayer.sqf +++ b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf @@ -18,7 +18,7 @@ if !(player getVariable [QGVAR(isWaitingRespawn),false]) exitWith { ERROR("Tried to force respawn unit, whichs is not at respawn"); }; -AAR_EVENT((localize"STR_tunres_Respawn_playerForceRespawned"),player,nil,nil); +AAR_EVENT(localize "STR_tunres_Respawn_playerForceRespawned",player,nil,nil); player setVariable [QGVAR(skipNextWave), false, true]; diff --git a/addons/respawn/functions/fnc_forceRespawnWave.sqf b/addons/respawn/functions/fnc_forceRespawnWave.sqf index 6dda523..7aa8104 100644 --- a/addons/respawn/functions/fnc_forceRespawnWave.sqf +++ b/addons/respawn/functions/fnc_forceRespawnWave.sqf @@ -19,7 +19,7 @@ if (!isServer) exitWith { }; params [["_side", nil, [east]], ["_reset", false, [false]]]; -private _text = format[localize"STR_tunres_Respawn_sideForceRespawned",str _side]; +private _text = format[(localize "STR_tunres_Respawn_sideForceRespawned"),str _side]; AAR_EVENT(_text,nil,nil,nil); From 786dd8661a4e8addbbce60d5b7bb6c315a091e90 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 18 Sep 2024 23:13:36 +0300 Subject: [PATCH 178/228] Split stringtables --- addons/main/Stringtable.xml | 800 ++------------------------------- addons/msp/Stringtable.xml | 274 +++++++++++ addons/respawn/Stringtable.xml | 437 ++++++++++++++++++ 3 files changed, 736 insertions(+), 775 deletions(-) create mode 100644 addons/msp/Stringtable.xml create mode 100644 addons/respawn/Stringtable.xml diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index 5ae5ea3..26db29b 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -1,779 +1,29 @@ - - - - Respawn wave interval (minutes) - Respawn wave interval (minutes) - - - Time after JIP are killed and moved to respawn (minutes) - Time after JIP are killed and moved to respawn (minutes) - - - Enable kill JIP system - Enable kill JIP system - - - Ticket count for either the entire side or each player on that side - Ticket count for either the entire side or each player on that side - - - "SQF Gearscript": Requires two variables to be set: "tunres_Respawn_Role," which serves as a parameter, and "tunres_Respawn_GearPath," which denotes the file path. "Potato Tool": Simply invokes its own function. "Save gear": Loads the same loadout saved at mission start, or it can be updated during the mission using the "tunres_Respawn_fnc_savegear" function. None: No gear scripts are executed. Players will spawn without any gear. Utilize the event handler "tunres_respawn_EH_unitRespawned" to provide gear. - "SQF Gearscript": Requires two variables to be set: "tunres_Respawn_Role," which serves as a parameter, and "tunres_Respawn_GearPath," which denotes the file path. "Potato Tool": Simply invokes its own function. "Save gear": Loads the same loadout saved at mission start, or it can be updated during the mission using the "tunres_Respawn_fnc_savegear" function. None: No gear scripts are executed. Players will spawn without any gear. Utilize the event handler "tunres_respawn_EH_unitRespawned" to provide gear. - - - "Endless waves": Endless waves. "Side tickets": Side shares a ticket pool. Player tickets": Each player has their own ticket pool. - "Endless waves": Endless waves. "Side tickets": Side shares a ticket pool. Player tickets": Each player has their own ticket pool. - - - Enable this camera mode for spectators - Enable this camera mode for spectators - - - TUN - Respawn System - TUN - Respawn System - - - Briefing notes - Briefing notes - - - Wave times - Wave times - - - Check tickets - Check tickets - - - Spectator camera modes - Spectator camera modes - - - Tickets - Tickets - - - Main Settings - Main Settings - - - Enable Respawn System - Enable Respawn System - - - Activate Respawn System for the mission. - Activate Respawn System for the mission. - - - Enable checking remaining tickets from this location. - Enable checking remaining tickets from this location. - - - Only forced respawn waves. No timer involved. - Only forced respawn waves. No timer involved. - - - If the remaining respawn time is less than the specified percentage here, the player will skip the next wave. For example, if the wave interval is 20 minutes and this is set to 50%, and a player dies when there are less than 10 minutes remaining until the next respawn, the player will skip the next wave and needs to wait for the following one. Set to 0 to disable this feature. - If the remaining respawn time is less than the specified percentage here, the player will skip the next wave. For example, if the wave interval is 20 minutes and this is set to 50%, and a player dies when there are less than 10 minutes remaining until the next respawn, the player will skip the next wave and needs to wait for the following one. Set to 0 to disable this feature. - - - Range for Waiting Area. Default is 100m. - Range for Waiting Area. Default is 100m. - - - Remaining tickets for your side: - Remaining tickets for your side: - - - You are respawning! Please standby. - You are respawning! Please standby. - - - Contested settings for the West - Spectator allowed sides for West - - - Contested settings for the East - Contested settings for the East - - - Contested settings for the Resistance - Contested settings for the Resistance - - - Contested settings for the Civilian - Contested settings for the Civilian - - - Spectator allowed sides for West - Spectator allowed sides for West - - - Spectator allowed sides for East - Spectator allowed sides for East - - - Spectator allowed sides for Resistance - Spectator allowed sides for Resistance - - - Spectator allowed sides for Civilian - Spectator allowed sides for Civilian - - - Allow this side to be spectated - Allow this side to be spectated - - - __%1__ deployed MSP by __inst__. - __%1__ deployed MSP by __inst__. - - - __%1__ packed MSP by __inst__. - __%1__ packed MSP by __inst__. - - - __%1__ MSP is contested - __%1__ MSP is contested - - - __%1__ MSP is no longer contested - __%1__ MSP is no longer contested - - - Respawn wave for __%1__. %2 units respawned. Total respawn count is %3. - Respawn wave for __%1__. %2 units respawned. Total respawn count is %3. - - - Respawn wave for __%1__. %2 units have respawned. Total respawns so far: %3. Remaining tickets: %4. - Respawn wave for __%1__. %2 units have respawned. Total respawns so far: %3. Remaining tickets: %4. - - - MSP deployement aborted! - MSP deployement aborted! - - - Respawn point - Respawn point - - - Main base - Main base - - - To use a custom texture, provide the path to it in a non-string format. If left empty or if an invalid path is given, the default side color will be used. - To use a custom texture, provide the path to it in a non-string format. If left empty or if an invalid path is given, the default side color will be used. - - - Enable contest area check. - Enable contest area check. - - - Disable contest area check. - Disable contest area check. - - - After enabling, you can click on the map during the briefing, and it will create contest area markers. - After enabling, you can click on the map during the briefing, and it will create contest area markers. - - - MSP check contest area - MSP check contest area - - - MSP settings - MSP settings - - - MSP info - MSP info - - - You can check remaining tickets from MSP using ACE actions. - You can check remaining tickets from MSP using ACE actions. - - - Ticket count: %2 (<font color="#0000FF">West</font>) - Ticket count: %2 (<font color="#0000FF">West</font>) - - - Ticket count: %2 (<font color="#E60000">East</font>) - Ticket count: %2 (<font color="#E60000">East</font>) - - - Ticket count: %2 (<font color="#00CC00">Resistance</font>) - Ticket count: %2 (<font color="#00CC00">Resistance</font>) - - - Ticket count: %2 (<font color="#B040A7">Civilian</font>) - Ticket count: %2 (<font color="#B040A7">Civilian</font>) - - - You can check remaining tickets from the main base (flagpole) using ACE actions. - You can check remaining tickets from the main base (flagpole) using ACE actions. - - - For <font color="#0000FF">West</font> is %2min - For <font color="#0000FF">West</font> is %2min - - - For <font color="#E60000">East</font> is %2min - For <font color="#E60000">East</font> is %2min - - - For <font color="#00CC00">Resistance</font> is %2min - For <font color="#00CC00">Resistance</font> is %2min - - - For <font color="#B040A7">Civilian</font> is %2min - For <font color="#B040A7">Civilian</font> is %2min - - - Tickets - Tickets - - - Respawn settings - Respawn settings - - - You are going to skip the next respawn wave. - You are going to skip the next respawn wave. - - - Check if MSP is contested - Check if MSP is contested - - - Check contest area - Check contest area - - - Check respawn time until the next wave - Check respawn time until the next wave - - - Pack MSP - Pack MSP - - - Deploy MSP - Deploy MSP - - - Respawn Actions - Respawn Actions - - - Main - Main - - - Respawn settings - Respawn settings - - - Tun - Respawn settings - Tun - Respawn settings - - - MSP is contested - MSP is contested - - - MSP is not contested - MSP is not contested - - - Your remaining tickets: - Your remaining tickets: - - - Can't be used during mission! - Can't be used during mission! - - - Get over here! - Get over here! - - - __inst__ has been force respawned. - __inst__ has been force respawned. - - - __%1__ has been force respawned. - __%1__ has been force respawned. - - - - - Remaining time until respawn - Remaining time until respawn - - - Respawn is currently disabled. - Respawn is currently disabled. - - - Mission is using only forced waves. - Mission is using only forced waves. - - - Remaining ticket count is: - Remaining ticket count is: - - - Check remaining tickets - Check remaining tickets - - - - - You are being teleported to: - You are being teleported to: - - - This teleport point is disabled - This teleport point is disabled - - - Open teleportmenu - Open teleportmenu - - - <t color='#FF0000'>Open teleport menu</t> - <t color='#FF0000'>Open teleport menu</t> - - - Main Base - Main Base - - - - - Place this module where you want the respawn point to be for this side. - Place this module where you want the respawn point to be for this side. - - - Spawn Point - Spawn Point - - - Choose the side for this spawn point - Choose the side for this spawn point - - - Tun Respawn - Tun Respawn - - - The Respawn Position module does not have a side set. - The Respawn Position module does not have a side set. - - - There is already a '%1' marker. You either have multiple respawn point modules with the same settings or a marker named that. Either way, please remove it. - There is already a '%1' marker. You either have multiple respawn point modules with the same settings or a marker named that. Either way, please remove it. - - - - - Teleport point - Teleport point - - - Teleport network point. - Teleport network point. - - - Marker icon must be in a non-string format. Default: hd_start - Marker icon must be in a non-string format. Default: hd_start - - - Create a marker for this teleporter for the enabled sides. - Create a marker for this teleporter for the enabled sides. - - - When enabled, it will use ACE interaction. Otherwise, it will use addAction. - When enabled, it will use ACE interaction. Otherwise, it will use addAction. - - - Name for teleport location - Name for teleport location - - - Condition to enable/disable opening teleport menu. Must return true or false. Default: true - Condition to enable/disable opening teleport menu. Must return true or false. Default: true - - - Condition to enable/disable TP location. (Code) Default: True - Condition to enable/disable TP location. (Code) Default: True - - - Is this side allowed to use this teleporter? - Is this side allowed to use this teleporter? - - - Classname for the object where the action to teleport is. Non-string format: Land_Sleeping_bag_blue_folded_F - Classname for the object where the action to teleport is. Non-string format: Land_Sleeping_bag_blue_folded_F - - - - - There is already a '%1' marker. You either have multiple Waiting Area modules with the same settings or a marker named that. Please remove it. - There is already a '%1' marker. You either have multiple Waiting Area modules with the same settings or a marker named that. Please remove it. - - - The Waiting Area module does not have a side set - The Waiting Area module does not have a side set - - - Waiting Area - Waiting Area - - - Place this module where you want the respawn waiting area to be for this side. - Place this module where you want the respawn waiting area to be for this side. - - - Choose the side for this waiting area - Choose the side for this waiting area - - - - - Teleport network - Teleport network - - - Teleport - Teleport - - - - - Show tickets - Show tickets - - - Enable briefing notes - Enable briefing notes - - - Create a briefing tab displaying all these settings. - Create a briefing tab displaying all these settings. - - - Show respawn type - Show respawn type - - - Show respawn wave time - Show respawn wave time - - - When enabled, the wave interval time will be shown in the briefing notes. - When enabled, the wave interval time will be shown in the briefing notes. - - - When enabled, the starting ticket count will be shown in the briefing notes. - When enabled, the starting ticket count will be shown in the briefing notes. - - - When enabled, the respawn type will be shown in the briefing notes. - When enabled, the respawn type will be shown in the briefing notes. - - - Show this side for all. Own side is always shown, if 'show tickets' is enabled. Also, if that is disabled, none of the sides' tickets are shown. - Show this side for all. Own side is always shown, if 'show tickets' is enabled. Also, if that is disabled, none of the sides' tickets are shown. - - - Show west data to all - Show west data to all - - - Show east data to all - Show east data to all - - - Show resistance data to all - Show resistance data to all - - - Show civilian data to all - Show civilian data to all - - - The mission has unlimited tickets for each side. - The mission has unlimited tickets for each side. - - - The mission has limited tickets for each side. - The mission has limited tickets for each side. - - - The mission has limited tickets for each player. - The mission has limited tickets for each player. - - - The mission only uses forced respawn waves, so there is no respawn timer. - The mission only uses forced respawn waves, so there is no respawn timer. - - - JIP players will be killed and moved to respawn after %2min from mission start. If a player disconnects earlier, it won't use a ticket. - JIP players will be killed and moved to respawn after %2min from mission start. If a player disconnects earlier, it won't use a ticket. - - - JIP players are not killed and moved to respawn when they join the game. - JIP players are not killed and moved to respawn when they join the game. - - - Once the MSP is deployed, it will report the presence of enemies within a %3 meter radius every %2 seconds. - Once the MSP is deployed, it will report the presence of enemies within a %3 meter radius every %2 seconds. - - - The MSP's enemy reporting feature is disabled for this mission. - The MSP's enemy reporting feature is disabled for this mission. - - - MSP contested status is updated every %2s.<br/>It will be contested if there are more enemies inside a %3m radius or even if one enemy is %4m away from it. - MSP contested status is updated every %2s.<br/>It will be contested if there are more enemies inside a %3m radius or even if one enemy is %4m away from it. - - - MSP vehicle is: %2. - MSP vehicle is: %2. - - - This mission has delayed respawn on. If there is less than %2min (%3%5 from %4min) remaining until the next wave, you will skip it. - This mission has delayed respawn on. If there is less than %2min (%3%5 from %4min) remaining until the next wave, you will skip it. - - - This mission has delayed respawn off. - This mission has delayed respawn off. - - - Mobile Spawn Point (MSP) has been enabled for your side in this mission. - Mobile Spawn Point (MSP) has been enabled for your side in this mission. - - - Mobile Spawn Point (MSP) has been enabled for this mission, but your side does not have MSP. - Mobile Spawn Point (MSP) has been enabled for this mission, but your side does not have MSP. - - - If there is an MSP or custom teleport points in this mission, you can access the teleport menu from the Main Base and uncontested MSP using the ACE action menu.<br/>Custom teleport points might have different conditions and use either the vanilla action menu or ACE action menu, depending on how the mission maker has it set up. - If there is an MSP or custom teleport points in this mission, you can access the teleport menu from the Main Base and uncontested MSP using the ACE action menu.<br/>Custom teleport points might have different conditions and use either the vanilla action menu or ACE action menu, depending on how the mission maker has it set up. - - - - - Endless waves - Endless waves - - - Side tickets - Side tickets - - - Player tickets - Player tickets - - - - - TUN - Mobile Spawn Point - TUN - Mobile Spawn Point - - - Progress Bar - Progress Bar - - - Pack time - Pack time - - - Deploy time - Deploy time - - - Time it takes to deploy MSP (seconds) - Time it takes to deploy MSP (seconds) - - - Time it takes to pack MSP (seconds) - Time it takes to pack MSP (seconds) - - - Enable MSP - Enable MSP - - - Check tickets from MSP - Check tickets from MSP - - - Enable MSP system - Enable MSP system - - - - - Setting up MSP - Setting up MSP - - - Packing MSP - Packing MSP - - - - - MSP has been contested!\nRespawn position has been updated. - MSP has been contested!\nRespawn position has been updated. - - - MSP has been secured!\nRespawn position has been updated. - MSP has been secured!\nRespawn position has been updated. - - - Enemies spotted near MSP! - Enemies spotted near MSP! - - - - - MSP has been deployed!\nRespawn position has been updated. - MSP has been deployed!\nRespawn position has been updated. - - - MSP has been packed!\nRespawn position has been updated. - MSP has been packed!\nRespawn position has been updated. - - - - - MSP Classname - MSP Classname - - - West MSP Classname - West MSP Classname - - - East MSP Classname - East MSP Classname - - - Resistance MSP Classname - Resistance MSP Classname - - - Civilian MSP Classname - Civilian MSP Classname - - - Put the vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use the non-string version of the classname like: B_MRAP_01_F. Only one type of vehicle is supported currently. - Put the vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use the non-string version of the classname like: B_MRAP_01_F. Only one type of vehicle is supported currently. - - - - - When there are enemies inside this radius, MSP is always disabled, even if there are more friendlies within the maximum range (in meters), for this side. - When there are enemies inside this radius, MSP is always disabled, even if there are more friendlies within the maximum range (in meters), for this side. - - - Interval for when the server updates the contested status for MSP, for this side - Interval for when the server updates the contested status for MSP, for this side - - - Radius where there need to be more enemies than allies to disable MSP (meters), for this side - Radius where there need to be more enemies than allies to disable MSP (meters), for this side - - - Minimum Contested Radius - Minimum Contested Radius - - - Maximum Contested Radius - Maximum Contested Radius - - - Contested Check Interval - Contested Check Interval - - - - - Range from MSP where enemies are reported (meters), for this side - Range from MSP where enemies are reported (meters), for this side - - - Interval when the server checks if there are enemies near MSP, for this side - Interval when the server checks if there are enemies near MSP, for this side - - - Enable Reporting Enemies near MSP, for this side - Enable Reporting Enemies near MSP, for this side - - - Report Enemies Interval - Report Enemies Interval - - - Report Enemies Range - Report Enemies Range - - - Report Enemies - Report Enemies - - - - - Mobile spawn point - Mobile spawn point - - - MSP has been destroyed! - MSP has been destroyed! - - - - - Remaining time until respawn: %1 - Remaining time until respawn: %1 - - - - - Who receives MSP deploy/pack notifications? - Who receives MSP deploy/pack notifications? - - - Who receives notifications when MSP is contested? - Who receives notifications when MSP is contested? - - - Who should be notified when enemies are near MSP? - Who should be notified when enemies are near MSP? - - - When MSP is deployed or packed up, who will receive notifications from it. Default: Group Leader - When MSP is deployed or packed up, who will receive notifications from it. Default: Group Leader - - - When MSP is contested, who will receive notifications from it. Default: Group Leader - When MSP is contested, who will receive notifications from it. Default: Group Leader - - - When enemies are near MSP, who will receive notifications from it. Default: Group Leader - When enemies are near MSP, who will receive notifications from it. Default: Group Leader - - - Notifications - Notifications - - + + + __%1__ deployed MSP by __inst__. + __%1__ deployed MSP by __inst__. + + + __%1__ packed MSP by __inst__. + __%1__ packed MSP by __inst__. + + + __%1__ MSP is contested + __%1__ MSP is contested + + + __%1__ MSP is no longer contested + __%1__ MSP is no longer contested + + + Respawn wave for __%1__. %2 units respawned. Total respawn count is %3. + Respawn wave for __%1__. %2 units respawned. Total respawn count is %3. + + + Respawn wave for __%1__. %2 units have respawned. Total respawns so far: %3. Remaining tickets: %4. + Respawn wave for __%1__. %2 units have respawned. Total respawns so far: %3. Remaining tickets: %4. + diff --git a/addons/msp/Stringtable.xml b/addons/msp/Stringtable.xml new file mode 100644 index 0000000..2acdc25 --- /dev/null +++ b/addons/msp/Stringtable.xml @@ -0,0 +1,274 @@ + + + + + Contested settings for the West + Spectator allowed sides for West + + + Contested settings for the East + Contested settings for the East + + + Contested settings for the Resistance + Contested settings for the Resistance + + + Contested settings for the Civilian + Contested settings for the Civilian + + + MSP deployement aborted! + MSP deployement aborted! + + + Enable contest area check. + Enable contest area check. + + + Disable contest area check. + Disable contest area check. + + + After enabling, you can click on the map during the briefing, and it will create contest area markers. + After enabling, you can click on the map during the briefing, and it will create contest area markers. + + + MSP check contest area + MSP check contest area + + + MSP settings + MSP settings + + + MSP info + MSP info + + + You can check remaining tickets from MSP using ACE actions. + You can check remaining tickets from MSP using ACE actions. + ip the next respawn wave. + + + Check if MSP is contested + Check if MSP is contested + + + Check contest area + Check contest area + + + Pack MSP + Pack MSP + + + Deploy MSP + Deploy MSP + + + Respawn Actions + Respawn Actions + + + MSP is contested + MSP is contested + + + MSP is not contested + MSP is not contested + + + Can't be used during mission! + Can't be used during mission! + + + TUN - Mobile Spawn Point + TUN - Mobile Spawn Point + + + Progress Bar + Progress Bar + + + Pack time + Pack time + + + Deploy time + Deploy time + + + Time it takes to deploy MSP (seconds) + Time it takes to deploy MSP (seconds) + + + Time it takes to pack MSP (seconds) + Time it takes to pack MSP (seconds) + + + Enable MSP + Enable MSP + + + Check tickets from MSP + Check tickets from MSP + + + Enable MSP system + Enable MSP system + + + Setting up MSP + Setting up MSP + + + Packing MSP + Packing MSP + + + MSP has been contested!\nRespawn position has been updated. + MSP has been contested!\nRespawn position has been updated. + + + MSP has been secured!\nRespawn position has been updated. + MSP has been secured!\nRespawn position has been updated. + + + Enemies spotted near MSP! + Enemies spotted near MSP! + + + MSP Classname + MSP Classname + + + West MSP Classname + West MSP Classname + + + East MSP Classname + East MSP Classname + + + Resistance MSP Classname + Resistance MSP Classname + + + Civilian MSP Classname + Civilian MSP Classname + + + Put the vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use the non-string version of the classname like: B_MRAP_01_F. Only one type of vehicle is supported currently. + Put the vehicle classname which will be used as MSP. All vehicles of that type can be used as MSP. Use the non-string version of the classname like: B_MRAP_01_F. Only one type of vehicle is supported currently. + + + When there are enemies inside this radius, MSP is always disabled, even if there are more friendlies within the maximum range (in meters), for this side. + When there are enemies inside this radius, MSP is always disabled, even if there are more friendlies within the maximum range (in meters), for this side. + + + Interval for when the server updates the contested status for MSP, for this side + Interval for when the server updates the contested status for MSP, for this side + + + Radius where there need to be more enemies than allies to disable MSP (meters), for this side + Radius where there need to be more enemies than allies to disable MSP (meters), for this side + + + Minimum Contested Radius + Minimum Contested Radius + + + Maximum Contested Radius + Maximum Contested Radius + + + Contested Check Interval + Contested Check Interval + + + Range from MSP where enemies are reported (meters), for this side + Range from MSP where enemies are reported (meters), for this side + + + Interval when the server checks if there are enemies near MSP, for this side + Interval when the server checks if there are enemies near MSP, for this side + + + Enable Reporting Enemies near MSP, for this side + Enable Reporting Enemies near MSP, for this side + + + Report Enemies Interval + Report Enemies Interval + + + Report Enemies Range + Report Enemies Range + + + Report Enemies + Report Enemies + + + Mobile spawn point + Mobile spawn point + + + MSP has been destroyed! + MSP has been destroyed! + + + Who receives MSP deploy/pack notifications? + Who receives MSP deploy/pack notifications? + + + Who receives notifications when MSP is contested? + Who receives notifications when MSP is contested? + + + Who should be notified when enemies are near MSP? + Who should be notified when enemies are near MSP? + + + When MSP is deployed or packed up, who will receive notifications from it. Default: Group Leader + When MSP is deployed or packed up, who will receive notifications from it. Default: Group Leader + + + When MSP is contested, who will receive notifications from it. Default: Group Leader + When MSP is contested, who will receive notifications from it. Default: Group Leader + + + When enemies are near MSP, who will receive notifications from it. Default: Group Leader + When enemies are near MSP, who will receive notifications from it. Default: Group Leader + + + Notifications + Notifications + + + Once the MSP is deployed, it will report the presence of enemies within a %3 meter radius every %2 seconds. + Once the MSP is deployed, it will report the presence of enemies within a %3 meter radius every %2 seconds. + + + The MSP's enemy reporting feature is disabled for this mission. + The MSP's enemy reporting feature is disabled for this mission. + + + MSP contested status is updated every %2s.<br/>It will be contested if there are more enemies inside a %3m radius or even if one enemy is %4m away from it. + MSP contested status is updated every %2s.<br/>It will be contested if there are more enemies inside a %3m radius or even if one enemy is %4m away from it. + + + MSP vehicle is: %2. + MSP vehicle is: %2. + + + Mobile Spawn Point (MSP) has been enabled for your side in this mission. + Mobile Spawn Point (MSP) has been enabled for your side in this mission. + + + Mobile Spawn Point (MSP) has been enabled for this mission, but your side does not have MSP. + Mobile Spawn Point (MSP) has been enabled for this mission, but your side does not have MSP. + + + diff --git a/addons/respawn/Stringtable.xml b/addons/respawn/Stringtable.xml new file mode 100644 index 0000000..872f9a5 --- /dev/null +++ b/addons/respawn/Stringtable.xml @@ -0,0 +1,437 @@ + + + + + Respawn wave interval + Respawn wave interval + + + Time after JIP are killed and moved to respawn (minutes) + Time after JIP are killed and moved to respawn (minutes) + + + Enable kill JIP system + Enable kill JIP system + + + Ticket count for either the entire side or each player on that side + Ticket count for either the entire side or each player on that side + + + "SQF Gearscript": Requires two variables to be set: "tunres_Respawn_Role," which serves as a parameter, and "tunres_Respawn_GearPath," which denotes the file path. "Potato Tool": Simply invokes its own function. "Save gear": Loads the same loadout saved at mission start, or it can be updated during the mission using the "tunres_Respawn_fnc_savegear" function. None: No gear scripts are executed. Players will spawn without any gear. Utilize the event handler "tunres_respawn_EH_unitRespawned" to provide gear. + "SQF Gearscript": Requires two variables to be set: "tunres_Respawn_Role," which serves as a parameter, and "tunres_Respawn_GearPath," which denotes the file path. "Potato Tool": Simply invokes its own function. "Save gear": Loads the same loadout saved at mission start, or it can be updated during the mission using the "tunres_Respawn_fnc_savegear" function. None: No gear scripts are executed. Players will spawn without any gear. Utilize the event handler "tunres_respawn_EH_unitRespawned" to provide gear. + + + "Endless waves": Endless waves. "Side tickets": Side shares a ticket pool. Player tickets": Each player has their own ticket pool. + "Endless waves": Endless waves. "Side tickets": Side shares a ticket pool. Player tickets": Each player has their own ticket pool. + + + Enable this camera mode for spectators + Enable this camera mode for spectators + + + TUN - Respawn System + TUN - Respawn System + + + Briefing notes + Briefing notes + + + Wave times + Wave times + + + Check tickets + Check tickets + + + Spectator camera modes + Spectator camera modes + + + Tickets + Tickets + + + Main Settings + Main Settings + + + Enable Respawn System + Enable Respawn System + + + Activate Respawn System for the mission. + Activate Respawn System for the mission. + + + Enable checking remaining tickets from this location. + Enable checking remaining tickets from this location. + + + Only forced respawn waves. No timer involved. + Only forced respawn waves. No timer involved. + + + If the remaining respawn time is less than the specified percentage here, the player will skip the next wave. For example, if the wave interval is 20 minutes and this is set to 50%, and a player dies when there are less than 10 minutes remaining until the next respawn, the player will skip the next wave and needs to wait for the following one. Set to 0 to disable this feature. + If the remaining respawn time is less than the specified percentage here, the player will skip the next wave. For example, if the wave interval is 20 minutes and this is set to 50%, and a player dies when there are less than 10 minutes remaining until the next respawn, the player will skip the next wave and needs to wait for the following one. Set to 0 to disable this feature. + + + Range for Waiting Area. Default is 100m. + Range for Waiting Area. Default is 100m. + + + Remaining tickets for your side: + Remaining tickets for your side: + + + You are respawning! Please standby. + You are respawning! Please standby. + + + Spectator allowed sides for West + Spectator allowed sides for West + + + Spectator allowed sides for East + Spectator allowed sides for East + + + Spectator allowed sides for Resistance + Spectator allowed sides for Resistance + + + Spectator allowed sides for Civilian + Spectator allowed sides for Civilian + + + Allow this side to be spectated + Allow this side to be spectated + + + Respawn point + Respawn point + + + Main base + Main base + + + To use a custom texture, provide the path to it in a non-string format. If left empty or if an invalid path is given, the default side color will be used. + To use a custom texture, provide the path to it in a non-string format. If left empty or if an invalid path is given, the default side color will be used. + + + Ticket count: %2 (<font color="#0000FF">West</font>) + Ticket count: %2 (<font color="#0000FF">West</font>) + + + Ticket count: %2 (<font color="#E60000">East</font>) + Ticket count: %2 (<font color="#E60000">East</font>) + + + Ticket count: %2 (<font color="#00CC00">Resistance</font>) + Ticket count: %2 (<font color="#00CC00">Resistance</font>) + + + Ticket count: %2 (<font color="#B040A7">Civilian</font>) + Ticket count: %2 (<font color="#B040A7">Civilian</font>) + + + You can check remaining tickets from the main base (flagpole) using ACE actions. + You can check remaining tickets from the main base (flagpole) using ACE actions. + + + For <font color="#0000FF">West</font> is %2min + For <font color="#0000FF">West</font> is %2min + + + For <font color="#E60000">East</font> is %2min + For <font color="#E60000">East</font> is %2min + + + For <font color="#00CC00">Resistance</font> is %2min + For <font color="#00CC00">Resistance</font> is %2min + + + For <font color="#B040A7">Civilian</font> is %2min + For <font color="#B040A7">Civilian</font> is %2min + + + Tickets + Tickets + + + Respawn settings + Respawn settings + + + You are going to skip the next respawn wave. + You are going to skip the next respawn wave. + + + Check respawn time until the next wave + Check respawn time until the next wave + + + Main + Main + + + Respawn settings + Respawn settings + + + Tun - Respawn settings + Tun - Respawn settings + + + Get over here! + Get over here! + + + __inst__ has been force respawned. + __inst__ has been force respawned. + + + __%1__ has been force respawned. + __%1__ has been force respawned. + + + Remaining time until respawn + Remaining time until respawn + + + Remaining time until respawn: %1 + Remaining time until respawn: %1 + + + Respawn is currently disabled. + Respawn is currently disabled. + + + Mission is using only forced waves. + Mission is using only forced waves. + + + Remaining ticket count is: + Remaining ticket count is: + + + Check remaining tickets + Check remaining tickets + + + You are being teleported to: + You are being teleported to: + + + This teleport point is disabled + This teleport point is disabled + + + Open teleportmenu + Open teleportmenu + + + <t color='#FF0000'>Open teleport menu</t> + <t color='#FF0000'>Open teleport menu</t> + + + Main Base + Main Base + + + Place this module where you want the respawn point to be for this side. + Place this module where you want the respawn point to be for this side. + + + Spawn Point + Spawn Point + + + Choose the side for this spawn point + Choose the side for this spawn point + + + Tun Respawn + Tun Respawn + + + The Respawn Position module does not have a side set. + The Respawn Position module does not have a side set. + + + There is already a '%1' marker. You either have multiple respawn point modules with the same settings or a marker named that. Either way, please remove it. + There is already a '%1' marker. You either have multiple respawn point modules with the same settings or a marker named that. Either way, please remove it. + + + Teleport point + Teleport point + + + Teleport network point. + Teleport network point. + + + Marker icon must be in a non-string format. Default: hd_start + Marker icon must be in a non-string format. Default: hd_start + + + Create a marker for this teleporter for the enabled sides. + Create a marker for this teleporter for the enabled sides. + + + When enabled, it will use ACE interaction. Otherwise, it will use addAction. + When enabled, it will use ACE interaction. Otherwise, it will use addAction. + + + Name for teleport location + Name for teleport location + + + Condition to enable/disable opening teleport menu. Must return true or false. Default: true + Condition to enable/disable opening teleport menu. Must return true or false. Default: true + + + Condition to enable/disable TP location. (Code) Default: True + Condition to enable/disable TP location. (Code) Default: True + + + Is this side allowed to use this teleporter? + Is this side allowed to use this teleporter? + + + Classname for the object where the action to teleport is. Non-string format: Land_Sleeping_bag_blue_folded_F + Classname for the object where the action to teleport is. Non-string format: Land_Sleeping_bag_blue_folded_F + + + There is already a '%1' marker. You either have multiple Waiting Area modules with the same settings or a marker named that. Please remove it. + There is already a '%1' marker. You either have multiple Waiting Area modules with the same settings or a marker named that. Please remove it. + + + The Waiting Area module does not have a side set + The Waiting Area module does not have a side set + + + Waiting Area + Waiting Area + + + Place this module where you want the respawn waiting area to be for this side. + Place this module where you want the respawn waiting area to be for this side. + + + Choose the side for this waiting area + Choose the side for this waiting area + + + Teleport network + Teleport network + + + Teleport + Teleport + + + Show tickets + Show tickets + + + Enable briefing notes + Enable briefing notes + + + Create a briefing tab displaying all these settings. + Create a briefing tab displaying all these settings. + + + Show respawn type + Show respawn type + + + Show respawn wave time + Show respawn wave time + + + When enabled, the wave interval time will be shown in the briefing notes. + When enabled, the wave interval time will be shown in the briefing notes. + + + When enabled, the starting ticket count will be shown in the briefing notes. + When enabled, the starting ticket count will be shown in the briefing notes. + + + When enabled, the respawn type will be shown in the briefing notes. + When enabled, the respawn type will be shown in the briefing notes. + + + Show this side for all. Own side is always shown, if 'show tickets' is enabled. Also, if that is disabled, none of the sides' tickets are shown. + Show this side for all. Own side is always shown, if 'show tickets' is enabled. Also, if that is disabled, none of the sides' tickets are shown. + + + Show west data to all + Show west data to all + + + Show east data to all + Show east data to all + + + Show resistance data to all + Show resistance data to all + + + Show civilian data to all + Show civilian data to all + + + The mission has unlimited tickets for each side. + The mission has unlimited tickets for each side. + + + The mission has limited tickets for each side. + The mission has limited tickets for each side. + + + The mission has limited tickets for each player. + The mission has limited tickets for each player. + + + The mission only uses forced respawn waves, so there is no respawn timer. + The mission only uses forced respawn waves, so there is no respawn timer. + + + JIP players will be killed and moved to respawn after %2min from mission start. If a player disconnects earlier, it won't use a ticket. + JIP players will be killed and moved to respawn after %2min from mission start. If a player disconnects earlier, it won't use a ticket. + + + JIP players are not killed and moved to respawn when they join the game. + JIP players are not killed and moved to respawn when they join the game. + + + This mission has delayed respawn on. If there is less than %2min (%3%5 from %4min) remaining until the next wave, you will skip it. + This mission has delayed respawn on. If there is less than %2min (%3%5 from %4min) remaining until the next wave, you will skip it. + + + This mission has delayed respawn off. + This mission has delayed respawn off. + + + If there is an MSP or custom teleport points in this mission, you can access the teleport menu from the Main Base and uncontested MSP using the ACE action menu.<br/>Custom teleport points might have different conditions and use either the vanilla action menu or ACE action menu, depending on how the mission maker has it set up. + If there is an MSP or custom teleport points in this mission, you can access the teleport menu from the Main Base and uncontested MSP using the ACE action menu.<br/>Custom teleport points might have different conditions and use either the vanilla action menu or ACE action menu, depending on how the mission maker has it set up. + + + Endless waves + Endless waves + + + Side tickets + Side tickets + + + Player tickets + Player tickets + + + From edd36484a92d37139e4d0dec69a66f1824fac037 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 18 Sep 2024 23:13:44 +0300 Subject: [PATCH 179/228] not working --- .github/workflows/sqflint.yml | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 .github/workflows/sqflint.yml diff --git a/.github/workflows/sqflint.yml b/.github/workflows/sqflint.yml deleted file mode 100644 index a2d0daf..0000000 --- a/.github/workflows/sqflint.yml +++ /dev/null @@ -1,17 +0,0 @@ -# main.yml -name: CI - -on: - push: - branches: - - master - pull_request: ~ - -jobs: - test-sqflint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - - - uses: arma-actions/sqflint@v1.0 - name: Validate with SQFLint \ No newline at end of file From f97215abc47c5d2a0a9ec0b01deb56668533302b Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 18 Sep 2024 23:17:06 +0300 Subject: [PATCH 180/228] convert to use macro stringtable --- addons/msp/functions/fnc_addAceActions.sqf | 18 +- addons/msp/functions/fnc_addEventHandlers.sqf | 2 +- addons/msp/functions/fnc_briefingNotes.sqf | 28 +-- .../fnc_checkContestZoneMarkersBriefing.sqf | 2 +- addons/msp/functions/fnc_contestedCheck.sqf | 6 +- .../functions/fnc_startContestedChecks.sqf | 2 +- .../fnc_startUpdateDeployementStatus.sqf | 6 +- .../functions/fnc_updateDeployementStatus.sqf | 4 +- addons/msp/initSettings.inc.sqf | 141 +++++++------- addons/respawn/CfgVehicles.hpp | 38 ++-- addons/respawn/TP_dialog.hpp | 4 +- addons/respawn/XEH_postInit_client.sqf | 2 +- addons/respawn/config.cpp | 2 +- .../functions/fnc_addActionsPlayer.sqf | 4 +- .../fnc_addCheckTicketCountAction.sqf | 4 +- .../respawn/functions/fnc_addMainAction.sqf | 4 +- .../functions/fnc_addTeleportAction.sqf | 4 +- .../respawn/functions/fnc_briefingNotes.sqf | 44 ++--- .../respawn/functions/fnc_doRespawnWave.sqf | 4 +- .../functions/fnc_forceRespawnPlayer.sqf | 2 +- .../functions/fnc_forceRespawnWave.sqf | 2 +- .../respawn/functions/fnc_getTicketCount.sqf | 2 +- .../functions/fnc_getTicketCountClient.sqf | 2 +- .../functions/fnc_moduleRespawnPoint.sqf | 8 +- .../functions/fnc_moduleWaitingArea.sqf | 4 +- .../fnc_remainingWaitTimeNotification.sqf | 2 +- addons/respawn/functions/fnc_respawnUnit.sqf | 2 +- .../respawn/functions/fnc_teleportButton.sqf | 4 +- addons/respawn/functions/fnc_waitingArea.sqf | 14 +- addons/respawn/initSettings.inc.sqf | 182 +++++++++--------- 30 files changed, 272 insertions(+), 271 deletions(-) diff --git a/addons/msp/functions/fnc_addAceActions.sqf b/addons/msp/functions/fnc_addAceActions.sqf index 5b43668..2bb3e8c 100644 --- a/addons/msp/functions/fnc_addAceActions.sqf +++ b/addons/msp/functions/fnc_addAceActions.sqf @@ -17,7 +17,7 @@ if (playerSide isEqualTo sideLogic || !hasInterface) exitWith { }; // Exit if a private _vehicle = GVAR(classnamesHash) get playerSide; -private _actionMain = [QEGVAR(main,respawnAction), localize "STR_tunres_MSP_AceAction_RespawnActions", "\a3\Modules_F_Curator\Data\portraitRespawnTickets_ca.paa", {true}, {true}] call ace_interact_menu_fnc_createAction; +private _actionMain = [QEGVAR(main,respawnAction), LLSTRING(AceAction_RespawnActions), "\a3\Modules_F_Curator\Data\portraitRespawnTickets_ca.paa", {true}, {true}] call ace_interact_menu_fnc_createAction; [_vehicle, 0, ["ACE_MainActions"], _actionMain] call ace_interact_menu_fnc_addActionToClass; //check that class exist @@ -29,24 +29,24 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { { speed player isEqualTo 0 } && {!((GVAR(deployementStatusHash) getOrDefault [playerSide, false]))} }; - _createMSP = ["Set up MSP", localize "STR_tunres_MSP_AceAction_DeployMSP", "\a3\3den\data\cfgwaypoints\unload_ca.paa", {[_target, true] call FUNC(startUpdateDeployementStatus);}, _create_condition, {}, [], [0, 0, 0], 2, [false, true, false, false, false]] call ace_interact_menu_fnc_createAction; + _createMSP = ["Set up MSP", LLSTRING(AceAction_DeployMSP), "\a3\3den\data\cfgwaypoints\unload_ca.paa", {[_target, true] call FUNC(startUpdateDeployementStatus);}, _create_condition, {}, [], [0, 0, 0], 2, [false, true, false, false, false]] call ace_interact_menu_fnc_createAction; //remove msp action private _remove_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide} && {_target getVariable [QGVAR(isMSP), false]} }; - _removeMSP = ["Pack MSP", localize "STR_tunres_MSP_AceAction_PackMSP", "\a3\3den\data\cfgwaypoints\load_ca.paa", {[_target, false] call FUNC(startUpdateDeployementStatus);}, _remove_condition, {}, [], [0, 0, 0], 2, [false, true, false, false, false]] call ace_interact_menu_fnc_createAction; + _removeMSP = ["Pack MSP", LLSTRING(AceAction_PackMSP), "\a3\3den\data\cfgwaypoints\load_ca.paa", {[_target, false] call FUNC(startUpdateDeployementStatus);}, _remove_condition, {}, [], [0, 0, 0], 2, [false, true, false, false, false]] call ace_interact_menu_fnc_createAction; private _aliveAndSameSideConditio = {alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; private _aliveAndSameSideAndIsMSPConditio = {alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide} && _target getVariable [QGVAR(isMSP), false]}; //check time - private _chekTime = ["Check Respawn Time", localize "STR_tunres_Respawn_AceAction_CheckNextWaveTime", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", EFUNC(respawn,remainingWaitTimeNotification), _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; + private _chekTime = ["Check Respawn Time", localize "STR_tunres_respawn_AceAction_CheckNextWaveTime", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", EFUNC(respawn,remainingWaitTimeNotification), _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; //Check contest area - private _checkArea = ["Check contest area", localize "STR_tunres_MSP_AceAction_CheckMspContestedArea", "a3\ui_f\data\igui\cfg\simpletasks\types\map_ca.paa", {[_target] call FUNC(checkContestZoneArea);}, _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; + private _checkArea = ["Check contest area", LLSTRING(AceAction_CheckMspContestedArea), "a3\ui_f\data\igui\cfg\simpletasks\types\map_ca.paa", {[_target] call FUNC(checkContestZoneArea);}, _aliveAndSameSideConditio] call ace_interact_menu_fnc_createAction; //Check if contested - private _checkContest= ["Check if MSP contested", localize "STR_tunres_MSP_AceAction_CheckIfMspContested", "", { - private _text = localize (["STR_tunres_MSP_NotContested","STR_tunres_MSP_IsContested"] select (_target getVariable [QGVAR(isContested), false])); + private _checkContest= ["Check if MSP contested", LLSTRING(AceAction_CheckIfMspContested), "", { + private _text = localize ([LSTRING(NotContested),LSTRING(IsContested)] select (_target getVariable [QGVAR(isContested), false])); [QEGVAR(main,doNotification), [_text]] call CBA_fnc_localEvent; }, _aliveAndSameSideAndIsMSPConditio] call ace_interact_menu_fnc_createAction; @@ -63,7 +63,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { private _menu_condition = toString {alive _target && {_target getVariable [QGVAR(isMSP), false]} && {!(_target getVariable [QGVAR(isContested), false])}}; private _tp_conditionText = toString {private _msp = GVAR(activeVehicleHash) get playerSide; private _status = _msp getVariable [QGVAR(isContested), false]; (_target isNotEqualTo _msp && _obj getVariable [QGVAR(isMSP), false] && !_status)}; - [_entity, _tp_conditionText, localize "STR_tunres_MSP_TpText", false, nil, [playerSide], true, _menu_condition, false, ["ACE_MainActions",QEGVAR(main,respawnAction)]] call EFUNC(respawn,addCustomTeleporter); + [_entity, _tp_conditionText, LLSTRING(TpText), false, nil, [playerSide], true, _menu_condition, false, ["ACE_MainActions",QEGVAR(main,respawnAction)]] call EFUNC(respawn,addCustomTeleporter); }, false, [], true] call CBA_fnc_addClassEventHandler; if (GVAR(allowCheckTicketsMSP) && EGVAR(respawn,respawnType) isNotEqualTo 0) then { @@ -71,7 +71,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { [] call EFUNC(respawn,checkTicketCount); }; private _remaining_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; - private _remainingTickets = [localize "STR_tunres_Respawn_CheckTickets", localize "STR_tunres_Respawn_CheckTickets", "\a3\modules_f_curator\data\portraitmissionname_ca.paa", _remaining_action, _remaining_condition] call ace_interact_menu_fnc_createAction; + private _remainingTickets = [localize "STR_tunres_respawn_CheckTickets", localize "STR_tunres_respawn_CheckTickets", "\a3\modules_f_curator\data\portraitmissionname_ca.paa", _remaining_action, _remaining_condition] call ace_interact_menu_fnc_createAction; [_vehicle, 0, ["ACE_MainActions",QEGVAR(main,respawnAction)], _remainingTickets] call ace_interact_menu_fnc_addActionToClass; }; } else { diff --git a/addons/msp/functions/fnc_addEventHandlers.sqf b/addons/msp/functions/fnc_addEventHandlers.sqf index a71e0c6..f5ff295 100644 --- a/addons/msp/functions/fnc_addEventHandlers.sqf +++ b/addons/msp/functions/fnc_addEventHandlers.sqf @@ -71,7 +71,7 @@ [QEGVAR(respawn,updateRespawnPointEH), [_side, false]] call CBA_fnc_serverEvent; private _whoToNotify = [_side, 1] call FUNC(whoToNotify); - [QEGVAR(main,doNotification), [localize "STR_tunres_MSP_destroyed"], _whoToNotify] call CBA_fnc_targetEvent; + [QEGVAR(main,doNotification), [LLSTRING(destroyed)], _whoToNotify] call CBA_fnc_targetEvent; }; }; diff --git a/addons/msp/functions/fnc_briefingNotes.sqf b/addons/msp/functions/fnc_briefingNotes.sqf index 2537c33..29d14bc 100644 --- a/addons/msp/functions/fnc_briefingNotes.sqf +++ b/addons/msp/functions/fnc_briefingNotes.sqf @@ -17,40 +17,40 @@ if (playerSide isEqualTo sideLogic || !hasInterface) exitWith { }; // Exit if a private _vehicle = GVAR(classnamesHash) get playerSide; -private _text = ""+ localize "STR_tunres_MSP_Briefing_Header" +"
"; +private _text = ""+ LLSTRING(Briefing_Header) +"
"; if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { private _values = GVAR(contestValuesHash) get playerSide; _values params ["_reportEnemiesInterval", "_reportEnemiesRange", "_contestedRadiusMax", "_contestedRadiusMin", "_contestedCheckInterval", "_reportEnemiesEnabled"]; - _text = format ["%1
- %2",_text, localize "STR_tunres_Respawn_Briefing_MspEnabled"]; + _text = format ["%1
- %2",_text, LLSTRING(Briefing_MspEnabled)]; if (_reportEnemiesEnabled) then { - _text = format [("%1

- " + localize "STR_tunres_Respawn_Briefing_reportEnemiesEnabled"),_text, _reportEnemiesInterval, _reportEnemiesRange]; + _text = format [("%1

- " + LLSTRING(Briefing_reportEnemiesEnabled)),_text, _reportEnemiesInterval, _reportEnemiesRange]; } else { - _text = format ["%1

- %2",_text, localize "STR_tunres_Respawn_Briefing_reportEnemiesDisabled"]; + _text = format ["%1

- %2",_text, LLSTRING(Briefing_reportEnemiesDisabled)]; }; if (GVAR(allowCheckTicketsMSP)) then { - _text = format [("%1

- " + localize "STR_tunres_MSP_Briefing_CheckTicketsMsp"),_text]; + _text = format [("%1

- " + LLSTRING(Briefing_CheckTicketsMsp)),_text]; }; - _text = format ["%1

- "+ localize "STR_tunres_Respawn_Briefing_ContestedCheck",_text, _contestedCheckInterval, _contestedRadiusMax, _contestedRadiusMin]; - _text = format ["%1

- "+ localize "STR_tunres_Respawn_Briefing_MspVehicle",_text, getText (configFile >> "CfgVehicles" >> _vehicle >> "displayName")]; + _text = format ["%1

- "+ LLSTRING(Briefing_ContestedCheck),_text, _contestedCheckInterval, _contestedRadiusMax, _contestedRadiusMin]; + _text = format ["%1

- "+ LLSTRING(Briefing_MspVehicle),_text, getText (configFile >> "CfgVehicles" >> _vehicle >> "displayName")]; } else { - _text = format ["%1
- %2",_text, localize "STR_tunres_Respawn_Briefing_MspDisabled"]; + _text = format ["%1
- %2",_text, LLSTRING(Briefing_MspDisabled)]; }; _text = format ["%1

Powered By TuntematonEngine v%2.%3.%4", _text, MAJOR, MINOR, PATCH]; if !(player diarySubjectExists QEGVAR(main,briefing)) then { - player createDiarySubject [QEGVAR(main,briefing),localize "STR_tunres_Respawn_Briefing_RespawnMainCategory"]; + player createDiarySubject [QEGVAR(main,briefing),localize "STR_tunres_respawn_Briefing_RespawnMainCategory"]; }; -player createDiaryRecord [QEGVAR(main,briefing),[localize "STR_tunres_MSP_Briefing_Category", _text]]; +player createDiaryRecord [QEGVAR(main,briefing),[LLSTRING(Briefing_Category), _text]]; -player createDiaryRecord [QEGVAR(main,briefing),[localize "STR_tunres_MSP_Briefing_AreaContestCheckCategory", -localize "STR_tunres_MSP_Briefing_AreaContestCheckText" +" -

"+ localize "STR_tunres_MSP_Briefing_EnableAreaContestCheck" +" -

"+ localize "STR_tunres_MSP_Briefing_DisableAreaContestCheck" +"" +player createDiaryRecord [QEGVAR(main,briefing),[LLSTRING(Briefing_AreaContestCheckCategory), +LLSTRING(Briefing_AreaContestCheckText) +" +

"+ LLSTRING(Briefing_EnableAreaContestCheck) +" +

"+ LLSTRING(Briefing_DisableAreaContestCheck) +"" ]]; \ No newline at end of file diff --git a/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf b/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf index d6fce1e..e438df6 100644 --- a/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf +++ b/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf @@ -23,7 +23,7 @@ params[["_enable", true]]; if (_enable) then { if (cba_missiontime > 1) exitWith { - [QEGVAR(main,doNotification), [localize "STR_tunres_MSP_checkContestCantUse"]] call CBA_fnc_localEvent; + [QEGVAR(main,doNotification), [LLSTRING(checkContestCantUse)]] call CBA_fnc_localEvent; }; if (!isNil QGVAR(checkContestZoneMarkersBriefingEH)) exitWith { diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index 4772e2c..7cec284 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -65,7 +65,7 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { if (_oldContestedStatus isNotEqualTo _isContested) then { if (AAR_IS_ENABLED) then { - private _text = (localize(["STR_tunres_MSP_AAR_MSP_notContested","STR_tunres_MSP_AAR_MSP_isContested"] select _isContested)); + private _text = (localize([ELSTRING(main,AAR_MSP_notContested),ELSTRING(main,AAR_MSP_isContested)] select _isContested)); _text = format[_text, _side]; AAR_EVENT(_text,_msp,nil,nil); @@ -81,9 +81,9 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { [QEGVAR(respawn,updateRespawnPointEH), [_side, !_isContested]] call CBA_fnc_serverEvent; private _text = if (_isContested) then { - localize "STR_tunres_MSP_FNC_Contested_hint" + LLSTRING(FNC_Contested_hint) } else { - localize "STR_tunres_MSP_FNC_secured_hint" + LLSTRING(FNC_secured_hint) }; [QEGVAR(main,doNotification), [_text], _whoToNotify] call CBA_fnc_targetEvent; }; diff --git a/addons/msp/functions/fnc_startContestedChecks.sqf b/addons/msp/functions/fnc_startContestedChecks.sqf index 2805fc8..51875b7 100644 --- a/addons/msp/functions/fnc_startContestedChecks.sqf +++ b/addons/msp/functions/fnc_startContestedChecks.sqf @@ -56,7 +56,7 @@ if (_start) then { if (_enemyCount > 0 && !_contestedStatus) then { private _whoToNotify = [_side, GVAR(reportEnemiesNotification)] call FUNC(whoToNotify); if (_whoToNotify isNotEqualTo [] ) then { - [QEGVAR(main,doNotification), [(localize "STR_tunres_MSP_FNC_enemies_near")], _whoToNotify] call CBA_fnc_targetEvent; + [QEGVAR(main,doNotification), [(LLSTRING(FNC_enemies_near))], _whoToNotify] call CBA_fnc_targetEvent; }; }; } else { diff --git a/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf index fbdee54..ef3d13a 100644 --- a/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf @@ -20,7 +20,7 @@ private ["_text", "_time", "_conditio"]; if (_setup) then { [_target] call FUNC(checkContestZoneArea); - _text = localize "STR_tunres_MSP_fnc_startUpdateDeployementStatus_setting"; + _text = LLSTRING(fnc_startUpdateDeployementStatus_setting); _conditio = { private _msp = (_args select 0); driver _msp isEqualTo player && @@ -30,7 +30,7 @@ if (_setup) then { }; _time = GVAR(progresbarTimeSetup); } else { - _text = localize "STR_tunres_MSP_fnc_startUpdateDeployementStatus_packing"; + _text = LLSTRING(fnc_startUpdateDeployementStatus_packing); _conditio = { private _msp = (_args select 0); alive _msp && @@ -44,4 +44,4 @@ private _code = { openMap false; }; -[_time, [_target, _setup, player], _code, {[QEGVAR(main,doNotification), [localize "STR_tunres_MSP_DeployementAborted"]] call CBA_fnc_localEvent;}, _text, _conditio, ["notOnMap","isnotinside"]] call ace_common_fnc_progressBar; \ No newline at end of file +[_time, [_target, _setup, player], _code, {[QEGVAR(main,doNotification), [LLSTRING(DeployementAborted)]] call CBA_fnc_localEvent;}, _text, _conditio, ["notOnMap","isnotinside"]] call ace_common_fnc_progressBar; \ No newline at end of file diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index 12c2ca8..8d1f3e4 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -47,7 +47,7 @@ if (_setup) then { private _whoToNotify = [_side, GVAR(setupNotification)] call FUNC(whoToNotify); if (_whoToNotify isNotEqualTo [] ) then { - private _text = localize (["STR_tunres_MSP_FNC_pack_notification", "STR_tunres_MSP_FNC_setup_notification"] select _setup); + private _text = localize ([LSTRING(FNC_pack_notification), LSTRING(FNC_setup_notification)] select _setup); [QEGVAR(main,doNotification), [_text], _whoToNotify] call CBA_fnc_targetEvent; }; @@ -62,7 +62,7 @@ GVAR(activeVehicleHash) set [_side, [objNull, _msp] select _setup]; publicVariable QGVAR(activeVehicleHash); if (AAR_IS_ENABLED) then { - private _text = localize(["STR_tunres_MSP_AAR_MSP_Packed","STR_tunres_MSP_AAR_MSP_Deployed"] select _setup); + private _text = localize([ELSTRING(main,AAR_MSP_Packed),ELSTRING(main,AAR_MSP_Deployed)] select _setup); _text = format[_text, _side]; AAR_EVENT(_text,_msp,_player,nil); diff --git a/addons/msp/initSettings.inc.sqf b/addons/msp/initSettings.inc.sqf index 187e423..8c1a9d6 100644 --- a/addons/msp/initSettings.inc.sqf +++ b/addons/msp/initSettings.inc.sqf @@ -1,8 +1,8 @@ [ QGVAR(enable), "CHECKBOX", - [localize "STR_tunres_MSP_CBA_Enable", localize "STR_tunres_MSP_CBA_tooltip_Enable"], - localize "STR_tunres_MSP_CBA_Category_main", + [LLSTRING(CBA_Enable), LLSTRING(CBA_tooltip_Enable)], + LLSTRING(CBA_Category_main), false, 1, {}, @@ -12,8 +12,8 @@ [ QGVAR(allowCheckTicketsMSP), "CHECKBOX", - [localize "STR_tunres_MSP_CBA_allowCheckTicketsMSP", localize "STR_tunres_Respawn_CBA_tooltip_CheckTickets"], - localize "STR_tunres_MSP_CBA_Category_main", + [LLSTRING(CBA_allowCheckTicketsMSP), localize "STR_tunres_respawn_CBA_tooltip_CheckTickets"], + LLSTRING(CBA_Category_main), true, 1, {}, @@ -23,8 +23,8 @@ [ QGVAR(reportEnemiesEnabledWest), "CHECKBOX", - [(localize "STR_tunres_MSP_CBA_reportEnemiesEnabled") + " West", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], + [(LLSTRING(CBA_reportEnemiesEnabled)) + " West", LLSTRING(CBA_tooltip_reportEnemiesEnabled)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedWest)], true, 1, { @@ -39,8 +39,8 @@ [ QGVAR(reportEnemiesEnabledEast), "CHECKBOX", - [(localize "STR_tunres_MSP_CBA_reportEnemiesEnabled") + " East", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + [(LLSTRING(CBA_reportEnemiesEnabled)) + " East", LLSTRING(CBA_tooltip_reportEnemiesEnabled)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedEast)], true, 1, { @@ -55,8 +55,8 @@ [ QGVAR(reportEnemiesEnabledResistance), "CHECKBOX", - [(localize "STR_tunres_MSP_CBA_reportEnemiesEnabled") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], + [(LLSTRING(CBA_reportEnemiesEnabled)) + " Resistance", LLSTRING(CBA_tooltip_reportEnemiesEnabled)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedResistance)], true, 1, { @@ -71,8 +71,8 @@ [ QGVAR(reportEnemiesEnabledCivilian), "CHECKBOX", - [(localize "STR_tunres_MSP_CBA_reportEnemiesEnabled" + " Civilian"), localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesEnabled"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], + [(LLSTRING(CBA_reportEnemiesEnabled) + " Civilian"), LLSTRING(CBA_tooltip_reportEnemiesEnabled)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedCivilian)], true, 1, { @@ -87,8 +87,8 @@ [ QGVAR(reportEnemiesIntervalWest), "SLIDER", - [(localize "STR_tunres_MSP_CBA_reportEnemiesIntervala") + " West", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], + [(LLSTRING(CBA_reportEnemiesIntervala)) + " West", LLSTRING(CBA_tooltip_reportEnemiesInterval)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedWest)], [1, 600, 60, 0], 1, { @@ -105,8 +105,8 @@ [ QGVAR(reportEnemiesIntervalEast), "SLIDER", - [(localize "STR_tunres_MSP_CBA_reportEnemiesIntervala") + " East", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + [(LLSTRING(CBA_reportEnemiesIntervala)) + " East", LLSTRING(CBA_tooltip_reportEnemiesInterval)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedEast)], [1, 600, 60, 0], 1, { @@ -123,8 +123,8 @@ [ QGVAR(reportEnemiesIntervalResistance), "SLIDER", - [(localize "STR_tunres_MSP_CBA_reportEnemiesIntervala") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], + [(LLSTRING(CBA_reportEnemiesIntervala)) + " Resistance", LLSTRING(CBA_tooltip_reportEnemiesInterval)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedResistance)], [1, 600, 60, 0], 1, { @@ -141,13 +141,14 @@ [ QGVAR(reportEnemiesIntervalCivilian), "SLIDER", - [(localize "STR_tunres_MSP_CBA_reportEnemiesIntervala") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], + [(LLSTRING(CBA_reportEnemiesIntervala)) + " Civilian", LLSTRING(CBA_tooltip_reportEnemiesInterval)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedCivilian)], [1, 600, 60, 0], 1, { params ["_value"]; _value = round _value; + ok = _value; GVAR(reportEnemiesIntervalCivilian) = _value; private _array = GVAR(contestValuesHash) get civilian; _array set [0, _value]; @@ -159,8 +160,8 @@ [ QGVAR(reportEnemiesRangeWest), "SLIDER", - [(localize "STR_tunres_MSP_CBA_reportEnemiesRange") + " West", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], + [(LLSTRING(CBA_reportEnemiesRange)) + " West", LLSTRING(CBA_tooltip_reportEnemiesRange)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedWest)], [0, 5000, 500, 0], 1, { @@ -177,8 +178,8 @@ [ QGVAR(reportEnemiesRangeEast), "SLIDER", - [(localize "STR_tunres_MSP_CBA_reportEnemiesRange") + " East", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + [(LLSTRING(CBA_reportEnemiesRange)) + " East", LLSTRING(CBA_tooltip_reportEnemiesRange)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedEast)], [0, 5000, 500, 0], 1, { @@ -195,8 +196,8 @@ [ QGVAR(reportEnemiesRangeResistance), "SLIDER", - [(localize "STR_tunres_MSP_CBA_reportEnemiesRange") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], + [(LLSTRING(CBA_reportEnemiesRange)) + " Resistance", LLSTRING(CBA_tooltip_reportEnemiesRange)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedResistance)], [0, 5000, 500, 0], 1, { @@ -213,8 +214,8 @@ [ QGVAR(reportEnemiesRangeCivilian), "SLIDER", - [(localize "STR_tunres_MSP_CBA_reportEnemiesRange") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_reportEnemiesRange"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], + [(LLSTRING(CBA_reportEnemiesRange)) + " Civilian", LLSTRING(CBA_tooltip_reportEnemiesRange)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedCivilian)], [0, 5000, 500, 0], 1, { @@ -231,8 +232,8 @@ [ QGVAR(contestedRadiusMaxWest), "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedRadiusMax") + " West", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], + [(LLSTRING(CBA_contestedRadiusMax)) + " West", LLSTRING(CBA_tooltip_contested_max)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedWest)], [0, 3000, 500, 0], 1, { @@ -249,8 +250,8 @@ [ QGVAR(contestedRadiusMaxEast), "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedRadiusMax") + " East", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + [(LLSTRING(CBA_contestedRadiusMax)) + " East", LLSTRING(CBA_tooltip_contested_max)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedEast)], [0, 3000, 500, 0], 1, { @@ -267,8 +268,8 @@ [ QGVAR(contestedRadiusMaxResistance), "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedRadiusMax") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], + [(LLSTRING(CBA_contestedRadiusMax)) + " Resistance", LLSTRING(CBA_tooltip_contested_max)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedResistance)], [0, 3000, 500, 0], 1, { @@ -285,8 +286,8 @@ [ QGVAR(contestedRadiusMaxCivilian), "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedRadiusMax") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_contested_max"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], + [(LLSTRING(CBA_contestedRadiusMax)) + " Civilian", LLSTRING(CBA_tooltip_contested_max)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedCivilian)], [0, 3000, 500, 0], 1, { @@ -303,8 +304,8 @@ [ QGVAR(contestedRadiusMinWest), "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedRadiusMin") + " West", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], + [(LLSTRING(CBA_contestedRadiusMin)) + " West", LLSTRING(CBA_tooltip_contested_min)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedWest)], [0, 3000, 200, 0], 1, { @@ -321,8 +322,8 @@ [ QGVAR(contestedRadiusMinEast), "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedRadiusMin") + " East", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + [(LLSTRING(CBA_contestedRadiusMin)) + " East", LLSTRING(CBA_tooltip_contested_min)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedEast)], [0, 3000, 200, 0], 1, { @@ -339,8 +340,8 @@ [ QGVAR(contestedRadiusMinResistance), "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedRadiusMin") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], + [(LLSTRING(CBA_contestedRadiusMin)) + " Resistance", LLSTRING(CBA_tooltip_contested_min)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedResistance)], [0, 3000, 200, 0], 1, { @@ -357,8 +358,8 @@ [ QGVAR(contestedRadiusMinCivilian), "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedRadiusMin") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_contested_min"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], + [(LLSTRING(CBA_contestedRadiusMin)) + " Civilian", LLSTRING(CBA_tooltip_contested_min)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedCivilian)], [0, 3000, 200, 0], 1, { @@ -375,8 +376,8 @@ [ QGVAR(contestedCheckIntervalWest), "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedCheckInterval") + " West", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedWest"], + [(LLSTRING(CBA_contestedCheckInterval)) + " West", LLSTRING(CBA_tooltip_contestedCheckInterval)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedWest)], [1, 600, 20, 0], 1, { @@ -393,8 +394,8 @@ [ QGVAR(contestedCheckIntervalEast), "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedCheckInterval") + " East", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedEast"], + [(LLSTRING(CBA_contestedCheckInterval)) + " East", LLSTRING(CBA_tooltip_contestedCheckInterval)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedEast)], [1, 600, 20, 0], 1, { @@ -411,8 +412,8 @@ [ QGVAR(contestedCheckIntervalResistance), "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedCheckInterval") + " Resistance", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedResistance"], + [(LLSTRING(CBA_contestedCheckInterval)) + " Resistance", LLSTRING(CBA_tooltip_contestedCheckInterval)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedResistance)], [1, 600, 20, 0], 1, { @@ -429,8 +430,8 @@ [ QGVAR(contestedCheckIntervalCivilian), "SLIDER", - [(localize "STR_tunres_MSP_CBA_contestedCheckInterval") + " Civilian", localize "STR_tunres_MSP_CBA_tooltip_contestedCheckInterval"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_contestedCivilian"], + [(LLSTRING(CBA_contestedCheckInterval)) + " Civilian", LLSTRING(CBA_tooltip_contestedCheckInterval)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedCivilian)], [1, 600, 20, 0], 1, { @@ -447,8 +448,8 @@ [ QGVAR(progresbarTimeSetup), "SLIDER", - [localize "STR_tunres_MSP_CBA_setup_progresbar", localize "STR_tunres_MSP_CBA_tooltip_setup_ProgressBar"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_progres"], + [LLSTRING(CBA_setup_progresbar), LLSTRING(CBA_tooltip_setup_ProgressBar)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_progres)], [0, 60, 5, 0], 1, { @@ -461,8 +462,8 @@ [ QGVAR(progresbarTimePack), "SLIDER", - [localize "STR_tunres_MSP_CBA_pack_progresbar", localize "STR_tunres_MSP_CBA_tooltip_pack_progresbar"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_Category_progres"], + [LLSTRING(CBA_pack_progresbar), LLSTRING(CBA_tooltip_pack_progresbar)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_progres)], [0, 60, 5, 0], 1, { @@ -475,8 +476,8 @@ [ QGVAR(clasnamesEast), "EDITBOX", - [localize "STR_tunres_MSP_CBA_classname_east", localize "STR_tunres_MSP_CBA_tooltip_classname"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], + [LLSTRING(CBA_classname_east), LLSTRING(CBA_tooltip_classname)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_classname)], "O_Truck_03_transport_F", 1, { @@ -489,8 +490,8 @@ [ QGVAR(clasnamesWest), "EDITBOX", - [localize "STR_tunres_MSP_CBA_classname_west", localize "STR_tunres_MSP_CBA_tooltip_classname"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], + [LLSTRING(CBA_classname_west), LLSTRING(CBA_tooltip_classname)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_classname)], "B_Truck_01_transport_F", 1, { @@ -503,8 +504,8 @@ [ QGVAR(clasnamesResistance), "EDITBOX", - [localize "STR_tunres_MSP_CBA_classname_resistance", localize "STR_tunres_MSP_CBA_tooltip_classname"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], + [LLSTRING(CBA_classname_resistance), LLSTRING(CBA_tooltip_classname)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_classname)], "I_Truck_02_transport_F", 1, { @@ -517,8 +518,8 @@ [ QGVAR(clasnamesCivilian), "EDITBOX", - [localize "STR_tunres_MSP_CBA_classname_civilian", localize "STR_tunres_MSP_CBA_tooltip_classname"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_classname"], + [LLSTRING(CBA_classname_civilian), LLSTRING(CBA_tooltip_classname)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_classname)], "C_Truck_02_transport_F", 1, { @@ -531,8 +532,8 @@ [ QGVAR(setupNotification), "LIST", - [localize "STR_tunres_MSP_CBA_whoGetsSetUpNotification", localize "STR_tunres_MSP_CBA_whoGetsSetUpNotification_Tooltip"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_notificationCategory"], + [LLSTRING(CBA_whoGetsSetUpNotification), LLSTRING(CBA_whoGetsSetUpNotification_Tooltip)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_notificationCategory)], [[0, 1], ["Group Leaders", "Side"], 0], 1, {}, @@ -542,8 +543,8 @@ [ QGVAR(contestedNotification), "LIST", - [localize "STR_tunres_MSP_CBA_whoGetsContestedNotification", localize "STR_tunres_MSP_CBA_whoGetsContestedNotification_Tooltip"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_notificationCategory"], + [LLSTRING(CBA_whoGetsContestedNotification), LLSTRING(CBA_whoGetsContestedNotification_Tooltip)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_notificationCategory)], [[0, 1], ["Group Leaders", "Side"], 0], 1, {}, @@ -553,8 +554,8 @@ [ QGVAR(reportEnemiesNotification), "LIST", - [localize "STR_tunres_MSP_CBA_whoGetsReportEnemiesNotification", localize "STR_tunres_MSP_CBA_whoGetsReportEnemies_Tooltip"], - [localize "STR_tunres_MSP_CBA_Category_main", localize "STR_tunres_MSP_CBA_notificationCategory"], + [LLSTRING(CBA_whoGetsReportEnemiesNotification), LLSTRING(CBA_whoGetsReportEnemies_Tooltip)], + [LLSTRING(CBA_Category_main), LLSTRING(CBA_notificationCategory)], [[0, 1], ["Group Leaders", "Side"], 0], 1, {}, diff --git a/addons/respawn/CfgVehicles.hpp b/addons/respawn/CfgVehicles.hpp index dc100f7..5ea130c 100644 --- a/addons/respawn/CfgVehicles.hpp +++ b/addons/respawn/CfgVehicles.hpp @@ -24,7 +24,7 @@ class CfgVehicles { scope = 2; // Editor visibility; 2 will show it in the menu, 1 will hide it. scopeCurator = 1; - displayName = "$STR_tunres_Respawn_Module_DisplayName_WaitingArea"; // Name displayed in the menu + displayName = CSTRING(Module_DisplayName_WaitingArea); // Name displayed in the menu icon = "\a3\modules_f_curator\data\portraitcountdown_ca.paa"; // Map icon. Delete this entry to use the default icon category = "tunres_Respawn"; @@ -48,7 +48,7 @@ class CfgVehicles { property = QGVAR(module_side); displayName = "Side"; // Argument label - tooltip = "$STR_tunres_Respawn_Module_tooltip_WaitingArea"; // Tooltip description + tooltip = CSTRING(Module_tooltip_WaitingArea); // Tooltip description typeName = "STRING"; // Value type, can be "NUMBER", "STRING" or "BOOL" defaultValue = "0"; // Default attribute value. WARNING: This is an expression, and its returned value will be used (50 in this case) class Values @@ -64,7 +64,7 @@ class CfgVehicles { property = QGVAR(flag_texture); displayName = "Flag texture"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_flagTexture"; + tooltip = CSTRING(Module_tooltip_flagTexture); typeName = "STRING"; // Default text filled in the input box // Because it is an expression, to return a String one must have a string within a string @@ -74,14 +74,14 @@ class CfgVehicles }; class ModuleDescription: ModuleDescription { - description = "$STR_tunres_Respawn_Module_Description_Waitingarea"; // Short description, will be formatted as structured text + description = CSTRING(Module_Description_Waitingarea); // Short description, will be formatted as structured text sync[] = {}; // Array of synced entities (can contain base classes) }; }; class GVAR(moduleRespawnPoint): GVAR(moduleWaitingArea) { - displayName = "$STR_tunres_Respawn_Module_DisplayName_SpawnPoint"; // Name displayed in the menu + displayName = CSTRING(Module_DisplayName_SpawnPoint); // Name displayed in the menu icon = "\a3\modules_f\data\portraitrespawn_ca.paa"; // Name of function triggered once conditions are met function = QFUNC(moduleRespawnPoint); @@ -92,7 +92,7 @@ class CfgVehicles { property = QGVAR(module_side); displayName = "Side"; // Argument label - tooltip = "$STR_tunres_Respawn_Module_tooltip_SpawnPoint"; // Tooltip description + tooltip = CSTRING(Module_tooltip_SpawnPoint); // Tooltip description typeName = "STRING"; // Value type, can be "NUMBER", "STRING" or "BOOL" defaultValue = "0"; // Default attribute value. WARNING: This is an expression, and its returned value will be used (50 in this case) class Values @@ -108,7 +108,7 @@ class CfgVehicles { property = QGVAR(flag_texture); displayName = "Flag texture"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_flagTexture"; + tooltip = CSTRING(Module_tooltip_flagTexture); typeName = "STRING"; // Default text filled in the input box // Because it is an expression, to return a String one must have a string within a string @@ -118,14 +118,14 @@ class CfgVehicles }; class ModuleDescription: ModuleDescription { - description = "$STR_tunres_Respawn_Module_Description_Spawn_Point"; // Short description, will be formatted as structured text + description = CSTRING(Module_Description_Spawn_Point); // Short description, will be formatted as structured text sync[] = {}; // Array of synced entities (can contain base classes) }; }; class GVAR(moduleTeleportPoint): GVAR(moduleWaitingArea) { - displayName = "$STR_tunres_Respawn_Module_DisplayName_teleportPoint"; // Name displayed in the menu + displayName = CSTRING(Module_DisplayName_teleportPoint); // Name displayed in the menu // 0 for server only execution, 1 for global execution, 2 for persistent global execution isGlobal = 2; // 1 for module waiting until all synced triggers are activated @@ -141,7 +141,7 @@ class CfgVehicles { property = QGVAR(teleportPointOBJ); displayName = "Teleport point object"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportPointOBJ"; + tooltip = CSTRING(Module_tooltip_teleportPointOBJ); typeName = "STRING"; // Default text filled in the input box // Because it is an expression, to return a String one must have a string within a string @@ -152,7 +152,7 @@ class CfgVehicles { property = QGVAR(teleportConditio); displayName = "Teleport conditio"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportConditio"; + tooltip = CSTRING(Module_tooltip_teleportConditio); typeName = "STRING"; // Default text filled in the input box // Because it is an expression, to return a String one must have a string within a string @@ -163,7 +163,7 @@ class CfgVehicles { property = QGVAR(teleportName); displayName = "Teleport name"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportName"; + tooltip = CSTRING(Module_tooltip_teleportName); typeName = "STRING"; // Default text filled in the input box // Because it is an expression, to return a String one must have a string within a string @@ -175,7 +175,7 @@ class CfgVehicles property = QGVAR(teleportCreateMarker); displayName = "Create Marker"; typeName = "BOOL"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportCreateMarker"; + tooltip = CSTRING(Module_tooltip_teleportCreateMarker); defaultValue = "true"; }; @@ -183,7 +183,7 @@ class CfgVehicles { property = QGVAR(teleportMarkerIcone); displayName = "Marker Icon"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportMarkerIcone"; + tooltip = CSTRING(Module_tooltip_teleportMarkerIcone); typeName = "STRING"; // Default text filled in the input box // Because it is an expression, to return a String one must have a string within a string @@ -195,7 +195,7 @@ class CfgVehicles property = QGVAR(teleportMenuOpenConditio); displayName = "Menu open conditio"; typeName = "STRING"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportMenuOpenConditio"; + tooltip = CSTRING(Module_tooltip_teleportMenuOpenConditio); defaultValue = """true"""; }; @@ -204,7 +204,7 @@ class CfgVehicles property = QGVAR(teleportUseAceAction); displayName = "Use Ace Actions"; typeName = "BOOL"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportUseAceAction"; + tooltip = CSTRING(Module_tooltip_teleportUseAceAction); defaultValue = "true"; }; @@ -213,7 +213,7 @@ class CfgVehicles property = QGVAR(teleportCheckTickets); displayName = "Allow Check Tickets"; typeName = "BOOL"; - //tooltip = $STR_tunres_Respawn_Module_tooltip_teleportCreateMarker; + //tooltip = $STR_tunres_respawn_Module_tooltip_teleportCreateMarker; defaultValue = "false"; }; @@ -222,7 +222,7 @@ class CfgVehicles property = QGVAR(teleportEnableWest); displayName = "Enable West"; typeName = "BOOL"; - tooltip = "$STR_tunres_Respawn_Module_tooltip_teleportEnableSides"; + tooltip = CSTRING(Module_tooltip_teleportEnableSides); defaultValue = "false"; }; @@ -248,7 +248,7 @@ class CfgVehicles }; class ModuleDescription: ModuleDescription { - description = "$STR_tunres_Respawn_Module_Description_Spawn_Point"; // Short description, will be formatted as structured text + description = CSTRING(Module_Description_teleportPoint); // Short description, will be formatted as structured text position = 1; // Position is taken into effect direction = 0; // Direction is taken into effect optional = 1; // Synced entity is optional diff --git a/addons/respawn/TP_dialog.hpp b/addons/respawn/TP_dialog.hpp index 9c862e4..723e68a 100644 --- a/addons/respawn/TP_dialog.hpp +++ b/addons/respawn/TP_dialog.hpp @@ -36,7 +36,7 @@ class GVAR(TP_Dialog) y = "safeZoneY + safeZoneH * 0.66495"; w = "safeZoneW * 0.0515752"; h = "safeZoneH * 0.0439865"; - text = "$STR_tunres_Respawn_tp_dialog_button"; + text = CSTRING(tp_dialog_button); action = QUOTE([] spawn FUNC(teleportButton);); SizeEx = QUOTE(GUI_TEXT_SIZE_SMALL); colorBackground[] = GUI_BCG_COLOR; @@ -52,7 +52,7 @@ class GVAR(TP_Dialog) w = "safeZoneW * 0.144411"; h = "safeZoneH * 0.0659797"; style = ST_CENTER; - text = "$STR_tunres_Respawn_tp_dialog_header"; + text = CSTRING(tp_dialog_header); sizeEx = QUOTE(GUI_TEXT_SIZE_LARGE); colorText[] = GUI_TITLETEXT_COLOR; colorBackground[] = GUI_BCG_COLOR; diff --git a/addons/respawn/XEH_postInit_client.sqf b/addons/respawn/XEH_postInit_client.sqf index 87433e6..e9e1650 100644 --- a/addons/respawn/XEH_postInit_client.sqf +++ b/addons/respawn/XEH_postInit_client.sqf @@ -30,7 +30,7 @@ ADDON _return }; - private _action = ["TpMenu", localize "STR_tunres_Respawn_TeleportMenu","\a3\3den\data\cfg3den\history\changeattributes_ca.paa",{ [GVAR(selfTPmenuOpenObj)] call FUNC(openTeleportMenu) }, _conditio] call ace_interact_menu_fnc_createAction; + private _action = ["TpMenu", LSTRING(TeleportMenu),"\a3\3den\data\cfg3den\history\changeattributes_ca.paa",{ [GVAR(selfTPmenuOpenObj)] call FUNC(openTeleportMenu) }, _conditio] call ace_interact_menu_fnc_createAction; [(typeOf player), 1, ["ACE_SelfActions"], _action] call ace_interact_menu_fnc_addActionToClass; //Add respawn eh diff --git a/addons/respawn/config.cpp b/addons/respawn/config.cpp index 1dbc02d..4f1799c 100644 --- a/addons/respawn/config.cpp +++ b/addons/respawn/config.cpp @@ -18,7 +18,7 @@ class CfgFactionClasses class NO_CATEGORY; class tunres_Respawn : NO_CATEGORY { - displayName = "$STR_tunres_Respawn_Module_category"; + displayName = CSTRING(Module_category); }; }; diff --git a/addons/respawn/functions/fnc_addActionsPlayer.sqf b/addons/respawn/functions/fnc_addActionsPlayer.sqf index 29e4b89..8ce52a4 100644 --- a/addons/respawn/functions/fnc_addActionsPlayer.sqf +++ b/addons/respawn/functions/fnc_addActionsPlayer.sqf @@ -22,9 +22,9 @@ if (GVAR(allowCheckTicketsBase)) then { }; //private _timer_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; -private _chekTime = ["Check Respawn Time", localize "STR_tunres_Respawn_AceAction_CheckNextWaveTime", "\a3\modules_f_curator\data\portraitskiptime_ca.paa", FUNC(remainingWaitTimeNotification), {true}] call ace_interact_menu_fnc_createAction; +private _chekTime = ["Check Respawn Time", LSTRING(AceAction_CheckNextWaveTime), "\a3\modules_f_curator\data\portraitskiptime_ca.paa", FUNC(remainingWaitTimeNotification), {true}] call ace_interact_menu_fnc_createAction; [_object, 0, _actionPath, _chekTime] call ace_interact_menu_fnc_addActionToObject; // Add tp action private _conditio = "count (missionNamespace getVariable ['tunres_respawn_teleportPoints', []]) > 1" ; -[_object, "true", localize "STR_tunres_Respawn_MainBaseText", false, nil, [playerSide], true, _conditio, false, _actionPath] call FUNC(addCustomTeleporter); \ No newline at end of file +[_object, "true", LSTRING(MainBaseText), false, nil, [playerSide], true, _conditio, false, _actionPath] call FUNC(addCustomTeleporter); \ No newline at end of file diff --git a/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf b/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf index cbb7143..4202691 100644 --- a/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf +++ b/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf @@ -23,9 +23,9 @@ if (GVAR(respawnType) isEqualTo 0) exitWith { }; if (_useAceAction) then { - private _action = ["CheckTickets", localize "STR_tunres_Respawn_CheckTickets","\a3\modules_f_curator\data\portraitmissionname_ca.paa",{ [] call FUNC(checkTicketCount); }, {true}, nil, nil, _offset] call ace_interact_menu_fnc_createAction; + private _action = ["CheckTickets", LSTRING(CheckTickets),"\a3\modules_f_curator\data\portraitmissionname_ca.paa",{ [] call FUNC(checkTicketCount); }, {true}, nil, nil, _offset] call ace_interact_menu_fnc_createAction; [_object, 0, _parrenPath, _action] call ace_interact_menu_fnc_addActionToObject; } else { - _object addAction [localize "STR_tunres_Respawn_CheckTickets", { [] call FUNC(checkTicketCount) }, [], 10, true, true, "", "true", 10]; + _object addAction [LSTRING(CheckTickets), { [] call FUNC(checkTicketCount) }, [], 10, true, true, "", "true", 10]; }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_addMainAction.sqf b/addons/respawn/functions/fnc_addMainAction.sqf index 7a7fd56..4d96d39 100644 --- a/addons/respawn/functions/fnc_addMainAction.sqf +++ b/addons/respawn/functions/fnc_addMainAction.sqf @@ -21,14 +21,14 @@ private _parentAction = [_object] call FUNC(getParentAction); if (count _parentAction isEqualTo 0) then { private _offSet = [_object] call FUNC(getOffSet); _parentAction = ["tunres_respawn_BaseAceAction"]; - private _actionBase = ["tunres_respawn_BaseAceAction", localize "STR_tunres_Respawn_AceAction_Main", "", {true}, {true}, nil, nil, _offSet, 8] call ace_interact_menu_fnc_createAction; + private _actionBase = ["tunres_respawn_BaseAceAction", LSTRING(AceAction_Main), "", {true}, {true}, nil, nil, _offSet, 8] call ace_interact_menu_fnc_createAction; [_object, 0, [], _actionBase] call ace_interact_menu_fnc_addActionToObject; }; private _actionPath = _parentAction + [QEGVAR(main,respawnAction)]; //Add main action -private _actionMain = [QEGVAR(main,respawnAction), localize "STR_tunres_MSP_AceAction_RespawnActions", "\a3\modules_f\data\portraitrespawn_ca.paa", {true}, {true}] call ace_interact_menu_fnc_createAction; +private _actionMain = [QEGVAR(main,respawnAction), LELSTRING(msp,AceAction_RespawnActions), "\a3\modules_f\data\portraitrespawn_ca.paa", {true}, {true}] call ace_interact_menu_fnc_createAction; [_object, 0, _parentAction, _actionMain] call ace_interact_menu_fnc_addActionToObject; _actionPath \ No newline at end of file diff --git a/addons/respawn/functions/fnc_addTeleportAction.sqf b/addons/respawn/functions/fnc_addTeleportAction.sqf index 79a2c7c..cbd7bbc 100644 --- a/addons/respawn/functions/fnc_addTeleportAction.sqf +++ b/addons/respawn/functions/fnc_addTeleportAction.sqf @@ -24,13 +24,13 @@ if (_useAceAction) then { _statement = { params ["_obj", "_menuOpenConditio", "_actionPath"]; _menuOpenConditio = compile _menuOpenConditio; - private _action = ["TpMenu", localize "STR_tunres_Respawn_TeleportMenu","\a3\3den\data\cfg3den\history\changeattributes_ca.paa",{ [_target] call FUNC(openTeleportMenu) }, _menuOpenConditio] call ace_interact_menu_fnc_createAction; + private _action = ["TpMenu", LSTRING(TeleportMenu),"\a3\3den\data\cfg3den\history\changeattributes_ca.paa",{ [_target] call FUNC(openTeleportMenu) }, _menuOpenConditio] call ace_interact_menu_fnc_createAction; [_obj, 0, _actionPath, _action] call ace_interact_menu_fnc_addActionToObject; }; } else { _statement = { params ["_obj", "_menuOpenConditio"]; - _obj addAction [localize "STR_tunres_Respawn_TeleportMenuVanilla", { [_this select 0] call FUNC(openTeleportMenu) }, [], 10, true, true, "", _menuOpenConditio, 10] + _obj addAction [LSTRING(TeleportMenuVanilla), { [_this select 0] call FUNC(openTeleportMenu) }, [], 10, true, true, "", _menuOpenConditio, 10] }; }; diff --git a/addons/respawn/functions/fnc_briefingNotes.sqf b/addons/respawn/functions/fnc_briefingNotes.sqf index 08f0b41..f7157f3 100644 --- a/addons/respawn/functions/fnc_briefingNotes.sqf +++ b/addons/respawn/functions/fnc_briefingNotes.sqf @@ -15,21 +15,21 @@ if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (IE zeus) -private _text = ""+ localize "STR_tunres_Respawn_Briefing_Header"+"
"; +private _text = ""+ LSTRING(Briefing_Header)+"
"; if (GVAR(briefingEnableShowRespawnType)) then { if ( GVAR(forcedRespawn) ) then { - _text = format ["%1
- %2",_text, localize "STR_tunres_Respawn_Briefing_onlyForcedWaves"]; + _text = format ["%1
- %2",_text, LSTRING(Briefing_onlyForcedWaves)]; }; switch (GVAR(respawnType)) do { case 0: { - _text = format ["
%1
- %2",_text, localize "STR_tunres_Respawn_Briefing_default"]; + _text = format ["
%1
- %2",_text, LSTRING(Briefing_default)]; }; case 1: { - _text = format ["
%1
- %2",_text, localize "STR_tunres_Respawn_Briefing_sidetickets"]; + _text = format ["
%1
- %2",_text, LSTRING(Briefing_sidetickets)]; }; case 2: { - _text = format ["
%1
- %2",_text, localize "STR_tunres_Respawn_Briefing_playertickets"]; + _text = format ["
%1
- %2",_text, LSTRING(Briefing_playertickets)]; }; default { }; }; @@ -39,19 +39,19 @@ if (GVAR(briefingEnableShowTime)) then { private _waveLenghtTimeHash = GVAR(waveLenghtTimesHash); _text = format ["%1

Wave interval",_text]; if (playerSide isEqualTo west || GVAR(briefingEnableShowOtherSidesDataWest)) then { - _text = format ["%1
- "+localize "STR_tunres_Respawn_Briefing_WaveTime_west",_text, _waveLenghtTimeHash get west]; + _text = format ["%1
- "+LSTRING(Briefing_WaveTime_west),_text, _waveLenghtTimeHash get west]; }; if (playerSide isEqualTo east || GVAR(briefingEnableShowOtherSidesDataEast)) then { - _text = format ["%1
- "+localize "STR_tunres_Respawn_Briefing_WaveTime_east",_text,_waveLenghtTimeHash get east]; + _text = format ["%1
- "+LSTRING(Briefing_WaveTime_east),_text,_waveLenghtTimeHash get east]; }; if (playerSide isEqualTo resistance || GVAR(briefingEnableShowOtherSidesDataResistance)) then { - _text = format ["%1
- "+localize "STR_tunres_Respawn_Briefing_WaveTime_resistance",_text, _waveLenghtTimeHash get resistance]; + _text = format ["%1
- "+LSTRING(Briefing_WaveTime_resistance),_text, _waveLenghtTimeHash get resistance]; }; if (playerSide isEqualTo civilian || GVAR(briefingEnableShowOtherSidesDataCivilian)) then { - _text = format ["%1
- "+localize "STR_tunres_Respawn_Briefing_WaveTime_civilian",_text, _waveLenghtTimeHash get civilian]; + _text = format ["%1
- "+LSTRING(Briefing_WaveTime_civilian),_text, _waveLenghtTimeHash get civilian]; }; private _delayedRespawn = GVAR(delayedRespawn); @@ -60,47 +60,47 @@ if (GVAR(briefingEnableShowTime)) then { _respawnTime = _respawnTime * 60; private _delayedTime = [(_respawnTime * (_delayedRespawn / 100)), "M:SS"] call CBA_fnc_formatElapsedTime; _respawnTime = [_respawnTime, "M:SS"] call CBA_fnc_formatElapsedTime; - _text = format ["%1

- " + localize "STR_tunres_Respawn_Briefing_DelayedRespawn",_text, _delayedTime, _delayedRespawn, _respawnTime, "%"]; + _text = format ["%1

- " + LSTRING(Briefing_DelayedRespawn),_text, _delayedTime, _delayedRespawn, _respawnTime, "%"]; } else { - _text = _text + "

- " + localize "STR_tunres_Respawn_Briefing_DelayedRespawnOff"; + _text = _text + "

- " + LSTRING(Briefing_DelayedRespawnOff); }; }; if (GVAR(briefingEnableShowTickets) && { GVAR(respawnType) isNotEqualTo 0}) then { - _text = format ["%1

"+ localize "STR_tunres_Respawn_Briefing_Category_Tickets" +"",_text]; + _text = format ["%1

"+ LSTRING(Briefing_Category_Tickets) +"",_text]; if (playerSide isEqualTo west || GVAR(briefingEnableShowOtherSidesDataWest)) then { - _text = format ["%1
- "+localize "STR_tunres_Respawn_Briefing_TicketCount_west",_text, GVAR(initialTicketsWest)]; + _text = format ["%1
- "+LSTRING(Briefing_TicketCount_west),_text, GVAR(initialTicketsWest)]; }; if (playerSide isEqualTo east || GVAR(briefingEnableShowOtherSidesDataEast)) then { - _text = format ["%1
- "+localize "STR_tunres_Respawn_Briefing_TicketCount_east",_text, GVAR(initialTicketsEast)]; + _text = format ["%1
- "+LSTRING(Briefing_TicketCount_east),_text, GVAR(initialTicketsEast)]; }; if (playerSide isEqualTo resistance || GVAR(briefingEnableShowOtherSidesDataResistance)) then { - _text = format ["%1
- "+localize "STR_tunres_Respawn_Briefing_TicketCount_resistance",_text, GVAR(initialTicketsResistance)]; + _text = format ["%1
- "+LSTRING(Briefing_TicketCount_resistance),_text, GVAR(initialTicketsResistance)]; }; if (playerSide isEqualTo civilian || GVAR(briefingEnableShowOtherSidesDataCivilian)) then { - _text = format ["%1
- "+localize "STR_tunres_Respawn_Briefing_TicketCount_civilian",_text, GVAR(initialTicketsCivilian)]; + _text = format ["%1
- "+LSTRING(Briefing_TicketCount_civilian),_text, GVAR(initialTicketsCivilian)]; }; if (GVAR(allowCheckTicketsBase)) then { - _text = format ["%1

- "+ localize "STR_tunres_Respawn_Briefing_CheckTicketsMainbase",_text]; + _text = format ["%1

- "+ LSTRING(Briefing_CheckTicketsMainbase),_text]; }; }; if (GVAR(killJIP)) then { - _text = format [("%1

- "+localize "STR_tunres_Respawn_Briefing_killJipEnabled"),_text, GVAR(killJipTime)]; + _text = format [("%1

- "+LSTRING(Briefing_killJipEnabled)),_text, GVAR(killJipTime)]; } else { - _text = format ["%1

- %2",_text, localize "STR_tunres_Respawn_Briefing_killJipDisabled"]; + _text = format ["%1

- %2",_text, LSTRING(Briefing_killJipDisabled)]; }; -_text = _text + "

" + localize "STR_tunres_Respawn_Briefing_teleportNetwork"; +_text = _text + "

" + LSTRING(Briefing_teleportNetwork); _text = format ["%1

Powered By TuntematonEngine v%2.%3.%4", _text, MAJOR, MINOR, PATCH]; if !(player diarySubjectExists QEGVAR(main,briefing)) then { - player createDiarySubject [QEGVAR(main,briefing),localize "STR_tunres_Respawn_Briefing_RespawnMainCategory"]; + player createDiarySubject [QEGVAR(main,briefing),LSTRING(Briefing_RespawnMainCategory)]; }; -player createDiaryRecord [QEGVAR(main,briefing),[localize "STR_tunres_Respawn_Briefing_RespawnInfoTab", _text]]; \ No newline at end of file +player createDiaryRecord [QEGVAR(main,briefing),[LSTRING(Briefing_RespawnInfoTab), _text]]; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_doRespawnWave.sqf b/addons/respawn/functions/fnc_doRespawnWave.sqf index 8962071..e565387 100644 --- a/addons/respawn/functions/fnc_doRespawnWave.sqf +++ b/addons/respawn/functions/fnc_doRespawnWave.sqf @@ -87,9 +87,9 @@ if (count _waitingRespawn > 0) then { if (AAR_IS_ENABLED) then { private _text = if (GVAR(respawnType) isEqualTo 1) then { - format[(localize "STR_tunres_Respawn_AAR_RespawnWaveTickets"), str _side, _waitingRespawnCount, _totalRespawnCount, [_side] call FUNC(getTicketCount)] + format[LELSTRING(main,AAR_RespawnWaveTickets), str _side, _waitingRespawnCount, _totalRespawnCount, [_side] call FUNC(getTicketCount)] } else { - format[(localize "STR_tunres_Respawn_AAR_RespawnWave"), str _side, _waitingRespawnCount, _totalRespawnCount] + format[LELSTRING(main,AAR_RespawnWave), str _side, _waitingRespawnCount, _totalRespawnCount] }; AAR_EVENT(_text,_msp,nil,nil); }; diff --git a/addons/respawn/functions/fnc_forceRespawnPlayer.sqf b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf index 62e27d9..f85579e 100644 --- a/addons/respawn/functions/fnc_forceRespawnPlayer.sqf +++ b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf @@ -18,7 +18,7 @@ if !(player getVariable [QGVAR(isWaitingRespawn),false]) exitWith { ERROR("Tried to force respawn unit, whichs is not at respawn"); }; -AAR_EVENT(localize "STR_tunres_Respawn_playerForceRespawned",player,nil,nil); +AAR_EVENT(LSTRING(playerForceRespawned),player,nil,nil); player setVariable [QGVAR(skipNextWave), false, true]; diff --git a/addons/respawn/functions/fnc_forceRespawnWave.sqf b/addons/respawn/functions/fnc_forceRespawnWave.sqf index 7aa8104..19a2738 100644 --- a/addons/respawn/functions/fnc_forceRespawnWave.sqf +++ b/addons/respawn/functions/fnc_forceRespawnWave.sqf @@ -19,7 +19,7 @@ if (!isServer) exitWith { }; params [["_side", nil, [east]], ["_reset", false, [false]]]; -private _text = format[(localize "STR_tunres_Respawn_sideForceRespawned"),str _side]; +private _text = format[(localize "STR_tunres_respawn_sideForceRespawned"),str _side]; AAR_EVENT(_text,nil,nil,nil); diff --git a/addons/respawn/functions/fnc_getTicketCount.sqf b/addons/respawn/functions/fnc_getTicketCount.sqf index f8dd280..dbd2913 100644 --- a/addons/respawn/functions/fnc_getTicketCount.sqf +++ b/addons/respawn/functions/fnc_getTicketCount.sqf @@ -42,7 +42,7 @@ switch (GVAR(respawnType)) do { }; if (_doHint && !isNull _player) then { - private _text = format["%1 %2",localize "STR_tunres_Respawn_RemainingTicketsText", str _ticketCount]; + private _text = format["%1 %2",LSTRING(RemainingTicketsText), str _ticketCount]; [QEGVAR(main,doNotification), [_text], _player] call CBA_fnc_targetEvent; }; diff --git a/addons/respawn/functions/fnc_getTicketCountClient.sqf b/addons/respawn/functions/fnc_getTicketCountClient.sqf index 350080f..0f019f8 100644 --- a/addons/respawn/functions/fnc_getTicketCountClient.sqf +++ b/addons/respawn/functions/fnc_getTicketCountClient.sqf @@ -29,7 +29,7 @@ private _ticketCount = switch (GVAR(respawnType)) do { }; if (_doHint && !isNull player) then { - private _text = format["%1 %2",localize "STR_tunres_Respawn_RemainingTicketsText", str _ticketCount]; + private _text = format["%1 %2",LSTRING(RemainingTicketsText), str _ticketCount]; [QEGVAR(main,doNotification), [_text]] call CBA_fnc_localEvent; }; diff --git a/addons/respawn/functions/fnc_moduleRespawnPoint.sqf b/addons/respawn/functions/fnc_moduleRespawnPoint.sqf index b7b2866..32d75ac 100644 --- a/addons/respawn/functions/fnc_moduleRespawnPoint.sqf +++ b/addons/respawn/functions/fnc_moduleRespawnPoint.sqf @@ -22,7 +22,7 @@ private _markername = _logic getVariable ["respawn_side","none"]; private _flagTexture = _logic getVariable ["flag_texture",""]; private _pos = getPosASL _logic; -if (_markername isEqualTo "none") exitWith { hint localize "STR_tunres_Respawn_Module_RespanPos_novalue"; false }; // Exit if no side +if (_markername isEqualTo "none") exitWith { hint LSTRING(Module_RespanPos_novalue); false }; // Exit if no side private _marker = ""; if (getMarkerColor _markername isEqualTo "") then { @@ -30,7 +30,7 @@ if (getMarkerColor _markername isEqualTo "") then { _marker setMarkerType "Empty"; } else { - hint format [(localize "STR_tunres_Respawn_Module_RespanPos_MultipleMarkers"), _markername]; + hint format [(LSTRING(Module_RespanPos_MultipleMarkers)), _markername]; }; private ["_side", "_color"]; @@ -78,8 +78,8 @@ publicVariable QGVAR(enabledSidesHash); GVAR(respawnPointsHash) set [_side, [_markername, _pos]]; publicVariable QGVAR(respawnPointsHash); -[QGVAR(RespawnPosLocal), _pos, localize "STR_tunres_Respawn_RespawnPoint", "respawn_inf", _color, 1, 100] remoteExecCall [QFUNC(createLocalMarker), _side, true]; -[QGVAR(MainBaseLocal), _pos, localize "STR_tunres_Respawn_MainBase", "mil_start", _color, 0, 100] remoteExecCall [QFUNC(createLocalMarker), _side, true]; +[QGVAR(RespawnPosLocal), _pos, LSTRING(RespawnPoint), "respawn_inf", _color, 1, 100] remoteExecCall [QFUNC(createLocalMarker), _side, true]; +[QGVAR(MainBaseLocal), _pos, LSTRING(MainBase), "mil_start", _color, 0, 100] remoteExecCall [QFUNC(createLocalMarker), _side, true]; [_flag] remoteExecCall [QFUNC(addActionsPlayer), _side, true]; diff --git a/addons/respawn/functions/fnc_moduleWaitingArea.sqf b/addons/respawn/functions/fnc_moduleWaitingArea.sqf index f57cf16..9c0c578 100644 --- a/addons/respawn/functions/fnc_moduleWaitingArea.sqf +++ b/addons/respawn/functions/fnc_moduleWaitingArea.sqf @@ -22,7 +22,7 @@ private _markername = _logic getVariable ["respawn_side","none"]; private _flagTexture = _logic getVariable ["flag_texture",""]; if (_markername isEqualTo "none") exitWith { // Exit if no side - private _errorText = localize "STR_tunres_Respawn_Module_WaitingArea_novalue"; + private _errorText = LSTRING(Module_WaitingArea_novalue); ERROR_MSG(_errorText); false }; @@ -31,7 +31,7 @@ if (getMarkerColor _markername isEqualTo "") then { _marker = [_markername, getPosASL _logic, "icon", [1, 1], "PERSIST", "TYPE:", "Empty"] call CBA_fnc_createMarker; _marker setMarkerAlpha 0; } else { - private _errorText = format [(localize "STR_tunres_Respawn_Module_WaitingArea_MultipleMarkers"), _markername]; + private _errorText = format [(LSTRING(Module_WaitingArea_MultipleMarkers)), _markername]; ERROR_MSG(_errorText); }; diff --git a/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf b/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf index 1bedeea..c38a84a 100644 --- a/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf +++ b/addons/respawn/functions/fnc_remainingWaitTimeNotification.sqf @@ -16,5 +16,5 @@ private _hash = GVAR(nextWaveTimesHash); private _waitTime = (_hash get playerSide) - cba_missiontime; -private _text = format [localize "STR_tunres_MSP_remaining_time", [_waitTime] call CBA_fnc_formatElapsedTime]; +private _text = format [LLSTRING(remainingTimeNotification), [_waitTime] call CBA_fnc_formatElapsedTime]; [QEGVAR(main,doNotification), [_text]] call CBA_fnc_localEvent; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_respawnUnit.sqf b/addons/respawn/functions/fnc_respawnUnit.sqf index 7459a4b..f5f76f8 100644 --- a/addons/respawn/functions/fnc_respawnUnit.sqf +++ b/addons/respawn/functions/fnc_respawnUnit.sqf @@ -22,7 +22,7 @@ private _respawnPosition = getMarkerPos ((_respawnPointsHash get _side) select 0 _unit setVariable [QGVAR(isWaitingRespawn), false, true]; player setVariable [QGVAR(skipNextWave), nil]; -private _text = localize "STR_tunres_Respawn_FNC_moveRespawnText"; +private _text = LSTRING(FNC_moveRespawnText); [_unit, _respawnPosition, _text, 20, true] call FUNC(teleportUnit); diff --git a/addons/respawn/functions/fnc_teleportButton.sqf b/addons/respawn/functions/fnc_teleportButton.sqf index fd4e96b..5d2098e 100644 --- a/addons/respawn/functions/fnc_teleportButton.sqf +++ b/addons/respawn/functions/fnc_teleportButton.sqf @@ -29,12 +29,12 @@ private _teleportConditio = call compile (_teleportConditioText); private _teleportName = _obj getVariable [QGVAR(teleportName), "TP"]; private _destination = getPosASL _obj; -private _text = format["%1 %2", localize "STR_tunres_Respawn_Teleporting", _teleportName]; +private _text = format["%1 %2", LSTRING(Teleporting), _teleportName]; if (_teleportConditio) then { closeDialog 2; GVAR(tpMenuOpenedFrom) = objNull; [player, _destination, _text, 10, true, 15] call FUNC(teleportUnit); } else { - [QEGVAR(main,doNotification), [localize "STR_tunres_Respawn_Teleport_Disabled"]] call CBA_fnc_localEvent; + [QEGVAR(main,doNotification), [LSTRING(Teleport_Disabled)]] call CBA_fnc_localEvent; }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index d2d019f..39e7e8b 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -53,7 +53,7 @@ GVAR(waitingAreaPFH) = [{ if (_playerSkipsWave) then { private _hashWaveLenght = GVAR(waveLenghtTimesHash); private _waveLenght = _hashWaveLenght get _playerSide; - _remainingWaitTime = _remainingWaitTime + (_waveLenght*60); + _remainingWaitTime = _remainingWaitTime + _waveLenght; }; if ((GVAR(mark) < 1 && _remainingWaitTime <= 20) || (GVAR(mark) < 2 && _remainingWaitTime <= 10) )then { @@ -66,25 +66,25 @@ GVAR(waitingAreaPFH) = [{ }; private _allowRespawn = GVAR(allowRespawnHash) get _playerSide; - private _text = format ["%1", localize "STR_tunres_Respawn_FNC_only_forced_waves"]; + private _text = format ["%1", LSTRING(FNC_only_forced_waves)]; if (_remainingWaitTime >= 0 && { _allowRespawn }) then { - _text = format ["%2
%1
", ([_remainingWaitTime] call CBA_fnc_formatElapsedTime), localize "STR_tunres_Respawn_FNC_remaining_time"]; + _text = format ["%2
%1
", ([_remainingWaitTime] call CBA_fnc_formatElapsedTime), LSTRING(FNC_remaining_time)]; } else { if (player getVariable [QGVAR(isWaitingRespawn), true] && { !(GVAR(forcedRespawn)) } && { !_allowRespawn }) then { - _text = format ["%1", localize "STR_tunres_Respawn_FNC_RespawnDisabled"]; + _text = format ["%1", LSTRING(FNC_RespawnDisabled)]; } else { _text = format ["Something is vevy vevy wrong. time: %1 - allowRespawn: %2 - forced respawn: %3 ", _remainingWaitTime, _allowRespawn, GVAR(forcedRespawn)]; }; }; if (_playerSkipsWave) then { - _text = format["%1
%2", _text, localize "STR_tunres_Respawn_FNC_playerSkipsWave"]; + _text = format["%1
%2", _text, LSTRING(FNC_playerSkipsWave)]; }; if (_respawnType in [1,2]) then { private _tickets = [false] call FUNC(getTicketCountClient); DEC(_respawnType); // so it works on select - private _ticketsTypeText = localize (["STR_tunres_Respawan_RemainingTicketsSide", "STR_tunres_Respawan_RemainingTicketsPlayer"] select _respawnType); + private _ticketsTypeText = localize ([LSTRING(RemainingTicketsSide), LSTRING(RemainingTicketsPlayer)] select _respawnType); _text = format["%1
%2 %3", _text, _ticketsTypeText, _tickets]; }; @@ -93,6 +93,6 @@ GVAR(waitingAreaPFH) = [{ //make sure that player is still in area if !(player inArea [_respawnWaitingarea, _waitingRange, _waitingRange, 0, false]) then { player setPosASL ([_respawnWaitingarea, (_waitingRange / 2)] call CBA_fnc_randPos); - [QEGVAR(main,doNotification), [localize "STR_tunres_Respawn_youAreNotAllowedToLeave"]] call CBA_fnc_localEvent; + [QEGVAR(main,doNotification), [LSTRING(youAreNotAllowedToLeave)]] call CBA_fnc_localEvent; }; }, 1, [_respawnWaitingarea, _playerSide, _waitingRange,_respawnType]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/respawn/initSettings.inc.sqf b/addons/respawn/initSettings.inc.sqf index 36254db..d96dce4 100644 --- a/addons/respawn/initSettings.inc.sqf +++ b/addons/respawn/initSettings.inc.sqf @@ -1,8 +1,8 @@ [ QGVAR(enable), // Unique setting name. Matches resulting variable name "CHECKBOX", // Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" - [localize "STR_tunres_Respawn_CBA_Enable", localize "STR_tunres_Respawn_CBA_tooltip_Enable"], // Display name or display name + tooltip (optional, default: same as setting name) - localize "STR_tunres_Respawn_CBA_Category_main", // Category for the settings menu + optional sub-category + [LSTRING(CBA_Enable), LSTRING(CBA_tooltip_Enable)], // Display name or display name + tooltip (optional, default: same as setting name) + LSTRING(CBA_Category_main), // Category for the settings menu + optional sub-category false, // Extra properties of the setting depending of _settingType. 1, // 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) {}, // Script to execute when setting is changed. (optional) @@ -12,8 +12,8 @@ [ QGVAR(killJIP), "CHECKBOX", - ["Kill JIP", localize "STR_tunres_Respawn_CBA_tooltip_killjip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], + ["Kill JIP", LSTRING(CBA_tooltip_killjip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_generic)], true, 1, {}, @@ -22,9 +22,9 @@ [ QGVAR(killJipTime), - "SLIDER", - ["Kill JIP Time", localize "STR_tunres_Respawn_CBA_tooltip_killJipTime"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], + "TIME", + ["Kill JIP Time", LSTRING(CBA_tooltip_killJipTime)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_generic)], [1, 300, 20, 0], 1, { @@ -38,9 +38,9 @@ [ QGVAR(respawnType), "LIST", - ["Respawn Type", localize "STR_tunres_Respawn_CBA_tooltip_respawntypes"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], - [[0, 1, 2], [localize "STR_tunres_Respawn_Type_Default", localize "STR_tunres_Respawn_Type_Sidetickets", localize "STR_tunres_Respawn_Type_Playertickets"], 0], + ["Respawn Type", LSTRING(CBA_tooltip_respawntypes)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_generic)], + [[0, 1, 2], [LSTRING(Type_Default), LSTRING(Type_Sidetickets), LSTRING(Type_Playertickets)], 0], 1, {}, true @@ -49,8 +49,8 @@ [ QGVAR(gearscriptType), "LIST", - ["Gearscript type", localize "STR_tunres_Respawn_CBA_tooltip_gearscript"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], + ["Gearscript type", LSTRING(CBA_tooltip_gearscript)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_generic)], [[0, 1, 2, 3], ["SQF Gearscript", "Potato Tool", "Save gear", "None"], 2], 1, {}, @@ -60,8 +60,8 @@ [ QGVAR(forcedRespawn), "CHECKBOX", - ["Only Forced Waves", localize "STR_tunres_Respawn_CBA_tooltip_forceRespawn"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], + ["Only Forced Waves", LSTRING(CBA_tooltip_forceRespawn)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_generic)], false, 1, {}, @@ -70,9 +70,9 @@ [ QGVAR(delayedRespawn), - "SLIDER", - ["Delayed respawn", localize "STR_tunres_Respawn_CBA_tooltip_delayedRespawn"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], + "TIME", + ["Delayed respawn", LSTRING(CBA_tooltip_delayedRespawn)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_generic)], [0, 100, 0, 0], 1, { @@ -86,8 +86,8 @@ [ QGVAR(waitingAreaRange), "SLIDER", - ["Waiting Area Range", localize "STR_tunres_Respawn_CBA_tooltip_waitingAreaRange"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_generic"], + ["Waiting Area Range", LSTRING(CBA_tooltip_waitingAreaRange)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_generic)], [30, 300, 100, 0], 1, { @@ -101,10 +101,10 @@ //Wave times [ QGVAR(initialWaveTimeWest), - "SLIDER", - ["West", localize "STR_tunres_Respawn_CBA_tooltip_time"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], - [1, 60, 15, 0], + "TIME", + ["West", LSTRING(CBA_tooltip_time)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_time)], + [10, 60*60, 15*60, 0], 1, { params ["_value"]; @@ -117,10 +117,10 @@ [ QGVAR(initialWaveTimeEast), - "SLIDER", - ["East", localize "STR_tunres_Respawn_CBA_tooltip_time"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], - [1, 60, 15, 0], + "TIME", + ["East", LSTRING(CBA_tooltip_time)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_time)], + [10, 60*60, 15*60, 0], 1, { params ["_value"]; @@ -133,10 +133,10 @@ [ QGVAR(initialWaveTimeResistance), - "SLIDER", - ["Resistance", localize "STR_tunres_Respawn_CBA_tooltip_time"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], - [1, 60, 15, 0], + "TIME", + ["Resistance", LSTRING(CBA_tooltip_time)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_time)], + [10, 60*60, 15*60, 0], 1, { params ["_value"]; @@ -149,10 +149,10 @@ [ QGVAR(initialWaveTimeCivilian), - "SLIDER", - ["Civilian", localize "STR_tunres_Respawn_CBA_tooltip_time"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_time"], - [1, 60, 15, 0], + "TIME", + ["Civilian", LSTRING(CBA_tooltip_time)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_time)], + [10, 60*60, 15*60, 0], 1, { params ["_value"]; @@ -167,8 +167,8 @@ [ QGVAR(spectateCameramode1st), "CHECKBOX", - ["1st", localize "STR_tunres_Respawn_CBA_tooltip_specta_modes"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], + ["1st", LSTRING(CBA_tooltip_specta_modes)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_spectate_cameramode)], true, 1, { @@ -183,8 +183,8 @@ [ QGVAR(spectateCameramode3th), "CHECKBOX", - ["3th", localize "STR_tunres_Respawn_CBA_tooltip_specta_modes"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], + ["3th", LSTRING(CBA_tooltip_specta_modes)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_spectate_cameramode)], true, 1, { @@ -199,8 +199,8 @@ [ QGVAR(spectateCameramodeFree), "CHECKBOX", - ["Free", localize "STR_tunres_Respawn_CBA_tooltip_specta_modes"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_cameramode"], + ["Free", LSTRING(CBA_tooltip_specta_modes)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_spectate_cameramode)], true, 1, { @@ -216,8 +216,8 @@ [ QGVAR(allowWestSpectateEast), "CHECKBOX", - ["East", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesWest"], + ["East", LSTRING(CBA_Category_spectate_sidesTooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_spectate_sidesWest)], true, 1, { @@ -234,8 +234,8 @@ [ QGVAR(allowWestSpectateResistance), "CHECKBOX", - ["Resistance", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesWest"], + ["Resistance", LSTRING(CBA_Category_spectate_sidesTooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_spectate_sidesWest)], true, 1, { @@ -252,8 +252,8 @@ [ QGVAR(allowWestSpectateCivilian), "CHECKBOX", - ["Civilian", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesWest"], + ["Civilian", LSTRING(CBA_Category_spectate_sidesTooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_spectate_sidesWest)], true, 1, { @@ -271,8 +271,8 @@ [ QGVAR(allowEastSpectateWest), "CHECKBOX", - ["West", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesEast"], + ["West", LSTRING(CBA_Category_spectate_sidesTooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_spectate_sidesEast)], true, 1, { @@ -289,8 +289,8 @@ [ QGVAR(allowEastSpectateResistance), "CHECKBOX", - ["Resistance", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesEast"], + ["Resistance", LSTRING(CBA_Category_spectate_sidesTooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_spectate_sidesEast)], true, 1, { @@ -307,8 +307,8 @@ [ QGVAR(allowEastSpectateCivilian), "CHECKBOX", - ["Civilian", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesEast"], + ["Civilian", LSTRING(CBA_Category_spectate_sidesTooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_spectate_sidesEast)], true, 1, { @@ -326,8 +326,8 @@ [ QGVAR(allowResistanceSpectateWest), "CHECKBOX", - ["West", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesResistance"], + ["West", LSTRING(CBA_Category_spectate_sidesTooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_spectate_sidesResistance)], true, 1, { @@ -344,8 +344,8 @@ [ QGVAR(allowResistanceSpectateEast), "CHECKBOX", - ["East", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesResistance"], + ["East", LSTRING(CBA_Category_spectate_sidesTooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_spectate_sidesResistance)], true, 1, { @@ -363,8 +363,8 @@ [ QGVAR(allowResistanceSpectateCivilian), "CHECKBOX", - ["Civilian", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesResistance"], + ["Civilian", LSTRING(CBA_Category_spectate_sidesTooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_spectate_sidesResistance)], true, 1, { @@ -382,8 +382,8 @@ [ QGVAR(allowCivilianSpectateWest), "CHECKBOX", - ["West", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesCivilian"], + ["West", LSTRING(CBA_Category_spectate_sidesTooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_spectate_sidesCivilian)], true, 1, { @@ -400,8 +400,8 @@ [ QGVAR(allowCivilianSpectateEast), "CHECKBOX", - ["East", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesCivilian"], + ["East", LSTRING(CBA_Category_spectate_sidesTooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_spectate_sidesCivilian)], true, 1, { @@ -419,8 +419,8 @@ [ QGVAR(allowCivilianSpectateResistance), "CHECKBOX", - ["Resistance", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesTooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_spectate_sidesCivilian"], + ["Resistance", LSTRING(CBA_Category_spectate_sidesTooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_spectate_sidesCivilian)], true, 1, { @@ -438,8 +438,8 @@ [ QGVAR(initialTicketsWest), "SLIDER", - ["West", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], + ["West", LSTRING(CBA_tooltip_ticket)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_ticketcount)], [0, 1000, 0, 0], 1, { @@ -454,8 +454,8 @@ [ QGVAR(initialTicketsEast), "SLIDER", - ["East", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], + ["East", LSTRING(CBA_tooltip_ticket)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_ticketcount)], [0, 1000, 0, 0], 1, { @@ -470,8 +470,8 @@ [ QGVAR(initialTicketsResistance), "SLIDER", - ["Resistance", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], + ["Resistance", LSTRING(CBA_tooltip_ticket)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_ticketcount)], [0, 1000, 0, 0], 1, { @@ -486,8 +486,8 @@ [ QGVAR(initialTicketsCivilian), "SLIDER", - ["Civilian", localize "STR_tunres_Respawn_CBA_tooltip_ticket"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_ticketcount"], + ["Civilian", LSTRING(CBA_tooltip_ticket)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_ticketcount)], [0, 1000, 0, 0], 1, { @@ -502,8 +502,8 @@ [ QGVAR(allowCheckTicketsBase), "CHECKBOX", - ["Main base", localize "STR_tunres_Respawn_CBA_tooltip_CheckTickets"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_checkTickets"], + ["Main base", LSTRING(CBA_tooltip_CheckTickets)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_checkTickets)], true, 1, {}, @@ -514,8 +514,8 @@ [ QGVAR(briefingEnable), "CHECKBOX", - [localize "STR_tunres_Respawn_CBA_Briefing_Enable", localize "STR_tunres_Respawn_CBA_Briefing_Enable_tooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], + [LSTRING(CBA_Briefing_Enable), LSTRING(CBA_Briefing_Enable_tooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_Briefing)], true, 1, {}, @@ -525,8 +525,8 @@ [ QGVAR(briefingEnableShowRespawnType), "CHECKBOX", - [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowRespawType", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowRespawType_tooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], + [LSTRING(CBA_Briefing_Enable_ShowRespawType), LSTRING(CBA_Briefing_Enable_ShowRespawType_tooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_Briefing)], true, 1, {}, @@ -536,8 +536,8 @@ [ QGVAR(briefingEnableShowTickets), "CHECKBOX", - [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTickets", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTickets_tooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], + [LSTRING(CBA_Briefing_Enable_ShowTickets), LSTRING(CBA_Briefing_Enable_ShowTickets_tooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_Briefing)], true, 1, {}, @@ -547,8 +547,8 @@ [ QGVAR(briefingEnableShowTime), "CHECKBOX", - [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTime", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowTime_tooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], + [LSTRING(CBA_Briefing_Enable_ShowTime), LSTRING(CBA_Briefing_Enable_ShowTime_tooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_Briefing)], true, 1, {}, @@ -558,8 +558,8 @@ [ QGVAR(briefingEnableShowOtherSidesDataWest), "CHECKBOX", - [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_West", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], + [LSTRING(CBA_Briefing_Enable_ShowOtherSidesData_West), LSTRING(CBA_Briefing_Enable_ShowOtherSidesData_tooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_Briefing)], true, 1, {}, @@ -569,8 +569,8 @@ [ QGVAR(briefingEnableShowOtherSidesDataEast), "CHECKBOX", - [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_East", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], + [LSTRING(CBA_Briefing_Enable_ShowOtherSidesData_East), LSTRING(CBA_Briefing_Enable_ShowOtherSidesData_tooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_Briefing)], true, 1, {}, @@ -580,8 +580,8 @@ [ QGVAR(briefingEnableShowOtherSidesDataResistance), "CHECKBOX", - [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_Resistance", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], + [LSTRING(CBA_Briefing_Enable_ShowOtherSidesData_Resistance), LSTRING(CBA_Briefing_Enable_ShowOtherSidesData_tooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_Briefing)], true, 1, {}, @@ -591,8 +591,8 @@ [ QGVAR(briefingEnableShowOtherSidesDataCivilian), "CHECKBOX", - [localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_Civilian", localize "STR_tunres_Respawn_CBA_Briefing_Enable_ShowOtherSidesData_tooltip"], - [localize "STR_tunres_Respawn_CBA_Category_main", localize "STR_tunres_Respawn_CBA_Category_Briefing"], + [LSTRING(CBA_Briefing_Enable_ShowOtherSidesData_Civilian), LSTRING(CBA_Briefing_Enable_ShowOtherSidesData_tooltip)], + [LSTRING(CBA_Category_main), LSTRING(CBA_Category_Briefing)], false, 1, {}, From 9246cfa866210ec1644836f6a908513d153f156d Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 18 Sep 2024 23:17:15 +0300 Subject: [PATCH 181/228] Cleaning --- .../msp/functions/fnc_createContestZoneMarkers.sqf | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/addons/msp/functions/fnc_createContestZoneMarkers.sqf b/addons/msp/functions/fnc_createContestZoneMarkers.sqf index 4a6fd93..197304f 100644 --- a/addons/msp/functions/fnc_createContestZoneMarkers.sqf +++ b/addons/msp/functions/fnc_createContestZoneMarkers.sqf @@ -27,19 +27,6 @@ private _posMax = _pos getPos [_contestedRadiusMax, 100]; private _posMin = _pos getPos [_contestedRadiusMin, 90]; private _posReport = _pos getPos [_reportEnemiesRange, 80]; - -// * 0: Marker name -// * 1: Position -// * 2: Marker text -// * 3: Icon/brush https://community.bistudio.com/wiki/setMarkerBrushLocal https://community.bistudio.com/wiki/setMarkerTypeLocal -// * 4: Color -// * 5: Alpha -// * 6: Priority -// * 7: Shape (Default: "ICON") "ICON", "RECTANGLE", "ELLIPSE", "POLYLINE" -// * 8: Size [a-axis, b-axis] -// * 9: Direction - - [QGVAR(contestMarkerMapMax), _pos, nil, "Solid", "ColorOrange", 0.75, -2, "ELLIPSE", [_contestedRadiusMax, _contestedRadiusMax]] call EFUNC(respawn,createLocalMarker); [QGVAR(contestMarkerMapMaxText), _posMax, format["Max Contest range (%1m)",_contestedRadiusMax], "hd_warning", "ColorOrange", 1, 110] call EFUNC(respawn,createLocalMarker); From 5479d522c9cdecc8f729c329176320f8b4ef1566 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 18 Sep 2024 23:17:44 +0300 Subject: [PATCH 182/228] update cba settings to use Time instead slider --- addons/msp/initSettings.inc.sqf | 20 +++++++++---------- .../respawn/functions/fnc_briefingNotes.sqf | 1 - .../respawn/functions/fnc_delayedRespawn.sqf | 2 +- addons/respawn/functions/fnc_timer.sqf | 2 +- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/addons/msp/initSettings.inc.sqf b/addons/msp/initSettings.inc.sqf index 8c1a9d6..5d12acc 100644 --- a/addons/msp/initSettings.inc.sqf +++ b/addons/msp/initSettings.inc.sqf @@ -86,7 +86,7 @@ [ QGVAR(reportEnemiesIntervalWest), - "SLIDER", + "TIME", [(LLSTRING(CBA_reportEnemiesIntervala)) + " West", LLSTRING(CBA_tooltip_reportEnemiesInterval)], [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedWest)], [1, 600, 60, 0], @@ -104,7 +104,7 @@ [ QGVAR(reportEnemiesIntervalEast), - "SLIDER", + "TIME", [(LLSTRING(CBA_reportEnemiesIntervala)) + " East", LLSTRING(CBA_tooltip_reportEnemiesInterval)], [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedEast)], [1, 600, 60, 0], @@ -122,7 +122,7 @@ [ QGVAR(reportEnemiesIntervalResistance), - "SLIDER", + "TIME", [(LLSTRING(CBA_reportEnemiesIntervala)) + " Resistance", LLSTRING(CBA_tooltip_reportEnemiesInterval)], [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedResistance)], [1, 600, 60, 0], @@ -140,7 +140,7 @@ [ QGVAR(reportEnemiesIntervalCivilian), - "SLIDER", + "TIME", [(LLSTRING(CBA_reportEnemiesIntervala)) + " Civilian", LLSTRING(CBA_tooltip_reportEnemiesInterval)], [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedCivilian)], [1, 600, 60, 0], @@ -375,7 +375,7 @@ [ QGVAR(contestedCheckIntervalWest), - "SLIDER", + "TIME", [(LLSTRING(CBA_contestedCheckInterval)) + " West", LLSTRING(CBA_tooltip_contestedCheckInterval)], [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedWest)], [1, 600, 20, 0], @@ -393,7 +393,7 @@ [ QGVAR(contestedCheckIntervalEast), - "SLIDER", + "TIME", [(LLSTRING(CBA_contestedCheckInterval)) + " East", LLSTRING(CBA_tooltip_contestedCheckInterval)], [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedEast)], [1, 600, 20, 0], @@ -411,7 +411,7 @@ [ QGVAR(contestedCheckIntervalResistance), - "SLIDER", + "TIME", [(LLSTRING(CBA_contestedCheckInterval)) + " Resistance", LLSTRING(CBA_tooltip_contestedCheckInterval)], [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedResistance)], [1, 600, 20, 0], @@ -429,7 +429,7 @@ [ QGVAR(contestedCheckIntervalCivilian), - "SLIDER", + "TIME", [(LLSTRING(CBA_contestedCheckInterval)) + " Civilian", LLSTRING(CBA_tooltip_contestedCheckInterval)], [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_contestedCivilian)], [1, 600, 20, 0], @@ -447,7 +447,7 @@ [ QGVAR(progresbarTimeSetup), - "SLIDER", + "TIME", [LLSTRING(CBA_setup_progresbar), LLSTRING(CBA_tooltip_setup_ProgressBar)], [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_progres)], [0, 60, 5, 0], @@ -461,7 +461,7 @@ [ QGVAR(progresbarTimePack), - "SLIDER", + "TIME", [LLSTRING(CBA_pack_progresbar), LLSTRING(CBA_tooltip_pack_progresbar)], [LLSTRING(CBA_Category_main), LLSTRING(CBA_Category_progres)], [0, 60, 5, 0], diff --git a/addons/respawn/functions/fnc_briefingNotes.sqf b/addons/respawn/functions/fnc_briefingNotes.sqf index f7157f3..d8224f1 100644 --- a/addons/respawn/functions/fnc_briefingNotes.sqf +++ b/addons/respawn/functions/fnc_briefingNotes.sqf @@ -57,7 +57,6 @@ if (GVAR(briefingEnableShowTime)) then { private _delayedRespawn = GVAR(delayedRespawn); if (_delayedRespawn > 0) then { private _respawnTime = _waveLenghtTimeHash get playerSide; - _respawnTime = _respawnTime * 60; private _delayedTime = [(_respawnTime * (_delayedRespawn / 100)), "M:SS"] call CBA_fnc_formatElapsedTime; _respawnTime = [_respawnTime, "M:SS"] call CBA_fnc_formatElapsedTime; _text = format ["%1

- " + LSTRING(Briefing_DelayedRespawn),_text, _delayedTime, _delayedRespawn, _respawnTime, "%"]; diff --git a/addons/respawn/functions/fnc_delayedRespawn.sqf b/addons/respawn/functions/fnc_delayedRespawn.sqf index 1469042..ea86b59 100644 --- a/addons/respawn/functions/fnc_delayedRespawn.sqf +++ b/addons/respawn/functions/fnc_delayedRespawn.sqf @@ -21,7 +21,7 @@ if (GVAR(delayedRespawn) > 0) then { private _hashWaveLenght = GVAR(waveLenghtTimesHash); private _time = _hashWaitTime get _side; private _waveLenghtTime = _hashWaveLenght get _side; - _skip = ((_time - cba_missiontime) < ((_waveLenghtTime * 60) * (GVAR(delayedRespawn) / 100))); + _skip = ((_time - cba_missiontime) < (_waveLenghtTime * (GVAR(delayedRespawn) / 100))); }; _unit setVariable [QGVAR(skipNextWave), _skip, true]; diff --git a/addons/respawn/functions/fnc_timer.sqf b/addons/respawn/functions/fnc_timer.sqf index c2c548e..0d5e066 100644 --- a/addons/respawn/functions/fnc_timer.sqf +++ b/addons/respawn/functions/fnc_timer.sqf @@ -21,7 +21,7 @@ if (GVAR(forcedRespawn)) exitWith { INFO("No timer, Only forced waves"); }; private _hashWaitTime = GVAR(nextWaveTimesHash); private _hashWaveLenght = GVAR(waveLenghtTimesHash); -private _time = round ((_hashWaitTime get _side) + (_hashWaveLenght get _side) * 60); +private _time = round ((_hashWaitTime get _side) + (_hashWaveLenght get _side)); _hashWaitTime set [_side, _time]; publicVariable QGVAR(nextWaveTimesHash); From 17527c342c8c7b11f6dae3a86d9af0553e4bc426 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 18 Sep 2024 23:21:41 +0300 Subject: [PATCH 183/228] fix macro --- addons/respawn/functions/fnc_moduleRespawnPoint.sqf | 3 ++- addons/respawn/functions/fnc_moduleWaitingArea.sqf | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/respawn/functions/fnc_moduleRespawnPoint.sqf b/addons/respawn/functions/fnc_moduleRespawnPoint.sqf index 32d75ac..b5c3788 100644 --- a/addons/respawn/functions/fnc_moduleRespawnPoint.sqf +++ b/addons/respawn/functions/fnc_moduleRespawnPoint.sqf @@ -30,7 +30,8 @@ if (getMarkerColor _markername isEqualTo "") then { _marker setMarkerType "Empty"; } else { - hint format [(LSTRING(Module_RespanPos_MultipleMarkers)), _markername]; + private _errorText = LSTRING(Module_RespanPos_MultipleMarkers); + hint format [_errorText, _markername]; }; private ["_side", "_color"]; diff --git a/addons/respawn/functions/fnc_moduleWaitingArea.sqf b/addons/respawn/functions/fnc_moduleWaitingArea.sqf index 9c0c578..f79d3cb 100644 --- a/addons/respawn/functions/fnc_moduleWaitingArea.sqf +++ b/addons/respawn/functions/fnc_moduleWaitingArea.sqf @@ -31,7 +31,8 @@ if (getMarkerColor _markername isEqualTo "") then { _marker = [_markername, getPosASL _logic, "icon", [1, 1], "PERSIST", "TYPE:", "Empty"] call CBA_fnc_createMarker; _marker setMarkerAlpha 0; } else { - private _errorText = format [(LSTRING(Module_WaitingArea_MultipleMarkers)), _markername]; + private _errorText = LSTRING(Module_WaitingArea_MultipleMarkers); + _errorText = format [_errorText, _markername]; ERROR_MSG(_errorText); }; From a5140b9471ff4e3e524a6cfe85e48562b56f0288 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 22 Sep 2024 16:25:14 +0300 Subject: [PATCH 184/228] fix conflicting variables --- addons/respawn/CfgVehicles.hpp | 12 ++++++------ addons/respawn/functions/fnc_moduleRespawnPoint.sqf | 4 ++-- addons/respawn/functions/fnc_moduleWaitingArea.sqf | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/addons/respawn/CfgVehicles.hpp b/addons/respawn/CfgVehicles.hpp index 5ea130c..c775ccc 100644 --- a/addons/respawn/CfgVehicles.hpp +++ b/addons/respawn/CfgVehicles.hpp @@ -44,7 +44,7 @@ class CfgVehicles // Module attributes, uses https://community.bistudio.com/wiki/Eden_Editor:_Configuring_Attributes#Entity_Specific class Attributes: AttributesBase { - class respawn_side: Combo + class GVAR(respawnSide): Combo { property = QGVAR(module_side); displayName = "Side"; // Argument label @@ -60,9 +60,9 @@ class CfgVehicles class civilian {name = "civilian"; value = "respawn_civilian";}; }; }; - class flag_texture: Edit + class GVAR(flagTexture): Edit { - property = QGVAR(flag_texture); + property = QGVAR(moduleFlagTexture); displayName = "Flag texture"; tooltip = CSTRING(Module_tooltip_flagTexture); typeName = "STRING"; @@ -88,7 +88,7 @@ class CfgVehicles class Attributes: AttributesBase { - class respawn_side: Combo + class GVAR(respawnSide): Combo { property = QGVAR(module_side); displayName = "Side"; // Argument label @@ -104,9 +104,9 @@ class CfgVehicles class civilian {name = "civilian"; value = MARKER_NAME_CONFIG(civilian);}; }; }; - class flag_texture: Edit + class GVAR(flagTexture): Edit { - property = QGVAR(flag_texture); + property = QGVAR(moduleFlagTexture); displayName = "Flag texture"; tooltip = CSTRING(Module_tooltip_flagTexture); typeName = "STRING"; diff --git a/addons/respawn/functions/fnc_moduleRespawnPoint.sqf b/addons/respawn/functions/fnc_moduleRespawnPoint.sqf index b5c3788..a03b45a 100644 --- a/addons/respawn/functions/fnc_moduleRespawnPoint.sqf +++ b/addons/respawn/functions/fnc_moduleRespawnPoint.sqf @@ -18,8 +18,8 @@ if (!isServer) exitWith { }; private _logic = param [0,objNull,[objNull]]; -private _markername = _logic getVariable ["respawn_side","none"]; -private _flagTexture = _logic getVariable ["flag_texture",""]; +private _markername = _logic getVariable [QGVAR(respawnSide),"none"]; +private _flagTexture = _logic getVariable [QGVAR(flagTexture),""]; private _pos = getPosASL _logic; if (_markername isEqualTo "none") exitWith { hint LSTRING(Module_RespanPos_novalue); false }; // Exit if no side diff --git a/addons/respawn/functions/fnc_moduleWaitingArea.sqf b/addons/respawn/functions/fnc_moduleWaitingArea.sqf index f79d3cb..68c3c04 100644 --- a/addons/respawn/functions/fnc_moduleWaitingArea.sqf +++ b/addons/respawn/functions/fnc_moduleWaitingArea.sqf @@ -18,8 +18,8 @@ if (!isServer) exitWith { }; private _logic = param [0,objNull,[objNull]]; -private _markername = _logic getVariable ["respawn_side","none"]; -private _flagTexture = _logic getVariable ["flag_texture",""]; +private _markername = _logic getVariable [QGVAR(respawnSide),"none"]; +private _flagTexture = _logic getVariable [QGVAR(flagTexture),""]; if (_markername isEqualTo "none") exitWith { // Exit if no side private _errorText = LSTRING(Module_WaitingArea_novalue); From 2ff9eed2f05e4ea26e3cfc3061af01bfe2f30107 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 22 Sep 2024 16:28:57 +0300 Subject: [PATCH 185/228] macro --- addons/main/script_macros.hpp | 2 ++ addons/main/script_mod.hpp | 2 +- addons/main/script_version.hpp | 2 +- addons/msp/config.cpp | 2 +- addons/respawn/config.cpp | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index bb34bd1..77fca72 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -8,6 +8,8 @@ #define PREP(fncName) [QPATHTOF(functions\DOUBLES(fnc,fncName).sqf), QFUNC(fncName)] call CBA_fnc_compileFunction #endif +#define MAIN_ADDON_STR QUOTE(MAIN_ADDON) + // #define MARKER_NAME_CONFIG(var1) QUOTE(DOUBLES(ADDON,var1)) diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index f1b0afd..b43b63f 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -6,7 +6,7 @@ #define VERSION MAJOR.MINOR #define VERSION_AR MAJOR,MINOR,PATCH,BUILD -#define REQUIRED_VERSION 2.14 +#define REQUIRED_VERSION 2.16 #ifdef COMPONENT_BEAUTIFIED #define COMPONENT_NAME QUOTE(tunres - COMPONENT_BEAUTIFIED) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index c493ffd..c9e2340 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 1 #define MINOR 8 #define PATCH 0 -#define BUILD 3 \ No newline at end of file +#define BUILD 10 \ No newline at end of file diff --git a/addons/msp/config.cpp b/addons/msp/config.cpp index a3b92ea..291cca6 100644 --- a/addons/msp/config.cpp +++ b/addons/msp/config.cpp @@ -7,7 +7,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"TunRes_main","tunres_Respawn","ace_interaction","ace_interact_menu"}; + requiredAddons[] = {MAIN_ADDON_STR,"tunres_Respawn","ace_interaction","ace_interact_menu"}; authors[] = {"Tuntematon"}; // sub array of authors, considered for the specific addon, can be removed or left empty {} VERSION_CONFIG; }; diff --git a/addons/respawn/config.cpp b/addons/respawn/config.cpp index 4f1799c..e2f7e3b 100644 --- a/addons/respawn/config.cpp +++ b/addons/respawn/config.cpp @@ -7,7 +7,7 @@ class CfgPatches { units[] = {QGVAR(moduleWaitingArea), QGVAR(moduleRespawnPoint), QGVAR(moduleTeleportPoint)}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"tunres_main","A3_Modules_F","3DEN","ace_interaction","ace_interact_menu"}; + requiredAddons[] = {MAIN_ADDON_STR,"A3_Modules_F","3DEN","ace_interaction","ace_interact_menu"}; authors[] = {"Tuntematon"}; // sub array of authors, considered for the specific addon, can be removed or left empty {} VERSION_CONFIG; }; From ac01a4b216472652a56334a5b45ac70cf0ee588a Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 22 Sep 2024 16:39:00 +0300 Subject: [PATCH 186/228] fix string macros --- addons/main/Stringtable.xml | 2 +- addons/msp/Stringtable.xml | 4 +- addons/respawn/Stringtable.xml | 2 +- addons/respawn/XEH_postInit_client.sqf | 2 +- .../functions/fnc_addActionsPlayer.sqf | 4 +- .../fnc_addCheckTicketCountAction.sqf | 4 +- .../respawn/functions/fnc_addMainAction.sqf | 2 +- .../functions/fnc_addTeleportAction.sqf | 4 +- .../respawn/functions/fnc_briefingNotes.sqf | 44 +++++++++---------- .../functions/fnc_forceRespawnPlayer.sqf | 2 +- .../respawn/functions/fnc_getTicketCount.sqf | 2 +- .../functions/fnc_getTicketCountClient.sqf | 2 +- .../functions/fnc_moduleRespawnPoint.sqf | 8 ++-- .../functions/fnc_moduleWaitingArea.sqf | 4 +- addons/respawn/functions/fnc_respawnUnit.sqf | 2 +- .../respawn/functions/fnc_teleportButton.sqf | 4 +- addons/respawn/functions/fnc_waitingArea.sqf | 10 ++--- 17 files changed, 51 insertions(+), 51 deletions(-) diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml index 26db29b..2c392a1 100644 --- a/addons/main/Stringtable.xml +++ b/addons/main/Stringtable.xml @@ -1,5 +1,5 @@ - + __%1__ deployed MSP by __inst__. diff --git a/addons/msp/Stringtable.xml b/addons/msp/Stringtable.xml index 2acdc25..bbc64c3 100644 --- a/addons/msp/Stringtable.xml +++ b/addons/msp/Stringtable.xml @@ -1,6 +1,6 @@ - - + + Contested settings for the West Spectator allowed sides for West diff --git a/addons/respawn/Stringtable.xml b/addons/respawn/Stringtable.xml index 872f9a5..9b5e170 100644 --- a/addons/respawn/Stringtable.xml +++ b/addons/respawn/Stringtable.xml @@ -1,5 +1,5 @@ - + Respawn wave interval diff --git a/addons/respawn/XEH_postInit_client.sqf b/addons/respawn/XEH_postInit_client.sqf index e9e1650..ec205b7 100644 --- a/addons/respawn/XEH_postInit_client.sqf +++ b/addons/respawn/XEH_postInit_client.sqf @@ -30,7 +30,7 @@ ADDON _return }; - private _action = ["TpMenu", LSTRING(TeleportMenu),"\a3\3den\data\cfg3den\history\changeattributes_ca.paa",{ [GVAR(selfTPmenuOpenObj)] call FUNC(openTeleportMenu) }, _conditio] call ace_interact_menu_fnc_createAction; + private _action = ["TpMenu", LLSTRING(TeleportMenu),"\a3\3den\data\cfg3den\history\changeattributes_ca.paa",{ [GVAR(selfTPmenuOpenObj)] call FUNC(openTeleportMenu) }, _conditio] call ace_interact_menu_fnc_createAction; [(typeOf player), 1, ["ACE_SelfActions"], _action] call ace_interact_menu_fnc_addActionToClass; //Add respawn eh diff --git a/addons/respawn/functions/fnc_addActionsPlayer.sqf b/addons/respawn/functions/fnc_addActionsPlayer.sqf index 8ce52a4..11466d7 100644 --- a/addons/respawn/functions/fnc_addActionsPlayer.sqf +++ b/addons/respawn/functions/fnc_addActionsPlayer.sqf @@ -22,9 +22,9 @@ if (GVAR(allowCheckTicketsBase)) then { }; //private _timer_condition = { alive _target && {_target getVariable QGVAR(side) isEqualTo playerSide}}; -private _chekTime = ["Check Respawn Time", LSTRING(AceAction_CheckNextWaveTime), "\a3\modules_f_curator\data\portraitskiptime_ca.paa", FUNC(remainingWaitTimeNotification), {true}] call ace_interact_menu_fnc_createAction; +private _chekTime = ["Check Respawn Time", LLSTRING(AceAction_CheckNextWaveTime), "\a3\modules_f_curator\data\portraitskiptime_ca.paa", FUNC(remainingWaitTimeNotification), {true}] call ace_interact_menu_fnc_createAction; [_object, 0, _actionPath, _chekTime] call ace_interact_menu_fnc_addActionToObject; // Add tp action private _conditio = "count (missionNamespace getVariable ['tunres_respawn_teleportPoints', []]) > 1" ; -[_object, "true", LSTRING(MainBaseText), false, nil, [playerSide], true, _conditio, false, _actionPath] call FUNC(addCustomTeleporter); \ No newline at end of file +[_object, "true", LLSTRING(MainBaseText), false, nil, [playerSide], true, _conditio, false, _actionPath] call FUNC(addCustomTeleporter); \ No newline at end of file diff --git a/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf b/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf index 4202691..2dbfbf8 100644 --- a/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf +++ b/addons/respawn/functions/fnc_addCheckTicketCountAction.sqf @@ -23,9 +23,9 @@ if (GVAR(respawnType) isEqualTo 0) exitWith { }; if (_useAceAction) then { - private _action = ["CheckTickets", LSTRING(CheckTickets),"\a3\modules_f_curator\data\portraitmissionname_ca.paa",{ [] call FUNC(checkTicketCount); }, {true}, nil, nil, _offset] call ace_interact_menu_fnc_createAction; + private _action = ["CheckTickets", LLSTRING(CheckTickets),"\a3\modules_f_curator\data\portraitmissionname_ca.paa",{ [] call FUNC(checkTicketCount); }, {true}, nil, nil, _offset] call ace_interact_menu_fnc_createAction; [_object, 0, _parrenPath, _action] call ace_interact_menu_fnc_addActionToObject; } else { - _object addAction [LSTRING(CheckTickets), { [] call FUNC(checkTicketCount) }, [], 10, true, true, "", "true", 10]; + _object addAction [LLSTRING(CheckTickets), { [] call FUNC(checkTicketCount) }, [], 10, true, true, "", "true", 10]; }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_addMainAction.sqf b/addons/respawn/functions/fnc_addMainAction.sqf index 4d96d39..1ceb6dd 100644 --- a/addons/respawn/functions/fnc_addMainAction.sqf +++ b/addons/respawn/functions/fnc_addMainAction.sqf @@ -21,7 +21,7 @@ private _parentAction = [_object] call FUNC(getParentAction); if (count _parentAction isEqualTo 0) then { private _offSet = [_object] call FUNC(getOffSet); _parentAction = ["tunres_respawn_BaseAceAction"]; - private _actionBase = ["tunres_respawn_BaseAceAction", LSTRING(AceAction_Main), "", {true}, {true}, nil, nil, _offSet, 8] call ace_interact_menu_fnc_createAction; + private _actionBase = ["tunres_respawn_BaseAceAction", LLSTRING(AceAction_Main), "", {true}, {true}, nil, nil, _offSet, 8] call ace_interact_menu_fnc_createAction; [_object, 0, [], _actionBase] call ace_interact_menu_fnc_addActionToObject; }; diff --git a/addons/respawn/functions/fnc_addTeleportAction.sqf b/addons/respawn/functions/fnc_addTeleportAction.sqf index cbd7bbc..af7c29a 100644 --- a/addons/respawn/functions/fnc_addTeleportAction.sqf +++ b/addons/respawn/functions/fnc_addTeleportAction.sqf @@ -24,13 +24,13 @@ if (_useAceAction) then { _statement = { params ["_obj", "_menuOpenConditio", "_actionPath"]; _menuOpenConditio = compile _menuOpenConditio; - private _action = ["TpMenu", LSTRING(TeleportMenu),"\a3\3den\data\cfg3den\history\changeattributes_ca.paa",{ [_target] call FUNC(openTeleportMenu) }, _menuOpenConditio] call ace_interact_menu_fnc_createAction; + private _action = ["TpMenu", LLSTRING(TeleportMenu),"\a3\3den\data\cfg3den\history\changeattributes_ca.paa",{ [_target] call FUNC(openTeleportMenu) }, _menuOpenConditio] call ace_interact_menu_fnc_createAction; [_obj, 0, _actionPath, _action] call ace_interact_menu_fnc_addActionToObject; }; } else { _statement = { params ["_obj", "_menuOpenConditio"]; - _obj addAction [LSTRING(TeleportMenuVanilla), { [_this select 0] call FUNC(openTeleportMenu) }, [], 10, true, true, "", _menuOpenConditio, 10] + _obj addAction [LLSTRING(TeleportMenuVanilla), { [_this select 0] call FUNC(openTeleportMenu) }, [], 10, true, true, "", _menuOpenConditio, 10] }; }; diff --git a/addons/respawn/functions/fnc_briefingNotes.sqf b/addons/respawn/functions/fnc_briefingNotes.sqf index d8224f1..e4c43eb 100644 --- a/addons/respawn/functions/fnc_briefingNotes.sqf +++ b/addons/respawn/functions/fnc_briefingNotes.sqf @@ -15,21 +15,21 @@ if (playerSide isEqualTo sideLogic) exitWith { }; // Exit if a virtual entity (IE zeus) -private _text = ""+ LSTRING(Briefing_Header)+"
"; +private _text = ""+ LLSTRING(Briefing_Header)+"
"; if (GVAR(briefingEnableShowRespawnType)) then { if ( GVAR(forcedRespawn) ) then { - _text = format ["%1
- %2",_text, LSTRING(Briefing_onlyForcedWaves)]; + _text = format ["%1
- %2",_text, LLSTRING(Briefing_onlyForcedWaves)]; }; switch (GVAR(respawnType)) do { case 0: { - _text = format ["
%1
- %2",_text, LSTRING(Briefing_default)]; + _text = format ["
%1
- %2",_text, LLSTRING(Briefing_default)]; }; case 1: { - _text = format ["
%1
- %2",_text, LSTRING(Briefing_sidetickets)]; + _text = format ["
%1
- %2",_text, LLSTRING(Briefing_sidetickets)]; }; case 2: { - _text = format ["
%1
- %2",_text, LSTRING(Briefing_playertickets)]; + _text = format ["
%1
- %2",_text, LLSTRING(Briefing_playertickets)]; }; default { }; }; @@ -39,19 +39,19 @@ if (GVAR(briefingEnableShowTime)) then { private _waveLenghtTimeHash = GVAR(waveLenghtTimesHash); _text = format ["%1

Wave interval",_text]; if (playerSide isEqualTo west || GVAR(briefingEnableShowOtherSidesDataWest)) then { - _text = format ["%1
- "+LSTRING(Briefing_WaveTime_west),_text, _waveLenghtTimeHash get west]; + _text = format ["%1
- "+LLSTRING(Briefing_WaveTime_west),_text, _waveLenghtTimeHash get west]; }; if (playerSide isEqualTo east || GVAR(briefingEnableShowOtherSidesDataEast)) then { - _text = format ["%1
- "+LSTRING(Briefing_WaveTime_east),_text,_waveLenghtTimeHash get east]; + _text = format ["%1
- "+LLSTRING(Briefing_WaveTime_east),_text,_waveLenghtTimeHash get east]; }; if (playerSide isEqualTo resistance || GVAR(briefingEnableShowOtherSidesDataResistance)) then { - _text = format ["%1
- "+LSTRING(Briefing_WaveTime_resistance),_text, _waveLenghtTimeHash get resistance]; + _text = format ["%1
- "+LLSTRING(Briefing_WaveTime_resistance),_text, _waveLenghtTimeHash get resistance]; }; if (playerSide isEqualTo civilian || GVAR(briefingEnableShowOtherSidesDataCivilian)) then { - _text = format ["%1
- "+LSTRING(Briefing_WaveTime_civilian),_text, _waveLenghtTimeHash get civilian]; + _text = format ["%1
- "+LLSTRING(Briefing_WaveTime_civilian),_text, _waveLenghtTimeHash get civilian]; }; private _delayedRespawn = GVAR(delayedRespawn); @@ -59,47 +59,47 @@ if (GVAR(briefingEnableShowTime)) then { private _respawnTime = _waveLenghtTimeHash get playerSide; private _delayedTime = [(_respawnTime * (_delayedRespawn / 100)), "M:SS"] call CBA_fnc_formatElapsedTime; _respawnTime = [_respawnTime, "M:SS"] call CBA_fnc_formatElapsedTime; - _text = format ["%1

- " + LSTRING(Briefing_DelayedRespawn),_text, _delayedTime, _delayedRespawn, _respawnTime, "%"]; + _text = format ["%1

- " + LLSTRING(Briefing_DelayedRespawn),_text, _delayedTime, _delayedRespawn, _respawnTime, "%"]; } else { - _text = _text + "

- " + LSTRING(Briefing_DelayedRespawnOff); + _text = _text + "

- " + LLSTRING(Briefing_DelayedRespawnOff); }; }; if (GVAR(briefingEnableShowTickets) && { GVAR(respawnType) isNotEqualTo 0}) then { - _text = format ["%1

"+ LSTRING(Briefing_Category_Tickets) +"",_text]; + _text = format ["%1

"+ LLSTRING(Briefing_Category_Tickets) +"",_text]; if (playerSide isEqualTo west || GVAR(briefingEnableShowOtherSidesDataWest)) then { - _text = format ["%1
- "+LSTRING(Briefing_TicketCount_west),_text, GVAR(initialTicketsWest)]; + _text = format ["%1
- "+LLSTRING(Briefing_TicketCount_west),_text, GVAR(initialTicketsWest)]; }; if (playerSide isEqualTo east || GVAR(briefingEnableShowOtherSidesDataEast)) then { - _text = format ["%1
- "+LSTRING(Briefing_TicketCount_east),_text, GVAR(initialTicketsEast)]; + _text = format ["%1
- "+LLSTRING(Briefing_TicketCount_east),_text, GVAR(initialTicketsEast)]; }; if (playerSide isEqualTo resistance || GVAR(briefingEnableShowOtherSidesDataResistance)) then { - _text = format ["%1
- "+LSTRING(Briefing_TicketCount_resistance),_text, GVAR(initialTicketsResistance)]; + _text = format ["%1
- "+LLSTRING(Briefing_TicketCount_resistance),_text, GVAR(initialTicketsResistance)]; }; if (playerSide isEqualTo civilian || GVAR(briefingEnableShowOtherSidesDataCivilian)) then { - _text = format ["%1
- "+LSTRING(Briefing_TicketCount_civilian),_text, GVAR(initialTicketsCivilian)]; + _text = format ["%1
- "+LLSTRING(Briefing_TicketCount_civilian),_text, GVAR(initialTicketsCivilian)]; }; if (GVAR(allowCheckTicketsBase)) then { - _text = format ["%1

- "+ LSTRING(Briefing_CheckTicketsMainbase),_text]; + _text = format ["%1

- "+ LLSTRING(Briefing_CheckTicketsMainbase),_text]; }; }; if (GVAR(killJIP)) then { - _text = format [("%1

- "+LSTRING(Briefing_killJipEnabled)),_text, GVAR(killJipTime)]; + _text = format [("%1

- "+LLSTRING(Briefing_killJipEnabled)),_text, GVAR(killJipTime)]; } else { - _text = format ["%1

- %2",_text, LSTRING(Briefing_killJipDisabled)]; + _text = format ["%1

- %2",_text, LLSTRING(Briefing_killJipDisabled)]; }; -_text = _text + "

" + LSTRING(Briefing_teleportNetwork); +_text = _text + "

" + LLSTRING(Briefing_teleportNetwork); _text = format ["%1

Powered By TuntematonEngine v%2.%3.%4", _text, MAJOR, MINOR, PATCH]; if !(player diarySubjectExists QEGVAR(main,briefing)) then { - player createDiarySubject [QEGVAR(main,briefing),LSTRING(Briefing_RespawnMainCategory)]; + player createDiarySubject [QEGVAR(main,briefing),LLSTRING(Briefing_RespawnMainCategory)]; }; -player createDiaryRecord [QEGVAR(main,briefing),[LSTRING(Briefing_RespawnInfoTab), _text]]; \ No newline at end of file +player createDiaryRecord [QEGVAR(main,briefing),[LLSTRING(Briefing_RespawnInfoTab), _text]]; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_forceRespawnPlayer.sqf b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf index f85579e..4117657 100644 --- a/addons/respawn/functions/fnc_forceRespawnPlayer.sqf +++ b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf @@ -18,7 +18,7 @@ if !(player getVariable [QGVAR(isWaitingRespawn),false]) exitWith { ERROR("Tried to force respawn unit, whichs is not at respawn"); }; -AAR_EVENT(LSTRING(playerForceRespawned),player,nil,nil); +AAR_EVENT(LLSTRING(playerForceRespawned),player,nil,nil); player setVariable [QGVAR(skipNextWave), false, true]; diff --git a/addons/respawn/functions/fnc_getTicketCount.sqf b/addons/respawn/functions/fnc_getTicketCount.sqf index dbd2913..638d2f1 100644 --- a/addons/respawn/functions/fnc_getTicketCount.sqf +++ b/addons/respawn/functions/fnc_getTicketCount.sqf @@ -42,7 +42,7 @@ switch (GVAR(respawnType)) do { }; if (_doHint && !isNull _player) then { - private _text = format["%1 %2",LSTRING(RemainingTicketsText), str _ticketCount]; + private _text = format["%1 %2",LLSTRING(RemainingTicketsText), str _ticketCount]; [QEGVAR(main,doNotification), [_text], _player] call CBA_fnc_targetEvent; }; diff --git a/addons/respawn/functions/fnc_getTicketCountClient.sqf b/addons/respawn/functions/fnc_getTicketCountClient.sqf index 0f019f8..40adfa9 100644 --- a/addons/respawn/functions/fnc_getTicketCountClient.sqf +++ b/addons/respawn/functions/fnc_getTicketCountClient.sqf @@ -29,7 +29,7 @@ private _ticketCount = switch (GVAR(respawnType)) do { }; if (_doHint && !isNull player) then { - private _text = format["%1 %2",LSTRING(RemainingTicketsText), str _ticketCount]; + private _text = format["%1 %2",LLSTRING(RemainingTicketsText), str _ticketCount]; [QEGVAR(main,doNotification), [_text]] call CBA_fnc_localEvent; }; diff --git a/addons/respawn/functions/fnc_moduleRespawnPoint.sqf b/addons/respawn/functions/fnc_moduleRespawnPoint.sqf index a03b45a..6e3fcf8 100644 --- a/addons/respawn/functions/fnc_moduleRespawnPoint.sqf +++ b/addons/respawn/functions/fnc_moduleRespawnPoint.sqf @@ -22,7 +22,7 @@ private _markername = _logic getVariable [QGVAR(respawnSide),"none"]; private _flagTexture = _logic getVariable [QGVAR(flagTexture),""]; private _pos = getPosASL _logic; -if (_markername isEqualTo "none") exitWith { hint LSTRING(Module_RespanPos_novalue); false }; // Exit if no side +if (_markername isEqualTo "none") exitWith { hint LLSTRING(Module_RespanPos_novalue); false }; // Exit if no side private _marker = ""; if (getMarkerColor _markername isEqualTo "") then { @@ -30,7 +30,7 @@ if (getMarkerColor _markername isEqualTo "") then { _marker setMarkerType "Empty"; } else { - private _errorText = LSTRING(Module_RespanPos_MultipleMarkers); + private _errorText = LLSTRING(Module_RespanPos_MultipleMarkers); hint format [_errorText, _markername]; }; @@ -79,8 +79,8 @@ publicVariable QGVAR(enabledSidesHash); GVAR(respawnPointsHash) set [_side, [_markername, _pos]]; publicVariable QGVAR(respawnPointsHash); -[QGVAR(RespawnPosLocal), _pos, LSTRING(RespawnPoint), "respawn_inf", _color, 1, 100] remoteExecCall [QFUNC(createLocalMarker), _side, true]; -[QGVAR(MainBaseLocal), _pos, LSTRING(MainBase), "mil_start", _color, 0, 100] remoteExecCall [QFUNC(createLocalMarker), _side, true]; +[QGVAR(RespawnPosLocal), _pos, LLSTRING(RespawnPoint), "respawn_inf", _color, 1, 100] remoteExecCall [QFUNC(createLocalMarker), _side, true]; +[QGVAR(MainBaseLocal), _pos, LLSTRING(MainBase), "mil_start", _color, 0, 100] remoteExecCall [QFUNC(createLocalMarker), _side, true]; [_flag] remoteExecCall [QFUNC(addActionsPlayer), _side, true]; diff --git a/addons/respawn/functions/fnc_moduleWaitingArea.sqf b/addons/respawn/functions/fnc_moduleWaitingArea.sqf index 68c3c04..0f3fd2b 100644 --- a/addons/respawn/functions/fnc_moduleWaitingArea.sqf +++ b/addons/respawn/functions/fnc_moduleWaitingArea.sqf @@ -22,7 +22,7 @@ private _markername = _logic getVariable [QGVAR(respawnSide),"none"]; private _flagTexture = _logic getVariable [QGVAR(flagTexture),""]; if (_markername isEqualTo "none") exitWith { // Exit if no side - private _errorText = LSTRING(Module_WaitingArea_novalue); + private _errorText = LLSTRING(Module_WaitingArea_novalue); ERROR_MSG(_errorText); false }; @@ -31,7 +31,7 @@ if (getMarkerColor _markername isEqualTo "") then { _marker = [_markername, getPosASL _logic, "icon", [1, 1], "PERSIST", "TYPE:", "Empty"] call CBA_fnc_createMarker; _marker setMarkerAlpha 0; } else { - private _errorText = LSTRING(Module_WaitingArea_MultipleMarkers); + private _errorText = LLSTRING(Module_WaitingArea_MultipleMarkers); _errorText = format [_errorText, _markername]; ERROR_MSG(_errorText); }; diff --git a/addons/respawn/functions/fnc_respawnUnit.sqf b/addons/respawn/functions/fnc_respawnUnit.sqf index f5f76f8..f56534e 100644 --- a/addons/respawn/functions/fnc_respawnUnit.sqf +++ b/addons/respawn/functions/fnc_respawnUnit.sqf @@ -22,7 +22,7 @@ private _respawnPosition = getMarkerPos ((_respawnPointsHash get _side) select 0 _unit setVariable [QGVAR(isWaitingRespawn), false, true]; player setVariable [QGVAR(skipNextWave), nil]; -private _text = LSTRING(FNC_moveRespawnText); +private _text = LLSTRING(FNC_moveRespawnText); [_unit, _respawnPosition, _text, 20, true] call FUNC(teleportUnit); diff --git a/addons/respawn/functions/fnc_teleportButton.sqf b/addons/respawn/functions/fnc_teleportButton.sqf index 5d2098e..fde5480 100644 --- a/addons/respawn/functions/fnc_teleportButton.sqf +++ b/addons/respawn/functions/fnc_teleportButton.sqf @@ -29,12 +29,12 @@ private _teleportConditio = call compile (_teleportConditioText); private _teleportName = _obj getVariable [QGVAR(teleportName), "TP"]; private _destination = getPosASL _obj; -private _text = format["%1 %2", LSTRING(Teleporting), _teleportName]; +private _text = format["%1 %2", LLSTRING(Teleporting), _teleportName]; if (_teleportConditio) then { closeDialog 2; GVAR(tpMenuOpenedFrom) = objNull; [player, _destination, _text, 10, true, 15] call FUNC(teleportUnit); } else { - [QEGVAR(main,doNotification), [LSTRING(Teleport_Disabled)]] call CBA_fnc_localEvent; + [QEGVAR(main,doNotification), [LLSTRING(Teleport_Disabled)]] call CBA_fnc_localEvent; }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 39e7e8b..3274682 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -66,19 +66,19 @@ GVAR(waitingAreaPFH) = [{ }; private _allowRespawn = GVAR(allowRespawnHash) get _playerSide; - private _text = format ["%1", LSTRING(FNC_only_forced_waves)]; + private _text = format ["%1", LLSTRING(FNC_only_forced_waves)]; if (_remainingWaitTime >= 0 && { _allowRespawn }) then { - _text = format ["%2
%1
", ([_remainingWaitTime] call CBA_fnc_formatElapsedTime), LSTRING(FNC_remaining_time)]; + _text = format ["%2
%1
", ([_remainingWaitTime] call CBA_fnc_formatElapsedTime), LLSTRING(FNC_remaining_time)]; } else { if (player getVariable [QGVAR(isWaitingRespawn), true] && { !(GVAR(forcedRespawn)) } && { !_allowRespawn }) then { - _text = format ["%1", LSTRING(FNC_RespawnDisabled)]; + _text = format ["%1", LLSTRING(FNC_RespawnDisabled)]; } else { _text = format ["Something is vevy vevy wrong. time: %1 - allowRespawn: %2 - forced respawn: %3 ", _remainingWaitTime, _allowRespawn, GVAR(forcedRespawn)]; }; }; if (_playerSkipsWave) then { - _text = format["%1
%2", _text, LSTRING(FNC_playerSkipsWave)]; + _text = format["%1
%2", _text, LLSTRING(FNC_playerSkipsWave)]; }; if (_respawnType in [1,2]) then { @@ -93,6 +93,6 @@ GVAR(waitingAreaPFH) = [{ //make sure that player is still in area if !(player inArea [_respawnWaitingarea, _waitingRange, _waitingRange, 0, false]) then { player setPosASL ([_respawnWaitingarea, (_waitingRange / 2)] call CBA_fnc_randPos); - [QEGVAR(main,doNotification), [LSTRING(youAreNotAllowedToLeave)]] call CBA_fnc_localEvent; + [QEGVAR(main,doNotification), [LLSTRING(youAreNotAllowedToLeave)]] call CBA_fnc_localEvent; }; }, 1, [_respawnWaitingarea, _playerSide, _waitingRange,_respawnType]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file From 6b09a6799dee8ac53f14d0f766610a584b43f1f5 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Mon, 23 Sep 2024 23:11:33 +0300 Subject: [PATCH 187/228] fix time slider & macros --- addons/main/script_macros.hpp | 9 ++++++++- addons/msp/functions/fnc_checkContestZoneArea.sqf | 2 +- .../msp/functions/fnc_createContestZoneMarkers.sqf | 2 +- addons/respawn/initSettings.inc.sqf | 12 ++++++------ 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 77fca72..9dccfea 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -35,4 +35,11 @@ #define MODE_FREE 0 #define MODE_FPS 1 #define MODE_FOLLOW 2 -#define ALL_MODES [MODE_FREE,MODE_FPS,MODE_FOLLOW] \ No newline at end of file +#define ALL_MODES [MODE_FREE,MODE_FPS,MODE_FOLLOW] + + +//Times +#define MAX_WAVE_TIME 10800 +#define DEFAULT_WAVE_TIME 900 +#define MAX_KILLJIP_TIME 10800 +#define DEFAULT_KILLJIP_TIME 1200 \ No newline at end of file diff --git a/addons/msp/functions/fnc_checkContestZoneArea.sqf b/addons/msp/functions/fnc_checkContestZoneArea.sqf index 4548c73..d85d1cd 100644 --- a/addons/msp/functions/fnc_checkContestZoneArea.sqf +++ b/addons/msp/functions/fnc_checkContestZoneArea.sqf @@ -16,7 +16,7 @@ if (playerSide isEqualTo sideLogic || !hasInterface) exitWith { }; -params[["_target", player]]; +params [["_target", player]]; openMap true; private _pos = getPosASL _target; diff --git a/addons/msp/functions/fnc_createContestZoneMarkers.sqf b/addons/msp/functions/fnc_createContestZoneMarkers.sqf index 197304f..542cea9 100644 --- a/addons/msp/functions/fnc_createContestZoneMarkers.sqf +++ b/addons/msp/functions/fnc_createContestZoneMarkers.sqf @@ -16,7 +16,7 @@ if (playerSide isEqualTo sideLogic || !hasInterface) exitWith { }; -params["_pos"]; +params ["_pos"]; private _values = GVAR(contestValuesHash) get playerSide; private _reportEnemiesRange = _values param [1]; diff --git a/addons/respawn/initSettings.inc.sqf b/addons/respawn/initSettings.inc.sqf index d96dce4..02e71b9 100644 --- a/addons/respawn/initSettings.inc.sqf +++ b/addons/respawn/initSettings.inc.sqf @@ -25,7 +25,7 @@ "TIME", ["Kill JIP Time", LSTRING(CBA_tooltip_killJipTime)], [LSTRING(CBA_Category_main), LSTRING(CBA_Category_generic)], - [1, 300, 20, 0], + [0, MAX_KILLJIP_TIME, DEFAULT_KILLJIP_TIME, 0], 1, { params ["_value"]; @@ -70,7 +70,7 @@ [ QGVAR(delayedRespawn), - "TIME", + "SLIDER", ["Delayed respawn", LSTRING(CBA_tooltip_delayedRespawn)], [LSTRING(CBA_Category_main), LSTRING(CBA_Category_generic)], [0, 100, 0, 0], @@ -104,7 +104,7 @@ "TIME", ["West", LSTRING(CBA_tooltip_time)], [LSTRING(CBA_Category_main), LSTRING(CBA_Category_time)], - [10, 60*60, 15*60, 0], + [10, MAX_WAVE_TIME, DEFAULT_WAVE_TIME, 0], 1, { params ["_value"]; @@ -120,7 +120,7 @@ "TIME", ["East", LSTRING(CBA_tooltip_time)], [LSTRING(CBA_Category_main), LSTRING(CBA_Category_time)], - [10, 60*60, 15*60, 0], + [10, MAX_WAVE_TIME, DEFAULT_WAVE_TIME, 0], 1, { params ["_value"]; @@ -136,7 +136,7 @@ "TIME", ["Resistance", LSTRING(CBA_tooltip_time)], [LSTRING(CBA_Category_main), LSTRING(CBA_Category_time)], - [10, 60*60, 15*60, 0], + [10, MAX_WAVE_TIME, DEFAULT_WAVE_TIME, 0], 1, { params ["_value"]; @@ -152,7 +152,7 @@ "TIME", ["Civilian", LSTRING(CBA_tooltip_time)], [LSTRING(CBA_Category_main), LSTRING(CBA_Category_time)], - [10, 60*60, 15*60, 0], + [10, MAX_WAVE_TIME, DEFAULT_WAVE_TIME, 0], 1, { params ["_value"]; From b37f53e85e2a16c739b77f7b32c224f79bcc453b Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Mon, 23 Sep 2024 23:11:52 +0300 Subject: [PATCH 188/228] fix wrong locality for hash --- addons/msp/XEH_preInit.sqf | 3 +++ addons/msp/XEH_preInit_server.sqf | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/msp/XEH_preInit.sqf b/addons/msp/XEH_preInit.sqf index 14e2510..29f5866 100644 --- a/addons/msp/XEH_preInit.sqf +++ b/addons/msp/XEH_preInit.sqf @@ -8,6 +8,9 @@ PREP_RECOMPILE_END; //Msp classnames GVAR(classnamesHash) = createHashMap; +//reportEnemiesInterval 0 - reportEnemiesRange 1 - contestedRadiusMax 2 - contestedRadiusMin 3 - contestedCheckInterval 4 - reportEnemiesEnabled 5 +GVAR(contestValuesHash) = createHashMapFromArray [[west,[0,0,0,0,0,false]],[east,[0,0,0,0,0,false]],[resistance,[0,0,0,0,0,false]],[civilian,[0,0,0,0,0,false]]]; + #include "initSettings.inc.sqf" ADDON = true; \ No newline at end of file diff --git a/addons/msp/XEH_preInit_server.sqf b/addons/msp/XEH_preInit_server.sqf index 2395e13..d68d6ea 100644 --- a/addons/msp/XEH_preInit_server.sqf +++ b/addons/msp/XEH_preInit_server.sqf @@ -18,7 +18,6 @@ publicVariable QGVAR(activeVehicleHash); //Contested stuff GVAR(contestedCheckHash) = createHashMapFromArray [[west,[0,0,0]],[east,[0,0,0]],[resistance,[0,0,0]],[civilian,[0,0,0]]]; -//reportEnemiesInterval 0 - reportEnemiesRange 1 - contestedRadiusMax 2 - contestedRadiusMin 3 - contestedCheckInterval 4 - reportEnemiesEnabled 5 -GVAR(contestValuesHash) = createHashMapFromArray [[west,[0,0,0,0,0,false]],[east,[0,0,0,0,0,false]],[resistance,[0,0,0,0,0,false]],[civilian,[0,0,0,0,0,false]]]; + GVAR(contestHandlesHash) = createHashMap; GVAR(contestCheckRunningHash) = createHashMapFromArray FALSES_FOR_SIDES; \ No newline at end of file From 098e41ecdef04406ca65de74c9fab3b0599b1e81 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 10:09:58 +0300 Subject: [PATCH 189/228] cleaning --- addons/main/XEH_preInit_server.sqf | 4 ++-- .../msp/functions/fnc_checkContestZoneMarkersBriefing.sqf | 2 +- addons/msp/functions/fnc_contestedCheck.sqf | 2 +- addons/msp/functions/fnc_startContestedChecks.sqf | 4 ++-- addons/respawn/XEH_postInit_server.sqf | 6 +++--- addons/respawn/functions/fnc_timer.sqf | 4 ++-- addons/respawn/functions/fnc_upddateRespawnCount.sqf | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/addons/main/XEH_preInit_server.sqf b/addons/main/XEH_preInit_server.sqf index 9346d8e..7421941 100644 --- a/addons/main/XEH_preInit_server.sqf +++ b/addons/main/XEH_preInit_server.sqf @@ -4,14 +4,14 @@ if (AAR_IS_ENABLED) then { LOG("AAR eventit tulille"); [QGVAR(AAR_EventEH), { - params["_text","_instigator","_target","_poi"]; + params ["_text","_instigator","_target","_poi"]; [_text,_instigator,_target,_poi] call afi_aar2_fnc_addCustomEvent; LOG("AAR custom eventti lisätty"); }] call CBA_fnc_addEventHandler; [QGVAR(AAR_UpdateEH), { - params["_obj","_varName","_value"]; + params ["_obj","_varName","_value"]; [_obj, _varName, _value] call afi_aar2_fnc_addcustomdata; LOG("AAR custom data lisätty"); }] call CBA_fnc_addEventHandler; diff --git a/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf b/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf index e438df6..5e8566a 100644 --- a/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf +++ b/addons/msp/functions/fnc_checkContestZoneMarkersBriefing.sqf @@ -19,7 +19,7 @@ * Public: [Yes/No] */ #include "script_component.hpp" -params[["_enable", true]]; +params [["_enable", true]]; if (_enable) then { if (cba_missiontime > 1) exitWith { diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index 7cec284..65a04ce 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -11,7 +11,7 @@ * [] call tunres_MSP_fnc_contestedCheck */ #include "script_component.hpp" -params[["_side", nil,[west]]]; +params [["_side", nil,[west]]]; if (!isServer) exitWith {}; private _oldAllowRespawnStatus = GVAR(allowRespawnHash) get _side; diff --git a/addons/msp/functions/fnc_startContestedChecks.sqf b/addons/msp/functions/fnc_startContestedChecks.sqf index 51875b7..45f1c1a 100644 --- a/addons/msp/functions/fnc_startContestedChecks.sqf +++ b/addons/msp/functions/fnc_startContestedChecks.sqf @@ -29,7 +29,7 @@ if (_start) then { private _reportEnemiesEnabled = _values select 5; private _handleContest = [{ - _args params["_side"]; + _args params ["_side"]; if !(GVAR(disableContestedCheck)) then { private _mspDeployementStatus = GVAR(deployementStatusHash) get _side; if (_mspDeployementStatus) then { @@ -44,7 +44,7 @@ if (_start) then { private _handleReport = nil; if (_reportEnemiesEnabled) then { _handleReport = [{ - _args params["_side"]; + _args params ["_side"]; //So that this does not run, when contest update is offline if !(GVAR(disableContestedCheck)) then { private _side = _args; diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 06d7f69..c15a084 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -80,17 +80,17 @@ if ( AAR_IS_ENABLED ) then { }; [QGVAR(updateRespawnPointEH), { - params["_side","_setup","_pos"]; + params ["_side","_setup","_pos"]; [_side, _setup, _pos] call FUNC(updateRespawnPoint); }] call CBA_fnc_addEventHandler; [QGVAR(updateWaitingRespawnListEH), { - params["_player","_addPlayer","_side"]; + params ["_player","_addPlayer","_side"]; [_player, _addPlayer, _side] call FUNC(updateWaitingRespawnList); }] call CBA_fnc_addEventHandler; [QGVAR(respawnUnitEH), { - params["_side","_unit"]; + params ["_side","_unit"]; [_side, _unit] call FUNC(respawnUnit); }] call CBA_fnc_addEventHandler; diff --git a/addons/respawn/functions/fnc_timer.sqf b/addons/respawn/functions/fnc_timer.sqf index 0d5e066..2f120ba 100644 --- a/addons/respawn/functions/fnc_timer.sqf +++ b/addons/respawn/functions/fnc_timer.sqf @@ -29,11 +29,11 @@ publicVariable QGVAR(nextWaveTimesHash); if !( GVAR(timerRunningHash) getOrDefault [_side, false]) then { GVAR(timerRunningHash) set [_side, true]; publicVariable QGVAR(timerRunningHash); - [{ _this params["_side"]; + [{ _this params ["_side"]; GVAR(allowRespawnHash) get _side && { cba_missiontime >= GVAR(nextWaveTimesHash) get _side } }, { - _this params["_side"]; + _this params ["_side"]; if (EGVAR(msp,enable)) then { [_side] call EFUNC(msp,contestedCheck); }; diff --git a/addons/respawn/functions/fnc_upddateRespawnCount.sqf b/addons/respawn/functions/fnc_upddateRespawnCount.sqf index 634f379..b73c192 100644 --- a/addons/respawn/functions/fnc_upddateRespawnCount.sqf +++ b/addons/respawn/functions/fnc_upddateRespawnCount.sqf @@ -14,7 +14,7 @@ */ #include "script_component.hpp" -params[["_howManyRespawned", 0, [0]]]; +params [["_howManyRespawned", 0, [0]]]; private _totalRespawnCountHash = GVAR(totalRespawnCountHash); private _totalRespawnCount = _totalRespawnCountHash get _side; From ba1d78c76f4eb12faa1f7109d98ee72ef427739b Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 10:12:32 +0300 Subject: [PATCH 190/228] update params --- addons/respawn/XEH_postInit_server.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index c15a084..7dcde86 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -80,17 +80,17 @@ if ( AAR_IS_ENABLED ) then { }; [QGVAR(updateRespawnPointEH), { - params ["_side","_setup","_pos"]; + params [["_side", nil, [west]], ["_update", false, [true]], ["_newPos", [0,0,0], [[]]]]; [_side, _setup, _pos] call FUNC(updateRespawnPoint); }] call CBA_fnc_addEventHandler; [QGVAR(updateWaitingRespawnListEH), { - params ["_player","_addPlayer","_side"]; + params [["_player", nil, [objNull]], ["_addPlayer", nil, [false]], ["_side", nil, [west]]]; [_player, _addPlayer, _side] call FUNC(updateWaitingRespawnList); }] call CBA_fnc_addEventHandler; [QGVAR(respawnUnitEH), { - params ["_side","_unit"]; + params [["_side", nil, [west]], ["_unit", objNull, [objNull]]]; [_side, _unit] call FUNC(respawnUnit); }] call CBA_fnc_addEventHandler; From 509d5ff125bc1a12cfc1a9eb8593dacf933ba78b Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 10:12:47 +0300 Subject: [PATCH 191/228] remove wrongly placed event --- addons/respawn/XEH_postInit_server.sqf | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 7dcde86..6357a97 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -92,6 +92,4 @@ if ( AAR_IS_ENABLED ) then { [QGVAR(respawnUnitEH), { params [["_side", nil, [west]], ["_unit", objNull, [objNull]]]; [_side, _unit] call FUNC(respawnUnit); -}] call CBA_fnc_addEventHandler; - -[QGVAR(respawnUnitEH), [_unit, false, _side]] call CBA_fnc_serverEvent; \ No newline at end of file +}] call CBA_fnc_addEventHandler; \ No newline at end of file From ee2c404590da2dc5e101877f7bdf3727e4c8bd0f Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 10:19:20 +0300 Subject: [PATCH 192/228] show build version at briefing --- addons/msp/functions/fnc_briefingNotes.sqf | 2 +- addons/respawn/functions/fnc_briefingNotes.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/msp/functions/fnc_briefingNotes.sqf b/addons/msp/functions/fnc_briefingNotes.sqf index 29d14bc..43c6604 100644 --- a/addons/msp/functions/fnc_briefingNotes.sqf +++ b/addons/msp/functions/fnc_briefingNotes.sqf @@ -41,7 +41,7 @@ if (isClass (configFile >> "CfgVehicles" >> _vehicle)) then { _text = format ["%1
- %2",_text, LLSTRING(Briefing_MspDisabled)]; }; -_text = format ["%1

Powered By TuntematonEngine v%2.%3.%4", _text, MAJOR, MINOR, PATCH]; +_text = format ["%1

Powered By TuntematonEngine v%2.%3.%4.%5", _text, MAJOR, MINOR, PATCH, BUILD]; if !(player diarySubjectExists QEGVAR(main,briefing)) then { player createDiarySubject [QEGVAR(main,briefing),localize "STR_tunres_respawn_Briefing_RespawnMainCategory"]; diff --git a/addons/respawn/functions/fnc_briefingNotes.sqf b/addons/respawn/functions/fnc_briefingNotes.sqf index e4c43eb..3d2a5db 100644 --- a/addons/respawn/functions/fnc_briefingNotes.sqf +++ b/addons/respawn/functions/fnc_briefingNotes.sqf @@ -96,7 +96,7 @@ if (GVAR(killJIP)) then { }; _text = _text + "

" + LLSTRING(Briefing_teleportNetwork); -_text = format ["%1

Powered By TuntematonEngine v%2.%3.%4", _text, MAJOR, MINOR, PATCH]; +_text = format ["%1

Powered By TuntematonEngine v%2.%3.%4.%5", _text, MAJOR, MINOR, PATCH, BUILD]; if !(player diarySubjectExists QEGVAR(main,briefing)) then { player createDiarySubject [QEGVAR(main,briefing),LLSTRING(Briefing_RespawnMainCategory)]; From 09e604b6ca3f6c9470d8323420a90ce03ba0f40e Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 10:30:40 +0300 Subject: [PATCH 193/228] cleaning --- addons/main/script_macros.hpp | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 9dccfea..a055870 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -2,40 +2,40 @@ #ifdef DISABLE_COMPILE_CACHE #undef PREP - #define PREP(fncName) DFUNC(fncName) = compile preprocessFileLineNumbers QPATHTOF(functions\DOUBLES(fnc,fncName).sqf) + #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 + #define PREP(fncName) [QPATHTOF(functions\DOUBLES(fnc,fncName).sqf), QFUNC(fncName)] call CBA_fnc_compileFunction #endif -#define MAIN_ADDON_STR QUOTE(MAIN_ADDON) +#define MAIN_ADDON_STR QUOTE(MAIN_ADDON) // -#define MARKER_NAME_CONFIG(var1) QUOTE(DOUBLES(ADDON,var1)) +#define MARKER_NAME_CONFIG(var1) QUOTE(DOUBLES(ADDON,var1)) -#define MARKER_NAME(var1) FORMAT_2("%1_%2",QUOTE(ADDON),var1) +#define MARKER_NAME(var1) FORMAT_2("%1_%2",QUOTE(ADDON),var1) //AAR enabled check -#define AAR_IS_ENABLED !isNil "afi_aar2" +#define AAR_IS_ENABLED !isNil "afi_aar2" //AAR update macro -#define AAR_UPDATE(OBJ,VARNAME,VALUE) LOG("AAR update macro"); [QEGVAR(main,AAR_UpdateEH), [OBJ,VARNAME,VALUE]] call CBA_fnc_serverEvent +#define AAR_UPDATE(OBJ,VARNAME,VALUE) [QEGVAR(main,AAR_UpdateEH), [OBJ,VARNAME,VALUE]] call CBA_fnc_serverEvent //AAR event #define AAR_EVENT(TEXT,INSTIGATOR,TARGET,POI) LOG("AAR eventti macro"); [QEGVAR(main,AAR_EventEH), [TEXT,INSTIGATOR,TARGET,POI]] call CBA_fnc_serverEvent -#define ALL_SIDES [west,east,resistance,civilian] +#define ALL_SIDES [west,east,resistance,civilian] //Hash template macros -#define EMPTY_ARRAY_FOR_SIDES [[west,[]],[east,[]],[resistance,[]],[civilian,[]]] -#define ZEROS_FOR_SIDES [[west,0],[east,0],[resistance,0],[civilian,0]] -#define FALSES_FOR_SIDES [[west,false],[east,false],[resistance,false],[civilian,false]] -#define TRUES_FOR_SIDES [[west,true],[east,true],[resistance,true],[civilian,true]] +#define EMPTY_ARRAY_FOR_SIDES [[west,[]],[east,[]],[resistance,[]],[civilian,[]]] +#define ZEROS_FOR_SIDES [[west,0],[east,0],[resistance,0],[civilian,0]] +#define FALSES_FOR_SIDES [[west,false],[east,false],[resistance,false],[civilian,false]] +#define TRUES_FOR_SIDES [[west,true],[east,true],[resistance,true],[civilian,true]] //Spectator modes -#define MODE_FREE 0 -#define MODE_FPS 1 -#define MODE_FOLLOW 2 -#define ALL_MODES [MODE_FREE,MODE_FPS,MODE_FOLLOW] +#define MODE_FREE 0 +#define MODE_FPS 1 +#define MODE_FOLLOW 2 +#define ALL_MODES [MODE_FREE,MODE_FPS,MODE_FOLLOW] //Times From b67103533a7cbd475d23454037e79b0573a9e8de Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 15:55:15 +0300 Subject: [PATCH 194/228] Remove test log --- addons/main/XEH_preInit_server.sqf | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/main/XEH_preInit_server.sqf b/addons/main/XEH_preInit_server.sqf index 7421941..c6b0dd2 100644 --- a/addons/main/XEH_preInit_server.sqf +++ b/addons/main/XEH_preInit_server.sqf @@ -13,6 +13,5 @@ if (AAR_IS_ENABLED) then { [QGVAR(AAR_UpdateEH), { params ["_obj","_varName","_value"]; [_obj, _varName, _value] call afi_aar2_fnc_addcustomdata; - LOG("AAR custom data lisätty"); }] call CBA_fnc_addEventHandler; }; \ No newline at end of file From b441faac265f63d50f5a19c428f11a8b6303aabe Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 15:56:25 +0300 Subject: [PATCH 195/228] add check for objnull --- addons/respawn/functions/fnc_teleportUnit.sqf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/respawn/functions/fnc_teleportUnit.sqf b/addons/respawn/functions/fnc_teleportUnit.sqf index 67d3b25..7cbde30 100644 --- a/addons/respawn/functions/fnc_teleportUnit.sqf +++ b/addons/respawn/functions/fnc_teleportUnit.sqf @@ -24,6 +24,8 @@ params [["_unit", objNull, [objNull]], ["_godModeLenght", 30, [0]] ]; +if (_unit isEqualTo objNull) exitWith {LOG("unit was objnull when teleporting")}; + if (_godMode) then { player allowDamage false; LOG("Enable god mode"); From b80388471c412b91f4a81bd7270a2aa1c26f8ebf Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 15:59:40 +0300 Subject: [PATCH 196/228] use right cba function --- addons/msp/initSettings.inc.sqf | 70 ++++++++++++------------- addons/respawn/initSettings.inc.sqf | 80 ++++++++++++++--------------- 2 files changed, 75 insertions(+), 75 deletions(-) diff --git a/addons/msp/initSettings.inc.sqf b/addons/msp/initSettings.inc.sqf index 5d12acc..8245f26 100644 --- a/addons/msp/initSettings.inc.sqf +++ b/addons/msp/initSettings.inc.sqf @@ -7,7 +7,7 @@ 1, {}, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(allowCheckTicketsMSP), @@ -18,7 +18,7 @@ 1, {}, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(reportEnemiesEnabledWest), @@ -34,7 +34,7 @@ GVAR(contestValuesHash) set [west, _array]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(reportEnemiesEnabledEast), @@ -50,7 +50,7 @@ GVAR(contestValuesHash) set [east, _array]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(reportEnemiesEnabledResistance), @@ -66,7 +66,7 @@ GVAR(contestValuesHash) set [resistance, _array]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(reportEnemiesEnabledCivilian), @@ -82,7 +82,7 @@ GVAR(contestValuesHash) set [civilian, _array]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(reportEnemiesIntervalWest), @@ -100,7 +100,7 @@ GVAR(contestValuesHash) set [west, _array]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(reportEnemiesIntervalEast), @@ -118,7 +118,7 @@ GVAR(contestValuesHash) set [east, _array]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(reportEnemiesIntervalResistance), @@ -136,7 +136,7 @@ GVAR(contestValuesHash) set [resistance, _array]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(reportEnemiesIntervalCivilian), @@ -155,7 +155,7 @@ GVAR(contestValuesHash) set [civilian, _array]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(reportEnemiesRangeWest), @@ -173,7 +173,7 @@ GVAR(contestValuesHash) set [west, _array]; }, false -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(reportEnemiesRangeEast), @@ -191,7 +191,7 @@ GVAR(contestValuesHash) set [east, _array]; }, false -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(reportEnemiesRangeResistance), @@ -209,7 +209,7 @@ GVAR(contestValuesHash) set [resistance, _array]; }, false -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(reportEnemiesRangeCivilian), @@ -227,7 +227,7 @@ GVAR(contestValuesHash) set [civilian, _array]; }, false -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(contestedRadiusMaxWest), @@ -245,7 +245,7 @@ GVAR(contestValuesHash) set [west, _array]; }, false -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(contestedRadiusMaxEast), @@ -263,7 +263,7 @@ GVAR(contestValuesHash) set [east, _array]; }, false -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(contestedRadiusMaxResistance), @@ -281,7 +281,7 @@ GVAR(contestValuesHash) set [resistance, _array]; }, false -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(contestedRadiusMaxCivilian), @@ -299,7 +299,7 @@ GVAR(contestValuesHash) set [civilian, _array]; }, false -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(contestedRadiusMinWest), @@ -317,7 +317,7 @@ GVAR(contestValuesHash) set [west, _array]; }, false -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(contestedRadiusMinEast), @@ -335,7 +335,7 @@ GVAR(contestValuesHash) set [east, _array]; }, false -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(contestedRadiusMinResistance), @@ -353,7 +353,7 @@ GVAR(contestValuesHash) set [resistance, _array]; }, false -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(contestedRadiusMinCivilian), @@ -371,7 +371,7 @@ GVAR(contestValuesHash) set [civilian, _array]; }, false -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(contestedCheckIntervalWest), @@ -389,7 +389,7 @@ GVAR(contestValuesHash) set [west, _array]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(contestedCheckIntervalEast), @@ -407,7 +407,7 @@ GVAR(contestValuesHash) set [west, _array]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(contestedCheckIntervalResistance), @@ -425,7 +425,7 @@ GVAR(contestValuesHash) set [resistance, _array]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(contestedCheckIntervalCivilian), @@ -443,7 +443,7 @@ GVAR(contestValuesHash) set [civilian, _array]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(progresbarTimeSetup), @@ -457,7 +457,7 @@ GVAR(progresbarTimeSetup) = round _value; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(progresbarTimePack), @@ -471,7 +471,7 @@ GVAR(progresbarTimePack) = round _value; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(clasnamesEast), @@ -485,7 +485,7 @@ GVAR(classnamesHash) set [east , _value]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(clasnamesWest), @@ -499,7 +499,7 @@ GVAR(classnamesHash) set [west , _value]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(clasnamesResistance), @@ -513,7 +513,7 @@ GVAR(classnamesHash) set [resistance , _value]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(clasnamesCivilian), @@ -527,7 +527,7 @@ GVAR(classnamesHash) set [civilian , _value]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(setupNotification), @@ -538,7 +538,7 @@ 1, {}, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(contestedNotification), @@ -549,7 +549,7 @@ 1, {}, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(reportEnemiesNotification), @@ -560,4 +560,4 @@ 1, {}, true -] call CBA_Settings_fnc_init; \ No newline at end of file +] call CBA_fnc_addSetting; \ No newline at end of file diff --git a/addons/respawn/initSettings.inc.sqf b/addons/respawn/initSettings.inc.sqf index 02e71b9..774f852 100644 --- a/addons/respawn/initSettings.inc.sqf +++ b/addons/respawn/initSettings.inc.sqf @@ -7,7 +7,7 @@ 1, // 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) {}, // Script to execute when setting is changed. (optional) true //Setting will be marked as needing mission restart after being changed. (optional, default false) -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(killJIP), @@ -18,7 +18,7 @@ 1, {}, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(killJipTime), @@ -33,7 +33,7 @@ GVAR(killJipTime) = _value; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(respawnType), @@ -44,7 +44,7 @@ 1, {}, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(gearscriptType), @@ -55,7 +55,7 @@ 1, {}, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(forcedRespawn), @@ -66,7 +66,7 @@ 1, {}, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(delayedRespawn), @@ -81,7 +81,7 @@ GVAR(delayedRespawn) = _value; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(waitingAreaRange), @@ -96,7 +96,7 @@ GVAR(waitingAreaRange) = _value; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; //Wave times [ @@ -113,7 +113,7 @@ GVAR(waveLenghtTimesHash) set [west, _value]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(initialWaveTimeEast), @@ -129,7 +129,7 @@ GVAR(waveLenghtTimesHash) set [east, _value]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(initialWaveTimeResistance), @@ -145,7 +145,7 @@ GVAR(waveLenghtTimesHash) set [resistance, _value]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(initialWaveTimeCivilian), @@ -161,7 +161,7 @@ GVAR(waveLenghtTimesHash) set [civilian, _value]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; //Spectator camera modes [ @@ -178,7 +178,7 @@ }; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(spectateCameramode3th), @@ -194,7 +194,7 @@ }; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(spectateCameramodeFree), @@ -210,7 +210,7 @@ }; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; //allow spectate west [ @@ -229,7 +229,7 @@ }; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(allowWestSpectateResistance), @@ -247,7 +247,7 @@ }; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(allowWestSpectateCivilian), @@ -265,7 +265,7 @@ }; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; //allow spectate east [ @@ -284,7 +284,7 @@ }; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(allowEastSpectateResistance), @@ -302,7 +302,7 @@ }; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(allowEastSpectateCivilian), @@ -320,7 +320,7 @@ }; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; //allow spectate resistance [ @@ -339,7 +339,7 @@ }; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(allowResistanceSpectateEast), @@ -357,7 +357,7 @@ }; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ @@ -376,7 +376,7 @@ }; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; //allow spectate civilians [ @@ -395,7 +395,7 @@ }; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(allowCivilianSpectateEast), @@ -413,7 +413,7 @@ }; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ @@ -432,7 +432,7 @@ }; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; //Ticket count [ @@ -449,7 +449,7 @@ GVAR(ticketsHash) set [west, _value]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(initialTicketsEast), @@ -465,7 +465,7 @@ GVAR(ticketsHash) set [east, _value]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(initialTicketsResistance), @@ -481,7 +481,7 @@ GVAR(ticketsHash) set [resistance, _value]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(initialTicketsCivilian), @@ -497,7 +497,7 @@ GVAR(ticketsHash) set [civilian, _value]; }, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(allowCheckTicketsBase), @@ -508,7 +508,7 @@ 1, {}, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; //Briefing notes [ @@ -520,7 +520,7 @@ 1, {}, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(briefingEnableShowRespawnType), @@ -531,7 +531,7 @@ 1, {}, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(briefingEnableShowTickets), @@ -542,7 +542,7 @@ 1, {}, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(briefingEnableShowTime), @@ -553,7 +553,7 @@ 1, {}, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(briefingEnableShowOtherSidesDataWest), @@ -564,7 +564,7 @@ 1, {}, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(briefingEnableShowOtherSidesDataEast), @@ -575,7 +575,7 @@ 1, {}, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(briefingEnableShowOtherSidesDataResistance), @@ -586,7 +586,7 @@ 1, {}, true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(briefingEnableShowOtherSidesDataCivilian), @@ -597,4 +597,4 @@ 1, {}, true -] call CBA_Settings_fnc_init; \ No newline at end of file +] call CBA_fnc_addSetting; \ No newline at end of file From 5919978894d380961553fe429a4a9bec09eea305 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 16:34:54 +0300 Subject: [PATCH 197/228] move events to postInit --- addons/main/CfgEventHandlers.hpp | 7 +------ .../{XEH_preInit_server.sqf => XEH_postInit_server.sqf} | 0 2 files changed, 1 insertion(+), 6 deletions(-) rename addons/main/{XEH_preInit_server.sqf => XEH_postInit_server.sqf} (100%) diff --git a/addons/main/CfgEventHandlers.hpp b/addons/main/CfgEventHandlers.hpp index bd480e9..2db3398 100644 --- a/addons/main/CfgEventHandlers.hpp +++ b/addons/main/CfgEventHandlers.hpp @@ -1,11 +1,6 @@ -class Extended_PreInit_EventHandlers { - class ADDON { - serverInit = QUOTE(call COMPILE_FILE(XEH_preInit_server)); - }; -}; - class Extended_PostInit_EventHandlers { class ADDON { + serverInit = QUOTE(call COMPILE_FILE(XEH_postInit_server)); clientInit = QUOTE(call COMPILE_FILE(XEH_postInit_client)); }; }; \ No newline at end of file diff --git a/addons/main/XEH_preInit_server.sqf b/addons/main/XEH_postInit_server.sqf similarity index 100% rename from addons/main/XEH_preInit_server.sqf rename to addons/main/XEH_postInit_server.sqf From c6a557c6fdefbb12d5653f9f0031040bee8f50f2 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 17:20:48 +0300 Subject: [PATCH 198/228] fix broken file --- addons/msp/Stringtable.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/msp/Stringtable.xml b/addons/msp/Stringtable.xml index bbc64c3..43c514c 100644 --- a/addons/msp/Stringtable.xml +++ b/addons/msp/Stringtable.xml @@ -48,7 +48,6 @@ You can check remaining tickets from MSP using ACE actions. You can check remaining tickets from MSP using ACE actions. - ip the next respawn wave.
Check if MSP is contested From eac7a9b7e68b3e35fca7b28bfb24fa3855ebab33 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 17:21:23 +0300 Subject: [PATCH 199/228] Fix briefing wave time --- addons/respawn/Stringtable.xml | 16 ++++++++-------- addons/respawn/functions/fnc_briefingNotes.sqf | 17 +++++++++++++---- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/addons/respawn/Stringtable.xml b/addons/respawn/Stringtable.xml index 9b5e170..9f8ed7f 100644 --- a/addons/respawn/Stringtable.xml +++ b/addons/respawn/Stringtable.xml @@ -142,20 +142,20 @@ You can check remaining tickets from the main base (flagpole) using ACE actions. - For <font color="#0000FF">West</font> is %2min - For <font color="#0000FF">West</font> is %2min + For <font color="#0000FF">West</font> is %2 min + For <font color="#0000FF">West</font> is %2 min - For <font color="#E60000">East</font> is %2min - For <font color="#E60000">East</font> is %2min + For <font color="#E60000">East</font> is %2 min + For <font color="#E60000">East</font> is %2 min - For <font color="#00CC00">Resistance</font> is %2min - For <font color="#00CC00">Resistance</font> is %2min + For <font color="#00CC00">Resistance</font> is %2 min + For <font color="#00CC00">Resistance</font> is %2 min - For <font color="#B040A7">Civilian</font> is %2min - For <font color="#B040A7">Civilian</font> is %2min + For <font color="#B040A7">Civilian</font> is %2 min + For <font color="#B040A7">Civilian</font> is %2 min Tickets diff --git a/addons/respawn/functions/fnc_briefingNotes.sqf b/addons/respawn/functions/fnc_briefingNotes.sqf index 3d2a5db..373634a 100644 --- a/addons/respawn/functions/fnc_briefingNotes.sqf +++ b/addons/respawn/functions/fnc_briefingNotes.sqf @@ -37,21 +37,30 @@ if (GVAR(briefingEnableShowRespawnType)) then { if (GVAR(briefingEnableShowTime)) then { private _waveLenghtTimeHash = GVAR(waveLenghtTimesHash); + _text = format ["%1

Wave interval",_text]; if (playerSide isEqualTo west || GVAR(briefingEnableShowOtherSidesDataWest)) then { - _text = format ["%1
- "+LLSTRING(Briefing_WaveTime_west),_text, _waveLenghtTimeHash get west]; + private _waveTime = _waveLenghtTimeHash get west; + _waveTime = [_waveTime, "M:SS"] call CBA_fnc_formatElapsedTime; + _text = format ["%1
- "+LLSTRING(Briefing_WaveTime_west),_text,_waveTime]; }; if (playerSide isEqualTo east || GVAR(briefingEnableShowOtherSidesDataEast)) then { - _text = format ["%1
- "+LLSTRING(Briefing_WaveTime_east),_text,_waveLenghtTimeHash get east]; + private _waveTime = _waveLenghtTimeHash get east; + _waveTime = [_waveTime, "M:SS"] call CBA_fnc_formatElapsedTime; + _text = format ["%1
- "+LLSTRING(Briefing_WaveTime_east),_text,_waveTime]; }; if (playerSide isEqualTo resistance || GVAR(briefingEnableShowOtherSidesDataResistance)) then { - _text = format ["%1
- "+LLSTRING(Briefing_WaveTime_resistance),_text, _waveLenghtTimeHash get resistance]; + private _waveTime = _waveLenghtTimeHash get resistance; + _waveTime = [_waveTime, "M:SS"] call CBA_fnc_formatElapsedTime; + _text = format ["%1
- "+LLSTRING(Briefing_WaveTime_resistance),_text,_waveTime]; }; if (playerSide isEqualTo civilian || GVAR(briefingEnableShowOtherSidesDataCivilian)) then { - _text = format ["%1
- "+LLSTRING(Briefing_WaveTime_civilian),_text, _waveLenghtTimeHash get civilian]; + private _waveTime = _waveLenghtTimeHash get civilian; + _waveTime = [_waveTime, "M:SS"] call CBA_fnc_formatElapsedTime; + _text = format ["%1
- "+LLSTRING(Briefing_WaveTime_civilian),_text,_waveTime]; }; private _delayedRespawn = GVAR(delayedRespawn); From d544ad8fac4f71012480653e6fb1514af9f43c6b Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 17:21:42 +0300 Subject: [PATCH 200/228] test logs --- addons/main/script_macros.hpp | 3 ++- .../msp/functions/fnc_updateDeployementStatus.sqf | 4 +++- addons/respawn/functions/fnc_doRespawnWave.sqf | 14 +++++++------- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index a055870..8fb3dd4 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -20,7 +20,8 @@ //AAR update macro #define AAR_UPDATE(OBJ,VARNAME,VALUE) [QEGVAR(main,AAR_UpdateEH), [OBJ,VARNAME,VALUE]] call CBA_fnc_serverEvent //AAR event -#define AAR_EVENT(TEXT,INSTIGATOR,TARGET,POI) LOG("AAR eventti macro"); [QEGVAR(main,AAR_EventEH), [TEXT,INSTIGATOR,TARGET,POI]] call CBA_fnc_serverEvent +//params ["_text", ["_instigator", objNull], ["_target", objNull], ["_poi", [0, 0, 0]]]; +#define AAR_EVENT(TEXT,INSTIGATOR,TARGET,POI) LOG("AAR eventti macro"); ok = [TEXT,INSTIGATOR,TARGET,POI]; [QEGVAR(main,AAR_EventEH), [TEXT,INSTIGATOR,TARGET,POI]] call CBA_fnc_serverEvent #define ALL_SIDES [west,east,resistance,civilian] diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index 8d1f3e4..e000293 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -64,8 +64,10 @@ publicVariable QGVAR(activeVehicleHash); if (AAR_IS_ENABLED) then { private _text = localize([ELSTRING(main,AAR_MSP_Packed),ELSTRING(main,AAR_MSP_Deployed)] select _setup); _text = format[_text, _side]; - + LOG("Do deployement event"); AAR_EVENT(_text,_msp,_player,nil); +} else { + LOG("fucked up"); }; //Change deployement status diff --git a/addons/respawn/functions/fnc_doRespawnWave.sqf b/addons/respawn/functions/fnc_doRespawnWave.sqf index e565387..18a1b21 100644 --- a/addons/respawn/functions/fnc_doRespawnWave.sqf +++ b/addons/respawn/functions/fnc_doRespawnWave.sqf @@ -85,14 +85,14 @@ if (count _waitingRespawn > 0) then { [QGVAR(EH_respawnWave), [_side, _waitingRespawn]] call CBA_fnc_serverEvent; -if (AAR_IS_ENABLED) then { - private _text = if (GVAR(respawnType) isEqualTo 1) then { - format[LELSTRING(main,AAR_RespawnWaveTickets), str _side, _waitingRespawnCount, _totalRespawnCount, [_side] call FUNC(getTicketCount)] - } else { - format[LELSTRING(main,AAR_RespawnWave), str _side, _waitingRespawnCount, _totalRespawnCount] + if (AAR_IS_ENABLED) then { + private _text = if (GVAR(respawnType) isEqualTo 1) then { + format[LELSTRING(main,AAR_RespawnWaveTickets), str _side, _waitingRespawnCount, _totalRespawnCount, [_side] call FUNC(getTicketCount)] + } else { + format[LELSTRING(main,AAR_RespawnWave), str _side, _waitingRespawnCount, _totalRespawnCount] + }; + AAR_EVENT(_text,_msp,nil,nil); }; - AAR_EVENT(_text,_msp,nil,nil); -}; } else { //No one at respawn From 4e96cdb4e693e643402b23f06e5298fc7810bdce Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 17:21:53 +0300 Subject: [PATCH 201/228] Update script_version.hpp --- addons/main/script_version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index c9e2340..11b2893 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 1 #define MINOR 8 #define PATCH 0 -#define BUILD 10 \ No newline at end of file +#define BUILD 11 \ No newline at end of file From ed42a6606a84051afe5503b18d6e45aa4eade2cd Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 18:40:25 +0300 Subject: [PATCH 202/228] Fix aar enabled check --- addons/main/XEH_postInit_server.sqf | 9 +++++---- addons/main/script_macros.hpp | 5 ++--- addons/msp/functions/fnc_contestedCheck.sqf | 8 ++++---- addons/msp/functions/fnc_updateDeployementStatus.sqf | 11 ++++------- addons/respawn/XEH_postInit_server.sqf | 2 +- addons/respawn/functions/fnc_doRespawnWave.sqf | 2 +- 6 files changed, 17 insertions(+), 20 deletions(-) diff --git a/addons/main/XEH_postInit_server.sqf b/addons/main/XEH_postInit_server.sqf index c6b0dd2..d8e6a2a 100644 --- a/addons/main/XEH_postInit_server.sqf +++ b/addons/main/XEH_postInit_server.sqf @@ -1,15 +1,16 @@ #include "script_component.hpp" //only executed on server -if (AAR_IS_ENABLED) then { - LOG("AAR eventit tulille"); +private _aarEnabled = !isNil "afi_aar2"; +GVAR(AAR_Enabled) = _aarEnabled; +publicVariable QGVAR(AAR_Enabled); + +if (_aarEnabled) then { [QGVAR(AAR_EventEH), { params ["_text","_instigator","_target","_poi"]; [_text,_instigator,_target,_poi] call afi_aar2_fnc_addCustomEvent; - LOG("AAR custom eventti lisätty"); }] call CBA_fnc_addEventHandler; - [QGVAR(AAR_UpdateEH), { params ["_obj","_varName","_value"]; [_obj, _varName, _value] call afi_aar2_fnc_addcustomdata; diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 8fb3dd4..2523887 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -15,13 +15,12 @@ #define MARKER_NAME(var1) FORMAT_2("%1_%2",QUOTE(ADDON),var1) -//AAR enabled check -#define AAR_IS_ENABLED !isNil "afi_aar2" + //AAR update macro #define AAR_UPDATE(OBJ,VARNAME,VALUE) [QEGVAR(main,AAR_UpdateEH), [OBJ,VARNAME,VALUE]] call CBA_fnc_serverEvent //AAR event //params ["_text", ["_instigator", objNull], ["_target", objNull], ["_poi", [0, 0, 0]]]; -#define AAR_EVENT(TEXT,INSTIGATOR,TARGET,POI) LOG("AAR eventti macro"); ok = [TEXT,INSTIGATOR,TARGET,POI]; [QEGVAR(main,AAR_EventEH), [TEXT,INSTIGATOR,TARGET,POI]] call CBA_fnc_serverEvent +#define AAR_EVENT(TEXT,INSTIGATOR,TARGET,POI) [QEGVAR(main,AAR_EventEH), [TEXT,INSTIGATOR,TARGET,POI]] call CBA_fnc_serverEvent #define ALL_SIDES [west,east,resistance,civilian] diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index 65a04ce..d608504 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -64,11 +64,11 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { if (_oldContestedStatus isNotEqualTo _isContested) then { - if (AAR_IS_ENABLED) then { - private _text = (localize([ELSTRING(main,AAR_MSP_notContested),ELSTRING(main,AAR_MSP_isContested)] select _isContested)); - _text = format[_text, _side]; + if (EGVAR(main,AAR_Enabled)) then { + private _aarText = (localize([ELSTRING(main,AAR_MSP_notContested),ELSTRING(main,AAR_MSP_isContested)] select _isContested)); + _aarText = format[_aarText, _side]; - AAR_EVENT(_text,_msp,nil,nil); + AAR_EVENT(_aarText,_msp,nil,nil); AAR_UPDATE(_msp,"Is contested",_isContested); }; diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index e000293..02bac86 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -61,13 +61,10 @@ publicVariable QGVAR(deployementStatusHash); GVAR(activeVehicleHash) set [_side, [objNull, _msp] select _setup]; publicVariable QGVAR(activeVehicleHash); -if (AAR_IS_ENABLED) then { - private _text = localize([ELSTRING(main,AAR_MSP_Packed),ELSTRING(main,AAR_MSP_Deployed)] select _setup); - _text = format[_text, _side]; - LOG("Do deployement event"); - AAR_EVENT(_text,_msp,_player,nil); -} else { - LOG("fucked up"); +if (EGVAR(main,AAR_Enabled)) then { + private _aarText = localize([ELSTRING(main,AAR_MSP_Packed),ELSTRING(main,AAR_MSP_Deployed)] select _setup); + _aarText = format[_aarText, _side]; + AAR_EVENT(_aarText,_msp,_player,nil); }; //Change deployement status diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 6357a97..f3fdc2e 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -34,7 +34,7 @@ addMissionEventHandler ["HandleDisconnect", { }]; //AAR times -if ( AAR_IS_ENABLED ) then { +if ( EGVAR(main,AAR_Enabled) ) then { [{cba_missiontime > 10}, { if (missionNamespace getVariable ["afi_aar2", false]) then { diff --git a/addons/respawn/functions/fnc_doRespawnWave.sqf b/addons/respawn/functions/fnc_doRespawnWave.sqf index 18a1b21..bbb76cf 100644 --- a/addons/respawn/functions/fnc_doRespawnWave.sqf +++ b/addons/respawn/functions/fnc_doRespawnWave.sqf @@ -85,7 +85,7 @@ if (count _waitingRespawn > 0) then { [QGVAR(EH_respawnWave), [_side, _waitingRespawn]] call CBA_fnc_serverEvent; - if (AAR_IS_ENABLED) then { + if (EGVAR(main,AAR_Enabled)) then { private _text = if (GVAR(respawnType) isEqualTo 1) then { format[LELSTRING(main,AAR_RespawnWaveTickets), str _side, _waitingRespawnCount, _totalRespawnCount, [_side] call FUNC(getTicketCount)] } else { From 964c78a14fc9a0a92af1c6d9cddd3bf5bf9d574c Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 18:45:58 +0300 Subject: [PATCH 203/228] prevent text flickering --- addons/respawn/functions/fnc_waitingArea.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 3274682..9685f13 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -88,7 +88,7 @@ GVAR(waitingAreaPFH) = [{ _text = format["%1
%2 %3", _text, _ticketsTypeText, _tickets]; }; - [_text,0,0,1,0] spawn BIS_fnc_dynamicText; + [_text,0,0,4,0] spawn BIS_fnc_dynamicText; //make sure that player is still in area if !(player inArea [_respawnWaitingarea, _waitingRange, _waitingRange, 0, false]) then { From e6cc212c858984bda698c216deb188d7c6fc9d58 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 19:50:54 +0300 Subject: [PATCH 204/228] use cutText --- addons/respawn/functions/fnc_blackscreen.sqf | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/addons/respawn/functions/fnc_blackscreen.sqf b/addons/respawn/functions/fnc_blackscreen.sqf index a1062a7..3076135 100644 --- a/addons/respawn/functions/fnc_blackscreen.sqf +++ b/addons/respawn/functions/fnc_blackscreen.sqf @@ -19,25 +19,24 @@ params [["_text",""],["_duration", 10]]; ["",-1, -1, 1] spawn BIS_fnc_dynamicText; -[format [" %1", _text],-1, -1, _duration] spawn BIS_fnc_dynamicText; - -_camera = "camera" camCreate [(getPosASL player select 0),(getPosASL player select 1),100]; +private _camera = "camera" camCreate [(getPosASL player select 0),(getPosASL player select 1),100]; _camera cameraEffect ["internal","back"]; _camera camSetFov 0.700; _camera camSetTarget player; _camera camCommit 0; - [{camCommitted (_this select 2)}, { _this params ["_text", "_duration", "_camera"]; + + _text = format [" %1", _text]; playSound "scoreAdded"; - cutText["", "BLACK FADED", 999]; + QGVAR(tpCutLayer) cutText [_text, "BLACK FADED", _duration, true, true]; [{ player cameraEffect ["terminate","back"]; camDestroy _camera; - cutText["", "BLACK IN", 5]; + QGVAR(tpCutLayer) cutText ["", "BLACK IN", 5]; }, [], _duration] call CBA_fnc_waitAndExecute; }, [_text, _duration, _camera]] call CBA_fnc_waitUntilAndExecute; \ No newline at end of file From 5a917ac2844431c7e0c56f1c093b6ec447f30258 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 19:51:11 +0300 Subject: [PATCH 205/228] run only for clients --- addons/respawn/functions/fnc_forceRespawnPlayer.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/respawn/functions/fnc_forceRespawnPlayer.sqf b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf index 4117657..7401bbe 100644 --- a/addons/respawn/functions/fnc_forceRespawnPlayer.sqf +++ b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf @@ -13,6 +13,7 @@ * [] call tunres_Respawn_fnc_forceRespawnPlayer */ #include "script_component.hpp" +if (!hasInterface) exitWith { }; if !(player getVariable [QGVAR(isWaitingRespawn),false]) exitWith { ERROR("Tried to force respawn unit, whichs is not at respawn"); From b6b7b85e340229f09be7d22dbc89d8922fa6924e Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 19:51:30 +0300 Subject: [PATCH 206/228] Fix missing stringtable entry --- addons/respawn/Stringtable.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/respawn/Stringtable.xml b/addons/respawn/Stringtable.xml index 9f8ed7f..039d91f 100644 --- a/addons/respawn/Stringtable.xml +++ b/addons/respawn/Stringtable.xml @@ -85,6 +85,10 @@ Remaining tickets for your side: Remaining tickets for your side:
+ + Your remaining tickets: + Your remaining tickets: + You are respawning! Please standby. You are respawning! Please standby. From 637ad681dec013378a0dcf5e4d91fd39ef747ff8 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 24 Sep 2024 19:54:18 +0300 Subject: [PATCH 207/228] Update script_version.hpp --- addons/main/script_version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index 11b2893..3f96b62 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 1 #define MINOR 8 #define PATCH 0 -#define BUILD 11 \ No newline at end of file +#define BUILD 12 \ No newline at end of file From 878da7823479dfe3421cc24c9699bb46c5de4666 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Mon, 30 Sep 2024 17:10:36 +0300 Subject: [PATCH 208/228] fix force respawn reset time --- addons/respawn/functions/fnc_forceRespawnWave.sqf | 2 +- addons/respawn/functions/fnc_timer.sqf | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/addons/respawn/functions/fnc_forceRespawnWave.sqf b/addons/respawn/functions/fnc_forceRespawnWave.sqf index 19a2738..f890c17 100644 --- a/addons/respawn/functions/fnc_forceRespawnWave.sqf +++ b/addons/respawn/functions/fnc_forceRespawnWave.sqf @@ -26,5 +26,5 @@ AAR_EVENT(_text,nil,nil,nil); [_side, true] call FUNC(doRespawnWave); if (_reset && { !(GVAR(forcedRespawn)) }) then { - [_side] call FUNC(timer); + [_side,true] call FUNC(timer); }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_timer.sqf b/addons/respawn/functions/fnc_timer.sqf index 2f120ba..560b7e5 100644 --- a/addons/respawn/functions/fnc_timer.sqf +++ b/addons/respawn/functions/fnc_timer.sqf @@ -13,7 +13,7 @@ * [west] call tunres_Respawn_fnc_timer */ #include "script_component.hpp" -params [["_side", nil, [west]]]; +params [["_side", nil, [west]], ["_resetTimer", false, [true]]]; if (!isServer) exitWith { }; @@ -21,7 +21,9 @@ if (GVAR(forcedRespawn)) exitWith { INFO("No timer, Only forced waves"); }; private _hashWaitTime = GVAR(nextWaveTimesHash); private _hashWaveLenght = GVAR(waveLenghtTimesHash); -private _time = round ((_hashWaitTime get _side) + (_hashWaveLenght get _side)); +private _waveLenght = _hashWaveLenght get _side; +private _time = [(_hashWaitTime get _side), cba_missiontime] select _resetTime; +_time = round (_time + _waveLenght); _hashWaitTime set [_side, _time]; publicVariable QGVAR(nextWaveTimesHash); From 2acad15aede77f10852fc38b8b36cf1e0dd5b775 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Mon, 30 Sep 2024 17:26:06 +0300 Subject: [PATCH 209/228] fix wrong params --- addons/respawn/XEH_postInit_server.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index f3fdc2e..3ba3474 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -81,7 +81,7 @@ if ( EGVAR(main,AAR_Enabled) ) then { [QGVAR(updateRespawnPointEH), { params [["_side", nil, [west]], ["_update", false, [true]], ["_newPos", [0,0,0], [[]]]]; - [_side, _setup, _pos] call FUNC(updateRespawnPoint); + [_side, _update, _newPos] call FUNC(updateRespawnPoint); }] call CBA_fnc_addEventHandler; [QGVAR(updateWaitingRespawnListEH), { From ace4a7edb21ce809d5b85d0742ffd1717df60be0 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Mon, 30 Sep 2024 17:52:17 +0300 Subject: [PATCH 210/228] fix aar to show player instead of msp --- addons/msp/functions/fnc_updateDeployementStatus.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index 02bac86..924e4c0 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -64,7 +64,7 @@ publicVariable QGVAR(activeVehicleHash); if (EGVAR(main,AAR_Enabled)) then { private _aarText = localize([ELSTRING(main,AAR_MSP_Packed),ELSTRING(main,AAR_MSP_Deployed)] select _setup); _aarText = format[_aarText, _side]; - AAR_EVENT(_aarText,_msp,_player,nil); + AAR_EVENT(_aarText,_player,nil,nil); }; //Change deployement status From 2c84c5e1bab8b7a8d58cc450c0c38b0b4d49a09c Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Mon, 30 Sep 2024 17:52:24 +0300 Subject: [PATCH 211/228] Update script_version.hpp --- addons/main/script_version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index 3f96b62..3e01fbb 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 1 #define MINOR 8 #define PATCH 0 -#define BUILD 12 \ No newline at end of file +#define BUILD 13 \ No newline at end of file From f5407ebebdfc405098f7299a7dee25a4814a27c4 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Mon, 30 Sep 2024 19:03:29 +0300 Subject: [PATCH 212/228] fix typo variable --- addons/main/script_version.hpp | 2 +- addons/respawn/functions/fnc_timer.sqf | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index 3e01fbb..8bb3336 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 1 #define MINOR 8 #define PATCH 0 -#define BUILD 13 \ No newline at end of file +#define BUILD 14 \ No newline at end of file diff --git a/addons/respawn/functions/fnc_timer.sqf b/addons/respawn/functions/fnc_timer.sqf index 560b7e5..a91e760 100644 --- a/addons/respawn/functions/fnc_timer.sqf +++ b/addons/respawn/functions/fnc_timer.sqf @@ -20,9 +20,8 @@ if (!isServer) exitWith { }; if (GVAR(forcedRespawn)) exitWith { INFO("No timer, Only forced waves"); }; private _hashWaitTime = GVAR(nextWaveTimesHash); -private _hashWaveLenght = GVAR(waveLenghtTimesHash); -private _waveLenght = _hashWaveLenght get _side; -private _time = [(_hashWaitTime get _side), cba_missiontime] select _resetTime; +private _waveLenght = GVAR(waveLenghtTimesHash) get _side; +private _time = [(_hashWaitTime get _side), cba_missiontime] select _resetTimer; _time = round (_time + _waveLenght); _hashWaitTime set [_side, _time]; From 9f42e6766466d90d130a429cc9f4714be3bd0595 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Mon, 30 Sep 2024 19:25:44 +0300 Subject: [PATCH 213/228] fix update respawn point eh for contested --- addons/msp/functions/fnc_contestedCheck.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index d608504..58dba8c 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -75,10 +75,10 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { GVAR(contestedStatusHash) set [_side, _isContested]; publicVariable QGVAR(contestedStatusHash); _msp setVariable [QGVAR(isContested), _isContested, true]; + [QEGVAR(respawn,updateRespawnPointEH), [_side, !_isContested, _pos]] call CBA_fnc_serverEvent; private _whoToNotify = [_side, GVAR(contestedNotification)] call FUNC(whoToNotify); if (_whoToNotify isNotEqualTo [] ) then { - [QEGVAR(respawn,updateRespawnPointEH), [_side, !_isContested]] call CBA_fnc_serverEvent; private _text = if (_isContested) then { LLSTRING(FNC_Contested_hint) From 04d330639abea7e55cda9afb94d8acf7a963e001 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Mon, 30 Sep 2024 19:58:56 +0300 Subject: [PATCH 214/228] Update script_version.hpp --- addons/main/script_version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index 8bb3336..3af49d2 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 1 #define MINOR 8 #define PATCH 0 -#define BUILD 14 \ No newline at end of file +#define BUILD 15 \ No newline at end of file From de3c54585501871e2da87c91d7aaa9825b27cbb3 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 4 Oct 2024 16:23:14 +0300 Subject: [PATCH 215/228] Fix stringtables --- addons/main/Stringtable.xml | 29 ------------------- addons/msp/Stringtable.xml | 8 +++++ addons/msp/functions/fnc_contestedCheck.sqf | 2 +- .../functions/fnc_updateDeployementStatus.sqf | 4 +-- addons/respawn/Stringtable.xml | 8 ----- .../respawn/functions/fnc_doRespawnWave.sqf | 4 +-- .../functions/fnc_forceRespawnPlayer.sqf | 2 +- .../functions/fnc_forceRespawnWave.sqf | 2 +- addons/respawn/functions/fnc_waitingArea.sqf | 2 +- 9 files changed, 16 insertions(+), 45 deletions(-) delete mode 100644 addons/main/Stringtable.xml diff --git a/addons/main/Stringtable.xml b/addons/main/Stringtable.xml deleted file mode 100644 index 2c392a1..0000000 --- a/addons/main/Stringtable.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - __%1__ deployed MSP by __inst__. - __%1__ deployed MSP by __inst__. - - - __%1__ packed MSP by __inst__. - __%1__ packed MSP by __inst__. - - - __%1__ MSP is contested - __%1__ MSP is contested - - - __%1__ MSP is no longer contested - __%1__ MSP is no longer contested - - - Respawn wave for __%1__. %2 units respawned. Total respawn count is %3. - Respawn wave for __%1__. %2 units respawned. Total respawn count is %3. - - - Respawn wave for __%1__. %2 units have respawned. Total respawns so far: %3. Remaining tickets: %4. - Respawn wave for __%1__. %2 units have respawned. Total respawns so far: %3. Remaining tickets: %4. - - - diff --git a/addons/msp/Stringtable.xml b/addons/msp/Stringtable.xml index 43c514c..d41cbef 100644 --- a/addons/msp/Stringtable.xml +++ b/addons/msp/Stringtable.xml @@ -269,5 +269,13 @@ Mobile Spawn Point (MSP) has been enabled for this mission, but your side does not have MSP. Mobile Spawn Point (MSP) has been enabled for this mission, but your side does not have MSP. + + MSP has been deployed!\nRespawn position has been updated. + MSP has been deployed!\nRespawn position has been updated. + + + MSP has been packed!\nRespawn position has been updated. + MSP has been packed!\nRespawn position has been updated. +
diff --git a/addons/msp/functions/fnc_contestedCheck.sqf b/addons/msp/functions/fnc_contestedCheck.sqf index 58dba8c..a02faf1 100644 --- a/addons/msp/functions/fnc_contestedCheck.sqf +++ b/addons/msp/functions/fnc_contestedCheck.sqf @@ -65,7 +65,7 @@ if ( _mspDeployementStatus && { !(isNull _msp) } ) then { if (_oldContestedStatus isNotEqualTo _isContested) then { if (EGVAR(main,AAR_Enabled)) then { - private _aarText = (localize([ELSTRING(main,AAR_MSP_notContested),ELSTRING(main,AAR_MSP_isContested)] select _isContested)); + private _aarText = ["__%1__ MSP is no longer contested","__%1__ MSP is contested"] select _isContested; _aarText = format[_aarText, _side]; AAR_EVENT(_aarText,_msp,nil,nil); diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index 924e4c0..94c9a50 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -47,7 +47,7 @@ if (_setup) then { private _whoToNotify = [_side, GVAR(setupNotification)] call FUNC(whoToNotify); if (_whoToNotify isNotEqualTo [] ) then { - private _text = localize ([LSTRING(FNC_pack_notification), LSTRING(FNC_setup_notification)] select _setup); + private _text = localize ([LSTRING(pack_notification), LSTRING(setup_notification)] select _setup); [QEGVAR(main,doNotification), [_text], _whoToNotify] call CBA_fnc_targetEvent; }; @@ -62,7 +62,7 @@ GVAR(activeVehicleHash) set [_side, [objNull, _msp] select _setup]; publicVariable QGVAR(activeVehicleHash); if (EGVAR(main,AAR_Enabled)) then { - private _aarText = localize([ELSTRING(main,AAR_MSP_Packed),ELSTRING(main,AAR_MSP_Deployed)] select _setup); + private _aarText = ["__%1__ packed MSP by __inst__.","__%1__ deployed MSP by __inst__."] select _setup; _aarText = format[_aarText, _side]; AAR_EVENT(_aarText,_player,nil,nil); }; diff --git a/addons/respawn/Stringtable.xml b/addons/respawn/Stringtable.xml index 039d91f..26e54cf 100644 --- a/addons/respawn/Stringtable.xml +++ b/addons/respawn/Stringtable.xml @@ -193,14 +193,6 @@ Get over here! Get over here!
- - __inst__ has been force respawned. - __inst__ has been force respawned. - - - __%1__ has been force respawned. - __%1__ has been force respawned. - Remaining time until respawn Remaining time until respawn diff --git a/addons/respawn/functions/fnc_doRespawnWave.sqf b/addons/respawn/functions/fnc_doRespawnWave.sqf index bbb76cf..e46c1ab 100644 --- a/addons/respawn/functions/fnc_doRespawnWave.sqf +++ b/addons/respawn/functions/fnc_doRespawnWave.sqf @@ -87,9 +87,9 @@ if (count _waitingRespawn > 0) then { if (EGVAR(main,AAR_Enabled)) then { private _text = if (GVAR(respawnType) isEqualTo 1) then { - format[LELSTRING(main,AAR_RespawnWaveTickets), str _side, _waitingRespawnCount, _totalRespawnCount, [_side] call FUNC(getTicketCount)] + format["Respawn wave for __%1__. %2 units have respawned. Total respawns so far: %3. Remaining tickets: %4.", str _side, _waitingRespawnCount, _totalRespawnCount, [_side] call FUNC(getTicketCount)] } else { - format[LELSTRING(main,AAR_RespawnWave), str _side, _waitingRespawnCount, _totalRespawnCount] + format["Respawn wave for __%1__. %2 units respawned. Total respawn count is %3.", str _side, _waitingRespawnCount, _totalRespawnCount] }; AAR_EVENT(_text,_msp,nil,nil); }; diff --git a/addons/respawn/functions/fnc_forceRespawnPlayer.sqf b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf index 7401bbe..0205d1a 100644 --- a/addons/respawn/functions/fnc_forceRespawnPlayer.sqf +++ b/addons/respawn/functions/fnc_forceRespawnPlayer.sqf @@ -19,7 +19,7 @@ if !(player getVariable [QGVAR(isWaitingRespawn),false]) exitWith { ERROR("Tried to force respawn unit, whichs is not at respawn"); }; -AAR_EVENT(LLSTRING(playerForceRespawned),player,nil,nil); +AAR_EVENT("__inst__ has been force respawned.",player,nil,nil); player setVariable [QGVAR(skipNextWave), false, true]; diff --git a/addons/respawn/functions/fnc_forceRespawnWave.sqf b/addons/respawn/functions/fnc_forceRespawnWave.sqf index f890c17..f558823 100644 --- a/addons/respawn/functions/fnc_forceRespawnWave.sqf +++ b/addons/respawn/functions/fnc_forceRespawnWave.sqf @@ -19,7 +19,7 @@ if (!isServer) exitWith { }; params [["_side", nil, [east]], ["_reset", false, [false]]]; -private _text = format[(localize "STR_tunres_respawn_sideForceRespawned"),str _side]; +private _text = format["__%1__ has been force respawned.",str _side]; AAR_EVENT(_text,nil,nil,nil); diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 9685f13..00a109a 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -19,13 +19,13 @@ if (isDedicated || !(_playerSide in ALL_SIDES) ) exitWith { }; LOG("Start waiting area"); -//tell server to add this player to list if (!isNil QGVAR(uselesBody)) then { LOG("Delete old body"); deleteVehicle GVAR(uselesBody); GVAR(uselesBody) = nil; }; +//tell server to add this player to list [QGVAR(updateWaitingRespawnListEH), [player, true, _playerSide]] call CBA_fnc_serverEvent; private _respawnWaitingarea = (GVAR(waitingAreaHash) get _playerSide) select 1; From c2312c492dace5b7266b0446759cb30e9199de71 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 4 Oct 2024 16:27:11 +0300 Subject: [PATCH 216/228] add position to respawn aar event --- addons/respawn/functions/fnc_doRespawnWave.sqf | 3 ++- addons/respawn/functions/fnc_forceRespawnWave.sqf | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/respawn/functions/fnc_doRespawnWave.sqf b/addons/respawn/functions/fnc_doRespawnWave.sqf index e46c1ab..b771bf9 100644 --- a/addons/respawn/functions/fnc_doRespawnWave.sqf +++ b/addons/respawn/functions/fnc_doRespawnWave.sqf @@ -91,7 +91,8 @@ if (count _waitingRespawn > 0) then { } else { format["Respawn wave for __%1__. %2 units respawned. Total respawn count is %3.", str _side, _waitingRespawnCount, _totalRespawnCount] }; - AAR_EVENT(_text,_msp,nil,nil); + private _markerPos = getMarkerPos ((GVAR(respawnPointsHash) get _side) select 0); + AAR_EVENT(_text,nil,nil,_markerPos); }; } else { diff --git a/addons/respawn/functions/fnc_forceRespawnWave.sqf b/addons/respawn/functions/fnc_forceRespawnWave.sqf index f558823..7952c86 100644 --- a/addons/respawn/functions/fnc_forceRespawnWave.sqf +++ b/addons/respawn/functions/fnc_forceRespawnWave.sqf @@ -20,8 +20,9 @@ if (!isServer) exitWith { }; params [["_side", nil, [east]], ["_reset", false, [false]]]; private _text = format["__%1__ has been force respawned.",str _side]; +private _markerPos = getMarkerPos ((GVAR(respawnPointsHash) get _side) select 0); -AAR_EVENT(_text,nil,nil,nil); +AAR_EVENT(_text,nil,nil,_markerPos); [_side, true] call FUNC(doRespawnWave); From a9757b0b2af8c4277c06b072b6b9965f7d8747d5 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 4 Oct 2024 16:27:31 +0300 Subject: [PATCH 217/228] Update script_version.hpp --- addons/main/script_version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index 3af49d2..05019b6 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 1 #define MINOR 8 #define PATCH 0 -#define BUILD 15 \ No newline at end of file +#define BUILD 16 \ No newline at end of file From de947a275aa19a58bd120cef8011c723123b17fa Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 4 Oct 2024 16:39:29 +0300 Subject: [PATCH 218/228] Update debug macros --- addons/main/script_component.hpp | 7 ++----- addons/main/script_mod.hpp | 3 +++ addons/msp/script_component.hpp | 9 +++------ addons/respawn/script_component.hpp | 9 +++------ 4 files changed, 11 insertions(+), 17 deletions(-) diff --git a/addons/main/script_component.hpp b/addons/main/script_component.hpp index a8c63e3..99e5888 100644 --- a/addons/main/script_component.hpp +++ b/addons/main/script_component.hpp @@ -1,14 +1,11 @@ #define COMPONENT main #include "\x\tunres\addons\main\script_mod.hpp" -#define DEBUG_MODE_FULL -#define DISABLE_COMPILE_CACHE +// #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 "\x\tunres\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index b43b63f..484563a 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -13,3 +13,6 @@ #else #define COMPONENT_NAME QUOTE(tunres - COMPONENT) #endif + +//This forces debug on everything. +#define DEBUG_ENABLED_MAIN \ No newline at end of file diff --git a/addons/msp/script_component.hpp b/addons/msp/script_component.hpp index 9da6e0d..258d2b3 100644 --- a/addons/msp/script_component.hpp +++ b/addons/msp/script_component.hpp @@ -2,14 +2,11 @@ #define COMPONENT_BEAUTIFIED MSP #include "\x\tunres\addons\main\script_mod.hpp" -#define DEBUG_MODE_FULL -#define DISABLE_COMPILE_CACHE +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE -#ifdef DEBUG_ENABLED_MSP +#ifdef DEBUG_ENABLED_MAIN #define DEBUG_MODE_FULL #endif - #ifdef DEBUG_SETTINGS_MSP - #define DEBUG_SETTINGS DEBUG_SETTINGS_MSP -#endif #include "\x\tunres\addons\main\script_macros.hpp" diff --git a/addons/respawn/script_component.hpp b/addons/respawn/script_component.hpp index 43db8c3..aecdcef 100644 --- a/addons/respawn/script_component.hpp +++ b/addons/respawn/script_component.hpp @@ -2,14 +2,11 @@ #define COMPONENT_BEAUTIFIED Respawn #include "\x\tunres\addons\main\script_mod.hpp" -#define DEBUG_MODE_FULL -#define DISABLE_COMPILE_CACHE +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE -#ifdef DEBUG_ENABLED_RESPAWN +#ifdef DEBUG_ENABLED_MAIN #define DEBUG_MODE_FULL #endif - #ifdef DEBUG_SETTINGS_RESPAWN - #define DEBUG_SETTINGS DEBUG_SETTINGS_RESPAWN -#endif #include "\x\tunres\addons\main\script_macros.hpp" From e8519446dc1e24cb8f07240eb8dcf781e849be48 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Fri, 4 Oct 2024 16:46:21 +0300 Subject: [PATCH 219/228] update header --- addons/respawn/functions/fnc_setTicketCount.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/respawn/functions/fnc_setTicketCount.sqf b/addons/respawn/functions/fnc_setTicketCount.sqf index 3937f25..a20bedc 100644 --- a/addons/respawn/functions/fnc_setTicketCount.sqf +++ b/addons/respawn/functions/fnc_setTicketCount.sqf @@ -3,7 +3,7 @@ * [Description] * * Arguments: - * 0: Side/player to add tickets + * 0: Side/player to set tickets * 1: New ticket count * * Return Value: From f1de8352ea324ac1e25df5c129c78ec8326d297f Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sat, 5 Oct 2024 23:37:46 +0300 Subject: [PATCH 220/228] fix locality --- addons/msp/functions/fnc_startUpdateDeployementStatus.sqf | 2 +- addons/msp/functions/fnc_updateDeployementStatus.sqf | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf index ef3d13a..402372e 100644 --- a/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_startUpdateDeployementStatus.sqf @@ -40,7 +40,7 @@ if (_setup) then { }; private _code = { - _args call FUNC(updateDeployementStatus); + _args remoteExecCall [QFUNC(updateDeployementStatus), 2]; openMap false; }; diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index 94c9a50..a4b1eb3 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -if (!isServer) then {}; +if (!isServer) exitWith {}; params [["_msp", objNull, [objNull]], ["_setup", nil, [false]], "_player"]; @@ -42,7 +42,6 @@ if (_setup) then { //Unlock vehicle [_msp, 0] remoteExecCall ["lock", _msp]; - }; private _whoToNotify = [_side, GVAR(setupNotification)] call FUNC(whoToNotify); From 546b930fb1837fd5c12ceed660453d58eb273065 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Sun, 6 Oct 2024 00:09:19 +0300 Subject: [PATCH 221/228] Fix kill jip time --- addons/respawn/functions/fnc_killJIP.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/respawn/functions/fnc_killJIP.sqf b/addons/respawn/functions/fnc_killJIP.sqf index 1778d85..66e1a4d 100644 --- a/addons/respawn/functions/fnc_killJIP.sqf +++ b/addons/respawn/functions/fnc_killJIP.sqf @@ -16,7 +16,7 @@ if (!hasInterface) exitWith { }; [{!isNull player}, { - if (cba_missiontime > (GVAR(killJipTime) * 60) && GVAR(killJIP)) then { + if (cba_missiontime > GVAR(killJipTime) && GVAR(killJIP)) then { [{ [player, "Respawn", { params ["_newObject","_oldObject"]; From 5e0ce60f00668627d2922963e934b75e0fd69663 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Tue, 8 Oct 2024 19:26:32 +0300 Subject: [PATCH 222/228] Use new deleteVehicle syntax --- addons/msp/functions/fnc_addEventHandlers.sqf | 4 +--- addons/msp/functions/fnc_updateDeployementStatus.sqf | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/addons/msp/functions/fnc_addEventHandlers.sqf b/addons/msp/functions/fnc_addEventHandlers.sqf index f5ff295..9ce8a78 100644 --- a/addons/msp/functions/fnc_addEventHandlers.sqf +++ b/addons/msp/functions/fnc_addEventHandlers.sqf @@ -58,9 +58,7 @@ AAR_UPDATE(_unit,"Enemies near","RIP"); if ( local _unit && { _unit getVariable [QGVAR(isMSP), false] } ) then { - { - deleteVehicle _x; - } forEach (_unit getVariable QGVAR(objects)); + deleteVehicle (_unit getVariable QGVAR(objects)); GVAR(deployementStatusHash) set [_side, false]; publicVariable QGVAR(deployementStatusHash); diff --git a/addons/msp/functions/fnc_updateDeployementStatus.sqf b/addons/msp/functions/fnc_updateDeployementStatus.sqf index a4b1eb3..b4a7cba 100644 --- a/addons/msp/functions/fnc_updateDeployementStatus.sqf +++ b/addons/msp/functions/fnc_updateDeployementStatus.sqf @@ -36,9 +36,7 @@ if (_setup) then { } else { //Delete props - { - deleteVehicle _x; - } forEach (_msp getVariable QGVAR(objects)); + deleteVehicle (_msp getVariable QGVAR(objects)); //Unlock vehicle [_msp, 0] remoteExecCall ["lock", _msp]; From fafa99c93a90c3be7da0e2224153576eba8623b1 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 23 Oct 2024 15:39:00 +0300 Subject: [PATCH 223/228] add remanding time helper function --- addons/msp/functions/fnc_createMspProps.sqf | 2 +- addons/respawn/XEH_PREP.hpp | 1 + addons/respawn/XEH_postInit_server.sqf | 2 +- .../respawn/functions/fnc_delayedRespawn.sqf | 5 ++--- .../functions/fnc_getRemainingTime.sqf | 20 +++++++++++++++++++ .../functions/fnc_getTicketCountClient.sqf | 4 ++-- addons/respawn/functions/fnc_waitingArea.sqf | 4 +--- 7 files changed, 28 insertions(+), 10 deletions(-) create mode 100644 addons/respawn/functions/fnc_getRemainingTime.sqf diff --git a/addons/msp/functions/fnc_createMspProps.sqf b/addons/msp/functions/fnc_createMspProps.sqf index de6c53b..decfc33 100644 --- a/addons/msp/functions/fnc_createMspProps.sqf +++ b/addons/msp/functions/fnc_createMspProps.sqf @@ -13,7 +13,7 @@ * [_msp] call tunres_MSP_fnc_createMspProps */ #include "script_component.hpp" -if (!isServer) then {}; +if (!isServer) exitWith {}; params ["_msp"]; //todo give user ability to chose what props will be added. diff --git a/addons/respawn/XEH_PREP.hpp b/addons/respawn/XEH_PREP.hpp index 70fa1d9..ed0277b 100644 --- a/addons/respawn/XEH_PREP.hpp +++ b/addons/respawn/XEH_PREP.hpp @@ -24,6 +24,7 @@ PREP(moduleWaitingArea); PREP(onPlayerKilled); PREP(openTeleportMenu); PREP(radioSettings_tfar); +PREP(getRemainingTime); PREP(remainingWaitTimeNotification); PREP(removegear); PREP(respawnUnit); diff --git a/addons/respawn/XEH_postInit_server.sqf b/addons/respawn/XEH_postInit_server.sqf index 3ba3474..612bc33 100644 --- a/addons/respawn/XEH_postInit_server.sqf +++ b/addons/respawn/XEH_postInit_server.sqf @@ -69,7 +69,7 @@ if ( EGVAR(main,AAR_Enabled) ) then { { private _side = _x; if (_enabledSideHash getOrDefault [_side, false]) then { - private _time = round((_hashTime get _side) - cba_missiontime); + private _time = [_side] call FUNC(getRemainingTime); private _sideSTR = str _side; AAR_UPDATE(_sideSTR,"Next respawn wave",_time); }; diff --git a/addons/respawn/functions/fnc_delayedRespawn.sqf b/addons/respawn/functions/fnc_delayedRespawn.sqf index ea86b59..a058178 100644 --- a/addons/respawn/functions/fnc_delayedRespawn.sqf +++ b/addons/respawn/functions/fnc_delayedRespawn.sqf @@ -17,11 +17,10 @@ params ["_unit", "_side"]; private _skip = false; if (GVAR(delayedRespawn) > 0) then { - private _hashWaitTime = GVAR(nextWaveTimesHash); private _hashWaveLenght = GVAR(waveLenghtTimesHash); - private _time = _hashWaitTime get _side; + private _time = [_side] call FUNC(getRemainingTime); private _waveLenghtTime = _hashWaveLenght get _side; - _skip = ((_time - cba_missiontime) < (_waveLenghtTime * (GVAR(delayedRespawn) / 100))); + _skip = (_time < (_waveLenghtTime * (GVAR(delayedRespawn) / 100))); }; _unit setVariable [QGVAR(skipNextWave), _skip, true]; diff --git a/addons/respawn/functions/fnc_getRemainingTime.sqf b/addons/respawn/functions/fnc_getRemainingTime.sqf new file mode 100644 index 0000000..a3b1ca1 --- /dev/null +++ b/addons/respawn/functions/fnc_getRemainingTime.sqf @@ -0,0 +1,20 @@ +/* + * Author: [Tuntematon] + * [Description] + * Return remaining wave time for that side + * + * Arguments: + * Side + * + * Return Value: + * Time in seconds + * + * Example: + * [] call tunres_Respawn_fnc_getRemainingTime + */ +#include "script_component.hpp" +params["_side"]; +private _hashWaitTime = GVAR(nextWaveTimesHash); +private _waitTime = _hashWaitTime get _side; + +round (_waitTime - cba_missiontime) \ No newline at end of file diff --git a/addons/respawn/functions/fnc_getTicketCountClient.sqf b/addons/respawn/functions/fnc_getTicketCountClient.sqf index 40adfa9..46418b0 100644 --- a/addons/respawn/functions/fnc_getTicketCountClient.sqf +++ b/addons/respawn/functions/fnc_getTicketCountClient.sqf @@ -6,7 +6,7 @@ * 0: Do hint (optional) * * Return Value: - * ticket count + * ticket count. -1 is returned when something went wrong * Example: * [false] call tunres_Respawn_fnc_getTicketCountClient */ @@ -24,7 +24,7 @@ private _ticketCount = switch (GVAR(respawnType)) do { missionNamespace getVariable [QGVAR(playerTickets), GVAR(ticketsHash) get _side] }; default { - breakWith "Not using tickest"; + breakWith -1; }; }; diff --git a/addons/respawn/functions/fnc_waitingArea.sqf b/addons/respawn/functions/fnc_waitingArea.sqf index 00a109a..af09bea 100644 --- a/addons/respawn/functions/fnc_waitingArea.sqf +++ b/addons/respawn/functions/fnc_waitingArea.sqf @@ -46,9 +46,7 @@ GVAR(waitingAreaPFH) = [{ if (isNil "_playerSkipsWave") exitWith {}; //Show remaining time - private _hashWaitTime = GVAR(nextWaveTimesHash); - private _waitTime = _hashWaitTime get _playerSide; - private _remainingWaitTime = round (_waitTime - cba_missiontime); + private _remainingWaitTime = [_playerSide] call FUNC(getRemainingTime); if (_playerSkipsWave) then { private _hashWaveLenght = GVAR(waveLenghtTimesHash); From 67ffc618b438b7e879c3fb996ef1ab500a6fa158 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 23 Oct 2024 15:45:40 +0300 Subject: [PATCH 224/228] add helper function get side tickets --- addons/respawn/XEH_PREP.hpp | 3 ++- .../functions/fnc_getSideTicketCount.sqf | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 addons/respawn/functions/fnc_getSideTicketCount.sqf diff --git a/addons/respawn/XEH_PREP.hpp b/addons/respawn/XEH_PREP.hpp index ed0277b..bb35a49 100644 --- a/addons/respawn/XEH_PREP.hpp +++ b/addons/respawn/XEH_PREP.hpp @@ -15,6 +15,8 @@ PREP(forceRespawnPlayer); PREP(forceRespawnWave); PREP(getOffSet); PREP(getParentAction); +PREP(getRemainingTime); +PREP(getSideTicketCount); PREP(getTicketCount); PREP(getTicketCountClient); PREP(killJIP); @@ -24,7 +26,6 @@ PREP(moduleWaitingArea); PREP(onPlayerKilled); PREP(openTeleportMenu); PREP(radioSettings_tfar); -PREP(getRemainingTime); PREP(remainingWaitTimeNotification); PREP(removegear); PREP(respawnUnit); diff --git a/addons/respawn/functions/fnc_getSideTicketCount.sqf b/addons/respawn/functions/fnc_getSideTicketCount.sqf new file mode 100644 index 0000000..48030a2 --- /dev/null +++ b/addons/respawn/functions/fnc_getSideTicketCount.sqf @@ -0,0 +1,20 @@ +/* + * Author: [Tuntematon] + * [Description] + * Helper functio to get side tickets + * Arguments: + * 0: Side to get tickets + * + * Return Value: + * ticket count. + * Example: + * [west] call tunres_Respawn_fnc_getSideTicketCount + */ +#include "script_component.hpp" +if (!isServer) exitWith { }; +params [["_side", nil, [west]]]; + +private _hash = GVAR(ticketsHash); +private _ticketCount = _hash getOrDefault [_side, -1]; + +_ticketCount \ No newline at end of file From 570fed2cfbde02c975c578a7ca1904f5784a6342 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 23 Oct 2024 16:49:29 +0300 Subject: [PATCH 225/228] Fix god mode --- addons/respawn/XEH_PREP.hpp | 1 + addons/respawn/functions/fnc_godMode.sqf | 29 +++++++++++++++++++ .../respawn/functions/fnc_teleportButton.sqf | 2 +- addons/respawn/functions/fnc_teleportUnit.sqf | 11 +++---- 4 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 addons/respawn/functions/fnc_godMode.sqf diff --git a/addons/respawn/XEH_PREP.hpp b/addons/respawn/XEH_PREP.hpp index bb35a49..4029580 100644 --- a/addons/respawn/XEH_PREP.hpp +++ b/addons/respawn/XEH_PREP.hpp @@ -19,6 +19,7 @@ PREP(getRemainingTime); PREP(getSideTicketCount); PREP(getTicketCount); PREP(getTicketCountClient); +PREP(godMode); PREP(killJIP); PREP(moduleRespawnPoint); PREP(moduleTeleport); diff --git a/addons/respawn/functions/fnc_godMode.sqf b/addons/respawn/functions/fnc_godMode.sqf new file mode 100644 index 0000000..a49efad --- /dev/null +++ b/addons/respawn/functions/fnc_godMode.sqf @@ -0,0 +1,29 @@ +/* + * Author: [Tuntematon] + * [Description] + * + * Arguments: + * 0: Unit + * + * Return Value: + * The return true when done + * + * Example: + * [_unit, _destination, _text, _range] call tunres_Respawn_fnc_godMode + */ +#include "script_component.hpp" +params [["_unit", objNull, [objNull]], ["_godModeLenght", 30, [0]]]; + +if (_unit isEqualTo objNull && {!local _unit}) exitWith {LOG("unit was objnull when adding god mode")}; + +if (isDamageAllowed _unit) then { + _unit allowDamage false; + INFO("Enable god mode"); + [{ + params ["_unit"]; + _unit allowDamage true; + INFO("Disable god mode"); + }, [_unit], _godModeLenght] call CBA_fnc_waitAndExecute; +}; + +true \ No newline at end of file diff --git a/addons/respawn/functions/fnc_teleportButton.sqf b/addons/respawn/functions/fnc_teleportButton.sqf index fde5480..984cf07 100644 --- a/addons/respawn/functions/fnc_teleportButton.sqf +++ b/addons/respawn/functions/fnc_teleportButton.sqf @@ -34,7 +34,7 @@ private _text = format["%1 %2", LLSTRING(Teleporting), _teleportName]; if (_teleportConditio) then { closeDialog 2; GVAR(tpMenuOpenedFrom) = objNull; - [player, _destination, _text, 10, true, 15] call FUNC(teleportUnit); + [player, _destination, _text, 30, true, 20] call FUNC(teleportUnit); } else { [QEGVAR(main,doNotification), [LLSTRING(Teleport_Disabled)]] call CBA_fnc_localEvent; }; \ No newline at end of file diff --git a/addons/respawn/functions/fnc_teleportUnit.sqf b/addons/respawn/functions/fnc_teleportUnit.sqf index 7cbde30..7e250bb 100644 --- a/addons/respawn/functions/fnc_teleportUnit.sqf +++ b/addons/respawn/functions/fnc_teleportUnit.sqf @@ -7,12 +7,14 @@ * 1: Coordinates where to TP <[ARRAY]> * 2: Text shown * 3: Spread Range + * 4: Enable god mode + * 5: God mode duration * * Return Value: * The return true when done * * Example: - * [_unit, _destination, _text, _range] call tunres_Respawn_fnc_teleportUnit + * [_unit, _destination, _text, _range, true, 30] call tunres_Respawn_fnc_teleportUnit */ #include "script_component.hpp" @@ -27,12 +29,7 @@ params [["_unit", objNull, [objNull]], if (_unit isEqualTo objNull) exitWith {LOG("unit was objnull when teleporting")}; if (_godMode) then { - player allowDamage false; - LOG("Enable god mode"); - [{ - player allowDamage true; - LOG("Disable god mode"); - }, [], _godModeLenght] call CBA_fnc_waitAndExecute; + [_unit, _godModeLenght] remoteExecCall [QFUNC(godMode), _unit]; }; [_text, 10] remoteExecCall [QFUNC(blackscreen), _unit]; // make player screen black and prevent them moving right away so server can keep up. From c2ba41d3566458307c1731763b3d89fd0917e808 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 23 Oct 2024 16:50:31 +0300 Subject: [PATCH 226/228] Make teleporting more safer --- addons/respawn/functions/fnc_respawnUnit.sqf | 2 +- addons/respawn/functions/fnc_teleportUnit.sqf | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/addons/respawn/functions/fnc_respawnUnit.sqf b/addons/respawn/functions/fnc_respawnUnit.sqf index f56534e..29ed96c 100644 --- a/addons/respawn/functions/fnc_respawnUnit.sqf +++ b/addons/respawn/functions/fnc_respawnUnit.sqf @@ -24,7 +24,7 @@ player setVariable [QGVAR(skipNextWave), nil]; private _text = LLSTRING(FNC_moveRespawnText); -[_unit, _respawnPosition, _text, 20, true] call FUNC(teleportUnit); +[_unit, _respawnPosition, _text, 30, true] call FUNC(teleportUnit); [_unit] remoteExecCall [QFUNC(addGear), _unit]; diff --git a/addons/respawn/functions/fnc_teleportUnit.sqf b/addons/respawn/functions/fnc_teleportUnit.sqf index 7e250bb..fe9ba4c 100644 --- a/addons/respawn/functions/fnc_teleportUnit.sqf +++ b/addons/respawn/functions/fnc_teleportUnit.sqf @@ -33,9 +33,10 @@ if (_godMode) then { }; [_text, 10] remoteExecCall [QFUNC(blackscreen), _unit]; // make player screen black and prevent them moving right away so server can keep up. +private _backupPos = _destination getPos [5,90]; +private _pos = [_destination, 2, _range, 2, 0, 30, 0, [], [_backupPos,_backupPos]] call BIS_fnc_findSafePos; +_unit setPos _pos; -_unit setPosASL ([_destination, _range] call CBA_fnc_randPos); - -[QGVAR(EH_unitTeleported), [_unit, _destination]] call CBA_fnc_serverEvent; +[QGVAR(EH_unitTeleported), [_unit, _pos]] call CBA_fnc_serverEvent; true \ No newline at end of file From 45db0534934a3691be16668de00d8069f5b343bb Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 23 Oct 2024 16:50:40 +0300 Subject: [PATCH 227/228] use time fnc --- addons/respawn/functions/fnc_timer.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/respawn/functions/fnc_timer.sqf b/addons/respawn/functions/fnc_timer.sqf index a91e760..f9f64c0 100644 --- a/addons/respawn/functions/fnc_timer.sqf +++ b/addons/respawn/functions/fnc_timer.sqf @@ -32,7 +32,7 @@ if !( GVAR(timerRunningHash) getOrDefault [_side, false]) then { publicVariable QGVAR(timerRunningHash); [{ _this params ["_side"]; GVAR(allowRespawnHash) get _side && - { cba_missiontime >= GVAR(nextWaveTimesHash) get _side } + { 0 >= [_side] call FUNC(getRemainingTime) } }, { _this params ["_side"]; if (EGVAR(msp,enable)) then { From dea9f9cb40860dae91acc7ecac23d750cc2cf470 Mon Sep 17 00:00:00 2001 From: tuntematonjr Date: Wed, 23 Oct 2024 16:50:44 +0300 Subject: [PATCH 228/228] Update script_version.hpp --- addons/main/script_version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index 05019b6..c3cc960 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 1 #define MINOR 8 #define PATCH 0 -#define BUILD 16 \ No newline at end of file +#define BUILD 17 \ No newline at end of file