Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
42 lines
2.3 KiB
C
42 lines
2.3 KiB
C
modded class ArmaReforgerScripted
|
|
{
|
|
protected bool m_ERRChecked;
|
|
protected int m_ERRFailures;
|
|
protected void ERR_Check(bool pass, string label)
|
|
{
|
|
if (pass) Print("ERR PROTECTION PASS: " + label);
|
|
else { m_ERRFailures++; Print("ERR PROTECTION FAIL: " + label); }
|
|
}
|
|
override void OnUpdate(BaseWorld world, float timeslice)
|
|
{
|
|
super.OnUpdate(world, timeslice);
|
|
ERR_GameMode mode = ERR_GameMode.Get();
|
|
if (m_ERRChecked || !mode || !mode.Active()) return;
|
|
m_ERRChecked = true;
|
|
IEntity actor = ERR_Actors.Spawn(mode.Factions().PrisonerPrefab, mode.PrisonPosition() + "0 0 30");
|
|
DamageManagerComponent damage;
|
|
if (actor) damage = DamageManagerComponent.Cast(actor.FindComponent(DamageManagerComponent));
|
|
ERR_Check(damage != null, "real mission prisoner has a native damage manager");
|
|
if (!damage) { Print("ERR PROTECTION COMPLETE failures=1"); return; }
|
|
ref ERR_SpawnTicket ticket = new ERR_SpawnTicket(); ticket.Actor = actor;
|
|
ERR_Check(ticket.ProtectLoading() && !damage.IsDamageHandlingEnabled(), "admission ticket disables native damage during loading");
|
|
float health = damage.GetHealth();
|
|
vector hit[3]; hit[0] = actor.GetOrigin(); hit[1] = "0 0 1";
|
|
damage.HandleDamage(new SCR_DamageContext(EDamageType.TRUE, 20, hit, actor, damage.GetDefaultHitZone(), Instigator.CreateInstigator(actor), null, -1, -1));
|
|
ERR_Check(damage.GetHealth() == health, "real damage request cannot hurt the waiting prisoner");
|
|
ticket.ReleaseProtection(); ticket.ReleaseProtection();
|
|
ERR_Check(damage.IsDamageHandlingEnabled(), "verified-handover release restores damage and is idempotent");
|
|
damage.HandleDamage(new SCR_DamageContext(EDamageType.TRUE, 20, hit, actor, damage.GetDefaultHitZone(), Instigator.CreateInstigator(actor), null, -1, -1));
|
|
ERR_Check(damage.GetHealth() < health, "same native damage request works after release");
|
|
damage.EnableDamageHandling(false);
|
|
ERR_Check(ticket.ProtectLoading(), "pre-existing protected state accepted");
|
|
ticket.ReleaseProtection();
|
|
ERR_Check(!damage.IsDamageHandlingEnabled(), "pre-existing protection is retained");
|
|
damage.EnableDamageHandling(true);
|
|
ticket.ProtectLoading(); ticket = null;
|
|
ERR_Check(damage.IsDamageHandlingEnabled(), "discarded ticket destructor releases its protection");
|
|
ERR_Actors.DeleteSpawned(actor);
|
|
PrintFormat("ERR PROTECTION COMPLETE failures=%1", m_ERRFailures);
|
|
}
|
|
}
|