145 lines
5.8 KiB
Ucode
145 lines
5.8 KiB
Ucode
// Code originally was taken from Scary Ghost's Super Zombies mutator
|
|
class ZombieHusk_GRITTIER extends ZombieHusk;
|
|
|
|
#exec OBJ LOAD FILE=ScrnZedPack_T.utx
|
|
|
|
var int ShotsRemaining;
|
|
|
|
static simulated function PreCacheMaterials(LevelInfo myLevel)
|
|
{//should be derived and used.
|
|
myLevel.AddPrecacheMaterial(Texture'ScrnZedPack_T.husk_grittier.husk_grittier_diff');
|
|
myLevel.AddPrecacheMaterial(Texture'ScrnZedPack_T.husk_grittier.husk_grittier_emissive_mask');
|
|
myLevel.AddPrecacheMaterial(Combiner'ScrnZedPack_T.husk_grittier.husk_grittier_energy_cmb');
|
|
myLevel.AddPrecacheMaterial(Combiner'ScrnZedPack_T.husk_grittier.husk_grittier_env_cmb');
|
|
myLevel.AddPrecacheMaterial(Combiner'ScrnZedPack_T.husk_grittier.husk_grittier_fire_cmb');
|
|
myLevel.AddPrecacheMaterial(Material'ScrnZedPack_T.husk_grittier.husk_grittier_shdr');
|
|
myLevel.AddPrecacheMaterial(Combiner'ScrnZedPack_T.husk_grittier.husk_grittier_cmb');
|
|
}
|
|
|
|
simulated function PostBeginPlay()
|
|
{
|
|
super.PostBeginPlay();
|
|
ShotsRemaining = Rand(default.ShotsRemaining) + 1;
|
|
}
|
|
|
|
function TakeDamage(int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector momentum, class<DamageType> DamType, optional int HitIndex)
|
|
{
|
|
if (InstigatedBy == none || class<KFWeaponDamageType>(DamType) == none)
|
|
Super(Monster).TakeDamage(Damage, instigatedBy, hitLocation, momentum, DamType); // skip NONE-reference error
|
|
else
|
|
Super(KFMonster).TakeDamage(Damage, instigatedBy, hitLocation, momentum, DamType);
|
|
}
|
|
|
|
function RangedAttack(Actor A) {
|
|
local int LastFireTime;
|
|
|
|
if ( bShotAnim )
|
|
return;
|
|
|
|
if ( Physics == PHYS_Swimming ) {
|
|
SetAnimAction('Claw');
|
|
bShotAnim = true;
|
|
LastFireTime = Level.TimeSeconds;
|
|
}
|
|
else if ( VSize(A.Location - Location) < MeleeRange + CollisionRadius + A.CollisionRadius ) {
|
|
bShotAnim = true;
|
|
LastFireTime = Level.TimeSeconds;
|
|
SetAnimAction('Claw');
|
|
//PlaySound(sound'Claw2s', SLOT_Interact); KFTODO: Replace this
|
|
Controller.bPreparingMove = true;
|
|
Acceleration = vect(0,0,0);
|
|
}
|
|
else if ( (KFDoorMover(A) != none ||
|
|
(!Region.Zone.bDistanceFog && VSize(A.Location-Location) <= 65535) ||
|
|
(Region.Zone.bDistanceFog && VSizeSquared(A.Location-Location) < (Square(Region.Zone.DistanceFogEnd) * 0.8))) // Make him come out of the fog a bit
|
|
&& !bDecapitated )
|
|
{
|
|
bShotAnim = true;
|
|
|
|
SetAnimAction('ShootBurns');
|
|
Controller.bPreparingMove = true;
|
|
Acceleration = vect(0,0,0);
|
|
|
|
if(--ShotsRemaining > 0) {
|
|
NextFireProjectileTime= Level.TimeSeconds;
|
|
}
|
|
else {
|
|
NextFireProjectileTime = Level.TimeSeconds + ProjectileFireInterval + (FRand() * 2.0);
|
|
ShotsRemaining = Rand(default.ShotsRemaining) + 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
function SpawnTwoShots() {
|
|
local vector X,Y,Z, FireStart;
|
|
local rotator FireRotation;
|
|
local KFMonsterController KFMonstControl;
|
|
|
|
if( Controller!=None && KFDoorMover(Controller.Target)!=None ) {
|
|
Controller.Target.TakeDamage(22,Self,Location,vect(0,0,0),Class'DamTypeVomit');
|
|
return;
|
|
}
|
|
|
|
GetAxes(Rotation,X,Y,Z);
|
|
FireStart = GetBoneCoords('Barrel').Origin;
|
|
if ( !SavedFireProperties.bInitialized ) {
|
|
SavedFireProperties.AmmoClass = Class'SkaarjAmmo';
|
|
SavedFireProperties.ProjectileClass = Class'HuskFireProjectileSE';
|
|
SavedFireProperties.WarnTargetPct = 1;
|
|
SavedFireProperties.MaxRange = 65535;
|
|
SavedFireProperties.bTossed = False;
|
|
SavedFireProperties.bTrySplash = true;
|
|
SavedFireProperties.bLeadTarget = True;
|
|
SavedFireProperties.bInstantHit = False;
|
|
SavedFireProperties.bInitialized = True;
|
|
}
|
|
|
|
// Turn off extra collision before spawning vomit, otherwise spawn fails
|
|
ToggleAuxCollision(false);
|
|
|
|
FireRotation = Controller.AdjustAim(SavedFireProperties,FireStart,600);
|
|
|
|
foreach DynamicActors(class'KFMonsterController', KFMonstControl) {
|
|
if( KFMonstControl != Controller ) {
|
|
if( PointDistToLine(KFMonstControl.Pawn.Location, vector(FireRotation), FireStart) < 75 ) {
|
|
KFMonstControl.GetOutOfTheWayOfShot(vector(FireRotation),FireStart);
|
|
}
|
|
}
|
|
}
|
|
|
|
Spawn(Class'HuskFireProjectileSE',Self,,FireStart,FireRotation);
|
|
|
|
// Turn extra collision back on
|
|
ToggleAuxCollision(true);
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
ShotsRemaining=4
|
|
MoanVoice=SoundGroup'KF_EnemiesFinalSnd.Husk.Husk_Talk'
|
|
MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_HitPlayer'
|
|
JumpSound=SoundGroup'KF_EnemiesFinalSnd.Husk.Husk_Jump'
|
|
DetachedArmClass=Class'KFChar.SeveredArmHusk'
|
|
DetachedLegClass=Class'KFChar.SeveredLegHusk'
|
|
DetachedHeadClass=Class'KFChar.SeveredHeadHusk'
|
|
DetachedSpecialArmClass=Class'KFChar.SeveredArmHuskGun'
|
|
BurningWalkFAnims(0)="WalkF"
|
|
BurningWalkFAnims(1)="WalkF"
|
|
BurningWalkFAnims(2)="WalkF"
|
|
BurningWalkAnims(0)="WalkB"
|
|
BurningWalkAnims(1)="WalkL"
|
|
BurningWalkAnims(2)="WalkR"
|
|
HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.Husk.Husk_Pain'
|
|
DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.Husk.Husk_Death'
|
|
ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd.Husk.Husk_Challenge'
|
|
ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd.Husk.Husk_Challenge'
|
|
ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd.Husk.Husk_Challenge'
|
|
ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd.Husk.Husk_Challenge'
|
|
MenuName="Husk.se"
|
|
ControllerClass=Class'ScrnZedPack.HuskZombieControllerSE'
|
|
AmbientSound=Sound'KF_BaseHusk.Husk_IdleLoop'
|
|
Mesh=SkeletalMesh'KF_Freaks2_Trip.Burns_Freak'
|
|
Skins(0)=Texture'ScrnZedPack_T.husk_grittier.husk_grittier_tatters'
|
|
Skins(1)=Shader'ScrnZedPack_T.husk_grittier.husk_grittier_shdr'
|
|
}
|