Capture current mission, AI, map and administration development
Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user