rott/kf_sources/KFMod/Classes/KFWeaponAttachment.uc
2026-07-14 20:27:09 +07:00

385 lines
9.9 KiB
Ucode

// Tracer Fire
class KFWeaponAttachment extends BaseKFWeaponAttachment;
var class<Emitter> mMuzFlashClass;
var Emitter mMuzFlash3rd;
var class<Emitter> mTracerClass;
var() editinline Emitter mTracer;
var() float mTracerPullback;
var() float mTracerMinDistance;
var() float mTracerSpeed;
var byte OldSpawnHitCount;// Saved hit effect spawn count
var class<xEmitter> mShellCaseEmitterClass;
var xEmitter mShellCaseEmitter;
var() vector mShellEmitterOffset;
var() name ShellEjectBoneName;
var vector mOldHitLocation;
var Pawn LastInstig;
var vector OlComprVect;
var bool bDoFiringEffects; // Whether or not to do tracers, muzzle flashes, shell ejects, etc
// Anims to use when using this weapon attachment
// From Pawn
var name MovementAnims[8]; // Forward, Back, Left, Right, Forward-Left, Forward-Right, Back-Left, Back-Right
var name TurnLeftAnim;
var name TurnRightAnim; // turning anims when standing in place (scaled by turn speed)
var name SwimAnims[4]; // 0=forward, 1=backwards, 2=left, 3=right
var name CrouchAnims[8]; // Forward, Back, Left, Right, Forward-Left, Forward-Right, Back-Left, Back-Right
var name WalkAnims[8];
var name AirAnims[4];
var name TakeoffAnims[4];
var name LandAnims[4];
var name DoubleJumpAnims[4];
var name DodgeAnims[4];
var name AirStillAnim;
var name TakeoffStillAnim;
var name CrouchTurnRightAnim;
var name CrouchTurnLeftAnim;
var name IdleCrouchAnim;
var name IdleSwimAnim;
var name IdleWeaponAnim; // WeaponAttachment code will set this one
var name IdleRestAnim;
var name IdleChatAnim;
// From XPawn
var name WallDodgeAnims[4];
var name IdleHeavyAnim;
var name IdleRifleAnim;
var name FireAnims[4];
var name FireAltAnims[4];
var name FireCrouchAnims[4];
var name FireCrouchAltAnims[4];
// New
var name HitAnims[4];
var name PostFireBlendStandAnim;
var name PostFireBlendCrouchAnim;
var string MeshRef;
var string AmbientSoundRef;
static function PreloadAssets(optional KFWeaponAttachment Spawned)
{
UpdateDefaultMesh(Mesh(DynamicLoadObject(default.MeshRef, class'Mesh', true)));
default.AmbientSound = sound(DynamicLoadObject(default.AmbientSoundRef, class'Sound', true));
if ( Spawned != none )
{
Spawned.LinkMesh(default.Mesh);
Spawned.AmbientSound = default.AmbientSound;
}
}
static function bool UnloadAssets()
{
UpdateDefaultMesh(none);
default.AmbientSound = none;
return true;
}
simulated function PostNetReceive()
{
if( Instigator!=LastInstig )
{
LastInstig = Instigator;
if( KFPawn(Instigator)!=None )
{
KFPawn(Instigator).SetWeaponAttachment(self);
}
}
}
simulated function PostNetBeginPlay()
{
if ( mesh == none )
{
PreloadAssets(self);
}
Super.PostNetBeginPlay();
LastInstig = Instigator;
mHitLocation = vect(0,0,0);
bNetNotify = True;
}
simulated function UpdateTacBeam( float Dist );
simulated function TacBeamGone();
simulated function SpawnTracer()
{
local vector SpawnLoc, SpawnDir, SpawnVel;
local float hitDist;
if( !bDoFiringEffects )
{
return;
}
if (mTracer == None)
mTracer = Spawn(mTracerClass);
if( mTracer != None )
{
SpawnLoc = GetTracerStart();
mTracer.SetLocation(SpawnLoc);
hitDist = VSize(mHitLocation - SpawnLoc) - mTracerPullback;
SpawnDir = Normal(mHitLocation - SpawnLoc);
if(hitDist > mTracerMinDistance)
{
SpawnVel = SpawnDir * mTracerSpeed;
mTracer.Emitters[0].StartVelocityRange.X.Min = SpawnVel.X;
mTracer.Emitters[0].StartVelocityRange.X.Max = SpawnVel.X;
mTracer.Emitters[0].StartVelocityRange.Y.Min = SpawnVel.Y;
mTracer.Emitters[0].StartVelocityRange.Y.Max = SpawnVel.Y;
mTracer.Emitters[0].StartVelocityRange.Z.Min = SpawnVel.Z;
mTracer.Emitters[0].StartVelocityRange.Z.Max = SpawnVel.Z;
mTracer.Emitters[0].LifetimeRange.Min = hitDist / mTracerSpeed;
mTracer.Emitters[0].LifetimeRange.Max = mTracer.Emitters[0].LifetimeRange.Min;
mTracer.SpawnParticle(1);
}
}
}
simulated function Destroyed()
{
if (mTracer != None)
mTracer.Destroy();
if (mMuzFlash3rd != None)
mMuzFlash3rd.Destroy();
if (mShellCaseEmitter != None)
mShellCaseEmitter.Destroy();
Super.Destroyed();
}
simulated function vector GetTracerStart()
{
local Pawn p;
p = Pawn(Owner);
if ( (p != None) && p.IsFirstPerson() && p.Weapon != None )
return p.Weapon.GetEffectStart();
if( Instigator!=None && (Level.TimeSeconds-LastRenderTime)>2 )
Return Instigator.Location;
// 3rd person
if ( mMuzFlash3rd != None )
return mMuzFlash3rd.Location;
else return Location;
}
function UpdateHit(Actor HitActor, vector HitLocation, vector HitNormal)
{
SpawnHitCount++;
mHitLocation = HitLocation;
mHitActor = HitActor;
mHitNormal = HitNormal;
NetUpdateTime = Level.TimeSeconds - 1;
}
simulated event ThirdPersonEffects()
{
local PlayerController PC;
if ( (Level.NetMode == NM_DedicatedServer) || (Instigator == None) )
return;
// new Trace FX - Ramm
if (FiringMode == 0)
{
if ( OldSpawnHitCount != SpawnHitCount )
{
OldSpawnHitCount = SpawnHitCount;
GetHitInfo();
PC = Level.GetLocalPlayerController();
if ( ((Instigator != None) && (Instigator.Controller == PC)) || (VSize(PC.ViewTarget.Location - mHitLocation) < 4000) )
{
if( mHitActor!=None )
Spawn(class'ROBulletHitEffect',,, mHitLocation, Rotator(-mHitNormal));
CheckForSplash();
SpawnTracer();
}
}
}
if ( FlashCount>0 )
{
if( KFPawn(Instigator)!=None )
{
if (FiringMode == 0)
{
KFPawn(Instigator).StartFiringX(false,bRapidFire);
}
else
{
KFPawn(Instigator).StartFiringX(true,bRapidFire);
}
}
if( bDoFiringEffects )
{
PC = Level.GetLocalPlayerController();
if ( (Level.TimeSeconds - LastRenderTime > 0.2) && (Instigator.Controller != PC) )
return;
WeaponLight();
DoFlashEmitter();
if ( (mShellCaseEmitter == None) && (Level.DetailMode != DM_Low) && !Level.bDropDetail )
{
mShellCaseEmitter = Spawn(mShellCaseEmitterClass);
if ( mShellCaseEmitter != None )
AttachToBone(mShellCaseEmitter, ShellEjectBoneName);
}
if (mShellCaseEmitter != None)
mShellCaseEmitter.mStartParticles++;
}
}
else
{
GotoState('');
if( KFPawn(Instigator)!=None )
KFPawn(Instigator).StopFiring();
}
}
simulated function WeaponLight()
{
if ( (FlashCount > 0) && !Level.bDropDetail && (Instigator != None)
&& ((Level.TimeSeconds - LastRenderTime < 0.2) || (PlayerController(Instigator.Controller) != None)) )
{
if ( Instigator.IsFirstPerson() )
{
LitWeapon = Instigator.Weapon;
LitWeapon.bDynamicLight = true;
}
else
bDynamicLight = true;
SetTimer(0.15, false);
}
else
Timer();
}
simulated function DoFlashEmitter()
{
if (mMuzFlash3rd == None)
{
mMuzFlash3rd = Spawn(mMuzFlashClass);
AttachToBone(mMuzFlash3rd, 'tip');
}
if(mMuzFlash3rd != None)
mMuzFlash3rd.SpawnParticle(1);
}
defaultproperties
{
DrawScale=1.0
mTracerPullback=50.000000
mTracerSpeed=7500.000000
LightType=LT_Steady
LightEffect=LE_NonIncidence
LightHue=30
LightSaturation=150
LightBrightness=255.000000
LightRadius=10.000000
LightPeriod=3
bDoFiringEffects=true
MovementAnims(0)=JogF_Bullpup//RunF
MovementAnims(1)=JogB_Bullpup//RunB
MovementAnims(2)=JogL_Bullpup//RunL
MovementAnims(3)=JogR_Bullpup//RunR
CrouchAnims(0)=CHwalkF_BullPup
CrouchAnims(1)=CHwalkB_BullPup
CrouchAnims(2)=CHwalkL_BullPup
CrouchAnims(3)=CHwalkR_BullPup
WalkAnims(0)=WalkF_Single9mm
WalkAnims(1)=WalkB_Single9mm
WalkAnims(2)=WalkL_Single9mm
WalkAnims(3)=WalkR_Single9mm
AirStillAnim=JumpF_Mid
AirAnims(0)=JumpF_Mid
AirAnims(1)=JumpF_Mid
AirAnims(2)=JumpL_Mid
AirAnims(3)=JumpR_Mid
TakeoffStillAnim=JumpF_Takeoff
TakeoffAnims(0)=JumpF_Takeoff
TakeoffAnims(1)=JumpF_Takeoff
TakeoffAnims(2)=JumpL_Takeoff
TakeoffAnims(3)=JumpR_Takeoff
LandAnims(0)=JumpF_Land
LandAnims(1)=JumpF_Land
LandAnims(2)=JumpL_Land
LandAnims(3)=JumpR_Land
DoubleJumpAnims(0)=DoubleJumpF
DoubleJumpAnims(1)=DoubleJumpB
DoubleJumpAnims(2)=DoubleJumpL
DoubleJumpAnims(3)=DoubleJumpR
DodgeAnims(0)=JumpF_Takeoff
DodgeAnims(1)=JumpF_Takeoff
DodgeAnims(2)=JumpL_Takeoff
DodgeAnims(3)=JumpR_Takeoff
WallDodgeAnims(0)=WallDodgeF
WallDodgeAnims(1)=WallDodgeB
WallDodgeAnims(2)=WallDodgeL
WallDodgeAnims(3)=WallDodgeR
TurnRightAnim=TurnR
TurnLeftAnim=TurnL
CrouchTurnRightAnim=CH_TurnR
CrouchTurnLeftAnim=CH_TurnL
IdleRestAnim=Idle_Bullpup//Idle_Rest
IdleCrouchAnim=CHIdle_BullPup
IdleSwimAnim=Swim_Tread
IdleWeaponAnim=Idle_Bullpup//Idle_Rifle
IdleHeavyAnim=Idle_Bullpup//Idle_Biggun
IdleRifleAnim=Idle_Bullpup//Idle_Rifle
IdleChatAnim=Idle_Bullpup
FireAnims(0)=Fire_Bullpup
FireAnims(1)=Fire_Bullpup
FireAnims(2)=Fire_Bullpup
FireAnims(3)=Fire_Bullpup
FireAltAnims(0)=Fire_Bullpup
FireAltAnims(1)=Fire_Bullpup
FireAltAnims(2)=Fire_Bullpup
FireAltAnims(3)=Fire_Bullpup
FireCrouchAnims(0)=CHFire_BullPup
FireCrouchAnims(1)=CHFire_BullPup
FireCrouchAnims(2)=CHFire_BullPup
FireCrouchAnims(3)=CHFire_BullPup
FireCrouchAltAnims(0)=CHFire_BullPup
FireCrouchAltAnims(1)=CHFire_BullPup
FireCrouchAltAnims(2)=CHFire_BullPup
FireCrouchAltAnims(3)=CHFire_BullPup
HitAnims(0)=HitF_Bullpup
HitAnims(1)=HitB_Bullpup
HitAnims(2)=HitL_Bullpup
HitAnims(3)=HitR_Bullpup
PostFireBlendStandAnim=Blend_Bullpup
PostFireBlendCrouchAnim=CHBlend_Bullpup
ShellEjectBoneName=ShellPort
}