1[
EntityEditorProps(
category:
"GameScripted/ScriptWizard", description:
"Component to be used with barrack compositions, handing unit spawning.", color:
"0 0 255 255")]
4 [
Attribute(defvalue:
"{93291E72AC23930F}Prefabs/AI/Waypoints/AIWaypoint_Defend.et",
UIWidgets.ResourceNamePicker,
desc:
"Default waypoint prefab",
"et",
category:
"Defender Spawner")]
10 [
Attribute(defvalue :
"Wedge",
UIWidgets.Auto,
desc:
"Group formation created on rally point. Available formations are found on SCR_AIWorld entity",
category:
"Defender Spawner")]
54 [
Attribute(defvalue:
"30",
params:
"0 inf",
desc:
"Minimum distance to hostile players for spawner to work",
"et")]
63 [
Attribute(SCR_ECharacterRank.CORPORAL.ToString(), uiwidget:
UIWidgets.ComboBox, enums: ParamEnumArray.FromEnum(SCR_ECharacterRank))]
75 protected ref array<ref Tuple3<SCR_AIActionBase, AIAgent, WorldTimestamp>>
m_aUnitsOnMove = {};
139 Print(
"SCR_Faction Config lacks catalog of GROUP type. SCR_DefenderSpawnerComponent won't work without it",
LogLevel.ERROR);
143 array<SCR_EntityCatalogEntry> entityEntries = {};
144 array<typename> includedDataClasses = {};
150 if (!entityEntries.IsEmpty())
185 GetGame().GetResourceGrid().UpdateInteractor(consumer);
187 return consumer.GetAggregatedResourceValue();
197 SCR_ResourceInteractor interactor;
206 interactor = generator;
217 interactor = consumer;
219 consumer.RequestConsumtion(-value);
244 if (!playerController)
247 SCR_ChimeraCharacter chimeraCharacter = SCR_ChimeraCharacter.Cast(playerController.GetControlledEntity());
248 if (!chimeraCharacter || chimeraCharacter.GetFaction() !=
GetFaction())
277 AIWorld aiWorld =
GetGame().GetAIWorld();
285 SCR_EntitySpawnerSlotComponent slot =
GetFreeSlot();
291 if (
m_AIgroup.m_aUnitPrefabSlots.Count() > 0)
295 spawnParams.TransformMode = ETransformMode.WORLD;
296 slot.GetOwner().GetTransform(spawnParams.Transform);
310 AIControlComponent control = AIControlComponent.Cast(ai.
FindComponent(AIControlComponent));
312 control.ActivateAI();
314 AIAgent agent = control.GetAIAgent();
324 SCR_EntityLabelPointComponent rallyPointComponent = slot.GetRallyPoint();
325 if (rallyPointComponent && prefabData)
327 IEntity rallyPointEntity = rallyPointComponent.GetOwner();
330 SCR_AIUtilityComponent utilityComponent = SCR_AIUtilityComponent.Cast(agent.FindComponent(SCR_AIUtilityComponent));
341 posLocal = posLocal + formationOffset;
344 vector posWorld = posLocal.Multiply4(rpTransform);
353 utilityComponent.AddAction(moveBehavior);
380 if (!characterController)
383 IEntity character = characterController.GetOwner();
389 if (AIaction.param2.GetControlledEntity() != character)
411 if (AIaction.param1 != action)
414 agent = AIaction.param2;
419 SCR_ChimeraCharacter agentEntity = SCR_ChimeraCharacter.Cast(agent.GetControlledEntity());
437 if (agentEntity.GetFaction() ==
m_AIgroup.GetFaction())
452 foreach (SCR_EntitySpawnerSlotComponent slot :
m_aChildSlots)
454 if (!slot.IsOccupied())
458 foreach (SCR_EntitySpawnerSlotComponent slot :
m_aNearSlots)
460 if (!slot.IsOccupied())
471 array<ResourceName> unitPrefabs = {};
472 unitPrefabs.Copy(
m_AIgroup.m_aUnitPrefabSlots);
474 array<AIAgent> outAgents = {};
477 foreach (AIAgent agent : outAgents)
479 IEntity controlledEntity = agent.GetControlledEntity();
480 if (!controlledEntity)
488 unitPrefabs.RemoveItem(aiResource);
497 ent = groups.param2.GetControlledEntity();
506 unitPrefabs.RemoveItem(prefabData.GetPrefabName());
533 SCR_EntitySpawnerSlotComponent slot =
GetFreeSlot();
538 params.TransformMode = ETransformMode.WORLD;
539 slot.GetOwner().GetTransform(
params.Transform);
547 if (!group || group.m_aUnitPrefabSlots.Count() == 0)
567 SCR_EntitySpawnerSlotComponent slot =
GetFreeSlot();
572 params.TransformMode = ETransformMode.WORLD;
574 SCR_EntityLabelPointComponent rallyPoint = slot.GetRallyPoint();
577 rallyPoint.GetOwner().GetTransform(
params.Transform);
579 slot.GetOwner().GetTransform(
params.Transform);
586 if (!wpRes.IsValid())
602 array<int> players = {};
603 GetGame().GetPlayerManager().GetPlayers(players);
609 SCR_ChimeraCharacter playerEntity;
613 SCR_EDefenderSpawnerState outState = SCR_EDefenderSpawnerState.DEFENDERS_DESPAWN;
615 foreach (
int player : players)
617 playerEntity = SCR_ChimeraCharacter.Cast(
GetGame().GetPlayerManager().GetPlayerControlledEntity(player));
621 dist =
vector.DistanceSq(playerEntity.GetOrigin(), origin);
623 if (outState == SCR_EDefenderSpawnerState.DEFENDERS_DESPAWN)
625 if (dist < spawnDistanceSq)
627 outState = SCR_EDefenderSpawnerState.DEFENDERS_ENABLED;
631 outState = SCR_EDefenderSpawnerState.DEFENDERS_DESPAWN;
636 if (dist < minSpawnDistanceSq && playerEntity.GetFaction() !=
GetFaction())
638 outState = SCR_EDefenderSpawnerState.DEFENDERS_PAUSED_SPAWN;
653 AIWorld aiWorld =
GetGame().GetAIWorld();
658 if ((aiWorld.GetCurrentAmountOfLimitedAIs() + 1) >= aiWorld.GetAILimit())
673 if (
m_bEnableSpawning && (distanceState == SCR_EDefenderSpawnerState.DEFENDERS_ENABLED))
679 for (
int i = count; i >= 0; i--)
719 if (distanceState == SCR_EDefenderSpawnerState.DEFENDERS_DESPAWN)
755 SCR_EntityHelper.DeleteEntityAndChildren(groupWaypoint.param2.GetControlledEntity());
787 super.EOnInit(owner);
794 BaseGameMode gameMode =
GetGame().GetGameMode();
798 m_GroupSpawningManager = SCR_SpawnerAIGroupManagerComponent.Cast(gameMode.FindComponent(SCR_SpawnerAIGroupManagerComponent));
801 Print(
"SCR_DefenderSpawnerComponent requires SCR_SpawnerAIGroupManagerComponent attached to gamemode to work properly!",
LogLevel.ERROR);
818 super.OnPostInit(owner);
835 if (!groupWaypoint.param2)
838 SCR_EntityHelper.DeleteEntityAndChildren(groupWaypoint.param2.GetControlledEntity());
866enum SCR_EDefenderSpawnerState
ArmaReforgerScripted GetGame()
SCR_CacheNoteComponentClass ScriptComponentClass RplProp()] protected ref array< string > m_aLines
SCR_CampaignFaction GetFaction()
void SCR_CampaignSuppliesComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
void SCR_CharacterRankComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
SCR_CharacterSoundComponentClass GetComponentData()
enum SCR_ECompassType EntityEditorProps(category:"GameScripted/Gadgets", description:"Compass", color:"0 0 255 255")
Prefab data class for compass component.
SCR_DefenderSpawnerComponent DEFENDERS_ENABLED
SCR_DefenderSpawnerComponent DEFENDERS_PAUSED_SPAWN
ScriptInvokerBase< OnDefenderGroupSpawnedDelegate > OnDefenderGroupSpawnedInvoker
func OnDefenderGroupSpawnedDelegate
SCR_DestructionSynchronizationComponentClass ScriptComponentClass int index
void SCR_GameModeCampaign(IEntitySource src, IEntity parent)
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
ref array< SCR_EntitySpawnerSlotComponent > m_aNearSlots
ref array< SCR_EntitySpawnerSlotComponent > m_aChildSlots
proto external Managed FindComponent(typename typeName)
proto external vector GetOrigin()
proto external void GetWorldTransform(out vector mat[])
See IEntity::GetTransform.
proto external BaseWorld GetWorld()
proto external EntityPrefabData GetPrefabData()
Object holding reference to resource. In destructor release the resource.
static void IgnoreSpawning(bool ignore)
ref OnPlayerDeathWithParamInvoker m_OnPlayerDeathWithParam
float m_fDefaultWaypointCompletionRadius
ResourceName GetDefaultWaypointPrefab()
float GetDefaultWaypointCompletionRadius()
string GetExitFormation()
ResourceName m_sDefaultWaypointPrefab
Service providing group of defenders defined in faction. Requires SCR_EnableDefenderAction on ActionM...
SCR_EntitySpawnerSlotComponent GetFreeSlot()
SCR_CampaignSuppliesComponent m_SupplyComponent
static const int SPAWN_CHECK_INTERVAL
OnDefenderGroupSpawnedInvoker GetOnDefenderGroupSpawned()
ref array< ResourceName > m_aRefillQueue
void OnMovingCharacterDeath(SCR_CharacterControllerComponent characterController, IEntity killerEntity, Instigator killer)
SCR_CampaignSuppliesComponent GetSpawnerSupplyComponent()
void AssignSupplyComponent(notnull SCR_CampaignSuppliesComponent supplyComp)
bool m_bSuppliesConsumptionEnabled
ref array< SCR_AIGroup > m_aPreviousGroups
ref array< EEditableEntityLabel > m_aAllowedLabels
RplComponent m_RplComponent
override void EOnInit(IEntity owner)
float m_fMinHostilePlayerDistance
void OnMoveFinished(SCR_AIActionBase action)
void AddSupplies(float value)
bool UserRankCheck(IEntity user)
SCR_ResourceComponent m_ResourceComponent
SCR_EntityCatalogEntry m_GroupEntry
static const int SPAWN_RADIUS_MIN
void ReinforceGroup()
Refills AI's in defender group.
SCR_EDefenderSpawnerState GetPlayerDistanceState()
SCR_ECharacterRank GetMinimumRank()
ref OnDefenderGroupSpawnedInvoker m_OnDefenderGroupSpawned
void EnableSpawning(bool enable, int playerID)
WorldTimestamp m_fNextRespawnTime
ref array< EEditableEntityLabel > m_aIgnoredLabels
int m_iDespawnedGroupMembers
void AssignDefenderGroupDataFromOwningFaction()
Set Defender group data from Entity catalog on owning faction.
override void OnPostInit(IEntity owner)
static const int SPAWN_RADIUS_MAX
static const int SPAWN_GROUP_JOIN_TIMEOUT
void ~SCR_DefenderSpawnerComponent()
override void OnFactionChanged(FactionAffiliationComponent owner, Faction previousFaction, Faction faction)
void HandleGroup()
Manages automatic group spawning.
bool IsSpawningEnabled()
Returns true if spawner is currently activated.
SCR_ECharacterRank m_eMinimumRankForEnabling
ref array< ref Tuple3< SCR_AIActionBase, AIAgent, WorldTimestamp > > m_aUnitsOnMove
ref array< IEntity > m_aOldUnits
SCR_SpawnerAIGroupManagerComponent m_GroupSpawningManager
void SpawnUnit(ResourceName unitResource, bool consumeSupplies=true)
void SetWaypoint(SCR_AIWaypoint wp)
float GetSpawnerSupplies()
Get available supplies.
Get supply cost of spawning Entity return Supply cost *int GetSupplyCost()
SCR_EntityCatalog GetFactionEntityCatalogOfType(EEntityCatalogType catalogType, bool printNotFound=true)
SCR_ResourceGenerationResponse RequestGeneration(float resourceAmount, SCR_ResourceGenerator generator=null)
IEntity GetOwner()
Owner entity of the fuel tank.
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
SCR_FieldOfViewSettings Attribute
EntityEvent
Various entity events.
proto external PlayerController GetPlayerController()