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); } }