KF2-Server-Extension/ServerExt/Classes/Ext_T_GhostHelper.uc
2020-11-28 23:12:58 +03:00

124 lines
2.8 KiB
Ucode

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
{
}