Integrate physical radio calls and finite vehicle maintenance
This commit is contained in:
@@ -131,6 +131,7 @@ class ERR_EnemyEquipmentEntry
|
||||
|
||||
class ERR_EnemyEquipmentGroup
|
||||
{
|
||||
ref ERR_EnemyRadio Radio;
|
||||
SCR_AIGroup Group;
|
||||
int Scans;
|
||||
float ReadyAt;
|
||||
@@ -144,17 +145,23 @@ class ERR_EnemyEquipment
|
||||
protected float m_NextCheck;
|
||||
protected bool m_Stopped;
|
||||
void ERR_EnemyEquipment(ERR_GameMode mode) { m_Mode = mode; }
|
||||
void RegisterGroup(SCR_AIGroup group)
|
||||
void RegisterGroup(SCR_AIGroup group, int radioId = 0, bool fitRadios = true)
|
||||
{
|
||||
if (m_Stopped || !Replication.IsServer() || !group || m_Groups.Count() >= 128) return;
|
||||
foreach (ERR_EnemyEquipmentGroup existing : m_Groups) if (existing.Group == group) return;
|
||||
ERR_EnemyEquipmentGroup state = new ERR_EnemyEquipmentGroup(); state.Group = group;
|
||||
state.ReadyAt = GetGame().GetWorld().GetWorldTime() + 2000;
|
||||
if (fitRadios && radioId > 0) state.Radio = new ERR_EnemyRadio(group, radioId);
|
||||
m_Groups.Insert(state);
|
||||
}
|
||||
void UnregisterGroup(SCR_AIGroup group)
|
||||
{
|
||||
foreach (ERR_EnemyEquipmentGroup state : m_Groups) if (state.Group == group) state.Scans = 5;
|
||||
foreach (ERR_EnemyEquipmentGroup state : m_Groups)
|
||||
{
|
||||
if (state.Group != group) continue;
|
||||
state.Scans = 5;
|
||||
if (state.Radio) state.Radio.Stop();
|
||||
}
|
||||
foreach (ERR_EnemyEquipmentEntry entry : m_Entries) if (entry.Group == group) entry.Stop(m_Mode);
|
||||
}
|
||||
protected bool Known(IEntity actor)
|
||||
@@ -182,6 +189,7 @@ class ERR_EnemyEquipment
|
||||
entry.Combat = SCR_AICombatComponent.Cast(actor.FindComponent(SCR_AICombatComponent));
|
||||
if (entry.Combat) entry.Combat.ERR_BindEnemySkill(m_Mode, state.Group);
|
||||
m_Entries.Insert(entry);
|
||||
if (state.Radio) state.Radio.Register(actor);
|
||||
}
|
||||
}
|
||||
foreach (ERR_EnemyEquipmentEntry entry : m_Entries)
|
||||
@@ -198,12 +206,15 @@ class ERR_EnemyEquipment
|
||||
entry.Check(m_Mode);
|
||||
if (entry.Optics) entry.Optics.Check(m_Mode);
|
||||
}
|
||||
foreach (ERR_EnemyEquipmentGroup state : m_Groups)
|
||||
if (state.Radio && now >= state.ReadyAt) state.Radio.Check(m_Mode);
|
||||
}
|
||||
void Stop()
|
||||
{
|
||||
if (m_Stopped) return;
|
||||
m_Stopped = true;
|
||||
foreach (ERR_EnemyEquipmentEntry entry : m_Entries) entry.Stop(m_Mode);
|
||||
foreach (ERR_EnemyEquipmentGroup state : m_Groups) if (state.Radio) state.Radio.Stop();
|
||||
m_Groups.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user