├── .gitattributes ├── .gitignore ├── LICENCE.md ├── PreviewImage.jpg ├── README.md └── SampleCoop ├── Missions ├── CoopTest.conf └── CoopTest.conf.meta ├── Prefabs ├── MP │ ├── Managers │ │ ├── Factions │ │ │ ├── CoopFactionManager.et │ │ │ ├── CoopFactionManager.et.meta │ │ │ ├── CoopFactionManager_Base.et │ │ │ └── CoopFactionManager_Base.et.meta │ │ ├── Loadouts │ │ │ ├── CoopLoadoutManager.et │ │ │ ├── CoopLoadoutManager.et.meta │ │ │ ├── CoopLoadoutManager_Base.et │ │ │ └── CoopLoadoutManager_Base.et.meta │ │ └── Tasks │ │ │ ├── CoopTaskManager.et │ │ │ └── CoopTaskManager.et.meta │ ├── Modes │ │ └── Coop │ │ │ ├── CoopGameMode.et │ │ │ ├── CoopGameMode.et.meta │ │ │ ├── CoopGameMode_Base.et │ │ │ └── CoopGameMode_Base.et.meta │ └── Triggers │ │ ├── CoopTriggerSpawner.et │ │ ├── CoopTriggerSpawner.et.meta │ │ ├── CoopTrigger_Base.et │ │ └── CoopTrigger_Base.et.meta └── Tasks │ ├── EliminateTask.et │ └── EliminateTask.et.meta ├── Scripts └── Game │ └── Coop │ ├── EliminateTask │ ├── SCR_EliminateTask.c │ ├── SCR_EliminateTaskData.c │ └── SCR_EliminateTaskSupportClass.c │ ├── SCR_AISpawnerComponent.c │ └── SCR_CoopTaskManager.c ├── Worlds ├── CoopTest.ent ├── CoopTest.ent.meta ├── CoopTestTerrain │ ├── .Data │ │ ├── CoopTestTerrain_0.ttile │ │ ├── CoopTestTerrain_0_normal.edds │ │ ├── CoopTestTerrain_1.ttile │ │ ├── CoopTestTerrain_1_normal.edds │ │ ├── CoopTestTerrain_2.ttile │ │ ├── CoopTestTerrain_2_normal.edds │ │ ├── CoopTestTerrain_3.ttile │ │ └── CoopTestTerrain_3_normal.edds │ ├── .EditorData │ │ ├── CoopTestTerrain.bterr │ │ ├── CoopTestTerrain_0.bterr │ │ ├── CoopTestTerrain_0_normal.dds │ │ ├── CoopTestTerrain_1.bterr │ │ ├── CoopTestTerrain_1_normal.dds │ │ ├── CoopTestTerrain_2.bterr │ │ ├── CoopTestTerrain_2_normal.dds │ │ ├── CoopTestTerrain_3.bterr │ │ ├── CoopTestTerrain_3_normal.dds │ │ └── NormTex.desc │ ├── CoopTestTerrain.terr │ └── CoopTestTerrain.terr.meta ├── CoopTest_AI.layer ├── CoopTest_comments.layer ├── CoopTest_default.layer ├── CoopTest_environment.layer ├── CoopTest_gamemode.layer ├── CoopTest_managers.layer ├── CoopTest_spawnpoints.layer ├── CoopTest_tasks.layer └── CoopTest_triggers.layer └── addon.gproj /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Object files 5 | *.o 6 | *.ko 7 | *.obj 8 | *.elf 9 | 10 | # Linker output 11 | *.ilk 12 | *.map 13 | *.exp 14 | 15 | # Precompiled Headers 16 | *.gch 17 | *.pch 18 | 19 | # Libraries 20 | *.lib 21 | *.a 22 | *.la 23 | *.lo 24 | 25 | # Shared objects (inc. Windows DLLs) 26 | *.dll 27 | *.so 28 | *.so.* 29 | *.dylib 30 | 31 | # Executables 32 | *.exe 33 | *.out 34 | *.app 35 | *.i*86 36 | *.x86_64 37 | *.hex 38 | 39 | # Debug files 40 | *.dSYM/ 41 | *.su 42 | *.idb 43 | *.pdb 44 | 45 | # Kernel Module Compile Results 46 | *.mod* 47 | *.cmd 48 | .tmp_versions/ 49 | modules.order 50 | Module.symvers 51 | Mkfile.old 52 | dkms.conf 53 | 54 | # Enfusion Resource Database 55 | *.rdb 56 | 57 | # Subversion 58 | .svn/ 59 | -------------------------------------------------------------------------------- /LICENCE.md: -------------------------------------------------------------------------------- 1 | Arma Public License (APL) 2 | 3 | Summary 4 | PLEASE, NOTE THAT THIS SUMMARY HAS NO LEGAL EFFECT AND IS ONLY OF AN INFORMATORY NATURE DESIGNED FOR YOU TO GET THE BASIC INFORMATION ABOUT THE CONTENT OF THIS LICENCE. THE ONLY LEGALLY BINDING PROVISIONS ARE THOSE IN THE ORIGINAL AND FULL TEXT OF THIS LICENCE. 5 | 6 | With this licence you are free to adapt (i.e. modify, rework or update) and share (i.e. copy, distribute or transmit) the material under the following conditions: 7 | 8 | * Attribution - You must attribute the material in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the material). 9 | * Noncommercial - You may not use this material for any commercial purposes. 10 | * Arma Only - You may not convert or adapt this material to be used in other games than Arma. 11 | 12 | By exercising the Licensed Rights (defined in the full license), You accept and agree to be bound by the terms and conditions of this Arma Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. 13 | 14 | You can read the full license at https://www.bohemia.net/community/licenses/arma-public-license -------------------------------------------------------------------------------- /PreviewImage.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/PreviewImage.jpg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sample Coop Addon 2 | This addon is a very early and simple overlook of setting up a coop-based addon for Arma Reforger. 3 | ![Preview Image](https://github.com/exocs/Reforger-Sample-Coop/blob/main/PreviewImage.jpg?raw=true) 4 | 5 | ## Content 6 | - Simple test world *(with mission header)* 7 | - Basic prefab setup *(with proper inheritance)* 8 | - AI groups spawning *(static and dynamic)* 9 | - AI waypoints *(static and dynamic)* 10 | - Tasks usage *(custom scripted eliminate task)* 11 | - Simple win condition *(a rather naïve one*) 12 | 13 | ## Running the addon 14 | - Clone the repository on your local storage 15 | - Start the Enfusion Workbench 16 | - Select "Add Existing" 17 | - Navigate the file browser to "Reforger-Sample-Coop/SampleCoop/addon.gproj" 18 | - Select "Sample Coop" and select "Open" 19 | 20 | ## Disclaimer 21 | The solution inside is far from perfect, it should rather serve as an initial example of how to set up game modes to allow for other game modes than Conflict and Capture & Hold and should give you some insight in how you can approach some of the challenges. 22 | 23 | If you encounter any problems, please let me know on the [Arma discord](http://discord.gg/arma). 24 | 25 | ## Known issues 26 | - Tasks can sometimes show as "THIS SHOULDNT BE VISIBLE" for remote clients. 27 | 28 | ## Legal 29 | © 2022 BOHEMIA INTERACTIVE a.s. ARMA REFORGER®, ENFUSION®, and BOHEMIA INTERACTIVE® are registered trademarks of BOHEMIA INTERACTIVE a.s. All rights reserved. 30 | See https://community.bistudio.com/wiki/Category:Arma_Reforger for more information. 31 | License: https://www.bohemia.net/community/licenses/arma-public-license 32 | -------------------------------------------------------------------------------- /SampleCoop/Missions/CoopTest.conf: -------------------------------------------------------------------------------- 1 | SCR_MissionHeader { 2 | World "{E6945F6DC070C755}Worlds/CoopTest.ent" 3 | m_sName "Coop Test Scenario" 4 | m_sGameMode "Coop" 5 | m_iPlayerCount 8 6 | } -------------------------------------------------------------------------------- /SampleCoop/Missions/CoopTest.conf.meta: -------------------------------------------------------------------------------- 1 | MetaFileClass { 2 | Name "{85A748EB80EE1051}Missions/CoopTest.conf" 3 | Configurations { 4 | CONFResourceClass PC { 5 | } 6 | CONFResourceClass XBOX_ONE : PC { 7 | } 8 | CONFResourceClass XBOX_SERIES : PC { 9 | } 10 | CONFResourceClass PS4 : PC { 11 | } 12 | CONFResourceClass HEADLESS : PC { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Managers/Factions/CoopFactionManager.et: -------------------------------------------------------------------------------- 1 | SCR_FactionManager : "{3794016E5AEC2478}Prefabs/MP/Managers/Factions/CoopFactionManager_Base.et" { 2 | ID "56B2B4776E6E4499" 3 | Factions { 4 | SCR_CampaignFaction "{5966E56E6680A49C}" : "{ADFDBDA163950168}Configs/Factions/US_Campaign.conf" { 5 | } 6 | SCR_CampaignFaction "{5966E56E67344613}" : "{15B582F8FA0B0940}Configs/Factions/USSR_Campaign.conf" { 7 | m_bIsPlayable 0 8 | } 9 | SCR_CampaignFaction "{5966E56E65B2B1DA}" : "{CF9447B87AB774DB}Configs/Factions/FIA_Campaign.conf" { 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Managers/Factions/CoopFactionManager.et.meta: -------------------------------------------------------------------------------- 1 | MetaFileClass { 2 | Name "{E4075339B4E24E10}Prefabs/MP/Managers/Factions/CoopFactionManager.et" 3 | Configurations { 4 | EntityTemplateResourceClass PC { 5 | } 6 | EntityTemplateResourceClass XBOX_ONE : PC { 7 | } 8 | EntityTemplateResourceClass XBOX_SERIES : PC { 9 | } 10 | EntityTemplateResourceClass PS4 : PC { 11 | } 12 | EntityTemplateResourceClass HEADLESS : PC { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Managers/Factions/CoopFactionManager_Base.et: -------------------------------------------------------------------------------- 1 | SCR_FactionManager : "{A242612865F2A48E}Prefabs/MP/Managers/Factions/FactionManager_Base.et" { 2 | ID "56B2B4776E6E4499" 3 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Managers/Factions/CoopFactionManager_Base.et.meta: -------------------------------------------------------------------------------- 1 | MetaFileClass { 2 | Name "{3794016E5AEC2478}Prefabs/MP/Managers/CoopFactionManager_Base.et" 3 | Configurations { 4 | EntityTemplateResourceClass PC { 5 | } 6 | EntityTemplateResourceClass XBOX_ONE : PC { 7 | } 8 | EntityTemplateResourceClass XBOX_SERIES : PC { 9 | } 10 | EntityTemplateResourceClass PS4 : PC { 11 | } 12 | EntityTemplateResourceClass HEADLESS : PC { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Managers/Loadouts/CoopLoadoutManager.et: -------------------------------------------------------------------------------- 1 | SCR_LoadoutManager : "{F9CAA9AD4CA12BC8}Prefabs/MP/Managers/Loadouts/CoopLoadoutManager_Base.et" { 2 | ID "56B2B47708C4F23A" 3 | m_aPlayerLoadouts { 4 | SCR_FactionPlayerLoadout "{5966E56D89B8567C}" : "{7C7C65FD583E6612}Configs/Loadouts/US/Loadout_US_Rifleman.conf" { 5 | } 6 | SCR_FactionPlayerLoadout "{5966E56D8E646056}" : "{AFA36BB8828E381A}Configs/Loadouts/US/Loadout_US_MG.conf" { 7 | } 8 | SCR_FactionPlayerLoadout "{5966E56D8F1B19FD}" : "{121FC1ABB7FE098C}Configs/Loadouts/US/Loadout_US_LAT.conf" { 9 | } 10 | SCR_FactionPlayerLoadout "{5966E56D8C512CBF}" : "{0B4549C656AFC7AE}Configs/Loadouts/US/Loadout_US_GL.conf" { 11 | } 12 | SCR_FactionPlayerLoadout "{5966E56D8D8526A7}" : "{0EFB9B7C7EF8B247}Configs/Loadouts/US/Loadout_US_Sniper.conf" { 13 | } 14 | SCR_FactionPlayerLoadout "{5966E56D80C4EB97}" : "{5F9034642E99437D}Configs/Loadouts/USSR/Loadout_USSR_Rifleman.conf" { 15 | } 16 | SCR_FactionPlayerLoadout "{5966E56D81AD5410}" : "{E97C426E941D8FDC}Configs/Loadouts/USSR/Loadout_USSR_MG.conf" { 17 | } 18 | SCR_FactionPlayerLoadout "{5966E56D863781C7}" : "{C1C1DB68C6FC265B}Configs/Loadouts/USSR/Loadout_USSR_AT.conf" { 19 | } 20 | SCR_FactionPlayerLoadout "{5966E56D8759FAF4}" : "{A62BF2390565DC0B}Configs/Loadouts/USSR/Loadout_USSR_GL.conf" { 21 | } 22 | SCR_FactionPlayerLoadout "{5966E56D849C84E8}" : "{FB56BAF9A1BBAB39}Configs/Loadouts/USSR/Loadout_USSR_Sharpshooter.conf" { 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Managers/Loadouts/CoopLoadoutManager.et.meta: -------------------------------------------------------------------------------- 1 | MetaFileClass { 2 | Name "{0C4D399744D5B3FD}Prefabs/MP/Managers/Loadouts/CoopLoadoutManager.et" 3 | Configurations { 4 | EntityTemplateResourceClass PC { 5 | } 6 | EntityTemplateResourceClass XBOX_ONE : PC { 7 | } 8 | EntityTemplateResourceClass XBOX_SERIES : PC { 9 | } 10 | EntityTemplateResourceClass PS4 : PC { 11 | } 12 | EntityTemplateResourceClass HEADLESS : PC { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Managers/Loadouts/CoopLoadoutManager_Base.et: -------------------------------------------------------------------------------- 1 | SCR_LoadoutManager : "{AA4E7419A1FF65B0}Prefabs/MP/Managers/Loadouts/LoadoutManager_Base.et" { 2 | ID "56B2B47708C4F23A" 3 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Managers/Loadouts/CoopLoadoutManager_Base.et.meta: -------------------------------------------------------------------------------- 1 | MetaFileClass { 2 | Name "{F9CAA9AD4CA12BC8}Prefabs/MP/Managers/CoopLoadoutManager_Base.et" 3 | Configurations { 4 | EntityTemplateResourceClass PC { 5 | } 6 | EntityTemplateResourceClass XBOX_ONE : PC { 7 | } 8 | EntityTemplateResourceClass XBOX_SERIES : PC { 9 | } 10 | EntityTemplateResourceClass PS4 : PC { 11 | } 12 | EntityTemplateResourceClass HEADLESS : PC { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Managers/Tasks/CoopTaskManager.et: -------------------------------------------------------------------------------- 1 | SCR_CoopTaskManager { 2 | ID "596895DD33F6FAE1" 3 | components { 4 | SCR_TextsTaskManagerComponent "{596895DD3C75D39A}" { 5 | m_aEntries { 6 | SCR_TextsTaskManagerEntry "{596895DD3C75CDC2}" { 7 | m_TextType CUSTOM 8 | m_aTexts { 9 | SCR_UIDescription "{596895DD3C75CDB8}" { 10 | Name "#AR-Editor_CustomTask_1_Name" 11 | Description "#AR-Editor_CustomTask_1_Description" 12 | } 13 | SCR_UIDescription "{596895DD3C75CDAE}" { 14 | Name "#AR-Editor_CustomTask_2_Name" 15 | Description "#AR-Editor_CustomTask_2_Description" 16 | } 17 | SCR_UIDescription "{596895DD3C75CDA8}" { 18 | Name "#AR-Editor_CustomTask_3_Name" 19 | Description "#AR-Editor_CustomTask_3_Description" 20 | } 21 | SCR_UIDescription "{596895DD3C75CDA2}" { 22 | Name "#AR-Editor_CustomTask_4_Name" 23 | Description "#AR-Editor_CustomTask_4_Description" 24 | } 25 | SCR_UIDescription "{596895DD3C75CD9B}" { 26 | Name "#AR-Editor_CustomTask_5_Name" 27 | Description "#AR-Editor_CustomTask_5_Description" 28 | } 29 | SCR_UIDescription "{596895DD3C75CD95}" { 30 | Name "#AR-Editor_CustomTask_6_Name" 31 | Description "#AR-Editor_CustomTask_6_Description" 32 | } 33 | SCR_UIDescription "{596895DD3C75CD8F}" { 34 | Name "#AR-Editor_CustomTask_7_Name" 35 | Description "#AR-Editor_CustomTask_7_Description" 36 | } 37 | SCR_UIDescription "{596895DD3C75CD8A}" { 38 | Name "#AR-Editor_CustomTask_8_Name" 39 | Description "#AR-Editor_CustomTask_8_Description" 40 | } 41 | SCR_UIDescription "{596895DD3C75CD85}" { 42 | Name "#AR-Editor_CustomTask_9_Name" 43 | Description "#AR-Editor_CustomTask_9_Description" 44 | } 45 | SCR_UIDescription "{596895DD3C75CD80}" { 46 | Name "#AR-Editor_CustomTask_10_Name" 47 | Description "#AR-Editor_CustomTask_10_Description" 48 | } 49 | SCR_UIDescription "{596895DD3C75CDF9}" { 50 | Name "#AR-Editor_CustomTask_11_Name" 51 | Description "#AR-Editor_CustomTask_11_Description" 52 | } 53 | SCR_UIDescription "{596895DD3C75CDF2}" { 54 | Name "#AR-Editor_CustomTask_12_Name" 55 | Description "#AR-Editor_CustomTask_12_Description" 56 | } 57 | SCR_UIDescription "{596895DD3C75CDEC}" { 58 | Name "#AR-Editor_CustomTask_13_Name" 59 | Description "#AR-Editor_CustomTask_13_Description" 60 | } 61 | SCR_UIDescription "{596895DD3C75CDE6}" { 62 | Name "#AR-Editor_CustomTask_14_Name" 63 | Description "#AR-Editor_CustomTask_14_Description" 64 | } 65 | SCR_UIDescription "{596895DD3C75CDE3}" { 66 | Name "#AR-Editor_CustomTask_15_Name" 67 | Description "#AR-Editor_CustomTask_15_Description" 68 | } 69 | SCR_UIDescription "{596895DD3C75CDDE}" { 70 | Name "#AR-Editor_CustomTask_16_Name" 71 | Description "#AR-Editor_CustomTask_16_Description" 72 | } 73 | SCR_UIDescription "{596895DD3C75CDD9}" { 74 | Name "#AR-Editor_CustomTask_17_Name" 75 | Description "#AR-Editor_CustomTask_17_Description" 76 | } 77 | SCR_UIDescription "{596895DD3C75CDD4}" { 78 | Name "#AR-Editor_CustomTask_18_Name" 79 | Description "#AR-Editor_CustomTask_18_Description" 80 | } 81 | SCR_UIDescription "{596895DD3C75CDCC}" { 82 | Name "#AR-Editor_CustomTask_19_Name" 83 | Description "#AR-Editor_CustomTask_19_Description" 84 | } 85 | SCR_UIDescription "{596895DD3C75CDC7}" { 86 | Name "#AR-Editor_CustomTask_20_Name" 87 | Description "#AR-Editor_CustomTask_20_Description" 88 | } 89 | SCR_UIDescription "{596895DD3C75CDC3}" { 90 | Name "#AR-Editor_CustomTask_21_Name" 91 | Description "#AR-Editor_CustomTask_21_Description" 92 | } 93 | } 94 | } 95 | SCR_TextsTaskManagerEntry "{596895DD3C75D37D}" { 96 | m_TextType MOVE 97 | m_aTexts { 98 | SCR_UIDescription "{596895DD3C75CC32}" { 99 | Name "#AR-Editor_MoveTask_1_Name" 100 | Description "#AR-Editor_MoveTask_1_Description" 101 | } 102 | SCR_UIDescription "{596895DD3C75CC2C}" { 103 | Name "#AR-Editor_MoveTask_2_Name" 104 | Description "#AR-Editor_MoveTask_2_Description" 105 | } 106 | SCR_UIDescription "{596895DD3C75CC27}" { 107 | Name "#AR-Editor_MoveTask_3_Name" 108 | Description "#AR-Editor_MoveTask_3_Description" 109 | } 110 | SCR_UIDescription "{596895DD3C75CC21}" { 111 | Name "#AR-Editor_MoveTask_4_Name" 112 | Description "#AR-Editor_MoveTask_4_Description" 113 | } 114 | SCR_UIDescription "{596895DD3C75CC1D}" { 115 | Name "#AR-Editor_MoveTask_5_Name" 116 | Description "#AR-Editor_MoveTask_5_Description" 117 | } 118 | SCR_UIDescription "{596895DD3C75CC18}" { 119 | Name "#AR-Editor_MoveTask_6_Name" 120 | Description "#AR-Editor_MoveTask_6_Description" 121 | } 122 | SCR_UIDescription "{596895DD3C75CC13}" { 123 | Name "#AR-Editor_MoveTask_7_Name" 124 | Description "#AR-Editor_MoveTask_7_Description" 125 | } 126 | SCR_UIDescription "{596895DD3C75CC0D}" { 127 | Name "#AR-Editor_MoveTask_8_Name" 128 | Description "#AR-Editor_MoveTask_8_Description" 129 | } 130 | SCR_UIDescription "{596895DD3C75CC09}" { 131 | Name "#AR-Editor_MoveTask_9_Name" 132 | Description "#AR-Editor_MoveTask_9_Description" 133 | } 134 | SCR_UIDescription "{596895DD3C75CC05}" { 135 | Name "#AR-Editor_MoveTask_10_Name" 136 | Description "#AR-Editor_MoveTask_10_Description" 137 | } 138 | SCR_UIDescription "{596895DD3C75CC7F}" { 139 | Name "#AR-Editor_MoveTask_11_Name" 140 | Description "#AR-Editor_MoveTask_11_Description" 141 | } 142 | SCR_UIDescription "{596895DD3C75CC7A}" { 143 | Name "#AR-Editor_MoveTask_12_Name" 144 | Description "#AR-Editor_MoveTask_12_Description" 145 | } 146 | } 147 | } 148 | SCR_TextsTaskManagerEntry "{596895DD3C75D34A}" { 149 | m_TextType DEFEND 150 | m_aTexts { 151 | SCR_UIDescription "{596895DD3C75D368}" { 152 | Name "#AR-Editor_DefendTask_0_Name" 153 | Description "#AR-Editor_DefendTask_0_Description" 154 | } 155 | SCR_UIDescription "{596895DD3C75D36E}" { 156 | Name "#AR-Editor_DefendTask_1_Name" 157 | Description "#AR-Editor_DefendTask_1_Description" 158 | } 159 | SCR_UIDescription "{596895DD3C75D362}" { 160 | Name "#AR-Editor_DefendTask_2_Name" 161 | Description "#AR-Editor_DefendTask_2_Description" 162 | } 163 | SCR_UIDescription "{596895DD3C75D367}" { 164 | Name "#AR-Editor_DefendTask_3_Name" 165 | Description "#AR-Editor_DefendTask_3_Description" 166 | } 167 | SCR_UIDescription "{596895DD3C75D35B}" { 168 | Name "#AR-Editor_DefendTask_4_Name" 169 | Description "#AR-Editor_DefendTask_4_Description" 170 | } 171 | SCR_UIDescription "{596895DD3C75D35F}" { 172 | Name "#AR-Editor_DefendTask_5_Name" 173 | Description "#AR-Editor_DefendTask_5_Description" 174 | } 175 | SCR_UIDescription "{596895DD3C75D354}" { 176 | Name "#AR-Editor_DefendTask_6_Name" 177 | Description "#AR-Editor_DefendTask_6_Description" 178 | } 179 | SCR_UIDescription "{596895DD3C75D349}" { 180 | Name "#AR-Editor_DefendTask_7_Name" 181 | Description "#AR-Editor_DefendTask_7_Description" 182 | } 183 | } 184 | } 185 | SCR_TextsTaskManagerEntry "{596895DD3C75D3AF}" { 186 | m_TextType ATTACK 187 | m_aTexts { 188 | SCR_UIDescription "{596895DD3C75D342}" { 189 | Name "#AR-Editor_AttackTask_0_Name" 190 | Description "#AR-Editor_AttackTask_0_Description" 191 | } 192 | SCR_UIDescription "{596895DD3C75D347}" { 193 | Name "#AR-Editor_AttackTask_2_Name" 194 | Description "#AR-Editor_AttackTask_2_Description" 195 | } 196 | SCR_UIDescription "{596895DD3C75D3BB}" { 197 | Name "#AR-Editor_AttackTask_1_Name" 198 | Description "#AR-Editor_AttackTask_1_Description" 199 | } 200 | SCR_UIDescription "{596895DD3C75D3BF}" { 201 | Name "#AR-Editor_AttackTask_3_Name" 202 | Description "#AR-Editor_AttackTask_3_Description" 203 | } 204 | SCR_UIDescription "{596895DD3C75D3B5}" { 205 | Name "#AR-Editor_AttackTask_4_Name" 206 | Description "#AR-Editor_AttackTask_4_Description" 207 | } 208 | SCR_UIDescription "{596895DD3C75D3AA}" { 209 | Name "#AR-Editor_AttackTask_5_Name" 210 | Description "#AR-Editor_AttackTask_5_Description" 211 | } 212 | SCR_UIDescription "{596895DD3C75D3AE}" { 213 | Name "#AR-Editor_AttackTask_6_Name" 214 | Description "#AR-Editor_AttackTask_6_Description" 215 | } 216 | } 217 | } 218 | } 219 | } 220 | SCR_UITaskManagerComponent "{596895DD3C75D39D}" { 221 | } 222 | RplComponent "{596895DD3C75D393}" { 223 | Streamable Disabled 224 | } 225 | } 226 | coords 226.307 10.001 247.351 227 | m_aSupportedTaskTypes { 228 | SCR_BaseTaskSupportClass "{596895DD3C75D384}" { 229 | m_TaskPrefab "{1D0F815858EE24AC}Prefabs/Tasks/BaseTask.et" 230 | } 231 | SCR_CampaignTaskSupportClass "{596895DD3C75D3FA}" { 232 | m_TaskPrefab "{A7E92298A3F916F7}Prefabs/Tasks/CampaignTask.et" 233 | } 234 | SCR_MoveTaskSupportClass "{596895DD3C75D3FE}" { 235 | } 236 | SCR_EditorTaskSupportClass "{596895DD3C75D3F2}" { 237 | } 238 | SCR_TriggerTaskSupportClass "{596895DD3C75D3E8}" { 239 | } 240 | SCR_CampaignBuildingTaskSupportClass "{596895DD3C75D3ED}" { 241 | m_TaskPrefab "{7F722BBED971DCDC}Prefabs/Tasks/CampaignBuildingTask.et" 242 | } 243 | } 244 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Managers/Tasks/CoopTaskManager.et.meta: -------------------------------------------------------------------------------- 1 | MetaFileClass { 2 | Name "{BA79FF1D825A3F3A}Prefabs/MP/Managers/Tasks/CoopTaskManager.et" 3 | Configurations { 4 | EntityTemplateResourceClass PC { 5 | } 6 | EntityTemplateResourceClass XBOX_ONE : PC { 7 | } 8 | EntityTemplateResourceClass XBOX_SERIES : PC { 9 | } 10 | EntityTemplateResourceClass PS4 : PC { 11 | } 12 | EntityTemplateResourceClass HEADLESS : PC { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Modes/Coop/CoopGameMode.et: -------------------------------------------------------------------------------- 1 | SCR_BaseGameMode : "{137CA336F7DFF561}Prefabs/MP/Modes/Coop/CoopGameMode_Base.et" { 2 | ID "56B2B479C6B96951" 3 | components { 4 | SCR_RespawnTimerComponent "{5966E56D0FE64680}" { 5 | m_fRespawnTime 2 6 | } 7 | SCR_RespawnBriefingComponent "{5966ECB28132C85E}" { 8 | m_Info SCR_UIInfo "{5966ECB29AB5AA74}" { 9 | Name "Sample Coop" 10 | Description "A coop sample." 11 | } 12 | m_aGameModeHints { 13 | SCR_UIInfo "{5966ECB2D190E82B}" { 14 | Name "Hint Sample" 15 | Description "Brief description." 16 | Icon "{39A515BAE3795994}UI/Textures/DeployMenu/Briefing/conflict_HintBanner_3_UI.edds" 17 | } 18 | } 19 | m_aWinConditions { 20 | SCR_BriefingVictoryCondition "{5966ECB2E6856C12}" { 21 | victoryCondition SEIZE 22 | name "Condition" 23 | description "Do something" 24 | } 25 | } 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Modes/Coop/CoopGameMode.et.meta: -------------------------------------------------------------------------------- 1 | MetaFileClass { 2 | Name "{904EC091C347AEA9}Prefabs/MP/Modes/Coop/CoopGameMode.et" 3 | Configurations { 4 | EntityTemplateResourceClass PC { 5 | } 6 | EntityTemplateResourceClass XBOX_ONE : PC { 7 | } 8 | EntityTemplateResourceClass XBOX_SERIES : PC { 9 | } 10 | EntityTemplateResourceClass PS4 : PC { 11 | } 12 | EntityTemplateResourceClass HEADLESS : PC { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Modes/Coop/CoopGameMode_Base.et: -------------------------------------------------------------------------------- 1 | SCR_BaseGameMode : "{0F307326459A1395}Prefabs/MP/Modes/GameMode_Base.et" { 2 | ID "56B2B479C6B96951" 3 | components { 4 | SCR_RespawnBriefingComponent "{5966ECB28132C85E}" { 5 | m_Info SCR_UIInfo "{5966ECB29AB5AA74}" { 6 | } 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Modes/Coop/CoopGameMode_Base.et.meta: -------------------------------------------------------------------------------- 1 | MetaFileClass { 2 | Name "{137CA336F7DFF561}Prefabs/MP/Modes/Coop/CoopGameMode_Base.et" 3 | Configurations { 4 | EntityTemplateResourceClass PC { 5 | } 6 | EntityTemplateResourceClass XBOX_ONE : PC { 7 | } 8 | EntityTemplateResourceClass XBOX_SERIES : PC { 9 | } 10 | EntityTemplateResourceClass PS4 : PC { 11 | } 12 | EntityTemplateResourceClass HEADLESS : PC { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Triggers/CoopTriggerSpawner.et: -------------------------------------------------------------------------------- 1 | SCR_BaseTriggerEntity : "{5BB84B3E6A0B46C5}Prefabs/MP/Triggers/CoopTrigger_Base.et" { 2 | ID "5966F2A96DE950B4" 3 | components { 4 | SCR_AISpawnerComponent "{5966F2A840D93A01}" { 5 | m_bUseTrigger 1 6 | m_aWaypointsList { 7 | "WP1" "WP2" 8 | } 9 | } 10 | RplComponent "{5966F2A87A6B4E62}" { 11 | } 12 | } 13 | SphereRadius 10 14 | ClassFilter "ChimeraCharacter" 15 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Triggers/CoopTriggerSpawner.et.meta: -------------------------------------------------------------------------------- 1 | MetaFileClass { 2 | Name "{3F294A5E2B52B65E}Prefabs/MP/Triggers/CoopTriggerSpawner.et" 3 | Configurations { 4 | EntityTemplateResourceClass PC { 5 | } 6 | EntityTemplateResourceClass XBOX_ONE : PC { 7 | } 8 | EntityTemplateResourceClass XBOX_SERIES : PC { 9 | } 10 | EntityTemplateResourceClass PS4 : PC { 11 | } 12 | EntityTemplateResourceClass HEADLESS : PC { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Triggers/CoopTrigger_Base.et: -------------------------------------------------------------------------------- 1 | SCR_BaseTriggerEntity { 2 | ID "5966F2A96DE950B4" 3 | TriggerShapeType Sphere 4 | SphereRadius 25 5 | ShapeColor 0.318 0.561 0.071 1 6 | TriggerActivationType "All changes" 7 | PeriodicQueries 1 8 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/MP/Triggers/CoopTrigger_Base.et.meta: -------------------------------------------------------------------------------- 1 | MetaFileClass { 2 | Name "{5BB84B3E6A0B46C5}Prefabs/MP/Triggers/CoopTrigger_Base.et" 3 | Configurations { 4 | EntityTemplateResourceClass PC { 5 | } 6 | EntityTemplateResourceClass XBOX_ONE : PC { 7 | } 8 | EntityTemplateResourceClass XBOX_SERIES : PC { 9 | } 10 | EntityTemplateResourceClass PS4 : PC { 11 | } 12 | EntityTemplateResourceClass HEADLESS : PC { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/Tasks/EliminateTask.et: -------------------------------------------------------------------------------- 1 | SCR_EliminateTask { 2 | ID "5968C9C59E99B6FD" 3 | components { 4 | SCR_MapDescriptorComponent "{5968F2D8BCB9F064}" { 5 | ImagesetQuadElement "Task_Seize" 6 | MainType Tree 7 | } 8 | } 9 | coords 256.688 10.372 273.955 10 | m_sName "Eliminate target" 11 | m_bNotifyAssignment 1 12 | m_bNotifyUnassign 1 13 | } -------------------------------------------------------------------------------- /SampleCoop/Prefabs/Tasks/EliminateTask.et.meta: -------------------------------------------------------------------------------- 1 | MetaFileClass { 2 | Name "{B866318EB7E84833}Prefabs/Tasks/EliminateTask.et" 3 | Configurations { 4 | EntityTemplateResourceClass PC { 5 | } 6 | EntityTemplateResourceClass XBOX_ONE : PC { 7 | } 8 | EntityTemplateResourceClass XBOX_SERIES : PC { 9 | } 10 | EntityTemplateResourceClass PS4 : PC { 11 | } 12 | EntityTemplateResourceClass HEADLESS : PC { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /SampleCoop/Scripts/Game/Coop/EliminateTask/SCR_EliminateTask.c: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------------------------ 2 | [EntityEditorProps(category: "GameScripted/Tasks", description: "Move task.", color: "0 0 255 255")] 3 | class SCR_EliminateTaskClass: SCR_BaseTaskClass 4 | { 5 | }; 6 | 7 | void OnEliminatedDelegate(SCR_BaseTask task); 8 | typedef func OnEliminatedDelegate; 9 | typedef ScriptInvokerBase OnEliminatedInvoker; 10 | 11 | //------------------------------------------------------------------------------------------------ 12 | class SCR_EliminateTask : SCR_BaseTask 13 | { 14 | [Attribute()] 15 | protected float m_fRange; 16 | 17 | protected RplId m_TargetEntityRplID; 18 | protected IEntity m_TargetEntity; 19 | 20 | protected ref OnEliminatedInvoker m_pOnEliminatedInvoker = new OnEliminatedInvoker(); 21 | 22 | //------------------------------------------------------------------------------------------------ 23 | OnEliminatedInvoker GetOnEliminatedInvoker() 24 | { 25 | return m_pOnEliminatedInvoker; 26 | } 27 | 28 | //------------------------------------------------------------------------------------------------ 29 | RplId GetTargetEntityRplID() 30 | { 31 | return m_TargetEntityRplID; 32 | } 33 | 34 | //------------------------------------------------------------------------------------------------ 35 | override void Finish(bool showMsg = true) 36 | { 37 | super.Finish(showMsg); 38 | m_pOnEliminatedInvoker.Invoke(this); 39 | 40 | if (!showMsg) 41 | return; 42 | 43 | SCR_PopUpNotification.GetInstance().PopupMsg("Target eliminated!"); // Never returns null 44 | } 45 | 46 | //------------------------------------------------------------------------------------------------ 47 | override void EOnFrame(IEntity owner, float timeSlice) 48 | { 49 | if (m_TargetEntity) 50 | SetOrigin(m_TargetEntity.GetOrigin()); 51 | else 52 | { 53 | ClearEventMask(EntityEvent.FRAME); 54 | ClearFlags(EntityFlags.ACTIVE, false); 55 | } 56 | } 57 | 58 | //------------------------------------------------------------------------------------------------ 59 | void SetTargetEntity(notnull IEntity targetEntity) 60 | { 61 | RplComponent rplComponent = RplComponent.Cast(targetEntity.FindComponent(RplComponent)); 62 | if (!rplComponent) 63 | return; // Not replicated, cannot be target 64 | 65 | EventHandlerManagerComponent eventHandlerManager = EventHandlerManagerComponent.Cast(targetEntity.FindComponent(EventHandlerManagerComponent)); 66 | if (!eventHandlerManager) 67 | return; // No event handler, cannot be target 68 | 69 | m_TargetEntityRplID = rplComponent.Id(); // Store the target entity RplID for replication 70 | m_TargetEntity = targetEntity; 71 | 72 | eventHandlerManager.RegisterScriptHandler("OnDestroyed", targetEntity, OnDestroyed); 73 | 74 | SetEventMask(EntityEvent.FRAME); 75 | SetFlags(EntityFlags.ACTIVE, false); 76 | } 77 | 78 | //------------------------------------------------------------------------------------------------ 79 | void OnDestroyed(IEntity targetEntity) 80 | { 81 | EventHandlerManagerComponent eventHandlerManager = EventHandlerManagerComponent.Cast(targetEntity.FindComponent(EventHandlerManagerComponent)); 82 | if (eventHandlerManager) 83 | eventHandlerManager.RemoveScriptHandler("OnDestroyed", targetEntity, OnDestroyed); 84 | 85 | // State is equal to EDamageState.DESTROYED, finish task 86 | if (GetTaskManager()) 87 | GetTaskManager().FinishTask(this); 88 | } 89 | 90 | //------------------------------------------------------------------------------------------------ 91 | override void Serialize(ScriptBitWriter writer) 92 | { 93 | super.Serialize(writer); 94 | 95 | writer.WriteRplId(m_TargetEntityRplID); 96 | } 97 | 98 | //------------------------------------------------------------------------------------------------ 99 | bool QueryEntitiesCallback(IEntity e) 100 | { 101 | if (!e.FindComponent(EventHandlerManagerComponent)) 102 | return true; 103 | 104 | SetTargetEntity(e); 105 | 106 | return false; 107 | } 108 | 109 | //------------------------------------------------------------------------------------------------ 110 | override void EOnInit(IEntity owner) 111 | { 112 | super.EOnInit(owner); 113 | 114 | // Server only 115 | if (GetTaskManager() && GetTaskManager().IsProxy()) 116 | return; 117 | 118 | // Call next frame, entities may not be initialized 119 | GetGame().GetCallqueue().CallLater(QueryLater, 0); 120 | } 121 | 122 | //------------------------------------------------------------------------------------------------ 123 | void QueryLater() 124 | { 125 | // Attaches to nearest suitable entity within m_fRange 126 | GetWorld().QueryEntitiesBySphere(GetOrigin(), m_fRange, QueryEntitiesCallback); 127 | } 128 | 129 | //------------------------------------------------------------------------------------------------ 130 | void SCR_EliminateTask(IEntitySource src, IEntity parent) 131 | { 132 | } 133 | 134 | //------------------------------------------------------------------------------------------------ 135 | void ~SCR_EliminateTask() 136 | { 137 | } 138 | 139 | }; -------------------------------------------------------------------------------- /SampleCoop/Scripts/Game/Coop/EliminateTask/SCR_EliminateTaskData.c: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------------------------ 2 | class SCR_EliminateTaskData : SCR_BaseTaskData 3 | { 4 | static const int ELIMINATE_TASK_DATA_SIZE = 4; 5 | 6 | protected RplId m_TargetEntityRplID; 7 | 8 | //------------------------------------------------------------------------------------------------ 9 | override SCR_BaseTaskSupportClass GetSupportClass() 10 | { 11 | return GetTaskManager().GetSupportedTaskByTaskType(SCR_EliminateTask); 12 | } 13 | 14 | //------------------------------------------------------------------------------------------------ 15 | override void LoadDataFromTask(SCR_BaseTask task) 16 | { 17 | super.LoadDataFromTask(task); 18 | 19 | SCR_EliminateTask eliminateTask = SCR_EliminateTask.Cast(task); 20 | if (!eliminateTask) 21 | return; 22 | 23 | m_TargetEntityRplID = eliminateTask.GetTargetEntityRplID(); 24 | } 25 | 26 | //------------------------------------------------------------------------------------------------ 27 | override void SetupTask(SCR_BaseTask task) 28 | { 29 | SCR_EliminateTask eliminateTask = SCR_EliminateTask.Cast(task); 30 | if (!eliminateTask) 31 | return; 32 | 33 | super.SetupTask(eliminateTask); 34 | 35 | IEntity targetEntity = IEntity.Cast(Replication.FindItem(m_TargetEntityRplID)); 36 | if (!targetEntity) 37 | return; 38 | 39 | eliminateTask.SetTargetEntity(targetEntity); 40 | } 41 | 42 | //------------------------------------------------------------------------------------------------ 43 | override void Deserialize(ScriptBitReader reader) 44 | { 45 | super.Deserialize(reader); 46 | 47 | reader.ReadRplId(m_TargetEntityRplID); 48 | } 49 | 50 | //------------------------------------------------------------------------------------------------ 51 | static override int GetDataSize() 52 | { 53 | return ELIMINATE_TASK_DATA_SIZE + SCR_BaseTaskData.GetDataSize(); 54 | } 55 | 56 | //################################################################################################ 57 | //! Codec methods 58 | //------------------------------------------------------------------------------------------------ 59 | static override void Encode(SSnapSerializerBase snapshot, ScriptCtx ctx, ScriptBitSerializer packet) 60 | { 61 | snapshot.Serialize(packet, GetDataSize()); 62 | } 63 | 64 | //------------------------------------------------------------------------------------------------ 65 | static override bool Decode(ScriptBitSerializer packet, ScriptCtx ctx, SSnapSerializerBase snapshot) 66 | { 67 | return snapshot.Serialize(packet, GetDataSize()); 68 | } 69 | 70 | //------------------------------------------------------------------------------------------------ 71 | static override bool SnapCompare(SSnapSerializerBase lhs, SSnapSerializerBase rhs, ScriptCtx ctx) 72 | { 73 | return lhs.CompareSnapshots(rhs, GetDataSize()); 74 | } 75 | 76 | //------------------------------------------------------------------------------------------------ 77 | static bool PropCompare(SCR_EliminateTaskData prop, SSnapSerializerBase snapshot, ScriptCtx ctx) 78 | { 79 | return snapshot.Compare(prop.m_TargetEntityRplID, 4); 80 | } 81 | 82 | //------------------------------------------------------------------------------------------------ 83 | static bool Extract(SCR_EliminateTaskData prop, ScriptCtx ctx, SSnapSerializerBase snapshot) 84 | { 85 | snapshot.SerializeBytes(prop.m_TargetEntityRplID, 4); 86 | 87 | return true; 88 | } 89 | 90 | //------------------------------------------------------------------------------------------------ 91 | static bool Inject(SSnapSerializerBase snapshot, ScriptCtx ctx, SCR_EliminateTaskData prop) 92 | { 93 | snapshot.SerializeBytes(prop.m_TargetEntityRplID, 4); 94 | 95 | return true; 96 | } 97 | } -------------------------------------------------------------------------------- /SampleCoop/Scripts/Game/Coop/EliminateTask/SCR_EliminateTaskSupportClass.c: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------------------------ 2 | [BaseContainerProps()] 3 | class SCR_EliminateTaskSupportClass : SCR_BaseTaskSupportClass 4 | { 5 | //------------------------------------------------------------------------------------------------ 6 | //! Call this on server only 7 | //! This is how it should ideally be done, so the generate methods are not part of the task manager itself 8 | SCR_EliminateTask GenerateNewEliminateTask(notnull IEntity targetEntity) 9 | { 10 | if (!GetTaskManager()) // Don't cache this, it gets in-lined! 11 | return null; // No task manager! 12 | 13 | SCR_EliminateTask eliminateTask = SCR_EliminateTask.Cast(CreateTask()); 14 | if (!eliminateTask) 15 | return null; // Maybe the prefab/ResourceName was wrong? 16 | 17 | eliminateTask.SetTargetEntity(targetEntity); 18 | 19 | array assigneeIDs = {}; 20 | array assignees = {}; 21 | int assigneesCount = eliminateTask.GetAssignees(assignees); 22 | 23 | SCR_CampaignTaskData taskData = new SCR_CampaignTaskData(); 24 | taskData.LoadDataFromTask(eliminateTask); 25 | 26 | // Now we need specific task manager type, so we cache it 27 | SCR_CoopTaskManager coopTaskManager = SCR_CoopTaskManager.Cast(GetTaskManager()); 28 | if (coopTaskManager) 29 | coopTaskManager.Rpc(coopTaskManager.RPC_CreateEliminateTask, taskData, assignees); 30 | 31 | return eliminateTask; 32 | } 33 | 34 | //------------------------------------------------------------------------------------------------ 35 | override SCR_EliminateTaskData CreateTaskData() 36 | { 37 | return new SCR_EliminateTaskData(); 38 | } 39 | 40 | //------------------------------------------------------------------------------------------------ 41 | void SCR_EliminateTaskSupportClass() 42 | { 43 | m_TypeName = SCR_EliminateTask; 44 | } 45 | } -------------------------------------------------------------------------------- /SampleCoop/Scripts/Game/Coop/SCR_AISpawnerComponent.c: -------------------------------------------------------------------------------- 1 | [ComponentEditorProps(category: "GameScripted/Coop", description: "Allows spawning of AI groups.")] 2 | class SCR_AISpawnerComponentClass : ScriptComponentClass 3 | { 4 | } 5 | 6 | void ScriptInvoker_OnSpawnerEmptyDelegate(); 7 | typedef func ScriptInvoker_OnSpawnerEmptyDelegate; 8 | typedef ScriptInvokerBase ScriptInvoker_OnSpawnerEmpty; 9 | 10 | 11 | //------------------------------------------------------------------------------------------------ 12 | class SCR_AISpawnerComponent : ScriptComponent 13 | { 14 | [Attribute("{5BEA04939D148B1D}Prefabs/Groups/INDFOR/Group_FIA_FireTeam.et", UIWidgets.EditBox, "Group prefab to spawn.")] 15 | protected ResourceName m_rnDefaultPrefab; 16 | 17 | [Attribute("0", UIWidgets.CheckBox, "If checked, spawns group immediately.")] 18 | protected bool m_bSpawnImmediately; 19 | 20 | [Attribute("0", UIWidgets.CheckBox, "If checked tries to find parent trigger to hook onto.")] 21 | protected bool m_bUseTrigger; 22 | 23 | [Attribute("", UIWidgets.EditBox, "World position for the group to spawn at.", params: "inf inf 0 0 purposeCoords spaceWorld")] 24 | protected vector m_vSpawnPosition; 25 | 26 | [Attribute("", UIWidgets.EditBox, "World rotation for the group to spawn with (only yaw is taken into account).", params: "inf inf 0 0 purposeAngles spaceWorld")] 27 | protected vector m_vSpawnRotation; 28 | 29 | [Attribute("", UIWidgets.Auto, "List of waypoints to use.")] 30 | protected ref array m_aWaypointsList; 31 | 32 | // Attached component. 33 | protected RplComponent m_pRplComponent; 34 | 35 | //! Spawned agent relevant to the authority only. 36 | protected AIAgent m_pSpawnedAgent; 37 | 38 | //! Invoker which we can hook onto - see typedef above 39 | protected ref ScriptInvoker_OnSpawnerEmpty m_pOnEmptyInvoker = new ScriptInvoker_OnSpawnerEmpty(); 40 | 41 | //------------------------------------------------------------------------------------------------ 42 | AIAgent GetSpawnedAgent() 43 | { 44 | return m_pSpawnedAgent; 45 | } 46 | 47 | //------------------------------------------------------------------------------------------------ 48 | ScriptInvoker_OnSpawnerEmpty GetOnEmptyInvoker() 49 | { 50 | return m_pOnEmptyInvoker; 51 | } 52 | 53 | //------------------------------------------------------------------------------------------------ 54 | vector GetSpawnPosition() 55 | { 56 | return m_vSpawnPosition; 57 | } 58 | 59 | //------------------------------------------------------------------------------------------------ 60 | vector GetSpawnRotation() 61 | { 62 | return Vector(0.0, m_vSpawnRotation[1], 0.0); 63 | } 64 | 65 | //------------------------------------------------------------------------------------------------ 66 | void GetSpawnTransform(out vector transformMatrix[4]) 67 | { 68 | vector rotation = GetSpawnRotation(); 69 | vector yawPitchRoll = Vector(rotation[1], rotation[0], rotation[2]); 70 | Math3D.AnglesToMatrix(rotation, transformMatrix); 71 | transformMatrix[3] = GetSpawnPosition(); 72 | } 73 | 74 | //------------------------------------------------------------------------------------------------ 75 | bool DoSpawn(ResourceName aiAgentPrefab, array wayPoints = null) 76 | { 77 | if (IsSpawned()) 78 | { 79 | Print("SCR_AISpawnerComponent cannot spawn group; group was spawned already!"); 80 | return false; 81 | } 82 | 83 | if (!VerifyRplComponentPresent()) 84 | { 85 | Print("SCR_AISpawnerComponent cannot spawn group, spawner has no RplComponent!"); 86 | return false; 87 | } 88 | 89 | if (!m_pRplComponent.IsMaster()) 90 | { 91 | Print("SCR_AISpawnerComponent caught non-master request to spawn!"); 92 | return false; 93 | } 94 | 95 | Resource agentPrefab = Resource.Load(aiAgentPrefab); 96 | if (!agentPrefab) 97 | { 98 | Print(string.Format("SCR_AISpawnerComponent could not load '%1'", agentPrefab)); 99 | return false; 100 | } 101 | 102 | EntitySpawnParams spawnParams = new EntitySpawnParams(); 103 | spawnParams.TransformMode = ETransformMode.WORLD; 104 | GetSpawnTransform(spawnParams.Transform); 105 | 106 | IEntity spawnedEntity = GetGame().SpawnEntityPrefab(agentPrefab, GetOwner().GetWorld(), spawnParams); 107 | if (!spawnedEntity) 108 | { 109 | Print(string.Format("SCR_AISpawnerComponent could not spawn '%1'", agentPrefab)); 110 | return false; 111 | } 112 | 113 | AIAgent agent = AIAgent.Cast(spawnedEntity); 114 | if (!agent) 115 | { 116 | Print(string.Format("SCR_AISpawnerComponent spawned entity '%1' that is not of AIAgent type, deleting!", agentPrefab)); 117 | RplComponent.DeleteRplEntity(spawnedEntity, false); 118 | return false; 119 | } 120 | 121 | // Store agent 122 | m_pSpawnedAgent = agent; 123 | 124 | if (m_aWaypointsList && !m_aWaypointsList.IsEmpty()) 125 | { 126 | BaseWorld world = GetOwner().GetWorld(); 127 | foreach (string waypointName : m_aWaypointsList) 128 | { 129 | IEntity waypointEntity = world.FindEntityByName(waypointName); 130 | if (!waypointEntity) 131 | { 132 | Print(string.Format("SCR_AISpawnerComponent could not find waypoint '%1', skipping!", waypointName)); 133 | continue; 134 | } 135 | 136 | AIWaypoint waypoint = AIWaypoint.Cast(waypointEntity); 137 | if (!waypoint) 138 | { 139 | Print(string.Format("SCR_AISpawnerComponent could not use waypoint '%1': Entity is not AIWaypoint!", waypointName)); 140 | continue; 141 | } 142 | 143 | agent.AddWaypoint(waypoint); 144 | } 145 | } 146 | 147 | SCR_AIGroup aiGroup = SCR_AIGroup.Cast(agent); 148 | if (aiGroup) 149 | aiGroup.GetOnEmpty().Insert(OnEmpty); 150 | 151 | return true; 152 | } 153 | 154 | //------------------------------------------------------------------------------------------------ 155 | protected event void OnEmpty() 156 | { 157 | m_pOnEmptyInvoker.Invoke(); 158 | } 159 | 160 | //------------------------------------------------------------------------------------------------ 161 | bool IsSpawned() 162 | { 163 | return m_pSpawnedAgent != null; 164 | } 165 | 166 | //------------------------------------------------------------------------------------------------ 167 | bool DoSpawnDefault() 168 | { 169 | return DoSpawn(m_rnDefaultPrefab); 170 | } 171 | 172 | #ifdef WORKBENCH 173 | //------------------------------------------------------------------------------------------------ 174 | protected override void _WB_AfterWorldUpdate(IEntity owner, float timeSlice) 175 | { 176 | super._WB_AfterWorldUpdate(owner, timeSlice); 177 | 178 | vector spawnPosition = GetSpawnPosition(); 179 | Shape shape = Shape.CreateSphere(COLOR_YELLOW, ShapeFlags.ONCE | ShapeFlags.NOOUTLINE, spawnPosition, 0.3); 180 | Shape arrow = Shape.CreateArrow(GetOwner().GetOrigin(), spawnPosition, 0.1, COLOR_YELLOW, ShapeFlags.ONCE); 181 | } 182 | #endif 183 | 184 | //------------------------------------------------------------------------------------------------ 185 | protected bool VerifyRplComponentPresent() 186 | { 187 | if (!m_pRplComponent) 188 | { 189 | Print("SCR_AISpawnerComponent does not have a RplComponent attached!"); 190 | return false; 191 | } 192 | 193 | return true; 194 | } 195 | 196 | //------------------------------------------------------------------------------------------------ 197 | protected void OnTriggerActivate() 198 | { 199 | /* 200 | 201 | SCR_BaseTriggerEntity parentTrigger = SCR_BaseTriggerEntity.Cast(GetOwner()); 202 | array entitiesInside = {}; 203 | parentTrigger.GetEntitiesInside(entitiesInside); 204 | 205 | Or just inherit (extend) the trigger and get the proper callbacks 206 | */ 207 | 208 | // Spawn when whatever enters this trigger 209 | if (!IsSpawned()) 210 | { 211 | if (DoSpawnDefault()) 212 | { 213 | // Once the group is spawned, in this case let's just disable the 214 | // trigger, making it a complete one-shot 215 | GenericEntity.Cast(GetOwner()).Deactivate(); 216 | // Additionally we could just RplComponent.DeleteEntity(GetOwner(), false); 217 | } 218 | } 219 | } 220 | 221 | //------------------------------------------------------------------------------------------------ 222 | override void OnPostInit(IEntity owner) 223 | { 224 | m_pRplComponent = RplComponent.Cast(owner.FindComponent(RplComponent)); 225 | if (!VerifyRplComponentPresent()) 226 | return; 227 | 228 | SetEventMask(owner, EntityEvent.INIT); 229 | } 230 | 231 | //------------------------------------------------------------------------------------------------ 232 | override void EOnInit(IEntity owner) 233 | { 234 | if (m_bSpawnImmediately) 235 | { 236 | // Spawning of Replicated items must not happen in EOnInit, 237 | // we delay the call to happen asap (after EOnInit) 238 | GetGame().GetCallqueue().CallLater(DoSpawnDefault, 0); 239 | } 240 | 241 | if (m_bUseTrigger) 242 | { 243 | SCR_BaseTriggerEntity parentTrigger = SCR_BaseTriggerEntity.Cast(owner); 244 | if (!parentTrigger) 245 | { 246 | Print("SCR_AISpawnerComponent cannot hook to trigger, it is not a child of SCR_BaseTriggerEntity!"); 247 | return; 248 | } 249 | 250 | parentTrigger.GetOnActivate().Insert(OnTriggerActivate); 251 | } 252 | } 253 | 254 | //------------------------------------------------------------------------------------------------ 255 | override void OnDelete(IEntity owner) 256 | { 257 | if (m_bUseTrigger) 258 | { 259 | SCR_BaseTriggerEntity parentTrigger = SCR_BaseTriggerEntity.Cast(owner); 260 | if (!parentTrigger) 261 | return; 262 | 263 | parentTrigger.GetOnActivate().Remove(OnTriggerActivate); 264 | } 265 | 266 | SCR_AIGroup aiGroup = SCR_AIGroup.Cast(GetSpawnedAgent()); 267 | if (aiGroup) 268 | { 269 | aiGroup.GetOnEmpty().Remove(OnEmpty); 270 | } 271 | } 272 | 273 | //------------------------------------------------------------------------------------------------ 274 | void SCR_AISpawnerComponent(IEntityComponentSource src, IEntity ent, IEntity parent) 275 | { 276 | } 277 | 278 | //------------------------------------------------------------------------------------------------ 279 | void ~SCR_AISpawnerComponent() 280 | { 281 | } 282 | 283 | } 284 | -------------------------------------------------------------------------------- /SampleCoop/Scripts/Game/Coop/SCR_CoopTaskManager.c: -------------------------------------------------------------------------------- 1 | [EntityEditorProps(category: "GameScripted/Coop", description: "Allows task management.")] 2 | class SCR_CoopTaskManagerClass : SCR_BaseTaskManagerClass 3 | { 4 | } 5 | 6 | //------------------------------------------------------------------------------------------------ 7 | class SCR_CoopTaskManager : SCR_BaseTaskManager 8 | { 9 | [Attribute("", UIWidgets.Auto, "Entity names of intial tasks - assigned to connecting players automatically.", category: "TaskManager: COOP")] 10 | protected ref array m_aInitialTaskNames; 11 | 12 | [Attribute("US", UIWidgets.EditBox, "Faction key to assign to tasks.", category: "TaskManager: COOP")] 13 | protected FactionKey m_sAssignedFaction; 14 | 15 | //! Runtime instances for tasks created from initial task names 16 | protected ref array m_aInitialTasks; 17 | 18 | protected RplComponent m_pRplComponent; 19 | 20 | //------------------------------------------------------------------------------------------------ 21 | [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)] 22 | protected void RPC_CreateEliminateTask(SCR_EliminateTaskData taskData, array assignees) 23 | { 24 | if (!taskData) 25 | return; 26 | 27 | if (GetTask(taskData.GetTaskID())) 28 | return; 29 | 30 | taskData.CreateTask(); 31 | } 32 | 33 | //------------------------------------------------------------------------------------------------ 34 | protected override void EOnInit(IEntity owner) 35 | { 36 | super.EOnInit(owner); 37 | 38 | // Do not initialize these tasks out of runtime 39 | if (!GetGame().InPlayMode()) 40 | return; 41 | 42 | m_aInitialTasks = {}; 43 | BaseWorld world = owner.GetWorld(); 44 | foreach (string taskName : m_aInitialTaskNames) 45 | { 46 | IEntity entity = world.FindEntityByName(taskName); 47 | SCR_BaseTask task = SCR_BaseTask.Cast(entity); 48 | if (!task) 49 | continue; 50 | 51 | m_aInitialTasks.Insert(task); 52 | } 53 | 54 | m_pRplComponent = RplComponent.Cast(owner.FindComponent(RplComponent)); 55 | if (!m_pRplComponent) 56 | { 57 | Print("SCR_CoopTaskManager is missing m_pRplComponent!", LogLevel.ERROR); 58 | return; 59 | } 60 | 61 | // Authority only 62 | if (!m_pRplComponent.IsMaster()) 63 | return; 64 | 65 | Faction targetFaction = GetGame().GetFactionManager().GetFactionByKey(m_sAssignedFaction); 66 | if (!targetFaction) 67 | { 68 | Print("SCR_CoopTaskManager is missing Faction to assign tasks to!", LogLevel.ERROR); 69 | return; 70 | } 71 | 72 | foreach (SCR_BaseTask task : m_aInitialTasks) 73 | { 74 | if (!task) 75 | continue; 76 | 77 | task.SetTargetFaction(targetFaction); 78 | } 79 | 80 | // Generating a task ahead! 81 | // Only on the server 82 | SCR_EliminateTaskSupportClass eliminateTaskSupportClass = SCR_EliminateTaskSupportClass.Cast(GetSupportedTaskBySupportClassType(SCR_EliminateTaskSupportClass)); 83 | if (!eliminateTaskSupportClass) 84 | return; 85 | 86 | // Code ahead would generate eliminate task, but for now we have it manually placed in map 87 | /*SCR_EliminateTask eliminateTask = eliminateTaskSupportClass.GenerateNewEliminateTask(world.FindEntityByName("Target_UAZ")); 88 | if (!eliminateTask) 89 | return; 90 | 91 | eliminateTask.SetTargetFaction(targetFaction);*/ 92 | } 93 | 94 | //------------------------------------------------------------------------------------------------ 95 | protected override void OnPlayerRegistered(int registeredPlayerID) 96 | { 97 | super.OnPlayerRegistered(registeredPlayerID); 98 | 99 | SCR_BaseTaskExecutor taskExecutor = SCR_BaseTaskExecutor.GetTaskExecutorByID(registeredPlayerID); 100 | if (!taskExecutor) 101 | { 102 | Print("No execution can be executed because executing execution execute exec."); 103 | return; 104 | } 105 | 106 | /* 107 | 108 | If you would want to assign a specific task when player connects, 109 | you could try doing something like this: 110 | 111 | SCR_BaseTask task = m_aInitialTasks.GetRandomElement(); 112 | if (!task) 113 | return; 114 | 115 | // Skip already finished tasks 116 | if (task.GetTaskState() == SCR_TaskState.FINISHED) 117 | return; 118 | 119 | // Assign task 120 | AssignTask(task, taskExecutor, false); 121 | 122 | */ 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTest.ent: -------------------------------------------------------------------------------- 1 | Layer default { 2 | Index 0 3 | } 4 | Layer managers { 5 | Index 1 6 | } 7 | Layer gamemode { 8 | Index 2 9 | } 10 | Layer environment { 11 | Index 3 12 | } 13 | Layer triggers { 14 | Index 4 15 | } 16 | Layer AI { 17 | Index 5 18 | } 19 | Layer comments { 20 | Index 6 21 | } 22 | Layer tasks { 23 | Index 7 24 | } -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTest.ent.meta: -------------------------------------------------------------------------------- 1 | MetaFileClass { 2 | Name "{E6945F6DC070C755}Worlds/CoopTest.ent" 3 | Configurations { 4 | ENTResourceClass PC { 5 | } 6 | ENTResourceClass XBOX_ONE : PC { 7 | } 8 | ENTResourceClass XBOX_SERIES : PC { 9 | } 10 | ENTResourceClass PS4 : PC { 11 | } 12 | ENTResourceClass HEADLESS : PC { 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.Data/CoopTestTerrain_0.ttile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/SampleCoop/Worlds/CoopTestTerrain/.Data/CoopTestTerrain_0.ttile -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.Data/CoopTestTerrain_0_normal.edds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/SampleCoop/Worlds/CoopTestTerrain/.Data/CoopTestTerrain_0_normal.edds -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.Data/CoopTestTerrain_1.ttile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/SampleCoop/Worlds/CoopTestTerrain/.Data/CoopTestTerrain_1.ttile -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.Data/CoopTestTerrain_1_normal.edds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/SampleCoop/Worlds/CoopTestTerrain/.Data/CoopTestTerrain_1_normal.edds -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.Data/CoopTestTerrain_2.ttile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/SampleCoop/Worlds/CoopTestTerrain/.Data/CoopTestTerrain_2.ttile -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.Data/CoopTestTerrain_2_normal.edds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/SampleCoop/Worlds/CoopTestTerrain/.Data/CoopTestTerrain_2_normal.edds -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.Data/CoopTestTerrain_3.ttile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/SampleCoop/Worlds/CoopTestTerrain/.Data/CoopTestTerrain_3.ttile -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.Data/CoopTestTerrain_3_normal.edds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/SampleCoop/Worlds/CoopTestTerrain/.Data/CoopTestTerrain_3_normal.edds -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.EditorData/CoopTestTerrain.bterr: -------------------------------------------------------------------------------- 1 | FORM4EDTRVERSHEAD@ -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.EditorData/CoopTestTerrain_0.bterr: -------------------------------------------------------------------------------- 1 | FORMEDTRVERSDATA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.EditorData/CoopTestTerrain_0_normal.dds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/SampleCoop/Worlds/CoopTestTerrain/.EditorData/CoopTestTerrain_0_normal.dds -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.EditorData/CoopTestTerrain_1.bterr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/SampleCoop/Worlds/CoopTestTerrain/.EditorData/CoopTestTerrain_1.bterr -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.EditorData/CoopTestTerrain_1_normal.dds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/SampleCoop/Worlds/CoopTestTerrain/.EditorData/CoopTestTerrain_1_normal.dds -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.EditorData/CoopTestTerrain_2.bterr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/SampleCoop/Worlds/CoopTestTerrain/.EditorData/CoopTestTerrain_2.bterr -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.EditorData/CoopTestTerrain_2_normal.dds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/SampleCoop/Worlds/CoopTestTerrain/.EditorData/CoopTestTerrain_2_normal.dds -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.EditorData/CoopTestTerrain_3.bterr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/SampleCoop/Worlds/CoopTestTerrain/.EditorData/CoopTestTerrain_3.bterr -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.EditorData/CoopTestTerrain_3_normal.dds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/SampleCoop/Worlds/CoopTestTerrain/.EditorData/CoopTestTerrain_3_normal.dds -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/.EditorData/NormTex.desc: -------------------------------------------------------------------------------- 1 | NormGenDescClass { 2 | Interpolation vertices 3 | MinDegAngle 30 4 | MaxDegAngle 45 5 | Intensity 1 6 | TexSize 256 7 | } -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/CoopTestTerrain.terr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/SampleCoop/Worlds/CoopTestTerrain/CoopTestTerrain.terr -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTestTerrain/CoopTestTerrain.terr.meta: -------------------------------------------------------------------------------- 1 | MetaFileClass { 2 | Name "{8A8A70052D112276}Worlds/CoopTestTerrain/CoopTestTerrain.terr" 3 | Configurations { 4 | TerrainResourceClass PC { 5 | BlocksPerTile 4 6 | TilesCount 4 7 | LayerSource SourceTextureClass "{5966E56F17234AA2}" : "{A59F335F96C4442F}Configs/System/ResourceTypes/PC/TextureTerrainLayer.conf" { 8 | } 9 | NormalSource SourceTextureClass "{5966E56F17230106}" : "{835E083C88C3D9C3}Configs/System/ResourceTypes/PC/TextureTerrainNormal.conf" { 10 | } 11 | SuperSource SourceTextureClass "{5966E56F172301CB}" : "{CBA1266690ABD336}Configs/System/ResourceTypes/PC/TextureTerrainSuper.conf" { 12 | } 13 | } 14 | TerrainResourceClass XBOX_ONE : PC { 15 | LayerSource SourceTextureClass "{5966E56F1723E270}" : "{9843D16A29542D5A}Configs/System/ResourceTypes/XBOX_ONE/TextureTerrainLayer.conf" { 16 | } 17 | NormalSource SourceTextureClass "{5966E56F1723E2D6}" : "{6C5EFFA712A52100}Configs/System/ResourceTypes/XBOX_ONE/TextureTerrainNormal.conf" { 18 | } 19 | SuperSource SourceTextureClass "{5966E56F1723E16E}" : "{F67DC4532F3BBA43}Configs/System/ResourceTypes/XBOX_ONE/TextureTerrainSuper.conf" { 20 | } 21 | } 22 | TerrainResourceClass XBOX_SERIES : PC { 23 | LayerSource SourceTextureClass "{5966E56F1723E185}" : "{2071F9D39E062268}Configs/System/ResourceTypes/XBOX_SERIES/TextureTerrainLayer.conf" { 24 | } 25 | NormalSource SourceTextureClass "{5966E56F1723E02D}" : "{90ADE65A903F3042}Configs/System/ResourceTypes/XBOX_SERIES/TextureTerrainNormal.conf" { 26 | } 27 | SuperSource SourceTextureClass "{5966E56F1723E064}" : "{4E4FECEA9869B571}Configs/System/ResourceTypes/XBOX_SERIES/TextureTerrainSuper.conf" { 28 | } 29 | } 30 | TerrainResourceClass PS4 : PC { 31 | LayerSource SourceTextureClass "{5966E56F1723E08D}" : "{4C431036F57D4D58}Configs/System/ResourceTypes/PS4/TextureTerrainLayer.conf" { 32 | } 33 | NormalSource SourceTextureClass "{5966E56F1723FF3A}" : "{6F6E5A1432381FD2}Configs/System/ResourceTypes/PS4/TextureTerrainNormal.conf" { 34 | } 35 | SuperSource SourceTextureClass "{5966E56F1723FF73}" : "{227D050FF312DA41}Configs/System/ResourceTypes/PS4/TextureTerrainSuper.conf" { 36 | } 37 | } 38 | TerrainResourceClass HEADLESS : PC { 39 | LayerSource SourceTextureClass "{5966E56F1723FFA3}" : "{3B38AD285230D19F}Configs/System/ResourceTypes/HEADLESS/TextureTerrainLayer.conf" { 40 | } 41 | NormalSource SourceTextureClass "{5966E56F1723FFCF}" : "{EAB38BDFD096C0A6}Configs/System/ResourceTypes/HEADLESS/TextureTerrainNormal.conf" { 42 | } 43 | SuperSource SourceTextureClass "{5966E56F1723FE01}" : "{5506B811545F4686}Configs/System/ResourceTypes/HEADLESS/TextureTerrainSuper.conf" { 44 | } 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTest_AI.layer: -------------------------------------------------------------------------------- 1 | $grp SCR_AIWaypoint : "{750A8D1695BD6998}Prefabs/AI/Waypoints/AIWaypoint_Move.et" { 2 | WP3 { 3 | coords 24.115 10.001 250.042 4 | } 5 | WP4 { 6 | coords 24.115 10.001 287.042 7 | } 8 | WP5 { 9 | coords 67.615 10.001 195.042 10 | } 11 | } 12 | $grp SCR_DefendWaypoint : "{93291E72AC23930F}Prefabs/AI/Waypoints/AIWaypoint_Defend.et" { 13 | WP1 { 14 | coords 190.218 10.001 207.565 15 | } 16 | WP2 { 17 | coords 190.218 10.001 309.065 18 | } 19 | } 20 | SCR_AIGroup StaticGroup : "{A2F75E45C66B1C0A}Prefabs/Groups/OPFOR/Group_USSR_MachineGunTeam.et" { 21 | coords 85.159 10.001 178.148 22 | m_aStaticWaypoints { 23 | "WP4" "WP5" "WP1" 24 | } 25 | } -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTest_comments.layer: -------------------------------------------------------------------------------- 1 | $grp CommentEntity { 2 | Comment3 { 3 | coords 240 13.5 260 4 | m_Comment "WALK THROUGH TO SPAWN GROUP" 5 | m_Size 0.5 6 | m_Color 0.071 0.561 0.561 7 | m_FaceCamera 1 8 | m_VisibleOverall 1 9 | m_VisibleIngame 1 10 | } 11 | Comment3B { 12 | coords 240 13 260 13 | m_Comment "ELIMINATING ENDS THE GAME" 14 | m_Size 0.5 15 | m_Color 0.033 0.235 0.235 16 | m_FaceCamera 1 17 | m_VisibleOverall 1 18 | m_VisibleIngame 1 19 | } 20 | Comment2 { 21 | coords 240 13.5 250 22 | m_Comment "WALK THROUGH TO SPAWN GROUP" 23 | m_Size 0.5 24 | m_Color 0.318 0.071 0.561 25 | m_FaceCamera 1 26 | m_VisibleOverall 1 27 | m_VisibleIngame 1 28 | } 29 | Comment1 { 30 | coords 240 13.5 240 31 | m_Comment "WALK THROUGH TO SPAWN GROUP" 32 | m_Size 0.5 33 | m_Color 0.251 0.502 0 34 | m_FaceCamera 1 35 | m_VisibleOverall 1 36 | m_VisibleIngame 1 37 | } 38 | Comment4 { 39 | coords 263 13.5 270 40 | m_Comment "MOVE TO (TASK)" 41 | m_Size 0.5 42 | m_Color 0.502 0 0 43 | m_FaceCamera 1 44 | m_VisibleOverall 1 45 | m_VisibleIngame 1 46 | } 47 | Comment5 { 48 | coords 240 13.5 270 49 | m_Comment "ELIMINATE" 50 | m_Size 0.5 51 | m_Color 0.502 0.376 0 52 | m_FaceCamera 1 53 | m_VisibleOverall 1 54 | m_VisibleIngame 1 55 | } 56 | Comment6 { 57 | coords 255.5 13 270 58 | angleY -90 59 | m_Comment "EXPLOSIVES INSIDE" 60 | m_Size 0.5 61 | m_Color 0.502 0.376 0 62 | m_FaceCamera 1 63 | m_VisibleOverall 1 64 | m_VisibleIngame 1 65 | } 66 | } -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTest_default.layer: -------------------------------------------------------------------------------- 1 | GenericWorldEntity world { 2 | BSP 442 1 407 1 256 0 0 2 129 2 0 3 66 0 17000 4 35 2 17000 5 20 0 25500 6 13 2 25500 7 10 0 29750 8 9 2 29750 -1 -1 2 29750 -1 -1 0 29750 11 12 2 21250 -1 -1 2 21250 -1 -1 2 25500 14 17 0 21250 15 16 2 29750 -1 -1 2 29750 -1 -1 0 21250 18 19 2 21250 -1 -1 2 21250 -1 -1 0 25500 21 28 2 8500 22 25 0 29750 23 24 2 12750 -1 -1 2 12750 -1 -1 0 29750 26 27 2 4250 -1 -1 2 4250 -1 -1 2 8500 29 32 0 21250 30 31 2 12750 -1 -1 2 12750 -1 -1 0 21250 33 34 2 4250 -1 -1 2 4250 -1 -1 2 17000 36 51 0 8500 37 44 2 25500 38 41 0 12750 39 40 2 29750 -1 -1 2 29750 -1 -1 0 12750 42 43 2 21250 -1 -1 2 21250 -1 -1 2 25500 45 48 0 4250 46 47 2 29750 -1 -1 2 29750 -1 -1 0 4250 49 50 2 21250 -1 -1 2 21250 -1 -1 0 8500 52 59 2 8500 53 56 0 12750 54 55 2 12750 -1 -1 2 12750 -1 -1 0 12750 57 58 2 4250 -1 -1 2 4250 -1 -1 2 8500 60 63 0 4250 61 62 2 12750 -1 -1 2 12750 -1 -1 0 4250 64 65 2 4250 -1 -1 2 4250 -1 -1 0 17000 67 98 2 -17000 68 83 0 25500 69 76 2 -8500 70 73 0 29750 71 72 2 -4250 -1 -1 2 -4250 -1 -1 0 29750 74 75 2 -12750 -1 -1 2 -12750 -1 -1 2 -8500 77 80 0 21250 78 79 2 -4250 -1 -1 2 -4250 -1 -1 0 21250 81 82 2 -12750 -1 -1 2 -12750 -1 -1 0 25500 84 91 2 -25500 85 88 0 29750 86 87 2 -21250 -1 -1 2 -21250 -1 -1 0 29750 89 90 2 -29750 -1 -1 2 -29750 -1 -1 2 -25500 92 95 0 21250 93 94 2 -21250 -1 -1 2 -21250 -1 -1 0 21250 96 97 2 -29750 -1 -1 2 -29750 -1 -1 2 -17000 99 114 0 8500 100 107 2 -8500 101 104 0 12750 102 103 2 -4250 -1 -1 2 -4250 -1 -1 0 12750 105 106 2 -12750 -1 -1 2 -12750 -1 -1 2 -8500 108 111 0 4250 109 110 2 -4250 -1 -1 2 -4250 -1 -1 0 4250 112 113 2 -12750 -1 -1 2 -12750 -1 -1 0 8500 115 122 2 -25500 116 119 0 12750 117 118 2 -21250 -1 -1 2 -21250 -1 -1 0 12750 120 121 2 -29750 -1 -1 2 -29750 -1 -1 2 -25500 123 126 0 4250 124 125 2 -21250 -1 -1 2 -21250 -1 -1 0 4250 127 128 2 -29750 -1 -1 2 -29750 -1 -1 2 0 130 193 0 -17000 131 162 2 17000 132 147 0 -8500 133 140 2 25500 134 137 0 -4250 135 136 2 29750 -1 -1 2 29750 -1 -1 0 -4250 138 139 2 21250 -1 -1 2 21250 -1 -1 2 25500 141 144 0 -12750 142 143 2 29750 -1 -1 2 29750 -1 -1 0 -12750 145 146 2 21250 -1 -1 2 21250 -1 -1 0 -8500 148 155 2 8500 149 152 0 -4250 150 151 2 12750 -1 -1 2 12750 -1 -1 0 -4250 153 154 2 4250 -1 -1 2 4250 -1 -1 2 8500 156 159 0 -12750 157 158 2 12750 -1 -1 2 12750 -1 -1 0 -12750 160 161 2 4250 -1 -1 2 4250 -1 -1 2 17000 163 178 0 -25500 164 171 2 25500 165 168 0 -21250 166 167 2 29750 -1 -1 2 29750 -1 -1 0 -21250 169 170 2 21250 -1 -1 2 21250 -1 -1 2 25500 172 175 0 -29750 173 174 2 29750 -1 -1 2 29750 -1 -1 0 -29750 176 177 2 21250 -1 -1 2 21250 -1 -1 0 -25500 179 186 2 8500 180 183 0 -21250 181 182 2 12750 -1 -1 2 12750 -1 -1 0 -21250 184 185 2 4250 -1 -1 2 4250 -1 -1 2 8500 187 190 0 -29750 188 189 2 12750 -1 -1 2 12750 -1 -1 0 -29750 191 192 2 4250 -1 -1 2 4250 -1 -1 0 -17000 194 225 2 -17000 195 210 0 -8500 196 203 2 -8500 197 200 0 -4250 198 199 2 -4250 -1 -1 2 -4250 -1 -1 0 -4250 201 202 2 -12750 -1 -1 2 -12750 -1 -1 2 -8500 204 207 0 -12750 205 206 2 -4250 -1 -1 2 -4250 -1 -1 0 -12750 208 209 2 -12750 -1 -1 2 -12750 -1 -1 0 -8500 211 218 2 -25500 212 215 0 -4250 213 214 2 -21250 -1 -1 2 -21250 -1 -1 0 -4250 216 217 2 -29750 -1 -1 2 -29750 -1 -1 2 -25500 219 222 0 -12750 220 221 2 -21250 -1 -1 2 -21250 -1 -1 0 -12750 223 224 2 -29750 -1 -1 2 -29750 -1 -1 2 -17000 226 241 0 -25500 227 234 2 -8500 228 231 0 -21250 229 230 2 -4250 -1 -1 2 -4250 -1 -1 0 -21250 232 233 2 -12750 -1 -1 2 -12750 -1 -1 2 -8500 235 238 0 -29750 236 237 2 -4250 -1 -1 2 -4250 -1 -1 0 -29750 239 240 2 -12750 -1 -1 2 -12750 -1 -1 0 -25500 242 249 2 -25500 243 246 0 -21250 244 245 2 -21250 -1 -1 2 -21250 -1 -1 0 -21250 247 248 2 -29750 -1 -1 2 -29750 -1 -1 2 -25500 250 253 0 -29750 251 252 2 -21250 -1 -1 2 -21250 -1 -1 0 -29750 254 255 2 -29750 -1 -1 2 -29750 -1 -1 2 5156 257 320 0 0 258 289 0 17000 259 274 2 19578 260 267 0 25500 261 264 2 26789 262 263 0 29750 -1 -1 0 29750 -1 -1 2 26789 265 266 0 21250 -1 -1 0 21250 -1 -1 0 25500 268 271 2 12367 269 270 0 29750 -1 -1 0 29750 -1 -1 2 12367 272 273 0 21250 -1 -1 0 21250 -1 -1 2 19578 275 282 0 8500 276 279 2 26789 277 278 0 12750 -1 -1 0 12750 -1 -1 2 26789 280 281 0 4250 -1 -1 0 4250 -1 -1 0 8500 283 286 2 12367 284 285 0 12750 -1 -1 0 12750 -1 -1 2 12367 287 288 0 4250 -1 -1 0 4250 -1 -1 0 -17000 290 305 2 19578 291 298 0 -8500 292 295 2 26789 293 294 0 -4250 -1 -1 0 -4250 -1 -1 2 26789 296 297 0 -12750 -1 -1 0 -12750 -1 -1 0 -8500 299 302 2 12367 300 301 0 -4250 -1 -1 0 -4250 -1 -1 2 12367 303 304 0 -12750 -1 -1 0 -12750 -1 -1 2 19578 306 313 0 -25500 307 310 2 26789 308 309 0 -21250 -1 -1 0 -21250 -1 -1 2 26789 311 312 0 -29750 -1 -1 0 -29750 -1 -1 0 -25500 314 317 2 12367 315 316 0 -21250 -1 -1 0 -21250 -1 -1 2 12367 318 319 0 -29750 -1 -1 0 -29750 -1 -1 0 3431 321 352 2 -14421 322 337 0 18715 323 330 2 -4632 324 327 0 26357 325 326 2 262 -1 -1 2 262 -1 -1 0 26357 328 329 2 -9526 -1 -1 2 -9526 -1 -1 2 -4632 331 334 0 11073 332 333 2 262 -1 -1 2 262 -1 -1 0 11073 335 336 2 -9526 -1 -1 2 -9526 -1 -1 0 18715 338 345 2 -24210 339 342 0 26357 340 341 2 -19316 -1 -1 2 -19316 -1 -1 0 26357 343 344 2 -29105 -1 -1 2 -29105 -1 -1 2 -24210 346 349 0 11073 347 348 2 -19316 -1 -1 2 -19316 -1 -1 0 11073 350 351 2 -29105 -1 -1 2 -29105 -1 -1 2 -100 353 379 0 -100 354 372 2 2528 355 363 0 1665 356 -1 2 3842 357 360 0 2548 -1 358 2 4499 359 -1 0 2107 -1 -1 0 2548 361 -1 2 3185 -1 362 0 2990 -1 -1 0 1665 364 368 2 1214 365 -1 0 2548 -1 366 2 1871 367 -1 0 2107 -1 -1 2 1214 -1 369 0 782 -1 370 2 557 -1 371 0 341 -1 -1 0 -17050 373 376 0 -8575 374 375 0 -4337 -1 -1 0 -12812 -1 -1 0 -25525 377 378 0 -21287 -1 -1 0 -29762 -1 -1 0 -15284 380 411 2 -17050 381 396 0 -5926 382 389 2 -8575 383 386 0 -1247 384 385 2 -4337 -1 -1 2 -4337 -1 -1 0 -1247 387 388 2 -12812 -1 -1 2 -12812 -1 -1 2 -8575 390 393 0 -10605 391 392 2 -4337 -1 -1 2 -4337 -1 -1 0 -10605 394 395 2 -12812 -1 -1 2 -12812 -1 -1 0 -5926 397 404 2 -25525 398 401 0 -1247 399 400 2 -21287 -1 -1 2 -21287 -1 -1 0 -1247 402 403 2 -29762 -1 -1 2 -29762 -1 -1 2 -25525 405 408 0 -10605 406 407 2 -21287 -1 -1 2 -21287 -1 -1 0 -10605 409 410 2 -29762 -1 -1 2 -29762 -1 -1 2 -17050 412 427 0 -24642 413 420 2 -8575 414 417 0 -19963 415 416 2 -4337 -1 -1 2 -4337 -1 -1 0 -19963 418 419 2 -12812 -1 -1 2 -12812 -1 -1 2 -8575 421 424 0 -29321 422 423 2 -4337 -1 -1 2 -4337 -1 -1 0 -29321 425 426 2 -12812 -1 -1 2 -12812 -1 -1 0 -24642 428 435 2 -25525 429 432 0 -19963 430 431 2 -21287 -1 -1 2 -21287 -1 -1 0 -19963 433 434 2 -29762 -1 -1 2 -29762 -1 -1 2 -25525 436 439 0 -29321 437 438 2 -21287 -1 -1 2 -21287 -1 -1 0 -29321 440 441 2 -29762 -1 -1 2 -29762 -1 -1 3 | boundMins -100 -1.001 -100 4 | boundMaxs 3431.667 407.073 5156.824 5 | blockSize 200 1500 200 6 | SkyPreset "{621C7F2EC2763297}Terrains/Common/Sky/Atmosphere/Atmosphere.emat" 7 | PlanetPreset { 8 | "{C8DD10DC67D45E10}Terrains/Common/Sky/Planets/Stars_01.emat" "{7037BF6589EEFD5D}Terrains/Common/Sky/Planets/Sun_01.emat" "{63C716F4064F5D43}Terrains/Common/Sky/Planets/Moon_01.emat" "{E9A96C987913DBD2}Terrains/Common/Sky/Clouds/Clouds_Distant_Semi01.emat" 9 | } 10 | CloudsRenderer SkyVolCloudsRenderer 11 | CloudsPreset "{D3683C927920C51D}Terrains/Common/Sky/Clouds/Clouds_Volumetric.emat" 12 | OceanMaterial "{5BD82BC098CB7A2C}Terrains/Common/Water/Ocean/ocean.emat" 13 | OceanSimulation "{824449EC2DE478DD}Terrains/Common/Water/Ocean/Simulation/oceanSimIsland.emat" 14 | } 15 | GenericWorldPPEffect PP_SSR { 16 | coords 114.399 0 106.482 17 | Priority 0 18 | Profile 4 19 | { 20 | $grp GenericWorldPPEffect { 21 | GodRays { 22 | Priority 1 23 | Profile 1 24 | } 25 | UnderWater { 26 | Priority 2 27 | Profile 5 28 | } 29 | SSDO { 30 | Priority 14 31 | Profile 3 32 | } 33 | HBAO { 34 | Priority 15 35 | Profile 0 36 | } 37 | HDR { 38 | Priority 16 39 | Profile 2 40 | } 41 | RainEffect { 42 | coords 2522.945 78.034 1718.33 43 | Priority 3 44 | Material "{FA4DE95A7276143D}Common/Postprocess/rain.emat" 45 | } 46 | PPAA { 47 | Priority 17 48 | Profile 6 49 | } 50 | } 51 | } 52 | } 53 | GenericWorldFogEntity Fog_Haze { 54 | coords 3331.667 0.003 3067.172 55 | FakeDistFog 1 56 | HeightDensity 0.94 57 | DistanceDensity 0.362 58 | HeightOffset 0 59 | Color 0.5 0.5 0.5 0 60 | ColorBack 0.4 0.4 0.4 0 61 | } 62 | GenericWorldLightEntity Lighting { 63 | coords 114.399 0 106.482 64 | angleX -45 65 | angleY -155 66 | DirectLightLV 15 67 | DirectLightColor 1 1 1 0 68 | IndirectLightLV 14 69 | IndirectLightColor 1 1 1 0 70 | ShadowFactor 1 71 | PenumbraMultiplier 50 72 | TargetEV 1.7 73 | TargetEVLimitBright 1 74 | TargetEVLimitDark 0 75 | ManualHDRBrightnessLV 13 76 | } 77 | EnvironmentProbeEntity MainProbe { 78 | coords 1448.462 39.705 2918.383 79 | Type "Global placed" 80 | ReflectionColor 1 1 1 1 81 | DiffuseColor 1 1 1 1 82 | TopColorEV 0.5 83 | TopAngleMax 8 84 | TopAngleMin 0 85 | BottomColorEV -0.5 86 | BottomColor 1 1 1 1 87 | BottomAngleMax -5 88 | BottomAngleMin 0 89 | } 90 | SCR_WaterZoneEntity OceanWaterZone { 91 | coords 2162.399 2 2154.482 92 | m_Width 6000 93 | m_Length 6000 94 | m_Depth 500 95 | m_IsOcean 1 96 | } -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTest_environment.layer: -------------------------------------------------------------------------------- 1 | GenericTerrainEntity CoopTestTerrain { 2 | } 3 | GenericEntity Bunker : "{2D60BA8C416641F9}PrefabsEditable/Auto/Props/Military/Sandbags/E_Sandbag_01_bunker_plastic.et" { 4 | coords 255.5 10 270 5 | angleY -90 6 | { 7 | GenericEntity : "{7C93700E1AC4C388}Prefabs/Systems/Arsenal/AmmoBoxes/USSR/AmmoBoxArsenal_Launcher_USSR.et" { 8 | coords 0.634 0.036 1.096 9 | angleY -180 10 | } 11 | GenericEntity : "{C026AEDDA55DB43C}Prefabs/Systems/Arsenal/AmmoBoxes/US/AmmoBoxArsenal_Launcher_US.et" { 12 | coords -0.573 0.043 1.045 13 | angleY -180 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTest_gamemode.layer: -------------------------------------------------------------------------------- 1 | SCR_AIWorld : "{E0A05C76552E7F58}Prefabs/AI/SCR_AIWorld.et" { 2 | } 3 | PerceptionManager PerceptionManager1 : "{028DAEAD63E056BE}Prefabs/World/Game/PerceptionManager.et" { 4 | } 5 | SCR_BaseGameMode GameMode : "{904EC091C347AEA9}Prefabs/MP/Modes/Coop/CoopGameMode.et" { 6 | components { 7 | SCR_RespawnMenuHandlerComponent "{5966E56DB0ABC25D}" { 8 | } 9 | } 10 | } 11 | SCR_FactionManager FactionManager : "{E4075339B4E24E10}Prefabs/MP/Managers/Factions/CoopFactionManager.et" { 12 | } 13 | SCR_LoadoutManager LoadoutManager : "{0C4D399744D5B3FD}Prefabs/MP/Managers/Loadouts/CoopLoadoutManager.et" { 14 | } 15 | SCR_SpawnPoint SpawnPoint_US : "{CEA2B24051A44525}PrefabsEditable/SpawnPoints/E_SpawnPoint_US.et" { 16 | coords 263 9 245 17 | angleY -60 18 | m_Info SCR_UIInfo "{56B4CC4ECACA2C37}" { 19 | Name "Mustang" 20 | } 21 | } -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTest_managers.layer: -------------------------------------------------------------------------------- 1 | SCR_MapEntity MapEntity : "{731564B66F91B107}Prefabs/World/Game/MapEntity.et" { 2 | } 3 | SCR_CameraManager CameraManager : "{33F9FD881E3700CC}Prefabs/World/Game/SCR_CameraManager.et" { 4 | DefaultViewPosition 0 256 0 5 | DefaultViewAngles -30 45 0 6 | DefaultViewFov 60 7 | } 8 | TimeAndWeatherManagerEntity TimeAndWeatherManager : "{A3BAF78F6F03315B}Prefabs/World/Game/TimeAndWeatherManager.et" { 9 | coords 114.399 0 106.482 10 | "Internal variant transition" 0 11 | "Internal subvariant 0" 0 12 | "Internal subvariant 1" 0 13 | } 14 | ProjectileSoundsManager ProjectileSoundsManager : "{B4DA8B0024536625}Prefabs/World/Game/ProjectileSoundsManager.et" { 15 | coords 114.399 0 106.482 16 | } 17 | RadioManagerEntity RadioManager : "{B8E09FAB91C4ECCD}Prefabs/Radio/RadioManager.et" { 18 | coords 114.399 1 106.482 19 | } 20 | ScriptedChatEntity ChatEntity : "{F69BC912AC8236F9}Prefabs/MP/ScriptedChatEntity.et" { 21 | coords 9.341 0 6.234 22 | } 23 | GenericEntity CoopLogic { 24 | coords 265.941 10.001 268.581 25 | userScript " // code here" 26 | constructor ""\ 27 | " SetEventMask(EntityEvent.INIT);"\ 28 | " " 29 | EOnInit ""\ 30 | " SCR_EliminateTask task = SCR_EliminateTask.Cast(GetWorld().FindEntityByName(\"EliminateTaskA\"));"\ 31 | " if (task)"\ 32 | " {"\ 33 | " task.GetOnEliminatedInvoker().Insert(OnTaskComplete);"\ 34 | " }"\ 35 | " }"\ 36 | " "\ 37 | " void OnTaskComplete(SCR_BaseTask task) "\ 38 | " {"\ 39 | " SCR_BaseGameMode gameMode = SCR_BaseGameMode.Cast(GetGame().GetGameMode());"\ 40 | " if (!gameMode || !gameMode.IsMaster())"\ 41 | " return;"\ 42 | " "\ 43 | " Faction faction = task.GetTargetFaction();"\ 44 | " int factionIndex = GetGame().GetFactionManager().GetFactionIndex(faction);"\ 45 | " gameMode.EndGameMode(SCR_GameModeEndData.CreateSimple(SCR_GameModeEndData.ENDREASON_EDITOR_FACTION_VICTORY, -1, factionIndex));"\ 46 | " " 47 | } 48 | SCR_MPDestructionManager DestructionManager : "{9BB369F2803C6F71}Prefabs/MP/MPDestructionManager.et" { 49 | } 50 | SCR_CoopTaskManager CoopTaskManager : "{BA79FF1D825A3F3A}Prefabs/MP/Managers/Tasks/CoopTaskManager.et" { 51 | coords 229.281 10.001 247.172 52 | m_aSupportedTaskTypes { 53 | SCR_EliminateTaskSupportClass "{5968C9C362B1A0E9}" { 54 | m_TaskPrefab "{B866318EB7E84833}Prefabs/Tasks/EliminateTask.et" 55 | } 56 | } 57 | m_aInitialTaskNames { 58 | "MoveTask_1" "EliminateTaskA" "EliminateTaskB" 59 | } 60 | } -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTest_spawnpoints.layer: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exocs/Reforger-Sample-Coop/9c0a741b284a861a515d6821412ad2235945fffa/SampleCoop/Worlds/CoopTest_spawnpoints.layer -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTest_tasks.layer: -------------------------------------------------------------------------------- 1 | Vehicle Target_UAZ : "{259EE7B78C51B624}Prefabs/Vehicles/Wheeled/UAZ469/UAZ469.et" { 2 | components { 3 | SCR_VehicleDamageManagerComponent "{141326E9FD94FE40}" { 4 | "Additional hit zones" { 5 | SCR_FlammableHitZone Hull { 6 | MaxHealth 100 7 | } 8 | } 9 | m_fVehicleDestroyDamage 11880.1 10 | } 11 | } 12 | coords 240 10 270 13 | } 14 | SCR_TriggerTask MoveTask_1 : "{7259F0B101761BD5}Prefabs/Tasks/MoveTask.et" { 15 | coords 263 10 270 16 | m_sName "Move to red trigger!" 17 | m_sDescription "Immediately!" 18 | m_eAssignMessage NONE 19 | m_eUnassignMessage NONE 20 | { 21 | SCR_BaseFactionTriggerEntity { 22 | ID "55D072570E7E8ABF" 23 | coords 0 0 0 24 | SphereRadius 2 25 | DrawShape 1 26 | ShapeColor 0.502 0 0 0.392 27 | m_sOwnerFactionKey "US" 28 | } 29 | } 30 | } 31 | $grp SCR_EliminateTask : "{B866318EB7E84833}Prefabs/Tasks/EliminateTask.et" { 32 | EliminateTaskB { 33 | coords 86.897 10.001 176.849 34 | } 35 | EliminateTaskA { 36 | coords 239.915 10.001 270.184 37 | m_sName "Eliminate UAZ" 38 | } 39 | } -------------------------------------------------------------------------------- /SampleCoop/Worlds/CoopTest_triggers.layer: -------------------------------------------------------------------------------- 1 | $grp SCR_BaseTriggerEntity : "{3F294A5E2B52B65E}Prefabs/MP/Triggers/CoopTriggerSpawner.et" { 2 | DynamicTriggerSpawn1 { 3 | components { 4 | SCR_AISpawnerComponent "{5966F2A840D93A01}" { 5 | m_vSpawnPosition 200.193 10 242.115 6 | m_vSpawnRotation 0 87 0 7 | } 8 | RplComponent "{5966F2A87A6B4E62}" { 9 | } 10 | } 11 | coords 240 10 240 12 | SphereRadius 2 13 | DrawShape 1 14 | ShapeColor 0.318 0.561 0.071 0.392 15 | } 16 | DynamicTriggerSpawn2 { 17 | components { 18 | SCR_AISpawnerComponent "{5966F2A840D93A01}" { 19 | m_rnDefaultPrefab "{30ED11AA4F0D41E5}Prefabs/Groups/OPFOR/Group_USSR_FireGroup.et" 20 | m_vSpawnPosition 207.415 10 269.989 21 | m_vSpawnRotation 0 40 0 22 | } 23 | RplComponent "{5966F2A87A6B4E62}" { 24 | } 25 | } 26 | coords 240 10 260 27 | userScript " protected SCR_AISpawnerComponent m_pSpawner;" 28 | SphereRadius 2 29 | DrawShape 1 30 | ShapeColor 0.157 0.624 0.624 0.392 31 | EOnInit ""\ 32 | " super.EOnInit(owner);"\ 33 | " m_pSpawner = SCR_AISpawnerComponent.Cast(owner.FindComponent(SCR_AISpawnerComponent));"\ 34 | " if (!m_pSpawner)"\ 35 | " return;"\ 36 | " "\ 37 | " m_pSpawner.GetOnEmptyInvoker().Insert(OnTriggerEmpty);"\ 38 | " }"\ 39 | " "\ 40 | " protected void OnTriggerEmpty()"\ 41 | " {"\ 42 | " // Unhook from the spawner"\ 43 | " m_pSpawner.GetOnEmptyInvoker().Remove(OnTriggerEmpty);"\ 44 | " "\ 45 | " SCR_BaseGameMode gm = SCR_BaseGameMode.Cast(GetGame().GetGameMode());"\ 46 | " if (!gm.IsMaster())"\ 47 | " return;"\ 48 | " "\ 49 | " Faction faction = GetGame().GetFactionManager().GetFactionByKey(\"US\");"\ 50 | " int factionIdx = GetGame().GetFactionManager().GetFactionIndex(faction);"\ 51 | " gm.EndGameMode(SCR_GameModeEndData.CreateSimple(SCR_GameModeEndData.ENDREASON_EDITOR_FACTION_VICTORY, -1, factionIdx));"\ 52 | " " 53 | } 54 | DynamicTriggerSpawn3 { 55 | components { 56 | SCR_AISpawnerComponent "{5966F2A840D93A01}" { 57 | m_vSpawnPosition 11.799 10 243.045 58 | m_vSpawnRotation 0 87 0 59 | m_aWaypointsList { 60 | "WP3" "WP4" 61 | } 62 | } 63 | RplComponent "{5966F2A87A6B4E62}" { 64 | } 65 | } 66 | coords 240 10 250 67 | SphereRadius 2 68 | DrawShape 1 69 | ShapeColor 0.318 0.071 0.561 0.392 70 | } 71 | } 72 | SCR_SpawnPoint SpawnPoint_US2 : "{CEA2B24051A44525}PrefabsEditable/SpawnPoints/E_SpawnPoint_US.et" { 73 | coords 257.5 10 235.474 74 | angleY -60 75 | m_Info SCR_UIInfo "{56B4CC4ECACA2C37}" { 76 | Name "Armadillo" 77 | } 78 | } -------------------------------------------------------------------------------- /SampleCoop/addon.gproj: -------------------------------------------------------------------------------- 1 | GameProject { 2 | ID "SampleCoop" 3 | GUID "5966E5428E081A6C" 4 | TITLE "SampleCoop" 5 | Dependencies { 6 | "58D0FB3206B6F859" 7 | } 8 | } --------------------------------------------------------------------------------