Class Ext_T_GhostHelper extends Ext_TraitDataStore; var KFPawn_Human LastDied; var float LastDiedTimer,TeleTime; var vector ResPoint,TeleStartPoint; var ExtSpawnPointHelper SpawnPointer; var bool bTeleporting,bIsDelayed; function bool CanResPlayer(KFPawn_Human Other, byte Level) { if (bTeleporting) { if (LastDied!=None) LastDied.Health = 9999; return true; } if (LastDied==Other) { if (Level==1 || LastDiedTimer>WorldInfo.TimeSeconds) return false; } else if (Level==1 && Rand(2)==0) return false; LastDied = Other; bTeleporting = true; if (SpawnPointer==None) SpawnPointer = class'ExtSpawnPointHelper'.Static.FindHelper(WorldInfo); ResPoint = SpawnPointer.PickBestSpawn().Location; LastDied.FindSpot(vect(36,36,86),ResPoint); if (VSizeSq(LastDied.Location-ResPoint)<1.f) // Prevent division by zero errors in future. ResPoint.Z+=5; Enable('Tick'); StartResurrect(); return true; } final function StartResurrect() { TeleStartPoint = LastDied.Location; LastDied.Health = 9999; LastDied.LastStartTime = WorldInfo.TimeSeconds; if (ExtHumanPawn(LastDied)!=None) { ExtHumanPawn(LastDied).bCanBecomeRagdoll = false; if (!ExtHumanPawn(LastDied).CanBeRedeemed()) { bIsDelayed = true; return; } } LastDied.SetCollision(false); LastDied.bIgnoreForces = true; LastDied.bAmbientCreature = true; LastDied.SetPhysics(PHYS_None); LastDied.bCollideWorld = false; TeleTime = FClamp(VSize(ResPoint-TeleStartPoint)/900.f,1.f,10.f); LastDiedTimer = WorldInfo.TimeSeconds+TeleTime; } function Tick(float Delta) { if (!bTeleporting) { Disable('Tick'); return; } if (LastDied==None || LastDied.Health<=0) { bTeleporting = false; return; } if (bIsDelayed) { bIsDelayed = false; StartResurrect(); return; } Delta = (LastDiedTimer-WorldInfo.TimeSeconds); if (Delta<=0) { EndGhostTeleport(); return; } Delta /= TeleTime; LastDied.Velocity = Normal(ResPoint-TeleStartPoint)*900.f; LastDied.SetLocation(TeleStartPoint*Delta+ResPoint*(1.f-Delta)); if (LastDied.Physics!=PHYS_None) LastDied.SetPhysics(PHYS_None); } final function EndGhostTeleport() { LastDiedTimer = WorldInfo.TimeSeconds+180.f; bTeleporting = false; LastDied.Health = LastDied.HealthMax; LastDied.SetCollision(true); LastDied.bIgnoreForces = false; LastDied.bAmbientCreature = false; LastDied.bCollideWorld = true; LastDied.FindSpot(vect(36,36,86),ResPoint); LastDied.SetLocation(ResPoint); LastDied.SetPhysics(PHYS_Falling); LastDied.Velocity = vect(0,0,0); LastDied.LastStartTime = WorldInfo.TimeSeconds; // For spawn protection, if any. if (LastDied.IsDoingSpecialMove()) // Stop any grabbing zeds. LastDied.EndSpecialMove(); if (ExtHumanPawn(LastDied)!=None) ExtHumanPawn(LastDied).bCanBecomeRagdoll = true; } function Destroyed() { if (bTeleporting && LastDied!=None && LastDied.Health>0) EndGhostTeleport(); } defaultproperties { }