Spoiler
var(Sounds) sound Spin;
var(Sounds) sound Firing;
var(Sounds) sound Syllable1;
var(Sounds) sound Syllable2;
var(Sounds) sound Syllable3;
var(Sounds) sound Syllable4;
function eAttitude AttitudeToCreature(Pawn Other)
{
if ( Other.IsA('ScriptedPawn') )
{
if ( Other.IsA('Abaddon') )
return ATTITUDE_Friendly;
else if ( Other.IsA('Skraag') )
return ATTITUDE_Friendly;
else
return ATTITUDE_Ignore;
}
else
return ATTITUDE_Hate;
}
function PreSetMovement()
{
bCanJump = true;
bCanWalk = true;
bCanSwim = false;
bCanFly = true;
bCanDuck = true;
MinHitWall = -0.6;
if (Intelligence > BRAINS_Reptile)
bCanOpenDoors = true;
if (Intelligence == BRAINS_Human)
bCanDoSpecial = true;
}
function TryToDuck(vector duckDir, bool bReversed)
{
local vector HitLocation, HitNormal, Extent;
local actor HitActor;
//log("duck");
duckDir.Z = 0;
if ( (Skill == 0) && (FRand() < 0.5) )
DuckDir *= -1;
Extent.X = CollisionRadius;
Extent.Y = CollisionRadius;
Extent.Z = CollisionHeight;
HitActor = Trace(HitLocation, HitNormal, Location + 100 * duckDir, Location, false, Extent);
if (HitActor != None)
{
duckDir *= -1;
HitActor = Trace(HitLocation, HitNormal, Location + 100 * duckDir, Location, false, Extent);
}
if (HitActor != None)
return;
//log("good duck");
Destination = Location + 150 * duckDir;
Velocity = 400 * duckDir;
AirSpeed *= 2.5;
GotoState('TacticalMove', 'DoMove');
}
function SetMovementPhysics()
{
SetPhysics(PHYS_Flying);
}
singular function Falling()
{
SetPhysics(PHYS_Flying);
}
function PlayWaiting()
{
PlayAnim('Breath', 0.5,0.05);
}
function PlayPatrolStop()
{
PlayWaiting();
}
function PlayWaitingAmbush()
{
PlayWaiting();
}
function TweenToFighter(float tweentime)
{
TweenAnim('Still', tweentime);
}
function TweenToRunning(float tweentime)
{
if ( (AnimSequence != 'Breath') || !bAnimLoop )
TweenAnim('Breath', tweentime);
}
function TweenToWaiting(float tweentime)
{
TweenAnim('Float', tweentime);
}
function TweenToPatrolStop(float tweentime)
{
TweenAnim('Float', tweentime);
}
function PlayRunning()
{
if ( AnimSequence == 'Firing' )
LoopAnim('Breath', -1.0/AirSpeed, 0.5, 0.4);
else
LoopAnim('Breath', -1.0/AirSpeed,, 0.4);
}
function PlayThreatening()
{
local float decision;
decision = FRand();
if ( decision < 0.7 )
PlayAnim('Breath', 0.4, 0.4);
else if ( decision < 0.8 )
PlayAnim('SpinAttack', 0.4, 0.25);
else
{
PlayThreateningSound();
TweenAnim('Fighter', 0.3);
}
}
function PlayTurning()
{
LoopAnim('Breath');
}
function PlayDying(name DamageType, vector HitLocation)
{
PlaySound(Die, SLOT_Talk, 4 * TransientSoundVolume);
PlayAnim('Dead1', 0.7, 0.1);
}
function PlayTakeHit(float tweentime, vector HitLoc, int damage)
{
if ( FRand() < 0.6 )
TweenAnim('LeftHit', tweentime);
else
TweenAnim('RightHit', 1.5 * tweentime);
}
function TweenToFalling()
{
TweenAnim('Still', 0.2);
}
function PlayInAir()
{
LoopAnim('Breath');
}
function PlayLanded(float impactVel)
{
PlayAnim('Still');
}
function PlayVictoryDance()
{
PlayAnim('Firing', 0.6, 0.1);
PlaySound(Syllable4, SLOT_Interact);
}
function PlayMeleeAttack()
{
local vector adjust;
adjust = vect(0,0,0);
adjust.Z = Target.CollisionHeight;
Acceleration = AccelRate * Normal(Target.Location - Location + adjust);
PlaySound(Spin, SLOT_Interact);
PlayAnim('SpinAttack');
}
function PlayRangedAttack()
{
local vector adjust;
adjust = vect(0,0,0);
adjust.Z = Target.CollisionHeight + 20;
Acceleration = AccelRate * Normal(Target.Location - Location + adjust);
PlayAnim('Firing');
PlaySound(Firing, SLOT_Interact);
}
function SpawnShots()
{
local rotator FireRotation;
local vector X,Y,Z, projStart;
GetAxes(Rotation,X,Y,Z);
MakeNoise(1.0);
projStart = Location + 0.2 * CollisionRadius * X + 0.2 * CollisionRadius * Y + 0.25 * CollisionHeight * Z;
FireRotation = AdjustAim(ProjectileSpeed, projStart, 400, bLeadTarget, bWarnTarget);
spawn(RangedProjectile,self,'',projStart, FireRotation);
projStart = projStart - 0.5 * CollisionRadius * Y;
FireRotation.Yaw += 400;
spawn(RangedProjectile,self,'',projStart, FireRotation);
projStart = projStart - 0.3 * CollisionRadius * X;
FireRotation.Yaw += 400;
spawn(RangedProjectile,self,'',projStart, FireRotation);
projStart = projStart + 0.5 * CollisionRadius * Y;
FireRotation.Yaw += 400;
spawn(RangedProjectile,self,'',projStart, FireRotation);
}
function SpinDamageTarget()
{
(MeleeDamageTarget(BladeDamage, (BladeDamage * 1300 * Normal(Target.Location - Location))));
PlaySound(Spin, SLOT_Interact);
}
function PlayMovingAttack()
{
if ( AnimSequence == 'Breath' )
PlayAnim('Firing', 1.0, 0.2);
else
PlayAnim('Firing');
}
State TacticalMove
{
ignores SeePlayer, HearNoise;
function EndState()
{
AirSpeed = Default.AirSpeed;
Super.EndState();
}
}
I would say that MUPawns is rather buggy - for example, the code for this Pawn calls an animation Float that it doesn't have.