KF2-Server-Extension/ServerExt/Classes/VS_ZedRecentZed.uc
2023-05-14 05:49:12 +03:00

165 lines
4.1 KiB
Ucode

class VS_ZedRecentZed extends VS_ZedClotBase;
var repnotify bool bWasWoken;
var transient float WakeUpAnimTime;
replication
{
if (true)
bWasWoken;
}
simulated function float StartAttackAnim(byte Num) // Return animation duration.
{
if (FPHandModel!=None)
FPHandModel.PlayHandsAnim('Atk_Combo1_V3',1.5f);
return PlayBodyAnim('Atk_Combo1_V3',EAS_UpperBody,1.5f);
}
simulated event ReplicatedEvent(name VarName)
{
switch (VarName)
{
case 'bWasWoken':
if (bWasWoken)
WakeUp();
break;
default:
Super.ReplicatedEvent(VarName);
}
}
simulated function WakeUp() // Just spawned from transformed into a zombie.
{
bWasWoken = true;
bNoWeaponFiring = true;
WakeUpAnimTime = BodyStanceNodes[EAS_FullBody].PlayCustomAnim('Getup_Fast_F_V1',1.f);
SetTimer(WakeUpAnimTime,false,'GotUp');
GoToState('WakingUp');
}
simulated function GotUp()
{
if (Health<=0)
return;
ClearTimer('GotUp');
bWasWoken = false;
bNoWeaponFiring = false;
if (WorldInfo.NetMode!=NM_Client)
{
if (ExtPlayerController(Controller)!=None)
ExtPlayerController(Controller).EnterRagdollMode(false);
else if (Controller!=None)
Controller.ReplicatedEvent('EndRagdollMove');
}
GoToState('Auto');
}
state WakingUp
{
Ignores TakeDamage, FaceRotation;
function UnPossessed()
{
Super.UnPossessed();
ClearTimer('GotUp');
KilledBy(None);
LifeSpan = 2.f;
}
}
simulated function NotifyTeamChanged()
{
// Applies Character Info for < ROLE_Authority
if (PlayerReplicationInfo != None)
SetCharacterArch(GetCharacterInfo());
}
simulated function SetCharacterAnimationInfo()
{
local KFCharacterInfo_Monster M;
Super.SetCharacterAnimationInfo();
// Keep monster animations.
M = KFCharacterInfo_Monster'ZED_ARCH.ZED_Clot_UnDev_Archetype';
Mesh.AnimSets = M.AnimSets;
if (Mesh.AnimTreeTemplate != M.AnimTreeTemplate)
Mesh.SetAnimTreeTemplate(M.AnimTreeTemplate);
if (M.AnimArchetype != None)
PawnAnimInfo = M.AnimArchetype;
}
simulated function KFCharacterInfoBase GetCharacterInfo()
{
if (ExtPlayerReplicationInfo(PlayerReplicationInfo)!=None)
return ExtPlayerReplicationInfo(PlayerReplicationInfo).GetSelectedArch();
return Super.GetCharacterInfo();
}
simulated function SetCharacterArch(KFCharacterInfoBase Info, optional bool bForce)
{
local KFPlayerReplicationInfo KFPRI;
KFPRI = KFPlayerReplicationInfo(PlayerReplicationInfo);
if (Info != CharacterArch)
{
// Set Family Info
CharacterArch = Info;
CharacterArch.SetCharacterFromArch(self, KFPRI);
class'ExtCharacterInfo'.Static.SetCharacterMeshFromArch(KFCharacterInfo_Human(CharacterArch), self, KFPRI);
class'ExtCharacterInfo'.Static.SetFirstPersonArmsFromArch(KFCharacterInfo_Human(CharacterArch), self, KFPRI);
SetCharacterAnimationInfo();
// Sounds
SoundGroupArch = Info.SoundGroupArch;
if (WorldInfo.NetMode != NM_DedicatedServer)
{
// refresh weapon attachment (attachment bone may have changed)
if (WeaponAttachmentTemplate != None)
{
WeaponAttachmentChanged(true);
}
}
if (CharacterArch != none)
{
if (CharacterArch.VoiceGroupArchName != "")
VoiceGroupArch = class<KFPawnVoiceGroup>(class'ExtCharacterInfo'.Static.SafeLoadObject(CharacterArch.VoiceGroupArchName, class'Class'));
}
}
}
// Dont gore and gib because human chars don't support it.
simulated function HandlePartialGoreAndGibs(class<KFDamageType> DmgType,vector HitLocation,vector HitDirection,name HitBoneName,bool ObliterateGibs);
simulated function PlayHeadAsplode();
simulated function bool PlayDismemberment(int InHitZoneIndex, class<KFDamageType> InDmgType, optional vector HitDirection)
{
return false;
}
event OnRigidBodyLinearConstraintViolated(name StretchedBoneName);
simulated function ApplyHeadChunkGore(class<KFDamageType> DmgType, vector HitLocation, vector HitDirection);
defaultproperties
{
Health=300
HealthMax=300
FPHandOffset=(X=-35,Z=-60)
HitsPerAttack=1
HPScaler=0.4
MonsterArchPath="ZED_ARCH.ZED_Clot_UnDev_Archetype"
CharacterMonsterArch=KFCharacterInfo_Monster'ZED_ARCH.ZED_Clot_UnDev_Archetype'
GroundSpeed=700
MeleeDamage=35
// Stats
XPValues(0)=11
XPValues(1)=11
XPValues(2)=11
XPValues(3)=11
}