Integrate physical radio calls and finite vehicle maintenance

This commit is contained in:
2026-09-20 06:37:17 +02:00
parent 963cab50c0
commit 915476f709
152 changed files with 26426 additions and 28 deletions
@@ -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();
}
}