diff --git a/sources/Effects/NiceBlockHitEmitter.uc b/sources/Effects/NiceBlockHitEmitter.uc index a82f918..342770b 100644 --- a/sources/Effects/NiceBlockHitEmitter.uc +++ b/sources/Effects/NiceBlockHitEmitter.uc @@ -1,4 +1,8 @@ -class NiceBlockHitEmitter extends MetalHitEmitter; -defaultproperties -{ ImpactSounds(0)=None ImpactSounds(1)=None ImpactSounds(2)=None RemoteRole=ROLE_SimulatedProxy -} +class NiceBlockHitEmitter extends MetalHitEmitter; +defaultproperties +{ + ImpactSounds(0)=None + ImpactSounds(1)=None + ImpactSounds(2)=None + RemoteRole=ROLE_SimulatedProxy +} diff --git a/sources/Effects/NiceFreezeParticlesBase.uc b/sources/Effects/NiceFreezeParticlesBase.uc index 0d774d7..a0ba815 100644 --- a/sources/Effects/NiceFreezeParticlesBase.uc +++ b/sources/Effects/NiceFreezeParticlesBase.uc @@ -1,5 +1,6 @@ -// ScrN copy -class NiceFreezeParticlesBase extends Emitter; -defaultproperties -{ bNoDelete=False -} +// ScrN copy +class NiceFreezeParticlesBase extends Emitter; +defaultproperties +{ + bNoDelete=False +} diff --git a/sources/Effects/NiceFreezeParticlesDirectional.uc b/sources/Effects/NiceFreezeParticlesDirectional.uc index 219717b..b24fd57 100644 --- a/sources/Effects/NiceFreezeParticlesDirectional.uc +++ b/sources/Effects/NiceFreezeParticlesDirectional.uc @@ -1,8 +1,11 @@ -// ScrN copy -class NiceFreezeParticlesDirectional extends NiceFreezeParticlesBase; -simulated function Trigger(Actor other, Pawn eventInstigator){ - emitters[0].SpawnParticle(1); -} -defaultproperties -{ Style=STY_Additive bHardAttach=True bDirectional=True -} +// ScrN copy +class NiceFreezeParticlesDirectional extends NiceFreezeParticlesBase; +simulated function Trigger(Actor other, Pawn eventInstigator){ + emitters[0].SpawnParticle(1); +} +defaultproperties +{ + Style=STY_Additive + bHardAttach=True + bDirectional=True +} diff --git a/sources/Effects/NiceIceChunkEmitter.uc b/sources/Effects/NiceIceChunkEmitter.uc index 97a7ae9..a0effca 100644 --- a/sources/Effects/NiceIceChunkEmitter.uc +++ b/sources/Effects/NiceIceChunkEmitter.uc @@ -1,21 +1,348 @@ -class NiceIceChunkEmitter extends Emitter; -var() array ImpactSounds; -simulated function PostBeginPlay(){ - if(ImpactSounds.Length > 0) - PlaySound(ImpactSounds[Rand(ImpactSounds.Length)]); -} -// NICETODO: change linksfrom HTeac_A to NicePackSM (and change that file) -defaultproperties -{ ImpactSounds(0)=Sound'KFWeaponSound.bullethitglass' ImpactSounds(1)=Sound'KFWeaponSound.bullethitglass2' Begin Object Class=MeshEmitter Name=MeshEmitter0 StaticMesh=StaticMesh'HTec_A.IceChunk1' UseCollision=True RespawnDeadParticles=False SpinParticles=True DampRotation=True UniformSize=True AutomaticInitialSpawning=False Acceleration=(Z=-1000.000000) DampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000)) ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) MaxParticles=5 SpinsPerSecondRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000)) RotationDampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000)) StartSizeRange=(X=(Min=5.000000,Max=8.000000),Y=(Min=5.000000,Max=8.000000),Z=(Min=5.000000,Max=8.000000)) InitialParticlesPerSecond=10000.000000 StartVelocityRange=(X=(Min=-75.000000,Max=75.000000),Y=(Min=-75.000000,Max=75.000000),Z=(Min=-100.000000,Max=300.000000)) End Object Emitters(0)=MeshEmitter'NicePack.NiceIceChunkEmitter.MeshEmitter0' - Begin Object Class=MeshEmitter Name=MeshEmitter2 StaticMesh=StaticMesh'HTec_A.IceChunk2' UseCollision=True RespawnDeadParticles=False SpinParticles=True DampRotation=True UniformSize=True AutomaticInitialSpawning=False Acceleration=(Z=-1000.000000) DampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000)) ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) MaxParticles=8 DetailMode=DM_High SpinsPerSecondRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000)) RotationDampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000)) StartSizeRange=(X=(Min=3.000000,Max=6.000000),Y=(Min=3.000000,Max=6.000000),Z=(Min=3.000000,Max=6.000000)) InitialParticlesPerSecond=10000.000000 StartVelocityRange=(X=(Min=-150.000000,Max=150.000000),Y=(Min=-150.000000,Max=150.000000),Z=(Min=-100.000000,Max=500.000000)) End Object Emitters(1)=MeshEmitter'NicePack.NiceIceChunkEmitter.MeshEmitter2' - Begin Object Class=MeshEmitter Name=MeshEmitter3 StaticMesh=StaticMesh'HTec_A.IceChunk3' UseCollision=True RespawnDeadParticles=False SpinParticles=True DampRotation=True UniformSize=True AutomaticInitialSpawning=False Acceleration=(Z=-1000.000000) DampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000)) ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) MaxParticles=12 DetailMode=DM_High SpinsPerSecondRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000)) RotationDampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000)) StartSizeRange=(X=(Min=2.000000,Max=5.000000),Y=(Min=2.000000,Max=5.000000),Z=(Min=2.000000,Max=5.000000)) InitialParticlesPerSecond=10000.000000 StartVelocityRange=(X=(Min=-200.000000,Max=200.000000),Y=(Min=-200.000000,Max=200.000000),Z=(Min=-100.000000,Max=500.000000)) End Object Emitters(2)=MeshEmitter'NicePack.NiceIceChunkEmitter.MeshEmitter3' - Begin Object Class=SpriteEmitter Name=SpriteEmitter8 UseCollision=True FadeOut=True FadeIn=True RespawnDeadParticles=False UniformSize=True AutomaticInitialSpawning=False UseRandomSubdivision=True Acceleration=(Z=-1000.000000) ExtentMultiplier=(X=0.000000,Y=0.000000,Z=0.000000) DampingFactorRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=0.250000,Max=0.250000),Z=(Min=0.250000,Max=0.250000)) ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) FadeOutStartTime=0.500000 MaxParticles=55 DetailMode=DM_SuperHigh UseRotationFrom=PTRS_Actor StartSizeRange=(X=(Min=0.700000,Max=1.700000)) InitialParticlesPerSecond=10000.000000 DrawStyle=PTDS_AlphaBlend Texture=Texture'Effects_Tex.BulletHits.snowchunksfinal' TextureUSubdivisions=2 TextureVSubdivisions=2 LifetimeRange=(Min=1.400000,Max=1.400000) StartVelocityRange=(X=(Min=-200.000000,Max=200.000000),Y=(Min=-200.000000,Max=200.000000),Z=(Min=-300.000000,Max=350.000000)) End Object Emitters(3)=SpriteEmitter'NicePack.NiceIceChunkEmitter.SpriteEmitter8' - Begin Object Class=SpriteEmitter Name=SpriteEmitter9 ProjectionNormal=(Y=1.000000,Z=0.000000) FadeOut=True FadeIn=True RespawnDeadParticles=False SpinParticles=True UseSizeScale=True UseRegularSizeScale=False UniformSize=True AutomaticInitialSpawning=False Acceleration=(Z=-1000.000000) ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) Opacity=0.500000 FadeOutStartTime=0.442500 FadeInEndTime=0.007500 MaxParticles=25 DetailMode=DM_High UseRotationFrom=PTRS_Actor SpinCCWorCW=(X=0.000000) SpinsPerSecondRange=(X=(Max=0.300000)) StartSpinRange=(X=(Min=-0.300000,Max=0.300000)) SizeScale(0)=(RelativeSize=0.400000) SizeScale(1)=(RelativeTime=0.500000,RelativeSize=0.700000) SizeScale(2)=(RelativeTime=1.000000,RelativeSize=1.300000) StartSizeRange=(X=(Min=20.000000,Max=40.000000),Y=(Min=20.000000,Max=40.000000),Z=(Min=20.000000,Max=40.000000)) InitialParticlesPerSecond=10000.000000 DrawStyle=PTDS_AlphaBlend Texture=Texture'Effects_Tex.BulletHits.watersplatter2' TextureUSubdivisions=2 TextureVSubdivisions=2 LifetimeRange=(Min=0.750000,Max=0.750000) StartVelocityRange=(X=(Min=-150.000000,Max=150.000000),Y=(Min=-150.000000,Max=150.000000),Z=(Min=-25.000000,Max=300.000000)) End Object Emitters(4)=SpriteEmitter'NicePack.NiceIceChunkEmitter.SpriteEmitter9' - Begin Object Class=SpriteEmitter Name=SpriteEmitter10 ProjectionNormal=(Y=1.000000,Z=0.000000) FadeOut=True RespawnDeadParticles=False SpinParticles=True UseSizeScale=True UseRegularSizeScale=False UniformSize=True Acceleration=(Z=-15.000000) ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) Opacity=0.250000 FadeOutStartTime=0.175000 MaxParticles=5 StartLocationRange=(X=(Min=10.000000,Max=10.000000)) AddLocationFromOtherEmitter=0 UseRotationFrom=PTRS_Actor SpinCCWorCW=(X=0.000000) SpinsPerSecondRange=(X=(Max=0.200000)) StartSpinRange=(X=(Min=-0.300000,Max=0.300000)) SizeScale(0)=(RelativeSize=0.400000) SizeScale(1)=(RelativeTime=0.560000,RelativeSize=1.000000) StartSizeRange=(X=(Min=6.000000,Max=60.000000),Y=(Min=6.000000,Max=60.000000),Z=(Min=6.000000,Max=60.000000)) InitialParticlesPerSecond=1.000000 DrawStyle=PTDS_AlphaBlend Texture=Texture'kf_fx_trip_t.Misc.smoke_animated' TextureUSubdivisions=8 TextureVSubdivisions=8 LifetimeRange=(Min=0.350000,Max=0.350000) End Object Emitters(5)=SpriteEmitter'NicePack.NiceIceChunkEmitter.SpriteEmitter10' - Begin Object Class=SpriteEmitter Name=SpriteEmitter11 ProjectionNormal=(Y=1.000000,Z=0.000000) FadeOut=True RespawnDeadParticles=False SpinParticles=True UseSizeScale=True UseRegularSizeScale=False UniformSize=True Acceleration=(Z=-15.000000) ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) Opacity=0.250000 FadeOutStartTime=0.175000 MaxParticles=8 StartLocationRange=(X=(Min=10.000000,Max=10.000000)) AddLocationFromOtherEmitter=1 UseRotationFrom=PTRS_Actor SpinCCWorCW=(X=0.000000) SpinsPerSecondRange=(X=(Max=0.200000)) StartSpinRange=(X=(Min=-0.300000,Max=0.300000)) SizeScale(0)=(RelativeSize=0.400000) SizeScale(1)=(RelativeTime=0.560000,RelativeSize=1.000000) StartSizeRange=(X=(Min=6.000000,Max=60.000000),Y=(Min=6.000000,Max=60.000000),Z=(Min=6.000000,Max=60.000000)) InitialParticlesPerSecond=1.000000 DrawStyle=PTDS_AlphaBlend Texture=Texture'kf_fx_trip_t.Misc.smoke_animated' TextureUSubdivisions=8 TextureVSubdivisions=8 LifetimeRange=(Min=0.350000,Max=0.350000) End Object Emitters(6)=SpriteEmitter'NicePack.NiceIceChunkEmitter.SpriteEmitter11' - Begin Object Class=SpriteEmitter Name=SpriteEmitter12 ProjectionNormal=(Y=1.000000,Z=0.000000) FadeOut=True RespawnDeadParticles=False SpinParticles=True UseSizeScale=True UseRegularSizeScale=False UniformSize=True Acceleration=(Z=-15.000000) ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) Opacity=0.250000 FadeOutStartTime=0.175000 MaxParticles=12 DetailMode=DM_High StartLocationRange=(X=(Min=10.000000,Max=10.000000)) AddLocationFromOtherEmitter=2 UseRotationFrom=PTRS_Actor SpinCCWorCW=(X=0.000000) SpinsPerSecondRange=(X=(Max=0.200000)) StartSpinRange=(X=(Min=-0.300000,Max=0.300000)) SizeScale(0)=(RelativeSize=0.400000) SizeScale(1)=(RelativeTime=0.560000,RelativeSize=1.000000) StartSizeRange=(X=(Min=6.000000,Max=60.000000),Y=(Min=6.000000,Max=60.000000),Z=(Min=6.000000,Max=60.000000)) InitialParticlesPerSecond=1.000000 DrawStyle=PTDS_AlphaBlend Texture=Texture'kf_fx_trip_t.Misc.smoke_animated' TextureUSubdivisions=8 TextureVSubdivisions=8 LifetimeRange=(Min=0.350000,Max=0.350000) End Object Emitters(7)=SpriteEmitter'NicePack.NiceIceChunkEmitter.SpriteEmitter12' - Begin Object Class=SpriteEmitter Name=SpriteEmitter13 ProjectionNormal=(Y=1.000000,Z=0.000000) FadeOut=True FadeIn=True RespawnDeadParticles=False SpinParticles=True UseSizeScale=True UseRegularSizeScale=False UniformSize=True AutomaticInitialSpawning=False Acceleration=(Z=-1000.000000) ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) Opacity=0.250000 FadeOutStartTime=0.442500 FadeInEndTime=0.007500 MaxParticles=12 StartLocationRange=(X=(Min=20.000000,Max=20.000000)) UseRotationFrom=PTRS_Actor SpinCCWorCW=(X=0.000000) SpinsPerSecondRange=(X=(Max=0.300000)) StartSpinRange=(X=(Min=-0.300000,Max=0.300000)) SizeScale(0)=(RelativeSize=0.400000) SizeScale(1)=(RelativeTime=0.500000,RelativeSize=0.900000) SizeScale(2)=(RelativeTime=1.000000,RelativeSize=1.300000) StartSizeRange=(X=(Min=25.000000,Max=45.000000),Y=(Min=25.000000,Max=45.000000),Z=(Min=25.000000,Max=45.000000)) InitialParticlesPerSecond=10000.000000 DrawStyle=PTDS_AlphaBlend Texture=Texture'Effects_Tex.BulletHits.watersplashcloud' TextureUSubdivisions=1 TextureVSubdivisions=1 LifetimeRange=(Min=0.750000,Max=0.750000) StartVelocityRange=(X=(Min=-150.000000,Max=150.000000),Y=(Min=-150.000000,Max=150.000000),Z=(Min=-5.000000,Max=150.000000)) End Object Emitters(8)=SpriteEmitter'NicePack.NiceIceChunkEmitter.SpriteEmitter13' - Begin Object Class=SpriteEmitter Name=SpriteEmitter14 ProjectionNormal=(Y=1.000000,Z=0.000000) FadeOut=True RespawnDeadParticles=False SpinParticles=True UseSizeScale=True UseRegularSizeScale=False UniformSize=True AutomaticInitialSpawning=False Acceleration=(Z=-22.000000) DampingFactorRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=0.250000,Max=0.250000),Z=(Min=0.250000,Max=0.250000)) ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) Opacity=0.500000 FadeOutStartTime=2.720000 MaxParticles=25 DetailMode=DM_High StartLocationRange=(X=(Min=-10.000000,Max=10.000000),Y=(Min=-10.000000,Max=10.000000),Z=(Min=-10.000000,Max=10.000000)) UseRotationFrom=PTRS_Actor SpinCCWorCW=(X=0.000000) SpinsPerSecondRange=(X=(Max=0.150000)) StartSpinRange=(X=(Min=-1.000000,Max=1.000000)) SizeScale(0)=(RelativeSize=2.200000) SizeScale(1)=(RelativeTime=0.500000,RelativeSize=3.200000) SizeScale(2)=(RelativeTime=1.000000,RelativeSize=4.000000) StartSizeRange=(X=(Min=1.000000,Max=20.000000),Y=(Min=1.000000,Max=20.000000),Z=(Min=1.000000,Max=20.000000)) InitialParticlesPerSecond=10000.000000 DrawStyle=PTDS_AlphaBlend Texture=Texture'Effects_Tex.explosions.DSmoke_2' TextureUSubdivisions=1 TextureVSubdivisions=1 StartVelocityRange=(X=(Min=-350.000000,Max=350.000000),Y=(Min=-350.000000,Max=350.000000),Z=(Min=-5.000000,Max=50.000000)) VelocityLossRange=(X=(Min=3.000000,Max=3.000000),Y=(Min=3.000000,Max=3.000000)) End Object Emitters(9)=SpriteEmitter'NicePack.NiceIceChunkEmitter.SpriteEmitter14' - Begin Object Class=SpriteEmitter Name=SpriteEmitter15 UseCollision=True UseColorScale=True FadeOut=True FadeIn=True RespawnDeadParticles=False UniformSize=True AutomaticInitialSpawning=False UseRandomSubdivision=True Acceleration=(Z=-1000.000000) ExtentMultiplier=(X=0.000000,Y=0.000000,Z=0.000000) DampingFactorRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=0.250000,Max=0.250000),Z=(Min=0.250000,Max=0.250000)) ColorScale(0)=(Color=(B=174,G=174,R=205,A=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=174,G=174,R=205,A=255)) FadeOutStartTime=0.500000 MaxParticles=15 UseRotationFrom=PTRS_Actor StartSizeRange=(X=(Min=0.700000,Max=1.700000)) InitialParticlesPerSecond=10000.000000 DrawStyle=PTDS_AlphaBlend Texture=Texture'Effects_Tex.BulletHits.snowchunksfinal' TextureUSubdivisions=2 TextureVSubdivisions=2 LifetimeRange=(Min=1.400000,Max=1.400000) StartVelocityRange=(X=(Min=-200.000000,Max=200.000000),Y=(Min=-200.000000,Max=200.000000),Z=(Min=-300.000000,Max=350.000000)) End Object Emitters(10)=SpriteEmitter'NicePack.NiceIceChunkEmitter.SpriteEmitter15' - AutoDestroy=True bNoDelete=False bNetTemporary=True RemoteRole=ROLE_SimulatedProxy LifeSpan=5.000000 TransientSoundVolume=150.000000 TransientSoundRadius=80.000000 -} +class NiceIceChunkEmitter extends Emitter; +var() array ImpactSounds; +simulated function PostBeginPlay(){ + if(ImpactSounds.Length > 0) + PlaySound(ImpactSounds[Rand(ImpactSounds.Length)]); +} +// NICETODO: change linksfrom HTeac_A to NicePackSM (and change that file) +defaultproperties +{ + ImpactSounds(0)=Sound'KFWeaponSound.bullethitglass' + ImpactSounds(1)=Sound'KFWeaponSound.bullethitglass2' + Begin Object Class=MeshEmitter Name=MeshEmitter0 + StaticMesh=StaticMesh'HTec_A.IceChunk1' + UseCollision=True + RespawnDeadParticles=False + SpinParticles=True + DampRotation=True + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(Z=-1000.000000) + DampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000)) + ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) + ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) + MaxParticles=5 + SpinsPerSecondRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000)) + RotationDampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000)) + StartSizeRange=(X=(Min=5.000000,Max=8.000000),Y=(Min=5.000000,Max=8.000000),Z=(Min=5.000000,Max=8.000000)) + InitialParticlesPerSecond=10000.000000 + StartVelocityRange=(X=(Min=-75.000000,Max=75.000000),Y=(Min=-75.000000,Max=75.000000),Z=(Min=-100.000000,Max=300.000000)) + End Object + Emitters(0)=MeshEmitter'NicePack.NiceIceChunkEmitter.MeshEmitter0' + + Begin Object Class=MeshEmitter Name=MeshEmitter2 + StaticMesh=StaticMesh'HTec_A.IceChunk2' + UseCollision=True + RespawnDeadParticles=False + SpinParticles=True + DampRotation=True + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(Z=-1000.000000) + DampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000)) + ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) + ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) + MaxParticles=8 + DetailMode=DM_High + SpinsPerSecondRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000)) + RotationDampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000)) + StartSizeRange=(X=(Min=3.000000,Max=6.000000),Y=(Min=3.000000,Max=6.000000),Z=(Min=3.000000,Max=6.000000)) + InitialParticlesPerSecond=10000.000000 + StartVelocityRange=(X=(Min=-150.000000,Max=150.000000),Y=(Min=-150.000000,Max=150.000000),Z=(Min=-100.000000,Max=500.000000)) + End Object + Emitters(1)=MeshEmitter'NicePack.NiceIceChunkEmitter.MeshEmitter2' + + Begin Object Class=MeshEmitter Name=MeshEmitter3 + StaticMesh=StaticMesh'HTec_A.IceChunk3' + UseCollision=True + RespawnDeadParticles=False + SpinParticles=True + DampRotation=True + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(Z=-1000.000000) + DampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000)) + ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) + ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) + MaxParticles=12 + DetailMode=DM_High + SpinsPerSecondRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000)) + StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000)) + RotationDampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000)) + StartSizeRange=(X=(Min=2.000000,Max=5.000000),Y=(Min=2.000000,Max=5.000000),Z=(Min=2.000000,Max=5.000000)) + InitialParticlesPerSecond=10000.000000 + StartVelocityRange=(X=(Min=-200.000000,Max=200.000000),Y=(Min=-200.000000,Max=200.000000),Z=(Min=-100.000000,Max=500.000000)) + End Object + Emitters(2)=MeshEmitter'NicePack.NiceIceChunkEmitter.MeshEmitter3' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter8 + UseCollision=True + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + UniformSize=True + AutomaticInitialSpawning=False + UseRandomSubdivision=True + Acceleration=(Z=-1000.000000) + ExtentMultiplier=(X=0.000000,Y=0.000000,Z=0.000000) + DampingFactorRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=0.250000,Max=0.250000),Z=(Min=0.250000,Max=0.250000)) + ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) + ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) + FadeOutStartTime=0.500000 + MaxParticles=55 + DetailMode=DM_SuperHigh + UseRotationFrom=PTRS_Actor + StartSizeRange=(X=(Min=0.700000,Max=1.700000)) + InitialParticlesPerSecond=10000.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'Effects_Tex.BulletHits.snowchunksfinal' + TextureUSubdivisions=2 + TextureVSubdivisions=2 + LifetimeRange=(Min=1.400000,Max=1.400000) + StartVelocityRange=(X=(Min=-200.000000,Max=200.000000),Y=(Min=-200.000000,Max=200.000000),Z=(Min=-300.000000,Max=350.000000)) + End Object + Emitters(3)=SpriteEmitter'NicePack.NiceIceChunkEmitter.SpriteEmitter8' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter9 + ProjectionNormal=(Y=1.000000,Z=0.000000) + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(Z=-1000.000000) + ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) + ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) + Opacity=0.500000 + FadeOutStartTime=0.442500 + FadeInEndTime=0.007500 + MaxParticles=25 + DetailMode=DM_High + UseRotationFrom=PTRS_Actor + SpinCCWorCW=(X=0.000000) + SpinsPerSecondRange=(X=(Max=0.300000)) + StartSpinRange=(X=(Min=-0.300000,Max=0.300000)) + SizeScale(0)=(RelativeSize=0.400000) + SizeScale(1)=(RelativeTime=0.500000,RelativeSize=0.700000) + SizeScale(2)=(RelativeTime=1.000000,RelativeSize=1.300000) + StartSizeRange=(X=(Min=20.000000,Max=40.000000),Y=(Min=20.000000,Max=40.000000),Z=(Min=20.000000,Max=40.000000)) + InitialParticlesPerSecond=10000.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'Effects_Tex.BulletHits.watersplatter2' + TextureUSubdivisions=2 + TextureVSubdivisions=2 + LifetimeRange=(Min=0.750000,Max=0.750000) + StartVelocityRange=(X=(Min=-150.000000,Max=150.000000),Y=(Min=-150.000000,Max=150.000000),Z=(Min=-25.000000,Max=300.000000)) + End Object + Emitters(4)=SpriteEmitter'NicePack.NiceIceChunkEmitter.SpriteEmitter9' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter10 + ProjectionNormal=(Y=1.000000,Z=0.000000) + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + Acceleration=(Z=-15.000000) + ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) + ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) + Opacity=0.250000 + FadeOutStartTime=0.175000 + MaxParticles=5 + StartLocationRange=(X=(Min=10.000000,Max=10.000000)) + AddLocationFromOtherEmitter=0 + UseRotationFrom=PTRS_Actor + SpinCCWorCW=(X=0.000000) + SpinsPerSecondRange=(X=(Max=0.200000)) + StartSpinRange=(X=(Min=-0.300000,Max=0.300000)) + SizeScale(0)=(RelativeSize=0.400000) + SizeScale(1)=(RelativeTime=0.560000,RelativeSize=1.000000) + StartSizeRange=(X=(Min=6.000000,Max=60.000000),Y=(Min=6.000000,Max=60.000000),Z=(Min=6.000000,Max=60.000000)) + InitialParticlesPerSecond=1.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'kf_fx_trip_t.Misc.smoke_animated' + TextureUSubdivisions=8 + TextureVSubdivisions=8 + LifetimeRange=(Min=0.350000,Max=0.350000) + End Object + Emitters(5)=SpriteEmitter'NicePack.NiceIceChunkEmitter.SpriteEmitter10' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter11 + ProjectionNormal=(Y=1.000000,Z=0.000000) + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + Acceleration=(Z=-15.000000) + ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) + ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) + Opacity=0.250000 + FadeOutStartTime=0.175000 + MaxParticles=8 + StartLocationRange=(X=(Min=10.000000,Max=10.000000)) + AddLocationFromOtherEmitter=1 + UseRotationFrom=PTRS_Actor + SpinCCWorCW=(X=0.000000) + SpinsPerSecondRange=(X=(Max=0.200000)) + StartSpinRange=(X=(Min=-0.300000,Max=0.300000)) + SizeScale(0)=(RelativeSize=0.400000) + SizeScale(1)=(RelativeTime=0.560000,RelativeSize=1.000000) + StartSizeRange=(X=(Min=6.000000,Max=60.000000),Y=(Min=6.000000,Max=60.000000),Z=(Min=6.000000,Max=60.000000)) + InitialParticlesPerSecond=1.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'kf_fx_trip_t.Misc.smoke_animated' + TextureUSubdivisions=8 + TextureVSubdivisions=8 + LifetimeRange=(Min=0.350000,Max=0.350000) + End Object + Emitters(6)=SpriteEmitter'NicePack.NiceIceChunkEmitter.SpriteEmitter11' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter12 + ProjectionNormal=(Y=1.000000,Z=0.000000) + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + Acceleration=(Z=-15.000000) + ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) + ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) + Opacity=0.250000 + FadeOutStartTime=0.175000 + MaxParticles=12 + DetailMode=DM_High + StartLocationRange=(X=(Min=10.000000,Max=10.000000)) + AddLocationFromOtherEmitter=2 + UseRotationFrom=PTRS_Actor + SpinCCWorCW=(X=0.000000) + SpinsPerSecondRange=(X=(Max=0.200000)) + StartSpinRange=(X=(Min=-0.300000,Max=0.300000)) + SizeScale(0)=(RelativeSize=0.400000) + SizeScale(1)=(RelativeTime=0.560000,RelativeSize=1.000000) + StartSizeRange=(X=(Min=6.000000,Max=60.000000),Y=(Min=6.000000,Max=60.000000),Z=(Min=6.000000,Max=60.000000)) + InitialParticlesPerSecond=1.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'kf_fx_trip_t.Misc.smoke_animated' + TextureUSubdivisions=8 + TextureVSubdivisions=8 + LifetimeRange=(Min=0.350000,Max=0.350000) + End Object + Emitters(7)=SpriteEmitter'NicePack.NiceIceChunkEmitter.SpriteEmitter12' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter13 + ProjectionNormal=(Y=1.000000,Z=0.000000) + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(Z=-1000.000000) + ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) + ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) + Opacity=0.250000 + FadeOutStartTime=0.442500 + FadeInEndTime=0.007500 + MaxParticles=12 + StartLocationRange=(X=(Min=20.000000,Max=20.000000)) + UseRotationFrom=PTRS_Actor + SpinCCWorCW=(X=0.000000) + SpinsPerSecondRange=(X=(Max=0.300000)) + StartSpinRange=(X=(Min=-0.300000,Max=0.300000)) + SizeScale(0)=(RelativeSize=0.400000) + SizeScale(1)=(RelativeTime=0.500000,RelativeSize=0.900000) + SizeScale(2)=(RelativeTime=1.000000,RelativeSize=1.300000) + StartSizeRange=(X=(Min=25.000000,Max=45.000000),Y=(Min=25.000000,Max=45.000000),Z=(Min=25.000000,Max=45.000000)) + InitialParticlesPerSecond=10000.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'Effects_Tex.BulletHits.watersplashcloud' + TextureUSubdivisions=1 + TextureVSubdivisions=1 + LifetimeRange=(Min=0.750000,Max=0.750000) + StartVelocityRange=(X=(Min=-150.000000,Max=150.000000),Y=(Min=-150.000000,Max=150.000000),Z=(Min=-5.000000,Max=150.000000)) + End Object + Emitters(8)=SpriteEmitter'NicePack.NiceIceChunkEmitter.SpriteEmitter13' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter14 + ProjectionNormal=(Y=1.000000,Z=0.000000) + FadeOut=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + Acceleration=(Z=-22.000000) + DampingFactorRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=0.250000,Max=0.250000),Z=(Min=0.250000,Max=0.250000)) + ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) + ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) + Opacity=0.500000 + FadeOutStartTime=2.720000 + MaxParticles=25 + DetailMode=DM_High + StartLocationRange=(X=(Min=-10.000000,Max=10.000000),Y=(Min=-10.000000,Max=10.000000),Z=(Min=-10.000000,Max=10.000000)) + UseRotationFrom=PTRS_Actor + SpinCCWorCW=(X=0.000000) + SpinsPerSecondRange=(X=(Max=0.150000)) + StartSpinRange=(X=(Min=-1.000000,Max=1.000000)) + SizeScale(0)=(RelativeSize=2.200000) + SizeScale(1)=(RelativeTime=0.500000,RelativeSize=3.200000) + SizeScale(2)=(RelativeTime=1.000000,RelativeSize=4.000000) + StartSizeRange=(X=(Min=1.000000,Max=20.000000),Y=(Min=1.000000,Max=20.000000),Z=(Min=1.000000,Max=20.000000)) + InitialParticlesPerSecond=10000.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'Effects_Tex.explosions.DSmoke_2' + TextureUSubdivisions=1 + TextureVSubdivisions=1 + StartVelocityRange=(X=(Min=-350.000000,Max=350.000000),Y=(Min=-350.000000,Max=350.000000),Z=(Min=-5.000000,Max=50.000000)) + VelocityLossRange=(X=(Min=3.000000,Max=3.000000),Y=(Min=3.000000,Max=3.000000)) + End Object + Emitters(9)=SpriteEmitter'NicePack.NiceIceChunkEmitter.SpriteEmitter14' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter15 + UseCollision=True + UseColorScale=True + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + UniformSize=True + AutomaticInitialSpawning=False + UseRandomSubdivision=True + Acceleration=(Z=-1000.000000) + ExtentMultiplier=(X=0.000000,Y=0.000000,Z=0.000000) + DampingFactorRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=0.250000,Max=0.250000),Z=(Min=0.250000,Max=0.250000)) + ColorScale(0)=(Color=(B=174,G=174,R=205,A=255)) + ColorScale(1)=(RelativeTime=1.000000,Color=(B=174,G=174,R=205,A=255)) + FadeOutStartTime=0.500000 + MaxParticles=15 + UseRotationFrom=PTRS_Actor + StartSizeRange=(X=(Min=0.700000,Max=1.700000)) + InitialParticlesPerSecond=10000.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'Effects_Tex.BulletHits.snowchunksfinal' + TextureUSubdivisions=2 + TextureVSubdivisions=2 + LifetimeRange=(Min=1.400000,Max=1.400000) + StartVelocityRange=(X=(Min=-200.000000,Max=200.000000),Y=(Min=-200.000000,Max=200.000000),Z=(Min=-300.000000,Max=350.000000)) + End Object + Emitters(10)=SpriteEmitter'NicePack.NiceIceChunkEmitter.SpriteEmitter15' + + AutoDestroy=True + bNoDelete=False + bNetTemporary=True + RemoteRole=ROLE_SimulatedProxy + LifeSpan=5.000000 + TransientSoundVolume=150.000000 + TransientSoundRadius=80.000000 +} diff --git a/sources/Effects/NiceNitroDecal.uc b/sources/Effects/NiceNitroDecal.uc index 2f01b72..840ab4e 100644 --- a/sources/Effects/NiceNitroDecal.uc +++ b/sources/Effects/NiceNitroDecal.uc @@ -1,10 +1,15 @@ -// ScrN copy -class NiceNitroDecal extends ProjectedDecal; -#exec OBJ LOAD FILE=HTec_A.ukx -simulated function BeginPlay(){ - if(!level.bDropDetail && FRand() < 0.4) projTexture = Texture'HTec_A.Nitro.NitroSplat'; - super.BeginPlay(); -} -defaultproperties -{ bClipStaticMesh=True CullDistance=7000.000000 LifeSpan=5.000000 DrawScale=0.500000 -} +// ScrN copy +class NiceNitroDecal extends ProjectedDecal; +#exec OBJ LOAD FILE=HTec_A.ukx +simulated function BeginPlay(){ + if(!level.bDropDetail && FRand() < 0.4) + projTexture = Texture'HTec_A.Nitro.NitroSplat'; + super.BeginPlay(); +} +defaultproperties +{ + bClipStaticMesh=True + CullDistance=7000.000000 + LifeSpan=5.000000 + DrawScale=0.500000 +} diff --git a/sources/Effects/NiceNitroGroundEffect.uc b/sources/Effects/NiceNitroGroundEffect.uc index d1692ad..f3ea062 100644 --- a/sources/Effects/NiceNitroGroundEffect.uc +++ b/sources/Effects/NiceNitroGroundEffect.uc @@ -1,6 +1,37 @@ -// ScrN copy -class NiceNitroGroundEffect extends NiceFreezeParticlesDirectional; -defaultproperties -{ Begin Object Class=SpriteEmitter Name=SpriteEmitter0 FadeOut=True FadeIn=True RespawnDeadParticles=False SpinParticles=True UseSizeScale=True UseRegularSizeScale=False UniformSize=True AutomaticInitialSpawning=False ExtentMultiplier=(X=0.000000,Y=0.000000) ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) Opacity=0.470000 FadeOutStartTime=0.940000 FadeInEndTime=0.300000 MaxParticles=50 StartLocationShape=PTLS_Polar SpinsPerSecondRange=(X=(Max=0.035000)) StartSpinRange=(X=(Min=-0.200000,Max=0.300000)) SizeScale(0)=(RelativeTime=0.500000,RelativeSize=0.900000) SizeScale(1)=(RelativeTime=1.000000,RelativeSize=0.500000) StartSizeRange=(X=(Min=15.000000,Max=35.000000),Y=(Min=15.000000,Max=35.000000),Z=(Min=15.000000,Max=35.000000)) InitialParticlesPerSecond=60.000000 DrawStyle=PTDS_AlphaBlend Texture=Texture'Effects_Tex.explosions.DSmoke_2' LifetimeRange=(Min=2.000000,Max=2.000000) StartVelocityRange=(X=(Min=-85.000000,Max=85.000000),Y=(Min=-85.000000,Max=85.000000)) StartVelocityRadialRange=(Min=-40.000000,Max=40.000000) End Object Emitters(0)=SpriteEmitter'NicePack.NiceNitroGroundEffect.SpriteEmitter0' - LifeSpan=5.000000 -} +// ScrN copy +class NiceNitroGroundEffect extends NiceFreezeParticlesDirectional; +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter0 + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + ExtentMultiplier=(X=0.000000,Y=0.000000) + ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) + ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) + Opacity=0.470000 + FadeOutStartTime=0.940000 + FadeInEndTime=0.300000 + MaxParticles=50 + StartLocationShape=PTLS_Polar + SpinsPerSecondRange=(X=(Max=0.035000)) + StartSpinRange=(X=(Min=-0.200000,Max=0.300000)) + SizeScale(0)=(RelativeTime=0.500000,RelativeSize=0.900000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=0.500000) + StartSizeRange=(X=(Min=15.000000,Max=35.000000),Y=(Min=15.000000,Max=35.000000),Z=(Min=15.000000,Max=35.000000)) + InitialParticlesPerSecond=60.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'Effects_Tex.explosions.DSmoke_2' + LifetimeRange=(Min=2.000000,Max=2.000000) + StartVelocityRange=(X=(Min=-85.000000,Max=85.000000),Y=(Min=-85.000000,Max=85.000000)) + StartVelocityRadialRange=(Min=-40.000000,Max=40.000000) + End Object + Emitters(0)=SpriteEmitter'NicePack.NiceNitroGroundEffect.SpriteEmitter0' + + LifeSpan=5.000000 +} diff --git a/sources/GUI/NiceGUIBuyMenu.uc b/sources/GUI/NiceGUIBuyMenu.uc index d0b5a0b..54d6540 100644 --- a/sources/GUI/NiceGUIBuyMenu.uc +++ b/sources/GUI/NiceGUIBuyMenu.uc @@ -1,190 +1,376 @@ -class NiceGUIBuyMenu extends UT2k4MainPage; -//The "Header" -var automated GUIImage HeaderBG_Left; -var automated GUIImage HeaderBG_Center; -var automated GUIImage HeaderBG_Right; -var automated GUILabel CurrentPerkLabel; -var automated GUILabel TimeLeftLabel; -var automated GUILabel WaveLabel; -var automated GUILabel HeaderBG_Left_Label; -var automated KFQuickPerkSelect QuickPerkSelect; -var automated KFBuyMenuFilter BuyMenuFilter; -var automated GUIButton StoreTabButton; -var automated GUIButton PerkTabButton; -//The "Footer" -var automated GUIImage WeightBG; -var automated GUIImage WeightIcon; -var automated GUIImage WeightIconBG; -var automated KFWeightBar WeightBar; -//const BUYLIST_CATS =7; -var() editconst noexport float SavedPitch; -var color RedColor; -var color GreenGreyColor; -var() UT2K4TabPanel ActivePanel; -var localized string CurrentPerk; -var localized string NoActivePerk; -var localized string TraderClose; -var localized string WaveString; -var localized string LvAbbrString; -function InitComponent(GUIController MyC, GUIComponent MyO) -{ - local int i; - super.InitComponent(MyC, MyO); - c_Tabs.BackgroundImage = none; - c_Tabs.BackgroundStyle = none; - InitTabs(); - for ( i = 0; i < c_Tabs.TabStack.Length; i++ ) - { - c_Tabs.TabStack[i].bVisible = false; - } - UpdateWeightBar(); -} -function InitTabs() -{ - local int i; - for ( i = 0; i < PanelCaption.Length && i < PanelClass.Length && i < PanelHint.Length; i++ ) - { - c_Tabs.AddTab(PanelCaption[i], PanelClass[i],, PanelHint[i]); - } -} -function UpdateWeightBar() -{ - if ( KFHumanPawn(PlayerOwner().Pawn) != none ) - { - WeightBar.MaxBoxes = KFHumanPawn(PlayerOwner().Pawn).MaxCarryWeight; - WeightBar.CurBoxes = KFHumanPawn(PlayerOwner().Pawn).CurrentWeight; - } -} -event Opened(GUIComponent Sender) -{ - local rotator PlayerRot; - super.Opened(Sender); - c_Tabs.ActivateTabByName(PanelCaption[0], true); - // Tell the controller that he is on a shopping spree - if ( KFPlayerController(PlayerOwner()) != none ) - { KFPlayerController(PlayerOwner()).bShopping = true; - } - if ( KFWeapon(KFHumanPawn(PlayerOwner().Pawn).Weapon).bAimingRifle ) - { - KFWeapon(KFHumanPawn(PlayerOwner().Pawn).Weapon).IronSightZoomOut(); - } - // Set camera's pitch to zero when menu initialised (otherwise spinny weap goes kooky) - PlayerRot = PlayerOwner().Rotation; - SavedPitch = PlayerRot.Pitch; - PlayerRot.Yaw = PlayerRot.Yaw % 65536; - PlayerRot.Pitch = 0; - PlayerRot.Roll = 0; - PlayerOwner().SetRotation(PlayerRot); - SetTimer(0.05f, true); -} -function Timer() -{ - UpdateHeader(); - UpdateWeightBar(); -} -function InternalOnClose(optional bool bCanceled) -{ - local rotator NewRot; - // Reset player - NewRot = PlayerOwner().Rotation; - NewRot.Pitch = SavedPitch; - PlayerOwner().SetRotation(NewRot); - Super.OnClose(bCanceled); -} -function UpdateHeader() -{ - local int TimeLeftMin, TimeLeftSec; - local string TimeString; - if ( KFPlayerController(PlayerOwner()) == none || PlayerOwner().PlayerReplicationInfo == none || - PlayerOwner().GameReplicationInfo == none ) - { - return; - } - // Current Perk - if ( KFPlayerController(PlayerOwner()).SelectedVeterancy != none ) - { - CurrentPerkLabel.Caption = CurrentPerk$":" @ KFPlayerController(PlayerOwner()).SelectedVeterancy.default.VeterancyName @ LvAbbrString$KFPlayerReplicationInfo(PlayerOwner().PlayerReplicationInfo).ClientVeteranSkillLevel; - } - else - { - CurrentPerkLabel.Caption = CurrentPerk$":" @ NoActivePerk; - } - // Trader time left - TimeLeftMin = KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).TimeToNextWave / 60; - TimeLeftSec = KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).TimeToNextWave % 60; - if ( TimeLeftMin < 1 ) - { - TimeString = "00:"; - } - else - { - TimeString = "0" $ TimeLeftMin $ ":"; - } - if ( TimeLeftSec >= 10 ) - { - TimeString = TimeString $ TimeLeftSec; - } - else - { - TimeString = TimeString $ "0" $ TimeLeftSec; - } - TimeLeftLabel.Caption = TraderClose @ TimeString; - if ( KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).TimeToNextWave < 10 ) - { - TimeLeftLabel.TextColor = RedColor; - } - else - { - TimeLeftLabel.TextColor = GreenGreyColor; - } - // Wave Counter - WaveLabel.Caption = WaveString$":" @ (KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).WaveNumber + 1)$"/"$KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).FinalWave; -} -function KFBuyMenuClosed(optional bool bCanceled) -{ - local rotator NewRot; - // Reset player - NewRot = PlayerOwner().Rotation; - NewRot.Pitch = SavedPitch; - PlayerOwner().SetRotation(NewRot); - Super.OnClose(bCanceled); - if ( KFPlayerController(PlayerOwner()) != none ) - { KFPlayerController(PlayerOwner()).bShopping = false; - } -} -function CloseSale(bool savePurchases) -{ - Controller.CloseMenu(!savePurchases); -} -function bool ButtonClicked(GUIComponent Sender) -{ - if ( Sender == PerkTabButton ) - { - HandleParameters(PanelCaption[1], "OhHi!"); - } - if ( Sender == StoreTabButton ) - { - HandleParameters(PanelCaption[0], "OhHi!"); - } - return true; -} -defaultproperties -{ Begin Object Class=GUIImage Name=HBGLeft Image=Texture'KF_InterfaceArt_tex.Menu.Thin_border' ImageStyle=ISTY_Stretched Hint="Perk Quick Select" WinTop=0.001000 WinLeft=0.001000 WinWidth=0.332300 WinHeight=0.100000 End Object HeaderBG_Left=GUIImage'NicePack.NiceGUIBuyMenu.HBGLeft' - Begin Object Class=GUIImage Name=HBGCenter Image=Texture'KF_InterfaceArt_tex.Menu.Thin_border' ImageStyle=ISTY_Stretched Hint="Trading Time Left" WinTop=0.001000 WinLeft=0.334000 WinWidth=0.331023 WinHeight=0.100000 End Object HeaderBG_Center=GUIImage'NicePack.NiceGUIBuyMenu.HBGCenter' - Begin Object Class=GUIImage Name=HBGRight Image=Texture'KF_InterfaceArt_tex.Menu.Thin_border' ImageStyle=ISTY_Stretched Hint="Current Perk" WinTop=0.001000 WinLeft=0.666000 WinWidth=0.332000 WinHeight=0.100000 End Object HeaderBG_Right=GUIImage'NicePack.NiceGUIBuyMenu.HBGRight' - Begin Object Class=GUILabel Name=Perk TextAlign=TXTA_Center TextColor=(B=158,G=176,R=175) WinTop=0.010000 WinLeft=0.665000 WinWidth=0.329761 WinHeight=0.050000 End Object CurrentPerkLabel=GUILabel'NicePack.NiceGUIBuyMenu.Perk' - Begin Object Class=GUILabel Name=Time Caption="Trader closes in 00:31" TextAlign=TXTA_Center TextColor=(B=158,G=176,R=175) TextFont="UT2LargeFont" WinTop=0.020952 WinLeft=0.335000 WinWidth=0.330000 WinHeight=0.035000 End Object TimeLeftLabel=GUILabel'NicePack.NiceGUIBuyMenu.Time' - Begin Object Class=GUILabel Name=Wave Caption="Wave: 7/10" TextAlign=TXTA_Center TextColor=(B=158,G=176,R=175) WinTop=0.052857 WinLeft=0.336529 WinWidth=0.327071 WinHeight=0.035000 End Object WaveLabel=GUILabel'NicePack.NiceGUIBuyMenu.Wave' - Begin Object Class=GUILabel Name=HBGLL Caption="Quick Perk Select" TextAlign=TXTA_Center TextColor=(B=158,G=176,R=175) TextFont="UT2ServerListFont" WinTop=0.007238 WinLeft=0.024937 WinWidth=0.329761 WinHeight=0.019524 End Object HeaderBG_Left_Label=GUILabel'NicePack.NiceGUIBuyMenu.HBGLL' - Begin Object Class=KFQuickPerkSelect Name=QS WinTop=0.011906 WinLeft=0.008008 WinWidth=0.316601 WinHeight=0.082460 OnDraw=QS.MyOnDraw End Object QuickPerkSelect=KFQuickPerkSelect'NicePack.NiceGUIBuyMenu.QS' - Begin Object Class=KFBuyMenuFilter Name=filter WinTop=0.051000 WinLeft=0.670000 WinWidth=0.305000 WinHeight=0.082460 OnDraw=filter.MyOnDraw End Object BuyMenuFilter=KFBuyMenuFilter'NicePack.NiceGUIBuyMenu.filter' - Begin Object Class=GUIButton Name=StoreTabB Caption="Store" FontScale=FNS_Small WinTop=0.072762 WinLeft=0.202801 WinWidth=0.050000 WinHeight=0.022000 OnClick=NiceGUIBuyMenu.ButtonClicked OnKeyEvent=StoreTabB.InternalOnKeyEvent End Object StoreTabButton=GUIButton'NicePack.NiceGUIBuyMenu.StoreTabB' - Begin Object Class=GUIButton Name=PerkTabB Caption="Perk" FontScale=FNS_Small WinTop=0.072762 WinLeft=0.127234 WinWidth=0.050000 WinHeight=0.022000 OnClick=NiceGUIBuyMenu.ButtonClicked OnKeyEvent=PerkTabB.InternalOnKeyEvent End Object PerkTabButton=GUIButton'NicePack.NiceGUIBuyMenu.PerkTabB' - Begin Object Class=GUIImage Name=Weight Image=Texture'KF_InterfaceArt_tex.Menu.Thin_border' ImageStyle=ISTY_Stretched WinTop=0.934206 WinLeft=0.001000 WinWidth=0.663086 WinHeight=0.065828 End Object WeightBG=GUIImage'NicePack.NiceGUIBuyMenu.Weight' - Begin Object Class=GUIImage Name=WeightIco Image=Texture'KillingFloorHUD.HUD.Hud_Weight' ImageStyle=ISTY_Scaled WinTop=0.946166 WinLeft=0.009961 WinWidth=0.033672 WinHeight=0.048992 RenderWeight=0.460000 End Object WeightIcon=GUIImage'NicePack.NiceGUIBuyMenu.WeightIco' - Begin Object Class=GUIImage Name=WeightIcoBG Image=Texture'KF_InterfaceArt_tex.Menu.Perk_box_unselected' ImageStyle=ISTY_Scaled WinTop=0.942416 WinLeft=0.006055 WinWidth=0.041484 WinHeight=0.054461 RenderWeight=0.450000 End Object WeightIconBG=GUIImage'NicePack.NiceGUIBuyMenu.WeightIcoBG' - Begin Object Class=KFWeightBar Name=WeightB WinTop=0.945302 WinLeft=0.055266 WinWidth=0.443888 WinHeight=0.053896 OnDraw=WeightB.MyOnDraw End Object WeightBar=KFWeightBar'NicePack.NiceGUIBuyMenu.WeightB' - RedColor=(R=255,A=255) GreenGreyColor=(B=158,G=176,R=175,A=255) CurrentPerk="Current Perk" NoActivePerk="No Active Perk!" TraderClose="Trader Closes in" WaveString="Wave" LvAbbrString="Lv" Begin Object Class=GUITabControl Name=PageTabs bDockPanels=True TabHeight=0.025000 BackgroundStyleName="TabBackground" WinTop=0.078000 WinLeft=0.005000 WinWidth=0.990000 WinHeight=0.025000 RenderWeight=0.490000 TabOrder=0 bAcceptsInput=True OnActivate=PageTabs.InternalOnActivate OnChange=NiceGUIBuyMenu.InternalOnChange End Object c_Tabs=GUITabControl'NicePack.NiceGUIBuyMenu.PageTabs' - Begin Object Class=BackgroundImage Name=PageBackground Image=Texture'Engine.WhiteSquareTexture' ImageColor=(B=20,G=20,R=20) ImageStyle=ISTY_Tiled RenderWeight=0.001000 End Object i_Background=BackgroundImage'NicePack.NiceGUIBuyMenu.PageBackground' - PanelClass(0)="KFGUI.KFTab_BuyMenu" PanelClass(1)="KFGUI.KFTab_Perks" PanelCaption(0)="Store" PanelCaption(1)="Perks" PanelHint(0)="Trade equipment and ammunition" PanelHint(1)="Select your current Perk" bAllowedAsLast=True OnClose=NiceGUIBuyMenu.KFBuyMenuClosed WhiteColor=(B=255,G=255,R=255) -} +class NiceGUIBuyMenu extends UT2k4MainPage; +//The "Header" +var automated GUIImage HeaderBG_Left; +var automated GUIImage HeaderBG_Center; +var automated GUIImage HeaderBG_Right; +var automated GUILabel CurrentPerkLabel; +var automated GUILabel TimeLeftLabel; +var automated GUILabel WaveLabel; +var automated GUILabel HeaderBG_Left_Label; +var automated KFQuickPerkSelect QuickPerkSelect; +var automated KFBuyMenuFilter BuyMenuFilter; +var automated GUIButton StoreTabButton; +var automated GUIButton PerkTabButton; +//The "Footer" +var automated GUIImage WeightBG; +var automated GUIImage WeightIcon; +var automated GUIImage WeightIconBG; +var automated KFWeightBar WeightBar; +//const BUYLIST_CATS =7; +var() editconst noexport float SavedPitch; +var color RedColor; +var color GreenGreyColor; +var() UT2K4TabPanel ActivePanel; +var localized string CurrentPerk; +var localized string NoActivePerk; +var localized string TraderClose; +var localized string WaveString; +var localized string LvAbbrString; +function InitComponent(GUIController MyC, GUIComponent MyO) +{ + local int i; + super.InitComponent(MyC, MyO); + c_Tabs.BackgroundImage = none; + c_Tabs.BackgroundStyle = none; + InitTabs(); + for ( i = 0; i < c_Tabs.TabStack.Length; i++ ) + { + c_Tabs.TabStack[i].bVisible = false; + } + UpdateWeightBar(); +} +function InitTabs() +{ + local int i; + for ( i = 0; i < PanelCaption.Length && i < PanelClass.Length && i < PanelHint.Length; i++ ) + { + c_Tabs.AddTab(PanelCaption[i], PanelClass[i],, PanelHint[i]); + } +} +function UpdateWeightBar() +{ + if ( KFHumanPawn(PlayerOwner().Pawn) != none ) + { + WeightBar.MaxBoxes = KFHumanPawn(PlayerOwner().Pawn).MaxCarryWeight; + WeightBar.CurBoxes = KFHumanPawn(PlayerOwner().Pawn).CurrentWeight; + } +} +event Opened(GUIComponent Sender) +{ + local rotator PlayerRot; + super.Opened(Sender); + c_Tabs.ActivateTabByName(PanelCaption[0], true); + // Tell the controller that he is on a shopping spree + if ( KFPlayerController(PlayerOwner()) != none ) + { + KFPlayerController(PlayerOwner()).bShopping = true; + } + if ( KFWeapon(KFHumanPawn(PlayerOwner().Pawn).Weapon).bAimingRifle ) + { + KFWeapon(KFHumanPawn(PlayerOwner().Pawn).Weapon).IronSightZoomOut(); + } + // Set camera's pitch to zero when menu initialised (otherwise spinny weap goes kooky) + PlayerRot = PlayerOwner().Rotation; + SavedPitch = PlayerRot.Pitch; + PlayerRot.Yaw = PlayerRot.Yaw % 65536; + PlayerRot.Pitch = 0; + PlayerRot.Roll = 0; + PlayerOwner().SetRotation(PlayerRot); + SetTimer(0.05f, true); +} +function Timer() +{ + UpdateHeader(); + UpdateWeightBar(); +} +function InternalOnClose(optional bool bCanceled) +{ + local rotator NewRot; + // Reset player + NewRot = PlayerOwner().Rotation; + NewRot.Pitch = SavedPitch; + PlayerOwner().SetRotation(NewRot); + Super.OnClose(bCanceled); +} +function UpdateHeader() +{ + local int TimeLeftMin, TimeLeftSec; + local string TimeString; + if ( KFPlayerController(PlayerOwner()) == none || PlayerOwner().PlayerReplicationInfo == none || + PlayerOwner().GameReplicationInfo == none ) + { + return; + } + // Current Perk + if ( KFPlayerController(PlayerOwner()).SelectedVeterancy != none ) + { + CurrentPerkLabel.Caption = CurrentPerk$":" @ KFPlayerController(PlayerOwner()).SelectedVeterancy.default.VeterancyName @ LvAbbrString$KFPlayerReplicationInfo(PlayerOwner().PlayerReplicationInfo).ClientVeteranSkillLevel; + } + else + { + CurrentPerkLabel.Caption = CurrentPerk$":" @ NoActivePerk; + } + // Trader time left + TimeLeftMin = KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).TimeToNextWave / 60; + TimeLeftSec = KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).TimeToNextWave % 60; + if ( TimeLeftMin < 1 ) + { + TimeString = "00:"; + } + else + { + TimeString = "0" $ TimeLeftMin $ ":"; + } + if ( TimeLeftSec >= 10 ) + { + TimeString = TimeString $ TimeLeftSec; + } + else + { + TimeString = TimeString $ "0" $ TimeLeftSec; + } + TimeLeftLabel.Caption = TraderClose @ TimeString; + if ( KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).TimeToNextWave < 10 ) + { + TimeLeftLabel.TextColor = RedColor; + } + else + { + TimeLeftLabel.TextColor = GreenGreyColor; + } + // Wave Counter + WaveLabel.Caption = WaveString$":" @ (KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).WaveNumber + 1)$"/"$KFGameReplicationInfo(PlayerOwner().GameReplicationInfo).FinalWave; +} +function KFBuyMenuClosed(optional bool bCanceled) +{ + local rotator NewRot; + // Reset player + NewRot = PlayerOwner().Rotation; + NewRot.Pitch = SavedPitch; + PlayerOwner().SetRotation(NewRot); + Super.OnClose(bCanceled); + if ( KFPlayerController(PlayerOwner()) != none ) + { + KFPlayerController(PlayerOwner()).bShopping = false; + } +} +function CloseSale(bool savePurchases) +{ + Controller.CloseMenu(!savePurchases); +} +function bool ButtonClicked(GUIComponent Sender) +{ + if ( Sender == PerkTabButton ) + { + HandleParameters(PanelCaption[1], "OhHi!"); + } + if ( Sender == StoreTabButton ) + { + HandleParameters(PanelCaption[0], "OhHi!"); + } + return true; +} +defaultproperties +{ + Begin Object Class=GUIImage Name=HBGLeft + Image=Texture'KF_InterfaceArt_tex.Menu.Thin_border' + ImageStyle=ISTY_Stretched + Hint="Perk Quick Select" + WinTop=0.001000 + WinLeft=0.001000 + WinWidth=0.332300 + WinHeight=0.100000 + End Object + HeaderBG_Left=GUIImage'NicePack.NiceGUIBuyMenu.HBGLeft' + + Begin Object Class=GUIImage Name=HBGCenter + Image=Texture'KF_InterfaceArt_tex.Menu.Thin_border' + ImageStyle=ISTY_Stretched + Hint="Trading Time Left" + WinTop=0.001000 + WinLeft=0.334000 + WinWidth=0.331023 + WinHeight=0.100000 + End Object + HeaderBG_Center=GUIImage'NicePack.NiceGUIBuyMenu.HBGCenter' + + Begin Object Class=GUIImage Name=HBGRight + Image=Texture'KF_InterfaceArt_tex.Menu.Thin_border' + ImageStyle=ISTY_Stretched + Hint="Current Perk" + WinTop=0.001000 + WinLeft=0.666000 + WinWidth=0.332000 + WinHeight=0.100000 + End Object + HeaderBG_Right=GUIImage'NicePack.NiceGUIBuyMenu.HBGRight' + + Begin Object Class=GUILabel Name=Perk + TextAlign=TXTA_Center + TextColor=(B=158,G=176,R=175) + WinTop=0.010000 + WinLeft=0.665000 + WinWidth=0.329761 + WinHeight=0.050000 + End Object + CurrentPerkLabel=GUILabel'NicePack.NiceGUIBuyMenu.Perk' + + Begin Object Class=GUILabel Name=Time + Caption="Trader closes in 00:31" + TextAlign=TXTA_Center + TextColor=(B=158,G=176,R=175) + TextFont="UT2LargeFont" + WinTop=0.020952 + WinLeft=0.335000 + WinWidth=0.330000 + WinHeight=0.035000 + End Object + TimeLeftLabel=GUILabel'NicePack.NiceGUIBuyMenu.Time' + + Begin Object Class=GUILabel Name=Wave + Caption="Wave: 7/10" + TextAlign=TXTA_Center + TextColor=(B=158,G=176,R=175) + WinTop=0.052857 + WinLeft=0.336529 + WinWidth=0.327071 + WinHeight=0.035000 + End Object + WaveLabel=GUILabel'NicePack.NiceGUIBuyMenu.Wave' + + Begin Object Class=GUILabel Name=HBGLL + Caption="Quick Perk Select" + TextAlign=TXTA_Center + TextColor=(B=158,G=176,R=175) + TextFont="UT2ServerListFont" + WinTop=0.007238 + WinLeft=0.024937 + WinWidth=0.329761 + WinHeight=0.019524 + End Object + HeaderBG_Left_Label=GUILabel'NicePack.NiceGUIBuyMenu.HBGLL' + + Begin Object Class=KFQuickPerkSelect Name=QS + WinTop=0.011906 + WinLeft=0.008008 + WinWidth=0.316601 + WinHeight=0.082460 + OnDraw=QS.MyOnDraw + End Object + QuickPerkSelect=KFQuickPerkSelect'NicePack.NiceGUIBuyMenu.QS' + + Begin Object Class=KFBuyMenuFilter Name=filter + WinTop=0.051000 + WinLeft=0.670000 + WinWidth=0.305000 + WinHeight=0.082460 + OnDraw=filter.MyOnDraw + End Object + BuyMenuFilter=KFBuyMenuFilter'NicePack.NiceGUIBuyMenu.filter' + + Begin Object Class=GUIButton Name=StoreTabB + Caption="Store" + FontScale=FNS_Small + WinTop=0.072762 + WinLeft=0.202801 + WinWidth=0.050000 + WinHeight=0.022000 + OnClick=NiceGUIBuyMenu.ButtonClicked + OnKeyEvent=StoreTabB.InternalOnKeyEvent + End Object + StoreTabButton=GUIButton'NicePack.NiceGUIBuyMenu.StoreTabB' + + Begin Object Class=GUIButton Name=PerkTabB + Caption="Perk" + FontScale=FNS_Small + WinTop=0.072762 + WinLeft=0.127234 + WinWidth=0.050000 + WinHeight=0.022000 + OnClick=NiceGUIBuyMenu.ButtonClicked + OnKeyEvent=PerkTabB.InternalOnKeyEvent + End Object + PerkTabButton=GUIButton'NicePack.NiceGUIBuyMenu.PerkTabB' + + Begin Object Class=GUIImage Name=Weight + Image=Texture'KF_InterfaceArt_tex.Menu.Thin_border' + ImageStyle=ISTY_Stretched + WinTop=0.934206 + WinLeft=0.001000 + WinWidth=0.663086 + WinHeight=0.065828 + End Object + WeightBG=GUIImage'NicePack.NiceGUIBuyMenu.Weight' + + Begin Object Class=GUIImage Name=WeightIco + Image=Texture'KillingFloorHUD.HUD.Hud_Weight' + ImageStyle=ISTY_Scaled + WinTop=0.946166 + WinLeft=0.009961 + WinWidth=0.033672 + WinHeight=0.048992 + RenderWeight=0.460000 + End Object + WeightIcon=GUIImage'NicePack.NiceGUIBuyMenu.WeightIco' + + Begin Object Class=GUIImage Name=WeightIcoBG + Image=Texture'KF_InterfaceArt_tex.Menu.Perk_box_unselected' + ImageStyle=ISTY_Scaled + WinTop=0.942416 + WinLeft=0.006055 + WinWidth=0.041484 + WinHeight=0.054461 + RenderWeight=0.450000 + End Object + WeightIconBG=GUIImage'NicePack.NiceGUIBuyMenu.WeightIcoBG' + + Begin Object Class=KFWeightBar Name=WeightB + WinTop=0.945302 + WinLeft=0.055266 + WinWidth=0.443888 + WinHeight=0.053896 + OnDraw=WeightB.MyOnDraw + End Object + WeightBar=KFWeightBar'NicePack.NiceGUIBuyMenu.WeightB' + + RedColor=(R=255,A=255) + GreenGreyColor=(B=158,G=176,R=175,A=255) + CurrentPerk="Current Perk" + NoActivePerk="No Active Perk!" + TraderClose="Trader Closes in" + WaveString="Wave" + LvAbbrString="Lv" + Begin Object Class=GUITabControl Name=PageTabs + bDockPanels=True + TabHeight=0.025000 + BackgroundStyleName="TabBackground" + WinTop=0.078000 + WinLeft=0.005000 + WinWidth=0.990000 + WinHeight=0.025000 + RenderWeight=0.490000 + TabOrder=0 + bAcceptsInput=True + OnActivate=PageTabs.InternalOnActivate + OnChange=NiceGUIBuyMenu.InternalOnChange + End Object + c_Tabs=GUITabControl'NicePack.NiceGUIBuyMenu.PageTabs' + + Begin Object Class=BackgroundImage Name=PageBackground + Image=Texture'Engine.WhiteSquareTexture' + ImageColor=(B=20,G=20,R=20) + ImageStyle=ISTY_Tiled + RenderWeight=0.001000 + End Object + i_Background=BackgroundImage'NicePack.NiceGUIBuyMenu.PageBackground' + + PanelClass(0)="KFGUI.KFTab_BuyMenu" + PanelClass(1)="KFGUI.KFTab_Perks" + PanelCaption(0)="Store" + PanelCaption(1)="Perks" + PanelHint(0)="Trade equipment and ammunition" + PanelHint(1)="Select your current Perk" + bAllowedAsLast=True + OnClose=NiceGUIBuyMenu.KFBuyMenuClosed + WhiteColor=(B=255,G=255,R=255) +} diff --git a/sources/GUI/NiceGUISettings.uc b/sources/GUI/NiceGUISettings.uc index 797444d..bfae88c 100644 --- a/sources/GUI/NiceGUISettings.uc +++ b/sources/GUI/NiceGUISettings.uc @@ -1,70 +1,281 @@ -class NiceGUISettings extends Settings_Tabs; -//var automated GUIButton skillButtonA; -var array ForceProjItems; -var automated moCheckBox ch_WeapManagement; -var automated moCheckBox ch_AltSwitches; -var automated moCheckBox ch_DispCounters; -var automated moCheckBox ch_DisWeapProgress; -var automated moCheckBox ch_ShowHLMessages; -var automated moCheckBox ch_CancelFire; -var automated moCheckBox ch_CancelSwitching; -var automated moCheckBox ch_CancelNades; -var automated moCheckBox ch_CancelAiming; -var automated moCheckBox ch_ReloadWontWork; -var automated GUISectionBackground bg_WEAP; -var automated GUISectionBackground bg_RELOAD; -function InitComponent(GUIController MyController, GUIComponent MyOwner){ - super.InitComponent(MyController, MyOwner); -} -function InternalOnLoadINI(GUIComponent sender, string s){ - local NicePlayerController nicePlayer; - nicePlayer = NicePlayerController(PlayerOwner()); - if(nicePlayer == none) return; - switch(sender){ - case ch_WeapManagement: ch_WeapManagement.Checked(nicePlayer.bNiceWeaponManagement); break; - case ch_AltSwitches: ch_AltSwitches.Checked(nicePlayer.bFlagAltSwitchesModes); break; - case ch_DispCounters: ch_DispCounters.Checked(nicePlayer.bFlagDisplayCounters); break; - case ch_DisWeapProgress: ch_DisWeapProgress.Checked(nicePlayer.bFlagDisplayWeaponProgress); break; - case ch_ShowHLMessages: ch_ShowHLMessages.Checked(nicePlayer.bFlagShowHLMessages); break; - case ch_CancelFire: ch_CancelFire.Checked(nicePlayer.bRelCancelByFire); break; - case ch_CancelSwitching: ch_CancelSwitching.Checked(nicePlayer.bRelCancelBySwitching); break; - case ch_CancelNades: ch_CancelNades.Checked(nicePlayer.bRelCancelByNades); break; - case ch_CancelAiming: ch_CancelAiming.Checked(nicePlayer.bRelCancelByAiming); break; - case ch_ReloadWontWork: ch_ReloadWontWork.Checked(nicePlayer.bFlagUseServerReload); break; - } -} -function InternalOnChange(GUIComponent Sender){ - local NicePlayerController nicePlayer; - super.InternalOnChange(Sender); - nicePlayer = NicePlayerController(PlayerOwner()); - if(nicePlayer == none) return; - switch(sender){ - case ch_WeapManagement: nicePlayer.bNiceWeaponManagement = ch_WeapManagement.IsChecked(); break; - case ch_AltSwitches: nicePlayer.ServerSetAltSwitchesModes(ch_AltSwitches.IsChecked()); break; - case ch_DispCounters: nicePlayer.ServerSetDisplayCounters(ch_DispCounters.IsChecked()); break; - case ch_DisWeapProgress: nicePlayer.ServerSetDisplayWeaponProgress(ch_DisWeapProgress.IsChecked()); break; - case ch_ShowHLMessages: nicePlayer.ServerSetHLMessages(ch_ShowHLMessages.IsChecked()); break; - case ch_CancelFire: nicePlayer.bRelCancelByFire = ch_CancelFire.IsChecked(); break; - case ch_CancelSwitching: nicePlayer.bRelCancelBySwitching = ch_CancelSwitching.IsChecked(); break; - case ch_CancelNades: nicePlayer.bRelCancelByNades = ch_CancelNades.IsChecked(); break; - case ch_CancelAiming: nicePlayer.bRelCancelByAiming = ch_CancelAiming.IsChecked(); break; - case ch_ReloadWontWork: nicePlayer.ServerSetUseServerReload(ch_ReloadWontWork.IsChecked()); break; - } - nicePlayer.ClientSaveConfig(); -} -// size = (x=0.0125, y=0.0) ; (w=1.0, h=0.865) -// tab order -defaultproperties -{ Begin Object Class=moCheckBox Name=WeaponManagement CaptionWidth=0.955000 Caption="Nice weapon management" ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" OnCreateComponent=WeaponManagement.InternalOnCreateComponent IniOption="@Internal" Hint="If checked, NicePack will use it's own system to manage weapon switching" WinTop=0.050000 WinLeft=0.012500 WinWidth=0.278000 TabOrder=4 OnChange=NiceGUISettings.InternalOnChange OnLoadINI=NiceGUISettings.InternalOnLoadINI End Object ch_WeapManagement=moCheckBox'NicePack.NiceGUISettings.WeaponManagement' - Begin Object Class=moCheckBox Name=AltSwitches CaptionWidth=0.955000 Caption="Alt fire switches modes" ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" OnCreateComponent=AltSwitches.InternalOnCreateComponent IniOption="@Internal" Hint="Assault-rifle only; if enabled - alt fire button switches between fire modes, otherwise - acts as an alt fire" WinTop=0.100000 WinLeft=0.012500 WinWidth=0.278000 TabOrder=6 OnChange=NiceGUISettings.InternalOnChange OnLoadINI=NiceGUISettings.InternalOnLoadINI End Object ch_AltSwitches=moCheckBox'NicePack.NiceGUISettings.AltSwitches' - Begin Object Class=moCheckBox Name=DispCounters CaptionWidth=0.955000 Caption="Display counters" ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" OnCreateComponent=DispCounters.InternalOnCreateComponent IniOption="@Internal" Hint="Toggles display of the various counters used by skills" WinTop=0.150000 WinLeft=0.012500 WinWidth=0.278000 TabOrder=7 OnChange=NiceGUISettings.InternalOnChange OnLoadINI=NiceGUISettings.InternalOnLoadINI End Object ch_DispCounters=moCheckBox'NicePack.NiceGUISettings.DispCounters' - Begin Object Class=moCheckBox Name=DispWeapProgress CaptionWidth=0.955000 Caption="Display weapon progress" ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" OnCreateComponent=DispWeapProgress.InternalOnCreateComponent IniOption="@Internal" Hint="Displays weapon progress rate, whoever it's defined by a skill that's using this functionality" WinTop=0.200000 WinLeft=0.012500 WinWidth=0.278000 TabOrder=8 OnChange=NiceGUISettings.InternalOnChange OnLoadINI=NiceGUISettings.InternalOnLoadINI End Object ch_DisWeapProgress=moCheckBox'NicePack.NiceGUISettings.DispWeapProgress' - Begin Object Class=moCheckBox Name=ShowHLMessages CaptionWidth=0.955000 Caption="Show Hardcore Level messages" ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" OnCreateComponent=ShowHLMessages.InternalOnCreateComponent IniOption="@Internal" Hint="Enable to be notified each time Hardcore Level is changed" WinTop=0.300000 WinLeft=0.012500 WinWidth=0.278000 TabOrder=9 OnChange=NiceGUISettings.InternalOnChange OnLoadINI=NiceGUISettings.InternalOnLoadINI End Object ch_ShowHLMessages=moCheckBox'NicePack.NiceGUISettings.ShowHLMessages' - Begin Object Class=moCheckBox Name=CancelFire CaptionWidth=0.955000 Caption="Cancel reload by shooting" ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" OnCreateComponent=CancelFire.InternalOnCreateComponent IniOption="@Internal" Hint="If checked, you'll be able to cancel reload of converted weapons by shooting (when you have ammo)" WinTop=0.050000 WinLeft=0.517500 WinWidth=0.287000 TabOrder=11 OnChange=NiceGUISettings.InternalOnChange OnLoadINI=NiceGUISettings.InternalOnLoadINI End Object ch_CancelFire=moCheckBox'NicePack.NiceGUISettings.CancelFire' - Begin Object Class=moCheckBox Name=CancelSwitching CaptionWidth=0.955000 Caption="Cancel reload by switching weapons" ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" OnCreateComponent=CancelSwitching.InternalOnCreateComponent IniOption="@Internal" Hint="If checked, you'll be able to cancel reload of converted weapons by switching to different weapon" WinTop=0.100000 WinLeft=0.517500 WinWidth=0.287000 TabOrder=12 OnChange=NiceGUISettings.InternalOnChange OnLoadINI=NiceGUISettings.InternalOnLoadINI End Object ch_CancelSwitching=moCheckBox'NicePack.NiceGUISettings.CancelSwitching' - Begin Object Class=moCheckBox Name=CancelNades CaptionWidth=0.955000 Caption="Cancel reload by throwing grenades" ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" OnCreateComponent=CancelNades.InternalOnCreateComponent IniOption="@Internal" Hint="If checked, you'll be able to cancel reload of converted weapons by throwing a grenade" WinTop=0.150000 WinLeft=0.517500 WinWidth=0.287000 TabOrder=13 OnChange=NiceGUISettings.InternalOnChange OnLoadINI=NiceGUISettings.InternalOnLoadINI End Object ch_CancelNades=moCheckBox'NicePack.NiceGUISettings.CancelNades' - Begin Object Class=moCheckBox Name=CancelAiming CaptionWidth=0.955000 Caption="Cancel reload by aiming" ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" OnCreateComponent=CancelAiming.InternalOnCreateComponent IniOption="@Internal" Hint="If checked, you'll be able to cancel reload of converted weapons by going into iron sights (when you have ammo)" WinTop=0.200000 WinLeft=0.517500 WinWidth=0.287000 TabOrder=14 OnChange=NiceGUISettings.InternalOnChange OnLoadINI=NiceGUISettings.InternalOnLoadINI End Object ch_CancelAiming=moCheckBox'NicePack.NiceGUISettings.CancelAiming' - Begin Object Class=moCheckBox Name=ServerReload CaptionWidth=0.955000 Caption="My reload doesn't work" ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" OnCreateComponent=ServerReload.InternalOnCreateComponent IniOption="@Internal" Hint="Check this option ONLY in case converted weapons don't reload at all for you; this option should fix the problem, but then latency will affect both reload and active reload" WinTop=0.250000 WinLeft=0.517500 WinWidth=0.287000 TabOrder=15 OnChange=NiceGUISettings.InternalOnChange OnLoadINI=NiceGUISettings.InternalOnLoadINI End Object ch_ReloadWontWork=moCheckBox'NicePack.NiceGUISettings.ServerReload' - Begin Object Class=GUISectionBackground Name=WEAPBG Caption="General weapon settings" WinTop=0.012500 WinWidth=0.495000 WinHeight=0.287500 RenderWeight=0.100100 OnPreDraw=WeaponsBG.InternalPreDraw End Object bg_WEAP=GUISectionBackground'NicePack.NiceGUISettings.WEAPBG' - Begin Object Class=GUISectionBackground Name=RELOADBG Caption="Weapon reload settings" WinTop=0.012500 WinLeft=0.505000 WinWidth=0.495000 WinHeight=0.287500 RenderWeight=0.100100 OnPreDraw=WeaponsBG.InternalPreDraw End Object bg_RELOAD=GUISectionBackground'NicePack.NiceGUISettings.RELOADBG' -} +class NiceGUISettings extends Settings_Tabs; +//var automated GUIButton skillButtonA; +var array ForceProjItems; +var automated moCheckBox ch_WeapManagement; +var automated moCheckBox ch_AltSwitches; +var automated moCheckBox ch_DispCounters; +var automated moCheckBox ch_DisWeapProgress; +var automated moCheckBox ch_ShowHLMessages; +var automated moCheckBox ch_CancelFire; +var automated moCheckBox ch_CancelSwitching; +var automated moCheckBox ch_CancelNades; +var automated moCheckBox ch_CancelAiming; +var automated moCheckBox ch_ReloadWontWork; +var automated GUISectionBackground bg_WEAP; +var automated GUISectionBackground bg_RELOAD; +function InitComponent(GUIController MyController, GUIComponent MyOwner){ + super.InitComponent(MyController, MyOwner); +} +function InternalOnLoadINI(GUIComponent sender, string s){ + local NicePlayerController nicePlayer; + nicePlayer = NicePlayerController(PlayerOwner()); + if(nicePlayer == none) + return; + switch(sender){ + case ch_WeapManagement: + ch_WeapManagement.Checked(nicePlayer.bNiceWeaponManagement); + break; + case ch_AltSwitches: + ch_AltSwitches.Checked(nicePlayer.bFlagAltSwitchesModes); + break; + case ch_DispCounters: + ch_DispCounters.Checked(nicePlayer.bFlagDisplayCounters); + break; + case ch_DisWeapProgress: + ch_DisWeapProgress.Checked(nicePlayer.bFlagDisplayWeaponProgress); + break; + case ch_ShowHLMessages: + ch_ShowHLMessages.Checked(nicePlayer.bFlagShowHLMessages); + break; + case ch_CancelFire: + ch_CancelFire.Checked(nicePlayer.bRelCancelByFire); + break; + case ch_CancelSwitching: + ch_CancelSwitching.Checked(nicePlayer.bRelCancelBySwitching); + break; + case ch_CancelNades: + ch_CancelNades.Checked(nicePlayer.bRelCancelByNades); + break; + case ch_CancelAiming: + ch_CancelAiming.Checked(nicePlayer.bRelCancelByAiming); + break; + case ch_ReloadWontWork: + ch_ReloadWontWork.Checked(nicePlayer.bFlagUseServerReload); + break; + } +} +function InternalOnChange(GUIComponent Sender){ + local NicePlayerController nicePlayer; + super.InternalOnChange(Sender); + nicePlayer = NicePlayerController(PlayerOwner()); + if(nicePlayer == none) + return; + switch(sender){ + case ch_WeapManagement: + nicePlayer.bNiceWeaponManagement = ch_WeapManagement.IsChecked(); + break; + case ch_AltSwitches: + nicePlayer.ServerSetAltSwitchesModes(ch_AltSwitches.IsChecked()); + break; + case ch_DispCounters: + nicePlayer.ServerSetDisplayCounters(ch_DispCounters.IsChecked()); + break; + case ch_DisWeapProgress: + nicePlayer.ServerSetDisplayWeaponProgress(ch_DisWeapProgress.IsChecked()); + break; + case ch_ShowHLMessages: + nicePlayer.ServerSetHLMessages(ch_ShowHLMessages.IsChecked()); + break; + case ch_CancelFire: + nicePlayer.bRelCancelByFire = ch_CancelFire.IsChecked(); + break; + case ch_CancelSwitching: + nicePlayer.bRelCancelBySwitching = ch_CancelSwitching.IsChecked(); + break; + case ch_CancelNades: + nicePlayer.bRelCancelByNades = ch_CancelNades.IsChecked(); + break; + case ch_CancelAiming: + nicePlayer.bRelCancelByAiming = ch_CancelAiming.IsChecked(); + break; + case ch_ReloadWontWork: + nicePlayer.ServerSetUseServerReload(ch_ReloadWontWork.IsChecked()); + break; + } + nicePlayer.ClientSaveConfig(); +} +// size = (x=0.0125, y=0.0) ; (w=1.0, h=0.865) +// tab order +defaultproperties +{ + Begin Object Class=moCheckBox Name=WeaponManagement + CaptionWidth=0.955000 + Caption="Nice weapon management" + ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" + OnCreateComponent=WeaponManagement.InternalOnCreateComponent + IniOption="@Internal" + Hint="If checked, NicePack will use it's own system to manage weapon switching" + WinTop=0.050000 + WinLeft=0.012500 + WinWidth=0.278000 + TabOrder=4 + OnChange=NiceGUISettings.InternalOnChange + OnLoadINI=NiceGUISettings.InternalOnLoadINI + End Object + ch_WeapManagement=moCheckBox'NicePack.NiceGUISettings.WeaponManagement' + + Begin Object Class=moCheckBox Name=AltSwitches + CaptionWidth=0.955000 + Caption="Alt fire switches modes" + ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" + OnCreateComponent=AltSwitches.InternalOnCreateComponent + IniOption="@Internal" + Hint="Assault-rifle only; if enabled - alt fire button switches between fire modes, otherwise - acts as an alt fire" + WinTop=0.100000 + WinLeft=0.012500 + WinWidth=0.278000 + TabOrder=6 + OnChange=NiceGUISettings.InternalOnChange + OnLoadINI=NiceGUISettings.InternalOnLoadINI + End Object + ch_AltSwitches=moCheckBox'NicePack.NiceGUISettings.AltSwitches' + + Begin Object Class=moCheckBox Name=DispCounters + CaptionWidth=0.955000 + Caption="Display counters" + ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" + OnCreateComponent=DispCounters.InternalOnCreateComponent + IniOption="@Internal" + Hint="Toggles display of the various counters used by skills" + WinTop=0.150000 + WinLeft=0.012500 + WinWidth=0.278000 + TabOrder=7 + OnChange=NiceGUISettings.InternalOnChange + OnLoadINI=NiceGUISettings.InternalOnLoadINI + End Object + ch_DispCounters=moCheckBox'NicePack.NiceGUISettings.DispCounters' + + Begin Object Class=moCheckBox Name=DispWeapProgress + CaptionWidth=0.955000 + Caption="Display weapon progress" + ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" + OnCreateComponent=DispWeapProgress.InternalOnCreateComponent + IniOption="@Internal" + Hint="Displays weapon progress rate, whoever it's defined by a skill that's using this functionality" + WinTop=0.200000 + WinLeft=0.012500 + WinWidth=0.278000 + TabOrder=8 + OnChange=NiceGUISettings.InternalOnChange + OnLoadINI=NiceGUISettings.InternalOnLoadINI + End Object + ch_DisWeapProgress=moCheckBox'NicePack.NiceGUISettings.DispWeapProgress' + + Begin Object Class=moCheckBox Name=ShowHLMessages + CaptionWidth=0.955000 + Caption="Show Hardcore Level messages" + ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" + OnCreateComponent=ShowHLMessages.InternalOnCreateComponent + IniOption="@Internal" + Hint="Enable to be notified each time Hardcore Level is changed" + WinTop=0.300000 + WinLeft=0.012500 + WinWidth=0.278000 + TabOrder=9 + OnChange=NiceGUISettings.InternalOnChange + OnLoadINI=NiceGUISettings.InternalOnLoadINI + End Object + ch_ShowHLMessages=moCheckBox'NicePack.NiceGUISettings.ShowHLMessages' + + Begin Object Class=moCheckBox Name=CancelFire + CaptionWidth=0.955000 + Caption="Cancel reload by shooting" + ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" + OnCreateComponent=CancelFire.InternalOnCreateComponent + IniOption="@Internal" + Hint="If checked, you'll be able to cancel reload of converted weapons by shooting (when you have ammo)" + WinTop=0.050000 + WinLeft=0.517500 + WinWidth=0.287000 + TabOrder=11 + OnChange=NiceGUISettings.InternalOnChange + OnLoadINI=NiceGUISettings.InternalOnLoadINI + End Object + ch_CancelFire=moCheckBox'NicePack.NiceGUISettings.CancelFire' + + Begin Object Class=moCheckBox Name=CancelSwitching + CaptionWidth=0.955000 + Caption="Cancel reload by switching weapons" + ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" + OnCreateComponent=CancelSwitching.InternalOnCreateComponent + IniOption="@Internal" + Hint="If checked, you'll be able to cancel reload of converted weapons by switching to different weapon" + WinTop=0.100000 + WinLeft=0.517500 + WinWidth=0.287000 + TabOrder=12 + OnChange=NiceGUISettings.InternalOnChange + OnLoadINI=NiceGUISettings.InternalOnLoadINI + End Object + ch_CancelSwitching=moCheckBox'NicePack.NiceGUISettings.CancelSwitching' + + Begin Object Class=moCheckBox Name=CancelNades + CaptionWidth=0.955000 + Caption="Cancel reload by throwing grenades" + ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" + OnCreateComponent=CancelNades.InternalOnCreateComponent + IniOption="@Internal" + Hint="If checked, you'll be able to cancel reload of converted weapons by throwing a grenade" + WinTop=0.150000 + WinLeft=0.517500 + WinWidth=0.287000 + TabOrder=13 + OnChange=NiceGUISettings.InternalOnChange + OnLoadINI=NiceGUISettings.InternalOnLoadINI + End Object + ch_CancelNades=moCheckBox'NicePack.NiceGUISettings.CancelNades' + + Begin Object Class=moCheckBox Name=CancelAiming + CaptionWidth=0.955000 + Caption="Cancel reload by aiming" + ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" + OnCreateComponent=CancelAiming.InternalOnCreateComponent + IniOption="@Internal" + Hint="If checked, you'll be able to cancel reload of converted weapons by going into iron sights (when you have ammo)" + WinTop=0.200000 + WinLeft=0.517500 + WinWidth=0.287000 + TabOrder=14 + OnChange=NiceGUISettings.InternalOnChange + OnLoadINI=NiceGUISettings.InternalOnLoadINI + End Object + ch_CancelAiming=moCheckBox'NicePack.NiceGUISettings.CancelAiming' + + Begin Object Class=moCheckBox Name=ServerReload + CaptionWidth=0.955000 + Caption="My reload doesn't work" + ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton" + OnCreateComponent=ServerReload.InternalOnCreateComponent + IniOption="@Internal" + Hint="Check this option ONLY in case converted weapons don't reload at all for you; this option should fix the problem, but then latency will affect both reload and active reload" + WinTop=0.250000 + WinLeft=0.517500 + WinWidth=0.287000 + TabOrder=15 + OnChange=NiceGUISettings.InternalOnChange + OnLoadINI=NiceGUISettings.InternalOnLoadINI + End Object + ch_ReloadWontWork=moCheckBox'NicePack.NiceGUISettings.ServerReload' + + Begin Object Class=GUISectionBackground Name=WEAPBG + Caption="General weapon settings" + WinTop=0.012500 + WinWidth=0.495000 + WinHeight=0.287500 + RenderWeight=0.100100 + OnPreDraw=WeaponsBG.InternalPreDraw + End Object + bg_WEAP=GUISectionBackground'NicePack.NiceGUISettings.WEAPBG' + + Begin Object Class=GUISectionBackground Name=RELOADBG + Caption="Weapon reload settings" + WinTop=0.012500 + WinLeft=0.505000 + WinWidth=0.495000 + WinHeight=0.287500 + RenderWeight=0.100100 + OnPreDraw=WeaponsBG.InternalPreDraw + End Object + bg_RELOAD=GUISectionBackground'NicePack.NiceGUISettings.RELOADBG' +} diff --git a/sources/GUI/NiceInteraction.uc b/sources/GUI/NiceInteraction.uc index 9f2f757..6207782 100644 --- a/sources/GUI/NiceInteraction.uc +++ b/sources/GUI/NiceInteraction.uc @@ -1,216 +1,372 @@ -class NiceInteraction extends Interaction - dependson(NicePack) - dependson(NiceAbilityManager); -#exec OBJ LOAD FILE=KillingFloor2HUD.utx -var NicePack NicePackMutator; -var Material bleedIcon, poisonIcon; -var Texture greenBar, redBar; -var Texture shield; -var float size; -// Weapon box sizes -var float InventoryBoxWidth; -var float InventoryBoxHeight; -var float BorderSize; -event NotifyLevelChange(){ - Master.RemoveInteraction(self); -} -function RegisterMutator(NicePack activePack){ - NicePackMutator = activePack; -} -function bool isPoisoned(ScrnHumanPawn pwn){ - local Inventory I; - if(pwn.Inventory != none) for(I = pwn.Inventory; I != none; I = I.Inventory) if(I != none && MeanPoisonInventory(I) != none) return true; - return false; -} -function PostRender(Canvas C){ - local int i; - local NicePack niceMutator; - local NiceHumanPawn nicePawn; - local class niceVet; - local MeanReplicationInfo szRI; - local NiceWeapon niceWeap; - local NicePlayerController nicePlayer; - local ScrnHUD scrnHUDInstance; - local Texture barTexture; - local int x, y, center, barWidth, offset; - local int missesWidth, missesHeight, missesSpace; - local int missesX, missesY; - if(C == none) return; - if(C.ViewPort == none) return; - if(C.ViewPort.Actor == none) return; - if(C.ViewPort.Actor.Pawn == none) return; - nicePlayer = NicePlayerController(C.ViewPort.Actor.Pawn.Controller); - niceWeap = NiceWeapon(C.ViewPort.Actor.Pawn.Weapon); - if(nicePlayer == none) return; - scrnHUDInstance = ScrnHUD(nicePlayer.myHUD); - //// Draw bleed and poison icons - C.SetDrawColor(255, 255, 255); - szRI = class'MeanReplicationInfo'.static.findSZri(ViewportOwner.Actor.PlayerReplicationInfo); - offset = 4; - if(szRI != none){ if(szRI.isBleeding){ x = C.ClipX * 0.007; y = C.ClipY * 0.93 - size * offset; C.SetPos(x, y); C.DrawTile(bleedIcon, size, size, 0, 0, bleedIcon.MaterialUSize(), bleedIcon.MaterialVSize()); } offset++; if(isPoisoned(ScrnHumanPawn(C.ViewPort.Actor.Pawn))){ x = C.ClipX * 0.007; y = C.ClipY * 0.93 - size * offset; C.SetPos(x, y); C.DrawTile(poisonIcon, size, size, 0, 0, poisonIcon.MaterialUSize(), poisonIcon.MaterialVSize()); } - } - if(niceWeap != none && niceWeap.bShowSecondaryCharge && scrnHUDInstance != none){ C.ColorModulate.X = 1; C.ColorModulate.Y = 1; C.ColorModulate.Z = 1; C.ColorModulate.W = scrnHUDInstance.HudOpacity / 255; if(!scrnHUDInstance.bLightHud) scrnHUDInstance.DrawSpriteWidget(C, scrnHUDInstance.SecondaryClipsBG); scrnHUDInstance.DrawSpriteWidget(C, scrnHUDInstance.SecondaryClipsIcon); scrnHUDInstance.SecondaryClipsDigits.value = niceWeap.secondaryCharge; scrnHUDInstance.DrawNumericWidget(C, scrnHUDInstance.SecondaryClipsDigits, scrnHUDInstance.DigitsSmall); - } - niceMutator = class'NicePack'.static.Myself(C.ViewPort.Actor.Pawn.Level); - if(niceMutator == none) return; - //// Draw counters - if(nicePlayer != none && nicePlayer.bFlagDisplayCounters){ x = C.ClipX * 0.5 - (64 + 2) * niceMutator.GetVisibleCountersAmount(); y = C.ClipY * 0.01; for(i = 0;i < niceMutator.niceCounterSet.Length;i ++) if(niceMutator.niceCounterSet[i].value != 0 || niceMutator.niceCounterSet[i].bShowZeroValue){ DrawCounter(C, niceMutator.niceCounterSet[i], x, y, C.ViewPort.Actor.Pawn.PlayerReplicationInfo.Team); x += 128 + 4; } - } - //// Draw weapons progress bars - if(nicePlayer != none && nicePlayer.bFlagDisplayWeaponProgress){ x = C.ClipX - InventoryBoxWidth * C.ClipX - 5; y = C.ClipY * 0.5 - 0.5 * (InventoryBoxHeight * C.ClipX + 4) * niceMutator.niceWeapProgressSet.Length; for(i = 0;i < niceMutator.niceWeapProgressSet.Length;i ++){ DrawWeaponProgress(C, niceMutator.niceWeapProgressSet[i], x, y, C.ViewPort.Actor.Pawn.PlayerReplicationInfo.Team); y += (InventoryBoxHeight * C.ClipX + 4); } - } - //// Draw invincibility bar - nicePawn = NiceHumanPawn(nicePlayer.pawn); - if(nicePawn != none && nicePawn.invincibilityTimer != 0.0){ C.SetDrawColor(255, 255, 255); if(nicePawn.invincibilityTimer > 0) barTexture = greenBar; else barTexture = redBar; center = C.ClipX * 0.5; y = C.ClipY * 0.75; barWidth = C.ClipX * 0.2; niceVet = class'NiceVeterancyTypes'.static. GetVeterancy(nicePawn.PlayerReplicationInfo); if(niceVet != none){ if(nicePawn.invincibilityTimer > 0){ barWidth *= nicePawn.invincibilityTimer / niceVet.static.GetInvincibilityDuration(nicePawn.KFPRI); } else{ barWidth *= nicePawn.invincibilityTimer / class'NiceSkillZerkGunzerker'.default.cooldown; } } else barWidth = 0; x = center - (barWidth / 2); C.SetPos(x, y); C.DrawTile(barTexture, barWidth, 32, 0, 0, barTexture.MaterialUSize(), barTexture.MaterialVSize()); if(nicePawn.safeMeleeMisses <= 0) return; missesSpace = 10;//64x64 => 16x16 missesHeight = 16; missesWidth = nicePawn.safeMeleeMisses * 16 + (nicePawn.safeMeleeMisses - 1) * missesSpace; missesX = center - (missesWidth / 2); missesY = y + (32 - missesHeight) * 0.5; for(i = 0;i < nicePawn.safeMeleeMisses;i ++){ C.SetPos(missesX + i * (16 + missesSpace), missesY); C.DrawTile(shield, 16, 16, 0, 0, shield.MaterialUSize(), shield.MaterialVSize()); } - } - // Draw cooldowns - if(nicePlayer.abilityManager == none) return; - for(i = 0;i < nicePlayer.abilityManager.currentAbilitiesAmount;i ++) DrawAbilityCooldown(C, i); -} -function DrawCounter(Canvas C, NicePack.CounterDisplay counter, int x, int y, TeamInfo team){ - local float borderSpace; - local Texture textureToDraw; - local float textWidth, textHeight; - local string textToDraw; - // Some per-defined values for drawing - local int iconSize, backgroundWidth, backgroundHeight; - // Fill some constants that will dictate how to display counter - iconSize = 64; - backgroundWidth = 128; - backgroundHeight = 64; - borderSpace = 8; - // Reset color - if(team.teamIndex == 0) C.SetDrawColor(255, 64, 64); - else C.SetDrawColor(team.teamColor.R, team.teamColor.G, team.teamColor.B); - // Draw background - C.SetPos(x, y); - textureToDraw = Texture(class'HUDKillingFloor'.default.HealthBG.WidgetTexture); - C.DrawTile(textureToDraw, 128, 64, 0, 0, textureToDraw.MaterialUSize(), textureToDraw.MaterialVSize()); - // Draw appropriate icon - C.SetPos(x + borderSpace, y + borderSpace); - textureToDraw = counter.icon; - C.DrawTile(textureToDraw, 64 - 2*borderSpace, 64 - 2 * borderSpace, 0, 0, textureToDraw.MaterialUSize(), textureToDraw.MaterialVSize()); - // Draw numbers - textToDraw = string(counter.value); - C.Font = class'ROHUD'.Static.LoadSmallFontStatic(1); - C.TextSize(textToDraw, textWidth, textHeight); - C.SetPos(x + iconSize + (backgroundWidth - iconSize - textWidth) / 2, y + (backgroundHeight - textHeight) / 2 + 2); - C.DrawText(textToDraw); -} -function DrawAbilityCooldown(Canvas C, int abilityIndex){ - local Texture skillTexture, backgroundTexture; - local NiceHumanPawn nicePawn; - local NicePlayerController nicePlayer; - local class niceVet; - local int x, y; - local string textToDraw; - local float textWidth, textHeight; - local NiceAbilityManager.EAbilityState abilityState; - if(C == none) return; - if(C.ViewPort == none) return; - if(C.ViewPort.Actor == none) return; - nicePawn = NiceHumanPawn(C.ViewPort.Actor.Pawn); - nicePlayer = NicePlayerController(C.ViewPort.Actor.Pawn.Controller); - if(nicePawn == none) return; - if(nicePlayer == none || nicePlayer.abilityManager == none) return; - niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePawn.KFPRI); - skillTexture = nicePlayer.abilityManager.currentAbilities[abilityIndex]. description.icon; - if(skillTexture == none) return; - // Set stuff up - x = C.ClipX * 0.265; - x += abilityIndex * (10 + 64); - y = C.ClipY * 0.93; - textToDraw = string(int(Ceil(nicePlayer.abilityManager.currentAbilities[abilityIndex].cooldown))); - backgroundTexture = Texture'KillingFloorHUD.HUD.Hud_Box_128x64'; - // Reset color - C.SetDrawColor(255, 64, 64); - // Draw background - C.SetPos(x, y); - C.DrawTile(backgroundTexture, 64, 64, 0, 0, backgroundTexture.MaterialUSize(), backgroundTexture.MaterialVSize()); - C.SetPos(x, y); - C.DrawTile(skillTexture, 64, 64, 0, 0, skillTexture.MaterialUSize(), skillTexture.MaterialVSize()); - // Draw additional background - abilityState = nicePlayer.abilityManager.currentAbilities[abilityIndex].myState; - if(abilityState == ASTATE_ACTIVE) C.SetDrawColor(255, 0, 0, 128); - if(abilityState == ASTATE_COOLDOWN) C.SetDrawColor(0, 0, 0, 192); - if(abilityState != ASTATE_READY){ C.SetPos(x, y); C.DrawTileStretched(Material'KillingFloorHUD.HUD.WhiteTexture', 64, 64); - } - // Draw cooldown stuff - if(abilityState == ASTATE_COOLDOWN){ C.SetDrawColor(255, 192, 192); C.Font = class'ROHUD'.static.LoadSmallFontStatic(1); C.TextSize(textToDraw, textWidth, textHeight); C.SetPos(x, y); C.SetPos(x + (64 - textWidth) / 2, y + (64 - textHeight) / 2 + 2); C.DrawText(textToDraw); - } - // Draw calibration GUI - DrawCalibrationStars(C); -} -function DrawCalibrationStars(Canvas C){ - local Texture starTexture; - local int x, y, i; - local int starsAmount; - local NiceHumanPawn nicePawn; - local NicePlayerController nicePlayer; - if(C == none) return; - if(C.ViewPort == none) return; - if(C.ViewPort.Actor == none) return; - nicePawn = NiceHumanPawn(C.ViewPort.Actor.Pawn); - if(nicePawn == none) return; - if(nicePawn.currentCalibrationState == CALSTATE_NOABILITY) return; - nicePlayer = NicePlayerController(nicePawn.controller); - if(nicePlayer == none) return; - starsAmount = nicePawn.calibrationScore; - x = C.ClipX * 0.5; - x -= 0.5 * (starsAmount * 32 + (starsAmount - 1) * 16); - if(nicePawn.currentCalibrationState == CALSTATE_ACTIVE) y = C.ClipY * 0.6; - else y = C.ClipY * 0.02; - starTexture = Texture'KillingFloorHUD.HUD.Hud_Perk_Star'; - for(i = 0;i < starsAmount;i ++){ C.SetPos(x, y); C.SetDrawColor(255, 255, 255); C.DrawTile(starTexture, 32, 32, 0, 0, starTexture.MaterialUSize(), starTexture.MaterialVSize()); x += 32 + 16; - } -} -function DrawWeaponProgress(Canvas C, NicePack.WeaponProgressDisplay weapProgress, int x, int y, TeamInfo team){ - local float textWidth, textHeight; - local string textToDraw; - local float TempWidth, TempHeight, TempBorder; - TempWidth = InventoryBoxWidth * C.ClipX; - TempHeight = InventoryBoxHeight * C.ClipX; - TempBorder = BorderSize * C.ClipX; - // Draw background bar - if(team.teamIndex == 0) C.SetDrawColor(255, 64, 64, 64); - else C.SetDrawColor(team.teamColor.R, team.teamColor.G, team.teamColor.B, 64); - C.SetPos(x, y); - C.DrawTile(Texture'Engine.WhiteSquareTexture', TempWidth * weapProgress.progress, TempHeight, 0, 0, 2, 2); - // Draw this item's Background - if(team.teamIndex == 0) C.SetDrawColor(255, 64, 64); - else C.SetDrawColor(team.teamColor.R, team.teamColor.G, team.teamColor.B); - C.SetPos(x, y); - C.DrawTileStretched(Texture'KillingFloorHUD.HUD.HUD_Rectangel_W_Stroke', TempWidth, TempHeight); - // Draw the Weapon's Icon over the Background - C.SetDrawColor(255, 255, 255); - C.SetPos(x + TempBorder, y + TempBorder); - if(weapProgress.weapClass.default.HudImage != none) C.DrawTile(weapProgress.weapClass.default.HudImage, TempWidth - (2.0 * TempBorder), TempHeight - (2.0 * TempBorder), 0, 0, 256, 192); - // Draw counter, if needed - if(team.teamIndex == 0) C.SetDrawColor(255, 64, 64); - else C.SetDrawColor(team.teamColor.R, team.teamColor.G, team.teamColor.B); - if(weapProgress.bShowCounter){ textToDraw = string(weapProgress.counter); C.Font = class'ROHUD'.Static.LoadSmallFontStatic(5); C.TextSize(textToDraw, textWidth, textHeight); C.SetPos(x + TempWidth - TempBorder - textWidth, y + TempHeight - TempBorder - textHeight + 2); C.DrawText(textToDraw); - } -} -function bool KeyEvent(EInputKey Key, EInputAction Action, float Delta){ - local bool bNeedsReload; - local string Alias, LeftPart, RigthPart; - local NiceWeapon niceWeap; - local NicePlayerController nicePlayer; - // Find controller and current weapon - nicePlayer = NicePlayerController(ViewportOwner.Actor); - if(nicePlayer == none) return false; - if(nicePlayer.Pawn != none) niceWeap = NiceWeapon(nicePlayer.Pawn.Weapon); - // If this is a button press - detect alias - if(Action == IST_Press){ // Check for reload command Alias = nicePlayer.ConsoleCommand("KEYBINDING" @ nicePlayer.ConsoleCommand("KEYNAME" @ Key)); if(nicePlayer.bAdvReloadCheck) bNeedsReload = InStr(Caps(Alias), "RELOADMENOW") > -1 || InStr(Caps(Alias), "RELOADWEAPON") > -1; if(Divide(Alias, " ", LeftPart, RigthPart)) Alias = LeftPart; if(Key == IK_MouseWheelUp || Key == IK_MouseWheelDown){ nicePlayer.UpdateSelectors(); if(nicePlayer.hasZeroSelector && nicePlayer.bUsesMouseWheel && nicePlayer.bNiceWeaponManagement){ nicePlayer.ScrollSelector(0, nicePlayer.bMouseWheelLoops, Key == IK_MouseWheelUp); return true; } } - } - // Open trader on movement - if(Alias ~= "MoveForward" || Alias ~= "MoveBackward" || Alias ~= "TurnLeft" || Alias ~= "TurnRight" || Alias ~= "StrafeLeft" || Alias ~= "StrafeRight" || Alias ~= "Axis"){ - // Open trader if it's a pre-game if(NicePackMutator.bIsPreGame && NicePackMutator.bInitialTrader && (NicePackMutator.bStillDuringInitTrader || !nicePlayer.bOpenedInitTrader) && nicePlayer.Pawn != none){ nicePlayer.ShowBuyMenu("Initial trader", KFHumanPawn(nicePlayer.Pawn).MaxCarryWeight); nicePlayer.bOpenedInitTrader = true; return true; } //nicePlayer.ClientOpenMenu("NicePack.NiceGUIBuyMenu",,"Test stuff",string(15)); - } - // Reload if we've detected a reload alias in this button's command - if(niceWeap != none && !nicePlayer.bUseServerReload && (bNeedsReload || Alias ~= "ReloadMeNow" || Alias ~= "ReloadWeapon")) niceWeap.ClientReloadMeNow(); - return false; -} -defaultproperties -{ bleedIcon=Texture'NicePackT.MeanZeds.bleedIcon' poisonIcon=Texture'NicePackT.MeanZeds.poisonIcon' greenBar=Texture'KFStoryGame_Tex.HUD.Batter_Fill' redBar=Texture'KFStoryGame_Tex.HUD.BarFill_Red' Shield=Texture'KillingFloorHUD.HUD.Hud_Shield' Size=75.599998 InventoryBoxWidth=0.100000 InventoryBoxHeight=0.075000 BorderSize=0.005000 bVisible=True -} +class NiceInteraction extends Interaction + dependson(NicePack) + dependson(NiceAbilityManager); +#exec OBJ LOAD FILE=KillingFloor2HUD.utx +var NicePack NicePackMutator; +var Material bleedIcon, poisonIcon; +var Texture greenBar, redBar; +var Texture shield; +var float size; +// Weapon box sizes +var float InventoryBoxWidth; +var float InventoryBoxHeight; +var float BorderSize; +event NotifyLevelChange(){ + Master.RemoveInteraction(self); +} +function RegisterMutator(NicePack activePack){ + NicePackMutator = activePack; +} +function bool isPoisoned(ScrnHumanPawn pwn){ + local Inventory I; + if(pwn.Inventory != none) + for(I = pwn.Inventory; I != none; I = I.Inventory) + if(I != none && MeanPoisonInventory(I) != none) + return true; + return false; +} +function PostRender(Canvas C){ + local int i; + local NicePack niceMutator; + local NiceHumanPawn nicePawn; + local class niceVet; + local MeanReplicationInfo szRI; + local NiceWeapon niceWeap; + local NicePlayerController nicePlayer; + local ScrnHUD scrnHUDInstance; + local Texture barTexture; + local int x, y, center, barWidth, offset; + local int missesWidth, missesHeight, missesSpace; + local int missesX, missesY; + if(C == none) return; + if(C.ViewPort == none) return; + if(C.ViewPort.Actor == none) return; + if(C.ViewPort.Actor.Pawn == none) return; + nicePlayer = NicePlayerController(C.ViewPort.Actor.Pawn.Controller); + niceWeap = NiceWeapon(C.ViewPort.Actor.Pawn.Weapon); + if(nicePlayer == none) + return; + scrnHUDInstance = ScrnHUD(nicePlayer.myHUD); + //// Draw bleed and poison icons + C.SetDrawColor(255, 255, 255); + szRI = class'MeanReplicationInfo'.static.findSZri(ViewportOwner.Actor.PlayerReplicationInfo); + offset = 4; + if(szRI != none){ + if(szRI.isBleeding){ + x = C.ClipX * 0.007; + y = C.ClipY * 0.93 - size * offset; + C.SetPos(x, y); + C.DrawTile(bleedIcon, size, size, 0, 0, bleedIcon.MaterialUSize(), bleedIcon.MaterialVSize()); + } + offset++; + if(isPoisoned(ScrnHumanPawn(C.ViewPort.Actor.Pawn))){ + x = C.ClipX * 0.007; + y = C.ClipY * 0.93 - size * offset; + C.SetPos(x, y); + C.DrawTile(poisonIcon, size, size, 0, 0, poisonIcon.MaterialUSize(), poisonIcon.MaterialVSize()); + } + } + if(niceWeap != none && niceWeap.bShowSecondaryCharge && scrnHUDInstance != none){ + C.ColorModulate.X = 1; + C.ColorModulate.Y = 1; + C.ColorModulate.Z = 1; + C.ColorModulate.W = scrnHUDInstance.HudOpacity / 255; + if(!scrnHUDInstance.bLightHud) + scrnHUDInstance.DrawSpriteWidget(C, scrnHUDInstance.SecondaryClipsBG); + scrnHUDInstance.DrawSpriteWidget(C, scrnHUDInstance.SecondaryClipsIcon); + scrnHUDInstance.SecondaryClipsDigits.value = niceWeap.secondaryCharge; + scrnHUDInstance.DrawNumericWidget(C, scrnHUDInstance.SecondaryClipsDigits, scrnHUDInstance.DigitsSmall); + } + niceMutator = class'NicePack'.static.Myself(C.ViewPort.Actor.Pawn.Level); + if(niceMutator == none) + return; + //// Draw counters + if(nicePlayer != none && nicePlayer.bFlagDisplayCounters){ + x = C.ClipX * 0.5 - (64 + 2) * niceMutator.GetVisibleCountersAmount(); + y = C.ClipY * 0.01; + for(i = 0;i < niceMutator.niceCounterSet.Length;i ++) + if(niceMutator.niceCounterSet[i].value != 0 || niceMutator.niceCounterSet[i].bShowZeroValue){ + DrawCounter(C, niceMutator.niceCounterSet[i], x, y, C.ViewPort.Actor.Pawn.PlayerReplicationInfo.Team); + x += 128 + 4; + } + } + //// Draw weapons progress bars + if(nicePlayer != none && nicePlayer.bFlagDisplayWeaponProgress){ + x = C.ClipX - InventoryBoxWidth * C.ClipX - 5; + y = C.ClipY * 0.5 - 0.5 * (InventoryBoxHeight * C.ClipX + 4) * niceMutator.niceWeapProgressSet.Length; + for(i = 0;i < niceMutator.niceWeapProgressSet.Length;i ++){ + DrawWeaponProgress(C, niceMutator.niceWeapProgressSet[i], x, y, + C.ViewPort.Actor.Pawn.PlayerReplicationInfo.Team); + y += (InventoryBoxHeight * C.ClipX + 4); + } + } + //// Draw invincibility bar + nicePawn = NiceHumanPawn(nicePlayer.pawn); + if(nicePawn != none && nicePawn.invincibilityTimer != 0.0){ + C.SetDrawColor(255, 255, 255); + if(nicePawn.invincibilityTimer > 0) + barTexture = greenBar; + else + barTexture = redBar; + center = C.ClipX * 0.5; + y = C.ClipY * 0.75; + barWidth = C.ClipX * 0.2; + niceVet = class'NiceVeterancyTypes'.static. + GetVeterancy(nicePawn.PlayerReplicationInfo); + if(niceVet != none){ + if(nicePawn.invincibilityTimer > 0){ + barWidth *= nicePawn.invincibilityTimer + / niceVet.static.GetInvincibilityDuration(nicePawn.KFPRI); + } + else{ + barWidth *= nicePawn.invincibilityTimer / + class'NiceSkillZerkGunzerker'.default.cooldown; + } + } + else + barWidth = 0; + x = center - (barWidth / 2); + C.SetPos(x, y); + C.DrawTile(barTexture, barWidth, 32, 0, 0, barTexture.MaterialUSize(), barTexture.MaterialVSize()); + if(nicePawn.safeMeleeMisses <= 0) + return; + missesSpace = 10;//64x64 => 16x16 + missesHeight = 16; + missesWidth = nicePawn.safeMeleeMisses * 16 + + (nicePawn.safeMeleeMisses - 1) * missesSpace; + missesX = center - (missesWidth / 2); + missesY = y + (32 - missesHeight) * 0.5; + for(i = 0;i < nicePawn.safeMeleeMisses;i ++){ + C.SetPos(missesX + i * (16 + missesSpace), missesY); + C.DrawTile(shield, 16, 16, 0, 0, shield.MaterialUSize(), shield.MaterialVSize()); + } + } + // Draw cooldowns + if(nicePlayer.abilityManager == none) + return; + for(i = 0;i < nicePlayer.abilityManager.currentAbilitiesAmount;i ++) + DrawAbilityCooldown(C, i); +} +function DrawCounter(Canvas C, NicePack.CounterDisplay counter, int x, int y, TeamInfo team){ + local float borderSpace; + local Texture textureToDraw; + local float textWidth, textHeight; + local string textToDraw; + // Some per-defined values for drawing + local int iconSize, backgroundWidth, backgroundHeight; + // Fill some constants that will dictate how to display counter + iconSize = 64; + backgroundWidth = 128; + backgroundHeight = 64; + borderSpace = 8; + // Reset color + if(team.teamIndex == 0) + C.SetDrawColor(255, 64, 64); + else + C.SetDrawColor(team.teamColor.R, team.teamColor.G, team.teamColor.B); + // Draw background + C.SetPos(x, y); + textureToDraw = Texture(class'HUDKillingFloor'.default.HealthBG.WidgetTexture); + C.DrawTile(textureToDraw, 128, 64, 0, 0, textureToDraw.MaterialUSize(), textureToDraw.MaterialVSize()); + // Draw appropriate icon + C.SetPos(x + borderSpace, y + borderSpace); + textureToDraw = counter.icon; + C.DrawTile(textureToDraw, 64 - 2*borderSpace, 64 - 2 * borderSpace, 0, 0, + textureToDraw.MaterialUSize(), textureToDraw.MaterialVSize()); + // Draw numbers + textToDraw = string(counter.value); + C.Font = class'ROHUD'.Static.LoadSmallFontStatic(1); + C.TextSize(textToDraw, textWidth, textHeight); + C.SetPos(x + iconSize + (backgroundWidth - iconSize - textWidth) / 2, y + (backgroundHeight - textHeight) / 2 + 2); + C.DrawText(textToDraw); +} +function DrawAbilityCooldown(Canvas C, int abilityIndex){ + local Texture skillTexture, backgroundTexture; + local NiceHumanPawn nicePawn; + local NicePlayerController nicePlayer; + local class niceVet; + local int x, y; + local string textToDraw; + local float textWidth, textHeight; + local NiceAbilityManager.EAbilityState abilityState; + if(C == none) return; + if(C.ViewPort == none) return; + if(C.ViewPort.Actor == none) return; + nicePawn = NiceHumanPawn(C.ViewPort.Actor.Pawn); + nicePlayer = NicePlayerController(C.ViewPort.Actor.Pawn.Controller); + if(nicePawn == none) + return; + if(nicePlayer == none || nicePlayer.abilityManager == none) + return; + niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePawn.KFPRI); + skillTexture = + nicePlayer.abilityManager.currentAbilities[abilityIndex]. + description.icon; + if(skillTexture == none) + return; + // Set stuff up + x = C.ClipX * 0.265; + x += abilityIndex * (10 + 64); + y = C.ClipY * 0.93; + textToDraw = string(int(Ceil(nicePlayer.abilityManager.currentAbilities[abilityIndex].cooldown))); + backgroundTexture = Texture'KillingFloorHUD.HUD.Hud_Box_128x64'; + // Reset color + C.SetDrawColor(255, 64, 64); + // Draw background + C.SetPos(x, y); + C.DrawTile(backgroundTexture, 64, 64, 0, 0, backgroundTexture.MaterialUSize(), backgroundTexture.MaterialVSize()); + C.SetPos(x, y); + C.DrawTile(skillTexture, 64, 64, 0, 0, skillTexture.MaterialUSize(), skillTexture.MaterialVSize()); + // Draw additional background + abilityState = + nicePlayer.abilityManager.currentAbilities[abilityIndex].myState; + if(abilityState == ASTATE_ACTIVE) + C.SetDrawColor(255, 0, 0, 128); + if(abilityState == ASTATE_COOLDOWN) + C.SetDrawColor(0, 0, 0, 192); + if(abilityState != ASTATE_READY){ + C.SetPos(x, y); + C.DrawTileStretched(Material'KillingFloorHUD.HUD.WhiteTexture', 64, 64); + } + // Draw cooldown stuff + if(abilityState == ASTATE_COOLDOWN){ + C.SetDrawColor(255, 192, 192); + C.Font = class'ROHUD'.static.LoadSmallFontStatic(1); + C.TextSize(textToDraw, textWidth, textHeight); + C.SetPos(x, y); + C.SetPos(x + (64 - textWidth) / 2, y + (64 - textHeight) / 2 + 2); + C.DrawText(textToDraw); + } + // Draw calibration GUI + DrawCalibrationStars(C); +} +function DrawCalibrationStars(Canvas C){ + local Texture starTexture; + local int x, y, i; + local int starsAmount; + local NiceHumanPawn nicePawn; + local NicePlayerController nicePlayer; + if(C == none) return; + if(C.ViewPort == none) return; + if(C.ViewPort.Actor == none) return; + nicePawn = NiceHumanPawn(C.ViewPort.Actor.Pawn); + if(nicePawn == none) + return; + if(nicePawn.currentCalibrationState == CALSTATE_NOABILITY) + return; + nicePlayer = NicePlayerController(nicePawn.controller); + if(nicePlayer == none) + return; + starsAmount = nicePawn.calibrationScore; + x = C.ClipX * 0.5; + x -= 0.5 * (starsAmount * 32 + (starsAmount - 1) * 16); + if(nicePawn.currentCalibrationState == CALSTATE_ACTIVE) + y = C.ClipY * 0.6; + else + y = C.ClipY * 0.02; + starTexture = Texture'KillingFloorHUD.HUD.Hud_Perk_Star'; + for(i = 0;i < starsAmount;i ++){ + C.SetPos(x, y); + C.SetDrawColor(255, 255, 255); + C.DrawTile(starTexture, 32, 32, 0, 0, starTexture.MaterialUSize(), starTexture.MaterialVSize()); + x += 32 + 16; + } +} +function DrawWeaponProgress(Canvas C, NicePack.WeaponProgressDisplay weapProgress, int x, int y, TeamInfo team){ + local float textWidth, textHeight; + local string textToDraw; + local float TempWidth, TempHeight, TempBorder; + TempWidth = InventoryBoxWidth * C.ClipX; + TempHeight = InventoryBoxHeight * C.ClipX; + TempBorder = BorderSize * C.ClipX; + // Draw background bar + if(team.teamIndex == 0) + C.SetDrawColor(255, 64, 64, 64); + else + C.SetDrawColor(team.teamColor.R, team.teamColor.G, team.teamColor.B, 64); + C.SetPos(x, y); + C.DrawTile(Texture'Engine.WhiteSquareTexture', TempWidth * weapProgress.progress, TempHeight, 0, 0, 2, 2); + // Draw this item's Background + if(team.teamIndex == 0) + C.SetDrawColor(255, 64, 64); + else + C.SetDrawColor(team.teamColor.R, team.teamColor.G, team.teamColor.B); + C.SetPos(x, y); + C.DrawTileStretched(Texture'KillingFloorHUD.HUD.HUD_Rectangel_W_Stroke', TempWidth, TempHeight); + // Draw the Weapon's Icon over the Background + C.SetDrawColor(255, 255, 255); + C.SetPos(x + TempBorder, y + TempBorder); + if(weapProgress.weapClass.default.HudImage != none) + C.DrawTile(weapProgress.weapClass.default.HudImage, + TempWidth - (2.0 * TempBorder), TempHeight - (2.0 * TempBorder), 0, 0, 256, 192); + // Draw counter, if needed + if(team.teamIndex == 0) + C.SetDrawColor(255, 64, 64); + else + C.SetDrawColor(team.teamColor.R, team.teamColor.G, team.teamColor.B); + if(weapProgress.bShowCounter){ + textToDraw = string(weapProgress.counter); + C.Font = class'ROHUD'.Static.LoadSmallFontStatic(5); + C.TextSize(textToDraw, textWidth, textHeight); + C.SetPos(x + TempWidth - TempBorder - textWidth, y + TempHeight - TempBorder - textHeight + 2); + C.DrawText(textToDraw); + } +} +function bool KeyEvent(EInputKey Key, EInputAction Action, float Delta){ + local bool bNeedsReload; + local string Alias, LeftPart, RigthPart; + local NiceWeapon niceWeap; + local NicePlayerController nicePlayer; + // Find controller and current weapon + nicePlayer = NicePlayerController(ViewportOwner.Actor); + if(nicePlayer == none) + return false; + if(nicePlayer.Pawn != none) + niceWeap = NiceWeapon(nicePlayer.Pawn.Weapon); + // If this is a button press - detect alias + if(Action == IST_Press){ + // Check for reload command + Alias = nicePlayer.ConsoleCommand("KEYBINDING" @ nicePlayer.ConsoleCommand("KEYNAME" @ Key)); + if(nicePlayer.bAdvReloadCheck) + bNeedsReload = InStr(Caps(Alias), "RELOADMENOW") > -1 || InStr(Caps(Alias), "RELOADWEAPON") > -1; + if(Divide(Alias, " ", LeftPart, RigthPart)) + Alias = LeftPart; + if(Key == IK_MouseWheelUp || Key == IK_MouseWheelDown){ + nicePlayer.UpdateSelectors(); + if(nicePlayer.hasZeroSelector && nicePlayer.bUsesMouseWheel && nicePlayer.bNiceWeaponManagement){ + nicePlayer.ScrollSelector(0, nicePlayer.bMouseWheelLoops, Key == IK_MouseWheelUp); + return true; + } + } + } + // Open trader on movement + if(Alias ~= "MoveForward" || Alias ~= "MoveBackward" || Alias ~= "TurnLeft" || Alias ~= "TurnRight" + || Alias ~= "StrafeLeft" || Alias ~= "StrafeRight" || Alias ~= "Axis"){ + + // Open trader if it's a pre-game + if(NicePackMutator.bIsPreGame && NicePackMutator.bInitialTrader && (NicePackMutator.bStillDuringInitTrader || !nicePlayer.bOpenedInitTrader) && nicePlayer.Pawn != none){ + nicePlayer.ShowBuyMenu("Initial trader", KFHumanPawn(nicePlayer.Pawn).MaxCarryWeight); + nicePlayer.bOpenedInitTrader = true; + return true; + } + //nicePlayer.ClientOpenMenu("NicePack.NiceGUIBuyMenu",,"Test stuff",string(15)); + } + // Reload if we've detected a reload alias in this button's command + if(niceWeap != none && !nicePlayer.bUseServerReload && + (bNeedsReload || Alias ~= "ReloadMeNow" || Alias ~= "ReloadWeapon")) + niceWeap.ClientReloadMeNow(); + return false; +} +defaultproperties +{ + bleedIcon=Texture'NicePackT.MeanZeds.bleedIcon' + poisonIcon=Texture'NicePackT.MeanZeds.poisonIcon' + greenBar=Texture'KFStoryGame_Tex.HUD.Batter_Fill' + redBar=Texture'KFStoryGame_Tex.HUD.BarFill_Red' + Shield=Texture'KillingFloorHUD.HUD.Hud_Shield' + Size=75.599998 + InventoryBoxWidth=0.100000 + InventoryBoxHeight=0.075000 + BorderSize=0.005000 + bVisible=True +} diff --git a/sources/GUI/NiceInvasionLoginMenu.uc b/sources/GUI/NiceInvasionLoginMenu.uc index 3ba335c..0f39160 100644 --- a/sources/GUI/NiceInvasionLoginMenu.uc +++ b/sources/GUI/NiceInvasionLoginMenu.uc @@ -1,54 +1,72 @@ -class NiceInvasionLoginMenu extends ScrnInvasionLoginMenu; -var bool bShowScrnMenu; -// copy-pasted from ScrnInvasionLoginMenu to change change remove news tab and add skills tab -function InitComponent(GUIController MyController, GUIComponent MyOwner){ - local int i; - local string s; - local eFontScale FS; - local SRMenuAddition M; - local int indexAfterScrn; - // Setup panel classes. - Panels[0].ClassName = string(Class'ScrnBalanceSrv.ScrnTab_MidGamePerks'); - Panels[1].ClassName = string(Class'NicePack.NicePanelSkills'); - Panels[2].ClassName = string(Class'SRTab_MidGameVoiceChat'); - Panels[3].ClassName = string(Class'SRTab_MidGameStats'); - Panels[0].Caption = Class'KFInvasionLoginMenu'.Default.Panels[1].Caption; - Panels[1].Caption = "Skills"; - Panels[2].Caption = Class'KFInvasionLoginMenu'.Default.Panels[2].Caption; - Panels[0].Hint = Class'KFInvasionLoginMenu'.Default.Panels[1].Hint; - Panels[1].Hint = "Customize your perk"; - Panels[2].Hint = Class'KFInvasionLoginMenu'.Default.Panels[2].Hint; - b_Spec.Caption=class'KFTab_MidGamePerks'.default.b_Spec.Caption; - b_MatchSetup.Caption=class'KFTab_MidGamePerks'.default.b_MatchSetup.Caption; - b_KickVote.Caption=class'KFTab_MidGamePerks'.default.b_KickVote.Caption; - b_MapVote.Caption=class'KFTab_MidGamePerks'.default.b_MapVote.Caption; - b_Quit.Caption=class'KFTab_MidGamePerks'.default.b_Quit.Caption; - b_Favs.Caption=class'KFTab_MidGamePerks'.default.b_Favs.Caption; - b_Favs.Hint=class'KFTab_MidGamePerks'.default.b_Favs.Hint; - b_Settings.Caption=class'KFTab_MidGamePerks'.default.b_Settings.Caption; - b_Browser.Caption=class'KFTab_MidGamePerks'.default.b_Browser.Caption; - // Other panels - Panels[4].ClassName = "ScrnBalanceSrv.ScrnTab_Achievements"; - Panels[4].Caption = "Achievements"; - Panels[4].Hint = "ScrN server-side achievements"; - if(default.bShowScrnMenu){ Panels[5].ClassName = "ScrnBalanceSrv.ScrnTab_UserSettings"; Panels[5].Caption = "ScrN Features"; Panels[5].Hint = "ScrN Balance features, settings and info"; indexAfterScrn = 6; - } - else indexAfterScrn = 5; - Panels[indexAfterScrn].ClassName = "NicePack.NiceGUISettings"; - Panels[indexAfterScrn].Caption = "Nice settings"; - Panels[indexAfterScrn].Hint = "Settings specific to NicePack mutator"; - Panels.Length = indexAfterScrn + 1; - Super(UT2K4PlayerLoginMenu).InitComponent(MyController, MyOwner); - // Mod menus - foreach MyController.ViewportOwner.Actor.DynamicActors(class'SRMenuAddition',M) if( M.bHasInit ) { AddOnList[AddOnList.Length] = M; M.NotifyMenuOpen(Self,MyController); } - s = GetSizingCaption(); - for ( i = 0; i < Controls.Length; i++ ) - { if (GUIButton(Controls[i]) != none) { GUIButton(Controls[i]).bAutoSize = true; GUIButton(Controls[i]).SizingCaption = s; GUIButton(Controls[i]).AutoSizePadding.HorzPerc = 0.04; GUIButton(Controls[i]).AutoSizePadding.VertPerc = 0.5; } - } - s = class'KFTab_MidGamePerks'.default.PlayerStyleName; - PlayerStyle = MyController.GetStyle(s, fs); - InitGRI(); -} -defaultproperties -{ -} +class NiceInvasionLoginMenu extends ScrnInvasionLoginMenu; +var bool bShowScrnMenu; +// copy-pasted from ScrnInvasionLoginMenu to change change remove news tab and add skills tab +function InitComponent(GUIController MyController, GUIComponent MyOwner){ + local int i; + local string s; + local eFontScale FS; + local SRMenuAddition M; + local int indexAfterScrn; + // Setup panel classes. + Panels[0].ClassName = string(Class'ScrnBalanceSrv.ScrnTab_MidGamePerks'); + Panels[1].ClassName = string(Class'NicePack.NicePanelSkills'); + Panels[2].ClassName = string(Class'SRTab_MidGameVoiceChat'); + Panels[3].ClassName = string(Class'SRTab_MidGameStats'); + Panels[0].Caption = Class'KFInvasionLoginMenu'.Default.Panels[1].Caption; + Panels[1].Caption = "Skills"; + Panels[2].Caption = Class'KFInvasionLoginMenu'.Default.Panels[2].Caption; + Panels[0].Hint = Class'KFInvasionLoginMenu'.Default.Panels[1].Hint; + Panels[1].Hint = "Customize your perk"; + Panels[2].Hint = Class'KFInvasionLoginMenu'.Default.Panels[2].Hint; + b_Spec.Caption=class'KFTab_MidGamePerks'.default.b_Spec.Caption; + b_MatchSetup.Caption=class'KFTab_MidGamePerks'.default.b_MatchSetup.Caption; + b_KickVote.Caption=class'KFTab_MidGamePerks'.default.b_KickVote.Caption; + b_MapVote.Caption=class'KFTab_MidGamePerks'.default.b_MapVote.Caption; + b_Quit.Caption=class'KFTab_MidGamePerks'.default.b_Quit.Caption; + b_Favs.Caption=class'KFTab_MidGamePerks'.default.b_Favs.Caption; + b_Favs.Hint=class'KFTab_MidGamePerks'.default.b_Favs.Hint; + b_Settings.Caption=class'KFTab_MidGamePerks'.default.b_Settings.Caption; + b_Browser.Caption=class'KFTab_MidGamePerks'.default.b_Browser.Caption; + // Other panels + Panels[4].ClassName = "ScrnBalanceSrv.ScrnTab_Achievements"; + Panels[4].Caption = "Achievements"; + Panels[4].Hint = "ScrN server-side achievements"; + if(default.bShowScrnMenu){ + Panels[5].ClassName = "ScrnBalanceSrv.ScrnTab_UserSettings"; + Panels[5].Caption = "ScrN Features"; + Panels[5].Hint = "ScrN Balance features, settings and info"; + indexAfterScrn = 6; + } + else + indexAfterScrn = 5; + Panels[indexAfterScrn].ClassName = "NicePack.NiceGUISettings"; + Panels[indexAfterScrn].Caption = "Nice settings"; + Panels[indexAfterScrn].Hint = "Settings specific to NicePack mutator"; + Panels.Length = indexAfterScrn + 1; + Super(UT2K4PlayerLoginMenu).InitComponent(MyController, MyOwner); + // Mod menus + foreach MyController.ViewportOwner.Actor.DynamicActors(class'SRMenuAddition',M) + if( M.bHasInit ) + { + AddOnList[AddOnList.Length] = M; + M.NotifyMenuOpen(Self,MyController); + } + + s = GetSizingCaption(); + for ( i = 0; i < Controls.Length; i++ ) + { + if (GUIButton(Controls[i]) != none) + { + GUIButton(Controls[i]).bAutoSize = true; + GUIButton(Controls[i]).SizingCaption = s; + GUIButton(Controls[i]).AutoSizePadding.HorzPerc = 0.04; + GUIButton(Controls[i]).AutoSizePadding.VertPerc = 0.5; + } + } + s = class'KFTab_MidGamePerks'.default.PlayerStyleName; + PlayerStyle = MyController.GetStyle(s, fs); + InitGRI(); +} +defaultproperties +{ +} diff --git a/sources/GUI/NiceLobbyFooter.uc b/sources/GUI/NiceLobbyFooter.uc index 0509462..623dd6f 100644 --- a/sources/GUI/NiceLobbyFooter.uc +++ b/sources/GUI/NiceLobbyFooter.uc @@ -1,14 +1,23 @@ -class NiceLobbyFooter extends ScrnLobbyFooter; -function bool OnFooterClick(GUIComponent Sender) -{ - if (Sender == b_Perks){ PlayerOwner().ClientOpenMenu(string(Class'NicePack.NiceInvasionLoginMenu'), false); return false; - } - else if(Sender == b_ViewMap){ if(KF_StoryGRI(PlayerOwner().Level.GRI) == none){ LobbyMenu(PageOwner).bAllowClose = true; PlayerOwner().ClientCloseMenu(true, false); LobbyMenu(PageOwner).bAllowClose = false; } - } - else if(Sender == b_Ready){ return super(LobbyFooter).OnFooterClick(Sender); // bypass serverperks - } - else return super.OnFooterClick(Sender); -} -defaultproperties -{ -} +class NiceLobbyFooter extends ScrnLobbyFooter; +function bool OnFooterClick(GUIComponent Sender) +{ + if (Sender == b_Perks){ + PlayerOwner().ClientOpenMenu(string(Class'NicePack.NiceInvasionLoginMenu'), false); + return false; + } + else if(Sender == b_ViewMap){ + if(KF_StoryGRI(PlayerOwner().Level.GRI) == none){ + LobbyMenu(PageOwner).bAllowClose = true; + PlayerOwner().ClientCloseMenu(true, false); + LobbyMenu(PageOwner).bAllowClose = false; + } + } + else if(Sender == b_Ready){ + return super(LobbyFooter).OnFooterClick(Sender); // bypass serverperks + } + else + return super.OnFooterClick(Sender); +} +defaultproperties +{ +} diff --git a/sources/GUI/NiceLobbyMenu.uc b/sources/GUI/NiceLobbyMenu.uc index 3d48707..dc17915 100644 --- a/sources/GUI/NiceLobbyMenu.uc +++ b/sources/GUI/NiceLobbyMenu.uc @@ -1,4 +1,12 @@ -class NiceLobbyMenu extends ScrnLobbyMenu; -defaultproperties -{ Begin Object Class=NiceLobbyFooter Name=BuyFooter RenderWeight=0.300000 TabOrder=8 bBoundToParent=False bScaleToParent=False OnPreDraw=BuyFooter.InternalOnPreDraw End Object t_Footer=NiceLobbyFooter'NicePack.NiceLobbyMenu.BuyFooter' -} +class NiceLobbyMenu extends ScrnLobbyMenu; +defaultproperties +{ + Begin Object Class=NiceLobbyFooter Name=BuyFooter + RenderWeight=0.300000 + TabOrder=8 + bBoundToParent=False + bScaleToParent=False + OnPreDraw=BuyFooter.InternalOnPreDraw + End Object + t_Footer=NiceLobbyFooter'NicePack.NiceLobbyMenu.BuyFooter' +} diff --git a/sources/GUI/NicePanelSkills.uc b/sources/GUI/NicePanelSkills.uc index 2a31ce7..db8a65e 100644 --- a/sources/GUI/NicePanelSkills.uc +++ b/sources/GUI/NicePanelSkills.uc @@ -1,26 +1,172 @@ -class NicePanelSkills extends Settings_Tabs; -var automated NiceGUIPerkButton skillButtonA[5], skillButtonB[5]; -function ShowPanel(bool bShow){ - local int i; - local class niceVet; - local NicePlayerController nicePlayer; - Super.ShowPanel(bShow); - nicePlayer = NicePlayerController(PlayerOwner()); - if(nicePlayer != none) niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePlayer.PlayerReplicationInfo); - if(niceVet != none){ for(i = 0;i < 5;i ++){ skillButtonA[i].skillIndex = i; skillButtonB[i].skillIndex = i; skillButtonA[i].skillPerkIndex = niceVet.default.PerkIndex; skillButtonB[i].skillPerkIndex = niceVet.default.PerkIndex; skillButtonA[i].isAltSkill = false; skillButtonB[i].isAltSkill = true; skillButtonA[i].associatedSkill = niceVet.default.SkillGroupA[i]; skillButtonB[i].associatedSkill = niceVet.default.SkillGroupB[i]; } - } -} -// size = (x=0.0125, y=0.0) ; (w=1.0, h=0.865) -// setup caption -defaultproperties -{ Begin Object Class=NiceGUIPerkButton Name=btn1A WinTop=0.012500 WinWidth=0.495000 WinHeight=0.160000 RenderWeight=2.000000 TabOrder=1 bBoundToParent=True bScaleToParent=True bMouseOverSound=False OnClickSound=CS_None OnKeyEvent=btn1A.InternalOnKeyEvent End Object skillButtonA(0)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn1A' - Begin Object Class=NiceGUIPerkButton Name=btn2A WinTop=0.188500 WinWidth=0.495000 WinHeight=0.160000 RenderWeight=2.000000 TabOrder=3 bBoundToParent=True bScaleToParent=True bMouseOverSound=False OnClickSound=CS_None OnKeyEvent=btn2A.InternalOnKeyEvent End Object skillButtonA(1)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn2A' - Begin Object Class=NiceGUIPerkButton Name=btn3A WinTop=0.364500 WinWidth=0.495000 WinHeight=0.160000 RenderWeight=2.000000 TabOrder=5 bBoundToParent=True bScaleToParent=True bMouseOverSound=False OnClickSound=CS_None OnKeyEvent=btn3A.InternalOnKeyEvent End Object skillButtonA(2)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn3A' - Begin Object Class=NiceGUIPerkButton Name=btn4A WinTop=0.540500 WinWidth=0.495000 WinHeight=0.160000 RenderWeight=2.000000 TabOrder=7 bBoundToParent=True bScaleToParent=True bMouseOverSound=False OnClickSound=CS_None OnKeyEvent=btn4A.InternalOnKeyEvent End Object skillButtonA(3)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn4A' - Begin Object Class=NiceGUIPerkButton Name=btn5A WinTop=0.716500 WinWidth=0.495000 WinHeight=0.160000 RenderWeight=2.000000 TabOrder=9 bBoundToParent=True bScaleToParent=True bMouseOverSound=False OnClickSound=CS_None OnKeyEvent=btn5A.InternalOnKeyEvent End Object skillButtonA(4)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn5A' - Begin Object Class=NiceGUIPerkButton Name=btn1B WinTop=0.012500 WinLeft=0.505000 WinWidth=0.495000 WinHeight=0.160000 RenderWeight=2.000000 TabOrder=2 bBoundToParent=True bScaleToParent=True bMouseOverSound=False OnClickSound=CS_None OnKeyEvent=btn1B.InternalOnKeyEvent End Object skillButtonB(0)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn1B' - Begin Object Class=NiceGUIPerkButton Name=btn2B WinTop=0.188500 WinLeft=0.505000 WinWidth=0.495000 WinHeight=0.160000 RenderWeight=2.000000 TabOrder=4 bBoundToParent=True bScaleToParent=True bMouseOverSound=False OnClickSound=CS_None OnKeyEvent=btn2B.InternalOnKeyEvent End Object skillButtonB(1)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn2B' - Begin Object Class=NiceGUIPerkButton Name=btn3B WinTop=0.364500 WinLeft=0.505000 WinWidth=0.495000 WinHeight=0.160000 RenderWeight=2.000000 TabOrder=6 bBoundToParent=True bScaleToParent=True bMouseOverSound=False OnClickSound=CS_None OnKeyEvent=btn3B.InternalOnKeyEvent End Object skillButtonB(2)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn3B' - Begin Object Class=NiceGUIPerkButton Name=btn4B WinTop=0.540500 WinLeft=0.505000 WinWidth=0.495000 WinHeight=0.160000 RenderWeight=2.000000 TabOrder=8 bBoundToParent=True bScaleToParent=True bMouseOverSound=False OnClickSound=CS_None OnKeyEvent=btn4B.InternalOnKeyEvent End Object skillButtonB(3)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn4B' - Begin Object Class=NiceGUIPerkButton Name=btn5B WinTop=0.716500 WinLeft=0.505000 WinWidth=0.495000 WinHeight=0.160000 RenderWeight=2.000000 TabOrder=10 bBoundToParent=True bScaleToParent=True bMouseOverSound=False OnClickSound=CS_None OnKeyEvent=btn5B.InternalOnKeyEvent End Object skillButtonB(4)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn5B' -} +class NicePanelSkills extends Settings_Tabs; +var automated NiceGUIPerkButton skillButtonA[5], skillButtonB[5]; +function ShowPanel(bool bShow){ + local int i; + local class niceVet; + local NicePlayerController nicePlayer; + Super.ShowPanel(bShow); + nicePlayer = NicePlayerController(PlayerOwner()); + if(nicePlayer != none) + niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(nicePlayer.PlayerReplicationInfo); + if(niceVet != none){ + for(i = 0;i < 5;i ++){ + skillButtonA[i].skillIndex = i; + skillButtonB[i].skillIndex = i; + skillButtonA[i].skillPerkIndex = niceVet.default.PerkIndex; + skillButtonB[i].skillPerkIndex = niceVet.default.PerkIndex; + skillButtonA[i].isAltSkill = false; + skillButtonB[i].isAltSkill = true; + skillButtonA[i].associatedSkill = niceVet.default.SkillGroupA[i]; + skillButtonB[i].associatedSkill = niceVet.default.SkillGroupB[i]; + } + } +} +// size = (x=0.0125, y=0.0) ; (w=1.0, h=0.865) +// setup caption +defaultproperties +{ + Begin Object Class=NiceGUIPerkButton Name=btn1A + WinTop=0.012500 + WinWidth=0.495000 + WinHeight=0.160000 + RenderWeight=2.000000 + TabOrder=1 + bBoundToParent=True + bScaleToParent=True + bMouseOverSound=False + OnClickSound=CS_None + OnKeyEvent=btn1A.InternalOnKeyEvent + End Object + skillButtonA(0)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn1A' + + Begin Object Class=NiceGUIPerkButton Name=btn2A + WinTop=0.188500 + WinWidth=0.495000 + WinHeight=0.160000 + RenderWeight=2.000000 + TabOrder=3 + bBoundToParent=True + bScaleToParent=True + bMouseOverSound=False + OnClickSound=CS_None + OnKeyEvent=btn2A.InternalOnKeyEvent + End Object + skillButtonA(1)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn2A' + + Begin Object Class=NiceGUIPerkButton Name=btn3A + WinTop=0.364500 + WinWidth=0.495000 + WinHeight=0.160000 + RenderWeight=2.000000 + TabOrder=5 + bBoundToParent=True + bScaleToParent=True + bMouseOverSound=False + OnClickSound=CS_None + OnKeyEvent=btn3A.InternalOnKeyEvent + End Object + skillButtonA(2)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn3A' + + Begin Object Class=NiceGUIPerkButton Name=btn4A + WinTop=0.540500 + WinWidth=0.495000 + WinHeight=0.160000 + RenderWeight=2.000000 + TabOrder=7 + bBoundToParent=True + bScaleToParent=True + bMouseOverSound=False + OnClickSound=CS_None + OnKeyEvent=btn4A.InternalOnKeyEvent + End Object + skillButtonA(3)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn4A' + + Begin Object Class=NiceGUIPerkButton Name=btn5A + WinTop=0.716500 + WinWidth=0.495000 + WinHeight=0.160000 + RenderWeight=2.000000 + TabOrder=9 + bBoundToParent=True + bScaleToParent=True + bMouseOverSound=False + OnClickSound=CS_None + OnKeyEvent=btn5A.InternalOnKeyEvent + End Object + skillButtonA(4)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn5A' + + Begin Object Class=NiceGUIPerkButton Name=btn1B + WinTop=0.012500 + WinLeft=0.505000 + WinWidth=0.495000 + WinHeight=0.160000 + RenderWeight=2.000000 + TabOrder=2 + bBoundToParent=True + bScaleToParent=True + bMouseOverSound=False + OnClickSound=CS_None + OnKeyEvent=btn1B.InternalOnKeyEvent + End Object + skillButtonB(0)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn1B' + + Begin Object Class=NiceGUIPerkButton Name=btn2B + WinTop=0.188500 + WinLeft=0.505000 + WinWidth=0.495000 + WinHeight=0.160000 + RenderWeight=2.000000 + TabOrder=4 + bBoundToParent=True + bScaleToParent=True + bMouseOverSound=False + OnClickSound=CS_None + OnKeyEvent=btn2B.InternalOnKeyEvent + End Object + skillButtonB(1)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn2B' + + Begin Object Class=NiceGUIPerkButton Name=btn3B + WinTop=0.364500 + WinLeft=0.505000 + WinWidth=0.495000 + WinHeight=0.160000 + RenderWeight=2.000000 + TabOrder=6 + bBoundToParent=True + bScaleToParent=True + bMouseOverSound=False + OnClickSound=CS_None + OnKeyEvent=btn3B.InternalOnKeyEvent + End Object + skillButtonB(2)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn3B' + + Begin Object Class=NiceGUIPerkButton Name=btn4B + WinTop=0.540500 + WinLeft=0.505000 + WinWidth=0.495000 + WinHeight=0.160000 + RenderWeight=2.000000 + TabOrder=8 + bBoundToParent=True + bScaleToParent=True + bMouseOverSound=False + OnClickSound=CS_None + OnKeyEvent=btn4B.InternalOnKeyEvent + End Object + skillButtonB(3)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn4B' + + Begin Object Class=NiceGUIPerkButton Name=btn5B + WinTop=0.716500 + WinLeft=0.505000 + WinWidth=0.495000 + WinHeight=0.160000 + RenderWeight=2.000000 + TabOrder=10 + bBoundToParent=True + bScaleToParent=True + bMouseOverSound=False + OnClickSound=CS_None + OnKeyEvent=btn5B.InternalOnKeyEvent + End Object + skillButtonB(4)=NiceGUIPerkButton'NicePack.NicePanelSkills.btn5B' +} diff --git a/sources/NiceGameType.uc b/sources/NiceGameType.uc index 851bc25..86d14d3 100644 --- a/sources/NiceGameType.uc +++ b/sources/NiceGameType.uc @@ -1,74 +1,151 @@ -// made to fix KFStoryGameInfo loading for KFO maps -class NiceGameType extends ScrnGameType; -var NicePack NicePackMutator; -function RegisterMutator(NicePack activePack){ - NicePackMutator = activePack; -} -function OverrideMonsterHealth(KFMonster M){} -/*event InitGame(string Options, out string Error){ - local int i, j; - if(ScrnGameLength == none) ScrnGameLength = new(none, string(KFGameLength)) class'ScrnGameLength'; - for(i = 0;i < ScrnGameLength. -}*/ -function int SpawnSquad(ZombieVolume ZVol, out array< class > Squad, optional bool bLogSpawned ){ - local int i, j; - local array zedDatabase; - if(NicePackMutator != none){ zedDatabase = NicePackMutator.zedDatabase; for(i = 0;i < zedDatabase.Length;i ++){ for(j = 0;j < Squad.Length;j ++){ if(zedDatabase[i].bNeedsReplacement && zedDatabase[i].ZedType == Squad[j]) Squad[j] = zeddatabase[i].MeanZedType; } } - } - return super.SpawnSquad(ZVol, Squad, bLogSpawned); -} -function SetupWave(){ - Super.SetupWave(); - // Event call - NicePackMutator.WaveStart(); -} -function RestartPlayer(Controller aPlayer){ - Super.RestartPlayer(aPlayer); - if(aPlayer.Pawn != none && NicePlayerController(aPlayer) != none) NicePlayerController(aPlayer).PawnSpawned(); -} -State MatchInProgress{ - function BeginState(){ Super(Invasion).BeginState(); - WaveNum = InitialWave; InvasionGameReplicationInfo(GameReplicationInfo).WaveNumber = WaveNum; - if(NicePackMutator.bInitialTrader) WaveCountDown = NicePackMutator.initialTraderTime + 5; else WaveCountDown = 10; - SetupPickups(); if(ScrnGameLength != none && !ScrnGameLength.LoadWave(WaveNum)) DoWaveEnd(); - // Event call NicePackMutator.MatchBegan(); - } - function DoWaveEnd(){ Super.DoWaveEnd(); // Event call NicePackMutator.TraderStart(); - } - function StartWaveBoss(){ Super.StartWaveBoss(); // Event call NicePackMutator.WaveStart(); - } -} -function DramaticEvent(float BaseZedTimePossibility, optional float DesiredZedTimeDuration){ - local bool bWasZedTime; - bWasZedTime = bZEDTimeActive; - Super.DramaticEvent(BaseZedTimePossibility, DesiredZedTimeDuration); - // Call event - if(!bWasZedTime && bZEDTimeActive) NicePackMutator.ZedTimeActivated(); -} -event Tick(float DeltaTime){ - local float TrueTimeFactor; - local Controller C; - if(bZEDTimeActive){ TrueTimeFactor = 1.1 / Level.TimeDilation; CurrentZEDTimeDuration -= DeltaTime * TrueTimeFactor; if(CurrentZEDTimeDuration < (ZEDTimeDuration*0.166) && CurrentZEDTimeDuration > 0 ){ if(!bSpeedingBackUp){ bSpeedingBackUp = true; - for(C = Level.ControllerList;C != none;C = C.NextController){ if(KFPlayerController(C)!= none) KFPlayerController(C).ClientExitZedTime(); } } SetGameSpeed(Lerp( (CurrentZEDTimeDuration/(ZEDTimeDuration*0.166)), 1.0, 0.2 )); } if(CurrentZEDTimeDuration <= 0){ if(bZEDTimeActive) NicePackMutator.ZedTimeDeactivated(); bZEDTimeActive = false; bSpeedingBackUp = false; SetGameSpeed(1.0); ZedTimeExtensionsUsed = 0; } - } -} -function Killed(Controller Killer, Controller Killed, Pawn KilledPawn, class dmgType){ - local GameRules rules; - local ScrnGameRules scrnRules; - local KFSteamStatsAndAchievements StatsAndAchievements; - Super.Killed(Killer, Killed, KilledPawn, dmgType); - if(PlayerController(Killer) != none){ if(NiceMonster(KilledPawn) != none && Killed != Killer){ StatsAndAchievements = KFSteamStatsAndAchievements(PlayerController(Killer).SteamStatsAndAchievements); if(StatsAndAchievements != none){ if(KilledPawn.IsA('NiceZombieStalker') || KilledPawn.IsA('MeanZombieStalker')){ if(class(dmgType) != none) StatsAndAchievements.AddStalkerKillWithLAR(); } else if(KilledPawn.IsA('NiceZombieClot') || KilledPawn.IsA('MeanZombieClot')){ if(class(dmgType) != none) KFSteamStatsAndAchievements(PlayerController(Killer).SteamStatsAndAchievements).AddClotKillWithLAR(); } if(class(dmgType) != none){ for(rules = Level.Game.GameRulesModifiers;rules != none;rules = rules.NextGameRules) if(ScrnGameRules(rules) != none){ scrnRules = ScrnGameRules(rules); break; } if(scrnRules != none) class(dmgType).Static.AwardNiceKill(StatsAndAchievements, KFPlayerController(Killer), KFMonster(KilledPawn), scrnRules.HardcoreLevel); } } } - } -} -// Reloaded to award damage -function int ReduceDamage(int Damage, pawn injured, pawn instigatedBy, vector HitLocation, out vector Momentum, class DamageType){ - local NiceMonster niceZed; - local KFPlayerController PC; - niceZed = NiceMonster(Injured); - if(niceZed != none){ if(instigatedBy != none){ PC = KFPlayerController(instigatedBy.Controller); if(class(damageType) != none && PC != none) class(damageType).Static.AwardNiceDamage(KFSteamStatsAndAchievements(PC.SteamStatsAndAchievements), Clamp(Damage, 1, Injured.Health), niceZed.scrnRules.HardcoreLevel); } - } - return Super.ReduceDamage(Damage, injured, InstigatedBy, HitLocation, Momentum, DamageType); -} -defaultproperties -{ GameName="Nice Floor" Description="Nice Edition of ScrN Killing Floor game mode (ScrnGameType)." -} +// made to fix KFStoryGameInfo loading for KFO maps +class NiceGameType extends ScrnGameType; +var NicePack NicePackMutator; +function RegisterMutator(NicePack activePack){ + NicePackMutator = activePack; +} +function OverrideMonsterHealth(KFMonster M){} +/*event InitGame(string Options, out string Error){ + local int i, j; + if(ScrnGameLength == none) + ScrnGameLength = new(none, string(KFGameLength)) class'ScrnGameLength'; + for(i = 0;i < ScrnGameLength. +}*/ +function int SpawnSquad(ZombieVolume ZVol, out array< class > Squad, optional bool bLogSpawned ){ + local int i, j; + local array zedDatabase; + if(NicePackMutator != none){ + zedDatabase = NicePackMutator.zedDatabase; + for(i = 0;i < zedDatabase.Length;i ++){ + for(j = 0;j < Squad.Length;j ++){ + if(zedDatabase[i].bNeedsReplacement && zedDatabase[i].ZedType == Squad[j]) + Squad[j] = zeddatabase[i].MeanZedType; + } + } + } + return super.SpawnSquad(ZVol, Squad, bLogSpawned); +} +function SetupWave(){ + Super.SetupWave(); + // Event call + NicePackMutator.WaveStart(); +} +function RestartPlayer(Controller aPlayer){ + Super.RestartPlayer(aPlayer); + if(aPlayer.Pawn != none && NicePlayerController(aPlayer) != none) + NicePlayerController(aPlayer).PawnSpawned(); +} +State MatchInProgress{ + function BeginState(){ + Super(Invasion).BeginState(); + + WaveNum = InitialWave; + InvasionGameReplicationInfo(GameReplicationInfo).WaveNumber = WaveNum; + + if(NicePackMutator.bInitialTrader) + WaveCountDown = NicePackMutator.initialTraderTime + 5; + else + WaveCountDown = 10; + + SetupPickups(); + if(ScrnGameLength != none && !ScrnGameLength.LoadWave(WaveNum)) + DoWaveEnd(); + + // Event call + NicePackMutator.MatchBegan(); + } + function DoWaveEnd(){ + Super.DoWaveEnd(); + // Event call + NicePackMutator.TraderStart(); + } + function StartWaveBoss(){ + Super.StartWaveBoss(); + // Event call + NicePackMutator.WaveStart(); + } +} +function DramaticEvent(float BaseZedTimePossibility, optional float DesiredZedTimeDuration){ + local bool bWasZedTime; + bWasZedTime = bZEDTimeActive; + Super.DramaticEvent(BaseZedTimePossibility, DesiredZedTimeDuration); + // Call event + if(!bWasZedTime && bZEDTimeActive) + NicePackMutator.ZedTimeActivated(); +} +event Tick(float DeltaTime){ + local float TrueTimeFactor; + local Controller C; + if(bZEDTimeActive){ + TrueTimeFactor = 1.1 / Level.TimeDilation; + CurrentZEDTimeDuration -= DeltaTime * TrueTimeFactor; + if(CurrentZEDTimeDuration < (ZEDTimeDuration*0.166) && CurrentZEDTimeDuration > 0 ){ + if(!bSpeedingBackUp){ + bSpeedingBackUp = true; + + for(C = Level.ControllerList;C != none;C = C.NextController){ + if(KFPlayerController(C)!= none) + KFPlayerController(C).ClientExitZedTime(); + } + } + SetGameSpeed(Lerp( (CurrentZEDTimeDuration/(ZEDTimeDuration*0.166)), 1.0, 0.2 )); + } + if(CurrentZEDTimeDuration <= 0){ + if(bZEDTimeActive) + NicePackMutator.ZedTimeDeactivated(); + bZEDTimeActive = false; + bSpeedingBackUp = false; + SetGameSpeed(1.0); + ZedTimeExtensionsUsed = 0; + } + } +} +function Killed(Controller Killer, Controller Killed, Pawn KilledPawn, class dmgType){ + local GameRules rules; + local ScrnGameRules scrnRules; + local KFSteamStatsAndAchievements StatsAndAchievements; + Super.Killed(Killer, Killed, KilledPawn, dmgType); + if(PlayerController(Killer) != none){ + if(NiceMonster(KilledPawn) != none && Killed != Killer){ + StatsAndAchievements = KFSteamStatsAndAchievements(PlayerController(Killer).SteamStatsAndAchievements); + if(StatsAndAchievements != none){ + if(KilledPawn.IsA('NiceZombieStalker') || KilledPawn.IsA('MeanZombieStalker')){ + if(class(dmgType) != none) + StatsAndAchievements.AddStalkerKillWithLAR(); + } + else if(KilledPawn.IsA('NiceZombieClot') || KilledPawn.IsA('MeanZombieClot')){ + if(class(dmgType) != none) + KFSteamStatsAndAchievements(PlayerController(Killer).SteamStatsAndAchievements).AddClotKillWithLAR(); + } + if(class(dmgType) != none){ + for(rules = Level.Game.GameRulesModifiers;rules != none;rules = rules.NextGameRules) + if(ScrnGameRules(rules) != none){ + scrnRules = ScrnGameRules(rules); + break; + } + if(scrnRules != none) + class(dmgType).Static.AwardNiceKill(StatsAndAchievements, KFPlayerController(Killer), KFMonster(KilledPawn), scrnRules.HardcoreLevel); + } + } + } + } +} +// Reloaded to award damage +function int ReduceDamage(int Damage, pawn injured, pawn instigatedBy, vector HitLocation, out vector Momentum, class DamageType){ + local NiceMonster niceZed; + local KFPlayerController PC; + niceZed = NiceMonster(Injured); + if(niceZed != none){ + if(instigatedBy != none){ + PC = KFPlayerController(instigatedBy.Controller); + if(class(damageType) != none && PC != none) + class(damageType).Static.AwardNiceDamage(KFSteamStatsAndAchievements(PC.SteamStatsAndAchievements), Clamp(Damage, 1, Injured.Health), niceZed.scrnRules.HardcoreLevel); + } + } + return Super.ReduceDamage(Damage, injured, InstigatedBy, HitLocation, Momentum, DamageType); +} +defaultproperties +{ + GameName="Nice Floor" + Description="Nice Edition of ScrN Killing Floor game mode (ScrnGameType)." +} diff --git a/sources/NiceRules.uc b/sources/NiceRules.uc index 22e0028..1507275 100644 --- a/sources/NiceRules.uc +++ b/sources/NiceRules.uc @@ -1,79 +1,163 @@ -class NiceRules extends GameRules; -var ScrnGameRules ScrnRules; -function PostBeginPlay(){ - if(Level.Game.GameRulesModifiers == none) Level.Game.GameRulesModifiers = Self; - else{ // We need to be the ones giving achievements first Self.AddGameRules(Level.Game.GameRulesModifiers); Level.Game.GameRulesModifiers = Self; - } - if(NicePack(Owner) != none) ScrnRules = NicePack(Owner).ScrnMut.GameRules; - else{ Log("Wrong owner! Owner must be NicePack!"); Destroy(); - } -} -function bool CheckEndGame(PlayerReplicationInfo Winner, string Reason){ - local bool bWin; - local string MapName; - if(Level.Game.IsInState('PendingMatch')) return false; - if(Level.Game.bGameEnded) return true; - if(NextGameRules != none && !NextGameRules.CheckEndGame(Winner,Reason)) return false; - if(ScrnRules.Mut.bStoryMode) bWin = Reason ~= "WinAction"; - else{ bWin = KFGameReplicationInfo(Level.GRI) != none && KFGameReplicationInfo(Level.GRI).EndGameType == 2; - } - if(bWin){ // Map achievements MapName = ScrnRules.Mut.KF.GetCurrentMapName(Level); ScrnRules.CheckMapAlias(MapName); GiveMapAchievements(MapName); - } - return true; -} -// We would never get ScrN Sui and Hoe achievs with our new zeds, so let's add them ourselves. For different reasons. -function GiveMapAchievements(optional String MapName){ - local bool bCustomMap, bGiveHardAch, bGiveSuiAch, bGiveHoeAch, bNewAch; - local ScrnPlayerInfo SPI; - local ClientPerkRepLink PerkLink; - local TeamInfo WinnerTeam; - WinnerTeam = TeamInfo(Level.Game.GameReplicationInfo.Winner); - if(ScrnRules.Mut.bStoryMode){ bGiveHardAch = Level.Game.GameDifficulty >= 4; bGiveSuiAch = Level.Game.GameDifficulty >= 5; bGiveHoeAch = Level.Game.GameDifficulty >= 7; - } - else{ bGiveHardAch = ScrnRules.HardcoreLevel >= 5; bGiveSuiAch = ScrnRules.HardcoreLevel >= 10; bGiveHoeAch = ScrnRules.HardcoreLevel >= 15; - } - for (SPI = ScrnRules.PlayerInfo;SPI != none;SPI = SPI.NextPlayerInfo){ if (SPI.PlayerOwner == none || SPI.PlayerOwner.PlayerReplicationInfo == none) continue; PerkLink = SPI.GetRep(); if(PerkLink == none) continue; if(WinnerTeam != none && SPI.PlayerOwner.PlayerReplicationInfo.Team != WinnerTeam) continue; // no candies for loosers // additional achievements that are granted only when surviving the game if(ScrnPlayerController(SPI.PlayerOwner) != none && !ScrnPlayerController(SPI.PlayerOwner).bChangedPerkDuringGame) SPI.ProgressAchievement('PerkFavorite', 1); - //unlock "Normal" achievement and see if the map is found bCustomMap = ScrnRules.MapAchClass.static.UnlockMapAchievement(PerkLink, MapName, 0) == -2; bNewAch = false; if(bCustomMap){ //map not found - progress custom map achievements if(bGiveHardAch) ScrnRules.AchClass.static.ProgressAchievementByID(PerkLink, 'WinCustomMapsHard', 1); if(bGiveSuiAch) ScrnRules.AchClass.static.ProgressAchievementByID(PerkLink, 'WinCustomMapsSui', 1); if(bGiveHoeAch) ScrnRules.AchClass.static.ProgressAchievementByID(PerkLink, 'WinCustomMapsHoE', 1); ScrnRules.AchClass.static.ProgressAchievementByID(PerkLink, 'WinCustomMapsNormal', 1); ScrnRules.AchClass.static.ProgressAchievementByID(PerkLink, 'WinCustomMaps', 1); } else{ //map found - give related achievements if(bGiveHardAch) ScrnRules.MapAchClass.static.UnlockMapAchievement(PerkLink, MapName, 1); if(bGiveSuiAch) ScrnRules.MapAchClass.static.UnlockMapAchievement(PerkLink, MapName, 2); if(bGiveHoeAch) ScrnRules.MapAchClass.static.UnlockMapAchievement(PerkLink, MapName, 3); } - } -} -function int NetDamage(int OriginalDamage, int Damage, pawn injured, pawn instigatedBy, vector HitLocation, out vector Momentum, class DamageType){ - local TeamGame TG; - TG = TeamGame(Level.Game); - if(KFPawn(injured) != none && TG != none && Damage > 0 && class(DamageType) == none){ if((KFPawn(instigatedBy) != none || FakePlayerPawn(instigatedBy) != none) && (instigatedBy.PlayerReplicationInfo == none || instigatedBy.PlayerReplicationInfo.bOnlySpectator)){ Momentum = vect(0,0,0); if(NoFF(injured, TG.FriendlyFireScale)) return 0; else if(OriginalDamage == Damage) return Damage * TG.FriendlyFireScale; } else if(instigatedBy == none && !DamageType.default.bCausedByWorld){ Momentum = vect(0,0,0); if(NoFF(injured, TG.FriendlyFireScale)) return 0; else if(OriginalDamage == Damage) return Damage * TG.FriendlyFireScale; } - } - return super.NetDamage(OriginalDamage, Damage, injured, instigatedBy, HitLocation, Momentum, DamageType); -} -function bool NoFF(Pawn injured, float FF){ - return (FF == 0.0 || (Vehicle(injured) != none && Vehicle(injured).bNoFriendlyFire)); -} -function RaiseHardcoreLevel(float inc, string reason){ - local string s; - local Controller P; - local NicePlayerController nicePlayer; - - if(ScrnRules.HardcoreLevelFloat < ScrnRules.HardcoreLevel) ScrnRules.HardcoreLevelFloat = ScrnRules.HardcoreLevel; - ScrnRules.HardcoreLevelFloat += inc; - ScrnRules.HardcoreLevel = int(ScrnRules.HardcoreLevelFloat + 0.01); - ScrnRules.Mut.HardcoreLevel = clamp(ScrnRules.HardcoreLevel, 0, 255); - ScrnRules.Mut.NetUpdateTime = Level.TimeSeconds - 1; - - s = ScrnRules.msgHardcore; - ReplaceText(s, "%a", String(ScrnRules.HardcoreLevel)); - ReplaceText(s, "%i", String(inc)); - ReplaceText(s, "%r", reason); - for(P = Level.ControllerList; P != none; P = P.nextController){ nicePlayer = NicePlayerController(P); if(nicePlayer != none && nicePlayer.bFlagShowHLMessages) nicePlayer.ClientMessage(s); - } -} -function bool PreventDeath(Pawn Killed, Controller Killer, class damageType, vector HitLocation){ - local NiceHumanPawn nicePawn; - local NicePlayerController nicePlayer; - nicePlayer = NicePlayerController(Killed.controller); - nicePawn = NiceHumanPawn(Killed); - if(nicePawn != none && (!nicePawn.bReactiveArmorUsed) && class'NiceVeterancyTypes'.static.HasSkill(nicePlayer, class'NiceSkillDemoReactiveArmor')){ nicePawn.bReactiveArmorUsed = true; nicePlayer.niceRI.ServerExplode(class'NiceSkillDemoReactiveArmor'.default.baseDamage, class'NiceSkillDemoReactiveArmor'.default.explRadius, class'NiceSkillDemoReactiveArmor'.default.explExponent, class'NiceDamTypeDemoSafeExplosion', class'NiceSkillDemoReactiveArmor'.default.explMomentum, killed.location, killed, true ); return true; - } - if(NextGameRules != none) return NextGameRules.PreventDeath(Killed, Killer, damageType, HitLocation); - return false; -} -defaultproperties -{ -} +class NiceRules extends GameRules; +var ScrnGameRules ScrnRules; +function PostBeginPlay(){ + if(Level.Game.GameRulesModifiers == none) + Level.Game.GameRulesModifiers = Self; + else{ + // We need to be the ones giving achievements first + Self.AddGameRules(Level.Game.GameRulesModifiers); + Level.Game.GameRulesModifiers = Self; + } + if(NicePack(Owner) != none) + ScrnRules = NicePack(Owner).ScrnMut.GameRules; + else{ + Log("Wrong owner! Owner must be NicePack!"); + Destroy(); + } +} +function bool CheckEndGame(PlayerReplicationInfo Winner, string Reason){ + local bool bWin; + local string MapName; + if(Level.Game.IsInState('PendingMatch')) + return false; + if(Level.Game.bGameEnded) + return true; + if(NextGameRules != none && !NextGameRules.CheckEndGame(Winner,Reason)) + return false; + if(ScrnRules.Mut.bStoryMode) + bWin = Reason ~= "WinAction"; + else{ + bWin = KFGameReplicationInfo(Level.GRI) != none && KFGameReplicationInfo(Level.GRI).EndGameType == 2; + } + if(bWin){ + // Map achievements + MapName = ScrnRules.Mut.KF.GetCurrentMapName(Level); + ScrnRules.CheckMapAlias(MapName); + GiveMapAchievements(MapName); + } + return true; +} +// We would never get ScrN Sui and Hoe achievs with our new zeds, so let's add them ourselves. For different reasons. +function GiveMapAchievements(optional String MapName){ + local bool bCustomMap, bGiveHardAch, bGiveSuiAch, bGiveHoeAch, bNewAch; + local ScrnPlayerInfo SPI; + local ClientPerkRepLink PerkLink; + local TeamInfo WinnerTeam; + WinnerTeam = TeamInfo(Level.Game.GameReplicationInfo.Winner); + if(ScrnRules.Mut.bStoryMode){ + bGiveHardAch = Level.Game.GameDifficulty >= 4; + bGiveSuiAch = Level.Game.GameDifficulty >= 5; + bGiveHoeAch = Level.Game.GameDifficulty >= 7; + } + else{ + bGiveHardAch = ScrnRules.HardcoreLevel >= 5; + bGiveSuiAch = ScrnRules.HardcoreLevel >= 10; + bGiveHoeAch = ScrnRules.HardcoreLevel >= 15; + } + for (SPI = ScrnRules.PlayerInfo;SPI != none;SPI = SPI.NextPlayerInfo){ + if (SPI.PlayerOwner == none || SPI.PlayerOwner.PlayerReplicationInfo == none) + continue; + PerkLink = SPI.GetRep(); + if(PerkLink == none) + continue; + if(WinnerTeam != none && SPI.PlayerOwner.PlayerReplicationInfo.Team != WinnerTeam) + continue; // no candies for loosers + // additional achievements that are granted only when surviving the game + if(ScrnPlayerController(SPI.PlayerOwner) != none && !ScrnPlayerController(SPI.PlayerOwner).bChangedPerkDuringGame) + SPI.ProgressAchievement('PerkFavorite', 1); + + //unlock "Normal" achievement and see if the map is found + bCustomMap = ScrnRules.MapAchClass.static.UnlockMapAchievement(PerkLink, MapName, 0) == -2; + bNewAch = false; + if(bCustomMap){ + //map not found - progress custom map achievements + if(bGiveHardAch) + ScrnRules.AchClass.static.ProgressAchievementByID(PerkLink, 'WinCustomMapsHard', 1); + if(bGiveSuiAch) + ScrnRules.AchClass.static.ProgressAchievementByID(PerkLink, 'WinCustomMapsSui', 1); + if(bGiveHoeAch) + ScrnRules.AchClass.static.ProgressAchievementByID(PerkLink, 'WinCustomMapsHoE', 1); + ScrnRules.AchClass.static.ProgressAchievementByID(PerkLink, 'WinCustomMapsNormal', 1); + ScrnRules.AchClass.static.ProgressAchievementByID(PerkLink, 'WinCustomMaps', 1); + } + else{ + //map found - give related achievements + if(bGiveHardAch) + ScrnRules.MapAchClass.static.UnlockMapAchievement(PerkLink, MapName, 1); + if(bGiveSuiAch) + ScrnRules.MapAchClass.static.UnlockMapAchievement(PerkLink, MapName, 2); + if(bGiveHoeAch) + ScrnRules.MapAchClass.static.UnlockMapAchievement(PerkLink, MapName, 3); + } + } +} +function int NetDamage(int OriginalDamage, int Damage, pawn injured, pawn instigatedBy, vector HitLocation, out vector Momentum, class DamageType){ + local TeamGame TG; + TG = TeamGame(Level.Game); + if(KFPawn(injured) != none && TG != none && Damage > 0 && class(DamageType) == none){ + if((KFPawn(instigatedBy) != none || FakePlayerPawn(instigatedBy) != none) && (instigatedBy.PlayerReplicationInfo == none || instigatedBy.PlayerReplicationInfo.bOnlySpectator)){ + Momentum = vect(0,0,0); + if(NoFF(injured, TG.FriendlyFireScale)) + return 0; + else if(OriginalDamage == Damage) + return Damage * TG.FriendlyFireScale; + } + else if(instigatedBy == none && !DamageType.default.bCausedByWorld){ + Momentum = vect(0,0,0); + if(NoFF(injured, TG.FriendlyFireScale)) + return 0; + else if(OriginalDamage == Damage) + return Damage * TG.FriendlyFireScale; + } + } + return super.NetDamage(OriginalDamage, Damage, injured, instigatedBy, HitLocation, Momentum, DamageType); +} +function bool NoFF(Pawn injured, float FF){ + return (FF == 0.0 || (Vehicle(injured) != none && Vehicle(injured).bNoFriendlyFire)); +} +function RaiseHardcoreLevel(float inc, string reason){ + local string s; + local Controller P; + local NicePlayerController nicePlayer; + + if(ScrnRules.HardcoreLevelFloat < ScrnRules.HardcoreLevel) + ScrnRules.HardcoreLevelFloat = ScrnRules.HardcoreLevel; + ScrnRules.HardcoreLevelFloat += inc; + ScrnRules.HardcoreLevel = int(ScrnRules.HardcoreLevelFloat + 0.01); + ScrnRules.Mut.HardcoreLevel = clamp(ScrnRules.HardcoreLevel, 0, 255); + ScrnRules.Mut.NetUpdateTime = Level.TimeSeconds - 1; + + s = ScrnRules.msgHardcore; + ReplaceText(s, "%a", String(ScrnRules.HardcoreLevel)); + ReplaceText(s, "%i", String(inc)); + ReplaceText(s, "%r", reason); + for(P = Level.ControllerList; P != none; P = P.nextController){ + nicePlayer = NicePlayerController(P); + if(nicePlayer != none && nicePlayer.bFlagShowHLMessages) + nicePlayer.ClientMessage(s); + } +} +function bool PreventDeath(Pawn Killed, Controller Killer, class damageType, vector HitLocation){ + local NiceHumanPawn nicePawn; + local NicePlayerController nicePlayer; + nicePlayer = NicePlayerController(Killed.controller); + nicePawn = NiceHumanPawn(Killed); + if(nicePawn != none && (!nicePawn.bReactiveArmorUsed) + && class'NiceVeterancyTypes'.static.HasSkill(nicePlayer, class'NiceSkillDemoReactiveArmor')){ + nicePawn.bReactiveArmorUsed = true; + nicePlayer.niceRI.ServerExplode(class'NiceSkillDemoReactiveArmor'.default.baseDamage, + class'NiceSkillDemoReactiveArmor'.default.explRadius, + class'NiceSkillDemoReactiveArmor'.default.explExponent, + class'NiceDamTypeDemoSafeExplosion', + class'NiceSkillDemoReactiveArmor'.default.explMomentum, + killed.location, killed, true + ); + return true; + } + if(NextGameRules != none) + return NextGameRules.PreventDeath(Killed, Killer, damageType, HitLocation); + return false; +} +defaultproperties +{ +} diff --git a/sources/NiceSoundCls.uc b/sources/NiceSoundCls.uc index 0ac58d1..5e78e3f 100644 --- a/sources/NiceSoundCls.uc +++ b/sources/NiceSoundCls.uc @@ -1,9 +1,12 @@ -class NiceSoundCls extends Effects; -var Sound effectSound; -var float effectVolume; -simulated function PostBeginPlay(){ - if(effectSound != none) PlaySound(effectSound,, effectVolume); -} -defaultproperties -{ DrawType=DT_None LifeSpan=0.100000 -} +class NiceSoundCls extends Effects; +var Sound effectSound; +var float effectVolume; +simulated function PostBeginPlay(){ + if(effectSound != none) + PlaySound(effectSound,, effectVolume); +} +defaultproperties +{ + DrawType=DT_None + LifeSpan=0.100000 +} diff --git a/sources/Perks/Abilities/NiceAbilitiesAdapter.uc b/sources/Perks/Abilities/NiceAbilitiesAdapter.uc index f52d300..6da80b9 100644 --- a/sources/Perks/Abilities/NiceAbilitiesAdapter.uc +++ b/sources/Perks/Abilities/NiceAbilitiesAdapter.uc @@ -1,20 +1,25 @@ -//============================================================================== -// NicePack / NiceAbilitiesAdapter -//============================================================================== -// Temporary stand-in for future functionality. -// Use this class to catch events from players' abilities. -//============================================================================== -// 'Nice pack' source -// Do whatever the fuck you want with it -// Author: dkanus -// E-mail: dkanus@gmail.com -//============================================================================== -class NiceAbilitiesAdapter extends Object; -var LevelInfo level; -static function AbilityActivated( string abilityID, NicePlayerController relatedPlayer); -static function AbilityAdded( string abilityID, NicePlayerController relatedPlayer); -static function AbilityRemoved( string abilityID, NicePlayerController relatedPlayer); -static function ModAbilityCooldown( string abilityID, NicePlayerController relatedPlayer, out float cooldown); -defaultproperties -{ -} +//============================================================================== +// NicePack / NiceAbilitiesAdapter +//============================================================================== +// Temporary stand-in for future functionality. +// Use this class to catch events from players' abilities. +//============================================================================== +// 'Nice pack' source +// Do whatever the fuck you want with it +// Author: dkanus +// E-mail: dkanus@gmail.com +//============================================================================== +class NiceAbilitiesAdapter extends Object; +var LevelInfo level; +static function AbilityActivated( string abilityID, + NicePlayerController relatedPlayer); +static function AbilityAdded( string abilityID, + NicePlayerController relatedPlayer); +static function AbilityRemoved( string abilityID, + NicePlayerController relatedPlayer); +static function ModAbilityCooldown( string abilityID, + NicePlayerController relatedPlayer, + out float cooldown); +defaultproperties +{ +} diff --git a/sources/Perks/Abilities/NiceAbilitiesEvents.uc b/sources/Perks/Abilities/NiceAbilitiesEvents.uc index 8f0d0f9..9af9e7a 100644 --- a/sources/Perks/Abilities/NiceAbilitiesEvents.uc +++ b/sources/Perks/Abilities/NiceAbilitiesEvents.uc @@ -1,57 +1,79 @@ -//============================================================================== -// NicePack / NiceAbilitiesEvents -//============================================================================== -// Temporary stand-in for future functionality. -//============================================================================== -// 'Nice pack' source -// Do whatever the fuck you want with it -// Author: dkanus -// E-mail: dkanus@gmail.com -//============================================================================== -class NiceAbilitiesEvents extends Object; -var array< class > adapters; -// If adapter was already added also returns 'false'. -static function bool AddAdapter(class newAdapter, optional LevelInfo level){ - local int i; - if(newAdapter == none) return false; - for(i = 0;i < default.adapters.length;i ++) if(default.adapters[i] == newAdapter) return false; - newAdapter.default.level = level; - default.adapters[default.adapters.length] = newAdapter; - return true; -} -// If adapter wasn't even present also returns 'false'. -static function bool RemoveAdapter(class adapter){ - local int i; - if(adapter == none) return false; - for(i = 0;i < default.adapters.length;i ++){ if(default.adapters[i] == adapter){ default.adapters.Remove(i, 1); return true; } - } - return false; -} -static function CallAbilityActivated - ( string abilityID, NicePlayerController relatedPlayer - ){ - local int i; - for(i = 0;i < default.adapters.length;i ++) default.adapters[i].static.AbilityActivated(abilityID, relatedPlayer); -} -static function CallAbilityAdded - ( string abilityID, NicePlayerController relatedPlayer - ){ - local int i; - for(i = 0;i < default.adapters.length;i ++) default.adapters[i].static.AbilityAdded(abilityID, relatedPlayer); -} -static function CallAbilityRemoved - ( string abilityID, NicePlayerController relatedPlayer - ){ - local int i; - for(i = 0;i < default.adapters.length;i ++) default.adapters[i].static.AbilityRemoved(abilityID, relatedPlayer); -} -static function CallModAbilityCooldown - ( string abilityID, NicePlayerController relatedPlayer, out float cooldown - ){ - local int i; - for(i = 0;i < default.adapters.length;i ++){ default.adapters[i].static.ModAbilityCooldown( abilityID, relatedPlayer, cooldown); - } -} -defaultproperties -{ -} +//============================================================================== +// NicePack / NiceAbilitiesEvents +//============================================================================== +// Temporary stand-in for future functionality. +//============================================================================== +// 'Nice pack' source +// Do whatever the fuck you want with it +// Author: dkanus +// E-mail: dkanus@gmail.com +//============================================================================== +class NiceAbilitiesEvents extends Object; +var array< class > adapters; +// If adapter was already added also returns 'false'. +static function bool AddAdapter(class newAdapter, + optional LevelInfo level){ + local int i; + if(newAdapter == none) return false; + for(i = 0;i < default.adapters.length;i ++) + if(default.adapters[i] == newAdapter) + return false; + newAdapter.default.level = level; + default.adapters[default.adapters.length] = newAdapter; + return true; +} +// If adapter wasn't even present also returns 'false'. +static function bool RemoveAdapter(class adapter){ + local int i; + if(adapter == none) return false; + for(i = 0;i < default.adapters.length;i ++){ + if(default.adapters[i] == adapter){ + default.adapters.Remove(i, 1); + return true; + } + } + return false; +} +static function CallAbilityActivated + ( + string abilityID, + NicePlayerController relatedPlayer + ){ + local int i; + for(i = 0;i < default.adapters.length;i ++) + default.adapters[i].static.AbilityActivated(abilityID, relatedPlayer); +} +static function CallAbilityAdded + ( + string abilityID, + NicePlayerController relatedPlayer + ){ + local int i; + for(i = 0;i < default.adapters.length;i ++) + default.adapters[i].static.AbilityAdded(abilityID, relatedPlayer); +} +static function CallAbilityRemoved + ( + string abilityID, + NicePlayerController relatedPlayer + ){ + local int i; + for(i = 0;i < default.adapters.length;i ++) + default.adapters[i].static.AbilityRemoved(abilityID, relatedPlayer); +} +static function CallModAbilityCooldown + ( + string abilityID, + NicePlayerController relatedPlayer, + out float cooldown + ){ + local int i; + for(i = 0;i < default.adapters.length;i ++){ + default.adapters[i].static.ModAbilityCooldown( abilityID, + relatedPlayer, + cooldown); + } +} +defaultproperties +{ +} diff --git a/sources/Perks/Abilities/NiceAbilityManager.uc b/sources/Perks/Abilities/NiceAbilityManager.uc index fba0c3b..f307ff4 100644 --- a/sources/Perks/Abilities/NiceAbilityManager.uc +++ b/sources/Perks/Abilities/NiceAbilityManager.uc @@ -1,137 +1,169 @@ -//============================================================================== -// NicePack / NiceAbilityManager -//============================================================================== -// Class that manager active abilities, introduced along with a NicePack. -// Can support at most 5 ('maxAbilitiesAmount') different abilities at once. -// NICETODO: refactor later -//============================================================================== -// 'Nice pack' source -// Do whatever the fuck you want with it -// Author: dkanus -// E-mail: dkanus@gmail.com -//============================================================================== -class NiceAbilityManager extends Actor; -var const int maxAbilitiesAmount; -// Defines a list of all possible ability's states -enum EAbilityState{ - // Ability is ready to use - ASTATE_READY, - // Ability is being used - ASTATE_ACTIVE, - // Ability is on cooldown - ASTATE_COOLDOWN -}; -// Describes all the necessary information about an ability -struct NiceAbilityDescription{ - // Ability's ID, supposed to be unique per ability, - // but no checks are enforced yet - var string ID; - // Image to be used as an ability's icon - var Texture icon; - // Default cooldown duration - var float cooldownLength; - // Can ability be canceled once activated? - var bool canBeCancelled; -}; -// Complete description of current status of an ability, -// including it's complete description. -struct NiceAbilityStatus{ - // Complete description of ability in question - var NiceAbilityDescription description; - // Current cooldown value - var float cooldown; - // Current state of an ability - var EAbilityState myState; -}; -var NiceAbilityStatus currentAbilities[5]; -var int currentAbilitiesAmount; -// Refers to the player whose abilities we manage -var NicePlayerController relatedPlayer; -var const class events; -// Unfortunately this hackk is required to force replication of structure array -var int hackCounter; -replication{ - reliable if(Role == ROLE_Authority) currentAbilities, currentAbilitiesAmount, hackCounter; -} -simulated function PostBeginPlay(){ - relatedPlayer = NicePlayerController(owner); -} -function AddAbility(NiceAbilityDescription description){ - local int i; - local NiceAbilityStatus newRecord; - if(currentAbilitiesAmount >= maxAbilitiesAmount) return; - for(i = 0;i < currentAbilitiesAmount;i ++) if(currentAbilities[i].description.ID ~= description.ID) return; - newRecord.description = description; - newRecord.cooldown = 0.0; - newRecord.myState = ASTATE_READY; - currentAbilities[currentAbilitiesAmount] = newRecord; - currentAbilitiesAmount += 1; - events.static.CallAbilityAdded(description.ID, relatedPlayer); - netUpdateTime = level.timeSeconds - 1; -} -function RemoveAbility(string abilityID){ - local int i, j; - local bool wasRemoved; - j = 0; - for(i = 0;i < currentAbilitiesAmount;i ++){ if(currentAbilities[i].description.ID ~= abilityID){ wasRemoved = true; continue; } currentAbilities[j] = currentAbilities[i]; j += 1; - } - currentAbilitiesAmount = j; - if(wasRemoved) events.static.CallAbilityRemoved(abilityID, relatedPlayer); - netUpdateTime = level.timeSeconds - 1; -} -function ClearAbilities(){ - currentAbilitiesAmount = 0; - netUpdateTime = level.timeSeconds - 1; -} -// Returns index of the ability with a given name. -// Returns '-1' if such ability doesn't exist. -simulated function int GetAbilityIndex(string abilityID){ - local int i; - for(i = 0;i < currentAbilitiesAmount;i ++) if(currentAbilities[i].description.ID ~= abilityID) return i; - return -1; -} -simulated function bool IsAbilityActive(string abilityID){ - local int index; - index = GetAbilityIndex(abilityID); - if(index < 0) return false; - return (currentAbilities[index].myState == ASTATE_ACTIVE); -} -// Sets ability to a proper state. -// Does nothing if ability is already in a specified state. -// Setting active ability to a ready state is only allowed -// if ability can be canceled. -// Updates cooldown to full length if new state is 'ASTATE_COOLDOWN'. -function SetAbilityState(int abilityIndex, EAbilityState newState){ - local float cooldown; - local EAbilityState currentState; - if(abilityIndex < 0 || abilityIndex >= currentAbilitiesAmount) return; - currentState = currentAbilities[abilityIndex].myState; - if(currentState == newState) return; - if( currentState == ASTATE_ACTIVE && newState == ASTATE_READY && !currentAbilities[abilityIndex].description.canBeCancelled) return; - currentAbilities[abilityIndex].myState = newState; - if(newState == ASTATE_COOLDOWN){ cooldown = currentAbilities[abilityIndex].description.cooldownLength; events.static.CallModAbilityCooldown( currentAbilities[abilityIndex].description.ID, relatedPlayer, cooldown ); currentAbilities[abilityIndex].cooldown = cooldown; - } - hackCounter ++; - netUpdateTime = level.timeSeconds - 1; - // Fire off events - if(newState == ASTATE_ACTIVE){ events.static.CallAbilityActivated( currentAbilities[abilityIndex].description.ID, relatedPlayer ); - } -} -// Changes ability's cooldown by a given amount. -// If this brings cooldown to zero or below - -// resets current ability to a 'ready' (ASTATE_READY) state. -function AddToCooldown(int abilityIndex, float delta){ - if(abilityIndex < 0 || abilityIndex >= currentAbilitiesAmount) return; - if(currentAbilities[abilityIndex].myState != ASTATE_COOLDOWN) return; - currentAbilities[abilityIndex].cooldown += delta; - if(currentAbilities[abilityIndex].cooldown <= 0) SetAbilityState(abilityIndex, ASTATE_READY); - hackCounter ++; -} -function Tick(float deltaTime){ - local int i; - if(Role != Role_AUTHORITY) return; - for(i = 0;i < currentAbilitiesAmount;i ++) AddToCooldown(i, -deltaTime); -} -defaultproperties -{ maxAbilitiesAmount=5 Events=Class'NicePack.NiceAbilitiesEvents' DrawType=DT_None -} +//============================================================================== +// NicePack / NiceAbilityManager +//============================================================================== +// Class that manager active abilities, introduced along with a NicePack. +// Can support at most 5 ('maxAbilitiesAmount') different abilities at once. +// NICETODO: refactor later +//============================================================================== +// 'Nice pack' source +// Do whatever the fuck you want with it +// Author: dkanus +// E-mail: dkanus@gmail.com +//============================================================================== +class NiceAbilityManager extends Actor; +var const int maxAbilitiesAmount; +// Defines a list of all possible ability's states +enum EAbilityState{ + // Ability is ready to use + ASTATE_READY, + // Ability is being used + ASTATE_ACTIVE, + // Ability is on cooldown + ASTATE_COOLDOWN +}; +// Describes all the necessary information about an ability +struct NiceAbilityDescription{ + // Ability's ID, supposed to be unique per ability, + // but no checks are enforced yet + var string ID; + // Image to be used as an ability's icon + var Texture icon; + // Default cooldown duration + var float cooldownLength; + // Can ability be canceled once activated? + var bool canBeCancelled; +}; +// Complete description of current status of an ability, +// including it's complete description. +struct NiceAbilityStatus{ + // Complete description of ability in question + var NiceAbilityDescription description; + // Current cooldown value + var float cooldown; + // Current state of an ability + var EAbilityState myState; +}; +var NiceAbilityStatus currentAbilities[5]; +var int currentAbilitiesAmount; +// Refers to the player whose abilities we manage +var NicePlayerController relatedPlayer; +var const class events; +// Unfortunately this hackk is required to force replication of structure array +var int hackCounter; +replication{ + reliable if(Role == ROLE_Authority) + currentAbilities, currentAbilitiesAmount, hackCounter; +} +simulated function PostBeginPlay(){ + relatedPlayer = NicePlayerController(owner); +} +function AddAbility(NiceAbilityDescription description){ + local int i; + local NiceAbilityStatus newRecord; + if(currentAbilitiesAmount >= maxAbilitiesAmount) return; + for(i = 0;i < currentAbilitiesAmount;i ++) + if(currentAbilities[i].description.ID ~= description.ID) + return; + newRecord.description = description; + newRecord.cooldown = 0.0; + newRecord.myState = ASTATE_READY; + currentAbilities[currentAbilitiesAmount] = newRecord; + currentAbilitiesAmount += 1; + events.static.CallAbilityAdded(description.ID, relatedPlayer); + netUpdateTime = level.timeSeconds - 1; +} +function RemoveAbility(string abilityID){ + local int i, j; + local bool wasRemoved; + j = 0; + for(i = 0;i < currentAbilitiesAmount;i ++){ + if(currentAbilities[i].description.ID ~= abilityID){ + wasRemoved = true; + continue; + } + currentAbilities[j] = currentAbilities[i]; + j += 1; + } + currentAbilitiesAmount = j; + if(wasRemoved) + events.static.CallAbilityRemoved(abilityID, relatedPlayer); + netUpdateTime = level.timeSeconds - 1; +} +function ClearAbilities(){ + currentAbilitiesAmount = 0; + netUpdateTime = level.timeSeconds - 1; +} +// Returns index of the ability with a given name. +// Returns '-1' if such ability doesn't exist. +simulated function int GetAbilityIndex(string abilityID){ + local int i; + for(i = 0;i < currentAbilitiesAmount;i ++) + if(currentAbilities[i].description.ID ~= abilityID) + return i; + return -1; +} +simulated function bool IsAbilityActive(string abilityID){ + local int index; + index = GetAbilityIndex(abilityID); + if(index < 0) + return false; + return (currentAbilities[index].myState == ASTATE_ACTIVE); +} +// Sets ability to a proper state. +// Does nothing if ability is already in a specified state. +// Setting active ability to a ready state is only allowed +// if ability can be canceled. +// Updates cooldown to full length if new state is 'ASTATE_COOLDOWN'. +function SetAbilityState(int abilityIndex, EAbilityState newState){ + local float cooldown; + local EAbilityState currentState; + if(abilityIndex < 0 || abilityIndex >= currentAbilitiesAmount) return; + currentState = currentAbilities[abilityIndex].myState; + if(currentState == newState) + return; + if( currentState == ASTATE_ACTIVE && newState == ASTATE_READY + && !currentAbilities[abilityIndex].description.canBeCancelled) + return; + currentAbilities[abilityIndex].myState = newState; + if(newState == ASTATE_COOLDOWN){ + cooldown = currentAbilities[abilityIndex].description.cooldownLength; + events.static.CallModAbilityCooldown( + currentAbilities[abilityIndex].description.ID, + relatedPlayer, + cooldown + ); + currentAbilities[abilityIndex].cooldown = cooldown; + } + hackCounter ++; + netUpdateTime = level.timeSeconds - 1; + // Fire off events + if(newState == ASTATE_ACTIVE){ + events.static.CallAbilityActivated( + currentAbilities[abilityIndex].description.ID, + relatedPlayer + ); + } +} +// Changes ability's cooldown by a given amount. +// If this brings cooldown to zero or below - +// resets current ability to a 'ready' (ASTATE_READY) state. +function AddToCooldown(int abilityIndex, float delta){ + if(abilityIndex < 0 || abilityIndex >= currentAbilitiesAmount) return; + if(currentAbilities[abilityIndex].myState != ASTATE_COOLDOWN) return; + currentAbilities[abilityIndex].cooldown += delta; + if(currentAbilities[abilityIndex].cooldown <= 0) + SetAbilityState(abilityIndex, ASTATE_READY); + hackCounter ++; +} +function Tick(float deltaTime){ + local int i; + if(Role != Role_AUTHORITY) return; + for(i = 0;i < currentAbilitiesAmount;i ++) + AddToCooldown(i, -deltaTime); +} +defaultproperties +{ + maxAbilitiesAmount=5 + Events=Class'NicePack.NiceAbilitiesEvents' + DrawType=DT_None +} diff --git a/sources/Perks/Berserker/NiceDamageTypeVetBerserker.uc b/sources/Perks/Berserker/NiceDamageTypeVetBerserker.uc index 1dceffb..5c53777 100644 --- a/sources/Perks/Berserker/NiceDamageTypeVetBerserker.uc +++ b/sources/Perks/Berserker/NiceDamageTypeVetBerserker.uc @@ -1,8 +1,24 @@ -class NiceDamageTypeVetBerserker extends NiceWeaponDamageType - abstract; -static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){ - if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetBerserkerExp', Int(Float(Amount) * class'NicePack'.default.vetZerkDamageExpCost * getScale(HL))); -} -defaultproperties -{ HeadShotDamageMult=1.250000 bIsMeleeDamage=True DeathString="%o was beat down by %k." FemaleSuicide="%o beat herself down." MaleSuicide="%o beat himself down." bRagdollBullet=True bBulletHit=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' FlashFog=(X=600.000000) KDamageImpulse=2000.000000 KDeathVel=100.000000 KDeathUpKick=25.000000 VehicleDamageScaling=0.600000 -} +class NiceDamageTypeVetBerserker extends NiceWeaponDamageType + abstract; +static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){ + if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) + SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetBerserkerExp', Int(Float(Amount) * class'NicePack'.default.vetZerkDamageExpCost * getScale(HL))); +} +defaultproperties +{ + HeadShotDamageMult=1.250000 + bIsMeleeDamage=True + DeathString="%o was beat down by %k." + FemaleSuicide="%o beat herself down." + MaleSuicide="%o beat himself down." + bRagdollBullet=True + bBulletHit=True + PawnDamageEmitter=Class'ROEffects.ROBloodPuff' + LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' + LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' + FlashFog=(X=600.000000) + KDamageImpulse=2000.000000 + KDeathVel=100.000000 + KDeathUpKick=25.000000 + VehicleDamageScaling=0.600000 +} diff --git a/sources/Perks/Berserker/NiceVetBerserkerExp.uc b/sources/Perks/Berserker/NiceVetBerserkerExp.uc index 2a34158..6264978 100644 --- a/sources/Perks/Berserker/NiceVetBerserkerExp.uc +++ b/sources/Perks/Berserker/NiceVetBerserkerExp.uc @@ -1,4 +1,5 @@ -class NiceVetBerserkerExp extends SRCustomProgressInt; -defaultproperties -{ ProgressName="Berserker exp." -} +class NiceVetBerserkerExp extends SRCustomProgressInt; +defaultproperties +{ + ProgressName="Berserker exp." +} diff --git a/sources/Perks/Berserker/Skills/NiceSkillZerkBrawler.uc b/sources/Perks/Berserker/Skills/NiceSkillZerkBrawler.uc index 7c70fc1..7bb4ee5 100644 --- a/sources/Perks/Berserker/Skills/NiceSkillZerkBrawler.uc +++ b/sources/Perks/Berserker/Skills/NiceSkillZerkBrawler.uc @@ -1,5 +1,7 @@ -class NiceSkillZerkBrawler extends NiceSkill - abstract; -defaultproperties -{ SkillName="Brawler" SkillEffects="Clots can't grab you." -} +class NiceSkillZerkBrawler extends NiceSkill + abstract; +defaultproperties +{ + SkillName="Brawler" + SkillEffects="Clots can't grab you." +} diff --git a/sources/Perks/Berserker/Skills/NiceSkillZerkCleave.uc b/sources/Perks/Berserker/Skills/NiceSkillZerkCleave.uc index 376aa23..7c21f39 100644 --- a/sources/Perks/Berserker/Skills/NiceSkillZerkCleave.uc +++ b/sources/Perks/Berserker/Skills/NiceSkillZerkCleave.uc @@ -1,6 +1,9 @@ -class NiceSkillZerkCleave extends NiceSkill - abstract; -var float bonusDegrees; -defaultproperties -{ bonusDegrees=0.523599 SkillName="Cleave" SkillEffects="Add 30 degrees to wide attacks with melee weapons." -} +class NiceSkillZerkCleave extends NiceSkill + abstract; +var float bonusDegrees; +defaultproperties +{ + bonusDegrees=0.523599 + SkillName="Cleave" + SkillEffects="Add 30 degrees to wide attacks with melee weapons." +} diff --git a/sources/Perks/Berserker/Skills/NiceSkillZerkColossus.uc b/sources/Perks/Berserker/Skills/NiceSkillZerkColossus.uc index 94eb445..3eb6ba6 100644 --- a/sources/Perks/Berserker/Skills/NiceSkillZerkColossus.uc +++ b/sources/Perks/Berserker/Skills/NiceSkillZerkColossus.uc @@ -1,6 +1,9 @@ -class NiceSkillZerkColossus extends NiceSkill - abstract; -var float timeBonus; -defaultproperties -{ timeBonus=1.000000 SkillName="Colossus" SkillEffects="Invincibility period lasts 1 second longer." -} +class NiceSkillZerkColossus extends NiceSkill + abstract; +var float timeBonus; +defaultproperties +{ + timeBonus=1.000000 + SkillName="Colossus" + SkillEffects="Invincibility period lasts 1 second longer." +} diff --git a/sources/Perks/Berserker/Skills/NiceSkillZerkFury.uc b/sources/Perks/Berserker/Skills/NiceSkillZerkFury.uc index 265f385..be6772c 100644 --- a/sources/Perks/Berserker/Skills/NiceSkillZerkFury.uc +++ b/sources/Perks/Berserker/Skills/NiceSkillZerkFury.uc @@ -1,6 +1,9 @@ -class NiceSkillZerkFury extends NiceSkill - abstract; -var float attackSpeedBonus; -defaultproperties -{ attackSpeedBonus=1.500000 SkillName="Fury" SkillEffects="Attack 50% faster during invincibility." -} +class NiceSkillZerkFury extends NiceSkill + abstract; +var float attackSpeedBonus; +defaultproperties +{ + attackSpeedBonus=1.500000 + SkillName="Fury" + SkillEffects="Attack 50% faster during invincibility." +} diff --git a/sources/Perks/Berserker/Skills/NiceSkillZerkGunzerker.uc b/sources/Perks/Berserker/Skills/NiceSkillZerkGunzerker.uc index 0e952f9..6738961 100644 --- a/sources/Perks/Berserker/Skills/NiceSkillZerkGunzerker.uc +++ b/sources/Perks/Berserker/Skills/NiceSkillZerkGunzerker.uc @@ -1,6 +1,9 @@ -class NiceSkillZerkGunzerker extends NiceSkill - abstract; -var float cooldown; -defaultproperties -{ cooldown=-2.000000 SkillName="Gunzerker" SkillEffects="You're able to activate melee-invincibility with non-melee headshots, but your misses are punished by a 2 second cooldown, during which you cannot activate invincibility." -} +class NiceSkillZerkGunzerker extends NiceSkill + abstract; +var float cooldown; +defaultproperties +{ + cooldown=-2.000000 + SkillName="Gunzerker" + SkillEffects="You're able to activate melee-invincibility with non-melee headshots, but your misses are punished by a 2 second cooldown, during which you cannot activate invincibility." +} diff --git a/sources/Perks/Berserker/Skills/NiceSkillZerkUndead.uc b/sources/Perks/Berserker/Skills/NiceSkillZerkUndead.uc index bd74493..a1836b2 100644 --- a/sources/Perks/Berserker/Skills/NiceSkillZerkUndead.uc +++ b/sources/Perks/Berserker/Skills/NiceSkillZerkUndead.uc @@ -1,6 +1,9 @@ -class NiceSkillZerkUndead extends NiceSkill - abstract; -var int addedSafeMisses; -defaultproperties -{ addedSafeMisses=1 SkillName="Undead" SkillEffects="Get additional safe melee-miss during invincibility period." -} +class NiceSkillZerkUndead extends NiceSkill + abstract; +var int addedSafeMisses; +defaultproperties +{ + addedSafeMisses=1 + SkillName="Undead" + SkillEffects="Get additional safe melee-miss during invincibility period." +} diff --git a/sources/Perks/Berserker/Skills/NiceSkillZerkVorpalBlade.uc b/sources/Perks/Berserker/Skills/NiceSkillZerkVorpalBlade.uc index e4ddee4..b9091f7 100644 --- a/sources/Perks/Berserker/Skills/NiceSkillZerkVorpalBlade.uc +++ b/sources/Perks/Berserker/Skills/NiceSkillZerkVorpalBlade.uc @@ -1,6 +1,9 @@ -class NiceSkillZerkVorpalBlade extends NiceSkill - abstract; -var float damageBonus; -defaultproperties -{ damageBonus=2.000000 SkillName="Vorpal blade" SkillEffects="Your head-shot deals double damage on your first invincibility extension against the zed." -} +class NiceSkillZerkVorpalBlade extends NiceSkill + abstract; +var float damageBonus; +defaultproperties +{ + damageBonus=2.000000 + SkillName="Vorpal blade" + SkillEffects="Your head-shot deals double damage on your first invincibility extension against the zed." +} diff --git a/sources/Perks/Berserker/Skills/NiceSkillZerkWhirlwind.uc b/sources/Perks/Berserker/Skills/NiceSkillZerkWhirlwind.uc index 8d664bb..d2be2ef 100644 --- a/sources/Perks/Berserker/Skills/NiceSkillZerkWhirlwind.uc +++ b/sources/Perks/Berserker/Skills/NiceSkillZerkWhirlwind.uc @@ -1,5 +1,7 @@ -class NiceSkillZerkWhirlwind extends NiceSkill - abstract; -defaultproperties -{ SkillName="Whirlwind" SkillEffects="Move twice as fast during invincibility." -} +class NiceSkillZerkWhirlwind extends NiceSkill + abstract; +defaultproperties +{ + SkillName="Whirlwind" + SkillEffects="Move twice as fast during invincibility." +} diff --git a/sources/Perks/Berserker/Skills/NiceSkillZerkWindCutter.uc b/sources/Perks/Berserker/Skills/NiceSkillZerkWindCutter.uc index 5b76809..3591c41 100644 --- a/sources/Perks/Berserker/Skills/NiceSkillZerkWindCutter.uc +++ b/sources/Perks/Berserker/Skills/NiceSkillZerkWindCutter.uc @@ -1,6 +1,9 @@ -class NiceSkillZerkWindCutter extends NiceSkill - abstract; -var float rangeBonus; -defaultproperties -{ rangeBonus=1.500000 SkillName="Wind cutter" SkillEffects="Increase your reach with melee-weapons by 50%." -} +class NiceSkillZerkWindCutter extends NiceSkill + abstract; +var float rangeBonus; +defaultproperties +{ + rangeBonus=1.500000 + SkillName="Wind cutter" + SkillEffects="Increase your reach with melee-weapons by 50%." +} diff --git a/sources/Perks/Berserker/Skills/NiceSkillZerkZEDAccelerate.uc b/sources/Perks/Berserker/Skills/NiceSkillZerkZEDAccelerate.uc index 86fca0f..1c66cde 100644 --- a/sources/Perks/Berserker/Skills/NiceSkillZerkZEDAccelerate.uc +++ b/sources/Perks/Berserker/Skills/NiceSkillZerkZEDAccelerate.uc @@ -1,5 +1,7 @@ -class NiceSkillZerkZEDAccelerate extends NiceSkill - abstract; -defaultproperties -{ SkillName="Accelerate" SkillEffects="Move and attack at the same speed during zed-time." -} +class NiceSkillZerkZEDAccelerate extends NiceSkill + abstract; +defaultproperties +{ + SkillName="Accelerate" + SkillEffects="Move and attack at the same speed during zed-time." +} diff --git a/sources/Perks/Berserker/Skills/NiceSkillZerkZEDUnbreakable.uc b/sources/Perks/Berserker/Skills/NiceSkillZerkZEDUnbreakable.uc index 68d9a63..850e65d 100644 --- a/sources/Perks/Berserker/Skills/NiceSkillZerkZEDUnbreakable.uc +++ b/sources/Perks/Berserker/Skills/NiceSkillZerkZEDUnbreakable.uc @@ -1,5 +1,7 @@ -class NiceSkillZerkZEDUnbreakable extends NiceSkill - abstract; -defaultproperties -{ SkillName="Unbreakable" SkillEffects="You resist all damage during zed time." -} +class NiceSkillZerkZEDUnbreakable extends NiceSkill + abstract; +defaultproperties +{ + SkillName="Unbreakable" + SkillEffects="You resist all damage during zed time." +} diff --git a/sources/Perks/Commando/NiceDamageTypeVetCommando.uc b/sources/Perks/Commando/NiceDamageTypeVetCommando.uc index e756c30..ffe9a19 100644 --- a/sources/Perks/Commando/NiceDamageTypeVetCommando.uc +++ b/sources/Perks/Commando/NiceDamageTypeVetCommando.uc @@ -1,14 +1,16 @@ -class NiceDamageTypeVetCommando extends NiceWeaponDamageType - abstract; -static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed ){ - if(Killed.IsA('ZombieStalker')) KFStatsAndAchievements.AddStalkerKill(); -} -static function AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount){ - KFStatsAndAchievements.AddBullpupDamage(Amount); -} -static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){ - if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetCommandoExp', Int(Float(Amount) * class'NicePack'.default.vetCommandoDamageExpCost * getScale(HL))); -} -defaultproperties -{ -} +class NiceDamageTypeVetCommando extends NiceWeaponDamageType + abstract; +static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed ){ + if(Killed.IsA('ZombieStalker')) + KFStatsAndAchievements.AddStalkerKill(); +} +static function AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount){ + KFStatsAndAchievements.AddBullpupDamage(Amount); +} +static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){ + if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) + SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetCommandoExp', Int(Float(Amount) * class'NicePack'.default.vetCommandoDamageExpCost * getScale(HL))); +} +defaultproperties +{ +} diff --git a/sources/Perks/Commando/NiceVetCommandoExp.uc b/sources/Perks/Commando/NiceVetCommandoExp.uc index aff8816..fae1286 100644 --- a/sources/Perks/Commando/NiceVetCommandoExp.uc +++ b/sources/Perks/Commando/NiceVetCommandoExp.uc @@ -1,4 +1,5 @@ -class NiceVetCommandoExp extends SRCustomProgressInt; -defaultproperties -{ ProgressName="Commando exp." -} +class NiceVetCommandoExp extends SRCustomProgressInt; +defaultproperties +{ + ProgressName="Commando exp." +} diff --git a/sources/Perks/Commando/Skills/NiceSkillCommandoExplosivePower.uc b/sources/Perks/Commando/Skills/NiceSkillCommandoExplosivePower.uc index 6d29530..6a1373d 100644 --- a/sources/Perks/Commando/Skills/NiceSkillCommandoExplosivePower.uc +++ b/sources/Perks/Commando/Skills/NiceSkillCommandoExplosivePower.uc @@ -1,6 +1,9 @@ -class NiceSkillCommandoExplosivePower extends NiceSkill - abstract; -var float dmgMod; -defaultproperties -{ dmgMod=1.200000 SkillName="Explosive power" SkillEffects="Burst fire deals 20% more damage and has reduced delay between shots." -} +class NiceSkillCommandoExplosivePower extends NiceSkill + abstract; +var float dmgMod; +defaultproperties +{ + dmgMod=1.200000 + SkillName="Explosive power" + SkillEffects="Burst fire deals 20% more damage and has reduced delay between shots." +} diff --git a/sources/Perks/Commando/Skills/NiceSkillCommandoLargerMags.uc b/sources/Perks/Commando/Skills/NiceSkillCommandoLargerMags.uc index 182b6bb..785f7d5 100644 --- a/sources/Perks/Commando/Skills/NiceSkillCommandoLargerMags.uc +++ b/sources/Perks/Commando/Skills/NiceSkillCommandoLargerMags.uc @@ -1,6 +1,9 @@ -class NiceSkillCommandoLargerMags extends NiceSkill - abstract; -var float sizeBonus; -defaultproperties -{ sizeBonus=1.500000 SkillName="Larger mags" SkillEffects="50% larger assault rifles' magazines." -} +class NiceSkillCommandoLargerMags extends NiceSkill + abstract; +var float sizeBonus; +defaultproperties +{ + sizeBonus=1.500000 + SkillName="Larger mags" + SkillEffects="50% larger assault rifles' magazines." +} diff --git a/sources/Perks/Commando/Skills/NiceSkillCommandoPerfectExecution.uc b/sources/Perks/Commando/Skills/NiceSkillCommandoPerfectExecution.uc index 693be72..38ecf01 100644 --- a/sources/Perks/Commando/Skills/NiceSkillCommandoPerfectExecution.uc +++ b/sources/Perks/Commando/Skills/NiceSkillCommandoPerfectExecution.uc @@ -1,5 +1,7 @@ -class NiceSkillCommandoPerfectExecution extends NiceSkill - abstract; -defaultproperties -{ SkillName="Perfect execution" SkillEffects="Raging scrake or fleshpound activates zed-time." -} +class NiceSkillCommandoPerfectExecution extends NiceSkill + abstract; +defaultproperties +{ + SkillName="Perfect execution" + SkillEffects="Raging scrake or fleshpound activates zed-time." +} diff --git a/sources/Perks/Commando/Skills/NiceSkillCommandoStrategist.uc b/sources/Perks/Commando/Skills/NiceSkillCommandoStrategist.uc index 7faef03..4b439b1 100644 --- a/sources/Perks/Commando/Skills/NiceSkillCommandoStrategist.uc +++ b/sources/Perks/Commando/Skills/NiceSkillCommandoStrategist.uc @@ -1,6 +1,10 @@ -class NiceSkillCommandoStrategist extends NiceSkill - abstract; -var float visionRadius; // 1.0 ~ 16m -defaultproperties -{ visionRadius=1.000000 bBroadcast=True SkillName="Strategist" SkillEffects="You and your teammates can see enemies' health and invisible zeds from 16 meters." -} +class NiceSkillCommandoStrategist extends NiceSkill + abstract; +var float visionRadius; // 1.0 ~ 16m +defaultproperties +{ + visionRadius=1.000000 + bBroadcast=True + SkillName="Strategist" + SkillEffects="You and your teammates can see enemies' health and invisible zeds from 16 meters." +} diff --git a/sources/Perks/Commando/Skills/NiceSkillCommandoTactitian.uc b/sources/Perks/Commando/Skills/NiceSkillCommandoTactitian.uc index eefd777..7b01772 100644 --- a/sources/Perks/Commando/Skills/NiceSkillCommandoTactitian.uc +++ b/sources/Perks/Commando/Skills/NiceSkillCommandoTactitian.uc @@ -1,6 +1,9 @@ -class NiceSkillCommandoTactitian extends NiceSkill - abstract; -var int bonusExt; -defaultproperties -{ bonusExt=2 SkillName="Tactician" SkillEffects="Gain two additional zed-time extensions." -} +class NiceSkillCommandoTactitian extends NiceSkill + abstract; +var int bonusExt; +defaultproperties +{ + bonusExt=2 + SkillName="Tactician" + SkillEffects="Gain two additional zed-time extensions." +} diff --git a/sources/Perks/Commando/Skills/NiceSkillCommandoZEDProfessional.uc b/sources/Perks/Commando/Skills/NiceSkillCommandoZEDProfessional.uc index 3119151..a9f5e10 100644 --- a/sources/Perks/Commando/Skills/NiceSkillCommandoZEDProfessional.uc +++ b/sources/Perks/Commando/Skills/NiceSkillCommandoZEDProfessional.uc @@ -1,5 +1,7 @@ -class NiceSkillCommandoZEDProfessional extends NiceSkill - abstract; -defaultproperties -{ SkillName="Professionalism" SkillEffects="Your reloads aren't slowed down during zed-time." -} +class NiceSkillCommandoZEDProfessional extends NiceSkill + abstract; +defaultproperties +{ + SkillName="Professionalism" + SkillEffects="Your reloads aren't slowed down during zed-time." +} diff --git a/sources/Perks/Demolitions/NiceDamTypeDemoBlunt.uc b/sources/Perks/Demolitions/NiceDamTypeDemoBlunt.uc index fc29dd7..a2f1f24 100644 --- a/sources/Perks/Demolitions/NiceDamTypeDemoBlunt.uc +++ b/sources/Perks/Demolitions/NiceDamTypeDemoBlunt.uc @@ -1,5 +1,17 @@ -class NiceDamTypeDemoBlunt extends NiceDamageTypeVetDemolitions - abstract; -defaultproperties -{ HeadShotDamageMult=2.000000 bSniperWeapon=True DeathString="%k killed %o (LAW Impact)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=5000.000000 KDeathVel=200.000000 KDeathUpKick=50.000000 VehicleDamageScaling=0.700000 -} +class NiceDamTypeDemoBlunt extends NiceDamageTypeVetDemolitions + abstract; +defaultproperties +{ + HeadShotDamageMult=2.000000 + bSniperWeapon=True + DeathString="%k killed %o (LAW Impact)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + FlashFog=(X=600.000000) + KDamageImpulse=5000.000000 + KDeathVel=200.000000 + KDeathUpKick=50.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Perks/Demolitions/NiceDamTypeDemoExplosion.uc b/sources/Perks/Demolitions/NiceDamTypeDemoExplosion.uc index 0d2406f..a640688 100644 --- a/sources/Perks/Demolitions/NiceDamTypeDemoExplosion.uc +++ b/sources/Perks/Demolitions/NiceDamTypeDemoExplosion.uc @@ -1,9 +1,26 @@ -class NiceDamTypeDemoExplosion extends NiceDamageTypeVetDemolitions; -static function GetHitEffects(out class HitEffects[4], int VictimHealth){ - HitEffects[0] = class'HitSmoke'; - if(VictimHealth <= 0) HitEffects[1] = class'KFHitFlame'; - else if(FRand() < 0.8) HitEffects[1] = class'KFHitFlame'; -} -defaultproperties -{ stunMultiplier=0.600000 bIsExplosive=True DeathString="%o filled %k's body with shrapnel." FemaleSuicide="%o blew up." MaleSuicide="%o blew up." bLocationalHit=False bThrowRagdoll=True bExtraMomentumZ=True DamageThreshold=1 DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' DeathOverlayTime=999.000000 KDamageImpulse=3000.000000 KDeathVel=300.000000 KDeathUpKick=250.000000 HumanObliterationThreshhold=150 -} +class NiceDamTypeDemoExplosion extends NiceDamageTypeVetDemolitions; +static function GetHitEffects(out class HitEffects[4], int VictimHealth){ + HitEffects[0] = class'HitSmoke'; + if(VictimHealth <= 0) + HitEffects[1] = class'KFHitFlame'; + else if(FRand() < 0.8) + HitEffects[1] = class'KFHitFlame'; +} +defaultproperties +{ + stunMultiplier=0.600000 + bIsExplosive=True + DeathString="%o filled %k's body with shrapnel." + FemaleSuicide="%o blew up." + MaleSuicide="%o blew up." + bLocationalHit=False + bThrowRagdoll=True + bExtraMomentumZ=True + DamageThreshold=1 + DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' + DeathOverlayTime=999.000000 + KDamageImpulse=3000.000000 + KDeathVel=300.000000 + KDeathUpKick=250.000000 + HumanObliterationThreshhold=150 +} diff --git a/sources/Perks/Demolitions/NiceDamageTypeVetDemolitions.uc b/sources/Perks/Demolitions/NiceDamageTypeVetDemolitions.uc index dc05905..c12d7e0 100644 --- a/sources/Perks/Demolitions/NiceDamageTypeVetDemolitions.uc +++ b/sources/Perks/Demolitions/NiceDamageTypeVetDemolitions.uc @@ -1,8 +1,9 @@ -class NiceDamageTypeVetDemolitions extends NiceWeaponDamageType - abstract; -static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){ - if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetDemolitionsExp', Int(Float(Amount) * class'NicePack'.default.vetDemoDamageExpCost * getScale(HL))); -} -defaultproperties -{ -} +class NiceDamageTypeVetDemolitions extends NiceWeaponDamageType + abstract; +static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){ + if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) + SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetDemolitionsExp', Int(Float(Amount) * class'NicePack'.default.vetDemoDamageExpCost * getScale(HL))); +} +defaultproperties +{ +} diff --git a/sources/Perks/Demolitions/NiceVetDemolitionsExp.uc b/sources/Perks/Demolitions/NiceVetDemolitionsExp.uc index 57393a6..53a5c32 100644 --- a/sources/Perks/Demolitions/NiceVetDemolitionsExp.uc +++ b/sources/Perks/Demolitions/NiceVetDemolitionsExp.uc @@ -1,4 +1,5 @@ -class NiceVetDemolitionsExp extends SRCustomProgressInt; -defaultproperties -{ ProgressName="Demolitions exp." -} +class NiceVetDemolitionsExp extends SRCustomProgressInt; +defaultproperties +{ + ProgressName="Demolitions exp." +} diff --git a/sources/Perks/Demolitions/Skills/NiceSkillDemoAPShot.uc b/sources/Perks/Demolitions/Skills/NiceSkillDemoAPShot.uc index cd4a1ed..5fb2002 100644 --- a/sources/Perks/Demolitions/Skills/NiceSkillDemoAPShot.uc +++ b/sources/Perks/Demolitions/Skills/NiceSkillDemoAPShot.uc @@ -1,7 +1,11 @@ -class NiceSkillDemoAPShot extends NiceSkill - abstract; -var float minCos; -var float damageRatio; -defaultproperties -{ minCos=0.707000 damageRatio=1.000000 SkillName="AP shot" SkillEffects="Deal full blast damage behind the target you've hit." -} +class NiceSkillDemoAPShot extends NiceSkill + abstract; +var float minCos; +var float damageRatio; +defaultproperties +{ + minCos=0.707000 + damageRatio=1.000000 + SkillName="AP shot" + SkillEffects="Deal full blast damage behind the target you've hit." +} diff --git a/sources/Perks/Demolitions/Skills/NiceSkillDemoConcussion.uc b/sources/Perks/Demolitions/Skills/NiceSkillDemoConcussion.uc index c04c4e7..b90c88f 100644 --- a/sources/Perks/Demolitions/Skills/NiceSkillDemoConcussion.uc +++ b/sources/Perks/Demolitions/Skills/NiceSkillDemoConcussion.uc @@ -1,6 +1,9 @@ -class NiceSkillDemoConcussion extends NiceSkill - abstract; -var float durationMult; -defaultproperties -{ durationMult=2.000000 SkillName="Concussion" SkillEffects="You stun zeds for twice longer time than usual." -} +class NiceSkillDemoConcussion extends NiceSkill + abstract; +var float durationMult; +defaultproperties +{ + durationMult=2.000000 + SkillName="Concussion" + SkillEffects="You stun zeds for twice longer time than usual." +} diff --git a/sources/Perks/Demolitions/Skills/NiceSkillDemoDirectApproach.uc b/sources/Perks/Demolitions/Skills/NiceSkillDemoDirectApproach.uc index cb6867e..1d17ae2 100644 --- a/sources/Perks/Demolitions/Skills/NiceSkillDemoDirectApproach.uc +++ b/sources/Perks/Demolitions/Skills/NiceSkillDemoDirectApproach.uc @@ -1,5 +1,7 @@ -class NiceSkillDemoDirectApproach extends NiceSkill - abstract; -defaultproperties -{ SkillName="Direct approach" SkillEffects="Your explosives will first hit target zed as a blunt before exploding." -} +class NiceSkillDemoDirectApproach extends NiceSkill + abstract; +defaultproperties +{ + SkillName="Direct approach" + SkillEffects="Your explosives will first hit target zed as a blunt before exploding." +} diff --git a/sources/Perks/Demolitions/Skills/NiceSkillDemoManiac.uc b/sources/Perks/Demolitions/Skills/NiceSkillDemoManiac.uc index c2a192b..bab6c0b 100644 --- a/sources/Perks/Demolitions/Skills/NiceSkillDemoManiac.uc +++ b/sources/Perks/Demolitions/Skills/NiceSkillDemoManiac.uc @@ -1,28 +1,36 @@ -class NiceSkillDemoManiac extends NiceSkill - abstract; -var float reloadBoostTime; -var float reloadSpeedup; -function static SkillSelected(NicePlayerController nicePlayer){ - local NicePack niceMutator; - super.SkillSelected(nicePlayer); - niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); - if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) return; - niceMutator.AddCounter("npDemoManiac", Texture'NicePackT.HudCounter.demo', false, default.class); -} -function static SkillDeSelected(NicePlayerController nicePlayer){ - local NicePack niceMutator; - super.SkillDeSelected(nicePlayer); - niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); - if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) return; - niceMutator.RemoveCounter("npDemoManiac"); -} -function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){ - local NiceHumanPawn nicePawn; - if(nicePlayer == none || counterName != "npDemoManiac") return 0; - nicePawn = NiceHumanPawn(nicePlayer.pawn); - if(nicePawn == none || nicePawn.maniacTimeout <= 0.0) return 0; - return Ceil(nicePawn.maniacTimeout); -} -defaultproperties -{ reloadBoostTime=5.000000 reloadSpeedup=1.500000 SkillName="Maniac" SkillEffects="Reload 50% faster for 5 seconds after killing something." -} +class NiceSkillDemoManiac extends NiceSkill + abstract; +var float reloadBoostTime; +var float reloadSpeedup; +function static SkillSelected(NicePlayerController nicePlayer){ + local NicePack niceMutator; + super.SkillSelected(nicePlayer); + niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); + if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) + return; + niceMutator.AddCounter("npDemoManiac", Texture'NicePackT.HudCounter.demo', false, default.class); +} +function static SkillDeSelected(NicePlayerController nicePlayer){ + local NicePack niceMutator; + super.SkillDeSelected(nicePlayer); + niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); + if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) + return; + niceMutator.RemoveCounter("npDemoManiac"); +} +function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){ + local NiceHumanPawn nicePawn; + if(nicePlayer == none || counterName != "npDemoManiac") + return 0; + nicePawn = NiceHumanPawn(nicePlayer.pawn); + if(nicePawn == none || nicePawn.maniacTimeout <= 0.0) + return 0; + return Ceil(nicePawn.maniacTimeout); +} +defaultproperties +{ + reloadBoostTime=5.000000 + reloadSpeedup=1.500000 + SkillName="Maniac" + SkillEffects="Reload 50% faster for 5 seconds after killing something." +} diff --git a/sources/Perks/Demolitions/Skills/NiceSkillDemoOffperk.uc b/sources/Perks/Demolitions/Skills/NiceSkillDemoOffperk.uc index 590f1dc..a54da1c 100644 --- a/sources/Perks/Demolitions/Skills/NiceSkillDemoOffperk.uc +++ b/sources/Perks/Demolitions/Skills/NiceSkillDemoOffperk.uc @@ -1,8 +1,13 @@ -class NiceSkillDemoOffperk extends NiceSkill - abstract; -var float damageBonus; -var float reloadBonus; -var int weightBound; -defaultproperties -{ damageBonus=1.250000 ReloadBonus=1.250000 weightBound=4 SkillName="Offperk" SkillEffects="Reload light weapons (less than 5 pounds) 25% faster and do 25% more damage with them." -} +class NiceSkillDemoOffperk extends NiceSkill + abstract; +var float damageBonus; +var float reloadBonus; +var int weightBound; +defaultproperties +{ + damageBonus=1.250000 + ReloadBonus=1.250000 + weightBound=4 + SkillName="Offperk" + SkillEffects="Reload light weapons (less than 5 pounds) 25% faster and do 25% more damage with them." +} diff --git a/sources/Perks/Demolitions/Skills/NiceSkillDemoOnperk.uc b/sources/Perks/Demolitions/Skills/NiceSkillDemoOnperk.uc index 7934afd..750cf18 100644 --- a/sources/Perks/Demolitions/Skills/NiceSkillDemoOnperk.uc +++ b/sources/Perks/Demolitions/Skills/NiceSkillDemoOnperk.uc @@ -1,7 +1,12 @@ -class NiceSkillDemoOnperk extends NiceSkill - abstract; -var float damageBonus; -var float speedBonus; -defaultproperties -{ damageBonus=1.200000 speedBonus=1.500000 bBroadcast=True SkillName="Onperk" SkillEffects="Deal 20% more damage with your blunts and make your perk weapon's projectiles fly 50% faster." -} +class NiceSkillDemoOnperk extends NiceSkill + abstract; +var float damageBonus; +var float speedBonus; +defaultproperties +{ + damageBonus=1.200000 + speedBonus=1.500000 + bBroadcast=True + SkillName="Onperk" + SkillEffects="Deal 20% more damage with your blunts and make your perk weapon's projectiles fly 50% faster." +} diff --git a/sources/Perks/Demolitions/Skills/NiceSkillDemoReactiveArmor.uc b/sources/Perks/Demolitions/Skills/NiceSkillDemoReactiveArmor.uc index 112cd6d..dfd5c3a 100644 --- a/sources/Perks/Demolitions/Skills/NiceSkillDemoReactiveArmor.uc +++ b/sources/Perks/Demolitions/Skills/NiceSkillDemoReactiveArmor.uc @@ -1,10 +1,16 @@ -class NiceSkillDemoReactiveArmor extends NiceSkill - abstract; -var float baseDamage; -var float perNadeDamage; -var float explRadius; -var float explExponent; -var float explMomentum; -defaultproperties -{ BaseDamage=3000.000000 explRadius=1000.000000 explExponent=1.000000 explMomentum=150000.000000 SkillName="Reactive armor" SkillEffects="Once per wave your death will be prevented, while zeds all around you will be blown to bits." -} +class NiceSkillDemoReactiveArmor extends NiceSkill + abstract; +var float baseDamage; +var float perNadeDamage; +var float explRadius; +var float explExponent; +var float explMomentum; +defaultproperties +{ + BaseDamage=3000.000000 + explRadius=1000.000000 + explExponent=1.000000 + explMomentum=150000.000000 + SkillName="Reactive armor" + SkillEffects="Once per wave your death will be prevented, while zeds all around you will be blown to bits." +} diff --git a/sources/Perks/Demolitions/Skills/NiceSkillDemoVolatile.uc b/sources/Perks/Demolitions/Skills/NiceSkillDemoVolatile.uc index d61a310..632b9c4 100644 --- a/sources/Perks/Demolitions/Skills/NiceSkillDemoVolatile.uc +++ b/sources/Perks/Demolitions/Skills/NiceSkillDemoVolatile.uc @@ -1,8 +1,13 @@ -class NiceSkillDemoVolatile extends NiceSkill - abstract; -var float safeDistanceMult; -var float explRangeMult; -var float falloffMult; -defaultproperties -{ safeDistanceMult=0.500000 explRangeMult=1.000000 falloffMult=0.500000 SkillName="Volatile" SkillEffects="Safe range for your explosives is halved and explosion damage experiences smaller fall off." -} +class NiceSkillDemoVolatile extends NiceSkill + abstract; +var float safeDistanceMult; +var float explRangeMult; +var float falloffMult; +defaultproperties +{ + safeDistanceMult=0.500000 + explRangeMult=1.000000 + falloffMult=0.500000 + SkillName="Volatile" + SkillEffects="Safe range for your explosives is halved and explosion damage experiences smaller fall off." +} diff --git a/sources/Perks/Demolitions/Skills/NiceSkillDemoZEDDuckAndCover.uc b/sources/Perks/Demolitions/Skills/NiceSkillDemoZEDDuckAndCover.uc index 9b4c0b1..3e97932 100644 --- a/sources/Perks/Demolitions/Skills/NiceSkillDemoZEDDuckAndCover.uc +++ b/sources/Perks/Demolitions/Skills/NiceSkillDemoZEDDuckAndCover.uc @@ -1,5 +1,7 @@ -class NiceSkillDemoZEDDuckAndCover extends NiceSkill - abstract; -defaultproperties -{ SkillName="Duck and cover" SkillEffects="During zed time you can't deal yourself any damage." -} +class NiceSkillDemoZEDDuckAndCover extends NiceSkill + abstract; +defaultproperties +{ + SkillName="Duck and cover" + SkillEffects="During zed time you can't deal yourself any damage." +} diff --git a/sources/Perks/Demolitions/Skills/NiceSkillDemoZEDFullBlast.uc b/sources/Perks/Demolitions/Skills/NiceSkillDemoZEDFullBlast.uc index 69c7f38..0a4fc65 100644 --- a/sources/Perks/Demolitions/Skills/NiceSkillDemoZEDFullBlast.uc +++ b/sources/Perks/Demolitions/Skills/NiceSkillDemoZEDFullBlast.uc @@ -1,6 +1,9 @@ -class NiceSkillDemoZEDFullBlast extends NiceSkill - abstract; -var float explRadiusMult; -defaultproperties -{ explRadiusMult=1.350000 SkillName="Full blast" SkillEffects="During zed time your explosions have 35% larger radius and their damage doesn't suffer from a fall off." -} +class NiceSkillDemoZEDFullBlast extends NiceSkill + abstract; +var float explRadiusMult; +defaultproperties +{ + explRadiusMult=1.350000 + SkillName="Full blast" + SkillEffects="During zed time your explosions have 35% larger radius and their damage doesn't suffer from a fall off." +} diff --git a/sources/Perks/Enforcer/NiceDamageTypeVetEnforcer.uc b/sources/Perks/Enforcer/NiceDamageTypeVetEnforcer.uc index 3c0b1fd..e8e3fbb 100644 --- a/sources/Perks/Enforcer/NiceDamageTypeVetEnforcer.uc +++ b/sources/Perks/Enforcer/NiceDamageTypeVetEnforcer.uc @@ -1,10 +1,14 @@ -class NiceDamageTypeVetEnforcer extends NiceWeaponDamageType - abstract; - -static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){ - if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetSupportExp', Int(Float(Amount) * class'NicePack'.default.vetSupportDamageExpCost * getScale(HL))); -} - -defaultproperties -{ badDecapMod=1.000000 bIsProjectile=True HeadShotDamageMult=1.500000 +class NiceDamageTypeVetEnforcer extends NiceWeaponDamageType + abstract; + +static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){ + if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) + SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetSupportExp', Int(Float(Amount) * class'NicePack'.default.vetSupportDamageExpCost * getScale(HL))); +} + +defaultproperties +{ + badDecapMod=1.000000 + bIsProjectile=True + HeadShotDamageMult=1.500000 } \ No newline at end of file diff --git a/sources/Perks/Enforcer/NiceDamageTypeVetEnforcerBullets.uc b/sources/Perks/Enforcer/NiceDamageTypeVetEnforcerBullets.uc index 28cde3b..7aacb49 100644 --- a/sources/Perks/Enforcer/NiceDamageTypeVetEnforcerBullets.uc +++ b/sources/Perks/Enforcer/NiceDamageTypeVetEnforcerBullets.uc @@ -1,7 +1,10 @@ -class NiceDamageTypeVetEnforcerBullets extends NiceDamageTypeVetEnforcer - abstract; - -defaultproperties -{ - badDecapMod=0.2500000 goodDecapMod=0.500000 bodyDestructionMult=1.000000 HeadShotDamageMult=1.000000 +class NiceDamageTypeVetEnforcerBullets extends NiceDamageTypeVetEnforcer + abstract; + +defaultproperties +{ + badDecapMod=0.2500000 + goodDecapMod=0.500000 + bodyDestructionMult=1.000000 + HeadShotDamageMult=1.000000 } \ No newline at end of file diff --git a/sources/Perks/Enforcer/NiceVetSupportExp.uc b/sources/Perks/Enforcer/NiceVetSupportExp.uc index f602324..408a872 100644 --- a/sources/Perks/Enforcer/NiceVetSupportExp.uc +++ b/sources/Perks/Enforcer/NiceVetSupportExp.uc @@ -1,4 +1,5 @@ -class NiceVetSupportExp extends SRCustomProgressInt; -defaultproperties -{ ProgressName="Enforcer exp." -} +class NiceVetSupportExp extends SRCustomProgressInt; +defaultproperties +{ + ProgressName="Enforcer exp." +} diff --git a/sources/Perks/Enforcer/Skills/NiceSkillEnforcerBombard.uc b/sources/Perks/Enforcer/Skills/NiceSkillEnforcerBombard.uc index e47f9f9..e38133a 100644 --- a/sources/Perks/Enforcer/Skills/NiceSkillEnforcerBombard.uc +++ b/sources/Perks/Enforcer/Skills/NiceSkillEnforcerBombard.uc @@ -1,7 +1,11 @@ -class NiceSkillEnforcerBombard extends NiceSkill - abstract; -var float stunMult; -var float spreadMult; -defaultproperties -{ stunMult=3.000000 spreadMult=0.500000 SkillName="Bombard" SkillEffects="Your perked weapons are 3 times as good at stunning." -} +class NiceSkillEnforcerBombard extends NiceSkill + abstract; +var float stunMult; +var float spreadMult; +defaultproperties +{ + stunMult=3.000000 + spreadMult=0.500000 + SkillName="Bombard" + SkillEffects="Your perked weapons are 3 times as good at stunning." +} diff --git a/sources/Perks/Enforcer/Skills/NiceSkillEnforcerMultitasker.uc b/sources/Perks/Enforcer/Skills/NiceSkillEnforcerMultitasker.uc index f2af686..e7103a4 100644 --- a/sources/Perks/Enforcer/Skills/NiceSkillEnforcerMultitasker.uc +++ b/sources/Perks/Enforcer/Skills/NiceSkillEnforcerMultitasker.uc @@ -1,6 +1,9 @@ -class NiceSkillEnforcerMultitasker extends NiceSkill - abstract; -var float reloadSlowDown; -defaultproperties -{ reloadSlowDown=5.000000 SkillName="Multitasker" SkillEffects="Reload holstered weapons at five times as much time." -} +class NiceSkillEnforcerMultitasker extends NiceSkill + abstract; +var float reloadSlowDown; +defaultproperties +{ + reloadSlowDown=5.000000 + SkillName="Multitasker" + SkillEffects="Reload holstered weapons at five times as much time." +} diff --git a/sources/Perks/Enforcer/Skills/NiceSkillSupportAntiZed.uc b/sources/Perks/Enforcer/Skills/NiceSkillSupportAntiZed.uc index 485ecf8..dcb8e86 100644 --- a/sources/Perks/Enforcer/Skills/NiceSkillSupportAntiZed.uc +++ b/sources/Perks/Enforcer/Skills/NiceSkillSupportAntiZed.uc @@ -1,5 +1,7 @@ -class NiceSkillSupportAntiZed extends NiceSkill - abstract; -defaultproperties -{ SkillName="Anti-zed rounds" SkillEffects="When shotgun pellets pass screaming siren, they gain x4 damage boost." -} +class NiceSkillSupportAntiZed extends NiceSkill + abstract; +defaultproperties +{ + SkillName="Anti-zed rounds" + SkillEffects="When shotgun pellets pass screaming siren, they gain x4 damage boost." +} diff --git a/sources/Perks/Enforcer/Skills/NiceSkillSupportArmory.uc b/sources/Perks/Enforcer/Skills/NiceSkillSupportArmory.uc index 62199a2..94e3eca 100644 --- a/sources/Perks/Enforcer/Skills/NiceSkillSupportArmory.uc +++ b/sources/Perks/Enforcer/Skills/NiceSkillSupportArmory.uc @@ -1,5 +1,8 @@ -class NiceSkillSupportArmory extends NiceSkill - abstract; -defaultproperties -{ bBroadcast=True SkillName="Armory" SkillEffects="Once per wave your team-mates will receive armored jacket when they run out of armor." -} +class NiceSkillSupportArmory extends NiceSkill + abstract; +defaultproperties +{ + bBroadcast=True + SkillName="Armory" + SkillEffects="Once per wave your team-mates will receive armored jacket when they run out of armor." +} diff --git a/sources/Perks/Enforcer/Skills/NiceSkillSupportBigGameHunter.uc b/sources/Perks/Enforcer/Skills/NiceSkillSupportBigGameHunter.uc index b2ff1d4..74a154a 100644 --- a/sources/Perks/Enforcer/Skills/NiceSkillSupportBigGameHunter.uc +++ b/sources/Perks/Enforcer/Skills/NiceSkillSupportBigGameHunter.uc @@ -1,6 +1,9 @@ -class NiceSkillSupportBigGameHunter extends NiceSkillGenAmmo - abstract; -var float damageBonus; -defaultproperties -{ damageBonus=1.600000 SkillName="Big-game hunter" SkillEffects="Gain 60% damage bonus with grenades, but carry 5 grenades less." -} +class NiceSkillSupportBigGameHunter extends NiceSkillGenAmmo + abstract; +var float damageBonus; +defaultproperties +{ + damageBonus=1.600000 + SkillName="Big-game hunter" + SkillEffects="Gain 60% damage bonus with grenades, but carry 5 grenades less." +} diff --git a/sources/Perks/Enforcer/Skills/NiceSkillSupportCautious.uc b/sources/Perks/Enforcer/Skills/NiceSkillSupportCautious.uc index f2d1627..9c6c675 100644 --- a/sources/Perks/Enforcer/Skills/NiceSkillSupportCautious.uc +++ b/sources/Perks/Enforcer/Skills/NiceSkillSupportCautious.uc @@ -1,5 +1,7 @@ -class NiceSkillSupportCautious extends NiceSkill - abstract; -defaultproperties -{ SkillName="Cautious" SkillEffects="Your grenades won't explode if you're too close to them." -} +class NiceSkillSupportCautious extends NiceSkill + abstract; +defaultproperties +{ + SkillName="Cautious" + SkillEffects="Your grenades won't explode if you're too close to them." +} diff --git a/sources/Perks/Enforcer/Skills/NiceSkillSupportDiversity.uc b/sources/Perks/Enforcer/Skills/NiceSkillSupportDiversity.uc index 4929aad..530a187 100644 --- a/sources/Perks/Enforcer/Skills/NiceSkillSupportDiversity.uc +++ b/sources/Perks/Enforcer/Skills/NiceSkillSupportDiversity.uc @@ -1,18 +1,22 @@ -class NiceSkillSupportDiversity extends NiceSkill - abstract; -var int bonusWeight; -static function UpdateWeight(NicePlayerController nicePlayer){ - local NiceHumanPawn nicePawn; - if(nicePawn == none || nicePawn.KFPRI == none) return; - nicePawn.maxCarryWeight = nicePawn.default.maxCarryWeight; - if(nicePawn.KFPRI.clientVeteranSkill != none) nicePawn.maxCarryWeight += nicePawn.KFPRI.clientVeteranSkill.static.AddCarryMaxWeight(nicePawn.KFPRI); -} -function static SkillSelected(NicePlayerController nicePlayer){ - UpdateWeight(nicePlayer); -} -function static SkillDeSelected(NicePlayerController nicePlayer){ - UpdateWeight(nicePlayer); -} -defaultproperties -{ bonusWeight=5 SkillName="Diversity" SkillEffects="Gain +5 weight slots." -} +class NiceSkillSupportDiversity extends NiceSkill + abstract; +var int bonusWeight; +static function UpdateWeight(NicePlayerController nicePlayer){ + local NiceHumanPawn nicePawn; + if(nicePawn == none || nicePawn.KFPRI == none) return; + nicePawn.maxCarryWeight = nicePawn.default.maxCarryWeight; + if(nicePawn.KFPRI.clientVeteranSkill != none) + nicePawn.maxCarryWeight += nicePawn.KFPRI.clientVeteranSkill.static.AddCarryMaxWeight(nicePawn.KFPRI); +} +function static SkillSelected(NicePlayerController nicePlayer){ + UpdateWeight(nicePlayer); +} +function static SkillDeSelected(NicePlayerController nicePlayer){ + UpdateWeight(nicePlayer); +} +defaultproperties +{ + bonusWeight=5 + SkillName="Diversity" + SkillEffects="Gain +5 weight slots." +} diff --git a/sources/Perks/Enforcer/Skills/NiceSkillSupportGraze.uc b/sources/Perks/Enforcer/Skills/NiceSkillSupportGraze.uc index 5815350..eaaaaa4 100644 --- a/sources/Perks/Enforcer/Skills/NiceSkillSupportGraze.uc +++ b/sources/Perks/Enforcer/Skills/NiceSkillSupportGraze.uc @@ -1,7 +1,11 @@ -class NiceSkillSupportGraze extends NiceSkill - abstract; -var float hsBonusZoneMult; -var float grazeDamageMult; -defaultproperties -{ hsBonusZoneMult=1.500000 grazeDamageMult=0.750000 SkillName="Graze" SkillEffects="Your perked projectile can hit zeds' extended head zone for 75% of damage even if they miss the normal one." -} +class NiceSkillSupportGraze extends NiceSkill + abstract; +var float hsBonusZoneMult; +var float grazeDamageMult; +defaultproperties +{ + hsBonusZoneMult=1.500000 + grazeDamageMult=0.750000 + SkillName="Graze" + SkillEffects="Your perked projectile can hit zeds' extended head zone for 75% of damage even if they miss the normal one." +} diff --git a/sources/Perks/Enforcer/Skills/NiceSkillSupportObsessive.uc b/sources/Perks/Enforcer/Skills/NiceSkillSupportObsessive.uc index 323596d..dd22d03 100644 --- a/sources/Perks/Enforcer/Skills/NiceSkillSupportObsessive.uc +++ b/sources/Perks/Enforcer/Skills/NiceSkillSupportObsessive.uc @@ -1,7 +1,11 @@ -class NiceSkillSupportObsessive extends NiceSkill - abstract; -var float reloadLevel; -var float reloadBonus; -defaultproperties -{ reloadLevel=0.650000 ReloadBonus=1.500000 SkillName="Obsessive" SkillEffects="Reload 50% faster when you lack at most 35% of bullets in the magazine." -} +class NiceSkillSupportObsessive extends NiceSkill + abstract; +var float reloadLevel; +var float reloadBonus; +defaultproperties +{ + reloadLevel=0.650000 + ReloadBonus=1.500000 + SkillName="Obsessive" + SkillEffects="Reload 50% faster when you lack at most 35% of bullets in the magazine." +} diff --git a/sources/Perks/Enforcer/Skills/NiceSkillSupportSlugs.uc b/sources/Perks/Enforcer/Skills/NiceSkillSupportSlugs.uc index e0c4dda..7edb741 100644 --- a/sources/Perks/Enforcer/Skills/NiceSkillSupportSlugs.uc +++ b/sources/Perks/Enforcer/Skills/NiceSkillSupportSlugs.uc @@ -1,5 +1,7 @@ -class NiceSkillSupportSlugs extends NiceSkill - abstract; -defaultproperties -{ SkillName="Slugs" SkillEffects="Pellets shots replaced by slugs on shotguns." -} +class NiceSkillSupportSlugs extends NiceSkill + abstract; +defaultproperties +{ + SkillName="Slugs" + SkillEffects="Pellets shots replaced by slugs on shotguns." +} diff --git a/sources/Perks/Enforcer/Skills/NiceSkillSupportStubbornness.uc b/sources/Perks/Enforcer/Skills/NiceSkillSupportStubbornness.uc index a1a1b73..9d4515f 100644 --- a/sources/Perks/Enforcer/Skills/NiceSkillSupportStubbornness.uc +++ b/sources/Perks/Enforcer/Skills/NiceSkillSupportStubbornness.uc @@ -1,6 +1,9 @@ -class NiceSkillSupportStubbornness extends NiceSkillGenAmmo - abstract; -var float penLossRed; -defaultproperties -{ penLossRed=0.500000 SkillName="Stubbornness" SkillEffects="50% better penetration." -} +class NiceSkillSupportStubbornness extends NiceSkillGenAmmo + abstract; +var float penLossRed; +defaultproperties +{ + penLossRed=0.500000 + SkillName="Stubbornness" + SkillEffects="50% better penetration." +} diff --git a/sources/Perks/Enforcer/Skills/NiceSkillSupportZEDBore.uc b/sources/Perks/Enforcer/Skills/NiceSkillSupportZEDBore.uc index 44829b4..4296da6 100644 --- a/sources/Perks/Enforcer/Skills/NiceSkillSupportZEDBore.uc +++ b/sources/Perks/Enforcer/Skills/NiceSkillSupportZEDBore.uc @@ -1,6 +1,9 @@ -class NiceSkillSupportZEDBore extends NiceSkill - abstract; -var float minHeadshotPrecision; -defaultproperties -{ minHeadshotPrecision=0.100000 SkillName="Bore" SkillEffects="During zed time your bullets' bounce between a zed's body and head 2 times before leaving it." -} +class NiceSkillSupportZEDBore extends NiceSkill + abstract; +var float minHeadshotPrecision; +defaultproperties +{ + minHeadshotPrecision=0.100000 + SkillName="Bore" + SkillEffects="During zed time your bullets' bounce between a zed's body and head 2 times before leaving it." +} diff --git a/sources/Perks/Enforcer/Skills/NiceSkillSupportZEDBulletStorm.uc b/sources/Perks/Enforcer/Skills/NiceSkillSupportZEDBulletStorm.uc index ce4ebfe..b282f59 100644 --- a/sources/Perks/Enforcer/Skills/NiceSkillSupportZEDBulletStorm.uc +++ b/sources/Perks/Enforcer/Skills/NiceSkillSupportZEDBulletStorm.uc @@ -1,7 +1,11 @@ -class NiceSkillSupportZEDBulletStorm extends NiceSkill - abstract; -var float damageCut; -var float projCountMult; -defaultproperties -{ damageCut=0.500000 projCountMult=7.000000 SkillName="Bullet storm" SkillEffects="During zed time you fire seven times as much projectiles, that deal half as much damage." -} +class NiceSkillSupportZEDBulletStorm extends NiceSkill + abstract; +var float damageCut; +var float projCountMult; +defaultproperties +{ + damageCut=0.500000 + projCountMult=7.000000 + SkillName="Bullet storm" + SkillEffects="During zed time you fire seven times as much projectiles, that deal half as much damage." +} diff --git a/sources/Perks/FieldMedic/NiceDamageTypeVetMedic.uc b/sources/Perks/FieldMedic/NiceDamageTypeVetMedic.uc index d2a5d18..7866a96 100644 --- a/sources/Perks/FieldMedic/NiceDamageTypeVetMedic.uc +++ b/sources/Perks/FieldMedic/NiceDamageTypeVetMedic.uc @@ -1,8 +1,9 @@ -class NiceDamageTypeVetMedic extends NiceWeaponDamageType - abstract; -static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){ - if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetFieldMedicExp', Int(Float(Amount) * class'NicePack'.default.vetFieldMedicDmgExpCost * getScale(HL))); -} -defaultproperties -{ -} +class NiceDamageTypeVetMedic extends NiceWeaponDamageType + abstract; +static function AwardNiceDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount, int HL){ + if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) + SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetFieldMedicExp', Int(Float(Amount) * class'NicePack'.default.vetFieldMedicDmgExpCost * getScale(HL))); +} +defaultproperties +{ +} diff --git a/sources/Perks/FieldMedic/NiceVetFieldMedicExp.uc b/sources/Perks/FieldMedic/NiceVetFieldMedicExp.uc index a73aa42..70cc689 100644 --- a/sources/Perks/FieldMedic/NiceVetFieldMedicExp.uc +++ b/sources/Perks/FieldMedic/NiceVetFieldMedicExp.uc @@ -1,4 +1,5 @@ -class NiceVetFieldMedicExp extends SRCustomProgressInt; -defaultproperties -{ ProgressName="Field Medic exp." -} +class NiceVetFieldMedicExp extends SRCustomProgressInt; +defaultproperties +{ + ProgressName="Field Medic exp." +} diff --git a/sources/Perks/FieldMedic/Skills/NiceDamTypeDrug.uc b/sources/Perks/FieldMedic/Skills/NiceDamTypeDrug.uc index fd5b466..b0e36ad 100644 --- a/sources/Perks/FieldMedic/Skills/NiceDamTypeDrug.uc +++ b/sources/Perks/FieldMedic/Skills/NiceDamTypeDrug.uc @@ -1,5 +1,8 @@ -class NiceDamTypeDrug extends NiceWeaponDamageType - abstract; -defaultproperties -{ FemaleSuicide="%o overdosed." MaleSuicide="%o overdosed." bArmorStops=False -} +class NiceDamTypeDrug extends NiceWeaponDamageType + abstract; +defaultproperties +{ + FemaleSuicide="%o overdosed." + MaleSuicide="%o overdosed." + bArmorStops=False +} diff --git a/sources/Perks/FieldMedic/Skills/NiceSkillMedicAdrenalineShot.uc b/sources/Perks/FieldMedic/Skills/NiceSkillMedicAdrenalineShot.uc index afd17ec..8544670 100644 --- a/sources/Perks/FieldMedic/Skills/NiceSkillMedicAdrenalineShot.uc +++ b/sources/Perks/FieldMedic/Skills/NiceSkillMedicAdrenalineShot.uc @@ -1,8 +1,14 @@ -class NiceSkillMedicAdrenalineShot extends NiceSkill - abstract; -var float boostTime; -var float minHealth; -var float speedBoost, resistBoost; -defaultproperties -{ boostTime=1.000000 minHealth=50.000000 speedBoost=2.000000 resistBoost=1.500000 SkillName="Adrenaline shot" SkillEffects="Wounded players healed by you gain boost in speed (up to 100%) and damage resistance (up to 50%) for one second." -} +class NiceSkillMedicAdrenalineShot extends NiceSkill + abstract; +var float boostTime; +var float minHealth; +var float speedBoost, resistBoost; +defaultproperties +{ + boostTime=1.000000 + minHealth=50.000000 + speedBoost=2.000000 + resistBoost=1.500000 + SkillName="Adrenaline shot" + SkillEffects="Wounded players healed by you gain boost in speed (up to 100%) and damage resistance (up to 50%) for one second." +} diff --git a/sources/Perks/FieldMedic/Skills/NiceSkillMedicAimAssistance.uc b/sources/Perks/FieldMedic/Skills/NiceSkillMedicAimAssistance.uc index 587388c..abdc938 100644 --- a/sources/Perks/FieldMedic/Skills/NiceSkillMedicAimAssistance.uc +++ b/sources/Perks/FieldMedic/Skills/NiceSkillMedicAimAssistance.uc @@ -1,6 +1,9 @@ -class NiceSkillMedicAimAssistance extends NiceSkill - abstract; -var float headIncrease; -defaultproperties -{ headIncrease=1.500000 SkillName="Aim assistance" SkillEffects="Zeds' critical points are 50% bigger for you." -} +class NiceSkillMedicAimAssistance extends NiceSkill + abstract; +var float headIncrease; +defaultproperties +{ + headIncrease=1.500000 + SkillName="Aim assistance" + SkillEffects="Zeds' critical points are 50% bigger for you." +} diff --git a/sources/Perks/FieldMedic/Skills/NiceSkillMedicArmament.uc b/sources/Perks/FieldMedic/Skills/NiceSkillMedicArmament.uc index 25f796a..20970ad 100644 --- a/sources/Perks/FieldMedic/Skills/NiceSkillMedicArmament.uc +++ b/sources/Perks/FieldMedic/Skills/NiceSkillMedicArmament.uc @@ -1,5 +1,7 @@ -class NiceSkillMedicArmament extends NiceSkill - abstract; -defaultproperties -{ SkillName="Armament" SkillEffects="Your grenades restore armor of the other players, but you can't refill them with ammoboxes." -} +class NiceSkillMedicArmament extends NiceSkill + abstract; +defaultproperties +{ + SkillName="Armament" + SkillEffects="Your grenades restore armor of the other players, but you can't refill them with ammoboxes." +} diff --git a/sources/Perks/FieldMedic/Skills/NiceSkillMedicInjection.uc b/sources/Perks/FieldMedic/Skills/NiceSkillMedicInjection.uc index 05379fa..616d379 100644 --- a/sources/Perks/FieldMedic/Skills/NiceSkillMedicInjection.uc +++ b/sources/Perks/FieldMedic/Skills/NiceSkillMedicInjection.uc @@ -1,8 +1,17 @@ -class NiceSkillMedicInjection extends NiceSkill - abstract; -var float boostTime, painTime; -var float withdrawalDamage, healthBoost; -var float bonusAccuracy, bonusMeleeDmg, bonusSpeed, bonusReload; -defaultproperties -{ boostTime=30.000000 painTime=60.000000 withdrawalDamage=5.000000 bonusAccuracy=3.000000 bonusMeleeDmg=2.000000 bonusSpeed=2.000000 bonusReload=2.000000 SkillName="Injection" SkillEffects="Once a wave your teammates can pickup a drug from you that will greatly boost their performance for 30 seconds, but suffer from withdrawal afterwards." -} +class NiceSkillMedicInjection extends NiceSkill + abstract; +var float boostTime, painTime; +var float withdrawalDamage, healthBoost; +var float bonusAccuracy, bonusMeleeDmg, bonusSpeed, bonusReload; +defaultproperties +{ + boostTime=30.000000 + painTime=60.000000 + withdrawalDamage=5.000000 + bonusAccuracy=3.000000 + bonusMeleeDmg=2.000000 + bonusSpeed=2.000000 + bonusReload=2.000000 + SkillName="Injection" + SkillEffects="Once a wave your teammates can pickup a drug from you that will greatly boost their performance for 30 seconds, but suffer from withdrawal afterwards." +} diff --git a/sources/Perks/FieldMedic/Skills/NiceSkillMedicPesticide.uc b/sources/Perks/FieldMedic/Skills/NiceSkillMedicPesticide.uc index 711d0e2..dcf9d50 100644 --- a/sources/Perks/FieldMedic/Skills/NiceSkillMedicPesticide.uc +++ b/sources/Perks/FieldMedic/Skills/NiceSkillMedicPesticide.uc @@ -1,5 +1,7 @@ -class NiceSkillMedicPesticide extends NiceSkill - abstract; -defaultproperties -{ SkillName="Pesticide" SkillEffects="Your grenades effect lasts only half the original time, but they drive small zeds to fight each other." -} +class NiceSkillMedicPesticide extends NiceSkill + abstract; +defaultproperties +{ + SkillName="Pesticide" + SkillEffects="Your grenades effect lasts only half the original time, but they drive small zeds to fight each other." +} diff --git a/sources/Perks/FieldMedic/Skills/NiceSkillMedicRegeneration.uc b/sources/Perks/FieldMedic/Skills/NiceSkillMedicRegeneration.uc index 3ddb9d6..cfcec9a 100644 --- a/sources/Perks/FieldMedic/Skills/NiceSkillMedicRegeneration.uc +++ b/sources/Perks/FieldMedic/Skills/NiceSkillMedicRegeneration.uc @@ -1,6 +1,9 @@ -class NiceSkillMedicRegeneration extends NiceSkill - abstract; -var float regenFrequency; -defaultproperties -{ regenFrequency=0.500000 SkillName="Regeneration" SkillEffects="You regenerate 2 hp per second." -} +class NiceSkillMedicRegeneration extends NiceSkill + abstract; +var float regenFrequency; +defaultproperties +{ + regenFrequency=0.500000 + SkillName="Regeneration" + SkillEffects="You regenerate 2 hp per second." +} diff --git a/sources/Perks/FieldMedic/Skills/NiceSkillMedicSymbioticHealth.uc b/sources/Perks/FieldMedic/Skills/NiceSkillMedicSymbioticHealth.uc index 76b85d9..e79c183 100644 --- a/sources/Perks/FieldMedic/Skills/NiceSkillMedicSymbioticHealth.uc +++ b/sources/Perks/FieldMedic/Skills/NiceSkillMedicSymbioticHealth.uc @@ -1,6 +1,9 @@ -class NiceSkillMedicSymbioticHealth extends NiceSkill - abstract; -var float selfBoost; -defaultproperties -{ selfBoost=0.250000 SkillName="Symbiotic health" SkillEffects="Healing teammates will heal you 25% of your total health." -} +class NiceSkillMedicSymbioticHealth extends NiceSkill + abstract; +var float selfBoost; +defaultproperties +{ + selfBoost=0.250000 + SkillName="Symbiotic health" + SkillEffects="Healing teammates will heal you 25% of your total health." +} diff --git a/sources/Perks/FieldMedic/Skills/NiceSkillMedicTranquilizer.uc b/sources/Perks/FieldMedic/Skills/NiceSkillMedicTranquilizer.uc index 551ffa7..9027dd6 100644 --- a/sources/Perks/FieldMedic/Skills/NiceSkillMedicTranquilizer.uc +++ b/sources/Perks/FieldMedic/Skills/NiceSkillMedicTranquilizer.uc @@ -1,6 +1,8 @@ -class NiceSkillMedicTranquilizer extends NiceSkill - abstract; -var float healingDebuff; -defaultproperties -{ SkillName="Tranquilizer" SkillEffects="Zeds hit by your darts can be stunned by head-damage, but your darts lose 25% of their healing efficiency." -} +class NiceSkillMedicTranquilizer extends NiceSkill + abstract; +var float healingDebuff; +defaultproperties +{ + SkillName="Tranquilizer" + SkillEffects="Zeds hit by your darts can be stunned by head-damage, but your darts lose 25% of their healing efficiency." +} diff --git a/sources/Perks/FieldMedic/Skills/NiceSkillMedicZEDFrenzy.uc b/sources/Perks/FieldMedic/Skills/NiceSkillMedicZEDFrenzy.uc index 0ad3bb9..65e2793 100644 --- a/sources/Perks/FieldMedic/Skills/NiceSkillMedicZEDFrenzy.uc +++ b/sources/Perks/FieldMedic/Skills/NiceSkillMedicZEDFrenzy.uc @@ -1,6 +1,9 @@ -class NiceSkillMedicZEDFrenzy extends NiceSkill - abstract; -var float madnessTime; -defaultproperties -{ madnessTime=30.000000 SkillName="Frenzy" SkillEffects="Zeds hit by your darts during zed time will become rabid and attack anything indiscriminately for 30 seconds." -} +class NiceSkillMedicZEDFrenzy extends NiceSkill + abstract; +var float madnessTime; +defaultproperties +{ + madnessTime=30.000000 + SkillName="Frenzy" + SkillEffects="Zeds hit by your darts during zed time will become rabid and attack anything indiscriminately for 30 seconds." +} diff --git a/sources/Perks/FieldMedic/Skills/NiceSkillMedicZEDHeavenCanceller.uc b/sources/Perks/FieldMedic/Skills/NiceSkillMedicZEDHeavenCanceller.uc index e29f449..cc449e5 100644 --- a/sources/Perks/FieldMedic/Skills/NiceSkillMedicZEDHeavenCanceller.uc +++ b/sources/Perks/FieldMedic/Skills/NiceSkillMedicZEDHeavenCanceller.uc @@ -1,5 +1,7 @@ -class NiceSkillMedicZEDHeavenCanceller extends NiceSkill - abstract; -defaultproperties -{ SkillName="Heaven canceller" SkillEffects="During zed-time your darts instantlyrestore health of your teammates and make them invincible for the duration." -} +class NiceSkillMedicZEDHeavenCanceller extends NiceSkill + abstract; +defaultproperties +{ + SkillName="Heaven canceller" + SkillEffects="During zed-time your darts instantlyrestore health of your teammates and make them invincible for the duration." +} diff --git a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerDetermination.uc b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerDetermination.uc index 91f1baf..e6350b7 100644 --- a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerDetermination.uc +++ b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerDetermination.uc @@ -1,7 +1,11 @@ -class NiceSkillEnforcerDetermination extends NiceSkill - abstract; -var int healthBound; -var float addedResist; -defaultproperties -{ healthBound=50 addedResist=0.500000 SkillName="Determination" SkillEffects="Receive 50% less damage when your health falls below 50 mark." -} +class NiceSkillEnforcerDetermination extends NiceSkill + abstract; +var int healthBound; +var float addedResist; +defaultproperties +{ + healthBound=50 + addedResist=0.500000 + SkillName="Determination" + SkillEffects="Receive 50% less damage when your health falls below 50 mark." +} diff --git a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerFullCounter.uc b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerFullCounter.uc index 2d43805..f8f818b 100644 --- a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerFullCounter.uc +++ b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerFullCounter.uc @@ -1,33 +1,43 @@ -class NiceSkillEnforcerFullCounter extends NiceSkill - abstract; -var int layersAmount; -var float coolDown; -var float damageReduction; -var float damageReductionWeak; -function static SkillSelected(NicePlayerController nicePlayer){ - local NicePack niceMutator; - local NiceHumanPawn nicePawn; - super.SkillSelected(nicePlayer); - niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); - if(nicePlayer != none) nicePawn = NiceHumanPawn(nicePlayer.pawn); - if(nicePawn != none) nicePawn.hmgShieldLevel = default.layersAmount; - if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) return; - niceMutator.AddCounter("npHMGFullCounter", Texture'NicePackT.HudCounter.fullCounter', true, default.class); -} -function static SkillDeSelected(NicePlayerController nicePlayer){ - local NicePack niceMutator; - super.SkillDeSelected(nicePlayer); - niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); - if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) return; - niceMutator.RemoveCounter("npHMGFullCounter"); -} -function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){ - local NiceHumanPawn nicePawn; - if(nicePlayer == none || counterName != "npHMGFullCounter") return 0; - nicePawn = NiceHumanPawn(nicePlayer.pawn); - if(nicePawn == none) return 0; - return nicePawn.hmgShieldLevel; -} -defaultproperties -{ layersAmount=5 cooldown=15.000000 SkillName="Full counter" SkillEffects="Gives you 5 protection layers, each of which can block a weak hit. One layer restores 15 seconds after you've been hit. Can't withstand strong attacks or attacks of huge enough zeds." -} +class NiceSkillEnforcerFullCounter extends NiceSkill + abstract; +var int layersAmount; +var float coolDown; +var float damageReduction; +var float damageReductionWeak; +function static SkillSelected(NicePlayerController nicePlayer){ + local NicePack niceMutator; + local NiceHumanPawn nicePawn; + super.SkillSelected(nicePlayer); + niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); + if(nicePlayer != none) + nicePawn = NiceHumanPawn(nicePlayer.pawn); + if(nicePawn != none) + nicePawn.hmgShieldLevel = default.layersAmount; + if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) + return; + niceMutator.AddCounter("npHMGFullCounter", Texture'NicePackT.HudCounter.fullCounter', true, default.class); +} +function static SkillDeSelected(NicePlayerController nicePlayer){ + local NicePack niceMutator; + super.SkillDeSelected(nicePlayer); + niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); + if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) + return; + niceMutator.RemoveCounter("npHMGFullCounter"); +} +function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){ + local NiceHumanPawn nicePawn; + if(nicePlayer == none || counterName != "npHMGFullCounter") + return 0; + nicePawn = NiceHumanPawn(nicePlayer.pawn); + if(nicePawn == none) + return 0; + return nicePawn.hmgShieldLevel; +} +defaultproperties +{ + layersAmount=5 + cooldown=15.000000 + SkillName="Full counter" + SkillEffects="Gives you 5 protection layers, each of which can block a weak hit. One layer restores 15 seconds after you've been hit. Can't withstand strong attacks or attacks of huge enough zeds." +} diff --git a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerUnshakable.uc b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerUnshakable.uc index dcea096..0ab5b42 100644 --- a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerUnshakable.uc +++ b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerUnshakable.uc @@ -1,6 +1,9 @@ -class NiceSkillEnforcerUnshakable extends NiceSkill - abstract; -var float skillResist; -defaultproperties -{ skillResist=0.150000 SkillName="Unshakable" SkillEffects="Your screen doesn't shake or blur, and you gain 15% resistance to all damage." -} +class NiceSkillEnforcerUnshakable extends NiceSkill + abstract; +var float skillResist; +defaultproperties +{ + skillResist=0.150000 + SkillName="Unshakable" + SkillEffects="Your screen doesn't shake or blur, and you gain 15% resistance to all damage." +} diff --git a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerUnstoppable.uc b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerUnstoppable.uc index 84b7ab7..f3eb630 100644 --- a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerUnstoppable.uc +++ b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerUnstoppable.uc @@ -1,6 +1,9 @@ -class NiceSkillEnforcerUnstoppable extends NiceSkill - abstract; -var float speedMult; -defaultproperties -{ speedMult=0.750000 SkillName="Unstoppable" SkillEffects="Your speed doesn't decrease from additional weight, low health, poison or siren's pull, but you also receive -25% speed penalty." -} +class NiceSkillEnforcerUnstoppable extends NiceSkill + abstract; +var float speedMult; +defaultproperties +{ + speedMult=0.750000 + SkillName="Unstoppable" + SkillEffects="Your speed doesn't decrease from additional weight, low health, poison or siren's pull, but you also receive -25% speed penalty." +} diff --git a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerZEDBarrage.uc b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerZEDBarrage.uc index 63680f9..62cee59 100644 --- a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerZEDBarrage.uc +++ b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerZEDBarrage.uc @@ -1,5 +1,7 @@ -class NiceSkillEnforcerZEDBarrage extends NiceSkill - abstract; -defaultproperties -{ SkillName="Barrage" SkillEffects="Shoot without any recoil during zed-time." -} +class NiceSkillEnforcerZEDBarrage extends NiceSkill + abstract; +defaultproperties +{ + SkillName="Barrage" + SkillEffects="Shoot without any recoil during zed-time." +} diff --git a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerZEDJuggernaut.uc b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerZEDJuggernaut.uc index 92fb5e9..12a8ca0 100644 --- a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerZEDJuggernaut.uc +++ b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillEnforcerZEDJuggernaut.uc @@ -1,6 +1,9 @@ -class NiceSkillEnforcerZEDJuggernaut extends NiceSkill - abstract; -var float distance; -defaultproperties -{ Distance=800.000000 SkillName="Juggernaut" SkillEffects="You startle zeds around you upon entering zed-time." -} +class NiceSkillEnforcerZEDJuggernaut extends NiceSkill + abstract; +var float distance; +defaultproperties +{ + Distance=800.000000 + SkillName="Juggernaut" + SkillEffects="You startle zeds around you upon entering zed-time." +} diff --git a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillHeavyCoating.uc b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillHeavyCoating.uc index 42b78b8..fcdd7a6 100644 --- a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillHeavyCoating.uc +++ b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillHeavyCoating.uc @@ -1,6 +1,9 @@ -class NiceSkillHeavyCoating extends NiceSkill - abstract; -var float huskResist; -defaultproperties -{ huskResist=1.000000 SkillName="Coating" SkillEffects="You get immunity from fire and electricity for as long as you wear armor, and your armor can absorb damage from every source." -} +class NiceSkillHeavyCoating extends NiceSkill + abstract; +var float huskResist; +defaultproperties +{ + huskResist=1.000000 + SkillName="Coating" + SkillEffects="You get immunity from fire and electricity for as long as you wear armor, and your armor can absorb damage from every source." +} diff --git a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillHeavyOverclocking.uc b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillHeavyOverclocking.uc index bc16913..de01f90 100644 --- a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillHeavyOverclocking.uc +++ b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillHeavyOverclocking.uc @@ -1,6 +1,9 @@ -class NiceSkillHeavyOverclocking extends NiceSkill - abstract; -var float fireSpeedMult; -defaultproperties -{ fireSpeedMult=1.300000 SkillName="Overclocking" SkillEffects="+30% fire speed with perked weapons." -} +class NiceSkillHeavyOverclocking extends NiceSkill + abstract; +var float fireSpeedMult; +defaultproperties +{ + fireSpeedMult=1.300000 + SkillName="Overclocking" + SkillEffects="+30% fire speed with perked weapons." +} diff --git a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillHeavySafeguard.uc b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillHeavySafeguard.uc index d148d9e..20029b1 100644 --- a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillHeavySafeguard.uc +++ b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillHeavySafeguard.uc @@ -1,6 +1,9 @@ -class NiceSkillHeavySafeguard extends NiceSkill - abstract; -var float healingCost; -defaultproperties -{ healingCost=0.250000 SkillName="Safeguard" SkillEffects="Your armor no longer protects you, but it heals you when your health falls too low." -} +class NiceSkillHeavySafeguard extends NiceSkill + abstract; +var float healingCost; +defaultproperties +{ + healingCost=0.250000 + SkillName="Safeguard" + SkillEffects="Your armor no longer protects you, but it heals you when your health falls too low." +} diff --git a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillHeavyStablePosition.uc b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillHeavyStablePosition.uc index 6d83e35..3435882 100644 --- a/sources/Perks/HeavyMachineGunner/Skills/NiceSkillHeavyStablePosition.uc +++ b/sources/Perks/HeavyMachineGunner/Skills/NiceSkillHeavyStablePosition.uc @@ -1,27 +1,34 @@ -class NiceSkillHeavyStablePosition extends NiceSkill - abstract; -var float recoilDampeningBonus; -function static SkillSelected(NicePlayerController nicePlayer){ - local NicePack niceMutator; - super.SkillSelected(nicePlayer); - niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); - if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) return; - niceMutator.AddCounter("npHMGStablePosition", Texture'NicePackT.HudCounter.stability', false, default.class); -} -function static SkillDeSelected(NicePlayerController nicePlayer){ - local NicePack niceMutator; - super.SkillDeSelected(nicePlayer); - niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); - if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) return; - niceMutator.RemoveCounter("npHMGStablePosition"); -} -function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){ - local NiceHumanPawn nicePawn; - if(nicePlayer == none || counterName != "npHMGStablePosition") return 0; - nicePawn = NiceHumanPawn(nicePlayer.pawn); - if(nicePawn == none || nicePawn.stationaryTime <= 0.0) return 0; - return Min(10, Ceil(2 * nicePawn.stationaryTime) - 1); -} -defaultproperties -{ recoilDampeningBonus=0.100000 SkillName="Stable position" SkillEffects="Each half-second you're crouching and now moving - you gain 10% recoil dampening bonus." -} +class NiceSkillHeavyStablePosition extends NiceSkill + abstract; +var float recoilDampeningBonus; +function static SkillSelected(NicePlayerController nicePlayer){ + local NicePack niceMutator; + super.SkillSelected(nicePlayer); + niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); + if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) + return; + niceMutator.AddCounter("npHMGStablePosition", Texture'NicePackT.HudCounter.stability', false, default.class); +} +function static SkillDeSelected(NicePlayerController nicePlayer){ + local NicePack niceMutator; + super.SkillDeSelected(nicePlayer); + niceMutator = class'NicePack'.static.Myself(nicePlayer.Level); + if(niceMutator == none || niceMutator.Role == Role_AUTHORITY) + return; + niceMutator.RemoveCounter("npHMGStablePosition"); +} +function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){ + local NiceHumanPawn nicePawn; + if(nicePlayer == none || counterName != "npHMGStablePosition") + return 0; + nicePawn = NiceHumanPawn(nicePlayer.pawn); + if(nicePawn == none || nicePawn.stationaryTime <= 0.0) + return 0; + return Min(10, Ceil(2 * nicePawn.stationaryTime) - 1); +} +defaultproperties +{ + recoilDampeningBonus=0.100000 + SkillName="Stable position" + SkillEffects="Each half-second you're crouching and now moving - you gain 10% recoil dampening bonus." +} diff --git a/sources/Perks/NiceSkill.uc b/sources/Perks/NiceSkill.uc index c154ce4..501033a 100644 --- a/sources/Perks/NiceSkill.uc +++ b/sources/Perks/NiceSkill.uc @@ -1,23 +1,31 @@ -class NiceSkill extends ReplicationInfo - abstract; -var bool bBroadcast; // Should we broadcast to clients that someone has this skill? -var string SkillName, SkillEffects; -// Functions that are called when skills becomes active / deactivated -function static SkillSelected(NicePlayerController nicePlayer){ - local NiceHumanPawn nicePawn; - nicePawn = NiceHumanPawn(nicePlayer.Pawn); - if(nicePawn != none){ nicePawn.RecalcAmmo(); if(nicePawn.Role < Role_AUTHORITY) nicePawn.ApplyWeaponStats(nicePawn.weapon); - } -} -function static SkillDeSelected(NicePlayerController nicePlayer){ - local NiceHumanPawn nicePawn; - nicePawn = NiceHumanPawn(nicePlayer.Pawn); - if(nicePawn != none){ nicePawn.RecalcAmmo(); if(nicePawn.Role < Role_AUTHORITY) nicePawn.ApplyWeaponStats(nicePawn.weapon); - } -} -function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){ - return 0; -} -defaultproperties -{ SkillName="All Fiction" SkillEffects="Does nothing!" -} +class NiceSkill extends ReplicationInfo + abstract; +var bool bBroadcast; // Should we broadcast to clients that someone has this skill? +var string SkillName, SkillEffects; +// Functions that are called when skills becomes active / deactivated +function static SkillSelected(NicePlayerController nicePlayer){ + local NiceHumanPawn nicePawn; + nicePawn = NiceHumanPawn(nicePlayer.Pawn); + if(nicePawn != none){ + nicePawn.RecalcAmmo(); + if(nicePawn.Role < Role_AUTHORITY) + nicePawn.ApplyWeaponStats(nicePawn.weapon); + } +} +function static SkillDeSelected(NicePlayerController nicePlayer){ + local NiceHumanPawn nicePawn; + nicePawn = NiceHumanPawn(nicePlayer.Pawn); + if(nicePawn != none){ + nicePawn.RecalcAmmo(); + if(nicePawn.Role < Role_AUTHORITY) + nicePawn.ApplyWeaponStats(nicePawn.weapon); + } +} +function static int UpdateCounterValue(string counterName, NicePlayerController nicePlayer){ + return 0; +} +defaultproperties +{ + SkillName="All Fiction" + SkillEffects="Does nothing!" +} diff --git a/sources/Perks/NiceSkillAbility.uc b/sources/Perks/NiceSkillAbility.uc index 24bc547..066756d 100644 --- a/sources/Perks/NiceSkillAbility.uc +++ b/sources/Perks/NiceSkillAbility.uc @@ -1,16 +1,18 @@ -class NiceSkillAbility extends NiceSkill - dependson(NiceAbilityManager) - abstract; -var NiceAbilityManager.NiceAbilityDescription skillAbility; -// Functions that are called when skills becomes active / deactivated -function static SkillSelected(NicePlayerController nicePlayer){ - if(nicePlayer != none && nicePlayer.abilityManager != none) nicePlayer.abilityManager.AddAbility(default.skillAbility); - super.SkillSelected(nicePlayer); -} -function static SkillDeSelected(NicePlayerController nicePlayer){ - if(nicePlayer != none && nicePlayer.abilityManager != none) nicePlayer.abilityManager.RemoveAbility(default.skillAbility.ID); - super.SkillDeSelected(nicePlayer); -} -defaultproperties -{ -} +class NiceSkillAbility extends NiceSkill + dependson(NiceAbilityManager) + abstract; +var NiceAbilityManager.NiceAbilityDescription skillAbility; +// Functions that are called when skills becomes active / deactivated +function static SkillSelected(NicePlayerController nicePlayer){ + if(nicePlayer != none && nicePlayer.abilityManager != none) + nicePlayer.abilityManager.AddAbility(default.skillAbility); + super.SkillSelected(nicePlayer); +} +function static SkillDeSelected(NicePlayerController nicePlayer){ + if(nicePlayer != none && nicePlayer.abilityManager != none) + nicePlayer.abilityManager.RemoveAbility(default.skillAbility.ID); + super.SkillDeSelected(nicePlayer); +} +defaultproperties +{ +} diff --git a/sources/Perks/NiceSkillGenAmmo.uc b/sources/Perks/NiceSkillGenAmmo.uc index bd4adce..1f8d920 100644 --- a/sources/Perks/NiceSkillGenAmmo.uc +++ b/sources/Perks/NiceSkillGenAmmo.uc @@ -1,20 +1,32 @@ -class NiceSkillGenAmmo extends NiceSkill - abstract; -function static UpdateWeapons(NicePlayerController nicePlayer){ - local Inventory I; - local NiceHumanPawn nicePawn; - nicePawn = NiceHumanPawn(nicePlayer.Pawn); - if(nicePawn != none){ for(I = nicePawn.Inventory; I != none; I = I.Inventory) if(NiceWeapon(I) != none){ NiceWeapon(I).UpdateWeaponAmmunition(); NiceWeapon(I).ClientUpdateWeaponMag(); } else if(FragAmmo(I) != none){ FragAmmo(I).MaxAmmo = FragAmmo(I).default.MaxAmmo; if(KFPlayerReplicationInfo(nicePawn.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(nicePawn.PlayerReplicationInfo).ClientVeteranSkill != none) FragAmmo(I).MaxAmmo = float(FragAmmo(I).MaxAmmo) * KFPlayerReplicationInfo(nicePawn.PlayerReplicationInfo).ClientVeteranSkill.static.AddExtraAmmoFor(KFPlayerReplicationInfo(nicePawn.PlayerReplicationInfo), class'FragAmmo'); FragAmmo(I).AmmoAmount = Min(FragAmmo(I).AmmoAmount, FragAmmo(I).MaxAmmo); } - } -} -function static SkillSelected(NicePlayerController nicePlayer){ - super.SkillSelected(nicePlayer); - UpdateWeapons(nicePlayer); -} -function static SkillDeSelected(NicePlayerController nicePlayer){ - super.SkillDeSelected(nicePlayer); - UpdateWeapons(nicePlayer); -} -defaultproperties -{ -} +class NiceSkillGenAmmo extends NiceSkill + abstract; +function static UpdateWeapons(NicePlayerController nicePlayer){ + local Inventory I; + local NiceHumanPawn nicePawn; + nicePawn = NiceHumanPawn(nicePlayer.Pawn); + if(nicePawn != none){ + for(I = nicePawn.Inventory; I != none; I = I.Inventory) + if(NiceWeapon(I) != none){ + NiceWeapon(I).UpdateWeaponAmmunition(); + NiceWeapon(I).ClientUpdateWeaponMag(); + } + else if(FragAmmo(I) != none){ + FragAmmo(I).MaxAmmo = FragAmmo(I).default.MaxAmmo; + if(KFPlayerReplicationInfo(nicePawn.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(nicePawn.PlayerReplicationInfo).ClientVeteranSkill != none) + FragAmmo(I).MaxAmmo = float(FragAmmo(I).MaxAmmo) + * KFPlayerReplicationInfo(nicePawn.PlayerReplicationInfo).ClientVeteranSkill.static.AddExtraAmmoFor(KFPlayerReplicationInfo(nicePawn.PlayerReplicationInfo), class'FragAmmo'); + FragAmmo(I).AmmoAmount = Min(FragAmmo(I).AmmoAmount, FragAmmo(I).MaxAmmo); + } + } +} +function static SkillSelected(NicePlayerController nicePlayer){ + super.SkillSelected(nicePlayer); + UpdateWeapons(nicePlayer); +} +function static SkillDeSelected(NicePlayerController nicePlayer){ + super.SkillDeSelected(nicePlayer); + UpdateWeapons(nicePlayer); +} +defaultproperties +{ +} diff --git a/sources/Perks/NiceVeterancyTypes.uc b/sources/Perks/NiceVeterancyTypes.uc index fd1e2e6..2ec2e51 100644 --- a/sources/Perks/NiceVeterancyTypes.uc +++ b/sources/Perks/NiceVeterancyTypes.uc @@ -1,252 +1,325 @@ -class NiceVeterancyTypes extends ScrnVeterancyTypes - dependson(NicePlayerController) - abstract; -// Temporarily needed variable to distinguish between new and old type perks -var bool bNewTypePerk; -// Skills -var class SkillGroupA[5]; -var class SkillGroupB[5]; -// Checks if player is can use given skill -static function bool CanUseSkill(NicePlayerController nicePlayer, class skill){ - local int i; - local int currentLevel; - local KFPlayerReplicationInfo KFPRI; - local class niceVet; - // Get necessary variables - KFPRI = KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo); - if(KFPRI == none) return false; - niceVet = GetVeterancy(nicePlayer.PlayerReplicationInfo); - currentLevel = GetClientVeteranSkillLevel(KFPRI); - // Check if we have that skill at appropriate level - for(i = 0;i < 5 && i < currentLevel;i ++) if(niceVet.default.SkillGroupA[i] == skill || niceVet.default.SkillGroupB[i] == skill) return true; - return false; -} -// Checks if player is using given skill -static function bool HasSkill(NicePlayerController nicePlayer, class skill){ - local int i; - local int currentLevel; - local KFPlayerReplicationInfo KFPRI; - local class niceVet; - local NicePlayerController.SkillChoices choices; - // Get necessary variables - if(nicePlayer == none || skill == none || !CanUseSkill(nicePlayer, skill)) return false; - KFPRI = KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo); - if(KFPRI == none) return false; - currentLevel = GetClientVeteranSkillLevel(KFPRI); - niceVet = GetVeterancy(nicePlayer.PlayerReplicationInfo); - choices = nicePlayer.currentSkills[niceVet.default.PerkIndex]; - // Check our skill is chosen at some level; (since there shouldn't be any duplicates and it can be chosen at some level -> it's active) - for(i = 0;i < 5 && i < currentLevel;i ++) if((niceVet.default.SkillGroupA[i] == skill && choices.isAltChoice[i] == 0) || (niceVet.default.SkillGroupB[i] == skill && choices.isAltChoice[i] > 0)) return true; - return false; -} -static function bool SomeoneHasSkill(NicePlayerController player, class skill){ - local int i; - local Controller P; - local NicePlayerController nicePlayer; - if(player == none) return false; - if(player.Pawn.Role == ROLE_Authority) for(P = player.Level.ControllerList; P != none; P = P.nextController){ nicePlayer = NicePlayerController(P); if(nicePlayer != none && HasSkill(nicePlayer, skill) && nicePlayer.Pawn.Health > 0 && !nicePlayer.Pawn.bPendingDelete && nicePlayer.PlayerReplicationInfo.Team == player.PlayerReplicationInfo.Team) return true; } - else for(i = 0;i < player.broadcastedSkills.Length;i ++) if(player.broadcastedSkills[i] == skill) return true; - return false; -} -// Checks if player will automatically chose given skill at the next opportunity -static function bool IsSkillPending(NicePlayerController nicePlayer, class skill){ - local int i; - local int currentLevel; - local KFPlayerReplicationInfo KFPRI; - local class niceVet; - local NicePlayerController.SkillChoices choices; - // Get necessary variables - if(nicePlayer == none || skill == none || !CanUseSkill(nicePlayer, skill)) return false; - KFPRI = KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo); - if(KFPRI == none) return false; - currentLevel = GetClientVeteranSkillLevel(KFPRI); - niceVet = GetVeterancy(nicePlayer.PlayerReplicationInfo); - choices = nicePlayer.pendingSkills[niceVet.default.PerkIndex]; - // Check our skill is chosen at some level; (since there shouldn't be any duplicates and it can be chosen at some level -> it's active) - for(i = 0;i < 5;i ++) if((niceVet.default.SkillGroupA[i] == skill && choices.isAltChoice[i] == 0) || (niceVet.default.SkillGroupB[i] == skill && choices.isAltChoice[i] > 0)) return true; - return false; -} -// Function that checks if given pickup class is marked as perked for current veterancy -static function bool IsPerkedPickup(class pickup){ - local int i; - if(pickup == none) return false; - if(pickup.default.CorrespondingPerkIndex == default.PerkIndex) return true; - else for(i = 0;i < pickup.default.crossPerkIndecies.Length;i ++) if(pickup.default.crossPerkIndecies[i] == default.PerkIndex) return true; - return false; -} -static function bool IsPickupLight(class pickup){ - if(pickup != none && pickup.default.Weight <= 8) return true; - return false; -} -static function bool IsPickupBackup(class pickup){ - if(pickup != none && pickup.default.bBackupWeapon) return true; - return false; -} - -// Set of functions for obtaining a pickup class from various other classes, connected with it -static function class GetPickupFromWeapon(class inputClass){ - local class niceWeaponClass; - niceWeaponClass = class(inputClass); - if(niceWeaponClass == none) return none; - return class(niceWeaponClass.default.PickupClass); -} -static function class GetPickupFromAmmo(Class inputClass){ - local class niceAmmoClass; - niceAmmoClass = class(inputClass); - if(niceAmmoClass == none) return none; - return niceAmmoClass.default.WeaponPickupClass; -} -static function class GetWeaponFromAmmo(Class inputClass){ - local class nicePickupClass; - nicePickupClass = GetPickupFromAmmo(inputClass); - if(nicePickupClass == none) return none; - return class(nicePickupClass.default.InventoryType); -} -static function class GetPickupFromDamageType(class inputClass){ - local class niceDmgTypeClass; - niceDmgTypeClass = class(inputClass); - if(niceDmgTypeClass == none) return none; - return GetPickupFromWeapon(class(niceDmgTypeClass.default.WeaponClass)); -} -static function class GetPickupFromWeaponFire(WeaponFire fireInstance){ - local NiceFire niceFire; - niceFire = NiceFire(fireInstance); - if(niceFire == none) return none; - return GetPickupFromAmmo(class(niceFire.AmmoClass)); -} -// Finds correct veterancy for a player -static function class GetVeterancy(PlayerReplicationInfo PRI){ - local KFPlayerReplicationInfo KFPRI; - KFPRI = KFPlayerReplicationInfo(PRI); - if(KFPRI == none || KFPRI.ClientVeteranSkill == none) return none; - return class(KFPRI.ClientVeteranSkill); -} -// New perk progress function -static function int GetPerkProgressInt(ClientPerkRepLink StatOther, out int FinalInt, byte CurLevel, byte ReqNum) { - local int delta, highestFilled; - local int filledLevels; - local array ProgressArray; - local int DoubleScalingBase; - if(!default.bNewTypePerk) return Super.GetPerkProgressInt(StatOther, FinalInt, CurLevel, ReqNum); - else{ ProgressArray = GetProgressArray(ReqNum, DoubleScalingBase); filledLevels = ProgressArray.Length; if(filledLevels > 1) delta = ProgressArray[filledLevels - 1] - ProgressArray[filledLevels - 2]; else if(filledLevels == 1) delta = ProgressArray[0]; else delta = 10; if(filledLevels > 0) highestFilled = ProgressArray[filledLevels - 1]; else highestFilled = 10; if(CurLevel < filledLevels) FinalInt = ProgressArray[CurLevel]; else FinalInt = highestFilled + (CurLevel - filledLevels) * delta; - } - return Min(GetStatValueInt(StatOther, ReqNum), FinalInt); -} -// Get head-shot multiplier function that passes zed as a parameter -static function float GetNiceHeadShotDamMulti(KFPlayerReplicationInfo KFPRI, NiceMonster zed, class DmgType){ - return 1.0; -} -// From which distance can we see enemy's health at given level? -static function float GetMaxHealthDistanceByLevel(int level){ - return 0; -} -// From which distance can we see enemy's health? -static function float GetMaxHealthDistance(KFPlayerReplicationInfo KFPRI){ - return GetMaxHealthDistanceByLevel(GetClientVeteranSkillLevel(KFPRI)); -} -// Allows to increase head-shot check scale for some weapons. -static function float GetHeadshotCheckMultiplier(KFPlayerReplicationInfo KFPRI, class DmgType){ - return 1.0; -} -// Allows to buff only regular component of damage. -static function int AddRegDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InDamage, class DmgType){ - return InDamage; -} -// Allows to buff only fire component of damage. -static function int AddFireDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InDamage, class DmgType){ - if(DmgType != none) return InDamage * DmgType.default.heatPart; - return InDamage; -} -static function float stunDurationMult(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, class DmgType){ - return 1.0; -} -static function int AddStunScore(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InStunScore, class DmgType){ - return InStunScore; -} -static function int AddFlinchScore(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InFlinchScore, class DmgType){ - return InFlinchScore; -} -// If pawn suffers from slow down effect, how much should we boost/lower it? -// 1.0 = leave the same, >1.0 = boost, <1.0 = lower. -static function float SlowingModifier(KFPlayerReplicationInfo KFPRI){ - return 1.0; -} -// Can player with this perk be pulled by a siren? -static function bool CanBePulled(KFPlayerReplicationInfo KFPRI){ - return true; -} -// What weight value should be used when calculation Pawn's speed? -static function float GetPerceivedWeight(KFPlayerReplicationInfo KFPRI, KFWeapon other){ - if(other != none) return other.weight; - return 0; -} -// A new, universal, penetration reduction function that is used by all 'NiceWeapon' subclasses -static function float GetPenetrationDamageMulti(KFPlayerReplicationInfo KFPRI, float DefaultPenDamageReduction, class fireIntance){ - return DefaultPenDamageReduction; -} -// Universal cost scaling for all perks -static function float GetCostScaling(KFPlayerReplicationInfo KFPRI, class Item){ - /*local class pickupClass; - pickupClass = class(Item); - if(IsPerkedPickup(pickupClass)) return 0.5;*/ - return 1.0; -} -static function bool ShowStalkers(KFPlayerReplicationInfo KFPRI){ - return GetStalkerViewDistanceMulti(KFPRI) > 0; -} -static function float GetStalkerViewDistanceMulti(KFPlayerReplicationInfo KFPRI){ - if(SomeoneHasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoStrategist')) return class'NiceSkillCommandoStrategist'.default.visionRadius; - return 0.0; -} -// Modify distance at which health bars can be seen; 1.0 = 800 units, max = 2000 units = 2.5 -static function float GetHealthBarsDistanceMulti(KFPlayerReplicationInfo KFPRI){ - if(KFPRI != none && SomeoneHasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoStrategist')) return class'NiceSkillCommandoStrategist'.default.visionRadius; - return 0.0; -} -static function int GetAdditionalPenetrationAmount(KFPlayerReplicationInfo KFPRI){ - return 0; -} -static function int GetInvincibilityExtentions(KFPlayerReplicationInfo KFPRI){ - return 0; -} -static function int GetInvincibilityDuration(KFPlayerReplicationInfo KFPRI){ - return 2.0; -} -static function int GetInvincibilitySafeMisses(KFPlayerReplicationInfo KFPRI){ - return 0; -} -static function SpecialHUDInfo(KFPlayerReplicationInfo KFPRI, Canvas C){ - local KFMonster KFEnemy; - local HUDKillingFloor HKF; - local float MaxDistanceSquared; - MaxDistanceSquared = 640000; - MaxDistanceSquared *= GetHealthBarsDistanceMulti(KFPRI)**2; - HKF = HUDKillingFloor(C.ViewPort.Actor.myHUD); - if(HKF == none || C.ViewPort.Actor.Pawn == none || MaxDistanceSquared <= 0) return; - foreach C.ViewPort.Actor.DynamicActors(class'KFMonster', KFEnemy){ if(KFEnemy.Health > 0 && (!KFEnemy.Cloaked() || KFEnemy.bZapped || KFEnemy.bSpotted) && VSizeSquared(KFEnemy.Location - C.ViewPort.Actor.Pawn.Location) < MaxDistanceSquared) HKF.DrawHealthBar(C, KFEnemy, KFEnemy.Health, KFEnemy.HealthMax , 50.0); - } -} -// Is player standing still? -static function bool IsStandingStill(KFPlayerReplicationInfo KFPRI){ - if(KFPRI != none && PlayerController(KFPRI.Owner) != none && PlayerController(KFPRI.Owner).Pawn != none && VSize(PlayerController(KFPRI.Owner).Pawn.Velocity) > 0.0) return false; - return true; -} -// Is player aiming? -static function bool IsAiming(KFPlayerReplicationInfo KFPRI){ - local KFWeapon kfWeap; - if(KFPRI != none && PlayerController(KFPRI.Owner) != none && PlayerController(KFPRI.Owner).Pawn != none) kfWeap = KFWeapon(PlayerController(KFPRI.Owner).Pawn.weapon); - if(kfWeap == none) return false; - return kfWeap.bAimingRifle; -} -// Just display the same fixed bonuses for the new type perks -static function string GetVetInfoText(byte Level, byte Type, optional byte RequirementNum){ - if(Type == 1 && default.bNewTypePerk) return default.CustomLevelInfo; - return Super.GetVetInfoText(Level, Type, RequirementNum); -} -static function class GetNadeType(KFPlayerReplicationInfo KFPRI){ - return class'NicePack.NiceNade'; -} -static function SetupAbilities(KFPlayerReplicationInfo KFPRI){} -defaultproperties -{ SkillGroupA(0)=Class'NicePack.NiceSkill' SkillGroupA(1)=Class'NicePack.NiceSkill' SkillGroupA(2)=Class'NicePack.NiceSkill' SkillGroupA(3)=Class'NicePack.NiceSkill' SkillGroupA(4)=Class'NicePack.NiceSkill' SkillGroupB(0)=Class'NicePack.NiceSkill' SkillGroupB(1)=Class'NicePack.NiceSkill' SkillGroupB(2)=Class'NicePack.NiceSkill' SkillGroupB(3)=Class'NicePack.NiceSkill' SkillGroupB(4)=Class'NicePack.NiceSkill' -} +class NiceVeterancyTypes extends ScrnVeterancyTypes + dependson(NicePlayerController) + abstract; +// Temporarily needed variable to distinguish between new and old type perks +var bool bNewTypePerk; +// Skills +var class SkillGroupA[5]; +var class SkillGroupB[5]; +// Checks if player is can use given skill +static function bool CanUseSkill(NicePlayerController nicePlayer, class skill){ + local int i; + local int currentLevel; + local KFPlayerReplicationInfo KFPRI; + local class niceVet; + // Get necessary variables + KFPRI = KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo); + if(KFPRI == none) + return false; + niceVet = GetVeterancy(nicePlayer.PlayerReplicationInfo); + currentLevel = GetClientVeteranSkillLevel(KFPRI); + // Check if we have that skill at appropriate level + for(i = 0;i < 5 && i < currentLevel;i ++) + if(niceVet.default.SkillGroupA[i] == skill || niceVet.default.SkillGroupB[i] == skill) + return true; + return false; +} +// Checks if player is using given skill +static function bool HasSkill(NicePlayerController nicePlayer, class skill){ + local int i; + local int currentLevel; + local KFPlayerReplicationInfo KFPRI; + local class niceVet; + local NicePlayerController.SkillChoices choices; + // Get necessary variables + if(nicePlayer == none || skill == none || !CanUseSkill(nicePlayer, skill)) + return false; + KFPRI = KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo); + if(KFPRI == none) + return false; + currentLevel = GetClientVeteranSkillLevel(KFPRI); + niceVet = GetVeterancy(nicePlayer.PlayerReplicationInfo); + choices = nicePlayer.currentSkills[niceVet.default.PerkIndex]; + // Check our skill is chosen at some level; (since there shouldn't be any duplicates and it can be chosen at some level -> it's active) + for(i = 0;i < 5 && i < currentLevel;i ++) + if((niceVet.default.SkillGroupA[i] == skill && choices.isAltChoice[i] == 0) + || (niceVet.default.SkillGroupB[i] == skill && choices.isAltChoice[i] > 0)) + return true; + return false; +} +static function bool SomeoneHasSkill(NicePlayerController player, class skill){ + local int i; + local Controller P; + local NicePlayerController nicePlayer; + if(player == none) + return false; + if(player.Pawn.Role == ROLE_Authority) + for(P = player.Level.ControllerList; P != none; P = P.nextController){ + nicePlayer = NicePlayerController(P); + if(nicePlayer != none && HasSkill(nicePlayer, skill) && nicePlayer.Pawn.Health > 0 && !nicePlayer.Pawn.bPendingDelete + && nicePlayer.PlayerReplicationInfo.Team == player.PlayerReplicationInfo.Team) + return true; + } + else for(i = 0;i < player.broadcastedSkills.Length;i ++) + if(player.broadcastedSkills[i] == skill) + return true; + return false; +} +// Checks if player will automatically chose given skill at the next opportunity +static function bool IsSkillPending(NicePlayerController nicePlayer, class skill){ + local int i; + local int currentLevel; + local KFPlayerReplicationInfo KFPRI; + local class niceVet; + local NicePlayerController.SkillChoices choices; + // Get necessary variables + if(nicePlayer == none || skill == none || !CanUseSkill(nicePlayer, skill)) + return false; + KFPRI = KFPlayerReplicationInfo(nicePlayer.PlayerReplicationInfo); + if(KFPRI == none) + return false; + currentLevel = GetClientVeteranSkillLevel(KFPRI); + niceVet = GetVeterancy(nicePlayer.PlayerReplicationInfo); + choices = nicePlayer.pendingSkills[niceVet.default.PerkIndex]; + // Check our skill is chosen at some level; (since there shouldn't be any duplicates and it can be chosen at some level -> it's active) + for(i = 0;i < 5;i ++) + if((niceVet.default.SkillGroupA[i] == skill && choices.isAltChoice[i] == 0) + || (niceVet.default.SkillGroupB[i] == skill && choices.isAltChoice[i] > 0)) + return true; + return false; +} +// Function that checks if given pickup class is marked as perked for current veterancy +static function bool IsPerkedPickup(class pickup){ + local int i; + if(pickup == none) + return false; + if(pickup.default.CorrespondingPerkIndex == default.PerkIndex) + return true; + else for(i = 0;i < pickup.default.crossPerkIndecies.Length;i ++) + if(pickup.default.crossPerkIndecies[i] == default.PerkIndex) + return true; + return false; +} +static function bool IsPickupLight(class pickup){ + if(pickup != none && pickup.default.Weight <= 8) + return true; + return false; +} +static function bool IsPickupBackup(class pickup){ + if(pickup != none && pickup.default.bBackupWeapon) + return true; + return false; +} + +// Set of functions for obtaining a pickup class from various other classes, connected with it +static function class GetPickupFromWeapon(class inputClass){ + local class niceWeaponClass; + niceWeaponClass = class(inputClass); + if(niceWeaponClass == none) + return none; + return class(niceWeaponClass.default.PickupClass); +} +static function class GetPickupFromAmmo(Class inputClass){ + local class niceAmmoClass; + niceAmmoClass = class(inputClass); + if(niceAmmoClass == none) + return none; + return niceAmmoClass.default.WeaponPickupClass; +} +static function class GetWeaponFromAmmo(Class inputClass){ + local class nicePickupClass; + nicePickupClass = GetPickupFromAmmo(inputClass); + if(nicePickupClass == none) + return none; + return class(nicePickupClass.default.InventoryType); +} +static function class GetPickupFromDamageType(class inputClass){ + local class niceDmgTypeClass; + niceDmgTypeClass = class(inputClass); + if(niceDmgTypeClass == none) + return none; + return GetPickupFromWeapon(class(niceDmgTypeClass.default.WeaponClass)); +} +static function class GetPickupFromWeaponFire(WeaponFire fireInstance){ + local NiceFire niceFire; + niceFire = NiceFire(fireInstance); + if(niceFire == none) + return none; + return GetPickupFromAmmo(class(niceFire.AmmoClass)); +} +// Finds correct veterancy for a player +static function class GetVeterancy(PlayerReplicationInfo PRI){ + local KFPlayerReplicationInfo KFPRI; + KFPRI = KFPlayerReplicationInfo(PRI); + if(KFPRI == none || KFPRI.ClientVeteranSkill == none) + return none; + return class(KFPRI.ClientVeteranSkill); +} +// New perk progress function +static function int GetPerkProgressInt(ClientPerkRepLink StatOther, out int FinalInt, byte CurLevel, byte ReqNum) { + local int delta, highestFilled; + local int filledLevels; + local array ProgressArray; + local int DoubleScalingBase; + if(!default.bNewTypePerk) + return Super.GetPerkProgressInt(StatOther, FinalInt, CurLevel, ReqNum); + else{ + ProgressArray = GetProgressArray(ReqNum, DoubleScalingBase); + filledLevels = ProgressArray.Length; + if(filledLevels > 1) + delta = ProgressArray[filledLevels - 1] - ProgressArray[filledLevels - 2]; + else if(filledLevels == 1) + delta = ProgressArray[0]; + else + delta = 10; + if(filledLevels > 0) + highestFilled = ProgressArray[filledLevels - 1]; + else + highestFilled = 10; + if(CurLevel < filledLevels) + FinalInt = ProgressArray[CurLevel]; + else + FinalInt = highestFilled + (CurLevel - filledLevels) * delta; + } + return Min(GetStatValueInt(StatOther, ReqNum), FinalInt); +} +// Get head-shot multiplier function that passes zed as a parameter +static function float GetNiceHeadShotDamMulti(KFPlayerReplicationInfo KFPRI, NiceMonster zed, class DmgType){ + return 1.0; +} +// From which distance can we see enemy's health at given level? +static function float GetMaxHealthDistanceByLevel(int level){ + return 0; +} +// From which distance can we see enemy's health? +static function float GetMaxHealthDistance(KFPlayerReplicationInfo KFPRI){ + return GetMaxHealthDistanceByLevel(GetClientVeteranSkillLevel(KFPRI)); +} +// Allows to increase head-shot check scale for some weapons. +static function float GetHeadshotCheckMultiplier(KFPlayerReplicationInfo KFPRI, class DmgType){ + return 1.0; +} +// Allows to buff only regular component of damage. +static function int AddRegDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InDamage, class DmgType){ + return InDamage; +} +// Allows to buff only fire component of damage. +static function int AddFireDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InDamage, class DmgType){ + if(DmgType != none) + return InDamage * DmgType.default.heatPart; + return InDamage; +} +static function float stunDurationMult(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, class DmgType){ + return 1.0; +} +static function int AddStunScore(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InStunScore, class DmgType){ + return InStunScore; +} +static function int AddFlinchScore(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InFlinchScore, class DmgType){ + return InFlinchScore; +} +// If pawn suffers from slow down effect, how much should we boost/lower it? +// 1.0 = leave the same, >1.0 = boost, <1.0 = lower. +static function float SlowingModifier(KFPlayerReplicationInfo KFPRI){ + return 1.0; +} +// Can player with this perk be pulled by a siren? +static function bool CanBePulled(KFPlayerReplicationInfo KFPRI){ + return true; +} +// What weight value should be used when calculation Pawn's speed? +static function float GetPerceivedWeight(KFPlayerReplicationInfo KFPRI, KFWeapon other){ + if(other != none) + return other.weight; + return 0; +} +// A new, universal, penetration reduction function that is used by all 'NiceWeapon' subclasses +static function float GetPenetrationDamageMulti(KFPlayerReplicationInfo KFPRI, float DefaultPenDamageReduction, class fireIntance){ + return DefaultPenDamageReduction; +} +// Universal cost scaling for all perks +static function float GetCostScaling(KFPlayerReplicationInfo KFPRI, class Item){ + /*local class pickupClass; + pickupClass = class(Item); + if(IsPerkedPickup(pickupClass)) + return 0.5;*/ + return 1.0; +} +static function bool ShowStalkers(KFPlayerReplicationInfo KFPRI){ + return GetStalkerViewDistanceMulti(KFPRI) > 0; +} +static function float GetStalkerViewDistanceMulti(KFPlayerReplicationInfo KFPRI){ + if(SomeoneHasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoStrategist')) + return class'NiceSkillCommandoStrategist'.default.visionRadius; + return 0.0; +} +// Modify distance at which health bars can be seen; 1.0 = 800 units, max = 2000 units = 2.5 +static function float GetHealthBarsDistanceMulti(KFPlayerReplicationInfo KFPRI){ + if(KFPRI != none && SomeoneHasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoStrategist')) + return class'NiceSkillCommandoStrategist'.default.visionRadius; + return 0.0; +} +static function int GetAdditionalPenetrationAmount(KFPlayerReplicationInfo KFPRI){ + return 0; +} +static function int GetInvincibilityExtentions(KFPlayerReplicationInfo KFPRI){ + return 0; +} +static function int GetInvincibilityDuration(KFPlayerReplicationInfo KFPRI){ + return 2.0; +} +static function int GetInvincibilitySafeMisses(KFPlayerReplicationInfo KFPRI){ + return 0; +} +static function SpecialHUDInfo(KFPlayerReplicationInfo KFPRI, Canvas C){ + local KFMonster KFEnemy; + local HUDKillingFloor HKF; + local float MaxDistanceSquared; + MaxDistanceSquared = 640000; + MaxDistanceSquared *= GetHealthBarsDistanceMulti(KFPRI)**2; + HKF = HUDKillingFloor(C.ViewPort.Actor.myHUD); + if(HKF == none || C.ViewPort.Actor.Pawn == none || MaxDistanceSquared <= 0) + return; + foreach C.ViewPort.Actor.DynamicActors(class'KFMonster', KFEnemy){ + if(KFEnemy.Health > 0 && (!KFEnemy.Cloaked() || KFEnemy.bZapped || KFEnemy.bSpotted) && VSizeSquared(KFEnemy.Location - C.ViewPort.Actor.Pawn.Location) < MaxDistanceSquared) + HKF.DrawHealthBar(C, KFEnemy, KFEnemy.Health, KFEnemy.HealthMax , 50.0); + } +} +// Is player standing still? +static function bool IsStandingStill(KFPlayerReplicationInfo KFPRI){ + if(KFPRI != none && PlayerController(KFPRI.Owner) != none && PlayerController(KFPRI.Owner).Pawn != none && VSize(PlayerController(KFPRI.Owner).Pawn.Velocity) > 0.0) + return false; + return true; +} +// Is player aiming? +static function bool IsAiming(KFPlayerReplicationInfo KFPRI){ + local KFWeapon kfWeap; + if(KFPRI != none && PlayerController(KFPRI.Owner) != none && PlayerController(KFPRI.Owner).Pawn != none) + kfWeap = KFWeapon(PlayerController(KFPRI.Owner).Pawn.weapon); + if(kfWeap == none) + return false; + return kfWeap.bAimingRifle; +} +// Just display the same fixed bonuses for the new type perks +static function string GetVetInfoText(byte Level, byte Type, optional byte RequirementNum){ + if(Type == 1 && default.bNewTypePerk) + return default.CustomLevelInfo; + return Super.GetVetInfoText(Level, Type, RequirementNum); +} +static function class GetNadeType(KFPlayerReplicationInfo KFPRI){ + return class'NicePack.NiceNade'; +} +static function SetupAbilities(KFPlayerReplicationInfo KFPRI){} +defaultproperties +{ + SkillGroupA(0)=Class'NicePack.NiceSkill' + SkillGroupA(1)=Class'NicePack.NiceSkill' + SkillGroupA(2)=Class'NicePack.NiceSkill' + SkillGroupA(3)=Class'NicePack.NiceSkill' + SkillGroupA(4)=Class'NicePack.NiceSkill' + SkillGroupB(0)=Class'NicePack.NiceSkill' + SkillGroupB(1)=Class'NicePack.NiceSkill' + SkillGroupB(2)=Class'NicePack.NiceSkill' + SkillGroupB(3)=Class'NicePack.NiceSkill' + SkillGroupB(4)=Class'NicePack.NiceSkill' +} diff --git a/sources/Perks/Sharpshooter/NiceDamageTypeVetSharpshooter.uc b/sources/Perks/Sharpshooter/NiceDamageTypeVetSharpshooter.uc index 09082de..dc07e7e 100644 --- a/sources/Perks/Sharpshooter/NiceDamageTypeVetSharpshooter.uc +++ b/sources/Perks/Sharpshooter/NiceDamageTypeVetSharpshooter.uc @@ -1,9 +1,10 @@ -class NiceDamageTypeVetSharpshooter extends NiceWeaponDamageType - abstract; -static function ScoredNiceHeadshot(KFSteamStatsAndAchievements KFStatsAndAchievements, class monsterClass, int HL){ - if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetSharpshooterExp', Int(class'NicePack'.default.vetSharpHeadshotExpCost * getScale(HL))); - super.ScoredNiceHeadshot(KFStatsAndAchievements, monsterClass, HL); -} -defaultproperties -{ -} +class NiceDamageTypeVetSharpshooter extends NiceWeaponDamageType + abstract; +static function ScoredNiceHeadshot(KFSteamStatsAndAchievements KFStatsAndAchievements, class monsterClass, int HL){ + if(SRStatsBase(KFStatsAndAchievements) != none && SRStatsBase(KFStatsAndAchievements).Rep != none) + SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'NiceVetSharpshooterExp', Int(class'NicePack'.default.vetSharpHeadshotExpCost * getScale(HL))); + super.ScoredNiceHeadshot(KFStatsAndAchievements, monsterClass, HL); +} +defaultproperties +{ +} diff --git a/sources/Perks/Sharpshooter/NiceVetSharpshooterExp.uc b/sources/Perks/Sharpshooter/NiceVetSharpshooterExp.uc index 0374e07..06d5cfb 100644 --- a/sources/Perks/Sharpshooter/NiceVetSharpshooterExp.uc +++ b/sources/Perks/Sharpshooter/NiceVetSharpshooterExp.uc @@ -1,4 +1,5 @@ -class NiceVetSharpshooterExp extends SRCustomProgressInt; -defaultproperties -{ ProgressName="Sharpshooter exp." -} +class NiceVetSharpshooterExp extends SRCustomProgressInt; +defaultproperties +{ + ProgressName="Sharpshooter exp." +} diff --git a/sources/TSC/NiceTSCGame.uc b/sources/TSC/NiceTSCGame.uc index 19244e6..bf61e18 100644 --- a/sources/TSC/NiceTSCGame.uc +++ b/sources/TSC/NiceTSCGame.uc @@ -1,56 +1,111 @@ -class NiceTSCGame extends TSCGame; -// Copy-pasted from NiceGameType -var NicePack NicePackMutator; -function RegisterMutator(NicePack activePack){ - NicePackMutator = activePack; -} -function SetupWave(){ - Super.SetupWave(); - // Event call - NicePackMutator.WaveStart(); -} -function RestartPlayer(Controller aPlayer){ - Super.RestartPlayer(aPlayer); - if(aPlayer.Pawn != none && NicePlayerController(aPlayer) != none) NicePlayerController(aPlayer).PawnSpawned(); -} -State MatchInProgress{ - function BeginState(){ Super(Invasion).BeginState(); - WaveNum = InitialWave; InvasionGameReplicationInfo(GameReplicationInfo).WaveNumber = WaveNum; - if(NicePackMutator.bInitialTrader) WaveCountDown = NicePackMutator.initialTraderTime + 10; else WaveCountDown = 10; - SetupPickups(); // Event call NicePackMutator.MatchBegan(); - } - function DoWaveEnd(){ Super.DoWaveEnd(); // Event call NicePackMutator.TraderStart(); - } -} -function DramaticEvent(float BaseZedTimePossibility, optional float DesiredZedTimeDuration){ - local bool bWasZedTime; - bWasZedTime = bZEDTimeActive; - Super.DramaticEvent(BaseZedTimePossibility, DesiredZedTimeDuration); - // Call events - if(!bWasZedTime && bZEDTimeActive) NicePackMutator.ZedTimeActivated(); -} -event Tick(float DeltaTime){ - local float TrueTimeFactor; - local Controller C; - if(bZEDTimeActive){ TrueTimeFactor = 1.1 / Level.TimeDilation; CurrentZEDTimeDuration -= DeltaTime * TrueTimeFactor; if(CurrentZEDTimeDuration < (ZEDTimeDuration*0.166) && CurrentZEDTimeDuration > 0 ){ if(!bSpeedingBackUp){ bSpeedingBackUp = true; - for(C = Level.ControllerList;C != none;C = C.NextController){ if(KFPlayerController(C)!= none) KFPlayerController(C).ClientExitZedTime(); } } SetGameSpeed(Lerp( (CurrentZEDTimeDuration/(ZEDTimeDuration*0.166)), 1.0, 0.2 )); } if(CurrentZEDTimeDuration <= 0){ if(bZEDTimeActive) NicePackMutator.ZedTimeDeactivated(); bZEDTimeActive = false; bSpeedingBackUp = false; SetGameSpeed(1.0); ZedTimeExtensionsUsed = 0; } - } -} -function Killed(Controller Killer, Controller Killed, Pawn KilledPawn, class dmgType){ - local KFSteamStatsAndAchievements StatsAndAchievements; - Super.Killed(Killer, Killed, KilledPawn, dmgType); - if(PlayerController(Killer) != none){ if (NiceMonster(KilledPawn) != none && Killed != Killer){ StatsAndAchievements = KFSteamStatsAndAchievements(PlayerController(Killer).SteamStatsAndAchievements); if(StatsAndAchievements != none){ if(KilledPawn.IsA('NiceZombieStalker') || KilledPawn.IsA('MeanZombieStalker')){ if(class(dmgType) != none) StatsAndAchievements.AddStalkerKillWithLAR(); } else if(KilledPawn.IsA('NiceZombieClot') || KilledPawn.IsA('MeanZombieClot')){ if(class(dmgType) != none) KFSteamStatsAndAchievements(PlayerController(Killer).SteamStatsAndAchievements).AddClotKillWithLAR(); } } } - } -} -// Reloaded to award damage -function int ReduceDamage(int Damage, pawn injured, pawn instigatedBy, vector HitLocation, out vector Momentum, class DamageType){ - local NiceMonster niceZed; - local KFPlayerController PC; - niceZed = NiceMonster(Injured); - if(niceZed != none){ if(instigatedBy != none){ PC = KFPlayerController(instigatedBy.Controller); if(class(damageType) != none && PC != none) class(damageType).Static.AwardNiceDamage(KFSteamStatsAndAchievements(PC.SteamStatsAndAchievements), Clamp(Damage, 1, Injured.Health), niceZed.scrnRules.HardcoreLevel); } - } - return Super.ReduceDamage(Damage, injured, InstigatedBy, HitLocation, Momentum, DamageType); -} -defaultproperties -{ GameName="Nice Team Survival Competition" Description="Nice Edition of Team Survival Competition (TSCGame)." -} +class NiceTSCGame extends TSCGame; +// Copy-pasted from NiceGameType +var NicePack NicePackMutator; +function RegisterMutator(NicePack activePack){ + NicePackMutator = activePack; +} +function SetupWave(){ + Super.SetupWave(); + // Event call + NicePackMutator.WaveStart(); +} +function RestartPlayer(Controller aPlayer){ + Super.RestartPlayer(aPlayer); + if(aPlayer.Pawn != none && NicePlayerController(aPlayer) != none) + NicePlayerController(aPlayer).PawnSpawned(); +} +State MatchInProgress{ + function BeginState(){ + Super(Invasion).BeginState(); + + WaveNum = InitialWave; + InvasionGameReplicationInfo(GameReplicationInfo).WaveNumber = WaveNum; + + if(NicePackMutator.bInitialTrader) + WaveCountDown = NicePackMutator.initialTraderTime + 10; + else + WaveCountDown = 10; + + SetupPickups(); + // Event call + NicePackMutator.MatchBegan(); + } + function DoWaveEnd(){ + Super.DoWaveEnd(); + // Event call + NicePackMutator.TraderStart(); + } +} +function DramaticEvent(float BaseZedTimePossibility, optional float DesiredZedTimeDuration){ + local bool bWasZedTime; + bWasZedTime = bZEDTimeActive; + Super.DramaticEvent(BaseZedTimePossibility, DesiredZedTimeDuration); + // Call events + if(!bWasZedTime && bZEDTimeActive) + NicePackMutator.ZedTimeActivated(); +} +event Tick(float DeltaTime){ + local float TrueTimeFactor; + local Controller C; + if(bZEDTimeActive){ + TrueTimeFactor = 1.1 / Level.TimeDilation; + CurrentZEDTimeDuration -= DeltaTime * TrueTimeFactor; + if(CurrentZEDTimeDuration < (ZEDTimeDuration*0.166) && CurrentZEDTimeDuration > 0 ){ + if(!bSpeedingBackUp){ + bSpeedingBackUp = true; + + for(C = Level.ControllerList;C != none;C = C.NextController){ + if(KFPlayerController(C)!= none) + KFPlayerController(C).ClientExitZedTime(); + } + } + SetGameSpeed(Lerp( (CurrentZEDTimeDuration/(ZEDTimeDuration*0.166)), 1.0, 0.2 )); + } + if(CurrentZEDTimeDuration <= 0){ + if(bZEDTimeActive) + NicePackMutator.ZedTimeDeactivated(); + bZEDTimeActive = false; + bSpeedingBackUp = false; + SetGameSpeed(1.0); + ZedTimeExtensionsUsed = 0; + } + } +} +function Killed(Controller Killer, Controller Killed, Pawn KilledPawn, class dmgType){ + local KFSteamStatsAndAchievements StatsAndAchievements; + Super.Killed(Killer, Killed, KilledPawn, dmgType); + if(PlayerController(Killer) != none){ + if (NiceMonster(KilledPawn) != none && Killed != Killer){ + StatsAndAchievements = KFSteamStatsAndAchievements(PlayerController(Killer).SteamStatsAndAchievements); + if(StatsAndAchievements != none){ + if(KilledPawn.IsA('NiceZombieStalker') || KilledPawn.IsA('MeanZombieStalker')){ + if(class(dmgType) != none) + StatsAndAchievements.AddStalkerKillWithLAR(); + } + else if(KilledPawn.IsA('NiceZombieClot') || KilledPawn.IsA('MeanZombieClot')){ + if(class(dmgType) != none) + KFSteamStatsAndAchievements(PlayerController(Killer).SteamStatsAndAchievements).AddClotKillWithLAR(); + } + } + } + } +} +// Reloaded to award damage +function int ReduceDamage(int Damage, pawn injured, pawn instigatedBy, vector HitLocation, out vector Momentum, class DamageType){ + local NiceMonster niceZed; + local KFPlayerController PC; + niceZed = NiceMonster(Injured); + if(niceZed != none){ + if(instigatedBy != none){ + PC = KFPlayerController(instigatedBy.Controller); + if(class(damageType) != none && PC != none) + class(damageType).Static.AwardNiceDamage(KFSteamStatsAndAchievements(PC.SteamStatsAndAchievements), Clamp(Damage, 1, Injured.Health), niceZed.scrnRules.HardcoreLevel); + } + } + return Super.ReduceDamage(Damage, injured, InstigatedBy, HitLocation, Momentum, DamageType); +} +defaultproperties +{ + GameName="Nice Team Survival Competition" + Description="Nice Edition of Team Survival Competition (TSCGame)." +} diff --git a/sources/TSC/NiceTSCLobbyFooter.uc b/sources/TSC/NiceTSCLobbyFooter.uc index 67cf338..6552664 100644 --- a/sources/TSC/NiceTSCLobbyFooter.uc +++ b/sources/TSC/NiceTSCLobbyFooter.uc @@ -1,5 +1,22 @@ -class NiceTSCLobbyFooter extends NiceLobbyFooter; -defaultproperties -{ Begin Object Class=GUIButton Name=ReadyButton Caption="Ready" MenuState=MSAT_Disabled Hint="Click to indicate you are ready to play" WinTop=0.966146 WinLeft=0.280000 WinWidth=0.120000 WinHeight=0.033203 RenderWeight=2.000000 TabOrder=4 bBoundToParent=True bVisible=False ToolTip=None - OnClick=TSCLobbyFooter.OnFooterClick OnKeyEvent=ReadyButton.InternalOnKeyEvent End Object b_Ready=GUIButton'NicePack.NiceTSCLobbyFooter.ReadyButton' -} +class NiceTSCLobbyFooter extends NiceLobbyFooter; +defaultproperties +{ + Begin Object Class=GUIButton Name=ReadyButton + Caption="Ready" + MenuState=MSAT_Disabled + Hint="Click to indicate you are ready to play" + WinTop=0.966146 + WinLeft=0.280000 + WinWidth=0.120000 + WinHeight=0.033203 + RenderWeight=2.000000 + TabOrder=4 + bBoundToParent=True + bVisible=False + ToolTip=None + + OnClick=TSCLobbyFooter.OnFooterClick + OnKeyEvent=ReadyButton.InternalOnKeyEvent + End Object + b_Ready=GUIButton'NicePack.NiceTSCLobbyFooter.ReadyButton' +} diff --git a/sources/TSC/NiceTSCLobbyMenu.uc b/sources/TSC/NiceTSCLobbyMenu.uc index e800fe0..8d1a0ed 100644 --- a/sources/TSC/NiceTSCLobbyMenu.uc +++ b/sources/TSC/NiceTSCLobbyMenu.uc @@ -1,4 +1,12 @@ -class NiceTSCLobbyMenu extends TSCLobbyMenu; -defaultproperties -{ Begin Object Class=NiceTSCLobbyFooter Name=BuyFooter RenderWeight=0.300000 TabOrder=8 bBoundToParent=False bScaleToParent=False OnPreDraw=BuyFooter.InternalOnPreDraw End Object t_Footer=NiceTSCLobbyFooter'NicePack.NiceTSCLobbyMenu.BuyFooter' -} +class NiceTSCLobbyMenu extends TSCLobbyMenu; +defaultproperties +{ + Begin Object Class=NiceTSCLobbyFooter Name=BuyFooter + RenderWeight=0.300000 + TabOrder=8 + bBoundToParent=False + bScaleToParent=False + OnPreDraw=BuyFooter.InternalOnPreDraw + End Object + t_Footer=NiceTSCLobbyFooter'NicePack.NiceTSCLobbyMenu.BuyFooter' +} diff --git a/sources/Weapons/BaseWeaponClasses/NiceAmmo.uc b/sources/Weapons/BaseWeaponClasses/NiceAmmo.uc index c9ee980..0774d06 100644 --- a/sources/Weapons/BaseWeaponClasses/NiceAmmo.uc +++ b/sources/Weapons/BaseWeaponClasses/NiceAmmo.uc @@ -1,10 +1,12 @@ -class NiceAmmo extends KFAmmunition; -var class WeaponPickupClass; -function UpdateAmmoAmount(){ - MaxAmmo = Default.MaxAmmo; - if(KFPawn(Owner) != none && KFPlayerReplicationInfo(KFPawn(Owner).PlayerReplicationInfo) != none && KFPlayerReplicationInfo(KFPawn(Owner).PlayerReplicationInfo).ClientVeteranSkill != none) MaxAmmo = float(MaxAmmo) * KFPlayerReplicationInfo(KFPawn(Owner).PlayerReplicationInfo).ClientVeteranSkill.Static.AddExtraAmmoFor(KFPlayerReplicationInfo(KFPawn(Owner).PlayerReplicationInfo), Class); - AmmoAmount = Min(AmmoAmount, MaxAmmo); -} -defaultproperties -{ -} +class NiceAmmo extends KFAmmunition; +var class WeaponPickupClass; +function UpdateAmmoAmount(){ + MaxAmmo = Default.MaxAmmo; + if(KFPawn(Owner) != none && KFPlayerReplicationInfo(KFPawn(Owner).PlayerReplicationInfo) != none && + KFPlayerReplicationInfo(KFPawn(Owner).PlayerReplicationInfo).ClientVeteranSkill != none) + MaxAmmo = float(MaxAmmo) * KFPlayerReplicationInfo(KFPawn(Owner).PlayerReplicationInfo).ClientVeteranSkill.Static.AddExtraAmmoFor(KFPlayerReplicationInfo(KFPawn(Owner).PlayerReplicationInfo), Class); + AmmoAmount = Min(AmmoAmount, MaxAmmo); +} +defaultproperties +{ +} diff --git a/sources/Weapons/BaseWeaponClasses/NiceAmmoPickup.uc b/sources/Weapons/BaseWeaponClasses/NiceAmmoPickup.uc index 0a6961e..086fa92 100644 --- a/sources/Weapons/BaseWeaponClasses/NiceAmmoPickup.uc +++ b/sources/Weapons/BaseWeaponClasses/NiceAmmoPickup.uc @@ -1,15 +1,45 @@ -class NiceAmmoPickup extends ScrnAmmoPickup; -state Pickup -{ - // When touched by an actor. - function Touch(Actor Other){ local Inventory CurInv; local bool bPickedUp; local int AmmoPickupAmount; if(Pawn(Other) != none && Pawn(Other).bCanPickupInventory && Pawn(Other).Controller != none && FastTrace(Other.Location, Location)){ for(CurInv = Other.Inventory;CurInv != none;CurInv = CurInv.Inventory){ - if(KFAmmunition(CurInv) != none && KFAmmunition(CurInv).bAcceptsAmmoPickups){ if(KFAmmunition(CurInv).AmmoPickupAmount > 0){ if(KFAmmunition(CurInv).AmmoAmount < KFAmmunition(CurInv).MaxAmmo){ if(KFPlayerReplicationInfo(Pawn(Other).PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Pawn(Other).PlayerReplicationInfo).ClientVeteranSkill != none) AmmoPickupAmount = float(KFAmmunition(CurInv).AmmoPickupAmount) * KFPlayerReplicationInfo(Pawn(Other).PlayerReplicationInfo).ClientVeteranSkill.static.GetAmmoPickupMod(KFPlayerReplicationInfo(Pawn(Other).PlayerReplicationInfo), KFAmmunition(CurInv)); else AmmoPickupAmount = KFAmmunition(CurInv).AmmoPickupAmount; - KFAmmunition(CurInv).AmmoAmount = Min(KFAmmunition(CurInv).MaxAmmo, KFAmmunition(CurInv).AmmoAmount + AmmoPickupAmount); bPickedUp = true; } } else if(KFAmmunition(CurInv).AmmoAmount < KFAmmunition(CurInv).MaxAmmo){ bPickedUp = true; if(FRand() <= (1.0 / Level.Game.GameDifficulty)) KFAmmunition(CurInv).AmmoAmount++; } } } - if(bPickedUp){ - AnnouncePickup(Pawn(Other)); GotoState('Sleeping', 'Begin'); - if(KFGameType(Level.Game) != none) KFGameType(Level.Game).AmmoPickedUp(self); } } - } -} -defaultproperties -{ -} +class NiceAmmoPickup extends ScrnAmmoPickup; +state Pickup +{ + // When touched by an actor. + function Touch(Actor Other){ + local Inventory CurInv; + local bool bPickedUp; + local int AmmoPickupAmount; + if(Pawn(Other) != none && Pawn(Other).bCanPickupInventory && Pawn(Other).Controller != none && FastTrace(Other.Location, Location)){ + for(CurInv = Other.Inventory;CurInv != none;CurInv = CurInv.Inventory){ + + if(KFAmmunition(CurInv) != none && KFAmmunition(CurInv).bAcceptsAmmoPickups){ + if(KFAmmunition(CurInv).AmmoPickupAmount > 0){ + if(KFAmmunition(CurInv).AmmoAmount < KFAmmunition(CurInv).MaxAmmo){ + if(KFPlayerReplicationInfo(Pawn(Other).PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Pawn(Other).PlayerReplicationInfo).ClientVeteranSkill != none) + AmmoPickupAmount = float(KFAmmunition(CurInv).AmmoPickupAmount) * KFPlayerReplicationInfo(Pawn(Other).PlayerReplicationInfo).ClientVeteranSkill.static.GetAmmoPickupMod(KFPlayerReplicationInfo(Pawn(Other).PlayerReplicationInfo), KFAmmunition(CurInv)); + else + AmmoPickupAmount = KFAmmunition(CurInv).AmmoPickupAmount; + + KFAmmunition(CurInv).AmmoAmount = Min(KFAmmunition(CurInv).MaxAmmo, KFAmmunition(CurInv).AmmoAmount + AmmoPickupAmount); + bPickedUp = true; + } + } + else if(KFAmmunition(CurInv).AmmoAmount < KFAmmunition(CurInv).MaxAmmo){ + bPickedUp = true; + if(FRand() <= (1.0 / Level.Game.GameDifficulty)) + KFAmmunition(CurInv).AmmoAmount++; + } + } + } + + if(bPickedUp){ + + AnnouncePickup(Pawn(Other)); + GotoState('Sleeping', 'Begin'); + + if(KFGameType(Level.Game) != none) + KFGameType(Level.Game).AmmoPickedUp(self); + } + } + } +} +defaultproperties +{ +} diff --git a/sources/Weapons/BaseWeaponClasses/NiceAttachment.uc b/sources/Weapons/BaseWeaponClasses/NiceAttachment.uc index beb8edb..04b651c 100644 --- a/sources/Weapons/BaseWeaponClasses/NiceAttachment.uc +++ b/sources/Weapons/BaseWeaponClasses/NiceAttachment.uc @@ -1,63 +1,131 @@ -class NiceAttachment extends ScrnLaserWeaponAttachment - abstract; -var array SkinRefs; -var bool bSpawnLight; -var bool bSecondaryModeNoEffects; -static function PreloadAssets(optional KFWeaponAttachment Spawned){ - local int i; - if(default.Mesh == none && default.MeshRef != "") UpdateDefaultMesh(Mesh(DynamicLoadObject(default.MeshRef, class'Mesh', true))); - if(default.AmbientSound == none && default.AmbientSoundRef != "") default.AmbientSound = sound(DynamicLoadObject(default.AmbientSoundRef, class'Sound', true)); - if(Spawned != none){ Spawned.LinkMesh(default.Mesh); Spawned.AmbientSound = default.AmbientSound; - } - for(i = 0; i < default.SkinRefs.Length;i ++){ if(default.SkinRefs[i] != "" && (default.Skins.Length < i + 1 || default.Skins[i] == none)) default.Skins[i] = Material(DynamicLoadObject(default.SkinRefs[i], class'Material')); if(Spawned != none) Spawned.Skins[i] = default.Skins[i]; - } -} -static function bool UnloadAssets(){ - local int i; - UpdateDefaultMesh(none); - default.AmbientSound = none; - for(i = 0;i < default.Skins.Length;i ++) default.Skins[i] = none; - return super.UnloadAssets(); -} -simulated event ThirdPersonEffects(){ - local NicePlayerController PC; - if((Level.NetMode == NM_DedicatedServer) || (Instigator == none)) return; - PC = NicePlayerController(Level.GetLocalPlayerController()); - if(FiringMode == 0){ if(OldSpawnHitCount != SpawnHitCount){ OldSpawnHitCount = SpawnHitCount; GetHitInfo(); if(((Instigator != none) && (Instigator.Controller == PC)) || (VSize(PC.ViewTarget.Location - mHitLocation) < 4000)){ if(PC != Instigator.Controller){ 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 && (!bSecondaryModeNoEffects || FiringMode == 0)){ if((Level.TimeSeconds - LastRenderTime > 0.2) && (Instigator.Controller != PC)) return; if(bSpawnLight) WeaponLight(); DoFlashEmitter(); ThirdPersonShellEject(); } - } - else{ GotoState(''); if(KFPawn(Instigator) != none) KFPawn(Instigator).StopFiring(); - } -} -function UpdateHit(Actor HitActor, vector HitLocation, vector HitNormal){ - SpawnHitCount++; - mHitLocation = HitLocation; - mHitActor = HitActor; - mHitNormal = HitNormal; - NetUpdateTime = Level.TimeSeconds - 1; -} -simulated function ThirdPersonShellEject(){ - if((mShellCaseEmitter == none) && (Level.DetailMode != DM_Low) && !Level.bDropDetail){ mShellCaseEmitter = Spawn(mShellCaseEmitterClass); if(mShellCaseEmitter != none) AttachToBone(mShellCaseEmitter, 'ShellPort'); - } - if(mShellCaseEmitter != none) mShellCaseEmitter.mStartParticles++; -} -simulated function SpawnTracerAtLocation(vector HitLocation){ - 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(HitLocation - SpawnLoc) - mTracerPullback; SpawnDir = Normal(HitLocation - 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 CheckForSplashAtLocation(vector HitLoc){ - local Actor HitActor; - local vector HitNormal, HitLocation; - if(!Level.bDropDetail && (Level.DetailMode != DM_Low) && (SplashEffect != none) && !Instigator.PhysicsVolume.bWaterVolume){ // check for splash bTraceWater = true; HitActor = Trace(HitLocation, HitNormal, HitLoc, Instigator.Location, true); bTraceWater = false; if((FluidSurfaceInfo(HitActor) != none) || ((PhysicsVolume(HitActor) != none) && PhysicsVolume(HitActor).bWaterVolume)) Spawn(SplashEffect,,,HitLocation, rot(16384,0,0)); - } -} -defaultproperties -{ bSpawnLight=True -} +class NiceAttachment extends ScrnLaserWeaponAttachment + abstract; +var array SkinRefs; +var bool bSpawnLight; +var bool bSecondaryModeNoEffects; +static function PreloadAssets(optional KFWeaponAttachment Spawned){ + local int i; + if(default.Mesh == none && default.MeshRef != "") + UpdateDefaultMesh(Mesh(DynamicLoadObject(default.MeshRef, class'Mesh', true))); + if(default.AmbientSound == none && default.AmbientSoundRef != "") + default.AmbientSound = sound(DynamicLoadObject(default.AmbientSoundRef, class'Sound', true)); + if(Spawned != none){ + Spawned.LinkMesh(default.Mesh); + Spawned.AmbientSound = default.AmbientSound; + } + for(i = 0; i < default.SkinRefs.Length;i ++){ + if(default.SkinRefs[i] != "" && (default.Skins.Length < i + 1 || default.Skins[i] == none)) + default.Skins[i] = Material(DynamicLoadObject(default.SkinRefs[i], class'Material')); + if(Spawned != none) + Spawned.Skins[i] = default.Skins[i]; + } +} +static function bool UnloadAssets(){ + local int i; + UpdateDefaultMesh(none); + default.AmbientSound = none; + for(i = 0;i < default.Skins.Length;i ++) + default.Skins[i] = none; + return super.UnloadAssets(); +} +simulated event ThirdPersonEffects(){ + local NicePlayerController PC; + if((Level.NetMode == NM_DedicatedServer) || (Instigator == none)) + return; + PC = NicePlayerController(Level.GetLocalPlayerController()); + if(FiringMode == 0){ + if(OldSpawnHitCount != SpawnHitCount){ + OldSpawnHitCount = SpawnHitCount; + GetHitInfo(); + if(((Instigator != none) && (Instigator.Controller == PC)) || (VSize(PC.ViewTarget.Location - mHitLocation) < 4000)){ + if(PC != Instigator.Controller){ + 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 && (!bSecondaryModeNoEffects || FiringMode == 0)){ + if((Level.TimeSeconds - LastRenderTime > 0.2) && (Instigator.Controller != PC)) + return; + if(bSpawnLight) + WeaponLight(); + DoFlashEmitter(); + ThirdPersonShellEject(); + } + } + else{ + GotoState(''); + if(KFPawn(Instigator) != none) + KFPawn(Instigator).StopFiring(); + } +} +function UpdateHit(Actor HitActor, vector HitLocation, vector HitNormal){ + SpawnHitCount++; + mHitLocation = HitLocation; + mHitActor = HitActor; + mHitNormal = HitNormal; + NetUpdateTime = Level.TimeSeconds - 1; +} +simulated function ThirdPersonShellEject(){ + if((mShellCaseEmitter == none) && (Level.DetailMode != DM_Low) && !Level.bDropDetail){ + mShellCaseEmitter = Spawn(mShellCaseEmitterClass); + if(mShellCaseEmitter != none) + AttachToBone(mShellCaseEmitter, 'ShellPort'); + } + if(mShellCaseEmitter != none) + mShellCaseEmitter.mStartParticles++; +} +simulated function SpawnTracerAtLocation(vector HitLocation){ + 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(HitLocation - SpawnLoc) - mTracerPullback; + SpawnDir = Normal(HitLocation - 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 CheckForSplashAtLocation(vector HitLoc){ + local Actor HitActor; + local vector HitNormal, HitLocation; + if(!Level.bDropDetail && (Level.DetailMode != DM_Low) && (SplashEffect != none) && !Instigator.PhysicsVolume.bWaterVolume){ + // check for splash + bTraceWater = true; + HitActor = Trace(HitLocation, HitNormal, HitLoc, Instigator.Location, true); + bTraceWater = false; + if((FluidSurfaceInfo(HitActor) != none) || ((PhysicsVolume(HitActor) != none) && PhysicsVolume(HitActor).bWaterVolume)) + Spawn(SplashEffect,,,HitLocation, rot(16384,0,0)); + } +} +defaultproperties +{ + bSpawnLight=True +} diff --git a/sources/Weapons/BaseWeaponClasses/NiceDamTypeSPAM.uc b/sources/Weapons/BaseWeaponClasses/NiceDamTypeSPAM.uc index 36122b5..d13e9a5 100644 --- a/sources/Weapons/BaseWeaponClasses/NiceDamTypeSPAM.uc +++ b/sources/Weapons/BaseWeaponClasses/NiceDamTypeSPAM.uc @@ -1,5 +1,12 @@ -class NiceDamTypeSPAM extends NiceDamageTypeVetEnforcerBullets - abstract; -defaultproperties -{ bodyDestructionMult=1.000000 HeadShotDamageMult=1.100000 DeathString="%k killed %o (with SPAM)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True -} +class NiceDamTypeSPAM extends NiceDamageTypeVetEnforcerBullets + abstract; +defaultproperties +{ + bodyDestructionMult=1.000000 + HeadShotDamageMult=1.100000 + DeathString="%k killed %o (with SPAM)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True +} diff --git a/sources/Weapons/Grenades/NiceDamTypeNadeNail.uc b/sources/Weapons/Grenades/NiceDamTypeNadeNail.uc index 40a58b0..8758a11 100644 --- a/sources/Weapons/Grenades/NiceDamTypeNadeNail.uc +++ b/sources/Weapons/Grenades/NiceDamTypeNadeNail.uc @@ -1,5 +1,6 @@ -class NiceDamTypeNadeNail extends NiceDamTypeNailGun - abstract; -defaultproperties -{ stunMultiplier=10.000000 -} +class NiceDamTypeNadeNail extends NiceDamTypeNailGun + abstract; +defaultproperties +{ + stunMultiplier=10.000000 +} diff --git a/sources/Weapons/Grenades/NiceDamTypeSmallNail.uc b/sources/Weapons/Grenades/NiceDamTypeSmallNail.uc index b7d48ac..236acfa 100644 --- a/sources/Weapons/Grenades/NiceDamTypeSmallNail.uc +++ b/sources/Weapons/Grenades/NiceDamTypeSmallNail.uc @@ -1,5 +1,7 @@ -class NiceDamTypeSmallNail extends NiceDamTypeNailGun - abstract; -defaultproperties -{ headSizeModifier=2.000000 HeadShotDamageMult=1.000000 -} +class NiceDamTypeSmallNail extends NiceDamTypeNailGun + abstract; +defaultproperties +{ + headSizeModifier=2.000000 + HeadShotDamageMult=1.000000 +} diff --git a/sources/Weapons/NiceCollisionManager.uc b/sources/Weapons/NiceCollisionManager.uc index 1d4412d..8481b0e 100644 --- a/sources/Weapons/NiceCollisionManager.uc +++ b/sources/Weapons/NiceCollisionManager.uc @@ -1,69 +1,93 @@ -class NiceCollisionManager extends Actor; -struct SphereCollision{ - var int ID; - var float radius; - var NiceMonster base; - var bool bDiscarded; - var float endTime; -}; -var float lastCleanupTime; -var array collisionSpheres; -function bool IsCollisionSpoiled(SphereCollision collision){ - return (collision.base == none || collision.base.health <= 0 || collision.bDiscarded || Level.TimeSeconds > collision.endTime); -} -function bool CubeCheck(Vector a, Vector b, float minX, float minY, float minZ, float cubeSide){ - if( (a.x < minX && b.x < minX) || (a.x > minX + 2 * cubeSide && b.x > minX + 2 * cubeSide) ) return false; - if( (a.y < minY && b.y < minY) || (a.y > minY + 2 * cubeSide && b.y > minY + 2 * cubeSide) ) return false; - if( (a.z < minZ && b.z < minZ) || (a.z > minZ + 2 * cubeSide && b.z > minZ + 2 * cubeSide) ) return false; - return true; -} -function AddSphereCollision(int ID, float radius, NiceMonster colOwner, float endTiming){ - local SphereCollision newCollision; - newCollision.ID = ID; - newCollision.radius = radius; - newCollision.base = colOwner; - newCollision.endTime = endTiming; - CleanCollisions(); - collisionSpheres[collisionSpheres.Length] = newCollision; -} -function RemoveSphereCollision(int ID){ - local int i; - for(i = 0;i < collisionSpheres.Length;i ++) if(collisionSpheres[i].ID == ID) collisionSpheres[i].bDiscarded = true; - CleanCollisions(); -} -function bool CheckSphereCollision(Vector a, Vector b, SphereCollision collision){ - local Vector segmentVector; - local float sqDistToProjCenter; - local float squaredRadius; - if(IsCollisionSpoiled(collision)) return false; - if(!CubeCheck(a, b, collision.base.location.x - collision.radius, collision.base.location.y - collision.radius, collision.base.location.z - collision.radius, collision.radius)) return false; - squaredRadius = collision.radius ** 2; - if(VSizeSquared(a - collision.base.location) <= squaredRadius) return true; - if(VSizeSquared(b - collision.base.location) <= squaredRadius) return true; - segmentVector = b - a; - sqDistToProjCenter = (collision.base.location - a) dot segmentVector; - if(sqDistToProjCenter < 0) return false; - sqDistToProjCenter = sqDistToProjCenter ** 2; - sqDistToProjCenter = sqDistToProjCenter / (segmentVector dot segmentVector); - if(sqDistToProjCenter < squaredRadius) return true; - return false; -} -function bool IsCollidingWithAnything(Vector a, Vector b){ - local int i; - for(i = 0;i < collisionSpheres.Length;i ++) if(CheckSphereCollision(a, b, collisionSpheres[i])) return true; - return false; -} -function CleanCollisions(){ - local int i; - local bool bNeedsCleaning; - local array newSpheresArray; - if(lastCleanupTime + 1.0 > Level.TimeSeconds) return; - lastCleanupTime = Level.TimeSeconds; - for(i = 0;i < collisionSpheres.Length;i ++) if(IsCollisionSpoiled(collisionSpheres[i])){ bNeedsCleaning = true; break; } - if(bNeedsCleaning){ for(i = 0;i < collisionSpheres.Length;i ++) if(!IsCollisionSpoiled(collisionSpheres[i])) newSpheresArray[newSpheresArray.Length] = collisionSpheres[i]; - } - collisionSpheres = newSpheresArray; -} -defaultproperties -{ bHidden=True -} +class NiceCollisionManager extends Actor; +struct SphereCollision{ + var int ID; + var float radius; + var NiceMonster base; + var bool bDiscarded; + var float endTime; +}; +var float lastCleanupTime; +var array collisionSpheres; +function bool IsCollisionSpoiled(SphereCollision collision){ + return (collision.base == none || collision.base.health <= 0 || collision.bDiscarded || Level.TimeSeconds > collision.endTime); +} +function bool CubeCheck(Vector a, Vector b, float minX, float minY, float minZ, float cubeSide){ + if( (a.x < minX && b.x < minX) || (a.x > minX + 2 * cubeSide && b.x > minX + 2 * cubeSide) ) + return false; + if( (a.y < minY && b.y < minY) || (a.y > minY + 2 * cubeSide && b.y > minY + 2 * cubeSide) ) + return false; + if( (a.z < minZ && b.z < minZ) || (a.z > minZ + 2 * cubeSide && b.z > minZ + 2 * cubeSide) ) + return false; + return true; +} +function AddSphereCollision(int ID, float radius, NiceMonster colOwner, float endTiming){ + local SphereCollision newCollision; + newCollision.ID = ID; + newCollision.radius = radius; + newCollision.base = colOwner; + newCollision.endTime = endTiming; + CleanCollisions(); + collisionSpheres[collisionSpheres.Length] = newCollision; +} +function RemoveSphereCollision(int ID){ + local int i; + for(i = 0;i < collisionSpheres.Length;i ++) + if(collisionSpheres[i].ID == ID) + collisionSpheres[i].bDiscarded = true; + CleanCollisions(); +} +function bool CheckSphereCollision(Vector a, Vector b, SphereCollision collision){ + local Vector segmentVector; + local float sqDistToProjCenter; + local float squaredRadius; + if(IsCollisionSpoiled(collision)) + return false; + if(!CubeCheck(a, b, collision.base.location.x - collision.radius, + collision.base.location.y - collision.radius, + collision.base.location.z - collision.radius, collision.radius)) + return false; + squaredRadius = collision.radius ** 2; + if(VSizeSquared(a - collision.base.location) <= squaredRadius) + return true; + if(VSizeSquared(b - collision.base.location) <= squaredRadius) + return true; + segmentVector = b - a; + sqDistToProjCenter = (collision.base.location - a) dot segmentVector; + if(sqDistToProjCenter < 0) + return false; + sqDistToProjCenter = sqDistToProjCenter ** 2; + sqDistToProjCenter = sqDistToProjCenter / (segmentVector dot segmentVector); + if(sqDistToProjCenter < squaredRadius) + return true; + return false; +} +function bool IsCollidingWithAnything(Vector a, Vector b){ + local int i; + for(i = 0;i < collisionSpheres.Length;i ++) + if(CheckSphereCollision(a, b, collisionSpheres[i])) + return true; + return false; +} +function CleanCollisions(){ + local int i; + local bool bNeedsCleaning; + local array newSpheresArray; + if(lastCleanupTime + 1.0 > Level.TimeSeconds) + return; + lastCleanupTime = Level.TimeSeconds; + for(i = 0;i < collisionSpheres.Length;i ++) + if(IsCollisionSpoiled(collisionSpheres[i])){ + bNeedsCleaning = true; + break; + } + if(bNeedsCleaning){ + for(i = 0;i < collisionSpheres.Length;i ++) + if(!IsCollisionSpoiled(collisionSpheres[i])) + newSpheresArray[newSpheresArray.Length] = collisionSpheres[i]; + } + collisionSpheres = newSpheresArray; +} +defaultproperties +{ + bHidden=True +} diff --git a/sources/Weapons/NiceScopedWeapon.uc b/sources/Weapons/NiceScopedWeapon.uc index e9a80fe..29c4aa3 100644 --- a/sources/Weapons/NiceScopedWeapon.uc +++ b/sources/Weapons/NiceScopedWeapon.uc @@ -1,236 +1,441 @@ -class NiceScopedWeapon extends NiceWeapon - abstract; -#exec OBJ LOAD FILE=ScopeShaders.utx -#exec OBJ LOAD FILE=..\Textures\NicePackT.utx -#exec OBJ LOAD FILE=ScrnWeaponPack_T.utx -#exec OBJ LOAD FILE=ScrnWeaponPack_A.ukx -var() Material ZoomMat; -var() Sound ZoomSound; -var() int lenseMaterialID; // used since material id's seem to change alot -var() float scopePortalFOVHigh; // The FOV to zoom the scope portal by. -var() float scopePortalFOV; // The FOV to zoom the scope portal by. -var() vector XoffsetScoped; -var() vector XoffsetHighDetail; -var() int tileSize; -// 3d Scope vars -var ScriptedTexture ScopeScriptedTexture; // Scripted texture for 3d scopes -var Shader ScopeScriptedShader; // The shader that combines the scripted texture with the sight overlay -var Material ScriptedTextureFallback; // The texture to render if the users system doesn't support shaders -// new scope vars -var Combiner ScriptedScopeCombiner; -var texture TexturedScopeTexture; -var bool bInitializedScope; // Set to true when the scope has been initialized -var string ZoomMatRef; -var string ScriptedTextureFallbackRef; -var texture CrosshairTex; -var string CrosshairTexRef; -static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount){ - local NiceScopedWeapon W; - super.PreloadAssets(Inv, bSkipRefCount); - if(default.ZoomMat == none && default.ZoomMatRef != ""){ // Try to load as various types of materials default.ZoomMat = FinalBlend(DynamicLoadObject(default.ZoomMatRef, class'FinalBlend', true)); if(default.ZoomMat == none) default.ZoomMat = Combiner(DynamicLoadObject(default.ZoomMatRef, class'Combiner', true)); if(default.ZoomMat == none) default.ZoomMat = Shader(DynamicLoadObject(default.ZoomMatRef, class'Shader', true)); if(default.ZoomMat == none) default.ZoomMat = Texture(DynamicLoadObject(default.ZoomMatRef, class'Texture', true)); if(default.ZoomMat == none) default.ZoomMat = Material(DynamicLoadObject(default.ZoomMatRef, class'Material')); - } - if(default.ScriptedTextureFallback == none && default.ScriptedTextureFallbackRef != "") default.ScriptedTextureFallback = texture(DynamicLoadObject(default.ScriptedTextureFallbackRef, class'texture')); - if(default.CrosshairTex == none && default.CrosshairTexRef != "") default.CrosshairTex = Texture(DynamicLoadObject(default.CrosshairTexRef, class'texture')); - W = NiceScopedWeapon(Inv); - if(W != none){ W.ZoomMat = default.ZoomMat; W.ScriptedTextureFallback = default.ScriptedTextureFallback; W.CrosshairTex = default.CrosshairTex; - } -} -static function bool UnloadAssets(){ - if(super.UnloadAssets()){ default.ZoomMat = none; default.ScriptedTextureFallback = none; default.CrosshairTex = none; - } - return true; -} -simulated function bool ShouldDrawPortal() -{ - if(bAimingRifle) return true; - else return false; -} -simulated function PostBeginPlay() -{ - super.PostBeginPlay(); - // Get new scope detail value from KFWeapon - KFScopeDetail = class'KFMod.KFWeapon'.default.KFScopeDetail; - UpdateScopeMode(); -} -// Handles initializing and swithing between different scope modes -simulated function UpdateScopeMode() -{ - if (Level.NetMode != NM_DedicatedServer && Instigator != none && Instigator.IsLocallyControlled() && Instigator.IsHumanControlled()){ if(KFScopeDetail == KF_ModelScope){ scopePortalFOV = default.scopePortalFOV; ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); - if (bUsingSights || bAimingRifle) PlayerViewOffset = XoffsetScoped; - if(ScopeScriptedTexture == none) ScopeScriptedTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture')); - ScopeScriptedTexture.FallBackMaterial = ScriptedTextureFallback; ScopeScriptedTexture.SetSize(512,512); ScopeScriptedTexture.Client = Self; - if(ScriptedScopeCombiner == none){ ScriptedScopeCombiner = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); ScriptedScopeCombiner.Material1 = CrosshairTex; ScriptedScopeCombiner.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; ScriptedScopeCombiner.CombineOperation = CO_Multiply; ScriptedScopeCombiner.AlphaOperation = AO_Use_Mask; ScriptedScopeCombiner.Material2 = ScopeScriptedTexture; } if(ScopeScriptedShader == none){ ScopeScriptedShader = Shader(Level.ObjectPool.AllocateObject(class'Shader')); ScopeScriptedShader.Diffuse = ScriptedScopeCombiner; ScopeScriptedShader.SelfIllumination = ScriptedScopeCombiner; ScopeScriptedShader.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; } - bInitializedScope = true; } else if( KFScopeDetail == KF_ModelScopeHigh ) { scopePortalFOV = scopePortalFOVHigh; ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOVHigh); if(bUsingSights || bAimingRifle) PlayerViewOffset = XoffsetHighDetail; - if(ScopeScriptedTexture == none) ScopeScriptedTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture')); ScopeScriptedTexture.FallBackMaterial = ScriptedTextureFallback; ScopeScriptedTexture.SetSize(1024,1024); ScopeScriptedTexture.Client = Self; - if(ScriptedScopeCombiner == none){ ScriptedScopeCombiner = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); ScriptedScopeCombiner.Material1 = CrosshairTex; ScriptedScopeCombiner.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; ScriptedScopeCombiner.CombineOperation = CO_Multiply; ScriptedScopeCombiner.AlphaOperation = AO_Use_Mask; ScriptedScopeCombiner.Material2 = ScopeScriptedTexture; } - if(ScopeScriptedShader == none){ ScopeScriptedShader = Shader(Level.ObjectPool.AllocateObject(class'Shader')); ScopeScriptedShader.Diffuse = ScriptedScopeCombiner; ScopeScriptedShader.SelfIllumination = ScriptedScopeCombiner; ScopeScriptedShader.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; } - bInitializedScope = true; } else if (KFScopeDetail == KF_TextureScope){ ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); PlayerViewOffset.X = default.PlayerViewOffset.X; - bInitializedScope = true; } - } -} -simulated event RenderTexture(ScriptedTexture Tex) -{ - local rotator RollMod; - RollMod = Instigator.GetViewRotation(); - if(Owner != none && Instigator != none && Tex != none && Tex.Client != none) Tex.DrawPortal(0,0,Tex.USize,Tex.VSize,Owner,(Instigator.Location + Instigator.EyePosition()), RollMod, scopePortalFOV ); -} -simulated function SetZoomBlendColor(Canvas c) -{ - local Byte val; - local Color clr; - local Color fog; - clr.R = 255; - clr.G = 255; - clr.B = 255; - clr.A = 255; - if(Instigator.Region.Zone.bDistanceFog){ fog = Instigator.Region.Zone.DistanceFogColor; val = 0; val = Max(val, fog.R); val = Max(val, fog.G); val = Max(val, fog.B); if(val > 128){ val -= 128; clr.R -= val; clr.G -= val; clr.B -= val; } - } - c.DrawColor = clr; -} -//Handles all the functionality for zooming in including -// setting the parameters for the weapon, pawn, and playercontroller -simulated function ZoomIn(bool bAnimateTransition) -{ - default.ZoomTime = default.recordedZoomTime; - PlayerIronSightFOV = default.PlayerIronSightFOV; - scopePortalFOVHigh = default.scopePortalFOVHigh; - scopePortalFOV = default.scopePortalFOV; - PlayerIronSightFOV = default.PlayerIronSightFOV; - if(instigator != none && instigator.bIsCrouched && class'NiceVeterancyTypes'.static.hasSkill(NicePlayerController(Instigator.Controller), class'NiceSkillSharpshooterHardWork')){ default.ZoomTime *= class'NiceSkillSharpshooterHardWork'.default.zoomSpeedBonus; if(instigator != none && instigator.bIsCrouched){ PlayerIronSightFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; scopePortalFOVHigh *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; scopePortalFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; PlayerIronSightFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; } - } - super(BaseKFWeapon).ZoomIn(bAnimateTransition); - bAimingRifle = True; - if(KFHumanPawn(Instigator) != none) KFHumanPawn(Instigator).SetAiming(True); - if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ){ if(AimInSound != none) PlayOwnedSound(AimInSound, SLOT_Interact,,,,, false); - } -} -// Handles all the functionality for zooming out including -// setting the parameters for the weapon, pawn, and playercontroller -simulated function ZoomOut(bool bAnimateTransition) -{ - default.ZoomTime = default.recordedZoomTime; - PlayerIronSightFOV = default.PlayerIronSightFOV; - scopePortalFOVHigh = default.scopePortalFOVHigh; - scopePortalFOV = default.scopePortalFOV; - PlayerIronSightFOV = default.PlayerIronSightFOV; - if(class'NiceVeterancyTypes'.static.hasSkill(NicePlayerController(Instigator.Controller), class'NiceSkillSharpshooterHardWork')){ default.ZoomTime *= class'NiceSkillSharpshooterHardWork'.default.zoomSpeedBonus; PlayerIronSightFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; scopePortalFOVHigh *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; scopePortalFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; PlayerIronSightFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; - } - super.ZoomOut(bAnimateTransition); - bAimingRifle = False; - if( KFHumanPawn(Instigator)!=none ) KFHumanPawn(Instigator).SetAiming(False); - if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) - { if( AimOutSound != none ) { PlayOwnedSound(AimOutSound, SLOT_Interact,,,,, false); } KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); - } -} -simulated function WeaponTick(float dt) -{ - super.WeaponTick(dt); - if(bAimingRifle && ForceZoomOutTime > 0 && Level.TimeSeconds - ForceZoomOutTime > 0) - { ForceZoomOutTime = 0; - ZoomOut(false); - if(Role < ROLE_Authority) ServerZoomOut(false); - } -} -// Called by the native code when the interpolation of the first person weapon to the zoomed position finishes -simulated event OnZoomInFinished() -{ - local name anim; - local float frame, rate; - GetAnimParams(0, anim, frame, rate); - if (ClientState == WS_ReadyToFire) - { // Play the iron idle anim when we're finished zooming in if (anim == IdleAnim) { PlayIdle(); } - } - if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none && KFScopeDetail == KF_TextureScope ) - { KFPlayerController(Instigator.Controller).TransitionFOV(PlayerIronSightFOV,0.0); - } -} -simulated function bool CanZoomNow() -{ - Return (!FireMode[0].bIsFiring && !FireMode[1].bIsFiring && Instigator!=none && Instigator.Physics!=PHYS_Falling); -} -simulated event RenderOverlays(Canvas Canvas) -{ - local int m; - local PlayerController PC; - if (Instigator == none) return; - PC = PlayerController(Instigator.Controller); - if(PC == none) return; - if(!bInitializedScope && PC != none ) - { UpdateScopeMode(); - } - Canvas.DrawActor(none, false, true); - for (m = 0; m < NUM_FIRE_MODES; m++) - { if (FireMode[m] != none) { FireMode[m].DrawMuzzleFlash(Canvas); } - } - - SetLocation( Instigator.Location + Instigator.CalcDrawOffset(self) ); - SetRotation( Instigator.GetViewRotation() + ZoomRotInterp); - PreDrawFPWeapon(); - if(bAimingRifle && PC != none && (KFScopeDetail == KF_ModelScope || KFScopeDetail == KF_ModelScopeHigh)){ if(ShouldDrawPortal()){ if(ScopeScriptedTexture != none){ Skins[LenseMaterialID] = ScopeScriptedShader; ScopeScriptedTexture.Client = Self; ScopeScriptedTexture.Revision = (ScopeScriptedTexture.Revision + 1); } } - bDrawingFirstPerson = true; Canvas.DrawBoundActor(self, false, false,DisplayFOV,PC.Rotation,rot(0,0,0),Instigator.CalcZoomedDrawOffset(self)); bDrawingFirstPerson = false; - } - else if(KFScopeDetail == KF_TextureScope && PC.DesiredFOV == PlayerIronSightFOV && bAimingRifle){ Skins[LenseMaterialID] = ScriptedTextureFallback; - SetZoomBlendColor(Canvas); - Canvas.Style = ERenderStyle.STY_Normal; Canvas.SetPos(0, 0); Canvas.DrawTile(ZoomMat, (Canvas.SizeX - Canvas.SizeY) / 2, Canvas.SizeY, 0.0, 0.0, 8, 8); Canvas.SetPos(Canvas.SizeX, 0); Canvas.DrawTile(ZoomMat, -(Canvas.SizeX - Canvas.SizeY) / 2, Canvas.SizeY, 0.0, 0.0, 8, 8); - Canvas.Style = 255; Canvas.SetPos((Canvas.SizeX - Canvas.SizeY) / 2,0); Canvas.DrawTile(ZoomMat, Canvas.SizeY, Canvas.SizeY, 0.0, 0.0, tileSize, tileSize); - Canvas.Font = Canvas.MedFont; Canvas.SetDrawColor(200,150,0); - Canvas.SetPos(Canvas.SizeX * 0.16, Canvas.SizeY * 0.43); Canvas.DrawText(" "); - Canvas.SetPos(Canvas.SizeX * 0.16, Canvas.SizeY * 0.47); - } - else{ Skins[LenseMaterialID] = ScriptedTextureFallback; bDrawingFirstPerson = true; Canvas.DrawActor(self, false, false, DisplayFOV); bDrawingFirstPerson = false; - } -} -// Adjust a single FOV based on the current aspect ratio. Adjust FOV is the default NON-aspect ratio adjusted FOV to adjust -simulated function float CalcAspectRatioAdjustedFOV(float AdjustFOV) -{ - local KFPlayerController KFPC; - local float ResX, ResY; - local float AspectRatio; - KFPC = KFPlayerController(Level.GetLocalPlayerController()); - if( KFPC == none ) - { return AdjustFOV; - } - ResX = float(GUIController(KFPC.Player.GUIController).ResX); - ResY = float(GUIController(KFPC.Player.GUIController).ResY); - AspectRatio = ResX / ResY; - if ( KFPC.bUseTrueWideScreenFOV && AspectRatio >= 1.60 ) //1.6 = 16/10 which is 16:10 ratio and 16:9 comes to 1.77 - { return CalcFOVForAspectRatio(AdjustFOV); - } - else - { return AdjustFOV; - } -} -// AdjustIngameScope(RO) - Takes the changes to the ScopeDetail variable and -// sets the scope to the new detail mode. Called when the player switches the -// scope setting ingame, or when the scope setting is changed from the menu -simulated function AdjustIngameScope() -{ - local PlayerController PC; - if(Instigator == none || PlayerController(Instigator.Controller) == none) return; - PC = PlayerController(Instigator.Controller); - if(!bHasScope) return; - switch (KFScopeDetail) - { case KF_ModelScope: if(bAimingRifle) DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); if (PC.DesiredFOV == PlayerIronSightFOV && bAimingRifle){ if(Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none) KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); } break; - case KF_TextureScope: if(bAimingRifle) DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); if (bAimingRifle && PC.DesiredFOV != PlayerIronSightFOV){ if(Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none) KFPlayerController(Instigator.Controller).TransitionFOV(PlayerIronSightFOV,0.0); } break; - case KF_ModelScopeHigh: if(bAimingRifle){ if(default.ZoomedDisplayFOVHigh > 0) DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOVHigh); else DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); } if ( bAimingRifle && PC.DesiredFOV == PlayerIronSightFOV ) { if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) { KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); } } break; - } - // Make any chagned to the scope setup - UpdateScopeMode(); -} -simulated event Destroyed() -{ - PreTravelCleanUp(); - Super.Destroyed(); -} -simulated function PreTravelCleanUp() -{ - if(ScopeScriptedTexture != none){ ScopeScriptedTexture.Client = none; Level.ObjectPool.FreeObject(ScopeScriptedTexture); ScopeScriptedTexture=none; - } - if(ScriptedScopeCombiner != none){ ScriptedScopeCombiner.Material2 = none; Level.ObjectPool.FreeObject(ScriptedScopeCombiner); ScriptedScopeCombiner = none; - } - if(ScopeScriptedShader != none){ ScopeScriptedShader.Diffuse = none; ScopeScriptedShader.SelfIllumination = none; Level.ObjectPool.FreeObject(ScopeScriptedShader); ScopeScriptedShader = none; - } -} -defaultproperties -{ tileSize=1024 -} +class NiceScopedWeapon extends NiceWeapon + abstract; +#exec OBJ LOAD FILE=ScopeShaders.utx +#exec OBJ LOAD FILE=..\Textures\NicePackT.utx +#exec OBJ LOAD FILE=ScrnWeaponPack_T.utx +#exec OBJ LOAD FILE=ScrnWeaponPack_A.ukx +var() Material ZoomMat; +var() Sound ZoomSound; +var() int lenseMaterialID; // used since material id's seem to change alot +var() float scopePortalFOVHigh; // The FOV to zoom the scope portal by. +var() float scopePortalFOV; // The FOV to zoom the scope portal by. +var() vector XoffsetScoped; +var() vector XoffsetHighDetail; +var() int tileSize; +// 3d Scope vars +var ScriptedTexture ScopeScriptedTexture; // Scripted texture for 3d scopes +var Shader ScopeScriptedShader; // The shader that combines the scripted texture with the sight overlay +var Material ScriptedTextureFallback; // The texture to render if the users system doesn't support shaders +// new scope vars +var Combiner ScriptedScopeCombiner; +var texture TexturedScopeTexture; +var bool bInitializedScope; // Set to true when the scope has been initialized +var string ZoomMatRef; +var string ScriptedTextureFallbackRef; +var texture CrosshairTex; +var string CrosshairTexRef; +static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount){ + local NiceScopedWeapon W; + super.PreloadAssets(Inv, bSkipRefCount); + if(default.ZoomMat == none && default.ZoomMatRef != ""){ + // Try to load as various types of materials + default.ZoomMat = FinalBlend(DynamicLoadObject(default.ZoomMatRef, class'FinalBlend', true)); + if(default.ZoomMat == none) + default.ZoomMat = Combiner(DynamicLoadObject(default.ZoomMatRef, class'Combiner', true)); + if(default.ZoomMat == none) + default.ZoomMat = Shader(DynamicLoadObject(default.ZoomMatRef, class'Shader', true)); + if(default.ZoomMat == none) + default.ZoomMat = Texture(DynamicLoadObject(default.ZoomMatRef, class'Texture', true)); + if(default.ZoomMat == none) + default.ZoomMat = Material(DynamicLoadObject(default.ZoomMatRef, class'Material')); + } + if(default.ScriptedTextureFallback == none && default.ScriptedTextureFallbackRef != "") + default.ScriptedTextureFallback = texture(DynamicLoadObject(default.ScriptedTextureFallbackRef, class'texture')); + if(default.CrosshairTex == none && default.CrosshairTexRef != "") + default.CrosshairTex = Texture(DynamicLoadObject(default.CrosshairTexRef, class'texture')); + W = NiceScopedWeapon(Inv); + if(W != none){ + W.ZoomMat = default.ZoomMat; + W.ScriptedTextureFallback = default.ScriptedTextureFallback; + W.CrosshairTex = default.CrosshairTex; + } +} +static function bool UnloadAssets(){ + if(super.UnloadAssets()){ + default.ZoomMat = none; + default.ScriptedTextureFallback = none; + default.CrosshairTex = none; + } + return true; +} +simulated function bool ShouldDrawPortal() +{ + if(bAimingRifle) + return true; + else + return false; +} +simulated function PostBeginPlay() +{ + super.PostBeginPlay(); + // Get new scope detail value from KFWeapon + KFScopeDetail = class'KFMod.KFWeapon'.default.KFScopeDetail; + UpdateScopeMode(); +} +// Handles initializing and swithing between different scope modes +simulated function UpdateScopeMode() +{ + if (Level.NetMode != NM_DedicatedServer && Instigator != none && Instigator.IsLocallyControlled() && Instigator.IsHumanControlled()){ + if(KFScopeDetail == KF_ModelScope){ + scopePortalFOV = default.scopePortalFOV; + ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); + + if (bUsingSights || bAimingRifle) + PlayerViewOffset = XoffsetScoped; + + if(ScopeScriptedTexture == none) + ScopeScriptedTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture')); + + ScopeScriptedTexture.FallBackMaterial = ScriptedTextureFallback; + ScopeScriptedTexture.SetSize(512,512); + ScopeScriptedTexture.Client = Self; + + if(ScriptedScopeCombiner == none){ + ScriptedScopeCombiner = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); + ScriptedScopeCombiner.Material1 = CrosshairTex; + ScriptedScopeCombiner.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; + ScriptedScopeCombiner.CombineOperation = CO_Multiply; + ScriptedScopeCombiner.AlphaOperation = AO_Use_Mask; + ScriptedScopeCombiner.Material2 = ScopeScriptedTexture; + } + if(ScopeScriptedShader == none){ + ScopeScriptedShader = Shader(Level.ObjectPool.AllocateObject(class'Shader')); + ScopeScriptedShader.Diffuse = ScriptedScopeCombiner; + ScopeScriptedShader.SelfIllumination = ScriptedScopeCombiner; + ScopeScriptedShader.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; + } + + bInitializedScope = true; + } + else if( KFScopeDetail == KF_ModelScopeHigh ) + { + scopePortalFOV = scopePortalFOVHigh; + ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOVHigh); + if(bUsingSights || bAimingRifle) + PlayerViewOffset = XoffsetHighDetail; + + if(ScopeScriptedTexture == none) + ScopeScriptedTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture')); + ScopeScriptedTexture.FallBackMaterial = ScriptedTextureFallback; + ScopeScriptedTexture.SetSize(1024,1024); + ScopeScriptedTexture.Client = Self; + + if(ScriptedScopeCombiner == none){ + ScriptedScopeCombiner = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); + ScriptedScopeCombiner.Material1 = CrosshairTex; + ScriptedScopeCombiner.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; + ScriptedScopeCombiner.CombineOperation = CO_Multiply; + ScriptedScopeCombiner.AlphaOperation = AO_Use_Mask; + ScriptedScopeCombiner.Material2 = ScopeScriptedTexture; + } + + if(ScopeScriptedShader == none){ + ScopeScriptedShader = Shader(Level.ObjectPool.AllocateObject(class'Shader')); + ScopeScriptedShader.Diffuse = ScriptedScopeCombiner; + ScopeScriptedShader.SelfIllumination = ScriptedScopeCombiner; + ScopeScriptedShader.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; + } + + bInitializedScope = true; + } + else if (KFScopeDetail == KF_TextureScope){ + ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); + PlayerViewOffset.X = default.PlayerViewOffset.X; + + bInitializedScope = true; + } + } +} +simulated event RenderTexture(ScriptedTexture Tex) +{ + local rotator RollMod; + RollMod = Instigator.GetViewRotation(); + if(Owner != none && Instigator != none && Tex != none && Tex.Client != none) + Tex.DrawPortal(0,0,Tex.USize,Tex.VSize,Owner,(Instigator.Location + Instigator.EyePosition()), RollMod, scopePortalFOV ); +} +simulated function SetZoomBlendColor(Canvas c) +{ + local Byte val; + local Color clr; + local Color fog; + clr.R = 255; + clr.G = 255; + clr.B = 255; + clr.A = 255; + if(Instigator.Region.Zone.bDistanceFog){ + fog = Instigator.Region.Zone.DistanceFogColor; + val = 0; + val = Max(val, fog.R); + val = Max(val, fog.G); + val = Max(val, fog.B); + if(val > 128){ + val -= 128; + clr.R -= val; + clr.G -= val; + clr.B -= val; + } + } + c.DrawColor = clr; +} +//Handles all the functionality for zooming in including +// setting the parameters for the weapon, pawn, and playercontroller +simulated function ZoomIn(bool bAnimateTransition) +{ + default.ZoomTime = default.recordedZoomTime; + PlayerIronSightFOV = default.PlayerIronSightFOV; + scopePortalFOVHigh = default.scopePortalFOVHigh; + scopePortalFOV = default.scopePortalFOV; + PlayerIronSightFOV = default.PlayerIronSightFOV; + if(instigator != none && instigator.bIsCrouched && class'NiceVeterancyTypes'.static.hasSkill(NicePlayerController(Instigator.Controller), class'NiceSkillSharpshooterHardWork')){ + default.ZoomTime *= class'NiceSkillSharpshooterHardWork'.default.zoomSpeedBonus; + if(instigator != none && instigator.bIsCrouched){ + PlayerIronSightFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; + scopePortalFOVHigh *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; + scopePortalFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; + PlayerIronSightFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; + } + } + super(BaseKFWeapon).ZoomIn(bAnimateTransition); + bAimingRifle = True; + if(KFHumanPawn(Instigator) != none) + KFHumanPawn(Instigator).SetAiming(True); + if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ){ + if(AimInSound != none) + PlayOwnedSound(AimInSound, SLOT_Interact,,,,, false); + } +} +// Handles all the functionality for zooming out including +// setting the parameters for the weapon, pawn, and playercontroller +simulated function ZoomOut(bool bAnimateTransition) +{ + default.ZoomTime = default.recordedZoomTime; + PlayerIronSightFOV = default.PlayerIronSightFOV; + scopePortalFOVHigh = default.scopePortalFOVHigh; + scopePortalFOV = default.scopePortalFOV; + PlayerIronSightFOV = default.PlayerIronSightFOV; + if(class'NiceVeterancyTypes'.static.hasSkill(NicePlayerController(Instigator.Controller), class'NiceSkillSharpshooterHardWork')){ + default.ZoomTime *= class'NiceSkillSharpshooterHardWork'.default.zoomSpeedBonus; + PlayerIronSightFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; + scopePortalFOVHigh *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; + scopePortalFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; + PlayerIronSightFOV *= class'NiceSkillSharpshooterHardWork'.default.zoomBonus; + } + super.ZoomOut(bAnimateTransition); + bAimingRifle = False; + if( KFHumanPawn(Instigator)!=none ) + KFHumanPawn(Instigator).SetAiming(False); + if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) + { + if( AimOutSound != none ) + { + PlayOwnedSound(AimOutSound, SLOT_Interact,,,,, false); + } + KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); + } +} +simulated function WeaponTick(float dt) +{ + super.WeaponTick(dt); + if(bAimingRifle && ForceZoomOutTime > 0 && Level.TimeSeconds - ForceZoomOutTime > 0) + { + ForceZoomOutTime = 0; + + ZoomOut(false); + + if(Role < ROLE_Authority) + ServerZoomOut(false); + } +} +// Called by the native code when the interpolation of the first person weapon to the zoomed position finishes +simulated event OnZoomInFinished() +{ + local name anim; + local float frame, rate; + GetAnimParams(0, anim, frame, rate); + if (ClientState == WS_ReadyToFire) + { + // Play the iron idle anim when we're finished zooming in + if (anim == IdleAnim) + { + PlayIdle(); + } + } + if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none && + KFScopeDetail == KF_TextureScope ) + { + KFPlayerController(Instigator.Controller).TransitionFOV(PlayerIronSightFOV,0.0); + } +} +simulated function bool CanZoomNow() +{ + Return (!FireMode[0].bIsFiring && !FireMode[1].bIsFiring && Instigator!=none && Instigator.Physics!=PHYS_Falling); +} +simulated event RenderOverlays(Canvas Canvas) +{ + local int m; + local PlayerController PC; + if (Instigator == none) + return; + PC = PlayerController(Instigator.Controller); + if(PC == none) + return; + if(!bInitializedScope && PC != none ) + { + UpdateScopeMode(); + } + Canvas.DrawActor(none, false, true); + for (m = 0; m < NUM_FIRE_MODES; m++) + { + if (FireMode[m] != none) + { + FireMode[m].DrawMuzzleFlash(Canvas); + } + } + + SetLocation( Instigator.Location + Instigator.CalcDrawOffset(self) ); + SetRotation( Instigator.GetViewRotation() + ZoomRotInterp); + PreDrawFPWeapon(); + if(bAimingRifle && PC != none && (KFScopeDetail == KF_ModelScope || KFScopeDetail == KF_ModelScopeHigh)){ + if(ShouldDrawPortal()){ + if(ScopeScriptedTexture != none){ + Skins[LenseMaterialID] = ScopeScriptedShader; + ScopeScriptedTexture.Client = Self; + ScopeScriptedTexture.Revision = (ScopeScriptedTexture.Revision + 1); + } + } + + bDrawingFirstPerson = true; + Canvas.DrawBoundActor(self, false, false,DisplayFOV,PC.Rotation,rot(0,0,0),Instigator.CalcZoomedDrawOffset(self)); + bDrawingFirstPerson = false; + } + else if(KFScopeDetail == KF_TextureScope && PC.DesiredFOV == PlayerIronSightFOV && bAimingRifle){ + Skins[LenseMaterialID] = ScriptedTextureFallback; + + SetZoomBlendColor(Canvas); + + Canvas.Style = ERenderStyle.STY_Normal; + Canvas.SetPos(0, 0); + Canvas.DrawTile(ZoomMat, (Canvas.SizeX - Canvas.SizeY) / 2, Canvas.SizeY, 0.0, 0.0, 8, 8); + Canvas.SetPos(Canvas.SizeX, 0); + Canvas.DrawTile(ZoomMat, -(Canvas.SizeX - Canvas.SizeY) / 2, Canvas.SizeY, 0.0, 0.0, 8, 8); + + Canvas.Style = 255; + Canvas.SetPos((Canvas.SizeX - Canvas.SizeY) / 2,0); + Canvas.DrawTile(ZoomMat, Canvas.SizeY, Canvas.SizeY, 0.0, 0.0, tileSize, tileSize); + + Canvas.Font = Canvas.MedFont; + Canvas.SetDrawColor(200,150,0); + + Canvas.SetPos(Canvas.SizeX * 0.16, Canvas.SizeY * 0.43); + Canvas.DrawText(" "); + + Canvas.SetPos(Canvas.SizeX * 0.16, Canvas.SizeY * 0.47); + } + else{ + Skins[LenseMaterialID] = ScriptedTextureFallback; + bDrawingFirstPerson = true; + Canvas.DrawActor(self, false, false, DisplayFOV); + bDrawingFirstPerson = false; + } +} +// Adjust a single FOV based on the current aspect ratio. Adjust FOV is the default NON-aspect ratio adjusted FOV to adjust +simulated function float CalcAspectRatioAdjustedFOV(float AdjustFOV) +{ + local KFPlayerController KFPC; + local float ResX, ResY; + local float AspectRatio; + KFPC = KFPlayerController(Level.GetLocalPlayerController()); + if( KFPC == none ) + { + return AdjustFOV; + } + ResX = float(GUIController(KFPC.Player.GUIController).ResX); + ResY = float(GUIController(KFPC.Player.GUIController).ResY); + AspectRatio = ResX / ResY; + if ( KFPC.bUseTrueWideScreenFOV && AspectRatio >= 1.60 ) //1.6 = 16/10 which is 16:10 ratio and 16:9 comes to 1.77 + { + return CalcFOVForAspectRatio(AdjustFOV); + } + else + { + return AdjustFOV; + } +} +// AdjustIngameScope(RO) - Takes the changes to the ScopeDetail variable and +// sets the scope to the new detail mode. Called when the player switches the +// scope setting ingame, or when the scope setting is changed from the menu +simulated function AdjustIngameScope() +{ + local PlayerController PC; + if(Instigator == none || PlayerController(Instigator.Controller) == none) + return; + PC = PlayerController(Instigator.Controller); + if(!bHasScope) + return; + switch (KFScopeDetail) + { + case KF_ModelScope: + if(bAimingRifle) + DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); + if (PC.DesiredFOV == PlayerIronSightFOV && bAimingRifle){ + if(Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none) + KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); + } + break; + + case KF_TextureScope: + if(bAimingRifle) + DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); + if (bAimingRifle && PC.DesiredFOV != PlayerIronSightFOV){ + if(Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none) + KFPlayerController(Instigator.Controller).TransitionFOV(PlayerIronSightFOV,0.0); + } + break; + + case KF_ModelScopeHigh: + if(bAimingRifle){ + if(default.ZoomedDisplayFOVHigh > 0) + DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOVHigh); + else + DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); + } + if ( bAimingRifle && PC.DesiredFOV == PlayerIronSightFOV ) + { + if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) + { + KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); + } + } + break; + } + // Make any chagned to the scope setup + UpdateScopeMode(); +} +simulated event Destroyed() +{ + PreTravelCleanUp(); + Super.Destroyed(); +} +simulated function PreTravelCleanUp() +{ + if(ScopeScriptedTexture != none){ + ScopeScriptedTexture.Client = none; + Level.ObjectPool.FreeObject(ScopeScriptedTexture); + ScopeScriptedTexture=none; + } + if(ScriptedScopeCombiner != none){ + ScriptedScopeCombiner.Material2 = none; + Level.ObjectPool.FreeObject(ScriptedScopeCombiner); + ScriptedScopeCombiner = none; + } + if(ScopeScriptedShader != none){ + ScopeScriptedShader.Diffuse = none; + ScopeScriptedShader.SelfIllumination = none; + Level.ObjectPool.FreeObject(ScopeScriptedShader); + ScopeScriptedShader = none; + } +} +defaultproperties +{ + tileSize=1024 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Ammo.uc b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Ammo.uc index 2824f77..02a8ec9 100644 --- a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Ammo.uc +++ b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Ammo.uc @@ -1,5 +1,13 @@ -class NiceAK12Ammo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceAK12Pickup' AmmoPickupAmount=30 MaxAmmo=270 InitialAmount=60 PickupClass=Class'NicePack.NiceAK12AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="5.45x39mm" -} +class NiceAK12Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceAK12Pickup' + AmmoPickupAmount=30 + MaxAmmo=270 + InitialAmount=60 + PickupClass=Class'NicePack.NiceAK12AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="5.45x39mm" +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12AmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12AmmoPickup.uc index a10f60e..92221e6 100644 --- a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12AmmoPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12AmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceAK12AmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=30 InventoryType=Class'NicePack.NiceAK12Ammo' PickupMessage="Rounds 5.45x39mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceAK12AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=30 + InventoryType=Class'NicePack.NiceAK12Ammo' + PickupMessage="Rounds 5.45x39mm" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12AssaultRifle.uc index 00048c9..a360886 100644 --- a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12AssaultRifle.uc +++ b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12AssaultRifle.uc @@ -1,4 +1,62 @@ -class NiceAK12AssaultRifle extends NiceAssaultRifle; -defaultproperties -{ bSemiAutoFireEnabled=False bBurstFireEnabled=True reloadPreEndFrame=0.158000 reloadEndFrame=0.521000 reloadChargeEndFrame=0.726000 reloadMagStartFrame=0.363000 reloadChargeStartFrame=0.726000 MagazineBone="Bone_Magazine" MagCapacity=30 ReloadRate=3.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_AK47" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 SleeveNum=8 TraderInfoTexture=Texture'ScrnWeaponPack_T.AK12.AK12_trader' bIsTier3Weapon=True MeshRef="ScrnWeaponPack_A.AK12_mesh" SkinRefs(0)="ScrnWeaponPack_T.AK12.AK12_tex_1_cmb" SkinRefs(1)="ScrnWeaponPack_T.AK12.AK12_tex_2_cmb" SkinRefs(2)="ScrnWeaponPack_T.AK12.AK12_tex_3_cmb" SkinRefs(3)="ScrnWeaponPack_T.AK12.AK12_tex_4_cmb" SkinRefs(4)="ScrnWeaponPack_T.AK12.AK12_tex_5_cmb" SkinRefs(5)="ScrnWeaponPack_T.AK12.AK12_tex_6_cmb" SkinRefs(6)="ScrnWeaponPack_T.AK12.AK12_tex_7_cmb" SkinRefs(7)="ScrnWeaponPack_T.AK12.AK12_aimpoint_sh" SkinRefs(8)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" SelectSoundRef="ScrnWeaponPack_SND.AK12.AK12_select" HudImageRef="ScrnWeaponPack_T.AK12.AK12_Unselect" SelectedHudImageRef="ScrnWeaponPack_T.AK12.AK12_select" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=20.000000 FireModeClass(0)=Class'NicePack.NiceAK12Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectAnimRate=1.300000 SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="The Kalashnikov AK-12 (formerly AK-200) is the newest derivative of the Soviet/Russian AK-47 series of assault rifles and was proposed for possible general issue to the Russian Army. This version uses the 5.45x39mm ammo (the same as AK-74)" EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=145 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=7 PickupClass=Class'NicePack.NiceAK12Pickup' PlayerViewOffset=(X=-0.500000,Y=20.000000,Z=-3.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceAK12Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="AK12" TransientSoundVolume=1.250000 -} +class NiceAK12AssaultRifle extends NiceAssaultRifle; +defaultproperties +{ + bSemiAutoFireEnabled=False + bBurstFireEnabled=True + reloadPreEndFrame=0.158000 + reloadEndFrame=0.521000 + reloadChargeEndFrame=0.726000 + reloadMagStartFrame=0.363000 + reloadChargeStartFrame=0.726000 + MagazineBone="Bone_Magazine" + MagCapacity=30 + ReloadRate=3.000000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_AK47" + Weight=6.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=55.000000 + SleeveNum=8 + TraderInfoTexture=Texture'ScrnWeaponPack_T.AK12.AK12_trader' + bIsTier3Weapon=True + MeshRef="ScrnWeaponPack_A.AK12_mesh" + SkinRefs(0)="ScrnWeaponPack_T.AK12.AK12_tex_1_cmb" + SkinRefs(1)="ScrnWeaponPack_T.AK12.AK12_tex_2_cmb" + SkinRefs(2)="ScrnWeaponPack_T.AK12.AK12_tex_3_cmb" + SkinRefs(3)="ScrnWeaponPack_T.AK12.AK12_tex_4_cmb" + SkinRefs(4)="ScrnWeaponPack_T.AK12.AK12_tex_5_cmb" + SkinRefs(5)="ScrnWeaponPack_T.AK12.AK12_tex_6_cmb" + SkinRefs(6)="ScrnWeaponPack_T.AK12.AK12_tex_7_cmb" + SkinRefs(7)="ScrnWeaponPack_T.AK12.AK12_aimpoint_sh" + SkinRefs(8)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" + SelectSoundRef="ScrnWeaponPack_SND.AK12.AK12_select" + HudImageRef="ScrnWeaponPack_T.AK12.AK12_Unselect" + SelectedHudImageRef="ScrnWeaponPack_T.AK12.AK12_select" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=20.000000 + FireModeClass(0)=Class'NicePack.NiceAK12Fire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectAnimRate=1.300000 + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="The Kalashnikov AK-12 (formerly AK-200) is the newest derivative of the Soviet/Russian AK-47 series of assault rifles and was proposed for possible general issue to the Russian Army. This version uses the 5.45x39mm ammo (the same as AK-74)" + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=55.000000 + Priority=145 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=4 + GroupOffset=7 + PickupClass=Class'NicePack.NiceAK12Pickup' + PlayerViewOffset=(X=-0.500000,Y=20.000000,Z=-3.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceAK12Attachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="AK12" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Attachment.uc b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Attachment.uc index 10aadc4..8d7c85c 100644 --- a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Attachment.uc +++ b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Attachment.uc @@ -1,5 +1,57 @@ -class NiceAK12Attachment extends NiceAttachment; -simulated function WeaponLight(); -defaultproperties -{ bSpawnLight=False mMuzFlashClass=Class'ScrnWeaponPack.MuzzleFlashAK12AR' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="IS_Fire_AK47" FireAltAnims(1)="IS_Fire_AK47" FireAltAnims(2)="IS_Fire_AK47" FireAltAnims(3)="IS_Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="ScrnWeaponPack_A.AK12_3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceAK12Attachment extends NiceAttachment; +simulated function WeaponLight(); +defaultproperties +{ + bSpawnLight=False + mMuzFlashClass=Class'ScrnWeaponPack.MuzzleFlashAK12AR' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + MovementAnims(0)="JogF_AK47" + MovementAnims(1)="JogB_AK47" + MovementAnims(2)="JogL_AK47" + MovementAnims(3)="JogR_AK47" + TurnLeftAnim="TurnL_AK47" + TurnRightAnim="TurnR_AK47" + CrouchAnims(0)="CHWalkF_AK47" + CrouchAnims(1)="CHWalkB_AK47" + CrouchAnims(2)="CHWalkL_AK47" + CrouchAnims(3)="CHWalkR_AK47" + WalkAnims(0)="WalkF_AK47" + WalkAnims(1)="WalkB_AK47" + WalkAnims(2)="WalkL_AK47" + WalkAnims(3)="WalkR_AK47" + CrouchTurnRightAnim="CH_TurnR_AK47" + CrouchTurnLeftAnim="CH_TurnL_AK47" + IdleCrouchAnim="CHIdle_AK47" + IdleWeaponAnim="Idle_AK47" + IdleRestAnim="Idle_AK47" + IdleChatAnim="Idle_AK47" + IdleHeavyAnim="Idle_AK47" + IdleRifleAnim="Idle_AK47" + FireAnims(0)="Fire_AK47" + FireAnims(1)="Fire_AK47" + FireAnims(2)="Fire_AK47" + FireAnims(3)="Fire_AK47" + FireAltAnims(0)="IS_Fire_AK47" + FireAltAnims(1)="IS_Fire_AK47" + FireAltAnims(2)="IS_Fire_AK47" + FireAltAnims(3)="IS_Fire_AK47" + FireCrouchAnims(0)="CHFire_AK47" + FireCrouchAnims(1)="CHFire_AK47" + FireCrouchAnims(2)="CHFire_AK47" + FireCrouchAnims(3)="CHFire_AK47" + FireCrouchAltAnims(0)="CHFire_AK47" + FireCrouchAltAnims(1)="CHFire_AK47" + FireCrouchAltAnims(2)="CHFire_AK47" + FireCrouchAltAnims(3)="CHFire_AK47" + HitAnims(0)="HitF_AK47" + HitAnims(1)="HitB_AK47" + HitAnims(2)="HitL_AK47" + HitAnims(3)="HitR_AK47" + PostFireBlendStandAnim="Blend_AK47" + PostFireBlendCrouchAnim="CHBlend_AK47" + MeshRef="ScrnWeaponPack_A.AK12_3rd" + bHeavy=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Fire.uc b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Fire.uc index 815ece0..3931d6a 100644 --- a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Fire.uc +++ b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Fire.uc @@ -1,4 +1,36 @@ -class NiceAK12Fire extends NiceFire; -defaultproperties -{ zedTimeFireSpeedUp=2.500000 ProjectileSpeed=44000.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.040000 maxVerticalRecoilAngle=240 maxHorizontalRecoilAngle=120 ShellEjectClass=Class'ScrnWeaponPack.KFShellEjectAK12AR' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="ScrnWeaponPack_SND.AK12.AK12_shot" StereoFireSoundRef="ScrnWeaponPack_SND.AK12.AK12_shot" NoAmmoSoundRef="ScrnWeaponPack_SND.AK12.AK12_empty" DamageType=Class'NicePack.NiceDamTypeAK12AssaultRifle' DamageMax=68 Momentum=18500.000000 bPawnRapidFireAnim=True TransientSoundVolume=3.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.095000 AmmoClass=Class'NicePack.NiceAK12Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ScrnWeaponPack.MuzzleFlashAK12AR' aimerror=42.000000 -} +class NiceAK12Fire extends NiceFire; +defaultproperties +{ + zedTimeFireSpeedUp=2.500000 + ProjectileSpeed=44000.000000 + FireAimedAnim="Fire_Iron" + RecoilRate=0.040000 + maxVerticalRecoilAngle=240 + maxHorizontalRecoilAngle=120 + ShellEjectClass=Class'ScrnWeaponPack.KFShellEjectAK12AR' + ShellEjectBoneName="Shell_eject" + bAccuracyBonusForSemiAuto=True + bRandomPitchFireSound=False + FireSoundRef="ScrnWeaponPack_SND.AK12.AK12_shot" + StereoFireSoundRef="ScrnWeaponPack_SND.AK12.AK12_shot" + NoAmmoSoundRef="ScrnWeaponPack_SND.AK12.AK12_empty" + DamageType=Class'NicePack.NiceDamTypeAK12AssaultRifle' + DamageMax=68 + Momentum=18500.000000 + bPawnRapidFireAnim=True + TransientSoundVolume=3.800000 + FireLoopAnim="Fire" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.095000 + AmmoClass=Class'NicePack.NiceAK12Ammo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) + ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) + ShakeRotTime=0.750000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.250000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ScrnWeaponPack.MuzzleFlashAK12AR' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Pickup.uc b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Pickup.uc index 1389ce2..30cb2f7 100644 --- a/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Pickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/AK12/NiceAK12Pickup.uc @@ -1,4 +1,25 @@ -class NiceAK12Pickup extends NiceWeaponPickup; -defaultproperties -{ Weight=6.000000 cost=750 BuyClipSize=30 PowerValue=55 SpeedValue=80 RangeValue=30 Description="The Kalashnikov AK-12 (formerly AK-200) is the newest derivative of the Soviet/Russian AK-47 series of assault rifles and was proposed for possible general issue to the Russian Army. This version uses the 5.45x39mm ammo (the same as AK-74)" ItemName="AK12" ItemShortName="AK12" AmmoItemName="5.45x39mm" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceAK12AssaultRifle' PickupMessage="You got the AK-12" PickupSound=Sound'ScrnWeaponPack_SND.AK12.AK12_select' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.AK12_st' DrawScale=1.100000 CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceAK12Pickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=6.000000 + cost=750 + BuyClipSize=30 + PowerValue=55 + SpeedValue=80 + RangeValue=30 + Description="The Kalashnikov AK-12 (formerly AK-200) is the newest derivative of the Soviet/Russian AK-47 series of assault rifles and was proposed for possible general issue to the Russian Army. This version uses the 5.45x39mm ammo (the same as AK-74)" + ItemName="AK12" + ItemShortName="AK12" + AmmoItemName="5.45x39mm" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=3 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceAK12AssaultRifle' + PickupMessage="You got the AK-12" + PickupSound=Sound'ScrnWeaponPack_SND.AK12.AK12_select' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'ScrnWeaponPack_SM.AK12_st' + DrawScale=1.100000 + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK12/NiceDamTypeAK12AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/AK12/NiceDamTypeAK12AssaultRifle.uc index c860151..e164cdd 100644 --- a/sources/Weapons/Playable/AssaultRifles/AK12/NiceDamTypeAK12AssaultRifle.uc +++ b/sources/Weapons/Playable/AssaultRifles/AK12/NiceDamTypeAK12AssaultRifle.uc @@ -1,5 +1,15 @@ -class NiceDamTypeAK12AssaultRifle extends NiceDamageTypeVetCommando - abstract; -defaultproperties -{ bPenetrationHSOnly=True MaxPenetrations=3 HeadShotDamageMult=1.300000 WeaponClass=Class'NicePack.NiceAK12AssaultRifle' DeathString="%k killed %o (AK12)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDeathVel=400.000000 KDeathUpKick=120.000000 -} +class NiceDamTypeAK12AssaultRifle extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ + bPenetrationHSOnly=True + MaxPenetrations=3 + HeadShotDamageMult=1.300000 + WeaponClass=Class'NicePack.NiceAK12AssaultRifle' + DeathString="%k killed %o (AK12)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + KDeathVel=400.000000 + KDeathUpKick=120.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Ammo.uc b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Ammo.uc index 7bbb504..e1bcf99 100644 --- a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Ammo.uc +++ b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Ammo.uc @@ -1,5 +1,13 @@ -class NiceAK47Ammo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceAK47Pickup' AmmoPickupAmount=30 MaxAmmo=270 InitialAmount=90 PickupClass=Class'NicePack.NiceAK47AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="AK47 bullets" -} +class NiceAK47Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceAK47Pickup' + AmmoPickupAmount=30 + MaxAmmo=270 + InitialAmount=90 + PickupClass=Class'NicePack.NiceAK47AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="AK47 bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47AmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47AmmoPickup.uc index 9847216..ed06706 100644 --- a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47AmmoPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47AmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceAK47AmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=30 InventoryType=Class'NicePack.NiceAK47Ammo' PickupMessage="Rounds 7.62mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceAK47AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=30 + InventoryType=Class'NicePack.NiceAK47Ammo' + PickupMessage="Rounds 7.62mm" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47AssaultRifle.uc index a167c4a..846f3c0 100644 --- a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47AssaultRifle.uc +++ b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47AssaultRifle.uc @@ -1,7 +1,55 @@ -class NiceAK47AssaultRifle extends NiceAssaultRifle; -#exec OBJ LOAD FILE=KillingFloorWeapons.utx -#exec OBJ LOAD FILE=KillingFloorHUD.utx -#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax -defaultproperties -{ bSemiAutoFireEnabled=False bBurstFireEnabled=True reloadPreEndFrame=0.167000 reloadEndFrame=0.578000 reloadChargeEndFrame=0.800000 reloadMagStartFrame=0.433000 reloadChargeStartFrame=0.711000 MagazineBone="MagazineAK" MagCapacity=30 ReloadRate=3.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_AK47" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_AK_47' bIsTier2Weapon=True MeshRef="KF_Weapons2_Trip.AK47_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.Rifles.AK47_cmb" SelectSoundRef="KF_AK47Snd.AK47_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.Ak_47_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Ak_47" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceAK47Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="A classic Russian assault rifle. Can be fired in semi or full auto with nice knock down power but not great accuracy." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=95 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=7 PickupClass=Class'NicePack.NiceAK47Pickup' PlayerViewOffset=(X=18.000000,Y=22.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceAK47Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="AK47" TransientSoundVolume=1.250000 -} +class NiceAK47AssaultRifle extends NiceAssaultRifle; +#exec OBJ LOAD FILE=KillingFloorWeapons.utx +#exec OBJ LOAD FILE=KillingFloorHUD.utx +#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax +defaultproperties +{ + bSemiAutoFireEnabled=False + bBurstFireEnabled=True + reloadPreEndFrame=0.167000 + reloadEndFrame=0.578000 + reloadChargeEndFrame=0.800000 + reloadMagStartFrame=0.433000 + reloadChargeStartFrame=0.711000 + MagazineBone="MagazineAK" + MagCapacity=30 + ReloadRate=3.000000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_AK47" + Weight=6.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=60.000000 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_AK_47' + bIsTier2Weapon=True + MeshRef="KF_Weapons2_Trip.AK47_Trip" + SkinRefs(0)="KF_Weapons2_Trip_T.Rifles.AK47_cmb" + SelectSoundRef="KF_AK47Snd.AK47_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.Ak_47_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Ak_47" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=32.000000 + FireModeClass(0)=Class'NicePack.NiceAK47Fire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="A classic Russian assault rifle. Can be fired in semi or full auto with nice knock down power but not great accuracy." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=60.000000 + Priority=95 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=3 + GroupOffset=7 + PickupClass=Class'NicePack.NiceAK47Pickup' + PlayerViewOffset=(X=18.000000,Y=22.000000,Z=-6.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceAK47Attachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="AK47" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Attachment.uc b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Attachment.uc index 703fbd6..30fa660 100644 --- a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Attachment.uc +++ b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Attachment.uc @@ -1,4 +1,56 @@ -class NiceAK47Attachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="Fire_AK47" FireAltAnims(1)="Fire_AK47" FireAltAnims(2)="Fire_AK47" FireAltAnims(3)="Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="KF_Weapons3rd_Trip.AK47_3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceAK47Attachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + MovementAnims(0)="JogF_AK47" + MovementAnims(1)="JogB_AK47" + MovementAnims(2)="JogL_AK47" + MovementAnims(3)="JogR_AK47" + TurnLeftAnim="TurnL_AK47" + TurnRightAnim="TurnR_AK47" + CrouchAnims(0)="CHWalkF_AK47" + CrouchAnims(1)="CHWalkB_AK47" + CrouchAnims(2)="CHWalkL_AK47" + CrouchAnims(3)="CHWalkR_AK47" + WalkAnims(0)="WalkF_AK47" + WalkAnims(1)="WalkB_AK47" + WalkAnims(2)="WalkL_AK47" + WalkAnims(3)="WalkR_AK47" + CrouchTurnRightAnim="CH_TurnR_AK47" + CrouchTurnLeftAnim="CH_TurnL_AK47" + IdleCrouchAnim="CHIdle_AK47" + IdleWeaponAnim="Idle_AK47" + IdleRestAnim="Idle_AK47" + IdleChatAnim="Idle_AK47" + IdleHeavyAnim="Idle_AK47" + IdleRifleAnim="Idle_AK47" + FireAnims(0)="Fire_AK47" + FireAnims(1)="Fire_AK47" + FireAnims(2)="Fire_AK47" + FireAnims(3)="Fire_AK47" + FireAltAnims(0)="Fire_AK47" + FireAltAnims(1)="Fire_AK47" + FireAltAnims(2)="Fire_AK47" + FireAltAnims(3)="Fire_AK47" + FireCrouchAnims(0)="CHFire_AK47" + FireCrouchAnims(1)="CHFire_AK47" + FireCrouchAnims(2)="CHFire_AK47" + FireCrouchAnims(3)="CHFire_AK47" + FireCrouchAltAnims(0)="CHFire_AK47" + FireCrouchAltAnims(1)="CHFire_AK47" + FireCrouchAltAnims(2)="CHFire_AK47" + FireCrouchAltAnims(3)="CHFire_AK47" + HitAnims(0)="HitF_AK47" + HitAnims(1)="HitB_AK47" + HitAnims(2)="HitL_AK47" + HitAnims(3)="HitR_AK47" + PostFireBlendStandAnim="Blend_AK47" + PostFireBlendCrouchAnim="CHBlend_AK47" + MeshRef="KF_Weapons3rd_Trip.AK47_3rd" + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Fire.uc b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Fire.uc index 1f6b6f3..82354d9 100644 --- a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Fire.uc +++ b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Fire.uc @@ -1,4 +1,37 @@ -class NiceAK47Fire extends NiceFire; -defaultproperties -{ zedTimeFireSpeedUp=2.500000 ProjectileSpeed=35750.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.070000 maxVerticalRecoilAngle=210 maxHorizontalRecoilAngle=105 ShellEjectClass=Class'ROEffects.KFShellEjectAK' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="KF_AK47Snd.AK47_Fire" StereoFireSoundRef="KF_AK47Snd.AK47_FireST" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeAK47AssaultRifle' DamageMin=60 DamageMax=60 Momentum=8500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.109000 AmmoClass=Class'NicePack.NiceAK47Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 -} +class NiceAK47Fire extends NiceFire; +defaultproperties +{ + zedTimeFireSpeedUp=2.500000 + ProjectileSpeed=35750.000000 + FireAimedAnim="Fire_Iron" + RecoilRate=0.070000 + maxVerticalRecoilAngle=210 + maxHorizontalRecoilAngle=105 + ShellEjectClass=Class'ROEffects.KFShellEjectAK' + ShellEjectBoneName="Shell_eject" + bAccuracyBonusForSemiAuto=True + bRandomPitchFireSound=False + FireSoundRef="KF_AK47Snd.AK47_Fire" + StereoFireSoundRef="KF_AK47Snd.AK47_FireST" + NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" + DamageType=Class'NicePack.NiceDamTypeAK47AssaultRifle' + DamageMin=60 + DamageMax=60 + Momentum=8500.000000 + bPawnRapidFireAnim=True + TransientSoundVolume=1.800000 + FireLoopAnim="Fire" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.109000 + AmmoClass=Class'NicePack.NiceAK47Ammo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) + ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) + ShakeRotTime=0.750000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.250000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Pickup.uc b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Pickup.uc index 5175062..4756adc 100644 --- a/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Pickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/AK47/NiceAK47Pickup.uc @@ -1,4 +1,27 @@ -class NiceAK47Pickup extends NiceWeaponPickup; -defaultproperties -{ Weight=6.000000 cost=750 AmmoCost=30 BuyClipSize=30 PowerValue=40 SpeedValue=80 RangeValue=50 Description="Standard issue military rifle. Equipped with an integrated 2X scope." ItemName="AK47" ItemShortName="AK47" AmmoItemName="7.62mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=2 VariantClasses(0)=Class'KFMod.GoldenAK47pickup' VariantClasses(1)=Class'KFMod.NeonAK47Pickup' InventoryType=Class'NicePack.NiceAK47AssaultRifle' PickupMessage="You got the AK47" PickupSound=Sound'KF_AK47Snd.AK47_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.Rifle.AK47_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceAK47Pickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=6.000000 + cost=750 + AmmoCost=30 + BuyClipSize=30 + PowerValue=40 + SpeedValue=80 + RangeValue=50 + Description="Standard issue military rifle. Equipped with an integrated 2X scope." + ItemName="AK47" + ItemShortName="AK47" + AmmoItemName="7.62mm Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=3 + EquipmentCategoryID=2 + VariantClasses(0)=Class'KFMod.GoldenAK47pickup' + VariantClasses(1)=Class'KFMod.NeonAK47Pickup' + InventoryType=Class'NicePack.NiceAK47AssaultRifle' + PickupMessage="You got the AK47" + PickupSound=Sound'KF_AK47Snd.AK47_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups_Trip.Rifle.AK47_Pickup' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/AK47/NiceDamTypeAK47AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/AK47/NiceDamTypeAK47AssaultRifle.uc index c3c6a26..39592b9 100644 --- a/sources/Weapons/Playable/AssaultRifles/AK47/NiceDamTypeAK47AssaultRifle.uc +++ b/sources/Weapons/Playable/AssaultRifles/AK47/NiceDamTypeAK47AssaultRifle.uc @@ -1,5 +1,15 @@ -class NiceDamTypeAK47AssaultRifle extends NiceDamageTypeVetCommando - abstract; -defaultproperties -{ MaxPenetrations=1 HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceAK47AssaultRifle' DeathString="%k killed %o (AK47)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=5500.000000 KDeathVel=175.000000 KDeathUpKick=15.000000 -} +class NiceDamTypeAK47AssaultRifle extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ + MaxPenetrations=1 + HeadShotDamageMult=2.000000 + WeaponClass=Class'NicePack.NiceAK47AssaultRifle' + DeathString="%k killed %o (AK47)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + KDamageImpulse=5500.000000 + KDeathVel=175.000000 + KDeathUpKick=15.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceDamTypeVALDT.uc b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceDamTypeVALDT.uc index de3bf0a..4633f19 100644 --- a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceDamTypeVALDT.uc +++ b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceDamTypeVALDT.uc @@ -1,5 +1,14 @@ -class NiceDamTypeVALDT extends NiceDamageTypeVetCommando - abstract; -defaultproperties -{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceVALDTAssaultRifle' DeathString="%k killed %o (AS 'VAL')." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=1500.000000 KDeathVel=110.000000 KDeathUpKick=2.000000 -} +class NiceDamTypeVALDT extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ + HeadShotDamageMult=1.500000 + WeaponClass=Class'NicePack.NiceVALDTAssaultRifle' + DeathString="%k killed %o (AS 'VAL')." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + KDamageImpulse=1500.000000 + KDeathVel=110.000000 + KDeathUpKick=2.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAmmo.uc b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAmmo.uc index e5c6a5e..0586c64 100644 --- a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAmmo.uc +++ b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAmmo.uc @@ -1,5 +1,13 @@ -class NiceVALDTAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceVALDTPickup' AmmoPickupAmount=20 MaxAmmo=300 InitialAmount=75 PickupClass=Class'NicePack.NiceVALDTAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="9x39mm" -} +class NiceVALDTAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceVALDTPickup' + AmmoPickupAmount=20 + MaxAmmo=300 + InitialAmount=75 + PickupClass=Class'NicePack.NiceVALDTAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="9x39mm" +} diff --git a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAmmoPickup.uc index 61a5f01..9a0a061 100644 --- a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAmmoPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceVALDTAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=20 InventoryType=Class'NicePack.NiceVALDTAmmo' PickupMessage="9x39mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceVALDTAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=20 + InventoryType=Class'NicePack.NiceVALDTAmmo' + PickupMessage="9x39mm" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAssaultRifle.uc index 333954b..0c8a13d 100644 --- a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAssaultRifle.uc +++ b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTAssaultRifle.uc @@ -1,4 +1,54 @@ -class NiceVALDTAssaultRifle extends NiceAssaultRifle; -defaultproperties -{ reloadPreEndFrame=0.121000 reloadEndFrame=0.477000 reloadChargeEndFrame=0.748000 reloadMagStartFrame=0.299000 reloadChargeStartFrame=0.598000 MagazineBone="clip" MagCapacity=20 ReloadRate=3.500000 ReloadAnim="Reload" ReloadAnimRate=1.100000 WeaponReloadAnim="Reload_AK47" Weight=5.000000 bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 SleeveNum=3 TraderInfoTexture=Texture'ScrnWeaponPack_T.Val.ValDT_Trader' bIsTier2Weapon=True MeshRef="ScrnWeaponPack_A.ValDTmesh" SkinRefs(0)="ScrnWeaponPack_T.VAL.wpn_vss" SkinRefs(1)="ScrnWeaponPack_T.VAL.newvss" SkinRefs(2)="ScrnWeaponPack_T.VAL.wpn_bullet1_545" SkinRefs(3)="KF_Weapons2_Trip_T.hands.BritishPara_Hands_1st_P" SelectSoundRef="KF_PumpSGSnd.SG_Select" HudImageRef="ScrnWeaponPack_T.VAL.ValDT_unselected" SelectedHudImageRef="ScrnWeaponPack_T.VAL.ValDT_selected" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceVALDTFire' FireModeClass(1)=Class'NicePack.NiceVALDTFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="The AS VAL (Avtomat Specialnyj Val or Special Automatic Rifle, code name: 'Shaft') is a Soviet designed assault rifle featuring an integrated suppressor. It was developed during the late 1980s by TsNIITochMash (Central Institute for Precision Machine Building) and is used by Russian Spetsnaz special forces and the MVD, FSB and select units of the Russian Army." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=135 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=7 PickupClass=Class'NicePack.NiceVALDTPickup' PlayerViewOffset=(X=10.000000,Y=10.000000,Z=-5.000000) BobDamping=5.000000 AttachmentClass=Class'ScrnWeaponPack.VALDTAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="AS 'VAL'" TransientSoundVolume=1.250000 -} +class NiceVALDTAssaultRifle extends NiceAssaultRifle; +defaultproperties +{ + reloadPreEndFrame=0.121000 + reloadEndFrame=0.477000 + reloadChargeEndFrame=0.748000 + reloadMagStartFrame=0.299000 + reloadChargeStartFrame=0.598000 + MagazineBone="clip" + MagCapacity=20 + ReloadRate=3.500000 + ReloadAnim="Reload" + ReloadAnimRate=1.100000 + WeaponReloadAnim="Reload_AK47" + Weight=5.000000 + bHasAimingMode=True + IdleAimAnim="Iron_Idle" + StandardDisplayFOV=65.000000 + SleeveNum=3 + TraderInfoTexture=Texture'ScrnWeaponPack_T.Val.ValDT_Trader' + bIsTier2Weapon=True + MeshRef="ScrnWeaponPack_A.ValDTmesh" + SkinRefs(0)="ScrnWeaponPack_T.VAL.wpn_vss" + SkinRefs(1)="ScrnWeaponPack_T.VAL.newvss" + SkinRefs(2)="ScrnWeaponPack_T.VAL.wpn_bullet1_545" + SkinRefs(3)="KF_Weapons2_Trip_T.hands.BritishPara_Hands_1st_P" + SelectSoundRef="KF_PumpSGSnd.SG_Select" + HudImageRef="ScrnWeaponPack_T.VAL.ValDT_unselected" + SelectedHudImageRef="ScrnWeaponPack_T.VAL.ValDT_selected" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=32.000000 + FireModeClass(0)=Class'NicePack.NiceVALDTFire' + FireModeClass(1)=Class'NicePack.NiceVALDTFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="The AS VAL (Avtomat Specialnyj Val or Special Automatic Rifle, code name: 'Shaft') is a Soviet designed assault rifle featuring an integrated suppressor. It was developed during the late 1980s by TsNIITochMash (Central Institute for Precision Machine Building) and is used by Russian Spetsnaz special forces and the MVD, FSB and select units of the Russian Army." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=65.000000 + Priority=135 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=3 + GroupOffset=7 + PickupClass=Class'NicePack.NiceVALDTPickup' + PlayerViewOffset=(X=10.000000,Y=10.000000,Z=-5.000000) + BobDamping=5.000000 + AttachmentClass=Class'ScrnWeaponPack.VALDTAttachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="AS 'VAL'" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTFire.uc b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTFire.uc index d0b7717..4196714 100644 --- a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTFire.uc +++ b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTFire.uc @@ -1,4 +1,35 @@ -class NiceVALDTFire extends NiceFire; -defaultproperties -{ FireAimedAnim="Fire" RecoilRate=0.070000 maxVerticalRecoilAngle=315 maxHorizontalRecoilAngle=158 ShellEjectClass=Class'ROEffects.KFShellEjectMac' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="ScrnWeaponPack_SND.VSS.VSS_Fire" StereoFireSoundRef="ScrnWeaponPack_SND.VSS.VSS_Fire" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeVALDT' DamageMin=40 DamageMax=40 Momentum=18500.000000 bPawnRapidFireAnim=True TransientSoundVolume=2.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.089000 AmmoClass=Class'NicePack.NiceVALDTAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ScrnWeaponPack.MuzzleFlash3rdVALDT' aimerror=42.000000 -} +class NiceVALDTFire extends NiceFire; +defaultproperties +{ + FireAimedAnim="Fire" + RecoilRate=0.070000 + maxVerticalRecoilAngle=315 + maxHorizontalRecoilAngle=158 + ShellEjectClass=Class'ROEffects.KFShellEjectMac' + ShellEjectBoneName="Shell_eject" + bAccuracyBonusForSemiAuto=True + bRandomPitchFireSound=False + FireSoundRef="ScrnWeaponPack_SND.VSS.VSS_Fire" + StereoFireSoundRef="ScrnWeaponPack_SND.VSS.VSS_Fire" + NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" + DamageType=Class'NicePack.NiceDamTypeVALDT' + DamageMin=40 + DamageMax=40 + Momentum=18500.000000 + bPawnRapidFireAnim=True + TransientSoundVolume=2.800000 + FireLoopAnim="Fire" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.089000 + AmmoClass=Class'NicePack.NiceVALDTAmmo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) + ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) + ShakeRotTime=0.750000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.250000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ScrnWeaponPack.MuzzleFlash3rdVALDT' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTPickup.uc b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTPickup.uc index a534b39..0d02d36 100644 --- a/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/ASVAL/NiceVALDTPickup.uc @@ -1,4 +1,25 @@ -class NiceVALDTPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=5.000000 AmmoCost=10 BuyClipSize=30 PowerValue=50 SpeedValue=95 RangeValue=50 Description="The AS VAL (Avtomat Specialnyj Val or Special Automatic Rifle, code name: 'Shaft') is a Soviet designed assault rifle featuring an integrated suppressor. It was developed during the late 1980s by TsNIITochMash (Central Institute for Precision Machine Building) and is used by Russian Spetsnaz special forces and the MVD, FSB and select units of the Russian Army." ItemName="AS 'VAL'" ItemShortName="VAL" AmmoItemName="9x39mm" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceVALDTAssaultRifle' PickupMessage="You've got a AS 'VAL'" PickupSound=Sound'KF_AK47Snd.AK47_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.ValDT_sm' DrawScale=1.300000 CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceVALDTPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=5.000000 + AmmoCost=10 + BuyClipSize=30 + PowerValue=50 + SpeedValue=95 + RangeValue=50 + Description="The AS VAL (Avtomat Specialnyj Val or Special Automatic Rifle, code name: 'Shaft') is a Soviet designed assault rifle featuring an integrated suppressor. It was developed during the late 1980s by TsNIITochMash (Central Institute for Precision Machine Building) and is used by Russian Spetsnaz special forces and the MVD, FSB and select units of the Russian Army." + ItemName="AS 'VAL'" + ItemShortName="VAL" + AmmoItemName="9x39mm" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=3 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceVALDTAssaultRifle' + PickupMessage="You've got a AS 'VAL'" + PickupSound=Sound'KF_AK47Snd.AK47_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'ScrnWeaponPack_SM.ValDT_sm' + DrawScale=1.300000 + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpup.uc b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpup.uc index 55f5a9a..9437de9 100644 --- a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpup.uc +++ b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpup.uc @@ -1,7 +1,53 @@ -class NiceBullpup extends NiceAssaultRifle; -#exec OBJ LOAD FILE=KillingFloorWeapons.utx -#exec OBJ LOAD FILE=KillingFloorHUD.utx -#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax -defaultproperties -{ reloadPreEndFrame=0.333000 reloadEndFrame=0.783000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.483000 reloadChargeStartFrame=-1.000000 MagCapacity=30 ReloadRate=1.966667 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_BullPup" Weight=5.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=70.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Bullpup' MeshRef="KF_Weapons_Trip.Bullpup_Trip" SkinRefs(0)="KF_Weapons_Trip_T.Rifles.bullpup_cmb" SkinRefs(1)="KF_Weapons_Trip_T.Rifles.reflex_sight_A_unlit" SelectSoundRef="KF_BullpupSnd.Bullpup_Select" HudImageRef="KillingFloorHUD.WeaponSelect.Bullpup_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.Bullpup" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceBullpupFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="A military grade automatic rifle. Can be fired in semi-auto or full auto firemodes and comes equipped with a scope for increased accuracy." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=70.000000 Priority=70 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=1 PickupClass=Class'NicePack.NiceBullpupPickup' PlayerViewOffset=(X=20.000000,Y=21.500000,Z=-9.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceBullpupAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="Bullpup" TransientSoundVolume=1.250000 -} +class NiceBullpup extends NiceAssaultRifle; +#exec OBJ LOAD FILE=KillingFloorWeapons.utx +#exec OBJ LOAD FILE=KillingFloorHUD.utx +#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax +defaultproperties +{ + reloadPreEndFrame=0.333000 + reloadEndFrame=0.783000 + reloadChargeEndFrame=-1.000000 + reloadMagStartFrame=0.483000 + reloadChargeStartFrame=-1.000000 + MagCapacity=30 + ReloadRate=1.966667 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_BullPup" + Weight=5.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=70.000000 + SleeveNum=2 + TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Bullpup' + MeshRef="KF_Weapons_Trip.Bullpup_Trip" + SkinRefs(0)="KF_Weapons_Trip_T.Rifles.bullpup_cmb" + SkinRefs(1)="KF_Weapons_Trip_T.Rifles.reflex_sight_A_unlit" + SelectSoundRef="KF_BullpupSnd.Bullpup_Select" + HudImageRef="KillingFloorHUD.WeaponSelect.Bullpup_unselected" + SelectedHudImageRef="KillingFloorHUD.WeaponSelect.Bullpup" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=40.000000 + FireModeClass(0)=Class'NicePack.NiceBullpupFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="A military grade automatic rifle. Can be fired in semi-auto or full auto firemodes and comes equipped with a scope for increased accuracy." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=70.000000 + Priority=70 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=3 + GroupOffset=1 + PickupClass=Class'NicePack.NiceBullpupPickup' + PlayerViewOffset=(X=20.000000,Y=21.500000,Z=-9.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceBullpupAttachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="Bullpup" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAmmo.uc b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAmmo.uc index 27be66b..c4da55e 100644 --- a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAmmo.uc +++ b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAmmo.uc @@ -1,5 +1,13 @@ -class NiceBullpupAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceBullpupPickup' AmmoPickupAmount=30 MaxAmmo=240 InitialAmount=45 PickupClass=Class'NicePack.NiceBullpupAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="Bullpup bullets" -} +class NiceBullpupAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceBullpupPickup' + AmmoPickupAmount=30 + MaxAmmo=240 + InitialAmount=45 + PickupClass=Class'NicePack.NiceBullpupAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="Bullpup bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAmmoPickup.uc index 18671be..2994711 100644 --- a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAmmoPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceBullpupAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=30 InventoryType=Class'NicePack.NiceBullpupAmmo' PickupMessage="Rounds (5.56 NATO)" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceBullpupAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=30 + InventoryType=Class'NicePack.NiceBullpupAmmo' + PickupMessage="Rounds (5.56 NATO)" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAttachment.uc b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAttachment.uc index 5e41612..f91d884 100644 --- a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAttachment.uc +++ b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupAttachment.uc @@ -1,4 +1,20 @@ -class NiceBullpupAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' TurnLeftAnim="TurnL_Bullpup" TurnRightAnim="TurnR_Bullpup" WalkAnims(0)="WalkF_Bullpup" WalkAnims(1)="WalkB_Bullpup" WalkAnims(2)="WalkL_Bullpup" WalkAnims(3)="WalkR_Bullpup" CrouchTurnRightAnim="CH_TurnR_Bullpup" CrouchTurnLeftAnim="CH_TurnL_Bullpup" MeshRef="KF_Weapons3rd_Trip.BullPup_3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceBullpupAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + TurnLeftAnim="TurnL_Bullpup" + TurnRightAnim="TurnR_Bullpup" + WalkAnims(0)="WalkF_Bullpup" + WalkAnims(1)="WalkB_Bullpup" + WalkAnims(2)="WalkL_Bullpup" + WalkAnims(3)="WalkR_Bullpup" + CrouchTurnRightAnim="CH_TurnR_Bullpup" + CrouchTurnLeftAnim="CH_TurnL_Bullpup" + MeshRef="KF_Weapons3rd_Trip.BullPup_3rd" + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupFire.uc b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupFire.uc index 1efeb96..a93e0a8 100644 --- a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupFire.uc +++ b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupFire.uc @@ -1,4 +1,36 @@ -class NiceBullpupFire extends NiceFire; -defaultproperties -{ zedTimeFireSpeedUp=5.000000 ProjectileSpeed=45500.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.070000 maxVerticalRecoilAngle=210 maxHorizontalRecoilAngle=105 ShellEjectClass=Class'ROEffects.KFShellEjectBullpup' ShellEjectBoneName="Bullpup" bAccuracyBonusForSemiAuto=True FireSoundRef="KF_BullpupSnd.Bullpup_Fire" StereoFireSoundRef="KF_BullpupSnd.Bullpup_FireST" NoAmmoSoundRef="KF_9MMSnd.9mm_DryFire" DamageType=Class'NicePack.NiceDamTypeBullpup' DamageMin=48 DamageMax=48 Momentum=8500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.100000 AmmoClass=Class'NicePack.NiceBullpupAmmo' ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=0.500000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.000000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 -} +class NiceBullpupFire extends NiceFire; +defaultproperties +{ + zedTimeFireSpeedUp=5.000000 + ProjectileSpeed=45500.000000 + FireAimedAnim="Fire_Iron" + RecoilRate=0.070000 + maxVerticalRecoilAngle=210 + maxHorizontalRecoilAngle=105 + ShellEjectClass=Class'ROEffects.KFShellEjectBullpup' + ShellEjectBoneName="Bullpup" + bAccuracyBonusForSemiAuto=True + FireSoundRef="KF_BullpupSnd.Bullpup_Fire" + StereoFireSoundRef="KF_BullpupSnd.Bullpup_FireST" + NoAmmoSoundRef="KF_9MMSnd.9mm_DryFire" + DamageType=Class'NicePack.NiceDamTypeBullpup' + DamageMin=48 + DamageMax=48 + Momentum=8500.000000 + bPawnRapidFireAnim=True + TransientSoundVolume=1.800000 + FireLoopAnim="Fire" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.100000 + AmmoClass=Class'NicePack.NiceBullpupAmmo' + ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeRotTime=0.500000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.000000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupPickup.uc b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupPickup.uc index 64a88ee..455cdb3 100644 --- a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceBullpupPickup.uc @@ -1,4 +1,24 @@ -class NiceBullpupPickup extends NiceWeaponPickup; -defaultproperties -{ bBackupWeapon=True Weight=5.000000 cost=200 BuyClipSize=30 PowerValue=24 SpeedValue=90 RangeValue=60 Description="Standard issue military rifle. Equipped with an integrated 2X scope." ItemName="Bullpup" ItemShortName="Bullpup" AmmoItemName="5.56 NATO Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceBullpup' PickupMessage="You got the Bullpup" PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.Rifle.Bullpup_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceBullpupPickup extends NiceWeaponPickup; +defaultproperties +{ + bBackupWeapon=True + Weight=5.000000 + cost=200 + BuyClipSize=30 + PowerValue=24 + SpeedValue=90 + RangeValue=60 + Description="Standard issue military rifle. Equipped with an integrated 2X scope." + ItemName="Bullpup" + ItemShortName="Bullpup" + AmmoItemName="5.56 NATO Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=3 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceBullpup' + PickupMessage="You got the Bullpup" + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups_Trip.Rifle.Bullpup_Pickup' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceDamTypeBullpup.uc b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceDamTypeBullpup.uc index 3690ebc..1cd2bd9 100644 --- a/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceDamTypeBullpup.uc +++ b/sources/Weapons/Playable/AssaultRifles/Bullpup/NiceDamTypeBullpup.uc @@ -1,5 +1,14 @@ -class NiceDamTypeBullpup extends NiceDamageTypeVetCommando - abstract; -defaultproperties -{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceBullpup' DeathString="%k killed %o (Bullpup)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=1500.000000 KDeathVel=110.000000 KDeathUpKick=2.000000 -} +class NiceDamTypeBullpup extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ + HeadShotDamageMult=1.500000 + WeaponClass=Class'NicePack.NiceBullpup' + DeathString="%k killed %o (Bullpup)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + KDamageImpulse=1500.000000 + KDeathVel=110.000000 + KDeathUpKick=2.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805M.uc b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805M.uc index 34ac9ea..686a2a8 100644 --- a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805M.uc +++ b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805M.uc @@ -1,4 +1,8 @@ -class NiceCZ805M extends CZ805M; -defaultproperties -{ FireModeClass(0)=Class'NicePack.NiceCZ805MFire' FireModeClass(1)=Class'NicePack.NiceCZ805MAltFire' PickupClass=Class'NicePack.NiceCZ805MPickup' ItemName="CZ-805M Medic/Assault Rifle NW" -} +class NiceCZ805M extends CZ805M; +defaultproperties +{ + FireModeClass(0)=Class'NicePack.NiceCZ805MFire' + FireModeClass(1)=Class'NicePack.NiceCZ805MAltFire' + PickupClass=Class'NicePack.NiceCZ805MPickup' + ItemName="CZ-805M Medic/Assault Rifle NW" +} diff --git a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAltFire.uc b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAltFire.uc index 2458e7c..218ebc2 100644 --- a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAltFire.uc +++ b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAltFire.uc @@ -1,4 +1,5 @@ -class NiceCZ805MAltFire extends CZ805MAltFire; -defaultproperties -{ ProjectileClass=Class'NicePack.NiceCZ805MHealingProjectile' -} +class NiceCZ805MAltFire extends CZ805MAltFire; +defaultproperties +{ + ProjectileClass=Class'NicePack.NiceCZ805MHealingProjectile' +} diff --git a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAmmo.uc b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAmmo.uc index 8ad4cb6..b9a82db 100644 --- a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAmmo.uc +++ b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAmmo.uc @@ -1,4 +1,7 @@ -class NiceCZ805MAmmo extends CZ805MAmmo; -defaultproperties -{ MaxAmmo=300 InitialAmount=150 PickupClass=Class'NicePack.NiceCZ805MAmmoPickup' -} +class NiceCZ805MAmmo extends CZ805MAmmo; +defaultproperties +{ + MaxAmmo=300 + InitialAmount=150 + PickupClass=Class'NicePack.NiceCZ805MAmmoPickup' +} diff --git a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAmmoPickup.uc index f1c4112..fe84428 100644 --- a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAmmoPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MAmmoPickup.uc @@ -1,4 +1,5 @@ -class NiceCZ805MAmmoPickup extends CZ805MAmmoPickup; -defaultproperties -{ InventoryType=Class'NicePack.NiceCZ805MAmmo' -} +class NiceCZ805MAmmoPickup extends CZ805MAmmoPickup; +defaultproperties +{ + InventoryType=Class'NicePack.NiceCZ805MAmmo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MFire.uc b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MFire.uc index 31f36a1..78fd4c0 100644 --- a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MFire.uc +++ b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MFire.uc @@ -1,4 +1,9 @@ -class NiceCZ805MFire extends CZ805MFire; -defaultproperties -{ maxVerticalRecoilAngle=270 maxHorizontalRecoilAngle=135 DamageType=Class'NicePack.NiceDamTypeCZ805M' DamageMax=40 AmmoClass=Class'NicePack.NiceCZ805MAmmo' -} +class NiceCZ805MFire extends CZ805MFire; +defaultproperties +{ + maxVerticalRecoilAngle=270 + maxHorizontalRecoilAngle=135 + DamageType=Class'NicePack.NiceDamTypeCZ805M' + DamageMax=40 + AmmoClass=Class'NicePack.NiceCZ805MAmmo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MHealingProjectile.uc b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MHealingProjectile.uc index f75755e..ba1fa3e 100644 --- a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MHealingProjectile.uc +++ b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MHealingProjectile.uc @@ -1,4 +1,5 @@ -class NiceCZ805MHealingProjectile extends CZ805MHealingProjectile; -defaultproperties -{ HealBoostAmount=20 -} +class NiceCZ805MHealingProjectile extends CZ805MHealingProjectile; +defaultproperties +{ + HealBoostAmount=20 +} diff --git a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MPickup.uc b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MPickup.uc index 4eace77..96b5d75 100644 --- a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceCZ805MPickup.uc @@ -1,4 +1,11 @@ -class NiceCZ805MPickup extends CZ805MPickup; -defaultproperties -{ cost=2500 BuyClipSize=30 Description="Horzine's modification of CZ-805 BREN rifle with attached healing dart launcher. Useful for both Medic and Commando perks." ItemName="CZ-805M NW" ItemShortName="CZ-805M NW" InventoryType=Class'NicePack.NiceCZ805M' PickupMessage="You got the CZ-805M NW" -} +class NiceCZ805MPickup extends CZ805MPickup; +defaultproperties +{ + cost=2500 + BuyClipSize=30 + Description="Horzine's modification of CZ-805 BREN rifle with attached healing dart launcher. Useful for both Medic and Commando perks." + ItemName="CZ-805M NW" + ItemShortName="CZ-805M NW" + InventoryType=Class'NicePack.NiceCZ805M' + PickupMessage="You got the CZ-805M NW" +} diff --git a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceDamTypeCZ805M.uc b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceDamTypeCZ805M.uc index 4ca0d01..064e5e4 100644 --- a/sources/Weapons/Playable/AssaultRifles/CZ805/NiceDamTypeCZ805M.uc +++ b/sources/Weapons/Playable/AssaultRifles/CZ805/NiceDamTypeCZ805M.uc @@ -1,5 +1,14 @@ -class NiceDamTypeCZ805M extends NiceDamageTypeVetCommando - abstract; -defaultproperties -{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceCZ805M' DeathString="%k killed %o (CZ 805)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=5500.000000 KDeathVel=175.000000 KDeathUpKick=20.000000 -} +class NiceDamTypeCZ805M extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ + HeadShotDamageMult=1.500000 + WeaponClass=Class'NicePack.NiceCZ805M' + DeathString="%k killed %o (CZ 805)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + KDamageImpulse=5500.000000 + KDeathVel=175.000000 + KDeathUpKick=20.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALAmmo.uc b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALAmmo.uc index e28592b..302b658 100644 --- a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALAmmo.uc +++ b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALAmmo.uc @@ -1,5 +1,13 @@ -class NiceFNFALAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceFNFAL_ACOG_Pickup' AmmoPickupAmount=20 MaxAmmo=180 InitialAmount=45 PickupClass=Class'NicePack.NiceFNFALAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="FNFAL bullets" -} +class NiceFNFALAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceFNFAL_ACOG_Pickup' + AmmoPickupAmount=20 + MaxAmmo=180 + InitialAmount=45 + PickupClass=Class'NicePack.NiceFNFALAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="FNFAL bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALAmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALAmmoPickup.uc index 266ef04..1b57f67 100644 --- a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALAmmoPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceFNFALAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=20 InventoryType=Class'NicePack.NiceFNFALAmmo' PickupMessage="Rounds 7.62x51mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceFNFALAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=20 + InventoryType=Class'NicePack.NiceFNFALAmmo' + PickupMessage="Rounds 7.62x51mm" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALFire.uc b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALFire.uc index 8f559fb..f41755c 100644 --- a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALFire.uc +++ b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFALFire.uc @@ -1,4 +1,40 @@ -class NiceFNFALFire extends NiceFire; -defaultproperties -{ zedTimeFireSpeedUp=2.500000 ProjectileSpeed=41150.000000 FireAimedAnim="Fire_Iron" FireEndAimedAnim="Fire_Iron_End" FireLoopAimedAnim="Fire_Iron_Loop" RecoilRate=0.080000 maxVerticalRecoilAngle=200 maxHorizontalRecoilAngle=100 ShellEjectClass=Class'KFMod.KFShellEjectFAL' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="KF_FNFALSnd.FNFAL_Fire_Single_M" StereoFireSoundRef="KF_FNFALSnd.FNFAL_Fire_Single_S" NoAmmoSoundRef="KF_SCARSnd.SCAR_DryFire" DamageType=Class'NicePack.NiceDamTypeFNFALAssaultRifle' DamageMin=66 DamageMax=66 Momentum=8500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.800000 FireLoopAnim="Fire_Loop" FireEndAnim="Fire_End" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.100000 AmmoClass=Class'NicePack.NiceFNFALAmmo' ShakeRotMag=(X=80.000000,Y=80.000000,Z=450.000000) ShakeRotRate=(X=7500.000000,Y=7500.000000,Z=7500.000000) ShakeRotTime=0.650000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=8.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.150000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 -} +class NiceFNFALFire extends NiceFire; +defaultproperties +{ + zedTimeFireSpeedUp=2.500000 + ProjectileSpeed=41150.000000 + FireAimedAnim="Fire_Iron" + FireEndAimedAnim="Fire_Iron_End" + FireLoopAimedAnim="Fire_Iron_Loop" + RecoilRate=0.080000 + maxVerticalRecoilAngle=200 + maxHorizontalRecoilAngle=100 + ShellEjectClass=Class'KFMod.KFShellEjectFAL' + ShellEjectBoneName="Shell_eject" + bAccuracyBonusForSemiAuto=True + bRandomPitchFireSound=False + FireSoundRef="KF_FNFALSnd.FNFAL_Fire_Single_M" + StereoFireSoundRef="KF_FNFALSnd.FNFAL_Fire_Single_S" + NoAmmoSoundRef="KF_SCARSnd.SCAR_DryFire" + DamageType=Class'NicePack.NiceDamTypeFNFALAssaultRifle' + DamageMin=66 + DamageMax=66 + Momentum=8500.000000 + bPawnRapidFireAnim=True + TransientSoundVolume=1.800000 + FireLoopAnim="Fire_Loop" + FireEndAnim="Fire_End" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.100000 + AmmoClass=Class'NicePack.NiceFNFALAmmo' + ShakeRotMag=(X=80.000000,Y=80.000000,Z=450.000000) + ShakeRotRate=(X=7500.000000,Y=7500.000000,Z=7500.000000) + ShakeRotTime=0.650000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=8.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.150000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_AssaultRifle.uc index 9d349f3..a4c2356 100644 --- a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_AssaultRifle.uc +++ b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_AssaultRifle.uc @@ -1,4 +1,51 @@ -class NiceFNFAL_ACOG_AssaultRifle extends NiceAssaultRifle; -defaultproperties -{ reloadPreEndFrame=0.178000 reloadEndFrame=0.626000 reloadChargeEndFrame=0.882000 reloadMagStartFrame=0.411000 reloadChargeStartFrame=0.710000 MagCapacity=20 ReloadRate=3.600000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_Fal_Acog" Weight=8.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_FNFAL' bIsTier3Weapon=True MeshRef="KF_Wep_Fal_Acog.FAL_ACOG" SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.FAL_cmb" SkinRefs(1)="KF_Weapons5_Scopes_Trip_T.FNFAL.AcogShader" SelectSoundRef="KF_FNFALSnd.FNFAL_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.FNFAL_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.FNFAL" PlayerIronSightFOV=55.000000 ZoomedDisplayFOV=15.000000 FireModeClass(0)=Class'NicePack.NiceFNFALFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="Classic NATO battle rifle. Has a high rate of fire and decent accuracy, with good power." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=180 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=12 PickupClass=Class'NicePack.NiceFNFAL_ACOG_Pickup' PlayerViewOffset=(X=3.000000,Y=15.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceFNFAL_ACOG_Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="FNFAL" TransientSoundVolume=1.250000 -} +class NiceFNFAL_ACOG_AssaultRifle extends NiceAssaultRifle; +defaultproperties +{ + reloadPreEndFrame=0.178000 + reloadEndFrame=0.626000 + reloadChargeEndFrame=0.882000 + reloadMagStartFrame=0.411000 + reloadChargeStartFrame=0.710000 + MagCapacity=20 + ReloadRate=3.600000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_Fal_Acog" + Weight=8.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=55.000000 + SleeveNum=2 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_FNFAL' + bIsTier3Weapon=True + MeshRef="KF_Wep_Fal_Acog.FAL_ACOG" + SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.FAL_cmb" + SkinRefs(1)="KF_Weapons5_Scopes_Trip_T.FNFAL.AcogShader" + SelectSoundRef="KF_FNFALSnd.FNFAL_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.FNFAL_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.FNFAL" + PlayerIronSightFOV=55.000000 + ZoomedDisplayFOV=15.000000 + FireModeClass(0)=Class'NicePack.NiceFNFALFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="Classic NATO battle rifle. Has a high rate of fire and decent accuracy, with good power." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=55.000000 + Priority=180 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=4 + GroupOffset=12 + PickupClass=Class'NicePack.NiceFNFAL_ACOG_Pickup' + PlayerViewOffset=(X=3.000000,Y=15.000000,Z=-6.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceFNFAL_ACOG_Attachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="FNFAL" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_Attachment.uc b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_Attachment.uc index ce41c3f..a79fe22 100644 --- a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_Attachment.uc +++ b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_Attachment.uc @@ -1,4 +1,57 @@ -class NiceFNFAL_ACOG_Attachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_AA12" MovementAnims(1)="JogB_AA12" MovementAnims(2)="JogL_AA12" MovementAnims(3)="JogR_AA12" TurnLeftAnim="TurnL_AA12" TurnRightAnim="TurnR_AA12" CrouchAnims(0)="CHWalkF_AA12" CrouchAnims(1)="CHWalkB_AA12" CrouchAnims(2)="CHWalkL_AA12" CrouchAnims(3)="CHWalkR_AA12" WalkAnims(0)="WalkF_AA12" WalkAnims(1)="WalkB_AA12" WalkAnims(2)="WalkL_AA12" WalkAnims(3)="WalkR_AA12" CrouchTurnRightAnim="CH_TurnR_AA12" CrouchTurnLeftAnim="CH_TurnL_AA12" IdleCrouchAnim="CHIdle_AA12" IdleWeaponAnim="Idle_AA12" IdleRestAnim="Idle_AA12" IdleChatAnim="Idle_AA12" IdleHeavyAnim="Idle_AA12" IdleRifleAnim="Idle_AA12" FireAnims(0)="Fire_AA12" FireAnims(1)="Fire_AA12" FireAnims(2)="Fire_AA12" FireAnims(3)="Fire_AA12" FireAltAnims(0)="Fire_AA12" FireAltAnims(1)="Fire_AA12" FireAltAnims(2)="Fire_AA12" FireAltAnims(3)="Fire_AA12" FireCrouchAnims(0)="CHFire_AA12" FireCrouchAnims(1)="CHFire_AA12" FireCrouchAnims(2)="CHFire_AA12" FireCrouchAnims(3)="CHFire_AA12" FireCrouchAltAnims(0)="CHFire_AA12" FireCrouchAltAnims(1)="CHFire_AA12" FireCrouchAltAnims(2)="CHFire_AA12" FireCrouchAltAnims(3)="CHFire_AA12" HitAnims(0)="HitF_AA12" HitAnims(1)="HitB_AA12" HitAnims(2)="HitL_AA12" HitAnims(3)="HitR_AA12" PostFireBlendStandAnim="Blend_AA12" PostFireBlendCrouchAnim="CHBlend_AA12" MeshRef="KF_Weapons3rd4_Trip.Fal_Acog_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceFNFAL_ACOG_Attachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + MovementAnims(0)="JogF_AA12" + MovementAnims(1)="JogB_AA12" + MovementAnims(2)="JogL_AA12" + MovementAnims(3)="JogR_AA12" + TurnLeftAnim="TurnL_AA12" + TurnRightAnim="TurnR_AA12" + CrouchAnims(0)="CHWalkF_AA12" + CrouchAnims(1)="CHWalkB_AA12" + CrouchAnims(2)="CHWalkL_AA12" + CrouchAnims(3)="CHWalkR_AA12" + WalkAnims(0)="WalkF_AA12" + WalkAnims(1)="WalkB_AA12" + WalkAnims(2)="WalkL_AA12" + WalkAnims(3)="WalkR_AA12" + CrouchTurnRightAnim="CH_TurnR_AA12" + CrouchTurnLeftAnim="CH_TurnL_AA12" + IdleCrouchAnim="CHIdle_AA12" + IdleWeaponAnim="Idle_AA12" + IdleRestAnim="Idle_AA12" + IdleChatAnim="Idle_AA12" + IdleHeavyAnim="Idle_AA12" + IdleRifleAnim="Idle_AA12" + FireAnims(0)="Fire_AA12" + FireAnims(1)="Fire_AA12" + FireAnims(2)="Fire_AA12" + FireAnims(3)="Fire_AA12" + FireAltAnims(0)="Fire_AA12" + FireAltAnims(1)="Fire_AA12" + FireAltAnims(2)="Fire_AA12" + FireAltAnims(3)="Fire_AA12" + FireCrouchAnims(0)="CHFire_AA12" + FireCrouchAnims(1)="CHFire_AA12" + FireCrouchAnims(2)="CHFire_AA12" + FireCrouchAnims(3)="CHFire_AA12" + FireCrouchAltAnims(0)="CHFire_AA12" + FireCrouchAltAnims(1)="CHFire_AA12" + FireCrouchAltAnims(2)="CHFire_AA12" + FireCrouchAltAnims(3)="CHFire_AA12" + HitAnims(0)="HitF_AA12" + HitAnims(1)="HitB_AA12" + HitAnims(2)="HitL_AA12" + HitAnims(3)="HitR_AA12" + PostFireBlendStandAnim="Blend_AA12" + PostFireBlendCrouchAnim="CHBlend_AA12" + MeshRef="KF_Weapons3rd4_Trip.Fal_Acog_3rd" + WeaponAmbientScale=2.000000 + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_Pickup.uc b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_Pickup.uc index 1f3883e..4dbe2e1 100644 --- a/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_Pickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/FNFAL/NiceFNFAL_ACOG_Pickup.uc @@ -1,4 +1,25 @@ -class NiceFNFAL_ACOG_Pickup extends NiceWeaponPickup; -defaultproperties -{ Weight=8.000000 cost=1250 AmmoCost=40 BuyClipSize=20 PowerValue=45 SpeedValue=90 RangeValue=70 Description="Classic NATO battle rifle. Has a high rate of fire and decent accuracy, with good power." ItemName="FNFAL" ItemShortName="FNFAL" AmmoItemName="7.62x51mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceFNFAL_ACOG_AssaultRifle' PickupMessage="You got the FN FAL with ACOG Sight" PickupSound=Sound'KF_FNFALSnd.FNFAL_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups4_Trip.Rifles.Fal_Acog_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceFNFAL_ACOG_Pickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=8.000000 + cost=1250 + AmmoCost=40 + BuyClipSize=20 + PowerValue=45 + SpeedValue=90 + RangeValue=70 + Description="Classic NATO battle rifle. Has a high rate of fire and decent accuracy, with good power." + ItemName="FNFAL" + ItemShortName="FNFAL" + AmmoItemName="7.62x51mm Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=3 + EquipmentCategoryID=3 + InventoryType=Class'NicePack.NiceFNFAL_ACOG_AssaultRifle' + PickupMessage="You got the FN FAL with ACOG Sight" + PickupSound=Sound'KF_FNFALSnd.FNFAL_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups4_Trip.Rifles.Fal_Acog_Pickup' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/HK417/NiceDamTypeHK417AR.uc b/sources/Weapons/Playable/AssaultRifles/HK417/NiceDamTypeHK417AR.uc index e50e91e..fa6ad1f 100644 --- a/sources/Weapons/Playable/AssaultRifles/HK417/NiceDamTypeHK417AR.uc +++ b/sources/Weapons/Playable/AssaultRifles/HK417/NiceDamTypeHK417AR.uc @@ -1,4 +1,14 @@ -class NiceDamTypeHK417AR extends NiceDamageTypeVetCommando; -defaultproperties -{ MaxPenetrations=2 HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceHK417AR' DeathString="%k killed %o (HK-417)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=1500.000000 KDeathVel=110.000000 KDeathUpKick=2.000000 -} +class NiceDamTypeHK417AR extends NiceDamageTypeVetCommando; +defaultproperties +{ + MaxPenetrations=2 + HeadShotDamageMult=2.000000 + WeaponClass=Class'NicePack.NiceHK417AR' + DeathString="%k killed %o (HK-417)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + KDamageImpulse=1500.000000 + KDeathVel=110.000000 + KDeathUpKick=2.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417AR.uc b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417AR.uc index 258792c..9ebf13b 100644 --- a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417AR.uc +++ b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417AR.uc @@ -1,4 +1,65 @@ -class NiceHK417AR extends NiceScopedWeapon; -defaultproperties -{ lenseMaterialID=8 scopePortalFOVHigh=40.000000 scopePortalFOV=40.000000 ZoomMatRef="ScrnWeaponPack_T.HK417AR.HK417Scope_FB" ScriptedTextureFallbackRef="KF_Weapons_Trip_T.Rifles.CBLens_cmb" CrosshairTexRef="ScrnWeaponPack_T.HK417AR.HK417Scope" reloadPreEndFrame=0.158000 reloadEndFrame=0.653000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.284000 reloadChargeStartFrame=-1.000000 MagazineBone="clip" bHasScope=True ZoomedDisplayFOVHigh=60.000000 MagCapacity=20 ReloadRate=3.150000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_M4" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 SleeveNum=0 TraderInfoTexture=Texture'ScrnWeaponPack_T.HK417AR.HK417_Trader' MeshRef="ScrnWeaponPack_A.HK417_mesh" SkinRefs(0)="KF_Weapons3_Trip_T.hands.Priest_Hands_1st_P" SkinRefs(1)="ScrnWeaponPack_T.HK417AR.hk417_sk1_d2" SkinRefs(2)="ScrnWeaponPack_T.HK417AR.mueller" SkinRefs(3)="ScrnWeaponPack_T.HK417AR.body" SkinRefs(4)="ScrnWeaponPack_T.HK417AR.body2" SkinRefs(5)="ScrnWeaponPack_T.HK417AR.hk416_5" SkinRefs(6)="ScrnWeaponPack_T.HK417AR.clip_hk417" SkinRefs(7)="ScrnWeaponPack_T.HK417AR.hk416_8" SkinRefs(8)="KF_Weapons_Trip_T.Rifles.CBLens_cmb" SelectSoundRef="ScrnWeaponPack_SND.HK417AR.HK417_select" HudImageRef="ScrnWeaponPack_T.HK417AR.HK417_Unselected" SelectedHudImageRef="ScrnWeaponPack_T.HK417AR.HK417_selected" PlayerIronSightFOV=32.000000 ZoomedDisplayFOV=60.000000 FireModeClass(0)=Class'NicePack.NiceHK417Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectAnimRate=2.000000 BringUpTime=0.500000 SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="The Heckler & Koch HK417 is a gas-operated, selective fire rifle with a rotating bolt and is essentially an enlarged HK416 assault rifle. Chambered for the full power 7.62x51mm NATO round, instead of a less powerful intermediate cartridge, the HK417 is intended for use as a designated marksman rifle, and in other roles where the greater penetrative power and range of the 7.62x51mm NATO round are required." DisplayFOV=65.000000 Priority=100 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=3 PickupClass=Class'NicePack.NiceHK417Pickup' PlayerViewOffset=(X=14.000000,Y=7.000000,Z=-4.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceHK417Attachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="HK-417" -} +class NiceHK417AR extends NiceScopedWeapon; +defaultproperties +{ + lenseMaterialID=8 + scopePortalFOVHigh=40.000000 + scopePortalFOV=40.000000 + ZoomMatRef="ScrnWeaponPack_T.HK417AR.HK417Scope_FB" + ScriptedTextureFallbackRef="KF_Weapons_Trip_T.Rifles.CBLens_cmb" + CrosshairTexRef="ScrnWeaponPack_T.HK417AR.HK417Scope" + reloadPreEndFrame=0.158000 + reloadEndFrame=0.653000 + reloadChargeEndFrame=-1.000000 + reloadMagStartFrame=0.284000 + reloadChargeStartFrame=-1.000000 + MagazineBone="clip" + bHasScope=True + ZoomedDisplayFOVHigh=60.000000 + MagCapacity=20 + ReloadRate=3.150000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_M4" + Weight=6.000000 + bHasAimingMode=True + IdleAimAnim="Iron_Idle" + StandardDisplayFOV=65.000000 + SleeveNum=0 + TraderInfoTexture=Texture'ScrnWeaponPack_T.HK417AR.HK417_Trader' + MeshRef="ScrnWeaponPack_A.HK417_mesh" + SkinRefs(0)="KF_Weapons3_Trip_T.hands.Priest_Hands_1st_P" + SkinRefs(1)="ScrnWeaponPack_T.HK417AR.hk417_sk1_d2" + SkinRefs(2)="ScrnWeaponPack_T.HK417AR.mueller" + SkinRefs(3)="ScrnWeaponPack_T.HK417AR.body" + SkinRefs(4)="ScrnWeaponPack_T.HK417AR.body2" + SkinRefs(5)="ScrnWeaponPack_T.HK417AR.hk416_5" + SkinRefs(6)="ScrnWeaponPack_T.HK417AR.clip_hk417" + SkinRefs(7)="ScrnWeaponPack_T.HK417AR.hk416_8" + SkinRefs(8)="KF_Weapons_Trip_T.Rifles.CBLens_cmb" + SelectSoundRef="ScrnWeaponPack_SND.HK417AR.HK417_select" + HudImageRef="ScrnWeaponPack_T.HK417AR.HK417_Unselected" + SelectedHudImageRef="ScrnWeaponPack_T.HK417AR.HK417_selected" + PlayerIronSightFOV=32.000000 + ZoomedDisplayFOV=60.000000 + FireModeClass(0)=Class'NicePack.NiceHK417Fire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectAnimRate=2.000000 + BringUpTime=0.500000 + SelectForce="SwitchToAssaultRifle" + AIRating=0.650000 + CurrentRating=0.650000 + Description="The Heckler & Koch HK417 is a gas-operated, selective fire rifle with a rotating bolt and is essentially an enlarged HK416 assault rifle. Chambered for the full power 7.62x51mm NATO round, instead of a less powerful intermediate cartridge, the HK417 is intended for use as a designated marksman rifle, and in other roles where the greater penetrative power and range of the 7.62x51mm NATO round are required." + DisplayFOV=65.000000 + Priority=100 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=4 + GroupOffset=3 + PickupClass=Class'NicePack.NiceHK417Pickup' + PlayerViewOffset=(X=14.000000,Y=7.000000,Z=-4.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceHK417Attachment' + IconCoords=(X1=253,Y1=146,X2=333,Y2=181) + ItemName="HK-417" +} diff --git a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Ammo.uc b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Ammo.uc index 6c67014..c11c35e 100644 --- a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Ammo.uc +++ b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Ammo.uc @@ -1,5 +1,13 @@ -class NiceHK417Ammo extends NiceAmmo; -#EXEC OBJ LOAD FILE=InterfaceContent.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceHK417Pickup' AmmoPickupAmount=20 MaxAmmo=180 InitialAmount=45 PickupClass=Class'ScrnWeaponPack.HK417AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="7.62x51mm NATO" -} +class NiceHK417Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceHK417Pickup' + AmmoPickupAmount=20 + MaxAmmo=180 + InitialAmount=45 + PickupClass=Class'ScrnWeaponPack.HK417AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=338,Y1=40,X2=393,Y2=79) + ItemName="7.62x51mm NATO" +} diff --git a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417AmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417AmmoPickup.uc index 2311f08..4328b03 100644 --- a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417AmmoPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417AmmoPickup.uc @@ -1,4 +1,7 @@ -class NiceHK417AmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=20 InventoryType=Class'NicePack.NiceHK417Ammo' PickupMessage="7.62x51mm NATO" -} +class NiceHK417AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=20 + InventoryType=Class'NicePack.NiceHK417Ammo' + PickupMessage="7.62x51mm NATO" +} diff --git a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Attachment.uc b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Attachment.uc index 4c6bf35..0257a24 100644 --- a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Attachment.uc +++ b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Attachment.uc @@ -1,4 +1,58 @@ -class NiceHK417Attachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_SCAR" MovementAnims(1)="JogB_SCAR" MovementAnims(2)="JogL_SCAR" MovementAnims(3)="JogR_SCAR" TurnLeftAnim="TurnL_SCAR" TurnRightAnim="TurnR_SCAR" CrouchAnims(0)="CHWalkF_SCAR" CrouchAnims(1)="CHWalkB_SCAR" CrouchAnims(2)="CHWalkL_SCAR" CrouchAnims(3)="CHWalkR_SCAR" WalkAnims(0)="WalkF_SCAR" WalkAnims(1)="WalkB_SCAR" WalkAnims(2)="WalkL_SCAR" WalkAnims(3)="WalkR_SCAR" CrouchTurnRightAnim="CH_TurnR_SCAR" CrouchTurnLeftAnim="CH_TurnL_SCAR" IdleCrouchAnim="CHIdle_SCAR" IdleWeaponAnim="Idle_SCAR" IdleRestAnim="Idle_SCAR" IdleChatAnim="Idle_SCAR" IdleHeavyAnim="Idle_SCAR" IdleRifleAnim="Idle_SCAR" FireAnims(0)="Fire_SCAR" FireAnims(1)="Fire_SCAR" FireAnims(2)="Fire_SCAR" FireAnims(3)="Fire_SCAR" FireAltAnims(0)="Fire_SCAR" FireAltAnims(1)="Fire_SCAR" FireAltAnims(2)="Fire_SCAR" FireAltAnims(3)="Fire_SCAR" FireCrouchAnims(0)="CHFire_SCAR" FireCrouchAnims(1)="CHFire_SCAR" FireCrouchAnims(2)="CHFire_SCAR" FireCrouchAnims(3)="CHFire_SCAR" FireCrouchAltAnims(0)="CHFire_SCAR" FireCrouchAltAnims(1)="CHFire_SCAR" FireCrouchAltAnims(2)="CHFire_SCAR" FireCrouchAltAnims(3)="CHFire_SCAR" HitAnims(0)="HitF_SCAR" HitAnims(1)="HitB_SCAR" HitAnims(2)="HitL_SCAR" HitAnims(3)="HitR_SCAR" PostFireBlendStandAnim="Blend_SCAR" PostFireBlendCrouchAnim="CHBlend_SCAR" MeshRef="ScrnWeaponPack_A.HK417_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' DrawScale=0.600000 -} +class NiceHK417Attachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + ShellEjectBoneName="Shell_eject" + MovementAnims(0)="JogF_SCAR" + MovementAnims(1)="JogB_SCAR" + MovementAnims(2)="JogL_SCAR" + MovementAnims(3)="JogR_SCAR" + TurnLeftAnim="TurnL_SCAR" + TurnRightAnim="TurnR_SCAR" + CrouchAnims(0)="CHWalkF_SCAR" + CrouchAnims(1)="CHWalkB_SCAR" + CrouchAnims(2)="CHWalkL_SCAR" + CrouchAnims(3)="CHWalkR_SCAR" + WalkAnims(0)="WalkF_SCAR" + WalkAnims(1)="WalkB_SCAR" + WalkAnims(2)="WalkL_SCAR" + WalkAnims(3)="WalkR_SCAR" + CrouchTurnRightAnim="CH_TurnR_SCAR" + CrouchTurnLeftAnim="CH_TurnL_SCAR" + IdleCrouchAnim="CHIdle_SCAR" + IdleWeaponAnim="Idle_SCAR" + IdleRestAnim="Idle_SCAR" + IdleChatAnim="Idle_SCAR" + IdleHeavyAnim="Idle_SCAR" + IdleRifleAnim="Idle_SCAR" + FireAnims(0)="Fire_SCAR" + FireAnims(1)="Fire_SCAR" + FireAnims(2)="Fire_SCAR" + FireAnims(3)="Fire_SCAR" + FireAltAnims(0)="Fire_SCAR" + FireAltAnims(1)="Fire_SCAR" + FireAltAnims(2)="Fire_SCAR" + FireAltAnims(3)="Fire_SCAR" + FireCrouchAnims(0)="CHFire_SCAR" + FireCrouchAnims(1)="CHFire_SCAR" + FireCrouchAnims(2)="CHFire_SCAR" + FireCrouchAnims(3)="CHFire_SCAR" + FireCrouchAltAnims(0)="CHFire_SCAR" + FireCrouchAltAnims(1)="CHFire_SCAR" + FireCrouchAltAnims(2)="CHFire_SCAR" + FireCrouchAltAnims(3)="CHFire_SCAR" + HitAnims(0)="HitF_SCAR" + HitAnims(1)="HitB_SCAR" + HitAnims(2)="HitL_SCAR" + HitAnims(3)="HitR_SCAR" + PostFireBlendStandAnim="Blend_SCAR" + PostFireBlendCrouchAnim="CHBlend_SCAR" + MeshRef="ScrnWeaponPack_A.HK417_3rd" + WeaponAmbientScale=2.000000 + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + DrawScale=0.600000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Fire.uc b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Fire.uc index c1e0261..5cd1e8b 100644 --- a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Fire.uc +++ b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Fire.uc @@ -1,4 +1,35 @@ -class NiceHK417Fire extends NiceFire; -defaultproperties -{ ProjectileSpeed=40850.000000 FireAimedAnim="Iron_Idle" RecoilRate=0.070000 maxVerticalRecoilAngle=500 maxHorizontalRecoilAngle=250 ShellEjectClass=Class'ROEffects.KFShellEjectAK' ShellEjectBoneName="Shell_eject" FireSoundRef="ScrnWeaponPack_SND.HK417AR.HK417_shot" StereoFireSoundRef="ScrnWeaponPack_SND.HK417AR.HK417_shot" NoAmmoSoundRef="ScrnWeaponPack_SND.HK417AR.HK417_empty" DamageType=Class'NicePack.NiceDamTypeHK417AR' DamageMin=75 DamageMax=75 Momentum=20000.000000 bPawnRapidFireAnim=True bWaitForRelease=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.230000 AmmoClass=Class'NicePack.NiceHK417Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=300.000000) ShakeRotRate=(X=9500.000000,Y=9500.000000,Z=9500.000000) ShakeRotTime=0.650000 ShakeOffsetMag=(X=3.000000,Y=3.000000,Z=3.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=60.000000 -} +class NiceHK417Fire extends NiceFire; +defaultproperties +{ + ProjectileSpeed=40850.000000 + FireAimedAnim="Iron_Idle" + RecoilRate=0.070000 + maxVerticalRecoilAngle=500 + maxHorizontalRecoilAngle=250 + ShellEjectClass=Class'ROEffects.KFShellEjectAK' + ShellEjectBoneName="Shell_eject" + FireSoundRef="ScrnWeaponPack_SND.HK417AR.HK417_shot" + StereoFireSoundRef="ScrnWeaponPack_SND.HK417AR.HK417_shot" + NoAmmoSoundRef="ScrnWeaponPack_SND.HK417AR.HK417_empty" + DamageType=Class'NicePack.NiceDamTypeHK417AR' + DamageMin=75 + DamageMax=75 + Momentum=20000.000000 + bPawnRapidFireAnim=True + bWaitForRelease=True + TransientSoundVolume=1.800000 + FireLoopAnim="Fire" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.230000 + AmmoClass=Class'NicePack.NiceHK417Ammo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=300.000000) + ShakeRotRate=(X=9500.000000,Y=9500.000000,Z=9500.000000) + ShakeRotTime=0.650000 + ShakeOffsetMag=(X=3.000000,Y=3.000000,Z=3.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.250000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' + aimerror=60.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Pickup.uc b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Pickup.uc index 2f8c266..d2a612f 100644 --- a/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Pickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/HK417/NiceHK417Pickup.uc @@ -1,4 +1,24 @@ -class NiceHK417Pickup extends NiceWeaponPickup; -defaultproperties -{ Weight=6.000000 AmmoCost=40 BuyClipSize=10 PowerValue=60 SpeedValue=30 RangeValue=95 Description="The Heckler & Koch HK417 is a gas-operated, selective fire rifle with a rotating bolt and is essentially an enlarged HK416 assault rifle. Chambered for the full power 7.62x51mm NATO round, instead of a less powerful intermediate cartridge, the HK417 is intended for use as a designated marksman rifle, and in other roles where the greater penetrative power and range of the 7.62x51mm NATO round are required." ItemName="HK-417" ItemShortName="HK-417" AmmoItemName="7.62x51mm NATO" CorrespondingPerkIndex=3 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceHK417AR' PickupMessage="You've got a HK-417" PickupSound=Sound'ScrnWeaponPack_SND.HK417AR.HK417_pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.HK417_st' DrawScale=0.800000 CollisionRadius=30.000000 CollisionHeight=5.000000 -} +class NiceHK417Pickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=6.000000 + AmmoCost=40 + BuyClipSize=10 + PowerValue=60 + SpeedValue=30 + RangeValue=95 + Description="The Heckler & Koch HK417 is a gas-operated, selective fire rifle with a rotating bolt and is essentially an enlarged HK416 assault rifle. Chambered for the full power 7.62x51mm NATO round, instead of a less powerful intermediate cartridge, the HK417 is intended for use as a designated marksman rifle, and in other roles where the greater penetrative power and range of the 7.62x51mm NATO round are required." + ItemName="HK-417" + ItemShortName="HK-417" + AmmoItemName="7.62x51mm NATO" + CorrespondingPerkIndex=3 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceHK417AR' + PickupMessage="You've got a HK-417" + PickupSound=Sound'ScrnWeaponPack_SND.HK417AR.HK417_pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'ScrnWeaponPack_SM.HK417_st' + DrawScale=0.800000 + CollisionRadius=30.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceDamTypeL85A2Z.uc b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceDamTypeL85A2Z.uc index 374e6b8..4b46cff 100644 --- a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceDamTypeL85A2Z.uc +++ b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceDamTypeL85A2Z.uc @@ -1,6 +1,22 @@ -class NiceDamTypeL85A2Z extends NiceDamageTypeVetCommando - abstract; -defaultproperties -{ - badDecapMod=0.8000 HeadShotDamageMult=1.400000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceL85A2Z' DeathString="%k killed %o." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' FlashFog=(X=600.000000) KDamageImpulse=4500.000000 KDeathVel=200.000000 KDeathUpKick=20.000000 VehicleDamageScaling=0.800000 -} +class NiceDamTypeL85A2Z extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ + badDecapMod=0.8000 + HeadShotDamageMult=1.400000 + bSniperWeapon=True + WeaponClass=Class'NicePack.NiceL85A2Z' + DeathString="%k killed %o." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + PawnDamageEmitter=Class'ROEffects.ROBloodPuff' + LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' + LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' + FlashFog=(X=600.000000) + KDamageImpulse=4500.000000 + KDeathVel=200.000000 + KDeathUpKick=20.000000 + VehicleDamageScaling=0.800000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Ammo.uc b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Ammo.uc index e84afc6..2623360 100644 --- a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Ammo.uc +++ b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Ammo.uc @@ -1,5 +1,13 @@ -class NiceL85A2Ammo extends NiceAmmo; -#EXEC OBJ LOAD FILE=InterfaceContent.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceL85A2Pickup' AmmoPickupAmount=15 MaxAmmo=180 InitialAmount=45 PickupClass=Class'NicePack.NiceL85A2AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=413,Y1=82,X2=457,Y2=125) ItemName="Stanag Magazines" -} +class NiceL85A2Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceL85A2Pickup' + AmmoPickupAmount=15 + MaxAmmo=180 + InitialAmount=45 + PickupClass=Class'NicePack.NiceL85A2AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=413,Y1=82,X2=457,Y2=125) + ItemName="Stanag Magazines" +} diff --git a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2AmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2AmmoPickup.uc index a2ffecc..53dcfb2 100644 --- a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2AmmoPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2AmmoPickup.uc @@ -1,4 +1,9 @@ -class NiceL85A2AmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=30 InventoryType=Class'NicePack.NiceL85A2Ammo' RespawnTime=0.000000 PickupMessage="Mag (5.56mm)" StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' -} +class NiceL85A2AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=30 + InventoryType=Class'NicePack.NiceL85A2Ammo' + RespawnTime=0.000000 + PickupMessage="Mag (5.56mm)" + StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Attachment.uc b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Attachment.uc index 7d1d7ed..1bfab65 100644 --- a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Attachment.uc +++ b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Attachment.uc @@ -1,4 +1,56 @@ -class NiceL85A2Attachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_M4" MovementAnims(1)="JogB_M4" MovementAnims(2)="JogL_M4" MovementAnims(3)="JogR_M4" TurnLeftAnim="TurnL_M4" TurnRightAnim="TurnR_M4" CrouchAnims(0)="CHWalkF_M4" CrouchAnims(1)="CHWalkB_M4" CrouchAnims(2)="CHWalkL_M4" CrouchAnims(3)="CHWalkR_M4" WalkAnims(0)="WalkF_M4" WalkAnims(1)="WalkB_M4" WalkAnims(2)="WalkL_M4" WalkAnims(3)="WalkR_M4" CrouchTurnRightAnim="CH_TurnR_M4" CrouchTurnLeftAnim="CH_TurnL_M4" IdleCrouchAnim="CHIdle_M4" IdleWeaponAnim="Idle_M4" IdleRestAnim="Idle_M4" IdleChatAnim="Idle_M4" IdleHeavyAnim="Idle_M4" IdleRifleAnim="Idle_M4" FireAnims(0)="Fire_M4" FireAnims(1)="Fire_M4" FireAnims(2)="Fire_M4" FireAnims(3)="Fire_M4" FireAltAnims(0)="Fire_M4" FireAltAnims(1)="Fire_M4" FireAltAnims(2)="Fire_M4" FireAltAnims(3)="Fire_M4" FireCrouchAnims(0)="CHFire_M4" FireCrouchAnims(1)="CHFire_M4" FireCrouchAnims(2)="CHFire_M4" FireCrouchAnims(3)="CHFire_M4" FireCrouchAltAnims(0)="CHFire_M4" FireCrouchAltAnims(1)="CHFire_M4" FireCrouchAltAnims(2)="CHFire_M4" FireCrouchAltAnims(3)="CHFire_M4" HitAnims(0)="HitF_M4" HitAnims(1)="HitB_M4" HitAnims(2)="HitL_M4" HitAnims(3)="HitR_M4" PostFireBlendStandAnim="Blend_M4" PostFireBlendCrouchAnim="CHBlend_M4" MeshRef="NicePackA.L85A2_3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceL85A2Attachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + MovementAnims(0)="JogF_M4" + MovementAnims(1)="JogB_M4" + MovementAnims(2)="JogL_M4" + MovementAnims(3)="JogR_M4" + TurnLeftAnim="TurnL_M4" + TurnRightAnim="TurnR_M4" + CrouchAnims(0)="CHWalkF_M4" + CrouchAnims(1)="CHWalkB_M4" + CrouchAnims(2)="CHWalkL_M4" + CrouchAnims(3)="CHWalkR_M4" + WalkAnims(0)="WalkF_M4" + WalkAnims(1)="WalkB_M4" + WalkAnims(2)="WalkL_M4" + WalkAnims(3)="WalkR_M4" + CrouchTurnRightAnim="CH_TurnR_M4" + CrouchTurnLeftAnim="CH_TurnL_M4" + IdleCrouchAnim="CHIdle_M4" + IdleWeaponAnim="Idle_M4" + IdleRestAnim="Idle_M4" + IdleChatAnim="Idle_M4" + IdleHeavyAnim="Idle_M4" + IdleRifleAnim="Idle_M4" + FireAnims(0)="Fire_M4" + FireAnims(1)="Fire_M4" + FireAnims(2)="Fire_M4" + FireAnims(3)="Fire_M4" + FireAltAnims(0)="Fire_M4" + FireAltAnims(1)="Fire_M4" + FireAltAnims(2)="Fire_M4" + FireAltAnims(3)="Fire_M4" + FireCrouchAnims(0)="CHFire_M4" + FireCrouchAnims(1)="CHFire_M4" + FireCrouchAnims(2)="CHFire_M4" + FireCrouchAnims(3)="CHFire_M4" + FireCrouchAltAnims(0)="CHFire_M4" + FireCrouchAltAnims(1)="CHFire_M4" + FireCrouchAltAnims(2)="CHFire_M4" + FireCrouchAltAnims(3)="CHFire_M4" + HitAnims(0)="HitF_M4" + HitAnims(1)="HitB_M4" + HitAnims(2)="HitL_M4" + HitAnims(3)="HitR_M4" + PostFireBlendStandAnim="Blend_M4" + PostFireBlendCrouchAnim="CHBlend_M4" + MeshRef="NicePackA.L85A2_3rd" + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Fire.uc b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Fire.uc index 1e36412..001be69 100644 --- a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Fire.uc +++ b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Fire.uc @@ -1,4 +1,38 @@ -class NiceL85A2Fire extends NiceFire; -defaultproperties -{ zedTimeFireSpeedUp=2.500000 ProjectileSpeed=46500.000000 bBetterBurst=True FireAimedAnim="Fire_Iron" RecoilRate=0.050000 maxVerticalRecoilAngle=75 maxHorizontalRecoilAngle=37 ShellEjectClass=Class'ROEffects.KFShellEjectSCAR' ShellEjectBoneName="Shell_eject" bRandomPitchFireSound=False FireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_M" StereoFireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_S" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeL85A2Z' DamageMin=81 DamageMax=81 Momentum=10000.000000 bPawnRapidFireAnim=True bWaitForRelease=True bAttachSmokeEmitter=True TransientSoundVolume=1.800000 TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.250000 AmmoClass=Class'NicePack.NiceL85A2Ammo' ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=3.000000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=2.000000 BotRefireRate=0.350000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=30.000000 -} +class NiceL85A2Fire extends NiceFire; +defaultproperties +{ + zedTimeFireSpeedUp=2.500000 + ProjectileSpeed=46500.000000 + bBetterBurst=True + FireAimedAnim="Fire_Iron" + RecoilRate=0.050000 + maxVerticalRecoilAngle=75 + maxHorizontalRecoilAngle=37 + ShellEjectClass=Class'ROEffects.KFShellEjectSCAR' + ShellEjectBoneName="Shell_eject" + bRandomPitchFireSound=False + FireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_M" + StereoFireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_S" + NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" + DamageType=Class'NicePack.NiceDamTypeL85A2Z' + DamageMin=81 + DamageMax=81 + Momentum=10000.000000 + bPawnRapidFireAnim=True + bWaitForRelease=True + bAttachSmokeEmitter=True + TransientSoundVolume=1.800000 + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.250000 + AmmoClass=Class'NicePack.NiceL85A2Ammo' + ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeRotTime=3.000000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=2.000000 + BotRefireRate=0.350000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' + aimerror=30.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Pickup.uc b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Pickup.uc index 715d18f..674a22d 100644 --- a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Pickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Pickup.uc @@ -1,4 +1,25 @@ -class NiceL85A2Pickup extends NiceWeaponPickup; -defaultproperties -{ Weight=5.000000 cost=250 AmmoCost=10 BuyClipSize=15 PowerValue=45 SpeedValue=60 RangeValue=70 Description="This L85A2 is fine-tuned for sharpshooter's use: relatively low damage is compensated by sharpshooter's own abilities, while low recoil and simple reload allow for non-stop head-popping." ItemName="L85A2" ItemShortName="L85A2" AmmoItemName="5.556x45mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceL85A2Z' PickupMessage="You got the L85A2" PickupSound=Sound'KF_FNFALSnd.FNFAL_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'NicePackSM.L85A2.L85A2_Static' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceL85A2Pickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=5.000000 + cost=250 + AmmoCost=10 + BuyClipSize=15 + PowerValue=45 + SpeedValue=60 + RangeValue=70 + Description="This L85A2 is fine-tuned for sharpshooter's use: relatively low damage is compensated by sharpshooter's own abilities, while low recoil and simple reload allow for non-stop head-popping." + ItemName="L85A2" + ItemShortName="L85A2" + AmmoItemName="5.556x45mm Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=3 + EquipmentCategoryID=3 + InventoryType=Class'NicePack.NiceL85A2Z' + PickupMessage="You got the L85A2" + PickupSound=Sound'KF_FNFALSnd.FNFAL_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'NicePackSM.L85A2.L85A2_Static' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Z.uc b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Z.uc index 0dfe350..d7979a6 100644 --- a/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Z.uc +++ b/sources/Weapons/Playable/AssaultRifles/L85A2/NiceL85A2Z.uc @@ -1,6 +1,62 @@ -class NiceL85A2Z extends NiceScopedWeapon; -#exec OBJ LOAD FILE=..\Textures\ScopeShaders.utx -#exec OBJ LOAD FILE=..\Textures\NicePackT.utx -defaultproperties -{ lenseMaterialID=3 scopePortalFOVHigh=14.000000 scopePortalFOV=14.000000 ZoomMatRef="NicePackT.L85A2.Susat_Scope" ScriptedTextureFallbackRef="KF_Weapons_Trip_T.CBLens_cmb" CrosshairTexRef="NicePackT.L85A2.Susat_Scope" reloadPreEndFrame=0.270000 reloadEndFrame=0.469000 reloadChargeEndFrame=0.760000 reloadMagStartFrame=0.385000 reloadChargeStartFrame=0.570000 MagazineBone="clip" FirstPersonFlashlightOffset=(X=-20.000000,Y=-22.000000,Z=8.000000) bHasScope=True ZoomedDisplayFOVHigh=65.000000 MagCapacity=30 ReloadRate=2.500000 ReloadAnim="Reload" ReloadAnimRate=1.280000 WeaponReloadAnim="Reload" Weight=5.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=70.000000 SleeveNum=0 TraderInfoTexture=Texture'NicePackT.L85A2.L85A2_Trader' bIsTier3Weapon=True MeshRef="NicePackA.L85A2_Weapon" SkinRefs(1)="NicePackT.L85A2.l85a1_diffuse_04" SkinRefs(2)="NicePackT.L85A2.susat_diffuse_01" HudImageRef="NicePackT.L85A2.L85A2_Unselected" SelectedHudImageRef="NicePackT.L85A2.L85A2_Selected" PlayerIronSightFOV=40.000000 ZoomedDisplayFOV=65.000000 FireModeClass(0)=Class'NicePack.NiceL85A2Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectAnimRate=1.500000 BringUpTime=0.600000 SelectSound=Sound'KF_9MMSnd.9mm_Select' AIRating=0.250000 CurrentRating=0.250000 bShowChargingBar=True Description="This L85A2 is fine-tuned for sharpshooter's use: relatively low damage is compensated by sharpshooter's own abilities, while low recoil and simple reload allow for non-stop head-popping." DisplayFOV=70.000000 Priority=100 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=1 PickupClass=Class'NicePack.NiceL85A2Pickup' PlayerViewOffset=(X=20.000000,Y=25.000000,Z=-10.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceL85A2Attachment' IconCoords=(X1=434,Y1=253,X2=506,Y2=292) ItemName="L85A2" -} +class NiceL85A2Z extends NiceScopedWeapon; +#exec OBJ LOAD FILE=..\Textures\ScopeShaders.utx +#exec OBJ LOAD FILE=..\Textures\NicePackT.utx +defaultproperties +{ + lenseMaterialID=3 + scopePortalFOVHigh=14.000000 + scopePortalFOV=14.000000 + ZoomMatRef="NicePackT.L85A2.Susat_Scope" + ScriptedTextureFallbackRef="KF_Weapons_Trip_T.CBLens_cmb" + CrosshairTexRef="NicePackT.L85A2.Susat_Scope" + reloadPreEndFrame=0.270000 + reloadEndFrame=0.469000 + reloadChargeEndFrame=0.760000 + reloadMagStartFrame=0.385000 + reloadChargeStartFrame=0.570000 + MagazineBone="clip" + FirstPersonFlashlightOffset=(X=-20.000000,Y=-22.000000,Z=8.000000) + bHasScope=True + ZoomedDisplayFOVHigh=65.000000 + MagCapacity=30 + ReloadRate=2.500000 + ReloadAnim="Reload" + ReloadAnimRate=1.280000 + WeaponReloadAnim="Reload" + Weight=5.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=70.000000 + SleeveNum=0 + TraderInfoTexture=Texture'NicePackT.L85A2.L85A2_Trader' + bIsTier3Weapon=True + MeshRef="NicePackA.L85A2_Weapon" + SkinRefs(1)="NicePackT.L85A2.l85a1_diffuse_04" + SkinRefs(2)="NicePackT.L85A2.susat_diffuse_01" + HudImageRef="NicePackT.L85A2.L85A2_Unselected" + SelectedHudImageRef="NicePackT.L85A2.L85A2_Selected" + PlayerIronSightFOV=40.000000 + ZoomedDisplayFOV=65.000000 + FireModeClass(0)=Class'NicePack.NiceL85A2Fire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectAnimRate=1.500000 + BringUpTime=0.600000 + SelectSound=Sound'KF_9MMSnd.9mm_Select' + AIRating=0.250000 + CurrentRating=0.250000 + bShowChargingBar=True + Description="This L85A2 is fine-tuned for sharpshooter's use: relatively low damage is compensated by sharpshooter's own abilities, while low recoil and simple reload allow for non-stop head-popping." + DisplayFOV=70.000000 + Priority=100 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=3 + GroupOffset=1 + PickupClass=Class'NicePack.NiceL85A2Pickup' + PlayerViewOffset=(X=20.000000,Y=25.000000,Z=-10.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceL85A2Attachment' + IconCoords=(X1=434,Y1=253,X2=506,Y2=292) + ItemName="L85A2" +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4/NiceDamTypeM4AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/M4/NiceDamTypeM4AssaultRifle.uc index 2e4b8cc..1c0ab25 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4/NiceDamTypeM4AssaultRifle.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4/NiceDamTypeM4AssaultRifle.uc @@ -1,5 +1,14 @@ -class NiceDamTypeM4AssaultRifle extends NiceDamageTypeVetCommando - abstract; -defaultproperties -{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceM4AssaultRifle' DeathString="%k killed %o (M4)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=1500.000000 KDeathVel=110.000000 KDeathUpKick=2.000000 -} +class NiceDamTypeM4AssaultRifle extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ + HeadShotDamageMult=1.500000 + WeaponClass=Class'NicePack.NiceM4AssaultRifle' + DeathString="%k killed %o (M4)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + KDamageImpulse=1500.000000 + KDeathVel=110.000000 + KDeathUpKick=2.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Ammo.uc b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Ammo.uc index 650183a..34b4c36 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Ammo.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Ammo.uc @@ -1,5 +1,13 @@ -class NiceM4Ammo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceM4Pickup' AmmoPickupAmount=30 MaxAmmo=180 InitialAmount=45 PickupClass=Class'NicePack.NiceM4AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="M4 bullets" -} +class NiceM4Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceM4Pickup' + AmmoPickupAmount=30 + MaxAmmo=180 + InitialAmount=45 + PickupClass=Class'NicePack.NiceM4AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="M4 bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4AmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4AmmoPickup.uc index 6f8da85..c0b6cd6 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4AmmoPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4AmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceM4AmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=30 InventoryType=Class'NicePack.NiceM4Ammo' PickupMessage="Rounds 5.56mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceM4AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=30 + InventoryType=Class'NicePack.NiceM4Ammo' + PickupMessage="Rounds 5.56mm" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4AssaultRifle.uc index 20c696b..bc28f8f 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4AssaultRifle.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4AssaultRifle.uc @@ -1,7 +1,54 @@ -class NiceM4AssaultRifle extends NiceAssaultRifle; -#exec OBJ LOAD FILE=KillingFloorWeapons.utx -#exec OBJ LOAD FILE=KillingFloorHUD.utx -#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax -defaultproperties -{ reloadPreEndFrame=0.148000 reloadEndFrame=0.546000 reloadChargeEndFrame=0.778000 reloadMagStartFrame=0.306000 reloadChargeStartFrame=0.694000 MagCapacity=30 ReloadRate=3.633300 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_M4" Weight=5.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=60.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M4' bIsTier2Weapon=True MeshRef="KF_Wep_M4.M4_Trip" SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.m4_cmb" SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" SelectSoundRef="KF_M4RifleSnd.WEP_M4_Foley_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.M4_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M4" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceM4Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="A compact assault rifle. Can be fired in semi or full auto with good damage and good accuracy." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=130 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=10 PickupClass=Class'NicePack.NiceM4Pickup' PlayerViewOffset=(X=25.000000,Y=18.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceM4Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="M4" TransientSoundVolume=1.250000 -} +class NiceM4AssaultRifle extends NiceAssaultRifle; +#exec OBJ LOAD FILE=KillingFloorWeapons.utx +#exec OBJ LOAD FILE=KillingFloorHUD.utx +#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax +defaultproperties +{ + reloadPreEndFrame=0.148000 + reloadEndFrame=0.546000 + reloadChargeEndFrame=0.778000 + reloadMagStartFrame=0.306000 + reloadChargeStartFrame=0.694000 + MagCapacity=30 + ReloadRate=3.633300 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_M4" + Weight=5.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=60.000000 + SleeveNum=2 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M4' + bIsTier2Weapon=True + MeshRef="KF_Wep_M4.M4_Trip" + SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.m4_cmb" + SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" + SelectSoundRef="KF_M4RifleSnd.WEP_M4_Foley_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.M4_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M4" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=45.000000 + FireModeClass(0)=Class'NicePack.NiceM4Fire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="A compact assault rifle. Can be fired in semi or full auto with good damage and good accuracy." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=60.000000 + Priority=130 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=3 + GroupOffset=10 + PickupClass=Class'NicePack.NiceM4Pickup' + PlayerViewOffset=(X=25.000000,Y=18.000000,Z=-6.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceM4Attachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="M4" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Attachment.uc b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Attachment.uc index a845b31..7f1c373 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Attachment.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Attachment.uc @@ -1,4 +1,58 @@ -class NiceM4Attachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_M4" MovementAnims(1)="JogB_M4" MovementAnims(2)="JogL_M4" MovementAnims(3)="JogR_M4" TurnLeftAnim="TurnL_M4" TurnRightAnim="TurnR_M4" CrouchAnims(0)="CHWalkF_M4" CrouchAnims(1)="CHWalkB_M4" CrouchAnims(2)="CHWalkL_M4" CrouchAnims(3)="CHWalkR_M4" WalkAnims(0)="WalkF_M4" WalkAnims(1)="WalkB_M4" WalkAnims(2)="WalkL_M4" WalkAnims(3)="WalkR_M4" CrouchTurnRightAnim="CH_TurnR_M4" CrouchTurnLeftAnim="CH_TurnL_M4" IdleCrouchAnim="CHIdle_M4" IdleWeaponAnim="Idle_M4" IdleRestAnim="Idle_M4" IdleChatAnim="Idle_M4" IdleHeavyAnim="Idle_M4" IdleRifleAnim="Idle_M4" FireAnims(0)="Fire_M4" FireAnims(1)="Fire_M4" FireAnims(2)="Fire_M4" FireAnims(3)="Fire_M4" FireAltAnims(0)="Fire_M4" FireAltAnims(1)="Fire_M4" FireAltAnims(2)="Fire_M4" FireAltAnims(3)="Fire_M4" FireCrouchAnims(0)="CHFire_M4" FireCrouchAnims(1)="CHFire_M4" FireCrouchAnims(2)="CHFire_M4" FireCrouchAnims(3)="CHFire_M4" FireCrouchAltAnims(0)="CHFire_M4" FireCrouchAltAnims(1)="CHFire_M4" FireCrouchAltAnims(2)="CHFire_M4" FireCrouchAltAnims(3)="CHFire_M4" HitAnims(0)="HitF_M4" HitAnims(1)="HitB_M4" HitAnims(2)="HitL_M4" HitAnims(3)="HitR_M4" PostFireBlendStandAnim="Blend_M4" PostFireBlendCrouchAnim="CHBlend_M4" MeshRef="KF_Weapons3rd3_Trip.M4_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceM4Attachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + ShellEjectBoneName="Shell_eject" + MovementAnims(0)="JogF_M4" + MovementAnims(1)="JogB_M4" + MovementAnims(2)="JogL_M4" + MovementAnims(3)="JogR_M4" + TurnLeftAnim="TurnL_M4" + TurnRightAnim="TurnR_M4" + CrouchAnims(0)="CHWalkF_M4" + CrouchAnims(1)="CHWalkB_M4" + CrouchAnims(2)="CHWalkL_M4" + CrouchAnims(3)="CHWalkR_M4" + WalkAnims(0)="WalkF_M4" + WalkAnims(1)="WalkB_M4" + WalkAnims(2)="WalkL_M4" + WalkAnims(3)="WalkR_M4" + CrouchTurnRightAnim="CH_TurnR_M4" + CrouchTurnLeftAnim="CH_TurnL_M4" + IdleCrouchAnim="CHIdle_M4" + IdleWeaponAnim="Idle_M4" + IdleRestAnim="Idle_M4" + IdleChatAnim="Idle_M4" + IdleHeavyAnim="Idle_M4" + IdleRifleAnim="Idle_M4" + FireAnims(0)="Fire_M4" + FireAnims(1)="Fire_M4" + FireAnims(2)="Fire_M4" + FireAnims(3)="Fire_M4" + FireAltAnims(0)="Fire_M4" + FireAltAnims(1)="Fire_M4" + FireAltAnims(2)="Fire_M4" + FireAltAnims(3)="Fire_M4" + FireCrouchAnims(0)="CHFire_M4" + FireCrouchAnims(1)="CHFire_M4" + FireCrouchAnims(2)="CHFire_M4" + FireCrouchAnims(3)="CHFire_M4" + FireCrouchAltAnims(0)="CHFire_M4" + FireCrouchAltAnims(1)="CHFire_M4" + FireCrouchAltAnims(2)="CHFire_M4" + FireCrouchAltAnims(3)="CHFire_M4" + HitAnims(0)="HitF_M4" + HitAnims(1)="HitB_M4" + HitAnims(2)="HitL_M4" + HitAnims(3)="HitR_M4" + PostFireBlendStandAnim="Blend_M4" + PostFireBlendCrouchAnim="CHBlend_M4" + MeshRef="KF_Weapons3rd3_Trip.M4_3rd" + WeaponAmbientScale=2.000000 + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Fire.uc b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Fire.uc index dd4cef4..14cd32d 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Fire.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Fire.uc @@ -1,4 +1,32 @@ -class NiceM4Fire extends NiceHighROFFire; -defaultproperties -{ FireEndSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop_End_M" FireEndStereoSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop_End_S" AmbientFireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop" zedTimeFireSpeedUp=2.500000 ProjectileSpeed=44000.000000 RecoilRate=0.065000 maxVerticalRecoilAngle=170 maxHorizontalRecoilAngle=85 ShellEjectClass=Class'ROEffects.KFShellEjectM4Rifle' ShellEjectBoneName="Shell_eject" FireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_M" StereoFireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_S" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeM4AssaultRifle' DamageMin=69 DamageMax=69 Momentum=8500.000000 FireRate=0.075000 AmmoClass=Class'NicePack.NiceM4Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 -} +class NiceM4Fire extends NiceHighROFFire; +defaultproperties +{ + FireEndSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop_End_M" + FireEndStereoSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop_End_S" + AmbientFireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop" + zedTimeFireSpeedUp=2.500000 + ProjectileSpeed=44000.000000 + RecoilRate=0.065000 + maxVerticalRecoilAngle=170 + maxHorizontalRecoilAngle=85 + ShellEjectClass=Class'ROEffects.KFShellEjectM4Rifle' + ShellEjectBoneName="Shell_eject" + FireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_M" + StereoFireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_S" + NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" + DamageType=Class'NicePack.NiceDamTypeM4AssaultRifle' + DamageMin=69 + DamageMax=69 + Momentum=8500.000000 + FireRate=0.075000 + AmmoClass=Class'NicePack.NiceM4Ammo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) + ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) + ShakeRotTime=0.750000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.250000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Pickup.uc b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Pickup.uc index 50bbe03..f8b8782 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Pickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4/NiceM4Pickup.uc @@ -1,4 +1,25 @@ -class NiceM4Pickup extends NiceWeaponPickup; -defaultproperties -{ Weight=5.000000 cost=500 BuyClipSize=30 PowerValue=30 SpeedValue=90 RangeValue=60 Description="A compact assault rifle. Can be fired in semi or full auto with good damage and good accuracy." ItemName="M4" ItemShortName="M4" AmmoItemName="5.56mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=2 VariantClasses(0)=Class'KFMod.CamoM4Pickup' InventoryType=Class'NicePack.NiceM4AssaultRifle' PickupMessage="You got the M4" PickupSound=Sound'KF_M4RifleSnd.foley.WEP_M4_Foley_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups3_Trip.Rifles.M4_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceM4Pickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=5.000000 + cost=500 + BuyClipSize=30 + PowerValue=30 + SpeedValue=90 + RangeValue=60 + Description="A compact assault rifle. Can be fired in semi or full auto with good damage and good accuracy." + ItemName="M4" + ItemShortName="M4" + AmmoItemName="5.56mm Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=3 + EquipmentCategoryID=2 + VariantClasses(0)=Class'KFMod.CamoM4Pickup' + InventoryType=Class'NicePack.NiceM4AssaultRifle' + PickupMessage="You got the M4" + PickupSound=Sound'KF_M4RifleSnd.foley.WEP_M4_Foley_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups3_Trip.Rifles.M4_Pickup' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceDamTypeM4M203AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceDamTypeM4M203AssaultRifle.uc index 7ba479d..db5fa94 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceDamTypeM4M203AssaultRifle.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceDamTypeM4M203AssaultRifle.uc @@ -1,5 +1,14 @@ -class NiceDamTypeM4M203AssaultRifle extends NiceDamageTypeVetCommando - abstract; -defaultproperties -{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceM4M203AssaultRifle' DeathString="%k killed %o (M4 M203)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=1500.000000 KDeathVel=110.000000 KDeathUpKick=2.000000 -} +class NiceDamTypeM4M203AssaultRifle extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ + HeadShotDamageMult=1.500000 + WeaponClass=Class'NicePack.NiceM4M203AssaultRifle' + DeathString="%k killed %o (M4 M203)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + KDamageImpulse=1500.000000 + KDeathVel=110.000000 + KDeathUpKick=2.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4203Pickup.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4203Pickup.uc index d5cc04f..4f613f5 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4203Pickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4203Pickup.uc @@ -1,4 +1,8 @@ -class NiceM4203Pickup extends ScrnM4203Pickup; -defaultproperties -{ ItemName="M4 203 NW" ItemShortName="M4 203 N W" PrimaryWeaponPickup=Class'NicePack.NiceM4Pickup' InventoryType=Class'NicePack.NiceM4203AssaultRifle' -} +class NiceM4203Pickup extends ScrnM4203Pickup; +defaultproperties +{ + ItemName="M4 203 NW" + ItemShortName="M4 203 N W" + PrimaryWeaponPickup=Class'NicePack.NiceM4Pickup' + InventoryType=Class'NicePack.NiceM4203AssaultRifle' +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Ammo.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Ammo.uc index a222cfd..8f8d87a 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Ammo.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Ammo.uc @@ -1,5 +1,13 @@ -class NiceM4M203Ammo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceM4Pickup' AmmoPickupAmount=30 MaxAmmo=360 InitialAmount=90 PickupClass=Class'NicePack.NiceM4M203AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="M4 bullets" -} +class NiceM4M203Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceM4Pickup' + AmmoPickupAmount=30 + MaxAmmo=360 + InitialAmount=90 + PickupClass=Class'NicePack.NiceM4M203AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="M4 bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203AmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203AmmoPickup.uc index 374c793..f19bd09 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203AmmoPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203AmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceM4M203AmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=30 InventoryType=Class'NicePack.NiceM4M203Ammo' PickupMessage="Rounds 5.56mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceM4M203AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=30 + InventoryType=Class'NicePack.NiceM4M203Ammo' + PickupMessage="Rounds 5.56mm" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203AssaultRifle.uc index fbfa2eb..0b95e15 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203AssaultRifle.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203AssaultRifle.uc @@ -1,20 +1,71 @@ -class NiceM4M203AssaultRifle extends NiceAssaultRifle; -#exec OBJ LOAD FILE=KillingFloorWeapons.utx -#exec OBJ LOAD FILE=KillingFloorHUD.utx -#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax -simulated function PostBeginPlay(){ - local AutoReloadAnimDesc reloadDesc; - autoReloadsDescriptions.Length = 0; - reloadDesc.canInterruptFrame = 0.217; - reloadDesc.trashStartFrame = 0.679; - reloadDesc.resumeFrame = 0.32; - reloadDesc.speedFrame = 0.019; - reloadDesc.animName = 'Fire_Secondary'; - autoReloadsDescriptions[0] = reloadDesc; - reloadDesc.animName = 'Fire_Iron_Secondary'; - autoReloadsDescriptions[1] = reloadDesc; - super.PostBeginPlay(); -} -defaultproperties -{ bSemiAutoFireEnabled=False reloadPreEndFrame=0.148000 reloadEndFrame=0.546000 reloadChargeEndFrame=0.778000 reloadMagStartFrame=0.306000 reloadChargeStartFrame=0.694000 autoReloadSpeedModifier=1.500000 ForceZoomOutOnAltFireTime=0.400000 MagCapacity=30 ReloadRate=3.633300 bHasSecondaryAmmo=True bReduceMagAmmoOnSecondaryFire=False ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_M4203" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M4_203' bIsTier2Weapon=True bIsTier3Weapon=True MeshRef="KF_Wep_M4M203.M4M203_Trip" SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.m4_cmb" SelectSoundRef="KF_M4RifleSnd.WEP_M4_Foley_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.M4_203_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M4_203" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceM4M203Fire' FireModeClass(1)=Class'NicePack.NiceM4M203NadeFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="An assault rifle with an attached grenade launcher." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=190 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=8 PickupClass=Class'NicePack.NiceM4M203Pickup' PlayerViewOffset=(X=25.000000,Y=18.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceM4M203Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="M4 203" TransientSoundVolume=1.250000 -} +class NiceM4M203AssaultRifle extends NiceAssaultRifle; +#exec OBJ LOAD FILE=KillingFloorWeapons.utx +#exec OBJ LOAD FILE=KillingFloorHUD.utx +#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax +simulated function PostBeginPlay(){ + local AutoReloadAnimDesc reloadDesc; + autoReloadsDescriptions.Length = 0; + reloadDesc.canInterruptFrame = 0.217; + reloadDesc.trashStartFrame = 0.679; + reloadDesc.resumeFrame = 0.32; + reloadDesc.speedFrame = 0.019; + reloadDesc.animName = 'Fire_Secondary'; + autoReloadsDescriptions[0] = reloadDesc; + reloadDesc.animName = 'Fire_Iron_Secondary'; + autoReloadsDescriptions[1] = reloadDesc; + super.PostBeginPlay(); +} +defaultproperties +{ + bSemiAutoFireEnabled=False + reloadPreEndFrame=0.148000 + reloadEndFrame=0.546000 + reloadChargeEndFrame=0.778000 + reloadMagStartFrame=0.306000 + reloadChargeStartFrame=0.694000 + autoReloadSpeedModifier=1.500000 + ForceZoomOutOnAltFireTime=0.400000 + MagCapacity=30 + ReloadRate=3.633300 + bHasSecondaryAmmo=True + bReduceMagAmmoOnSecondaryFire=False + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_M4203" + Weight=6.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=60.000000 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M4_203' + bIsTier2Weapon=True + bIsTier3Weapon=True + MeshRef="KF_Wep_M4M203.M4M203_Trip" + SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.m4_cmb" + SelectSoundRef="KF_M4RifleSnd.WEP_M4_Foley_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.M4_203_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M4_203" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=45.000000 + FireModeClass(0)=Class'NicePack.NiceM4M203Fire' + FireModeClass(1)=Class'NicePack.NiceM4M203NadeFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="An assault rifle with an attached grenade launcher." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=60.000000 + Priority=190 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=3 + GroupOffset=8 + PickupClass=Class'NicePack.NiceM4M203Pickup' + PlayerViewOffset=(X=25.000000,Y=18.000000,Z=-6.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceM4M203Attachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="M4 203" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Attachment.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Attachment.uc index f8b5e97..79ecdb9 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Attachment.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Attachment.uc @@ -1,4 +1,58 @@ -class NiceM4M203Attachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_M4203" MovementAnims(1)="JogB_M4203" MovementAnims(2)="JogL_M4203" MovementAnims(3)="JogR_M4203" TurnLeftAnim="TurnL_M4203" TurnRightAnim="TurnR_M4203" CrouchAnims(0)="CHWalkF_M4203" CrouchAnims(1)="CHWalkB_M4203" CrouchAnims(2)="CHWalkL_M4203" CrouchAnims(3)="CHWalkR_M4203" WalkAnims(0)="WalkF_M4203" WalkAnims(1)="WalkB_M4203" WalkAnims(2)="WalkL_M4203" WalkAnims(3)="WalkR_M4203" CrouchTurnRightAnim="CH_TurnR_M4203" CrouchTurnLeftAnim="CH_TurnL_M4203" IdleCrouchAnim="CHIdle_M4203" IdleWeaponAnim="Idle_M4203" IdleRestAnim="Idle_M4203" IdleChatAnim="Idle_M4203" IdleHeavyAnim="Idle_M4203" IdleRifleAnim="Idle_M4203" FireAnims(0)="Fire_M4203" FireAnims(1)="Fire_M4203" FireAnims(2)="Fire_M4203" FireAnims(3)="Fire_M4203" FireAltAnims(0)="Reload_Secondary_M4203" FireAltAnims(1)="Reload_Secondary_M4203" FireAltAnims(2)="Reload_Secondary_M4203" FireAltAnims(3)="Reload_Secondary_M4203" FireCrouchAnims(0)="CHFire_M4203" FireCrouchAnims(1)="CHFire_M4203" FireCrouchAnims(2)="CHFire_M4203" FireCrouchAnims(3)="CHFire_M4203" FireCrouchAltAnims(0)="Reload_Secondary_M4203" FireCrouchAltAnims(1)="Reload_Secondary_M4203" FireCrouchAltAnims(2)="Reload_Secondary_M4203" FireCrouchAltAnims(3)="Reload_Secondary_M4203" HitAnims(0)="HitF_M4203" HitAnims(1)="HitB_M4203" HitAnims(2)="HitL_M4203" HitAnims(3)="HitR_M4203" PostFireBlendStandAnim="Blend_M4203" PostFireBlendCrouchAnim="CHBlend_M4203" MeshRef="KF_Weapons3rd3_Trip.M4M203_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceM4M203Attachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + ShellEjectBoneName="Shell_eject" + MovementAnims(0)="JogF_M4203" + MovementAnims(1)="JogB_M4203" + MovementAnims(2)="JogL_M4203" + MovementAnims(3)="JogR_M4203" + TurnLeftAnim="TurnL_M4203" + TurnRightAnim="TurnR_M4203" + CrouchAnims(0)="CHWalkF_M4203" + CrouchAnims(1)="CHWalkB_M4203" + CrouchAnims(2)="CHWalkL_M4203" + CrouchAnims(3)="CHWalkR_M4203" + WalkAnims(0)="WalkF_M4203" + WalkAnims(1)="WalkB_M4203" + WalkAnims(2)="WalkL_M4203" + WalkAnims(3)="WalkR_M4203" + CrouchTurnRightAnim="CH_TurnR_M4203" + CrouchTurnLeftAnim="CH_TurnL_M4203" + IdleCrouchAnim="CHIdle_M4203" + IdleWeaponAnim="Idle_M4203" + IdleRestAnim="Idle_M4203" + IdleChatAnim="Idle_M4203" + IdleHeavyAnim="Idle_M4203" + IdleRifleAnim="Idle_M4203" + FireAnims(0)="Fire_M4203" + FireAnims(1)="Fire_M4203" + FireAnims(2)="Fire_M4203" + FireAnims(3)="Fire_M4203" + FireAltAnims(0)="Reload_Secondary_M4203" + FireAltAnims(1)="Reload_Secondary_M4203" + FireAltAnims(2)="Reload_Secondary_M4203" + FireAltAnims(3)="Reload_Secondary_M4203" + FireCrouchAnims(0)="CHFire_M4203" + FireCrouchAnims(1)="CHFire_M4203" + FireCrouchAnims(2)="CHFire_M4203" + FireCrouchAnims(3)="CHFire_M4203" + FireCrouchAltAnims(0)="Reload_Secondary_M4203" + FireCrouchAltAnims(1)="Reload_Secondary_M4203" + FireCrouchAltAnims(2)="Reload_Secondary_M4203" + FireCrouchAltAnims(3)="Reload_Secondary_M4203" + HitAnims(0)="HitF_M4203" + HitAnims(1)="HitB_M4203" + HitAnims(2)="HitL_M4203" + HitAnims(3)="HitR_M4203" + PostFireBlendStandAnim="Blend_M4203" + PostFireBlendCrouchAnim="CHBlend_M4203" + MeshRef="KF_Weapons3rd3_Trip.M4M203_3rd" + WeaponAmbientScale=2.000000 + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Fire.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Fire.uc index 830c88f..91789ea 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Fire.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Fire.uc @@ -1,4 +1,31 @@ -class NiceM4M203Fire extends NiceHighROFFire; -defaultproperties -{ FireEndSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop_End_M" FireEndStereoSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop_End_S" AmbientFireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop" ProjectileSpeed=44000.000000 RecoilRate=0.065000 maxVerticalRecoilAngle=170 maxHorizontalRecoilAngle=85 ShellEjectClass=Class'ROEffects.KFShellEjectM4Rifle' ShellEjectBoneName="Shell_eject" FireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_M" StereoFireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_S" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeM4AssaultRifle' DamageMin=69 DamageMax=69 Momentum=8500.000000 FireRate=0.075000 AmmoClass=Class'NicePack.NiceM4M203Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 -} +class NiceM4M203Fire extends NiceHighROFFire; +defaultproperties +{ + FireEndSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop_End_M" + FireEndStereoSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop_End_S" + AmbientFireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Loop" + ProjectileSpeed=44000.000000 + RecoilRate=0.065000 + maxVerticalRecoilAngle=170 + maxHorizontalRecoilAngle=85 + ShellEjectClass=Class'ROEffects.KFShellEjectM4Rifle' + ShellEjectBoneName="Shell_eject" + FireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_M" + StereoFireSoundRef="KF_M4RifleSnd.M4Rifle_Fire_Single_S" + NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" + DamageType=Class'NicePack.NiceDamTypeM4AssaultRifle' + DamageMin=69 + DamageMax=69 + Momentum=8500.000000 + FireRate=0.075000 + AmmoClass=Class'NicePack.NiceM4M203Ammo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) + ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) + ShakeRotTime=0.750000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.250000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203NadeAmmo.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203NadeAmmo.uc index 7786a27..5a8bc4b 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203NadeAmmo.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203NadeAmmo.uc @@ -1,4 +1,12 @@ -class NiceM4M203NadeAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceM4M203Pickup' AmmoPickupAmount=2 MaxAmmo=12 InitialAmount=6 PickupClass=Class'NicePack.NiceM4M203AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=4,Y1=350,X2=110,Y2=395) ItemName="M203 Grenades" -} +class NiceM4M203NadeAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceM4M203Pickup' + AmmoPickupAmount=2 + MaxAmmo=12 + InitialAmount=6 + PickupClass=Class'NicePack.NiceM4M203AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=4,Y1=350,X2=110,Y2=395) + ItemName="M203 Grenades" +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203NadeAmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203NadeAmmoPickup.uc index ccfff90..5d26989 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203NadeAmmoPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203NadeAmmoPickup.uc @@ -1,4 +1,7 @@ -class NiceM4M203NadeAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=2 InventoryType=Class'NicePack.NiceM4M203NadeAmmo' PickupMessage="M203 Grenades" -} +class NiceM4M203NadeAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=2 + InventoryType=Class'NicePack.NiceM4M203NadeAmmo' + PickupMessage="M203 Grenades" +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Pickup.uc b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Pickup.uc index 939923e..d3f4345 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Pickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203/NiceM4M203Pickup.uc @@ -1,4 +1,28 @@ -class NiceM4M203Pickup extends NiceWeaponPickup; -defaultproperties -{ crossPerkIndecies(0)=3 Weight=6.000000 cost=750 AmmoCost=40 BuyClipSize=1 PowerValue=30 SpeedValue=90 RangeValue=60 Description="An assault rifle with an attached grenade launcher." ItemName="M4 203" ItemShortName="M4 203" AmmoItemName="5.56mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' SecondaryAmmoShortName="M4 203 Grenades" PrimaryWeaponPickup=Class'NicePack.NiceM4Pickup' CorrespondingPerkIndex=6 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceM4M203AssaultRifle' PickupMessage="You got the M4 203" PickupSound=Sound'KF_M4RifleSnd.foley.WEP_M4_Foley_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups3_Trip.Rifles.M4M203_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceM4M203Pickup extends NiceWeaponPickup; +defaultproperties +{ + crossPerkIndecies(0)=3 + Weight=6.000000 + cost=750 + AmmoCost=40 + BuyClipSize=1 + PowerValue=30 + SpeedValue=90 + RangeValue=60 + Description="An assault rifle with an attached grenade launcher." + ItemName="M4 203" + ItemShortName="M4 203" + AmmoItemName="5.56mm Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + SecondaryAmmoShortName="M4 203 Grenades" + PrimaryWeaponPickup=Class'NicePack.NiceM4Pickup' + CorrespondingPerkIndex=6 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceM4M203AssaultRifle' + PickupMessage="You got the M4 203" + PickupSound=Sound'KF_M4RifleSnd.foley.WEP_M4_Foley_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups3_Trip.Rifles.M4M203_Pickup' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203Fire.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203Fire.uc index 9b063b4..6c5a22c 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203Fire.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203Fire.uc @@ -1,4 +1,5 @@ -class NiceM203Fire extends ScrnM203Fire; -defaultproperties -{ ProjectileClass=Class'NicePack.NiceM203GrenadeProjectile' -} +class NiceM203Fire extends ScrnM203Fire; +defaultproperties +{ + ProjectileClass=Class'NicePack.NiceM203GrenadeProjectile' +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MAmmo.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MAmmo.uc index dfd042b..714cecf 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MAmmo.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MAmmo.uc @@ -1,4 +1,5 @@ -class NiceM203MAmmo extends ScrnM203MAmmo; -defaultproperties -{ PickupClass=Class'NicePack.NiceM203MAmmoPickup' -} +class NiceM203MAmmo extends ScrnM203MAmmo; +defaultproperties +{ + PickupClass=Class'NicePack.NiceM203MAmmoPickup' +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MAmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MAmmoPickup.uc index e433e85..7bb8f27 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MAmmoPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MAmmoPickup.uc @@ -1,4 +1,5 @@ -class NiceM203MAmmoPickup extends ScrnM203MAmmoPickup; -defaultproperties -{ InventoryType=Class'NicePack.NiceM203MAmmo' -} +class NiceM203MAmmoPickup extends ScrnM203MAmmoPickup; +defaultproperties +{ + InventoryType=Class'NicePack.NiceM203MAmmo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MFire.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MFire.uc index aeebb42..ecb7e3d 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MFire.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MFire.uc @@ -1,4 +1,6 @@ -class NiceM203MFire extends NiceM203Fire; -defaultproperties -{ AmmoClass=Class'NicePack.NiceM203MAmmo' ProjectileClass=Class'NicePack.NiceM203MGrenadeProjectile' -} +class NiceM203MFire extends NiceM203Fire; +defaultproperties +{ + AmmoClass=Class'NicePack.NiceM203MAmmo' + ProjectileClass=Class'NicePack.NiceM203MGrenadeProjectile' +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MGrenadeProjectile.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MGrenadeProjectile.uc index 622b3bb..6b8aa8e 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MGrenadeProjectile.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM203MGrenadeProjectile.uc @@ -1,9 +1,10 @@ -class NiceM203MGrenadeProjectile extends ScrnM79MGrenadeProjectile; - -function SuccessfulHealMessage() -{ - if ( ScrnM4203MMedicGun(InstigatorWeapon) != none ) ScrnM4203MMedicGun(InstigatorWeapon).ClientSuccessfulHeal(HealedPlayers.length, HealedHP); -} -defaultproperties -{ -} +class NiceM203MGrenadeProjectile extends ScrnM79MGrenadeProjectile; + +function SuccessfulHealMessage() +{ + if ( ScrnM4203MMedicGun(InstigatorWeapon) != none ) + ScrnM4203MMedicGun(InstigatorWeapon).ClientSuccessfulHeal(HealedPlayers.length, HealedHP); +} +defaultproperties +{ +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203AssaultRifle.uc index 6aaa398..477991f 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203AssaultRifle.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203AssaultRifle.uc @@ -1,5 +1,9 @@ -class NiceM4203AssaultRifle extends ScrnM4203AssaultRifle - config(user); -defaultproperties -{ FireModeClass(0)=Class'NicePack.NiceM4203BulletFire' FireModeClass(1)=Class'NicePack.NiceM203Fire' PickupClass=Class'NicePack.NiceM4203Pickup' ItemName="M4 203 NW" -} +class NiceM4203AssaultRifle extends ScrnM4203AssaultRifle + config(user); +defaultproperties +{ + FireModeClass(0)=Class'NicePack.NiceM4203BulletFire' + FireModeClass(1)=Class'NicePack.NiceM203Fire' + PickupClass=Class'NicePack.NiceM4203Pickup' + ItemName="M4 203 NW" +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203BulletFire.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203BulletFire.uc index 5316092..2541f42 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203BulletFire.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203BulletFire.uc @@ -1,4 +1,10 @@ -class NiceM4203BulletFire extends ScrnM4203BulletFire; -defaultproperties -{ maxVerticalRecoilAngle=170 maxHorizontalRecoilAngle=85 DamageType=Class'NicePack.NiceDamTypeM4AssaultRifle' DamageMin=46 DamageMax=46 FireRate=0.075000 -} +class NiceM4203BulletFire extends ScrnM4203BulletFire; +defaultproperties +{ + maxVerticalRecoilAngle=170 + maxHorizontalRecoilAngle=85 + DamageType=Class'NicePack.NiceDamTypeM4AssaultRifle' + DamageMin=46 + DamageMax=46 + FireRate=0.075000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203MMedicGun.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203MMedicGun.uc index 0e81bfa..d41f3ee 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203MMedicGun.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203MMedicGun.uc @@ -1,30 +1,56 @@ -class NiceM4203MMedicGun extends NiceM4203AssaultRifle - config(user); -var localized string SuccessfulHealMessage; -var ScrnFakedHealingGrenade FakedNade; -replication -{ reliable if( Role == ROLE_Authority ) ClientSuccessfulHeal; -} -simulated function PostBeginPlay() -{ - super.PostBeginPlay(); - if ( Level.NetMode != NM_DedicatedServer ) { SetBoneScale (58, 0.0, 'M203_EmptyShell'); - FakedNade = spawn(class'ScrnFakedHealingGrenade',self); if ( FakedNade != none ) { //FakedNade.SetDrawScale(4.0); SetBoneRotation('M203_Round', rot(0, 6000, 0)); // bone must have a size to properly adjust rotation SetBoneScale (59, 0.0001, 'M203_Round'); AttachToBone(FakedNade, 'M203_Round'); } - } -} - -simulated function Destroyed() -{ - if ( FakedNade != none ) FakedNade.Destroy(); - super.Destroyed(); -} -// The server lets the client know they successfully healed someone -simulated function ClientSuccessfulHeal(int HealedPlayerCount, int HealedAmount) -{ - local string str; - if( PlayerController(Instigator.Controller) != none ) { str = SuccessfulHealMessage; ReplaceText(str, "%c", String(HealedPlayerCount)); ReplaceText(str, "%a", String(HealedAmount)); PlayerController(Instigator.controller).ClientMessage(str, 'CriticalEvent'); - } -} -defaultproperties -{ SuccessfulHealMessage="You healed %c player(-s) with %ahp" bIsTier2Weapon=False SkinRefs(0)="ScrnTex.Weapons.M4203M" FireModeClass(0)=Class'NicePack.NiceM4203MBulletFire' FireModeClass(1)=Class'NicePack.NiceM203MFire' Description="An assault rifle with an attached healing grenade launcher. Shoots in 3-bullet fixed-burst mode." Priority=70 InventoryGroup=4 PickupClass=Class'NicePack.NiceM4203MPickup' ItemName="M4-203M Medic Rifle NW" -} +class NiceM4203MMedicGun extends NiceM4203AssaultRifle + config(user); +var localized string SuccessfulHealMessage; +var ScrnFakedHealingGrenade FakedNade; +replication +{ + reliable if( Role == ROLE_Authority ) + ClientSuccessfulHeal; +} +simulated function PostBeginPlay() +{ + super.PostBeginPlay(); + if ( Level.NetMode != NM_DedicatedServer ) { + SetBoneScale (58, 0.0, 'M203_EmptyShell'); + + FakedNade = spawn(class'ScrnFakedHealingGrenade',self); + if ( FakedNade != none ) { + //FakedNade.SetDrawScale(4.0); + SetBoneRotation('M203_Round', rot(0, 6000, 0)); + // bone must have a size to properly adjust rotation + SetBoneScale (59, 0.0001, 'M203_Round'); + AttachToBone(FakedNade, 'M203_Round'); + } + } +} + +simulated function Destroyed() +{ + if ( FakedNade != none ) + FakedNade.Destroy(); + super.Destroyed(); +} +// The server lets the client know they successfully healed someone +simulated function ClientSuccessfulHeal(int HealedPlayerCount, int HealedAmount) +{ + local string str; + if( PlayerController(Instigator.Controller) != none ) { + str = SuccessfulHealMessage; + ReplaceText(str, "%c", String(HealedPlayerCount)); + ReplaceText(str, "%a", String(HealedAmount)); + PlayerController(Instigator.controller).ClientMessage(str, 'CriticalEvent'); + } +} +defaultproperties +{ + SuccessfulHealMessage="You healed %c player(-s) with %ahp" + bIsTier2Weapon=False + SkinRefs(0)="ScrnTex.Weapons.M4203M" + FireModeClass(0)=Class'NicePack.NiceM4203MBulletFire' + FireModeClass(1)=Class'NicePack.NiceM203MFire' + Description="An assault rifle with an attached healing grenade launcher. Shoots in 3-bullet fixed-burst mode." + Priority=70 + InventoryGroup=4 + PickupClass=Class'NicePack.NiceM4203MPickup' + ItemName="M4-203M Medic Rifle NW" +} diff --git a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203MPickup.uc b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203MPickup.uc index c7d86be..f1f35de 100644 --- a/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203MPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/M4M203M/NiceM4203MPickup.uc @@ -1,4 +1,13 @@ -class NiceM4203MPickup extends NiceM4203Pickup; -defaultproperties -{ cost=1250 AmmoCost=40 PowerValue=30 Description="An assault rifle with an attached healing grenade launcher. Shoots in 3-bullet fixed-burst mode." ItemName="M4-203M Medic Rifle NW" ItemShortName="M4-203M NW" CorrespondingPerkIndex=0 InventoryType=Class'NicePack.NiceM4203MMedicGun' PickupMessage="You got the M4-203M Medic Rifle NW" -} +class NiceM4203MPickup extends NiceM4203Pickup; +defaultproperties +{ + cost=1250 + AmmoCost=40 + PowerValue=30 + Description="An assault rifle with an attached healing grenade launcher. Shoots in 3-bullet fixed-burst mode." + ItemName="M4-203M Medic Rifle NW" + ItemShortName="M4-203M NW" + CorrespondingPerkIndex=0 + InventoryType=Class'NicePack.NiceM4203MMedicGun' + PickupMessage="You got the M4-203M Medic Rifle NW" +} diff --git a/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Ammo.uc b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Ammo.uc index 722fe95..0de04bb 100644 --- a/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Ammo.uc +++ b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Ammo.uc @@ -1,5 +1,13 @@ -class NiceMKb42Ammo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceMKb42Pickup' AmmoPickupAmount=30 MaxAmmo=240 InitialAmount=60 PickupClass=Class'NicePack.NiceMKb42AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="MKb42 bullets" -} +class NiceMKb42Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceMKb42Pickup' + AmmoPickupAmount=30 + MaxAmmo=240 + InitialAmount=60 + PickupClass=Class'NicePack.NiceMKb42AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="MKb42 bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42AmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42AmmoPickup.uc index 019e72b..c4bfa6d 100644 --- a/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42AmmoPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42AmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceMKb42AmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=30 InventoryType=Class'NicePack.NiceMKb42Ammo' PickupMessage="Rounds 7.92mm Kurz" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceMKb42AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=30 + InventoryType=Class'NicePack.NiceMKb42Ammo' + PickupMessage="Rounds 7.92mm Kurz" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42AssaultRifle.uc index a4f83df..ac2b1fd 100644 --- a/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42AssaultRifle.uc +++ b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42AssaultRifle.uc @@ -1,4 +1,51 @@ -class NiceMKb42AssaultRifle extends NiceAssaultRifle; -defaultproperties -{ bSemiAutoFireEnabled=False bBurstFireEnabled=True reloadPreEndFrame=0.110000 reloadEndFrame=0.510000 reloadChargeEndFrame=0.670000 reloadMagStartFrame=0.240000 reloadChargeStartFrame=0.560000 MagCapacity=30 ReloadRate=3.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_M4" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_MKB42' bIsTier2Weapon=True MeshRef="KF_Wep_MKB42.MKB42" SkinRefs(0)="KF_Weapons8_Trip_T.Weapons.MKB42_cmb" SelectSoundRef="KF_AK47Snd.AK47_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.MKB42_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.MKB42" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=35.000000 FireModeClass(0)=Class'NicePack.NiceMKb42Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="German WWII prototype assault rifle. Used by heroes from the Battle of Stalingrad to the present day!" EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=115 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=13 PickupClass=Class'NicePack.NiceMKb42Pickup' PlayerViewOffset=(X=20.000000,Y=18.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceMKb42Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="MKb42" TransientSoundVolume=1.250000 -} +class NiceMKb42AssaultRifle extends NiceAssaultRifle; +defaultproperties +{ + bSemiAutoFireEnabled=False + bBurstFireEnabled=True + reloadPreEndFrame=0.110000 + reloadEndFrame=0.510000 + reloadChargeEndFrame=0.670000 + reloadMagStartFrame=0.240000 + reloadChargeStartFrame=0.560000 + MagCapacity=30 + ReloadRate=3.000000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_M4" + Weight=6.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=60.000000 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_MKB42' + bIsTier2Weapon=True + MeshRef="KF_Wep_MKB42.MKB42" + SkinRefs(0)="KF_Weapons8_Trip_T.Weapons.MKB42_cmb" + SelectSoundRef="KF_AK47Snd.AK47_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.MKB42_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.MKB42" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=35.000000 + FireModeClass(0)=Class'NicePack.NiceMKb42Fire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="German WWII prototype assault rifle. Used by heroes from the Battle of Stalingrad to the present day!" + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=60.000000 + Priority=115 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=3 + GroupOffset=13 + PickupClass=Class'NicePack.NiceMKb42Pickup' + PlayerViewOffset=(X=20.000000,Y=18.000000,Z=-6.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceMKb42Attachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="MKb42" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Attachment.uc b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Attachment.uc index ad39ba8..0a6638e 100644 --- a/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Attachment.uc +++ b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Attachment.uc @@ -1,4 +1,56 @@ -class NiceMKb42Attachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_M4" MovementAnims(1)="JogB_M4" MovementAnims(2)="JogL_M4" MovementAnims(3)="JogR_M4" TurnLeftAnim="TurnL_M4" TurnRightAnim="TurnR_M4" CrouchAnims(0)="CHWalkF_M4" CrouchAnims(1)="CHWalkB_M4" CrouchAnims(2)="CHWalkL_M4" CrouchAnims(3)="CHWalkR_M4" WalkAnims(0)="WalkF_M4" WalkAnims(1)="WalkB_M4" WalkAnims(2)="WalkL_M4" WalkAnims(3)="WalkR_M4" CrouchTurnRightAnim="CH_TurnR_M4" CrouchTurnLeftAnim="CH_TurnL_M4" IdleCrouchAnim="CHIdle_M4" IdleWeaponAnim="Idle_M4" IdleRestAnim="Idle_M4" IdleChatAnim="Idle_M4" IdleHeavyAnim="Idle_M4" IdleRifleAnim="Idle_M4" FireAnims(0)="Fire_M4" FireAnims(1)="Fire_M4" FireAnims(2)="Fire_M4" FireAnims(3)="Fire_M4" FireAltAnims(0)="Fire_M4" FireAltAnims(1)="Fire_M4" FireAltAnims(2)="Fire_M4" FireAltAnims(3)="Fire_M4" FireCrouchAnims(0)="CHFire_M4" FireCrouchAnims(1)="CHFire_M4" FireCrouchAnims(2)="CHFire_M4" FireCrouchAnims(3)="CHFire_M4" FireCrouchAltAnims(0)="CHFire_M4" FireCrouchAltAnims(1)="CHFire_M4" FireCrouchAltAnims(2)="CHFire_M4" FireCrouchAltAnims(3)="CHFire_M4" HitAnims(0)="HitF_M4" HitAnims(1)="HitB_M4" HitAnims(2)="HitL_M4" HitAnims(3)="HitR_M4" PostFireBlendStandAnim="Blend_M4" PostFireBlendCrouchAnim="CHBlend_M4" MeshRef="KF_Weapons3rd5_Trip.MKB42_3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceMKb42Attachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + MovementAnims(0)="JogF_M4" + MovementAnims(1)="JogB_M4" + MovementAnims(2)="JogL_M4" + MovementAnims(3)="JogR_M4" + TurnLeftAnim="TurnL_M4" + TurnRightAnim="TurnR_M4" + CrouchAnims(0)="CHWalkF_M4" + CrouchAnims(1)="CHWalkB_M4" + CrouchAnims(2)="CHWalkL_M4" + CrouchAnims(3)="CHWalkR_M4" + WalkAnims(0)="WalkF_M4" + WalkAnims(1)="WalkB_M4" + WalkAnims(2)="WalkL_M4" + WalkAnims(3)="WalkR_M4" + CrouchTurnRightAnim="CH_TurnR_M4" + CrouchTurnLeftAnim="CH_TurnL_M4" + IdleCrouchAnim="CHIdle_M4" + IdleWeaponAnim="Idle_M4" + IdleRestAnim="Idle_M4" + IdleChatAnim="Idle_M4" + IdleHeavyAnim="Idle_M4" + IdleRifleAnim="Idle_M4" + FireAnims(0)="Fire_M4" + FireAnims(1)="Fire_M4" + FireAnims(2)="Fire_M4" + FireAnims(3)="Fire_M4" + FireAltAnims(0)="Fire_M4" + FireAltAnims(1)="Fire_M4" + FireAltAnims(2)="Fire_M4" + FireAltAnims(3)="Fire_M4" + FireCrouchAnims(0)="CHFire_M4" + FireCrouchAnims(1)="CHFire_M4" + FireCrouchAnims(2)="CHFire_M4" + FireCrouchAnims(3)="CHFire_M4" + FireCrouchAltAnims(0)="CHFire_M4" + FireCrouchAltAnims(1)="CHFire_M4" + FireCrouchAltAnims(2)="CHFire_M4" + FireCrouchAltAnims(3)="CHFire_M4" + HitAnims(0)="HitF_M4" + HitAnims(1)="HitB_M4" + HitAnims(2)="HitL_M4" + HitAnims(3)="HitR_M4" + PostFireBlendStandAnim="Blend_M4" + PostFireBlendCrouchAnim="CHBlend_M4" + MeshRef="KF_Weapons3rd5_Trip.MKB42_3rd" + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Pickup.uc b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Pickup.uc index da4260a..f9c505f 100644 --- a/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Pickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/MKb42/NiceMKb42Pickup.uc @@ -1,4 +1,25 @@ -class NiceMKb42Pickup extends NiceWeaponPickup; -defaultproperties -{ Weight=6.000000 cost=750 AmmoCost=30 BuyClipSize=30 PowerValue=40 SpeedValue=85 RangeValue=55 Description="German WWII era prototype assault rifle. Many heroes were known to have used this weapon in Stalingrad." ItemName="MKb42" ItemShortName="MKb42" AmmoItemName="7.92mm Kurz Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceMKb42AssaultRifle' PickupMessage="You got the MKb42" PickupSound=Sound'KF_mkb42Snd.Handling.mkb42_Handling_Bolt_Back' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups5_Trip.Rifles.MKB42_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceMKb42Pickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=6.000000 + cost=750 + AmmoCost=30 + BuyClipSize=30 + PowerValue=40 + SpeedValue=85 + RangeValue=55 + Description="German WWII era prototype assault rifle. Many heroes were known to have used this weapon in Stalingrad." + ItemName="MKb42" + ItemShortName="MKb42" + AmmoItemName="7.92mm Kurz Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=3 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceMKb42AssaultRifle' + PickupMessage="You got the MKb42" + PickupSound=Sound'KF_mkb42Snd.Handling.mkb42_Handling_Bolt_Back' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups5_Trip.Rifles.MKB42_Pickup' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Ammo.uc b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Ammo.uc index 4ca4914..a4e7863 100644 --- a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Ammo.uc +++ b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Ammo.uc @@ -1,5 +1,13 @@ -class NiceSCARMK17Ammo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceSCARMK17Pickup' AmmoPickupAmount=20 MaxAmmo=180 InitialAmount=45 PickupClass=Class'NicePack.NiceSCARMK17AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="SCARMK17 bullets" -} +class NiceSCARMK17Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceSCARMK17Pickup' + AmmoPickupAmount=20 + MaxAmmo=180 + InitialAmount=45 + PickupClass=Class'NicePack.NiceSCARMK17AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="SCARMK17 bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17AmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17AmmoPickup.uc index 442ccb7..a71bd9a 100644 --- a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17AmmoPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17AmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceSCARMK17AmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=20 InventoryType=Class'NicePack.NiceSCARMK17Ammo' PickupMessage="Rounds 7.62x51mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceSCARMK17AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=20 + InventoryType=Class'NicePack.NiceSCARMK17Ammo' + PickupMessage="Rounds 7.62x51mm" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17AssaultRifle.uc b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17AssaultRifle.uc index 750c84d..995af49 100644 --- a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17AssaultRifle.uc +++ b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17AssaultRifle.uc @@ -1,4 +1,37 @@ -class NiceSCARMK17AssaultRifle extends NiceAK47AssaultRifle; -defaultproperties -{ bSemiAutoFireEnabled=True bBurstFireEnabled=False reloadPreEndFrame=0.175000 reloadEndFrame=0.737500 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.300000 reloadChargeStartFrame=-1.000000 MagazineBone="Magazine" MagCapacity=20 ReloadRate=2.966000 WeaponReloadAnim="Reload_SCAR" Weight=8.000000 StandardDisplayFOV=55.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Scar' bIsTier3Weapon=True MeshRef="KF_Weapons2_Trip.SCAR_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.Rifle.Scar_cmb" SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" SelectSoundRef="KF_SCARSnd.SCAR_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.Scar_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Scar" ZoomedDisplayFOV=20.000000 FireModeClass(0)=Class'NicePack.NiceSCARMK17Fire' Description="An advanced tactical assault rifle. Equipped with an aimpoint sight. Fires in semi or full auto with great power and accuracy." DisplayFOV=55.000000 Priority=175 InventoryGroup=4 GroupOffset=4 PickupClass=Class'NicePack.NiceSCARMK17Pickup' PlayerViewOffset=(X=25.000000,Y=20.000000) AttachmentClass=Class'NicePack.NiceSCARMK17Attachment' ItemName="SCAR MK17" -} +class NiceSCARMK17AssaultRifle extends NiceAK47AssaultRifle; +defaultproperties +{ + bSemiAutoFireEnabled=True + bBurstFireEnabled=False + reloadPreEndFrame=0.175000 + reloadEndFrame=0.737500 + reloadChargeEndFrame=-1.000000 + reloadMagStartFrame=0.300000 + reloadChargeStartFrame=-1.000000 + MagazineBone="Magazine" + MagCapacity=20 + ReloadRate=2.966000 + WeaponReloadAnim="Reload_SCAR" + Weight=8.000000 + StandardDisplayFOV=55.000000 + SleeveNum=2 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Scar' + bIsTier3Weapon=True + MeshRef="KF_Weapons2_Trip.SCAR_Trip" + SkinRefs(0)="KF_Weapons2_Trip_T.Rifle.Scar_cmb" + SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" + SelectSoundRef="KF_SCARSnd.SCAR_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.Scar_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Scar" + ZoomedDisplayFOV=20.000000 + FireModeClass(0)=Class'NicePack.NiceSCARMK17Fire' + Description="An advanced tactical assault rifle. Equipped with an aimpoint sight. Fires in semi or full auto with great power and accuracy." + DisplayFOV=55.000000 + Priority=175 + InventoryGroup=4 + GroupOffset=4 + PickupClass=Class'NicePack.NiceSCARMK17Pickup' + PlayerViewOffset=(X=25.000000,Y=20.000000) + AttachmentClass=Class'NicePack.NiceSCARMK17Attachment' + ItemName="SCAR MK17" +} diff --git a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Attachment.uc b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Attachment.uc index 3a497d6..cb33f79 100644 --- a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Attachment.uc +++ b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Attachment.uc @@ -1,4 +1,56 @@ -class NiceSCARMK17Attachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_SCAR" MovementAnims(1)="JogB_SCAR" MovementAnims(2)="JogL_SCAR" MovementAnims(3)="JogR_SCAR" TurnLeftAnim="TurnL_SCAR" TurnRightAnim="TurnR_SCAR" CrouchAnims(0)="CHWalkF_SCAR" CrouchAnims(1)="CHWalkB_SCAR" CrouchAnims(2)="CHWalkL_SCAR" CrouchAnims(3)="CHWalkR_SCAR" WalkAnims(0)="WalkF_SCAR" WalkAnims(1)="WalkB_SCAR" WalkAnims(2)="WalkL_SCAR" WalkAnims(3)="WalkR_SCAR" CrouchTurnRightAnim="CH_TurnR_SCAR" CrouchTurnLeftAnim="CH_TurnL_SCAR" IdleCrouchAnim="CHIdle_SCAR" IdleWeaponAnim="Idle_SCAR" IdleRestAnim="Idle_SCAR" IdleChatAnim="Idle_SCAR" IdleHeavyAnim="Idle_SCAR" IdleRifleAnim="Idle_SCAR" FireAnims(0)="Fire_SCAR" FireAnims(1)="Fire_SCAR" FireAnims(2)="Fire_SCAR" FireAnims(3)="Fire_SCAR" FireAltAnims(0)="Fire_SCAR" FireAltAnims(1)="Fire_SCAR" FireAltAnims(2)="Fire_SCAR" FireAltAnims(3)="Fire_SCAR" FireCrouchAnims(0)="CHFire_SCAR" FireCrouchAnims(1)="CHFire_SCAR" FireCrouchAnims(2)="CHFire_SCAR" FireCrouchAnims(3)="CHFire_SCAR" FireCrouchAltAnims(0)="CHFire_SCAR" FireCrouchAltAnims(1)="CHFire_SCAR" FireCrouchAltAnims(2)="CHFire_SCAR" FireCrouchAltAnims(3)="CHFire_SCAR" HitAnims(0)="HitF_SCAR" HitAnims(1)="HitB_SCAR" HitAnims(2)="HitL_SCAR" HitAnims(3)="HitR_SCAR" PostFireBlendStandAnim="Blend_SCAR" PostFireBlendCrouchAnim="CHBlend_SCAR" MeshRef="KF_Weapons3rd2_Trip.scar_3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceSCARMK17Attachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + MovementAnims(0)="JogF_SCAR" + MovementAnims(1)="JogB_SCAR" + MovementAnims(2)="JogL_SCAR" + MovementAnims(3)="JogR_SCAR" + TurnLeftAnim="TurnL_SCAR" + TurnRightAnim="TurnR_SCAR" + CrouchAnims(0)="CHWalkF_SCAR" + CrouchAnims(1)="CHWalkB_SCAR" + CrouchAnims(2)="CHWalkL_SCAR" + CrouchAnims(3)="CHWalkR_SCAR" + WalkAnims(0)="WalkF_SCAR" + WalkAnims(1)="WalkB_SCAR" + WalkAnims(2)="WalkL_SCAR" + WalkAnims(3)="WalkR_SCAR" + CrouchTurnRightAnim="CH_TurnR_SCAR" + CrouchTurnLeftAnim="CH_TurnL_SCAR" + IdleCrouchAnim="CHIdle_SCAR" + IdleWeaponAnim="Idle_SCAR" + IdleRestAnim="Idle_SCAR" + IdleChatAnim="Idle_SCAR" + IdleHeavyAnim="Idle_SCAR" + IdleRifleAnim="Idle_SCAR" + FireAnims(0)="Fire_SCAR" + FireAnims(1)="Fire_SCAR" + FireAnims(2)="Fire_SCAR" + FireAnims(3)="Fire_SCAR" + FireAltAnims(0)="Fire_SCAR" + FireAltAnims(1)="Fire_SCAR" + FireAltAnims(2)="Fire_SCAR" + FireAltAnims(3)="Fire_SCAR" + FireCrouchAnims(0)="CHFire_SCAR" + FireCrouchAnims(1)="CHFire_SCAR" + FireCrouchAnims(2)="CHFire_SCAR" + FireCrouchAnims(3)="CHFire_SCAR" + FireCrouchAltAnims(0)="CHFire_SCAR" + FireCrouchAltAnims(1)="CHFire_SCAR" + FireCrouchAltAnims(2)="CHFire_SCAR" + FireCrouchAltAnims(3)="CHFire_SCAR" + HitAnims(0)="HitF_SCAR" + HitAnims(1)="HitB_SCAR" + HitAnims(2)="HitL_SCAR" + HitAnims(3)="HitR_SCAR" + PostFireBlendStandAnim="Blend_SCAR" + PostFireBlendCrouchAnim="CHBlend_SCAR" + MeshRef="KF_Weapons3rd2_Trip.scar_3rd" + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Fire.uc b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Fire.uc index c5c1a8e..4d6d43b 100644 --- a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Fire.uc +++ b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Fire.uc @@ -1,4 +1,36 @@ -class NiceSCARMK17Fire extends NiceFire; -defaultproperties -{ zedTimeFireSpeedUp=2.500000 ProjectileSpeed=43500.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.070000 maxVerticalRecoilAngle=280 maxHorizontalRecoilAngle=140 ShellEjectClass=Class'ROEffects.KFShellEjectSCAR' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True FireSoundRef="KF_SCARSnd.SCAR_Fire" StereoFireSoundRef="KF_SCARSnd.SCAR_FireST" NoAmmoSoundRef="KF_SCARSnd.SCAR_DryFire" DamageType=Class'NicePack.NiceDamTypeSCARMK17AssaultRifle' DamageMin=74 DamageMax=74 Momentum=8500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.096000 AmmoClass=Class'NicePack.NiceSCARMK17Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=300.000000) ShakeRotRate=(X=7500.000000,Y=7500.000000,Z=7500.000000) ShakeRotTime=0.650000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.150000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 -} +class NiceSCARMK17Fire extends NiceFire; +defaultproperties +{ + zedTimeFireSpeedUp=2.500000 + ProjectileSpeed=43500.000000 + FireAimedAnim="Fire_Iron" + RecoilRate=0.070000 + maxVerticalRecoilAngle=280 + maxHorizontalRecoilAngle=140 + ShellEjectClass=Class'ROEffects.KFShellEjectSCAR' + ShellEjectBoneName="Shell_eject" + bAccuracyBonusForSemiAuto=True + FireSoundRef="KF_SCARSnd.SCAR_Fire" + StereoFireSoundRef="KF_SCARSnd.SCAR_FireST" + NoAmmoSoundRef="KF_SCARSnd.SCAR_DryFire" + DamageType=Class'NicePack.NiceDamTypeSCARMK17AssaultRifle' + DamageMin=74 + DamageMax=74 + Momentum=8500.000000 + bPawnRapidFireAnim=True + TransientSoundVolume=1.800000 + FireLoopAnim="Fire" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.096000 + AmmoClass=Class'NicePack.NiceSCARMK17Ammo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=300.000000) + ShakeRotRate=(X=7500.000000,Y=7500.000000,Z=7500.000000) + ShakeRotTime=0.650000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.150000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Pickup.uc b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Pickup.uc index 379cb7d..9a446a1 100644 --- a/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Pickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/SCAR/NiceSCARMK17Pickup.uc @@ -1,4 +1,26 @@ -class NiceSCARMK17Pickup extends NiceWeaponPickup; -defaultproperties -{ Weight=8.000000 cost=1250 AmmoCost=40 BuyClipSize=20 PowerValue=45 SpeedValue=85 RangeValue=70 Description="An advanced tactical assault rifle. Equipped with an aimpoint sight. Fires in semi or full auto with great power and accuracy." ItemName="SCAR MK17" ItemShortName="SCAR MK17" AmmoItemName="7.62x51mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=3 VariantClasses(0)=Class'KFMod.NeonSCARMK17Pickup' InventoryType=Class'NicePack.NiceSCARMK17AssaultRifle' PickupMessage="You got the SCARMK17" PickupSound=Sound'KF_SCARSnd.SCAR_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups2_Trip.Rifles.SCAR_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceSCARMK17Pickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=8.000000 + cost=1250 + AmmoCost=40 + BuyClipSize=20 + PowerValue=45 + SpeedValue=85 + RangeValue=70 + Description="An advanced tactical assault rifle. Equipped with an aimpoint sight. Fires in semi or full auto with great power and accuracy." + ItemName="SCAR MK17" + ItemShortName="SCAR MK17" + AmmoItemName="7.62x51mm Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=3 + EquipmentCategoryID=3 + VariantClasses(0)=Class'KFMod.NeonSCARMK17Pickup' + InventoryType=Class'NicePack.NiceSCARMK17AssaultRifle' + PickupMessage="You got the SCARMK17" + PickupSound=Sound'KF_SCARSnd.SCAR_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups2_Trip.Rifles.SCAR_Pickup' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceDamTypeThom.uc b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceDamTypeThom.uc index a0f3b29..298bc7c 100644 --- a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceDamTypeThom.uc +++ b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceDamTypeThom.uc @@ -1,5 +1,14 @@ -class NiceDamTypeThom extends NiceDamageTypeVetCommando - abstract; -defaultproperties -{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceTactThom' DeathString="%k killed %o (Tactical-Thompson)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=1500.000000 KDeathVel=110.000000 KDeathUpKick=2.000000 -} +class NiceDamTypeThom extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ + HeadShotDamageMult=1.500000 + WeaponClass=Class'NicePack.NiceTactThom' + DeathString="%k killed %o (Tactical-Thompson)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + KDamageImpulse=1500.000000 + KDeathVel=110.000000 + KDeathUpKick=2.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThom.uc b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThom.uc index 4049993..6d58896 100644 --- a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThom.uc +++ b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThom.uc @@ -1,17 +1,69 @@ -class NiceTactThom extends NiceAssaultRifle; -#exec OBJ LOAD FILE=KillingFloorWeapons.utx -#exec OBJ LOAD FILE=KillingFloorHUD.utx -#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax -simulated function AltFire(float F){ - ToggleLaser(); -} -simulated function ToggleLaser(){ - if(!Instigator.IsLocallyControlled()) return; - // Will redo this bit later, but so far it'll have to do - if(LaserType == 0) LaserType = 1; - else LaserType = 0; - ApplyLaserState(); -} -defaultproperties -{ LaserAttachmentBone="bone_laser" reloadPreEndFrame=0.110000 reloadEndFrame=0.380000 reloadChargeEndFrame=0.650000 reloadMagStartFrame=0.260000 reloadChargeStartFrame=0.460000 MagazineBone="thomson-mag" MagCapacity=30 ReloadRate=2.880000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_M4" SelectedHudImage=Texture'NicePackT.TactThompson.tact_sel' Weight=4.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=70.000000 SleeveNum=2 TraderInfoTexture=Texture'NicePackT.TactThompson.tact_trader' bIsTier2Weapon=True MeshRef="NicePackA.tact_tom" SkinRefs(0)="NicePackT.TactThompson.EOTECH" SkinRefs(1)="NicePackT.TactThompson.holosight_fb" SelectSoundRef="NicePackSnd.TactThompson.tact_deploy" HudImageRef="NicePackT.TactThompson.tact_unsel" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceTactThomFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="An excellent tactical Thompson. Not much better than a bullpup, but has lots of ammo and some penetration." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=70.000000 Priority=70 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=1 PickupClass=Class'NicePack.NiceTactThomPickup' PlayerViewOffset=(X=20.000000,Y=21.500000,Z=-9.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceTactThomAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="Tactical Thompson" TransientSoundVolume=1.250000 -} +class NiceTactThom extends NiceAssaultRifle; +#exec OBJ LOAD FILE=KillingFloorWeapons.utx +#exec OBJ LOAD FILE=KillingFloorHUD.utx +#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax +simulated function AltFire(float F){ + ToggleLaser(); +} +simulated function ToggleLaser(){ + if(!Instigator.IsLocallyControlled()) + return; + // Will redo this bit later, but so far it'll have to do + if(LaserType == 0) + LaserType = 1; + else + LaserType = 0; + ApplyLaserState(); +} +defaultproperties +{ + LaserAttachmentBone="bone_laser" + reloadPreEndFrame=0.110000 + reloadEndFrame=0.380000 + reloadChargeEndFrame=0.650000 + reloadMagStartFrame=0.260000 + reloadChargeStartFrame=0.460000 + MagazineBone="thomson-mag" + MagCapacity=30 + ReloadRate=2.880000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_M4" + SelectedHudImage=Texture'NicePackT.TactThompson.tact_sel' + Weight=4.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=70.000000 + SleeveNum=2 + TraderInfoTexture=Texture'NicePackT.TactThompson.tact_trader' + bIsTier2Weapon=True + MeshRef="NicePackA.tact_tom" + SkinRefs(0)="NicePackT.TactThompson.EOTECH" + SkinRefs(1)="NicePackT.TactThompson.holosight_fb" + SelectSoundRef="NicePackSnd.TactThompson.tact_deploy" + HudImageRef="NicePackT.TactThompson.tact_unsel" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=40.000000 + FireModeClass(0)=Class'NicePack.NiceTactThomFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="An excellent tactical Thompson. Not much better than a bullpup, but has lots of ammo and some penetration." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=70.000000 + Priority=70 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=3 + GroupOffset=1 + PickupClass=Class'NicePack.NiceTactThomPickup' + PlayerViewOffset=(X=20.000000,Y=21.500000,Z=-9.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceTactThomAttachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="Tactical Thompson" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAmmo.uc b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAmmo.uc index b129240..66de445 100644 --- a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAmmo.uc +++ b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAmmo.uc @@ -1,5 +1,12 @@ -class NiceTactThomAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceTactThomPickup' MaxAmmo=270 InitialAmount=60 PickupClass=Class'NicePack.NiceTactThomAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="Tact-Thom bullets" -} +class NiceTactThomAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceTactThomPickup' + MaxAmmo=270 + InitialAmount=60 + PickupClass=Class'NicePack.NiceTactThomAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="Tact-Thom bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAmmoPickup.uc index 29ab8de..b4eec41 100644 --- a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAmmoPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceTactThomAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=30 InventoryType=Class'NicePack.NiceTactThomAmmo' PickupMessage="Rounds (Tact-Thom)" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceTactThomAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=30 + InventoryType=Class'NicePack.NiceTactThomAmmo' + PickupMessage="Rounds (Tact-Thom)" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAttachment.uc b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAttachment.uc index fd892af..01715c3 100644 --- a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAttachment.uc +++ b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomAttachment.uc @@ -1,4 +1,56 @@ -class NiceTactThomAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_M4" MovementAnims(1)="JogB_M4" MovementAnims(2)="JogL_M4" MovementAnims(3)="JogR_M4" TurnLeftAnim="TurnL_M4" TurnRightAnim="TurnR_M4" CrouchAnims(0)="CHWalkF_M4" CrouchAnims(1)="CHWalkB_M4" CrouchAnims(2)="CHWalkL_M4" CrouchAnims(3)="CHWalkR_M4" WalkAnims(0)="WalkF_M4" WalkAnims(1)="WalkB_M4" WalkAnims(2)="WalkL_M4" WalkAnims(3)="WalkR_M4" CrouchTurnRightAnim="CH_TurnR_M4" CrouchTurnLeftAnim="CH_TurnL_M4" IdleCrouchAnim="CHIdle_M4" IdleWeaponAnim="Idle_M4" IdleRestAnim="Idle_M4" IdleChatAnim="Idle_M4" IdleHeavyAnim="Idle_M4" IdleRifleAnim="Idle_M4" FireAnims(0)="Fire_M4" FireAnims(1)="Fire_M4" FireAnims(2)="Fire_M4" FireAnims(3)="Fire_M4" FireAltAnims(0)="Fire_M4" FireAltAnims(1)="Fire_M4" FireAltAnims(2)="Fire_M4" FireAltAnims(3)="Fire_M4" FireCrouchAnims(0)="CHFire_M4" FireCrouchAnims(1)="CHFire_M4" FireCrouchAnims(2)="CHFire_M4" FireCrouchAnims(3)="CHFire_M4" FireCrouchAltAnims(0)="CHFire_M4" FireCrouchAltAnims(1)="CHFire_M4" FireCrouchAltAnims(2)="CHFire_M4" FireCrouchAltAnims(3)="CHFire_M4" HitAnims(0)="HitF_M4" HitAnims(1)="HitB_M4" HitAnims(2)="HitL_M4" HitAnims(3)="HitR_M4" PostFireBlendStandAnim="Blend_M4" PostFireBlendCrouchAnim="CHBlend_M4" MeshRef="NicePackA.tact_3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceTactThomAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + MovementAnims(0)="JogF_M4" + MovementAnims(1)="JogB_M4" + MovementAnims(2)="JogL_M4" + MovementAnims(3)="JogR_M4" + TurnLeftAnim="TurnL_M4" + TurnRightAnim="TurnR_M4" + CrouchAnims(0)="CHWalkF_M4" + CrouchAnims(1)="CHWalkB_M4" + CrouchAnims(2)="CHWalkL_M4" + CrouchAnims(3)="CHWalkR_M4" + WalkAnims(0)="WalkF_M4" + WalkAnims(1)="WalkB_M4" + WalkAnims(2)="WalkL_M4" + WalkAnims(3)="WalkR_M4" + CrouchTurnRightAnim="CH_TurnR_M4" + CrouchTurnLeftAnim="CH_TurnL_M4" + IdleCrouchAnim="CHIdle_M4" + IdleWeaponAnim="Idle_M4" + IdleRestAnim="Idle_M4" + IdleChatAnim="Idle_M4" + IdleHeavyAnim="Idle_M4" + IdleRifleAnim="Idle_M4" + FireAnims(0)="Fire_M4" + FireAnims(1)="Fire_M4" + FireAnims(2)="Fire_M4" + FireAnims(3)="Fire_M4" + FireAltAnims(0)="Fire_M4" + FireAltAnims(1)="Fire_M4" + FireAltAnims(2)="Fire_M4" + FireAltAnims(3)="Fire_M4" + FireCrouchAnims(0)="CHFire_M4" + FireCrouchAnims(1)="CHFire_M4" + FireCrouchAnims(2)="CHFire_M4" + FireCrouchAnims(3)="CHFire_M4" + FireCrouchAltAnims(0)="CHFire_M4" + FireCrouchAltAnims(1)="CHFire_M4" + FireCrouchAltAnims(2)="CHFire_M4" + FireCrouchAltAnims(3)="CHFire_M4" + HitAnims(0)="HitF_M4" + HitAnims(1)="HitB_M4" + HitAnims(2)="HitL_M4" + HitAnims(3)="HitR_M4" + PostFireBlendStandAnim="Blend_M4" + PostFireBlendCrouchAnim="CHBlend_M4" + MeshRef="NicePackA.tact_3rd" + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomFire.uc b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomFire.uc index e3d35f4..9f1c8ae 100644 --- a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomFire.uc +++ b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomFire.uc @@ -1,4 +1,35 @@ -class NiceTactThomFire extends NiceFire; -defaultproperties -{ ProjectileSpeed=14250.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.080000 maxVerticalRecoilAngle=240 maxHorizontalRecoilAngle=120 ShellEjectClass=Class'ROEffects.KFShellEjectBullpup' ShellEjectBoneName="bone_ejector" bAccuracyBonusForSemiAuto=True FireSoundRef="NicePackSnd.TactThompson.tact_fire_m" StereoFireSoundRef="NicePackSnd.TactThompson.tacT_fire_s" NoAmmoSoundRef="KF_9MMSnd.9mm_DryFire" DamageType=Class'NicePack.NiceDamTypeThom' DamageMin=20 DamageMax=20 Momentum=8500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.080000 AmmoClass=Class'NicePack.NiceTactThomAmmo' ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=0.500000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.000000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 -} +class NiceTactThomFire extends NiceFire; +defaultproperties +{ + ProjectileSpeed=14250.000000 + FireAimedAnim="Fire_Iron" + RecoilRate=0.080000 + maxVerticalRecoilAngle=240 + maxHorizontalRecoilAngle=120 + ShellEjectClass=Class'ROEffects.KFShellEjectBullpup' + ShellEjectBoneName="bone_ejector" + bAccuracyBonusForSemiAuto=True + FireSoundRef="NicePackSnd.TactThompson.tact_fire_m" + StereoFireSoundRef="NicePackSnd.TactThompson.tacT_fire_s" + NoAmmoSoundRef="KF_9MMSnd.9mm_DryFire" + DamageType=Class'NicePack.NiceDamTypeThom' + DamageMin=20 + DamageMax=20 + Momentum=8500.000000 + bPawnRapidFireAnim=True + TransientSoundVolume=1.800000 + FireLoopAnim="Fire" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.080000 + AmmoClass=Class'NicePack.NiceTactThomAmmo' + ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeRotTime=0.500000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.000000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomPickup.uc b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomPickup.uc index 77729ba..e4f8e30 100644 --- a/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/TacticalThompson/NiceTactThomPickup.uc @@ -1,4 +1,24 @@ -class NiceTactThomPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=4.000000 cost=200 AmmoCost=12 BuyClipSize=40 PowerValue=56 SpeedValue=95 RangeValue=70 Description="An excellent tactical Thompson. Weakest weapon in commando's arsenal, but it is extremely light." ItemName="Tactical Thompson" ItemShortName="Tact Thom" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceTactThom' PickupMessage="You got the Tactical-Thompson." PickupSound=Sound'NicePackSnd.TactThompson.bolt_pull' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'NicePackSM.TactThompson.tact_pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceTactThomPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=4.000000 + cost=200 + AmmoCost=12 + BuyClipSize=40 + PowerValue=56 + SpeedValue=95 + RangeValue=70 + Description="An excellent tactical Thompson. Weakest weapon in commando's arsenal, but it is extremely light." + ItemName="Tactical Thompson" + ItemShortName="Tact Thom" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=3 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceTactThom' + PickupMessage="You got the Tactical-Thompson." + PickupSound=Sound'NicePackSnd.TactThompson.bolt_pull' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'NicePackSM.TactThompson.tact_pickup' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceDamTypeThompsonDrum.uc b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceDamTypeThompsonDrum.uc index 7c25d69..ef0227e 100644 --- a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceDamTypeThompsonDrum.uc +++ b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceDamTypeThompsonDrum.uc @@ -1,5 +1,14 @@ -class NiceDamTypeThompsonDrum extends NiceDamageTypeVetCommando - abstract; -defaultproperties -{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceThompsonDrumSMG' DeathString="%k killed %o (Rising Storm Tommy Gun)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=1500.000000 KDeathVel=110.000000 KDeathUpKick=2.000000 -} +class NiceDamTypeThompsonDrum extends NiceDamageTypeVetCommando + abstract; +defaultproperties +{ + HeadShotDamageMult=1.500000 + WeaponClass=Class'NicePack.NiceThompsonDrumSMG' + DeathString="%k killed %o (Rising Storm Tommy Gun)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + KDamageImpulse=1500.000000 + KDeathVel=110.000000 + KDeathUpKick=2.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAmmo.uc b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAmmo.uc index 736da29..5ec0a2b 100644 --- a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAmmo.uc +++ b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAmmo.uc @@ -1,5 +1,12 @@ -class NiceThompsonDrumAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceThompsonDrumPickup' MaxAmmo=360 InitialAmount=90 PickupClass=Class'KFMod.ThompsonDrumAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="45. ACP bullets" -} +class NiceThompsonDrumAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceThompsonDrumPickup' + MaxAmmo=360 + InitialAmount=90 + PickupClass=Class'KFMod.ThompsonDrumAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="45. ACP bullets" +} diff --git a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAmmoPickup.uc b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAmmoPickup.uc index 4370143..3f3d891 100644 --- a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAmmoPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceThompsonDrumAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=40 InventoryType=Class'NicePack.NiceThompsonDrumAmmo' PickupMessage="Rounds 45. ACP" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceThompsonDrumAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=40 + InventoryType=Class'NicePack.NiceThompsonDrumAmmo' + PickupMessage="Rounds 45. ACP" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAttachment.uc b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAttachment.uc index ee0e903..e6ab15b 100644 --- a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAttachment.uc +++ b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumAttachment.uc @@ -1,4 +1,57 @@ -class NiceThompsonDrumAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_IJC_spThompson_Drum" MovementAnims(1)="JogB_IJC_spThompson_Drum" MovementAnims(2)="JogL_IJC_spThompson_Drum" MovementAnims(3)="JogR_IJC_spThompson_Drum" TurnLeftAnim="TurnL_IJC_spThompson_Drum" TurnRightAnim="TurnR_IJC_spThompson_Drum" CrouchAnims(0)="CHWalkF_IJC_spThompson_Drum" CrouchAnims(1)="CHWalkB_IJC_spThompson_Drum" CrouchAnims(2)="CHWalkL_IJC_spThompson_Drum" CrouchAnims(3)="CHWalkR_IJC_spThompson_Drum" WalkAnims(0)="WalkF_IJC_spThompson_Drum" WalkAnims(1)="WalkB_IJC_spThompson_Drum" WalkAnims(2)="WalkL_IJC_spThompson_Drum" WalkAnims(3)="WalkR_IJC_spThompson_Drum" CrouchTurnRightAnim="CH_TurnR_IJC_spThompson_Drum" CrouchTurnLeftAnim="CH_TurnL_IJC_spThompson_Drum" IdleCrouchAnim="CHIdle_IJC_spThompson_Drum" IdleWeaponAnim="Idle_IJC_spThompson_Drum" IdleRestAnim="Idle_IJC_spThompson_Drum" IdleChatAnim="Idle_IJC_spThompson_Drum" IdleHeavyAnim="Idle_IJC_spThompson_Drum" IdleRifleAnim="Idle_IJC_spThompson_Drum" FireAnims(0)="Fire_IJC_spThompson_Drum" FireAnims(1)="Fire_IJC_spThompson_Drum" FireAnims(2)="Fire_IJC_spThompson_Drum" FireAnims(3)="Fire_IJC_spThompson_Drum" FireAltAnims(0)="Fire_IJC_spThompson_Drum" FireAltAnims(1)="Fire_IJC_spThompson_Drum" FireAltAnims(2)="Fire_IJC_spThompson_Drum" FireAltAnims(3)="Fire_IJC_spThompson_Drum" FireCrouchAnims(0)="CHFire_IJC_spThompson_Drum" FireCrouchAnims(1)="CHFire_IJC_spThompson_Drum" FireCrouchAnims(2)="CHFire_IJC_spThompson_Drum" FireCrouchAnims(3)="CHFire_IJC_spThompson_Drum" FireCrouchAltAnims(0)="CHFire_IJC_spThompson_Drum" FireCrouchAltAnims(1)="CHFire_IJC_spThompson_Drum" FireCrouchAltAnims(2)="CHFire_IJC_spThompson_Drum" FireCrouchAltAnims(3)="CHFire_IJC_spThompson_Drum" HitAnims(0)="HitF_IJC_spThompson_Drum" HitAnims(1)="HitB_IJC_spThompson_Drum" HitAnims(2)="HitL_IJC_spThompson_Drum" HitAnims(3)="HitR_IJC_spThompson_Drum" PostFireBlendStandAnim="Blend_IJC_spThompson_Drum" PostFireBlendCrouchAnim="CHBlend_IJC_spThompson_Drum" MeshRef="KF_Weapons3rd2_IJC.spThompsonDrum_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceThompsonDrumAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + MovementAnims(0)="JogF_IJC_spThompson_Drum" + MovementAnims(1)="JogB_IJC_spThompson_Drum" + MovementAnims(2)="JogL_IJC_spThompson_Drum" + MovementAnims(3)="JogR_IJC_spThompson_Drum" + TurnLeftAnim="TurnL_IJC_spThompson_Drum" + TurnRightAnim="TurnR_IJC_spThompson_Drum" + CrouchAnims(0)="CHWalkF_IJC_spThompson_Drum" + CrouchAnims(1)="CHWalkB_IJC_spThompson_Drum" + CrouchAnims(2)="CHWalkL_IJC_spThompson_Drum" + CrouchAnims(3)="CHWalkR_IJC_spThompson_Drum" + WalkAnims(0)="WalkF_IJC_spThompson_Drum" + WalkAnims(1)="WalkB_IJC_spThompson_Drum" + WalkAnims(2)="WalkL_IJC_spThompson_Drum" + WalkAnims(3)="WalkR_IJC_spThompson_Drum" + CrouchTurnRightAnim="CH_TurnR_IJC_spThompson_Drum" + CrouchTurnLeftAnim="CH_TurnL_IJC_spThompson_Drum" + IdleCrouchAnim="CHIdle_IJC_spThompson_Drum" + IdleWeaponAnim="Idle_IJC_spThompson_Drum" + IdleRestAnim="Idle_IJC_spThompson_Drum" + IdleChatAnim="Idle_IJC_spThompson_Drum" + IdleHeavyAnim="Idle_IJC_spThompson_Drum" + IdleRifleAnim="Idle_IJC_spThompson_Drum" + FireAnims(0)="Fire_IJC_spThompson_Drum" + FireAnims(1)="Fire_IJC_spThompson_Drum" + FireAnims(2)="Fire_IJC_spThompson_Drum" + FireAnims(3)="Fire_IJC_spThompson_Drum" + FireAltAnims(0)="Fire_IJC_spThompson_Drum" + FireAltAnims(1)="Fire_IJC_spThompson_Drum" + FireAltAnims(2)="Fire_IJC_spThompson_Drum" + FireAltAnims(3)="Fire_IJC_spThompson_Drum" + FireCrouchAnims(0)="CHFire_IJC_spThompson_Drum" + FireCrouchAnims(1)="CHFire_IJC_spThompson_Drum" + FireCrouchAnims(2)="CHFire_IJC_spThompson_Drum" + FireCrouchAnims(3)="CHFire_IJC_spThompson_Drum" + FireCrouchAltAnims(0)="CHFire_IJC_spThompson_Drum" + FireCrouchAltAnims(1)="CHFire_IJC_spThompson_Drum" + FireCrouchAltAnims(2)="CHFire_IJC_spThompson_Drum" + FireCrouchAltAnims(3)="CHFire_IJC_spThompson_Drum" + HitAnims(0)="HitF_IJC_spThompson_Drum" + HitAnims(1)="HitB_IJC_spThompson_Drum" + HitAnims(2)="HitL_IJC_spThompson_Drum" + HitAnims(3)="HitR_IJC_spThompson_Drum" + PostFireBlendStandAnim="Blend_IJC_spThompson_Drum" + PostFireBlendCrouchAnim="CHBlend_IJC_spThompson_Drum" + MeshRef="KF_Weapons3rd2_IJC.spThompsonDrum_3rd" + WeaponAmbientScale=2.000000 + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumFire.uc b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumFire.uc index ebe439e..152d5cb 100644 --- a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumFire.uc +++ b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumFire.uc @@ -1,4 +1,32 @@ -class NiceThompsonDrumFire extends NiceHighROFFire; -defaultproperties -{ FireEndSoundRef="KF_IJC_HalloweenSnd.ThompsonSMG_Fire_Loop_End_M" FireEndStereoSoundRef="KF_IJC_HalloweenSnd.ThompsonSMG_Fire_Loop_End_S" AmbientFireSoundRef="KF_IJC_HalloweenSnd.ThompsonSMG_Fire_Loop" ProjectileSpeed=14250.000000 RecoilRate=0.080000 maxVerticalRecoilAngle=240 maxHorizontalRecoilAngle=120 ShellEjectClass=Class'ROEffects.KFShellEjectMP5SMG' ShellEjectBoneName="Shell_eject" bRandomPitchFireSound=False FireSoundRef="KF_IJC_HalloweenSnd.Thompson_Fire_Single_M" StereoFireSoundRef="KF_IJC_HalloweenSnd.Thompson_Fire_Single_S" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeThompsonDrum' DamageMin=20 DamageMax=20 Momentum=12500.000000 FireRate=0.085700 AmmoClass=Class'NicePack.NiceThompsonDrumAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.150000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 -} +class NiceThompsonDrumFire extends NiceHighROFFire; +defaultproperties +{ + FireEndSoundRef="KF_IJC_HalloweenSnd.ThompsonSMG_Fire_Loop_End_M" + FireEndStereoSoundRef="KF_IJC_HalloweenSnd.ThompsonSMG_Fire_Loop_End_S" + AmbientFireSoundRef="KF_IJC_HalloweenSnd.ThompsonSMG_Fire_Loop" + ProjectileSpeed=14250.000000 + RecoilRate=0.080000 + maxVerticalRecoilAngle=240 + maxHorizontalRecoilAngle=120 + ShellEjectClass=Class'ROEffects.KFShellEjectMP5SMG' + ShellEjectBoneName="Shell_eject" + bRandomPitchFireSound=False + FireSoundRef="KF_IJC_HalloweenSnd.Thompson_Fire_Single_M" + StereoFireSoundRef="KF_IJC_HalloweenSnd.Thompson_Fire_Single_S" + NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" + DamageType=Class'NicePack.NiceDamTypeThompsonDrum' + DamageMin=20 + DamageMax=20 + Momentum=12500.000000 + FireRate=0.085700 + AmmoClass=Class'NicePack.NiceThompsonDrumAmmo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) + ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) + ShakeRotTime=0.750000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.250000 + BotRefireRate=0.150000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumPickup.uc b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumPickup.uc index 8dabbec..7e0cc53 100644 --- a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumPickup.uc +++ b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumPickup.uc @@ -1,4 +1,25 @@ -class NiceThompsonDrumPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=5.000000 cost=500 AmmoCost=15 BuyClipSize=50 PowerValue=35 SpeedValue=80 RangeValue=45 Description="This Tommy gun with a drum magazine was used heavily during the WWII pacific battles." ItemName="Rising Storm Tommy Gun" ItemShortName="R.S. Tommy Gun" AmmoItemName="45. ACP Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceThompsonDrumSMG' PickupMessage="You got the Rising Storm Thompson with Drum Mag" PickupSound=Sound'KF_IJC_HalloweenSnd.Handling.Thompson_Handling_Bolt_Back' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_IJC_Summer_Weps.Thompson_Drum' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceThompsonDrumPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=5.000000 + cost=500 + AmmoCost=15 + BuyClipSize=50 + PowerValue=35 + SpeedValue=80 + RangeValue=45 + Description="This Tommy gun with a drum magazine was used heavily during the WWII pacific battles." + ItemName="Rising Storm Tommy Gun" + ItemShortName="R.S. Tommy Gun" + AmmoItemName="45. ACP Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=3 + EquipmentCategoryID=3 + InventoryType=Class'NicePack.NiceThompsonDrumSMG' + PickupMessage="You got the Rising Storm Thompson with Drum Mag" + PickupSound=Sound'KF_IJC_HalloweenSnd.Handling.Thompson_Handling_Bolt_Back' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_IJC_Summer_Weps.Thompson_Drum' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumSMG.uc b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumSMG.uc index 5d8da3a..5decf8e 100644 --- a/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumSMG.uc +++ b/sources/Weapons/Playable/AssaultRifles/Tommygun/NiceThompsonDrumSMG.uc @@ -1,4 +1,50 @@ -class NiceThompsonDrumSMG extends NiceAssaultRifle; -defaultproperties -{ bSemiAutoFireEnabled=False reloadPreEndFrame=0.132000 reloadEndFrame=0.570000 reloadChargeEndFrame=0.810000 reloadMagStartFrame=0.347000 reloadChargeStartFrame=0.670000 MagazineBone="Magazine_Drum" MagCapacity=40 ReloadRate=3.800000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_IJC_spThompson_Drum" Weight=5.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 SleeveNum=0 TraderInfoTexture=Texture'KF_IJC_HUD.Trader_Weapon_Icons.Trader_Thompson_Drum' bIsTier2Weapon=True MeshRef="KF_IJC_Summer_Weps1.ThompsonDrum" SkinRefs(1)="KF_IJC_Summer_Weapons.Thompson_Drum.thompson_drum_cmb" SelectSoundRef="KF_IJC_HalloweenSnd.Thompson_Handling_Bolt_Back" HudImageRef="KF_IJC_HUD.WeaponSelect.Thompson_Drum_unselected" SelectedHudImageRef="KF_IJC_HUD.WeaponSelect.Thompson_Drum" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceThompsonDrumFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="This Tommy gun with a drum magazine was used heavily during the WWII pacific battles." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=124 InventoryGroup=3 GroupOffset=20 PickupClass=Class'NicePack.NiceThompsonDrumPickup' PlayerViewOffset=(X=10.000000,Y=16.000000,Z=-7.000000) BobDamping=4.000000 AttachmentClass=Class'NicePack.NiceThompsonDrumAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="Rising Storm Tommy Gun" TransientSoundVolume=1.250000 -} +class NiceThompsonDrumSMG extends NiceAssaultRifle; +defaultproperties +{ + bSemiAutoFireEnabled=False + reloadPreEndFrame=0.132000 + reloadEndFrame=0.570000 + reloadChargeEndFrame=0.810000 + reloadMagStartFrame=0.347000 + reloadChargeStartFrame=0.670000 + MagazineBone="Magazine_Drum" + MagCapacity=40 + ReloadRate=3.800000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_IJC_spThompson_Drum" + Weight=5.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=55.000000 + SleeveNum=0 + TraderInfoTexture=Texture'KF_IJC_HUD.Trader_Weapon_Icons.Trader_Thompson_Drum' + bIsTier2Weapon=True + MeshRef="KF_IJC_Summer_Weps1.ThompsonDrum" + SkinRefs(1)="KF_IJC_Summer_Weapons.Thompson_Drum.thompson_drum_cmb" + SelectSoundRef="KF_IJC_HalloweenSnd.Thompson_Handling_Bolt_Back" + HudImageRef="KF_IJC_HUD.WeaponSelect.Thompson_Drum_unselected" + SelectedHudImageRef="KF_IJC_HUD.WeaponSelect.Thompson_Drum" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=40.000000 + FireModeClass(0)=Class'NicePack.NiceThompsonDrumFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="This Tommy gun with a drum magazine was used heavily during the WWII pacific battles." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=55.000000 + Priority=124 + InventoryGroup=3 + GroupOffset=20 + PickupClass=Class'NicePack.NiceThompsonDrumPickup' + PlayerViewOffset=(X=10.000000,Y=16.000000,Z=-7.000000) + BobDamping=4.000000 + AttachmentClass=Class'NicePack.NiceThompsonDrumAttachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="Rising Storm Tommy Gun" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGL.uc b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGL.uc index cf6049c..68c2d8f 100644 --- a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGL.uc +++ b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGL.uc @@ -1,16 +1,66 @@ -class NiceCLGL extends NiceWeapon; -simulated function fillSubReloadStages(){ - // Loading 4 shells during 94 frames tops, with first shell loaded at frame 13, with 22 frames between load moments - generateReloadStages(3, 94, 13, 22); -} -simulated function SetupReloadVars(optional bool bIsActive, optional int animationIndex){ - if(MagAmmoRemainingClient == 0){ generateReloadStages(4, 145, 42, 22); reloadStages[0] = 0.2; ReloadAnim='ReloadLong'; - } - else{ generateReloadStages(3, 94, 13, 22); ReloadAnim='Reload'; - } - UpdateSingleReloadVars(); - super.SetupReloadVars(bIsActive, animationIndex); -} -defaultproperties -{ bChangeClipIcon=True bChangeBulletsIcon=True hudClipTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' hudBulletsTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' reloadType=RTYPE_SINGLE MagCapacity=4 ReloadRate=0.850000 ReloadAnim="Reload" ReloadAnimRate=1.000000 bHoldToReload=True WeaponReloadAnim="Reload_Shotgun" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 SleeveNum=0 TraderInfoTexture=Texture'NicePackT.CLGL.CLGL_HUD_Trader' bIsTier3Weapon=True MeshRef="NicePackA.CLGLMesh1st" SkinRefs(1)="NicePackT.CLGL.CLGL_CMB" SelectSoundRef="NicePackSnd.CLGL.CLGLSelect" HudImageRef="NicePackT.CLGL.CLGL_HUD_UnSelected" SelectedHudImageRef="NicePackT.CLGL.CLGL_HUD_Selected" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceCLGLFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="A pump-action grenade launcher. Launches high-explosive grenades." DisplayFOV=65.000000 Priority=210 InventoryGroup=4 GroupOffset=6 PickupClass=Class'NicePack.NiceCLGLPickup' PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceCLGLAttachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="China Lake Grenade Launcher" LightType=LT_None LightBrightness=0.000000 LightRadius=0.000000 -} +class NiceCLGL extends NiceWeapon; +simulated function fillSubReloadStages(){ + // Loading 4 shells during 94 frames tops, with first shell loaded at frame 13, with 22 frames between load moments + generateReloadStages(3, 94, 13, 22); +} +simulated function SetupReloadVars(optional bool bIsActive, optional int animationIndex){ + if(MagAmmoRemainingClient == 0){ + generateReloadStages(4, 145, 42, 22); + reloadStages[0] = 0.2; + ReloadAnim='ReloadLong'; + } + else{ + generateReloadStages(3, 94, 13, 22); + ReloadAnim='Reload'; + } + UpdateSingleReloadVars(); + super.SetupReloadVars(bIsActive, animationIndex); +} +defaultproperties +{ + bChangeClipIcon=True + bChangeBulletsIcon=True + hudClipTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' + hudBulletsTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' + reloadType=RTYPE_SINGLE + MagCapacity=4 + ReloadRate=0.850000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + bHoldToReload=True + WeaponReloadAnim="Reload_Shotgun" + Weight=6.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=65.000000 + SleeveNum=0 + TraderInfoTexture=Texture'NicePackT.CLGL.CLGL_HUD_Trader' + bIsTier3Weapon=True + MeshRef="NicePackA.CLGLMesh1st" + SkinRefs(1)="NicePackT.CLGL.CLGL_CMB" + SelectSoundRef="NicePackSnd.CLGL.CLGLSelect" + HudImageRef="NicePackT.CLGL.CLGL_HUD_UnSelected" + SelectedHudImageRef="NicePackT.CLGL.CLGL_HUD_Selected" + PlayerIronSightFOV=70.000000 + ZoomedDisplayFOV=40.000000 + FireModeClass(0)=Class'NicePack.NiceCLGLFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.650000 + CurrentRating=0.650000 + Description="A pump-action grenade launcher. Launches high-explosive grenades." + DisplayFOV=65.000000 + Priority=210 + InventoryGroup=4 + GroupOffset=6 + PickupClass=Class'NicePack.NiceCLGLPickup' + PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-6.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceCLGLAttachment' + IconCoords=(X1=253,Y1=146,X2=333,Y2=181) + ItemName="China Lake Grenade Launcher" + LightType=LT_None + LightBrightness=0.000000 + LightRadius=0.000000 +} diff --git a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAmmo.uc b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAmmo.uc index a5f6e3d..40b4418 100644 --- a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAmmo.uc +++ b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAmmo.uc @@ -1,4 +1,11 @@ -class NiceCLGLAmmo extends NiceAmmo; -defaultproperties -{ AmmoPickupAmount=4 MaxAmmo=36 InitialAmount=9 PickupClass=Class'NicePack.NiceCLGLAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=4,Y1=350,X2=110,Y2=395) ItemName="CLGL Grenades" -} +class NiceCLGLAmmo extends NiceAmmo; +defaultproperties +{ + AmmoPickupAmount=4 + MaxAmmo=36 + InitialAmount=9 + PickupClass=Class'NicePack.NiceCLGLAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=4,Y1=350,X2=110,Y2=395) + ItemName="CLGL Grenades" +} diff --git a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAmmoPickup.uc b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAmmoPickup.uc index b3923de..82a0d2d 100644 --- a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAmmoPickup.uc +++ b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAmmoPickup.uc @@ -1,4 +1,9 @@ -class NiceCLGLAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=6 InventoryType=Class'NicePack.NiceCLGLAmmo' PickupMessage="CLGL Grenades" StaticMesh=StaticMesh'KillingFloorStatics.FragPickup' CollisionRadius=25.000000 -} +class NiceCLGLAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=6 + InventoryType=Class'NicePack.NiceCLGLAmmo' + PickupMessage="CLGL Grenades" + StaticMesh=StaticMesh'KillingFloorStatics.FragPickup' + CollisionRadius=25.000000 +} diff --git a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAttachment.uc b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAttachment.uc index cd39447..726a975 100644 --- a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAttachment.uc +++ b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLAttachment.uc @@ -1,4 +1,51 @@ -class NiceCLGLAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdNadeL' mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' MovementAnims(0)="JogF_Shotgun" MovementAnims(1)="JogB_Shotgun" MovementAnims(2)="JogL_Shotgun" MovementAnims(3)="JogR_Shotgun" TurnLeftAnim="TurnL_Shotgun" TurnRightAnim="TurnR_Shotgun" CrouchAnims(0)="CHwalkF_Shotgun" CrouchAnims(1)="CHwalkB_Shotgun" CrouchAnims(2)="CHwalkL_Shotgun" CrouchAnims(3)="CHwalkR_Shotgun" WalkAnims(0)="WalkF_Shotgun" WalkAnims(1)="WalkB_Shotgun" WalkAnims(2)="WalkL_Shotgun" WalkAnims(3)="WalkR_Shotgun" CrouchTurnRightAnim="CH_TurnR_Shotgun" CrouchTurnLeftAnim="CH_TurnL_Shotgun" IdleCrouchAnim="CHIdle_Shotgun" IdleWeaponAnim="Idle_Shotgun" IdleRestAnim="Idle_Shotgun" IdleChatAnim="Idle_Shotgun" IdleHeavyAnim="Idle_Shotgun" IdleRifleAnim="Idle_Shotgun" FireAnims(0)="Fire_Shotgun" FireAnims(1)="Fire_Shotgun" FireAnims(2)="Fire_Shotgun" FireAnims(3)="Fire_Shotgun" FireAltAnims(0)="Fire_Shotgun" FireAltAnims(1)="Fire_Shotgun" FireAltAnims(2)="Fire_Shotgun" FireAltAnims(3)="Fire_Shotgun" FireCrouchAnims(0)="CHFire_Shotgun" FireCrouchAnims(1)="CHFire_Shotgun" FireCrouchAnims(2)="CHFire_Shotgun" FireCrouchAnims(3)="CHFire_Shotgun" FireCrouchAltAnims(0)="CHFire_Shotgun" FireCrouchAltAnims(1)="CHFire_Shotgun" FireCrouchAltAnims(2)="CHFire_Shotgun" FireCrouchAltAnims(3)="CHFire_Shotgun" HitAnims(0)="HitF_Shotgun" HitAnims(1)="HitB_Shotgun" HitAnims(2)="HitL_Shotgun" HitAnims(3)="HitR_Shotgun" PostFireBlendStandAnim="Blend_Shotgun" PostFireBlendCrouchAnim="CHBlend_Shotgun" MeshRef="NicePackA.CLGLMesh3rd" -} +class NiceCLGLAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdNadeL' + mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' + MovementAnims(0)="JogF_Shotgun" + MovementAnims(1)="JogB_Shotgun" + MovementAnims(2)="JogL_Shotgun" + MovementAnims(3)="JogR_Shotgun" + TurnLeftAnim="TurnL_Shotgun" + TurnRightAnim="TurnR_Shotgun" + CrouchAnims(0)="CHwalkF_Shotgun" + CrouchAnims(1)="CHwalkB_Shotgun" + CrouchAnims(2)="CHwalkL_Shotgun" + CrouchAnims(3)="CHwalkR_Shotgun" + WalkAnims(0)="WalkF_Shotgun" + WalkAnims(1)="WalkB_Shotgun" + WalkAnims(2)="WalkL_Shotgun" + WalkAnims(3)="WalkR_Shotgun" + CrouchTurnRightAnim="CH_TurnR_Shotgun" + CrouchTurnLeftAnim="CH_TurnL_Shotgun" + IdleCrouchAnim="CHIdle_Shotgun" + IdleWeaponAnim="Idle_Shotgun" + IdleRestAnim="Idle_Shotgun" + IdleChatAnim="Idle_Shotgun" + IdleHeavyAnim="Idle_Shotgun" + IdleRifleAnim="Idle_Shotgun" + FireAnims(0)="Fire_Shotgun" + FireAnims(1)="Fire_Shotgun" + FireAnims(2)="Fire_Shotgun" + FireAnims(3)="Fire_Shotgun" + FireAltAnims(0)="Fire_Shotgun" + FireAltAnims(1)="Fire_Shotgun" + FireAltAnims(2)="Fire_Shotgun" + FireAltAnims(3)="Fire_Shotgun" + FireCrouchAnims(0)="CHFire_Shotgun" + FireCrouchAnims(1)="CHFire_Shotgun" + FireCrouchAnims(2)="CHFire_Shotgun" + FireCrouchAnims(3)="CHFire_Shotgun" + FireCrouchAltAnims(0)="CHFire_Shotgun" + FireCrouchAltAnims(1)="CHFire_Shotgun" + FireCrouchAltAnims(2)="CHFire_Shotgun" + FireCrouchAltAnims(3)="CHFire_Shotgun" + HitAnims(0)="HitF_Shotgun" + HitAnims(1)="HitB_Shotgun" + HitAnims(2)="HitL_Shotgun" + HitAnims(3)="HitR_Shotgun" + PostFireBlendStandAnim="Blend_Shotgun" + PostFireBlendCrouchAnim="CHBlend_Shotgun" + MeshRef="NicePackA.CLGLMesh3rd" +} diff --git a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLPickup.uc b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLPickup.uc index 3d7324d..7bffd62 100644 --- a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLPickup.uc +++ b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceCLGLPickup.uc @@ -1,4 +1,27 @@ -class NiceCLGLPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=6.000000 cost=500 AmmoCost=28 BuyClipSize=4 PowerValue=85 SpeedValue=65 RangeValue=75 Description="A pump-action grenade launcher. Launches high-explosive grenades." ItemName="China Lake Grenade Launcher" ItemShortName="China Lake Launcher" AmmoItemName="CLGL Grenades" AmmoMesh=StaticMesh'KillingFloorStatics.XbowAmmo' CorrespondingPerkIndex=6 EquipmentCategoryID=2 MaxDesireability=0.790000 InventoryType=Class'NicePack.NiceCLGL' PickupMessage="You got the China Lake Grenade Launcher." PickupSound=Sound'NicePackSnd.CLGL.CLGLPickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'NicePackSM.CLGLMeshPickup' DrawScale=1.400000 CollisionRadius=25.000000 CollisionHeight=10.000000 -} +class NiceCLGLPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=6.000000 + cost=500 + AmmoCost=28 + BuyClipSize=4 + PowerValue=85 + SpeedValue=65 + RangeValue=75 + Description="A pump-action grenade launcher. Launches high-explosive grenades." + ItemName="China Lake Grenade Launcher" + ItemShortName="China Lake Launcher" + AmmoItemName="CLGL Grenades" + AmmoMesh=StaticMesh'KillingFloorStatics.XbowAmmo' + CorrespondingPerkIndex=6 + EquipmentCategoryID=2 + MaxDesireability=0.790000 + InventoryType=Class'NicePack.NiceCLGL' + PickupMessage="You got the China Lake Grenade Launcher." + PickupSound=Sound'NicePackSnd.CLGL.CLGLPickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'NicePackSM.CLGLMeshPickup' + DrawScale=1.400000 + CollisionRadius=25.000000 + CollisionHeight=10.000000 +} diff --git a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceDamTypeCLGLBlunt.uc b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceDamTypeCLGLBlunt.uc index 27fd2f6..6179aae 100644 --- a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceDamTypeCLGLBlunt.uc +++ b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceDamTypeCLGLBlunt.uc @@ -1,4 +1,5 @@ -class NiceDamTypeCLGLBlunt extends NiceDamTypeDemoBlunt; -defaultproperties -{ WeaponClass=Class'NicePack.NiceCLGL' -} +class NiceDamTypeCLGLBlunt extends NiceDamTypeDemoBlunt; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceCLGL' +} diff --git a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceDamTypeCLGLExplosion.uc b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceDamTypeCLGLExplosion.uc index c6ea757..0da9bd1 100644 --- a/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceDamTypeCLGLExplosion.uc +++ b/sources/Weapons/Playable/Explosives/ChinaLakeGrenadeLauncher/NiceDamTypeCLGLExplosion.uc @@ -1,4 +1,5 @@ -class NiceDamTypeCLGLExplosion extends NiceDamTypeDemoExplosion; -defaultproperties -{ WeaponClass=Class'NicePack.NiceCLGL' -} +class NiceDamTypeCLGLExplosion extends NiceDamTypeDemoExplosion; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceCLGL' +} diff --git a/sources/Weapons/Playable/Explosives/HRL/NiceHRL.uc b/sources/Weapons/Playable/Explosives/HRL/NiceHRL.uc index 235c3e8..e04c49f 100644 --- a/sources/Weapons/Playable/Explosives/HRL/NiceHRL.uc +++ b/sources/Weapons/Playable/Explosives/HRL/NiceHRL.uc @@ -1,4 +1,7 @@ -class NiceHRL extends HRL; -defaultproperties -{ FireModeClass(0)=Class'NicePack.NiceHRLFire' PickupClass=Class'NicePack.NiceHRLPickup' ItemName="HRL-1 Rocket Launcher NW" -} +class NiceHRL extends HRL; +defaultproperties +{ + FireModeClass(0)=Class'NicePack.NiceHRLFire' + PickupClass=Class'NicePack.NiceHRLPickup' + ItemName="HRL-1 Rocket Launcher NW" +} diff --git a/sources/Weapons/Playable/Explosives/HRL/NiceHRLFire.uc b/sources/Weapons/Playable/Explosives/HRL/NiceHRLFire.uc index fbf1cb7..58dd9b8 100644 --- a/sources/Weapons/Playable/Explosives/HRL/NiceHRLFire.uc +++ b/sources/Weapons/Playable/Explosives/HRL/NiceHRLFire.uc @@ -1,4 +1,5 @@ -class NiceHRLFire extends HRLFire; -defaultproperties -{ ProjectileClass=Class'NicePack.NiceHRLProj' -} +class NiceHRLFire extends HRLFire; +defaultproperties +{ + ProjectileClass=Class'NicePack.NiceHRLProj' +} diff --git a/sources/Weapons/Playable/Explosives/HRL/NiceHRLPickup.uc b/sources/Weapons/Playable/Explosives/HRL/NiceHRLPickup.uc index 07215c8..ec7c08c 100644 --- a/sources/Weapons/Playable/Explosives/HRL/NiceHRLPickup.uc +++ b/sources/Weapons/Playable/Explosives/HRL/NiceHRLPickup.uc @@ -1,4 +1,8 @@ -class NiceHRLPickup extends HRLPickup; -defaultproperties -{ ItemName="HRL-1 Rocket Launcher NW" ItemShortName="HRL-1 NW" InventoryType=Class'NicePack.NiceHRL' PickupMessage="You got the HRL-1 Rocket Launcher NW" -} +class NiceHRLPickup extends HRLPickup; +defaultproperties +{ + ItemName="HRL-1 Rocket Launcher NW" + ItemShortName="HRL-1 NW" + InventoryType=Class'NicePack.NiceHRL' + PickupMessage="You got the HRL-1 Rocket Launcher NW" +} diff --git a/sources/Weapons/Playable/Explosives/HRL/NiceHRLProj.uc b/sources/Weapons/Playable/Explosives/HRL/NiceHRLProj.uc index 8406a09..7427683 100644 --- a/sources/Weapons/Playable/Explosives/HRL/NiceHRLProj.uc +++ b/sources/Weapons/Playable/Explosives/HRL/NiceHRLProj.uc @@ -1,4 +1,5 @@ -class NiceHRLProj extends HRLProj; -defaultproperties -{ ArmDistSquared=180000.000000 -} +class NiceHRLProj extends HRLProj; +defaultproperties +{ + ArmDistSquared=180000.000000 +} diff --git a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineAmmo.uc b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineAmmo.uc index 7a24532..76bfdba 100644 --- a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineAmmo.uc +++ b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineAmmo.uc @@ -1,4 +1,5 @@ -class NiceHopMineAmmo extends HopMineAmmo; -defaultproperties -{ PickupClass=Class'NicePack.NiceHopMineAmmoPickup' -} +class NiceHopMineAmmo extends HopMineAmmo; +defaultproperties +{ + PickupClass=Class'NicePack.NiceHopMineAmmoPickup' +} diff --git a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineAmmoPickup.uc b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineAmmoPickup.uc index 747f79b..eef639c 100644 --- a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineAmmoPickup.uc +++ b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineAmmoPickup.uc @@ -1,4 +1,5 @@ -class NiceHopMineAmmoPickup extends HopMineAmmoPickup; -defaultproperties -{ InventoryType=Class'NicePack.NiceHopMineAmmo' -} +class NiceHopMineAmmoPickup extends HopMineAmmoPickup; +defaultproperties +{ + InventoryType=Class'NicePack.NiceHopMineAmmo' +} diff --git a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineFire.uc b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineFire.uc index a88d4e6..ac5916d 100644 --- a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineFire.uc +++ b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineFire.uc @@ -1,4 +1,6 @@ -class NiceHopMineFire extends HopMineFire; -defaultproperties -{ AmmoClass=Class'NicePack.NiceHopMineAmmo' ProjectileClass=Class'NicePack.NiceHopMineProj' -} +class NiceHopMineFire extends HopMineFire; +defaultproperties +{ + AmmoClass=Class'NicePack.NiceHopMineAmmo' + ProjectileClass=Class'NicePack.NiceHopMineProj' +} diff --git a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineLPickup.uc b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineLPickup.uc index 0a5da8a..a636183 100644 --- a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineLPickup.uc +++ b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineLPickup.uc @@ -1,4 +1,10 @@ -class NiceHopMineLPickup extends HopMineLPickup; -defaultproperties -{ Weight=5.000000 Description="The prototype of Hopmine launcher. But still can be very useful." ItemName="HopMine Launcher NW" ItemShortName="HopMine NW" InventoryType=Class'NicePack.NiceHopMineLchr' PickupMessage="You got the HopMine Launcher NW." -} +class NiceHopMineLPickup extends HopMineLPickup; +defaultproperties +{ + Weight=5.000000 + Description="The prototype of Hopmine launcher. But still can be very useful." + ItemName="HopMine Launcher NW" + ItemShortName="HopMine NW" + InventoryType=Class'NicePack.NiceHopMineLchr' + PickupMessage="You got the HopMine Launcher NW." +} diff --git a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineLchr.uc b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineLchr.uc index 1e0ce2a..8dbd240 100644 --- a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineLchr.uc +++ b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineLchr.uc @@ -1,7 +1,12 @@ -//============================================================================= -// HopMineLchr -//============================================================================= -class NiceHopMineLchr extends HopMineLchr; -defaultproperties -{ Weight=5.000000 FireModeClass(0)=Class'NicePack.NiceHopMineFire' Description="The prototype of Hopmine launcher." PickupClass=Class'NicePack.NiceHopMineLPickup' ItemName="HopMine Launcher NW" -} +//============================================================================= +// HopMineLchr +//============================================================================= +class NiceHopMineLchr extends HopMineLchr; +defaultproperties +{ + Weight=5.000000 + FireModeClass(0)=Class'NicePack.NiceHopMineFire' + Description="The prototype of Hopmine launcher." + PickupClass=Class'NicePack.NiceHopMineLPickup' + ItemName="HopMine Launcher NW" +} diff --git a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineProj.uc b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineProj.uc index 22f0a3b..86c9e3c 100644 --- a/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineProj.uc +++ b/sources/Weapons/Playable/Explosives/HopMineLauncher/NiceHopMineProj.uc @@ -1,23 +1,106 @@ -Class NiceHopMineProj extends HopMineProj; -#exec obj load file="KF_GrenadeSnd.uax" -#exec OBJ LOAD FILE=ScrnWeaponPack_T.utx -#exec OBJ LOAD FILE=ScrnWeaponPack_SND.uax -#exec OBJ LOAD FILE=ScrnWeaponPack_A.ukx -state OnWall -{ - simulated function BeginState() - { if ( SmokeTrail != none ) { SmokeTrail.HandleOwnerDestroyed(); SmokeTrail = none; } bCollideWorld = False; bFixedRotationDir = false; RotationRate = rot(0,0,0); if( Level.NetMode!=NM_DedicatedServer ) { TweenAnim('Down',0.05f); PlaySound(Sound'ScrnWeaponPack_SND.mine.blade_cut'); DotLight = Spawn(Class'HopMineLight',,,Location + (vect(0,0,5) << Rotation)); if( DotLight!=none ) { DotLight.SetBase(Self); DotLight.SetRelativeLocation(vect(0,0,5)); } } if( Level.NetMode!=NM_Client ) { NetUpdateFrequency = 1.f; SetTimer(0.25+FRand()*0.25,true); } - } - simulated function EndState() - { if( Level.NetMode!=NM_Client ) { SetTimer(0,false); NetUpdateFrequency = Default.NetUpdateFrequency; NetUpdateTime = Level.TimeSeconds-1; } - } - function Timer() - { local Controller C; local vector X,Y,Z; local float DotP; local int ThreatLevel; local bool bA,bB; GetAxes(Rotation,X,Y,Z); for( C=Level.ControllerList; C!=none; C=C.nextController ) if( C.Pawn!=none && C.Pawn.Health>0 && VSizeSquared(C.Pawn.Location-Location)<1000000.f ) { X = C.Pawn.Location-Location; DotP = (X Dot Z); if( DotP<0 ) continue; DotP = VSizeSquared(X - (Z * DotP)); if( DotP>90000.f || !FastTrace(C.Pawn.Location,Location) ) continue; if( Monster(C.Pawn)!=none ) { bB = true; if( DotP<35500.f ) { Y = C.Pawn.Location; ThreatLevel+=C.Pawn.HealthMax; } } else bA = true; } if( bA!=bWarningTarget || bB!=bCriticalTarget ) { bWarningTarget = bA; bCriticalTarget = bB; if( DotLight!=none ) DotLight.SetMode(bA,bB); NetUpdateTime = Level.TimeSeconds-1; } if( bB && ThreatLevel>400 ) { bWarningTarget = false; bCriticalTarget = false; RepLaunchPos = Y; GoToState('LaunchMine'); } else if( InstigatorController==none || bNeedsDetonate || (WeaponOwner!=none && WeaponOwner.NumMinesOut>WeaponOwner.MaximumMines) ) { bWarningTarget = false; bCriticalTarget = false; RepLaunchPos = Location + Z*(150.f+FRand()*250.f); GoToState('LaunchMine'); } - } - simulated function PostNetReceive() - { if( RepLaunchPos!=vect(0,0,0) ) GoToState('LaunchMine'); else if( DotLight!=none ) DotLight.SetMode(bWarningTarget,bCriticalTarget); - } -} -defaultproperties -{ -} +Class NiceHopMineProj extends HopMineProj; +#exec obj load file="KF_GrenadeSnd.uax" +#exec OBJ LOAD FILE=ScrnWeaponPack_T.utx +#exec OBJ LOAD FILE=ScrnWeaponPack_SND.uax +#exec OBJ LOAD FILE=ScrnWeaponPack_A.ukx +state OnWall +{ + simulated function BeginState() + { + if ( SmokeTrail != none ) + { + SmokeTrail.HandleOwnerDestroyed(); + SmokeTrail = none; + } + bCollideWorld = False; + bFixedRotationDir = false; + RotationRate = rot(0,0,0); + if( Level.NetMode!=NM_DedicatedServer ) + { + TweenAnim('Down',0.05f); + PlaySound(Sound'ScrnWeaponPack_SND.mine.blade_cut'); + DotLight = Spawn(Class'HopMineLight',,,Location + (vect(0,0,5) << Rotation)); + if( DotLight!=none ) + { + DotLight.SetBase(Self); + DotLight.SetRelativeLocation(vect(0,0,5)); + } + } + if( Level.NetMode!=NM_Client ) + { + NetUpdateFrequency = 1.f; + SetTimer(0.25+FRand()*0.25,true); + } + } + simulated function EndState() + { + if( Level.NetMode!=NM_Client ) + { + SetTimer(0,false); + NetUpdateFrequency = Default.NetUpdateFrequency; + NetUpdateTime = Level.TimeSeconds-1; + } + } + function Timer() + { + local Controller C; + local vector X,Y,Z; + local float DotP; + local int ThreatLevel; + local bool bA,bB; + GetAxes(Rotation,X,Y,Z); + for( C=Level.ControllerList; C!=none; C=C.nextController ) + if( C.Pawn!=none && C.Pawn.Health>0 && VSizeSquared(C.Pawn.Location-Location)<1000000.f ) + { + X = C.Pawn.Location-Location; + DotP = (X Dot Z); + if( DotP<0 ) + continue; + DotP = VSizeSquared(X - (Z * DotP)); + if( DotP>90000.f || !FastTrace(C.Pawn.Location,Location) ) + continue; + if( Monster(C.Pawn)!=none ) + { + bB = true; + if( DotP<35500.f ) + { + Y = C.Pawn.Location; + ThreatLevel+=C.Pawn.HealthMax; + } + } + else bA = true; + } + if( bA!=bWarningTarget || bB!=bCriticalTarget ) + { + bWarningTarget = bA; + bCriticalTarget = bB; + if( DotLight!=none ) + DotLight.SetMode(bA,bB); + NetUpdateTime = Level.TimeSeconds-1; + } + if( bB && ThreatLevel>400 ) + { + bWarningTarget = false; + bCriticalTarget = false; + RepLaunchPos = Y; + GoToState('LaunchMine'); + } + else if( InstigatorController==none || bNeedsDetonate || (WeaponOwner!=none && WeaponOwner.NumMinesOut>WeaponOwner.MaximumMines) ) + { + bWarningTarget = false; + bCriticalTarget = false; + RepLaunchPos = Location + Z*(150.f+FRand()*250.f); + GoToState('LaunchMine'); + } + } + simulated function PostNetReceive() + { + if( RepLaunchPos!=vect(0,0,0) ) + GoToState('LaunchMine'); + else if( DotLight!=none ) + DotLight.SetMode(bWarningTarget,bCriticalTarget); + } +} +defaultproperties +{ +} diff --git a/sources/Weapons/Playable/Explosives/LAW/NiceDamTypeLAWBlunt.uc b/sources/Weapons/Playable/Explosives/LAW/NiceDamTypeLAWBlunt.uc index c42f509..163d0ef 100644 --- a/sources/Weapons/Playable/Explosives/LAW/NiceDamTypeLAWBlunt.uc +++ b/sources/Weapons/Playable/Explosives/LAW/NiceDamTypeLAWBlunt.uc @@ -1,4 +1,5 @@ -class NiceDamTypeLAWBlunt extends NiceDamTypeDemoBlunt; -defaultproperties -{ WeaponClass=Class'NicePack.NiceLAW' -} +class NiceDamTypeLAWBlunt extends NiceDamTypeDemoBlunt; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceLAW' +} diff --git a/sources/Weapons/Playable/Explosives/LAW/NiceDamTypeLAWExplosion.uc b/sources/Weapons/Playable/Explosives/LAW/NiceDamTypeLAWExplosion.uc index 02e7cbf..da45e46 100644 --- a/sources/Weapons/Playable/Explosives/LAW/NiceDamTypeLAWExplosion.uc +++ b/sources/Weapons/Playable/Explosives/LAW/NiceDamTypeLAWExplosion.uc @@ -1,4 +1,5 @@ -class NiceDamTypeLAWExplosion extends NiceDamTypeDemoExplosion; -defaultproperties -{ WeaponClass=Class'NicePack.NiceLAW' -} +class NiceDamTypeLAWExplosion extends NiceDamTypeDemoExplosion; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceLAW' +} diff --git a/sources/Weapons/Playable/Explosives/LAW/NiceLAW.uc b/sources/Weapons/Playable/Explosives/LAW/NiceLAW.uc index d717ee8..05e0806 100644 --- a/sources/Weapons/Playable/Explosives/LAW/NiceLAW.uc +++ b/sources/Weapons/Playable/Explosives/LAW/NiceLAW.uc @@ -1,25 +1,78 @@ -class NiceLAW extends NiceWeapon; -simulated function ZoomIn(bool bAnimateTransition){ - if(Level.TimeSeconds < FireMode[0].NextFireTime) return; - super.ZoomIn(bAnimateTransition); - if(bAnimateTransition){ if(bZoomOutInterrupted) PlayAnim('Raise',1.0,0.1); else PlayAnim('Raise',1.0,0.1); - } -} -simulated function ZoomOut(bool bAnimateTransition){ - super.ZoomOut(false); - if(bAnimateTransition) TweenAnim(IdleAnim,FastZoomOutTime); -} -simulated function PostBeginPlay(){ - local AutoReloadAnimDesc reloadDesc; - autoReloadsDescriptions.Length = 0; - reloadDesc.canInterruptFrame = 0.07; - reloadDesc.trashStartFrame = 0.601; - reloadDesc.resumeFrame = 0.07; - reloadDesc.speedFrame = 0.07; - reloadDesc.animName = 'AimFire'; - autoReloadsDescriptions[0] = reloadDesc; - super.PostBeginPlay(); -} -defaultproperties -{ bChangeClipIcon=True bChangeBulletsIcon=True hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Law_Rocket' hudBulletsTexture=Texture'KillingFloorHUD.HUD.Hud_Law_Rocket' reloadType=RTYPE_AUTO ForceZoomOutOnFireTime=0.100000 MagCapacity=1 ReloadRate=3.000000 bHoldToReload=True WeaponReloadAnim="Reload_LAW" MinimumFireRange=300 Weight=9.000000 bHasAimingMode=True IdleAimAnim="AimIdle" StandardDisplayFOV=75.000000 SleeveNum=3 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Law' bIsTier3Weapon=True MeshRef="KF_Weapons_Trip.LAW_Trip" SkinRefs(0)="KF_Weapons_Trip_T.Supers.law_cmb" SkinRefs(1)="KF_Weapons_Trip_T.Supers.law_reddot_shdr" SkinRefs(2)="KF_Weapons_Trip_T.Supers.rocket_cmb" SelectSoundRef="KF_LAWSnd.LAW_Select" HudImageRef="KillingFloorHUD.WeaponSelect.LAW_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.LAW" PlayerIronSightFOV=90.000000 ZoomTime=0.260000 ZoomedDisplayFOV=65.000000 FireModeClass(0)=Class'NicePack.NiceLAWFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToRocketLauncher" bSniping=False Description="The Light Anti Tank Weapon is, as its name suggests, a military grade heavy weapons platform designed to disable or outright destroy armored vehicles." EffectOffset=(X=50.000000,Y=1.000000,Z=10.000000) DisplayFOV=75.000000 Priority=195 HudColor=(G=0) InventoryGroup=4 GroupOffset=9 PickupClass=Class'NicePack.NiceLAWPickup' PlayerViewOffset=(X=30.000000,Y=30.000000) BobDamping=7.000000 AttachmentClass=Class'NicePack.NiceLAWAttachment' IconCoords=(X1=429,Y1=212,X2=508,Y2=251) ItemName="L.A.W" AmbientGlow=2 -} +class NiceLAW extends NiceWeapon; +simulated function ZoomIn(bool bAnimateTransition){ + if(Level.TimeSeconds < FireMode[0].NextFireTime) + return; + super.ZoomIn(bAnimateTransition); + if(bAnimateTransition){ + if(bZoomOutInterrupted) + PlayAnim('Raise',1.0,0.1); + else + PlayAnim('Raise',1.0,0.1); + } +} +simulated function ZoomOut(bool bAnimateTransition){ + super.ZoomOut(false); + if(bAnimateTransition) + TweenAnim(IdleAnim,FastZoomOutTime); +} +simulated function PostBeginPlay(){ + local AutoReloadAnimDesc reloadDesc; + autoReloadsDescriptions.Length = 0; + reloadDesc.canInterruptFrame = 0.07; + reloadDesc.trashStartFrame = 0.601; + reloadDesc.resumeFrame = 0.07; + reloadDesc.speedFrame = 0.07; + reloadDesc.animName = 'AimFire'; + autoReloadsDescriptions[0] = reloadDesc; + super.PostBeginPlay(); +} +defaultproperties +{ + bChangeClipIcon=True + bChangeBulletsIcon=True + hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Law_Rocket' + hudBulletsTexture=Texture'KillingFloorHUD.HUD.Hud_Law_Rocket' + reloadType=RTYPE_AUTO + ForceZoomOutOnFireTime=0.100000 + MagCapacity=1 + ReloadRate=3.000000 + bHoldToReload=True + WeaponReloadAnim="Reload_LAW" + MinimumFireRange=300 + Weight=9.000000 + bHasAimingMode=True + IdleAimAnim="AimIdle" + StandardDisplayFOV=75.000000 + SleeveNum=3 + TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Law' + bIsTier3Weapon=True + MeshRef="KF_Weapons_Trip.LAW_Trip" + SkinRefs(0)="KF_Weapons_Trip_T.Supers.law_cmb" + SkinRefs(1)="KF_Weapons_Trip_T.Supers.law_reddot_shdr" + SkinRefs(2)="KF_Weapons_Trip_T.Supers.rocket_cmb" + SelectSoundRef="KF_LAWSnd.LAW_Select" + HudImageRef="KillingFloorHUD.WeaponSelect.LAW_unselected" + SelectedHudImageRef="KillingFloorHUD.WeaponSelect.LAW" + PlayerIronSightFOV=90.000000 + ZoomTime=0.260000 + ZoomedDisplayFOV=65.000000 + FireModeClass(0)=Class'NicePack.NiceLAWFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToRocketLauncher" + bSniping=False + Description="The Light Anti Tank Weapon is, as its name suggests, a military grade heavy weapons platform designed to disable or outright destroy armored vehicles." + EffectOffset=(X=50.000000,Y=1.000000,Z=10.000000) + DisplayFOV=75.000000 + Priority=195 + HudColor=(G=0) + InventoryGroup=4 + GroupOffset=9 + PickupClass=Class'NicePack.NiceLAWPickup' + PlayerViewOffset=(X=30.000000,Y=30.000000) + BobDamping=7.000000 + AttachmentClass=Class'NicePack.NiceLAWAttachment' + IconCoords=(X1=429,Y1=212,X2=508,Y2=251) + ItemName="L.A.W" + AmbientGlow=2 +} diff --git a/sources/Weapons/Playable/Explosives/LAW/NiceLAWAmmo.uc b/sources/Weapons/Playable/Explosives/LAW/NiceLAWAmmo.uc index d5aedc8..09a5923 100644 --- a/sources/Weapons/Playable/Explosives/LAW/NiceLAWAmmo.uc +++ b/sources/Weapons/Playable/Explosives/LAW/NiceLAWAmmo.uc @@ -1,5 +1,11 @@ -class NiceLAWAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ AmmoPickupAmount=2 MaxAmmo=20 InitialAmount=5 IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=458,Y1=34,X2=511,Y2=78) ItemName="L.A.W Rockets" -} +class NiceLAWAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + AmmoPickupAmount=2 + MaxAmmo=20 + InitialAmount=5 + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=458,Y1=34,X2=511,Y2=78) + ItemName="L.A.W Rockets" +} diff --git a/sources/Weapons/Playable/Explosives/LAW/NiceLAWAmmoPickup.uc b/sources/Weapons/Playable/Explosives/LAW/NiceLAWAmmoPickup.uc index d0a8a10..a872074 100644 --- a/sources/Weapons/Playable/Explosives/LAW/NiceLAWAmmoPickup.uc +++ b/sources/Weapons/Playable/Explosives/LAW/NiceLAWAmmoPickup.uc @@ -1,4 +1,10 @@ -class NiceLAWAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=2 InventoryType=Class'NicePack.NiceLAWAmmo' PickupMessage="HEAT Rockets" StaticMesh=StaticMesh'KillingFloorStatics.LAWAmmo' DrawScale=0.500000 CollisionRadius=40.000000 -} +class NiceLAWAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=2 + InventoryType=Class'NicePack.NiceLAWAmmo' + PickupMessage="HEAT Rockets" + StaticMesh=StaticMesh'KillingFloorStatics.LAWAmmo' + DrawScale=0.500000 + CollisionRadius=40.000000 +} diff --git a/sources/Weapons/Playable/Explosives/LAW/NiceLAWAttachment.uc b/sources/Weapons/Playable/Explosives/LAW/NiceLAWAttachment.uc index 61f0e79..530588b 100644 --- a/sources/Weapons/Playable/Explosives/LAW/NiceLAWAttachment.uc +++ b/sources/Weapons/Playable/Explosives/LAW/NiceLAWAttachment.uc @@ -1,4 +1,51 @@ -class NiceLAWAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'KFMod.KFLawMuzzFlash' MovementAnims(0)="JogF_LAW" MovementAnims(1)="JogB_LAW" MovementAnims(2)="JogL_LAW" MovementAnims(3)="JogR_LAW" TurnLeftAnim="TurnL_LAW" TurnRightAnim="TurnR_LAW" CrouchAnims(0)="CHwalkF_LAW" CrouchAnims(1)="CHwalkB_LAW" CrouchAnims(2)="CHwalkL_LAW" CrouchAnims(3)="CHwalkR_LAW" WalkAnims(0)="WalkF_LAW" WalkAnims(1)="WalkB_LAW" WalkAnims(2)="WalkL_LAW" WalkAnims(3)="WalkR_LAW" CrouchTurnRightAnim="CH_TurnR_LAW" CrouchTurnLeftAnim="CH_TurnL_LAW" IdleCrouchAnim="CHIdle_LAW" IdleWeaponAnim="Idle_LAW" IdleRestAnim="Idle_LAW" IdleChatAnim="Idle_LAW" IdleHeavyAnim="Idle_LAW" IdleRifleAnim="Idle_LAW" FireAnims(0)="Fire_LAW" FireAnims(1)="Fire_LAW" FireAnims(2)="Fire_LAW" FireAnims(3)="Fire_LAW" FireAltAnims(0)="Fire_LAW" FireAltAnims(1)="Fire_LAW" FireAltAnims(2)="Fire_LAW" FireAltAnims(3)="Fire_LAW" FireCrouchAnims(0)="CHFire_LAW" FireCrouchAnims(1)="CHFire_LAW" FireCrouchAnims(2)="CHFire_LAW" FireCrouchAnims(3)="CHFire_LAW" FireCrouchAltAnims(0)="CHFire_LAW" FireCrouchAltAnims(1)="CHFire_LAW" FireCrouchAltAnims(2)="CHFire_LAW" FireCrouchAltAnims(3)="CHFire_LAW" HitAnims(0)="HitF_LAW" HitAnims(1)="HitB_LAW" HitAnims(2)="HitL_LAW" HitAnims(3)="HitR_LAW" PostFireBlendStandAnim="Blend_LAW" PostFireBlendCrouchAnim="CHBlend_LAW" MeshRef="KF_Weapons3rd_Trip.LAW_3rd" bHeavy=True -} +class NiceLAWAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'KFMod.KFLawMuzzFlash' + MovementAnims(0)="JogF_LAW" + MovementAnims(1)="JogB_LAW" + MovementAnims(2)="JogL_LAW" + MovementAnims(3)="JogR_LAW" + TurnLeftAnim="TurnL_LAW" + TurnRightAnim="TurnR_LAW" + CrouchAnims(0)="CHwalkF_LAW" + CrouchAnims(1)="CHwalkB_LAW" + CrouchAnims(2)="CHwalkL_LAW" + CrouchAnims(3)="CHwalkR_LAW" + WalkAnims(0)="WalkF_LAW" + WalkAnims(1)="WalkB_LAW" + WalkAnims(2)="WalkL_LAW" + WalkAnims(3)="WalkR_LAW" + CrouchTurnRightAnim="CH_TurnR_LAW" + CrouchTurnLeftAnim="CH_TurnL_LAW" + IdleCrouchAnim="CHIdle_LAW" + IdleWeaponAnim="Idle_LAW" + IdleRestAnim="Idle_LAW" + IdleChatAnim="Idle_LAW" + IdleHeavyAnim="Idle_LAW" + IdleRifleAnim="Idle_LAW" + FireAnims(0)="Fire_LAW" + FireAnims(1)="Fire_LAW" + FireAnims(2)="Fire_LAW" + FireAnims(3)="Fire_LAW" + FireAltAnims(0)="Fire_LAW" + FireAltAnims(1)="Fire_LAW" + FireAltAnims(2)="Fire_LAW" + FireAltAnims(3)="Fire_LAW" + FireCrouchAnims(0)="CHFire_LAW" + FireCrouchAnims(1)="CHFire_LAW" + FireCrouchAnims(2)="CHFire_LAW" + FireCrouchAnims(3)="CHFire_LAW" + FireCrouchAltAnims(0)="CHFire_LAW" + FireCrouchAltAnims(1)="CHFire_LAW" + FireCrouchAltAnims(2)="CHFire_LAW" + FireCrouchAltAnims(3)="CHFire_LAW" + HitAnims(0)="HitF_LAW" + HitAnims(1)="HitB_LAW" + HitAnims(2)="HitL_LAW" + HitAnims(3)="HitR_LAW" + PostFireBlendStandAnim="Blend_LAW" + PostFireBlendCrouchAnim="CHBlend_LAW" + MeshRef="KF_Weapons3rd_Trip.LAW_3rd" + bHeavy=True +} diff --git a/sources/Weapons/Playable/Explosives/LAW/NiceLAWPickup.uc b/sources/Weapons/Playable/Explosives/LAW/NiceLAWPickup.uc index d82fbe7..b57207b 100644 --- a/sources/Weapons/Playable/Explosives/LAW/NiceLAWPickup.uc +++ b/sources/Weapons/Playable/Explosives/LAW/NiceLAWPickup.uc @@ -1,5 +1,28 @@ -class NiceLAWPickup extends NiceWeaponPickup; -#exec OBJ LOAD FILE=KillingFloorWeapons.utx -defaultproperties -{ Weight=9.000000 cost=1250 AmmoCost=30 BuyClipSize=1 PowerValue=100 SpeedValue=20 RangeValue=64 Description="Light Anti Tank weapon. Designed to punch through armored vehicles." ItemName="L.A.W" ItemShortName="L.A.W" AmmoItemName="L.A.W Rockets" AmmoMesh=StaticMesh'KillingFloorStatics.LAWAmmo' CorrespondingPerkIndex=6 EquipmentCategoryID=3 MaxDesireability=0.790000 InventoryType=Class'NicePack.NiceLAW' RespawnTime=60.000000 PickupMessage="You got the L.A.W." PickupSound=Sound'KF_LAWSnd.LAW_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.Super.LAW_Pickup' CollisionRadius=35.000000 CollisionHeight=10.000000 -} +class NiceLAWPickup extends NiceWeaponPickup; +#exec OBJ LOAD FILE=KillingFloorWeapons.utx +defaultproperties +{ + Weight=9.000000 + cost=1250 + AmmoCost=30 + BuyClipSize=1 + PowerValue=100 + SpeedValue=20 + RangeValue=64 + Description="Light Anti Tank weapon. Designed to punch through armored vehicles." + ItemName="L.A.W" + ItemShortName="L.A.W" + AmmoItemName="L.A.W Rockets" + AmmoMesh=StaticMesh'KillingFloorStatics.LAWAmmo' + CorrespondingPerkIndex=6 + EquipmentCategoryID=3 + MaxDesireability=0.790000 + InventoryType=Class'NicePack.NiceLAW' + RespawnTime=60.000000 + PickupMessage="You got the L.A.W." + PickupSound=Sound'KF_LAWSnd.LAW_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups_Trip.Super.LAW_Pickup' + CollisionRadius=35.000000 + CollisionHeight=10.000000 +} diff --git a/sources/Weapons/Playable/Explosives/M32/NiceDamTypeM32Blunt.uc b/sources/Weapons/Playable/Explosives/M32/NiceDamTypeM32Blunt.uc index edc3abc..d1a8a72 100644 --- a/sources/Weapons/Playable/Explosives/M32/NiceDamTypeM32Blunt.uc +++ b/sources/Weapons/Playable/Explosives/M32/NiceDamTypeM32Blunt.uc @@ -1,4 +1,5 @@ -class NiceDamTypeM32Blunt extends NiceDamTypeDemoBlunt; -defaultproperties -{ WeaponClass=Class'NicePack.NiceM32GrenadeLauncher' -} +class NiceDamTypeM32Blunt extends NiceDamTypeDemoBlunt; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceM32GrenadeLauncher' +} diff --git a/sources/Weapons/Playable/Explosives/M32/NiceDamTypeM32Explosion.uc b/sources/Weapons/Playable/Explosives/M32/NiceDamTypeM32Explosion.uc index 4ceab5d..1c1a849 100644 --- a/sources/Weapons/Playable/Explosives/M32/NiceDamTypeM32Explosion.uc +++ b/sources/Weapons/Playable/Explosives/M32/NiceDamTypeM32Explosion.uc @@ -1,4 +1,5 @@ -class NiceDamTypeM32Explosion extends NiceDamTypeDemoExplosion; -defaultproperties -{ WeaponClass=Class'NicePack.NiceM32GrenadeLauncher' -} +class NiceDamTypeM32Explosion extends NiceDamTypeDemoExplosion; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceM32GrenadeLauncher' +} diff --git a/sources/Weapons/Playable/Explosives/M32/NiceM32Ammo.uc b/sources/Weapons/Playable/Explosives/M32/NiceM32Ammo.uc index a30865e..b244637 100644 --- a/sources/Weapons/Playable/Explosives/M32/NiceM32Ammo.uc +++ b/sources/Weapons/Playable/Explosives/M32/NiceM32Ammo.uc @@ -1,4 +1,12 @@ -class NiceM32Ammo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceM32Pickup' AmmoPickupAmount=6 MaxAmmo=36 InitialAmount=9 PickupClass=Class'NicePack.NiceM32AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=4,Y1=350,X2=110,Y2=395) ItemName="M32 Grenades" -} +class NiceM32Ammo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceM32Pickup' + AmmoPickupAmount=6 + MaxAmmo=36 + InitialAmount=9 + PickupClass=Class'NicePack.NiceM32AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=4,Y1=350,X2=110,Y2=395) + ItemName="M32 Grenades" +} diff --git a/sources/Weapons/Playable/Explosives/M32/NiceM32AmmoPickup.uc b/sources/Weapons/Playable/Explosives/M32/NiceM32AmmoPickup.uc index f2ede89..bff8c00 100644 --- a/sources/Weapons/Playable/Explosives/M32/NiceM32AmmoPickup.uc +++ b/sources/Weapons/Playable/Explosives/M32/NiceM32AmmoPickup.uc @@ -1,4 +1,9 @@ -class NiceM32AmmoPickup extends KFAmmoPickup; -defaultproperties -{ AmmoAmount=6 InventoryType=Class'NicePack.NiceM32Ammo' PickupMessage="M32 Grenades" StaticMesh=StaticMesh'KillingFloorStatics.FragPickup' CollisionRadius=25.000000 -} +class NiceM32AmmoPickup extends KFAmmoPickup; +defaultproperties +{ + AmmoAmount=6 + InventoryType=Class'NicePack.NiceM32Ammo' + PickupMessage="M32 Grenades" + StaticMesh=StaticMesh'KillingFloorStatics.FragPickup' + CollisionRadius=25.000000 +} diff --git a/sources/Weapons/Playable/Explosives/M32/NiceM32Attachment.uc b/sources/Weapons/Playable/Explosives/M32/NiceM32Attachment.uc index 59738a4..7fa2a6b 100644 --- a/sources/Weapons/Playable/Explosives/M32/NiceM32Attachment.uc +++ b/sources/Weapons/Playable/Explosives/M32/NiceM32Attachment.uc @@ -1,4 +1,50 @@ -class NiceM32Attachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdNadeL' MovementAnims(0)="JogF_M32_MGL" MovementAnims(1)="JogB_M32_MGL" MovementAnims(2)="JogL_M32_MGL" MovementAnims(3)="JogR_M32_MGL" TurnLeftAnim="TurnL_M32_MGL" TurnRightAnim="TurnR_M32_MGL" CrouchAnims(0)="CHWalkF_M32_MGL" CrouchAnims(1)="CHWalkB_M32_MGL" CrouchAnims(2)="CHWalkL_M32_MGL" CrouchAnims(3)="CHWalkR_M32_MGL" WalkAnims(0)="WalkF_M32_MGL" WalkAnims(1)="WalkB_M32_MGL" WalkAnims(2)="WalkL_M32_MGL" WalkAnims(3)="WalkR_M32_MGL" CrouchTurnRightAnim="CH_TurnR_M32_MGL" CrouchTurnLeftAnim="CH_TurnL_M32_MGL" IdleCrouchAnim="CHIdle_M32_MGL" IdleWeaponAnim="Idle_M32_MGL" IdleRestAnim="Idle_M32_MGL" IdleChatAnim="Idle_M32_MGL" IdleHeavyAnim="Idle_M32_MGL" IdleRifleAnim="Idle_M32_MGL" FireAnims(0)="Fire_M32_MGL" FireAnims(1)="Fire_M32_MGL" FireAnims(2)="Fire_M32_MGL" FireAnims(3)="Fire_M32_MGL" FireAltAnims(0)="Fire_M32_MGL" FireAltAnims(1)="Fire_M32_MGL" FireAltAnims(2)="Fire_M32_MGL" FireAltAnims(3)="Fire_M32_MGL" FireCrouchAnims(0)="CHFire_M32_MGL" FireCrouchAnims(1)="CHFire_M32_MGL" FireCrouchAnims(2)="CHFire_M32_MGL" FireCrouchAnims(3)="CHFire_M32_MGL" FireCrouchAltAnims(0)="CHFire_M32_MGL" FireCrouchAltAnims(1)="CHFire_M32_MGL" FireCrouchAltAnims(2)="CHFire_M32_MGL" FireCrouchAltAnims(3)="CHFire_M32_MGL" HitAnims(0)="HitF_M32_MGL" HitAnims(1)="HitB_M32_MGL" HitAnims(2)="HitL_M32_MGL" HitAnims(3)="HitR_M32_MGL" PostFireBlendStandAnim="Blend_M32_MGL" PostFireBlendCrouchAnim="CHBlend_M32_MGL" MeshRef="KF_Weapons3rd2_Trip.M32_MGL_3rd" -} +class NiceM32Attachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdNadeL' + MovementAnims(0)="JogF_M32_MGL" + MovementAnims(1)="JogB_M32_MGL" + MovementAnims(2)="JogL_M32_MGL" + MovementAnims(3)="JogR_M32_MGL" + TurnLeftAnim="TurnL_M32_MGL" + TurnRightAnim="TurnR_M32_MGL" + CrouchAnims(0)="CHWalkF_M32_MGL" + CrouchAnims(1)="CHWalkB_M32_MGL" + CrouchAnims(2)="CHWalkL_M32_MGL" + CrouchAnims(3)="CHWalkR_M32_MGL" + WalkAnims(0)="WalkF_M32_MGL" + WalkAnims(1)="WalkB_M32_MGL" + WalkAnims(2)="WalkL_M32_MGL" + WalkAnims(3)="WalkR_M32_MGL" + CrouchTurnRightAnim="CH_TurnR_M32_MGL" + CrouchTurnLeftAnim="CH_TurnL_M32_MGL" + IdleCrouchAnim="CHIdle_M32_MGL" + IdleWeaponAnim="Idle_M32_MGL" + IdleRestAnim="Idle_M32_MGL" + IdleChatAnim="Idle_M32_MGL" + IdleHeavyAnim="Idle_M32_MGL" + IdleRifleAnim="Idle_M32_MGL" + FireAnims(0)="Fire_M32_MGL" + FireAnims(1)="Fire_M32_MGL" + FireAnims(2)="Fire_M32_MGL" + FireAnims(3)="Fire_M32_MGL" + FireAltAnims(0)="Fire_M32_MGL" + FireAltAnims(1)="Fire_M32_MGL" + FireAltAnims(2)="Fire_M32_MGL" + FireAltAnims(3)="Fire_M32_MGL" + FireCrouchAnims(0)="CHFire_M32_MGL" + FireCrouchAnims(1)="CHFire_M32_MGL" + FireCrouchAnims(2)="CHFire_M32_MGL" + FireCrouchAnims(3)="CHFire_M32_MGL" + FireCrouchAltAnims(0)="CHFire_M32_MGL" + FireCrouchAltAnims(1)="CHFire_M32_MGL" + FireCrouchAltAnims(2)="CHFire_M32_MGL" + FireCrouchAltAnims(3)="CHFire_M32_MGL" + HitAnims(0)="HitF_M32_MGL" + HitAnims(1)="HitB_M32_MGL" + HitAnims(2)="HitL_M32_MGL" + HitAnims(3)="HitR_M32_MGL" + PostFireBlendStandAnim="Blend_M32_MGL" + PostFireBlendCrouchAnim="CHBlend_M32_MGL" + MeshRef="KF_Weapons3rd2_Trip.M32_MGL_3rd" +} diff --git a/sources/Weapons/Playable/Explosives/M32/NiceM32GrenadeLauncher.uc b/sources/Weapons/Playable/Explosives/M32/NiceM32GrenadeLauncher.uc index db94773..7810844 100644 --- a/sources/Weapons/Playable/Explosives/M32/NiceM32GrenadeLauncher.uc +++ b/sources/Weapons/Playable/Explosives/M32/NiceM32GrenadeLauncher.uc @@ -1,8 +1,54 @@ -class NiceM32GrenadeLauncher extends NiceWeapon; -simulated function fillSubReloadStages(){ - // Loading 6 shells during 300 frames tops, with first shell loaded at frame 40, with 49 frames between load moments - generateReloadStages(6, 300, 40, 49); -} -defaultproperties -{ bChangeClipIcon=True bChangeBulletsIcon=True hudClipTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' hudBulletsTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' reloadType=RTYPE_SINGLE MagCapacity=6 ReloadRate=1.634000 ReloadAnim="Reload" ReloadAnimRate=1.000000 bHoldToReload=True WeaponReloadAnim="Reload_M32_MGL" Weight=7.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M32' bIsTier3Weapon=True MeshRef="KF_Weapons2_Trip.M32_MGL_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.Special.M32_cmb" SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" SelectSoundRef="KF_M79Snd.M79_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.M32_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M32" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceM32Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="An advanced semi automatic grenade launcher. Launches high explosive grenades." DisplayFOV=65.000000 Priority=210 InventoryGroup=4 GroupOffset=6 PickupClass=Class'NicePack.NiceM32Pickup' PlayerViewOffset=(X=18.000000,Y=20.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceM32Attachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="M32 Grenade Launcher" LightType=LT_None LightBrightness=0.000000 LightRadius=0.000000 -} +class NiceM32GrenadeLauncher extends NiceWeapon; +simulated function fillSubReloadStages(){ + // Loading 6 shells during 300 frames tops, with first shell loaded at frame 40, with 49 frames between load moments + generateReloadStages(6, 300, 40, 49); +} +defaultproperties +{ + bChangeClipIcon=True + bChangeBulletsIcon=True + hudClipTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' + hudBulletsTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' + reloadType=RTYPE_SINGLE + MagCapacity=6 + ReloadRate=1.634000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + bHoldToReload=True + WeaponReloadAnim="Reload_M32_MGL" + Weight=7.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=65.000000 + SleeveNum=2 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M32' + bIsTier3Weapon=True + MeshRef="KF_Weapons2_Trip.M32_MGL_Trip" + SkinRefs(0)="KF_Weapons2_Trip_T.Special.M32_cmb" + SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" + SelectSoundRef="KF_M79Snd.M79_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.M32_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M32" + PlayerIronSightFOV=70.000000 + ZoomedDisplayFOV=40.000000 + FireModeClass(0)=Class'NicePack.NiceM32Fire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.650000 + CurrentRating=0.650000 + Description="An advanced semi automatic grenade launcher. Launches high explosive grenades." + DisplayFOV=65.000000 + Priority=210 + InventoryGroup=4 + GroupOffset=6 + PickupClass=Class'NicePack.NiceM32Pickup' + PlayerViewOffset=(X=18.000000,Y=20.000000,Z=-6.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceM32Attachment' + IconCoords=(X1=253,Y1=146,X2=333,Y2=181) + ItemName="M32 Grenade Launcher" + LightType=LT_None + LightBrightness=0.000000 + LightRadius=0.000000 +} diff --git a/sources/Weapons/Playable/Explosives/M32/NiceM32Pickup.uc b/sources/Weapons/Playable/Explosives/M32/NiceM32Pickup.uc index 3ac7d90..8aefd29 100644 --- a/sources/Weapons/Playable/Explosives/M32/NiceM32Pickup.uc +++ b/sources/Weapons/Playable/Explosives/M32/NiceM32Pickup.uc @@ -1,5 +1,27 @@ -class NiceM32Pickup extends NiceWeaponPickup; -defaultproperties -{ Weight=7.000000 AmmoCost=60 - cost=1000 BuyClipSize=6 PowerValue=85 SpeedValue=65 RangeValue=75 Description="An advanced semi automatic grenade launcher. Launches high explosive grenades." ItemName="M32 Grenade Launcher" ItemShortName="M32 Launcher" AmmoItemName="M32 Grenades" AmmoMesh=StaticMesh'KillingFloorStatics.XbowAmmo' CorrespondingPerkIndex=6 EquipmentCategoryID=2 VariantClasses(0)=Class'KFMod.CamoM32Pickup' MaxDesireability=0.790000 InventoryType=Class'NicePack.NiceM32GrenadeLauncher' PickupMessage="You got the M32 Multiple Grenade Launcher." PickupSound=Sound'KF_M79Snd.M79_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups2_Trip.Supers.M32_MGL_Pickup' CollisionRadius=25.000000 CollisionHeight=10.000000 -} +class NiceM32Pickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=7.000000 + AmmoCost=60 + cost=1000 + BuyClipSize=6 + PowerValue=85 + SpeedValue=65 + RangeValue=75 + Description="An advanced semi automatic grenade launcher. Launches high explosive grenades." + ItemName="M32 Grenade Launcher" + ItemShortName="M32 Launcher" + AmmoItemName="M32 Grenades" + AmmoMesh=StaticMesh'KillingFloorStatics.XbowAmmo' + CorrespondingPerkIndex=6 + EquipmentCategoryID=2 + VariantClasses(0)=Class'KFMod.CamoM32Pickup' + MaxDesireability=0.790000 + InventoryType=Class'NicePack.NiceM32GrenadeLauncher' + PickupMessage="You got the M32 Multiple Grenade Launcher." + PickupSound=Sound'KF_M79Snd.M79_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups2_Trip.Supers.M32_MGL_Pickup' + CollisionRadius=25.000000 + CollisionHeight=10.000000 +} diff --git a/sources/Weapons/Playable/Explosives/M79/NiceDamTypeM79Blunt.uc b/sources/Weapons/Playable/Explosives/M79/NiceDamTypeM79Blunt.uc index c2a3ce9..3e6f537 100644 --- a/sources/Weapons/Playable/Explosives/M79/NiceDamTypeM79Blunt.uc +++ b/sources/Weapons/Playable/Explosives/M79/NiceDamTypeM79Blunt.uc @@ -1,4 +1,5 @@ -class NiceDamTypeM79Blunt extends NiceDamTypeDemoBlunt; -defaultproperties -{ WeaponClass=Class'NicePack.NiceM79GrenadeLauncher' -} +class NiceDamTypeM79Blunt extends NiceDamTypeDemoBlunt; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceM79GrenadeLauncher' +} diff --git a/sources/Weapons/Playable/Explosives/M79/NiceDamTypeM79Explosion.uc b/sources/Weapons/Playable/Explosives/M79/NiceDamTypeM79Explosion.uc index 7e650fa..f050449 100644 --- a/sources/Weapons/Playable/Explosives/M79/NiceDamTypeM79Explosion.uc +++ b/sources/Weapons/Playable/Explosives/M79/NiceDamTypeM79Explosion.uc @@ -1,4 +1,5 @@ -class NiceDamTypeM79Explosion extends NiceDamTypeDemoExplosion; -defaultproperties -{ WeaponClass=Class'NicePack.NiceM79GrenadeLauncher' -} +class NiceDamTypeM79Explosion extends NiceDamTypeDemoExplosion; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceM79GrenadeLauncher' +} diff --git a/sources/Weapons/Playable/Explosives/M79/NiceM79Ammo.uc b/sources/Weapons/Playable/Explosives/M79/NiceM79Ammo.uc index 0e9a942..469a8b7 100644 --- a/sources/Weapons/Playable/Explosives/M79/NiceM79Ammo.uc +++ b/sources/Weapons/Playable/Explosives/M79/NiceM79Ammo.uc @@ -1,4 +1,12 @@ -class NiceM79Ammo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceM79Pickup' AmmoPickupAmount=3 MaxAmmo=24 InitialAmount=6 PickupClass=Class'NicePack.NiceM79AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=4,Y1=350,X2=110,Y2=395) ItemName="M79 Incendiary Grenades" -} +class NiceM79Ammo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceM79Pickup' + AmmoPickupAmount=3 + MaxAmmo=24 + InitialAmount=6 + PickupClass=Class'NicePack.NiceM79AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=4,Y1=350,X2=110,Y2=395) + ItemName="M79 Incendiary Grenades" +} diff --git a/sources/Weapons/Playable/Explosives/M79/NiceM79AmmoPickup.uc b/sources/Weapons/Playable/Explosives/M79/NiceM79AmmoPickup.uc index 1ee3c36..f3f021a 100644 --- a/sources/Weapons/Playable/Explosives/M79/NiceM79AmmoPickup.uc +++ b/sources/Weapons/Playable/Explosives/M79/NiceM79AmmoPickup.uc @@ -1,4 +1,9 @@ -class NiceM79AmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=3 InventoryType=Class'NicePack.NiceM79Ammo' PickupMessage="M79 Incendiary Grenades" StaticMesh=StaticMesh'KillingFloorStatics.FragPickup' CollisionRadius=25.000000 -} +class NiceM79AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=3 + InventoryType=Class'NicePack.NiceM79Ammo' + PickupMessage="M79 Incendiary Grenades" + StaticMesh=StaticMesh'KillingFloorStatics.FragPickup' + CollisionRadius=25.000000 +} diff --git a/sources/Weapons/Playable/Explosives/M79/NiceM79Attachment.uc b/sources/Weapons/Playable/Explosives/M79/NiceM79Attachment.uc index 8b38369..95adddd 100644 --- a/sources/Weapons/Playable/Explosives/M79/NiceM79Attachment.uc +++ b/sources/Weapons/Playable/Explosives/M79/NiceM79Attachment.uc @@ -1,4 +1,50 @@ -class NiceM79Attachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdNadeL' MovementAnims(0)="JogF_M79" MovementAnims(1)="JogB_M79" MovementAnims(2)="JogL_M79" MovementAnims(3)="JogR_M79" TurnLeftAnim="TurnL_M79" TurnRightAnim="TurnR_M79" CrouchAnims(0)="CHWalkF_M79" CrouchAnims(1)="CHWalkB_M79" CrouchAnims(2)="CHWalkL_M79" CrouchAnims(3)="CHWalkR_M79" WalkAnims(0)="WalkF_M79" WalkAnims(1)="WalkB_M79" WalkAnims(2)="WalkL_M79" WalkAnims(3)="WalkR_M79" CrouchTurnRightAnim="CH_TurnR_M79" CrouchTurnLeftAnim="CH_TurnL_M79" IdleCrouchAnim="CHIdle_M79" IdleWeaponAnim="Idle_M79" IdleRestAnim="Idle_M79" IdleChatAnim="Idle_M79" IdleHeavyAnim="Idle_M79" IdleRifleAnim="Idle_M79" FireAnims(0)="Fire_M79" FireAnims(1)="Fire_M79" FireAnims(2)="Fire_M79" FireAnims(3)="Fire_M79" FireAltAnims(0)="Fire_M79" FireAltAnims(1)="Fire_M79" FireAltAnims(2)="Fire_M79" FireAltAnims(3)="Fire_M79" FireCrouchAnims(0)="CHFire_M79" FireCrouchAnims(1)="CHFire_M79" FireCrouchAnims(2)="CHFire_M79" FireCrouchAnims(3)="CHFire_M79" FireCrouchAltAnims(0)="CHFire_M79" FireCrouchAltAnims(1)="CHFire_M79" FireCrouchAltAnims(2)="CHFire_M79" FireCrouchAltAnims(3)="CHFire_M79" HitAnims(0)="HitF_M79" HitAnims(1)="HitB_M79" HitAnims(2)="HitL_M79" HitAnims(3)="HitR_M79" PostFireBlendStandAnim="Blend_M79" PostFireBlendCrouchAnim="CHBlend_M79" MeshRef="KF_Weapons3rd2_Trip.M79_3rd" -} +class NiceM79Attachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdNadeL' + MovementAnims(0)="JogF_M79" + MovementAnims(1)="JogB_M79" + MovementAnims(2)="JogL_M79" + MovementAnims(3)="JogR_M79" + TurnLeftAnim="TurnL_M79" + TurnRightAnim="TurnR_M79" + CrouchAnims(0)="CHWalkF_M79" + CrouchAnims(1)="CHWalkB_M79" + CrouchAnims(2)="CHWalkL_M79" + CrouchAnims(3)="CHWalkR_M79" + WalkAnims(0)="WalkF_M79" + WalkAnims(1)="WalkB_M79" + WalkAnims(2)="WalkL_M79" + WalkAnims(3)="WalkR_M79" + CrouchTurnRightAnim="CH_TurnR_M79" + CrouchTurnLeftAnim="CH_TurnL_M79" + IdleCrouchAnim="CHIdle_M79" + IdleWeaponAnim="Idle_M79" + IdleRestAnim="Idle_M79" + IdleChatAnim="Idle_M79" + IdleHeavyAnim="Idle_M79" + IdleRifleAnim="Idle_M79" + FireAnims(0)="Fire_M79" + FireAnims(1)="Fire_M79" + FireAnims(2)="Fire_M79" + FireAnims(3)="Fire_M79" + FireAltAnims(0)="Fire_M79" + FireAltAnims(1)="Fire_M79" + FireAltAnims(2)="Fire_M79" + FireAltAnims(3)="Fire_M79" + FireCrouchAnims(0)="CHFire_M79" + FireCrouchAnims(1)="CHFire_M79" + FireCrouchAnims(2)="CHFire_M79" + FireCrouchAnims(3)="CHFire_M79" + FireCrouchAltAnims(0)="CHFire_M79" + FireCrouchAltAnims(1)="CHFire_M79" + FireCrouchAltAnims(2)="CHFire_M79" + FireCrouchAltAnims(3)="CHFire_M79" + HitAnims(0)="HitF_M79" + HitAnims(1)="HitB_M79" + HitAnims(2)="HitL_M79" + HitAnims(3)="HitR_M79" + PostFireBlendStandAnim="Blend_M79" + PostFireBlendCrouchAnim="CHBlend_M79" + MeshRef="KF_Weapons3rd2_Trip.M79_3rd" +} diff --git a/sources/Weapons/Playable/Explosives/M79/NiceM79GrenadeLauncher.uc b/sources/Weapons/Playable/Explosives/M79/NiceM79GrenadeLauncher.uc index d5121c5..707a825 100644 --- a/sources/Weapons/Playable/Explosives/M79/NiceM79GrenadeLauncher.uc +++ b/sources/Weapons/Playable/Explosives/M79/NiceM79GrenadeLauncher.uc @@ -1,17 +1,60 @@ -class NiceM79GrenadeLauncher extends NiceWeapon; -simulated function PostBeginPlay(){ - local AutoReloadAnimDesc reloadDesc; - autoReloadsDescriptions.Length = 0; - reloadDesc.canInterruptFrame = 0.101; - reloadDesc.trashStartFrame = 0.65;//0.869; - reloadDesc.resumeFrame = 0.101; - reloadDesc.speedFrame = 0.101; - reloadDesc.animName = 'Fire'; - autoReloadsDescriptions[0] = reloadDesc; - reloadDesc.animName = 'Iron_Fire'; - autoReloadsDescriptions[1] = reloadDesc; - super.PostBeginPlay(); -} -defaultproperties -{ bChangeClipIcon=True bChangeBulletsIcon=True hudClipTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' hudBulletsTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' reloadType=RTYPE_AUTO ForceZoomOutOnFireTime=0.400000 MagCapacity=1 ReloadRate=0.010000 ReloadAnimRate=1.000000 bHoldToReload=True Weight=4.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M79' bIsTier2Weapon=True MeshRef="KF_Weapons2_Trip.M79_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.Special.M79_cmb" SelectSoundRef="KF_M79Snd.M79_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.M79_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M79" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceM79Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="A classic Vietnam era grenade launcher. Launches single high explosive grenades." DisplayFOV=65.000000 Priority=162 InventoryGroup=3 GroupOffset=11 PickupClass=Class'NicePack.NiceM79Pickup' PlayerViewOffset=(X=18.000000,Y=20.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceM79Attachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="M79 Grenade Launcher" LightType=LT_None LightBrightness=0.000000 LightRadius=0.000000 -} +class NiceM79GrenadeLauncher extends NiceWeapon; +simulated function PostBeginPlay(){ + local AutoReloadAnimDesc reloadDesc; + autoReloadsDescriptions.Length = 0; + reloadDesc.canInterruptFrame = 0.101; + reloadDesc.trashStartFrame = 0.65;//0.869; + reloadDesc.resumeFrame = 0.101; + reloadDesc.speedFrame = 0.101; + reloadDesc.animName = 'Fire'; + autoReloadsDescriptions[0] = reloadDesc; + reloadDesc.animName = 'Iron_Fire'; + autoReloadsDescriptions[1] = reloadDesc; + super.PostBeginPlay(); +} +defaultproperties +{ + bChangeClipIcon=True + bChangeBulletsIcon=True + hudClipTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' + hudBulletsTexture=Texture'KillingFloor2HUD.HUD.Hud_M79' + reloadType=RTYPE_AUTO + ForceZoomOutOnFireTime=0.400000 + MagCapacity=1 + ReloadRate=0.010000 + ReloadAnimRate=1.000000 + bHoldToReload=True + Weight=4.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=65.000000 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M79' + bIsTier2Weapon=True + MeshRef="KF_Weapons2_Trip.M79_Trip" + SkinRefs(0)="KF_Weapons2_Trip_T.Special.M79_cmb" + SelectSoundRef="KF_M79Snd.M79_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.M79_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M79" + PlayerIronSightFOV=70.000000 + ZoomedDisplayFOV=45.000000 + FireModeClass(0)=Class'NicePack.NiceM79Fire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.650000 + CurrentRating=0.650000 + Description="A classic Vietnam era grenade launcher. Launches single high explosive grenades." + DisplayFOV=65.000000 + Priority=162 + InventoryGroup=3 + GroupOffset=11 + PickupClass=Class'NicePack.NiceM79Pickup' + PlayerViewOffset=(X=18.000000,Y=20.000000,Z=-6.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceM79Attachment' + IconCoords=(X1=253,Y1=146,X2=333,Y2=181) + ItemName="M79 Grenade Launcher" + LightType=LT_None + LightBrightness=0.000000 + LightRadius=0.000000 +} diff --git a/sources/Weapons/Playable/Explosives/M79/NiceM79Pickup.uc b/sources/Weapons/Playable/Explosives/M79/NiceM79Pickup.uc index 6b5a6cd..856f63f 100644 --- a/sources/Weapons/Playable/Explosives/M79/NiceM79Pickup.uc +++ b/sources/Weapons/Playable/Explosives/M79/NiceM79Pickup.uc @@ -1,4 +1,28 @@ -class NiceM79Pickup extends NiceWeaponPickup; -defaultproperties -{ crossPerkIndecies(0)=10 Weight=4.000000 cost=250 AmmoCost=10 BuyClipSize=3 PowerValue=85 SpeedValue=5 RangeValue=75 Description="A classic Vietnam era grenade launcher. Launches single high explosive grenades." ItemName="M79 Grenade Launcher" ItemShortName="M79 Launcher" AmmoItemName="M79 Grenades" AmmoMesh=StaticMesh'KillingFloorStatics.XbowAmmo' CorrespondingPerkIndex=6 EquipmentCategoryID=2 VariantClasses(0)=Class'KFMod.GoldenM79Pickup' MaxDesireability=0.790000 InventoryType=Class'NicePack.NiceM79GrenadeLauncher' PickupMessage="You got the M79 Grenade Launcher." PickupSound=Sound'KF_M79Snd.M79_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups2_Trip.Supers.M79_Pickup' CollisionRadius=25.000000 CollisionHeight=10.000000 -} +class NiceM79Pickup extends NiceWeaponPickup; +defaultproperties +{ + crossPerkIndecies(0)=10 + Weight=4.000000 + cost=250 + AmmoCost=10 + BuyClipSize=3 + PowerValue=85 + SpeedValue=5 + RangeValue=75 + Description="A classic Vietnam era grenade launcher. Launches single high explosive grenades." + ItemName="M79 Grenade Launcher" + ItemShortName="M79 Launcher" + AmmoItemName="M79 Grenades" + AmmoMesh=StaticMesh'KillingFloorStatics.XbowAmmo' + CorrespondingPerkIndex=6 + EquipmentCategoryID=2 + VariantClasses(0)=Class'KFMod.GoldenM79Pickup' + MaxDesireability=0.790000 + InventoryType=Class'NicePack.NiceM79GrenadeLauncher' + PickupMessage="You got the M79 Grenade Launcher." + PickupSound=Sound'KF_M79Snd.M79_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups2_Trip.Supers.M79_Pickup' + CollisionRadius=25.000000 + CollisionHeight=10.000000 +} diff --git a/sources/Weapons/Playable/Explosives/PipeBombs/NiceDamTypePipeBomb.uc b/sources/Weapons/Playable/Explosives/PipeBombs/NiceDamTypePipeBomb.uc index 9dcb6bf..21da34a 100644 --- a/sources/Weapons/Playable/Explosives/PipeBombs/NiceDamTypePipeBomb.uc +++ b/sources/Weapons/Playable/Explosives/PipeBombs/NiceDamTypePipeBomb.uc @@ -1,12 +1,28 @@ -class NiceDamTypePipeBomb extends NiceWeaponDamageType; -static function GetHitEffects(out class HitEffects[4], int VictimHealth) -{ - HitEffects[0] = class'HitSmoke'; - if(VictimHealth <= 0) - HitEffects[1] = class'KFHitFlame'; - else if (FRand() < 0.8) - HitEffects[1] = class'KFHitFlame'; -} -defaultproperties -{ bIsExplosive=True bCheckForHeadShots=False WeaponClass=Class'NicePack.NicePipeBombExplosive' DeathString="%o filled %k's body with shrapnel." FemaleSuicide="%o blew up." MaleSuicide="%o blew up." bLocationalHit=False bThrowRagdoll=True bExtraMomentumZ=True DamageThreshold=1 DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' DeathOverlayTime=999.000000 KDamageImpulse=4000.000000 KDeathVel=300.000000 KDeathUpKick=800.000000 HumanObliterationThreshhold=600 -} +class NiceDamTypePipeBomb extends NiceWeaponDamageType; +static function GetHitEffects(out class HitEffects[4], int VictimHealth) +{ + HitEffects[0] = class'HitSmoke'; + if(VictimHealth <= 0) + HitEffects[1] = class'KFHitFlame'; + else if (FRand() < 0.8) + HitEffects[1] = class'KFHitFlame'; +} +defaultproperties +{ + bIsExplosive=True + bCheckForHeadShots=False + WeaponClass=Class'NicePack.NicePipeBombExplosive' + DeathString="%o filled %k's body with shrapnel." + FemaleSuicide="%o blew up." + MaleSuicide="%o blew up." + bLocationalHit=False + bThrowRagdoll=True + bExtraMomentumZ=True + DamageThreshold=1 + DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' + DeathOverlayTime=999.000000 + KDamageImpulse=4000.000000 + KDeathVel=300.000000 + KDeathUpKick=800.000000 + HumanObliterationThreshhold=600 +} diff --git a/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombExplosive.uc b/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombExplosive.uc index 34fb69b..975be2b 100644 --- a/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombExplosive.uc +++ b/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombExplosive.uc @@ -1,4 +1,7 @@ -class NicePipeBombExplosive extends ScrnPipeBombExplosive; -defaultproperties -{ FireModeClass(0)=Class'NicePack.NicePipeBombFire' PickupClass=Class'NicePack.NicePipeBombPickup' ItemName="PipeBomb NW" -} +class NicePipeBombExplosive extends ScrnPipeBombExplosive; +defaultproperties +{ + FireModeClass(0)=Class'NicePack.NicePipeBombFire' + PickupClass=Class'NicePack.NicePipeBombPickup' + ItemName="PipeBomb NW" +} diff --git a/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombFire.uc b/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombFire.uc index f3854ba..6ce57bf 100644 --- a/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombFire.uc +++ b/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombFire.uc @@ -1,4 +1,5 @@ -class NicePipeBombFire extends ScrnPipeBombFire; -defaultproperties -{ ProjectileClass=Class'NicePack.NicePipeBombProjectile' -} +class NicePipeBombFire extends ScrnPipeBombFire; +defaultproperties +{ + ProjectileClass=Class'NicePack.NicePipeBombProjectile' +} diff --git a/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombPickup.uc b/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombPickup.uc index c2741f6..3f116fa 100644 --- a/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombPickup.uc +++ b/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombPickup.uc @@ -1,4 +1,10 @@ -class NicePipeBombPickup extends ScrnPipeBombPickup; -defaultproperties -{ cost=100 AmmoCost=100 ItemName="Pipe Bomb NW" ItemShortName="Pipe Bomb NW" AmmoItemName="Pipe Bomb NW" InventoryType=Class'NicePack.NicePipeBombExplosive' -} +class NicePipeBombPickup extends ScrnPipeBombPickup; +defaultproperties +{ + cost=100 + AmmoCost=100 + ItemName="Pipe Bomb NW" + ItemShortName="Pipe Bomb NW" + AmmoItemName="Pipe Bomb NW" + InventoryType=Class'NicePack.NicePipeBombExplosive' +} diff --git a/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombProjectile.uc b/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombProjectile.uc index dd1a8e3..cdc9639 100644 --- a/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombProjectile.uc +++ b/sources/Weapons/Playable/Explosives/PipeBombs/NicePipeBombProjectile.uc @@ -1,15 +1,22 @@ -class NicePipeBombProjectile extends ScrnPipeBombProjectile; -function TakeDamage(int Damage, Pawn instigatedBy, Vector Hitlocation, Vector Momentum, class damageType, optional int HitIndex){ - local bool bIsFakePlayer; - if(KFMonster(instigatedBy) != none && KFMonster(instigatedBy).Health <= 0) return; - if(damageType == class'NiceDamTypePipeBomb' || Damage < 5 || (Damage < 25 && damageType.IsA('SirenScreamDamage'))) return; - bIsFakePlayer = (KFPawn(instigatedBy) != none || FakePlayerPawn(instigatedBy) != none) && (instigatedBy.PlayerReplicationInfo == none || instigatedBy.PlayerReplicationInfo.bOnlySpectator); - bIsFakePlayer = bIsFakePlayer || (instigatedBy == none && !DamageType.default.bCausedByWorld); - // Don't let our own explosives blow this up!!! - if(bIsFakePlayer || (KFPawn(instigatedBy) != none && Instigator != none && Instigator != instigatedBy)) return; - if(damageType == class'SirenScreamDamage') Disintegrate(HitLocation, vect(0,0,1)); - else Explode(HitLocation, vect(0,0,1)); -} -defaultproperties -{ Damage=2000.000000 MyDamageType=Class'NicePack.NiceDamTypePipeBomb' -} +class NicePipeBombProjectile extends ScrnPipeBombProjectile; +function TakeDamage(int Damage, Pawn instigatedBy, Vector Hitlocation, Vector Momentum, class damageType, optional int HitIndex){ + local bool bIsFakePlayer; + if(KFMonster(instigatedBy) != none && KFMonster(instigatedBy).Health <= 0) + return; + if(damageType == class'NiceDamTypePipeBomb' || Damage < 5 || (Damage < 25 && damageType.IsA('SirenScreamDamage'))) + return; + bIsFakePlayer = (KFPawn(instigatedBy) != none || FakePlayerPawn(instigatedBy) != none) && (instigatedBy.PlayerReplicationInfo == none || instigatedBy.PlayerReplicationInfo.bOnlySpectator); + bIsFakePlayer = bIsFakePlayer || (instigatedBy == none && !DamageType.default.bCausedByWorld); + // Don't let our own explosives blow this up!!! + if(bIsFakePlayer || (KFPawn(instigatedBy) != none && Instigator != none && Instigator != instigatedBy)) + return; + if(damageType == class'SirenScreamDamage') + Disintegrate(HitLocation, vect(0,0,1)); + else + Explode(HitLocation, vect(0,0,1)); +} +defaultproperties +{ + Damage=2000.000000 + MyDamageType=Class'NicePack.NiceDamTypePipeBomb' +} diff --git a/sources/Weapons/Playable/Explosives/SealSqueal/NiceDamTypeSealSquealBlunt.uc b/sources/Weapons/Playable/Explosives/SealSqueal/NiceDamTypeSealSquealBlunt.uc index 0f08ded..d1c5c21 100644 --- a/sources/Weapons/Playable/Explosives/SealSqueal/NiceDamTypeSealSquealBlunt.uc +++ b/sources/Weapons/Playable/Explosives/SealSqueal/NiceDamTypeSealSquealBlunt.uc @@ -1,5 +1,6 @@ -class NiceDamTypeSealSquealBlunt extends NiceDamTypeDemoBlunt - abstract; -defaultproperties -{ WeaponClass=Class'NicePack.NiceSealSquealHarpoonBomber' -} +class NiceDamTypeSealSquealBlunt extends NiceDamTypeDemoBlunt + abstract; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceSealSquealHarpoonBomber' +} diff --git a/sources/Weapons/Playable/Explosives/SealSqueal/NiceDamTypeSealSquealExplosion.uc b/sources/Weapons/Playable/Explosives/SealSqueal/NiceDamTypeSealSquealExplosion.uc index a7f5e23..2a1ce9a 100644 --- a/sources/Weapons/Playable/Explosives/SealSqueal/NiceDamTypeSealSquealExplosion.uc +++ b/sources/Weapons/Playable/Explosives/SealSqueal/NiceDamTypeSealSquealExplosion.uc @@ -1,4 +1,6 @@ -class NiceDamTypeSealSquealExplosion extends NiceDamTypeDemoExplosion; -defaultproperties -{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceSealSquealHarpoonBomber' -} +class NiceDamTypeSealSquealExplosion extends NiceDamTypeDemoExplosion; +defaultproperties +{ + HeadShotDamageMult=1.500000 + WeaponClass=Class'NicePack.NiceSealSquealHarpoonBomber' +} diff --git a/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAmmo.uc b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAmmo.uc index e95265a..a8e2065 100644 --- a/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAmmo.uc +++ b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAmmo.uc @@ -1,4 +1,11 @@ -class NiceSealSquealAmmo extends NiceAmmo; -defaultproperties -{ AmmoPickupAmount=3 MaxAmmo=24 InitialAmount=6 PickupClass=Class'NicePack.NiceSealSquealAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=4,Y1=350,X2=110,Y2=395) ItemName="SealSqueal Harpoon Bombs" -} +class NiceSealSquealAmmo extends NiceAmmo; +defaultproperties +{ + AmmoPickupAmount=3 + MaxAmmo=24 + InitialAmount=6 + PickupClass=Class'NicePack.NiceSealSquealAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=4,Y1=350,X2=110,Y2=395) + ItemName="SealSqueal Harpoon Bombs" +} diff --git a/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAmmoPickup.uc b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAmmoPickup.uc index 17d93c8..dd5ddfe 100644 --- a/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAmmoPickup.uc +++ b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAmmoPickup.uc @@ -1,4 +1,9 @@ -class NiceSealSquealAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=3 InventoryType=Class'NicePack.NiceSealSquealAmmo' PickupMessage="SealSqueal Harpoon Bombs" StaticMesh=StaticMesh'KillingFloorStatics.FragPickup' CollisionRadius=25.000000 -} +class NiceSealSquealAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=3 + InventoryType=Class'NicePack.NiceSealSquealAmmo' + PickupMessage="SealSqueal Harpoon Bombs" + StaticMesh=StaticMesh'KillingFloorStatics.FragPickup' + CollisionRadius=25.000000 +} diff --git a/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAttachment.uc b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAttachment.uc index ece4e8a..6841388 100644 --- a/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAttachment.uc +++ b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealAttachment.uc @@ -1,4 +1,50 @@ -class NiceSealSquealAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'KFMod.SealSquealMuzzleFlash3P' MovementAnims(0)="JogF_IJC_SealSqueal" MovementAnims(1)="JogB_IJC_SealSqueal" MovementAnims(2)="JogL_IJC_SealSqueal" MovementAnims(3)="JogR_IJC_SealSqueal" TurnLeftAnim="TurnL_IJC_SealSqueal" TurnRightAnim="TurnR_IJC_SealSqueal" CrouchAnims(0)="CHWalkF_IJC_SealSqueal" CrouchAnims(1)="CHWalkB_IJC_SealSqueal" CrouchAnims(2)="CHWalkL_IJC_SealSqueal" CrouchAnims(3)="CHWalkR_IJC_SealSqueal" WalkAnims(0)="WalkF_IJC_SealSqueal" WalkAnims(1)="WalkB_IJC_SealSqueal" WalkAnims(2)="WalkL_IJC_SealSqueal" WalkAnims(3)="WalkR_IJC_SealSqueal" CrouchTurnRightAnim="CH_TurnR_IJC_SealSqueal" CrouchTurnLeftAnim="CH_TurnL_IJC_SealSqueal" IdleCrouchAnim="CHIdle_IJC_SealSqueal" IdleWeaponAnim="Idle_IJC_SealSqueal" IdleRestAnim="Idle_IJC_SealSqueal" IdleChatAnim="Idle_IJC_SealSqueal" IdleHeavyAnim="Idle_IJC_SealSqueal" IdleRifleAnim="Idle_IJC_SealSqueal" FireAnims(0)="Fire_IJC_SealSqueal" FireAnims(1)="Fire_IJC_SealSqueal" FireAnims(2)="Fire_IJC_SealSqueal" FireAnims(3)="Fire_IJC_SealSqueal" FireAltAnims(0)="Fire_IJC_SealSqueal" FireAltAnims(1)="Fire_IJC_SealSqueal" FireAltAnims(2)="Fire_IJC_SealSqueal" FireAltAnims(3)="Fire_IJC_SealSqueal" FireCrouchAnims(0)="CHFire_IJC_SealSqueal" FireCrouchAnims(1)="CHFire_IJC_SealSqueal" FireCrouchAnims(2)="CHFire_IJC_SealSqueal" FireCrouchAnims(3)="CHFire_IJC_SealSqueal" FireCrouchAltAnims(0)="CHFire_IJC_SealSqueal" FireCrouchAltAnims(1)="CHFire_IJC_SealSqueal" FireCrouchAltAnims(2)="CHFire_IJC_SealSqueal" FireCrouchAltAnims(3)="CHFire_IJC_SealSqueal" HitAnims(0)="HitF_IJC_SealSqueal" HitAnims(1)="HitB_IJC_SealSqueal" HitAnims(2)="HitL_IJC_SealSqueal" HitAnims(3)="HitR_IJC_SealSqueal" PostFireBlendStandAnim="Blend_IJC_SealSqueal" PostFireBlendCrouchAnim="CHBlend_IJC_SealSqueal" MeshRef="KF_Weapons3rd3_IJC.SealSqueal_3rd" -} +class NiceSealSquealAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'KFMod.SealSquealMuzzleFlash3P' + MovementAnims(0)="JogF_IJC_SealSqueal" + MovementAnims(1)="JogB_IJC_SealSqueal" + MovementAnims(2)="JogL_IJC_SealSqueal" + MovementAnims(3)="JogR_IJC_SealSqueal" + TurnLeftAnim="TurnL_IJC_SealSqueal" + TurnRightAnim="TurnR_IJC_SealSqueal" + CrouchAnims(0)="CHWalkF_IJC_SealSqueal" + CrouchAnims(1)="CHWalkB_IJC_SealSqueal" + CrouchAnims(2)="CHWalkL_IJC_SealSqueal" + CrouchAnims(3)="CHWalkR_IJC_SealSqueal" + WalkAnims(0)="WalkF_IJC_SealSqueal" + WalkAnims(1)="WalkB_IJC_SealSqueal" + WalkAnims(2)="WalkL_IJC_SealSqueal" + WalkAnims(3)="WalkR_IJC_SealSqueal" + CrouchTurnRightAnim="CH_TurnR_IJC_SealSqueal" + CrouchTurnLeftAnim="CH_TurnL_IJC_SealSqueal" + IdleCrouchAnim="CHIdle_IJC_SealSqueal" + IdleWeaponAnim="Idle_IJC_SealSqueal" + IdleRestAnim="Idle_IJC_SealSqueal" + IdleChatAnim="Idle_IJC_SealSqueal" + IdleHeavyAnim="Idle_IJC_SealSqueal" + IdleRifleAnim="Idle_IJC_SealSqueal" + FireAnims(0)="Fire_IJC_SealSqueal" + FireAnims(1)="Fire_IJC_SealSqueal" + FireAnims(2)="Fire_IJC_SealSqueal" + FireAnims(3)="Fire_IJC_SealSqueal" + FireAltAnims(0)="Fire_IJC_SealSqueal" + FireAltAnims(1)="Fire_IJC_SealSqueal" + FireAltAnims(2)="Fire_IJC_SealSqueal" + FireAltAnims(3)="Fire_IJC_SealSqueal" + FireCrouchAnims(0)="CHFire_IJC_SealSqueal" + FireCrouchAnims(1)="CHFire_IJC_SealSqueal" + FireCrouchAnims(2)="CHFire_IJC_SealSqueal" + FireCrouchAnims(3)="CHFire_IJC_SealSqueal" + FireCrouchAltAnims(0)="CHFire_IJC_SealSqueal" + FireCrouchAltAnims(1)="CHFire_IJC_SealSqueal" + FireCrouchAltAnims(2)="CHFire_IJC_SealSqueal" + FireCrouchAltAnims(3)="CHFire_IJC_SealSqueal" + HitAnims(0)="HitF_IJC_SealSqueal" + HitAnims(1)="HitB_IJC_SealSqueal" + HitAnims(2)="HitL_IJC_SealSqueal" + HitAnims(3)="HitR_IJC_SealSqueal" + PostFireBlendStandAnim="Blend_IJC_SealSqueal" + PostFireBlendCrouchAnim="CHBlend_IJC_SealSqueal" + MeshRef="KF_Weapons3rd3_IJC.SealSqueal_3rd" +} diff --git a/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealPickup.uc b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealPickup.uc index 1c72cf7..70b915e 100644 --- a/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealPickup.uc +++ b/sources/Weapons/Playable/Explosives/SealSqueal/NiceSealSquealPickup.uc @@ -1,4 +1,25 @@ -class NiceSealSquealPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=6.000000 cost=750 AmmoCost=30 BuyClipSize=3 PowerValue=90 SpeedValue=35 RangeValue=85 Description="Shoot the zeds with this harpoon gun and watch them squeal.. and then explode!" ItemName="SealSqueal Harpoon Bomber" ItemShortName="SealSqueal" AmmoItemName="SealSqueal Harpoon Bombs" CorrespondingPerkIndex=6 EquipmentCategoryID=2 MaxDesireability=0.790000 InventoryType=Class'NicePack.NiceSealSquealHarpoonBomber' PickupMessage="You got the SealSqueal Harpoon Bomb Launcher." PickupSound=Sound'KF_FY_SealSquealSND.foley.WEP_Harpoon_Foley_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_IJC_Halloween_Weps2.SealSqueal_Pickup' CollisionRadius=25.000000 CollisionHeight=10.000000 -} +class NiceSealSquealPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=6.000000 + cost=750 + AmmoCost=30 + BuyClipSize=3 + PowerValue=90 + SpeedValue=35 + RangeValue=85 + Description="Shoot the zeds with this harpoon gun and watch them squeal.. and then explode!" + ItemName="SealSqueal Harpoon Bomber" + ItemShortName="SealSqueal" + AmmoItemName="SealSqueal Harpoon Bombs" + CorrespondingPerkIndex=6 + EquipmentCategoryID=2 + MaxDesireability=0.790000 + InventoryType=Class'NicePack.NiceSealSquealHarpoonBomber' + PickupMessage="You got the SealSqueal Harpoon Bomb Launcher." + PickupSound=Sound'KF_FY_SealSquealSND.foley.WEP_Harpoon_Foley_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_IJC_Halloween_Weps2.SealSqueal_Pickup' + CollisionRadius=25.000000 + CollisionHeight=10.000000 +} diff --git a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixAmmo.uc b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixAmmo.uc index ff03c8a..6a3c106 100644 --- a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixAmmo.uc +++ b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixAmmo.uc @@ -1,13 +1,16 @@ -//============================================================================= -// SeekerSixAmmo -//============================================================================= -// Ammunition class for the SeekerSix mini rocket launcher -//============================================================================= -// Killing Floor Source -// Copyright (C) 2013 Tripwire Interactive LLC -// - John "Ramm-Jaeger" Gibson -//============================================================================= -class NiceSeekerSixAmmo extends SeekerSixAmmo; -defaultproperties -{ MaxAmmo=66 InitialAmount=30 PickupClass=Class'NicePack.NiceSeekerSixAmmoPickup' -} +//============================================================================= +// SeekerSixAmmo +//============================================================================= +// Ammunition class for the SeekerSix mini rocket launcher +//============================================================================= +// Killing Floor Source +// Copyright (C) 2013 Tripwire Interactive LLC +// - John "Ramm-Jaeger" Gibson +//============================================================================= +class NiceSeekerSixAmmo extends SeekerSixAmmo; +defaultproperties +{ + MaxAmmo=66 + InitialAmount=30 + PickupClass=Class'NicePack.NiceSeekerSixAmmoPickup' +} diff --git a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixAmmoPickup.uc b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixAmmoPickup.uc index a99a624..8eebfdd 100644 --- a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixAmmoPickup.uc +++ b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixAmmoPickup.uc @@ -1,4 +1,5 @@ -class NiceSeekerSixAmmoPickup extends SeekerSixAmmoPickup; -defaultproperties -{ InventoryType=Class'NicePack.NiceSeekerSixAmmo' -} +class NiceSeekerSixAmmoPickup extends SeekerSixAmmoPickup; +defaultproperties +{ + InventoryType=Class'NicePack.NiceSeekerSixAmmo' +} diff --git a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixFire.uc b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixFire.uc index 74b2686..3e22990 100644 --- a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixFire.uc +++ b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixFire.uc @@ -1,13 +1,15 @@ -//============================================================================= -// SeekerSixFire -//============================================================================= -// Primary fire class for the SeekerSix mini rocket launcher -//============================================================================= -// Killing Floor Source -// Copyright (C) 2013 Tripwire Interactive LLC -// - John "Ramm-Jaeger" Gibson -//============================================================================= -class NiceSeekerSixFire extends SeekerSixFire; -defaultproperties -{ AmmoClass=Class'NicePack.NiceSeekerSixAmmo' ProjectileClass=Class'NicePack.NiceSeekerSixRocketProjectile' -} +//============================================================================= +// SeekerSixFire +//============================================================================= +// Primary fire class for the SeekerSix mini rocket launcher +//============================================================================= +// Killing Floor Source +// Copyright (C) 2013 Tripwire Interactive LLC +// - John "Ramm-Jaeger" Gibson +//============================================================================= +class NiceSeekerSixFire extends SeekerSixFire; +defaultproperties +{ + AmmoClass=Class'NicePack.NiceSeekerSixAmmo' + ProjectileClass=Class'NicePack.NiceSeekerSixRocketProjectile' +} diff --git a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixMultiFire.uc b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixMultiFire.uc index 0f39a84..6b79819 100644 --- a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixMultiFire.uc +++ b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixMultiFire.uc @@ -1,4 +1,6 @@ -class NiceSeekerSixMultiFire extends SeekerSixMultiFire; -defaultproperties -{ AmmoClass=Class'NicePack.NiceSeekerSixAmmo' ProjectileClass=Class'NicePack.NiceSeekerSixRocketProjectile' -} +class NiceSeekerSixMultiFire extends SeekerSixMultiFire; +defaultproperties +{ + AmmoClass=Class'NicePack.NiceSeekerSixAmmo' + ProjectileClass=Class'NicePack.NiceSeekerSixRocketProjectile' +} diff --git a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixPickup.uc b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixPickup.uc index 4ebcac1..647ba81 100644 --- a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixPickup.uc +++ b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixPickup.uc @@ -1,4 +1,9 @@ -class NiceSeekerSixPickup extends SeekerSixPickup; -defaultproperties -{ AmmoCost=20 ItemName="SeekerSix Rocket Launcher NW" ItemShortName="SeekerSix NW" InventoryType=Class'NicePack.NiceSeekerSixRocketLauncher' PickupMessage="You got the SeekerSix Mini Rocket Launcher NW." -} +class NiceSeekerSixPickup extends SeekerSixPickup; +defaultproperties +{ + AmmoCost=20 + ItemName="SeekerSix Rocket Launcher NW" + ItemShortName="SeekerSix NW" + InventoryType=Class'NicePack.NiceSeekerSixRocketLauncher' + PickupMessage="You got the SeekerSix Mini Rocket Launcher NW." +} diff --git a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixRocketLauncher.uc b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixRocketLauncher.uc index 44e0781..759bc71 100644 --- a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixRocketLauncher.uc +++ b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixRocketLauncher.uc @@ -1,19 +1,29 @@ -class NiceSeekerSixRocketLauncher extends SeekerSixRocketLauncher; -//============================================================================= -// Functions -//============================================================================= -function Projectile SpawnProjectile(Vector Start, Rotator Dir) -{ - local NiceSeekerSixRocketProjectile Rocket; - local NiceSeekerSixSeekingRocketProjectile SeekingRocket; - bBreakLock = true; - if (bLockedOn && SeekTarget != none) - { SeekingRocket = Spawn(class'NiceSeekerSixSeekingRocketProjectile',,, Start, Dir); SeekingRocket.Seeking = SeekTarget; return SeekingRocket; - } - else - { Rocket = Spawn(class'NiceSeekerSixRocketProjectile',,, Start, Dir); return Rocket; - } -} -defaultproperties -{ AppID=0 FireModeClass(0)=Class'NicePack.NiceSeekerSixFire' FireModeClass(1)=Class'NicePack.NiceSeekerSixMultiFire' PickupClass=Class'NicePack.NiceSeekerSixPickup' ItemName="SeekerSix Rocket Launcher NW" -} +class NiceSeekerSixRocketLauncher extends SeekerSixRocketLauncher; +//============================================================================= +// Functions +//============================================================================= +function Projectile SpawnProjectile(Vector Start, Rotator Dir) +{ + local NiceSeekerSixRocketProjectile Rocket; + local NiceSeekerSixSeekingRocketProjectile SeekingRocket; + bBreakLock = true; + if (bLockedOn && SeekTarget != none) + { + SeekingRocket = Spawn(class'NiceSeekerSixSeekingRocketProjectile',,, Start, Dir); + SeekingRocket.Seeking = SeekTarget; + return SeekingRocket; + } + else + { + Rocket = Spawn(class'NiceSeekerSixRocketProjectile',,, Start, Dir); + return Rocket; + } +} +defaultproperties +{ + AppID=0 + FireModeClass(0)=Class'NicePack.NiceSeekerSixFire' + FireModeClass(1)=Class'NicePack.NiceSeekerSixMultiFire' + PickupClass=Class'NicePack.NiceSeekerSixPickup' + ItemName="SeekerSix Rocket Launcher NW" +} diff --git a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixRocketProjectile.uc b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixRocketProjectile.uc index c853736..ff582a7 100644 --- a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixRocketProjectile.uc +++ b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixRocketProjectile.uc @@ -1,4 +1,6 @@ -class NiceSeekerSixRocketProjectile extends SeekerSixRocketProjectile; -defaultproperties -{ ImpactDamage=150 Damage=250.000000 -} +class NiceSeekerSixRocketProjectile extends SeekerSixRocketProjectile; +defaultproperties +{ + ImpactDamage=150 + Damage=250.000000 +} diff --git a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixSeekingRocketProjectile.uc b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixSeekingRocketProjectile.uc index 3db7342..8a6827f 100644 --- a/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixSeekingRocketProjectile.uc +++ b/sources/Weapons/Playable/Explosives/SeekerSix/NiceSeekerSixSeekingRocketProjectile.uc @@ -1,27 +1,41 @@ -class NiceSeekerSixSeekingRocketProjectile extends NiceSeekerSixRocketProjectile; -var Actor Seeking; -var vector InitialDir; -replication -{ - reliable if( bNetInitial && (Role==ROLE_Authority) ) Seeking, InitialDir; -} -simulated function Timer() -{ - local vector ForceDir; - local float VelMag; - if ( InitialDir == vect(0,0,0) ) InitialDir = Normal(Velocity); - Acceleration = vect(0,0,0); - Super.Timer(); - if ( (Seeking != none) && (Seeking != Instigator) ) - { // Do normal guidance to target. ForceDir = Normal(Seeking.Location - Location); - if( (ForceDir Dot InitialDir) > 0 ) { VelMag = VSize(Velocity); // Increase the multiplier that is currently 0.8 to make the rocket track better if you need to ForceDir = Normal(ForceDir * 0.8 * VelMag + Velocity); Velocity = VelMag * ForceDir; Acceleration += 5 * ForceDir; } // Update rocket so it faces in the direction its going. SetRotation(rotator(Velocity)); - } -} -simulated function PostBeginPlay() -{ - Super.PostBeginPlay(); - SetTimer(0.1, true); -} -defaultproperties -{ -} +class NiceSeekerSixSeekingRocketProjectile extends NiceSeekerSixRocketProjectile; +var Actor Seeking; +var vector InitialDir; +replication +{ + reliable if( bNetInitial && (Role==ROLE_Authority) ) + Seeking, InitialDir; +} +simulated function Timer() +{ + local vector ForceDir; + local float VelMag; + if ( InitialDir == vect(0,0,0) ) + InitialDir = Normal(Velocity); + Acceleration = vect(0,0,0); + Super.Timer(); + if ( (Seeking != none) && (Seeking != Instigator) ) + { + // Do normal guidance to target. + ForceDir = Normal(Seeking.Location - Location); + + if( (ForceDir Dot InitialDir) > 0 ) + { + VelMag = VSize(Velocity); + // Increase the multiplier that is currently 0.8 to make the rocket track better if you need to + ForceDir = Normal(ForceDir * 0.8 * VelMag + Velocity); + Velocity = VelMag * ForceDir; + Acceleration += 5 * ForceDir; + } + // Update rocket so it faces in the direction its going. + SetRotation(rotator(Velocity)); + } +} +simulated function PostBeginPlay() +{ + Super.PostBeginPlay(); + SetTimer(0.1, true); +} +defaultproperties +{ +} diff --git a/sources/Weapons/Playable/Grenades/NiceCryoNade.uc b/sources/Weapons/Playable/Grenades/NiceCryoNade.uc index da4a204..bcfe3ee 100644 --- a/sources/Weapons/Playable/Grenades/NiceCryoNade.uc +++ b/sources/Weapons/Playable/Grenades/NiceCryoNade.uc @@ -1,88 +1,162 @@ -// ScrN copy -class NiceCryoNade extends Nade; -#exec OBJ LOAD FILE=KF_GrenadeSnd.uax -#exec OBJ LOAD FILE=Inf_WeaponsTwo.uax -#exec OBJ LOAD FILE=KF_LAWSnd.uax -// How many times do freezing -var int totalFreezes; -// How often to do freezeing -var float freezeRate; -// The next time that this nade will freeze -var float nextFreezeTime; -// The sound of nade's explosion -var sound explosionSound; -// Whether or not effects have been played yet -var bool bNeedToPlayEffects; -replication -{ - reliable if (Role==ROLE_Authority) bNeedToPlayEffects; -} -simulated function PostNetReceive() -{ - super.PostNetReceive(); - if(!bHasExploded && bNeedToPlayEffects){ bNeedToPlayEffects = false; Explode(Location, vect(0,0,1)); - } -} -simulated function Explode(vector hitLocation, vector hitNormal){ - bHasExploded = true; - BlowUp(hitLocation); - PlaySound(ExplosionSound,,TransientSoundVolume); - if(Role == ROLE_Authority){ bNeedToPlayEffects = true; AmbientSound=Sound'Inf_WeaponsTwo.smoke_loop'; - } - if(EffectIsRelevant(location, false)){ Spawn(class'NiceCryoNadeCloud',,, hitLocation, rotator(vect(0,0,1))); Spawn(explosionDecal, self,, hitLocation, rotator(-hitNormal)); if(level.detailMode >= DM_High) Spawn(class'NiceNitroGroundEffect', self,, location); - } -} -function Timer(){ - if(!bHidden){ if(!bHasExploded) Explode(location, vect(0,0,1)); - } - else if(bDisintegrated){ AmbientSound = none; Destroy(); - } -} -simulated function BlowUp(vector hitLocation){ - DoFreeze(damage, damageRadius, MyDamageType, momentumTransfer, hitLocation); - if(role == ROLE_Authority) MakeNoise(1.0); -} -function DoFreeze( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation){ - local NiceMonster niceZed; - if(bHurtEntry) return; - bHurtEntry = true; - nextFreezeTime = level.timeSeconds + freezeRate; - foreach CollidingActors(class 'NiceMonster', niceZed, damageRadius, hitLocation){ if(niceZed.Health <= 0) continue; if(instigator == none || instigator.controller == none) niceZed.SetDelayedDamageInstigatorController(instigatorController); niceZed.TakeDamage( damageAmount, instigator, niceZed.location, vect(0,0,0), damageType); - } - bHurtEntry = false; -} -function TakeDamage(int Damage, Pawn InstigatedBy, Vector hitlocation, Vector momentum, class damageType, optional int HitIndex){ - if(damageType == class'SirenScreamDamage') Disintegrate(HitLocation, vect(0,0,1)); -} -// Overridden to tweak the handling of the impact sound -simulated function HitWall(vector hitNormal, Actor wall){ - local Vector vnorm; - local PlayerController player; - if(Pawn(wall) != none || GameObjective(wall) != none){ Explode(Location, HitNormal); return; - } - if(!bTimerSet){ SetTimer(ExplodeTimer, false); bTimerSet = true; - } - // Reflect off Wall w/damping - vnorm = (velocity dot hitNormal) * hitNormal; - Velocity = -vnorm * DampenFactor + (Velocity - vnorm) * dampenFactorParallel; - RandSpin(100000); - desiredRotation.roll = 0; - RotationRate.roll = 0; - speed = VSize(velocity); - if(speed < 20){ bBounce = False; PrePivot.Z = -1.5; SetPhysics(PHYS_None); Timer(); SetTimer(0.0,False); desiredRotation = Rotation; desiredRotation.Roll = 0; desiredRotation.Pitch = 0; SetRotation(desiredRotation); if(trail != none) trail.mRegen = false; return; - } - if(level.NetMode != NM_DedicatedServer && Speed > 50) PlaySound(ImpactSound, SLOT_Misc ); - else{ bFixedRotationDir = false; bRotateToDesired = true; DesiredRotation.Pitch = 0; RotationRate.Pitch = 50000; - } - - if(level.bDropDetail || level.DetailMode == DM_Low) return; - if( (level.TimeSeconds - lastSparkTime > 0.5) && EffectIsRelevant(location, false)){ player = level.GetLocalPlayerController(); if( player.viewTarget != none && VSize(player.viewTarget.location - location) < 6000) Spawn(HitEffectClass,,, Location, Rotator(HitNormal)); LastSparkTime = Level.TimeSeconds; - } -} -function Tick(float deltaTime){ - if( totalFreezes > 0 && nextFreezeTime > 0 && nextFreezeTime < level.timeSeconds){ totalFreezes--; DoFreeze(damage, damageRadius, myDamageType, momentumTransfer, location); if(totalFreezes == 0) ambientSound = none; - } -} -defaultproperties -{ totalFreezes=100 freezeRate=0.030000 ExplosionSound=SoundGroup'KF_GrenadeSnd.NadeBase.MedicNade_Explode' Damage=0.000000 DamageRadius=175.000000 MyDamageType=Class'NicePack.NiceDamTypeCryoNade' ExplosionDecal=Class'NicePack.NiceNitroDecal' StaticMesh=StaticMesh'KF_pickups5_Trip.nades.MedicNade_Pickup' LifeSpan=8.000000 DrawScale=1.000000 SoundVolume=150 SoundRadius=100.000000 TransientSoundVolume=2.000000 TransientSoundRadius=200.000000 -} +// ScrN copy +class NiceCryoNade extends Nade; +#exec OBJ LOAD FILE=KF_GrenadeSnd.uax +#exec OBJ LOAD FILE=Inf_WeaponsTwo.uax +#exec OBJ LOAD FILE=KF_LAWSnd.uax +// How many times do freezing +var int totalFreezes; +// How often to do freezeing +var float freezeRate; +// The next time that this nade will freeze +var float nextFreezeTime; +// The sound of nade's explosion +var sound explosionSound; +// Whether or not effects have been played yet +var bool bNeedToPlayEffects; +replication +{ + reliable if (Role==ROLE_Authority) + bNeedToPlayEffects; +} +simulated function PostNetReceive() +{ + super.PostNetReceive(); + if(!bHasExploded && bNeedToPlayEffects){ + bNeedToPlayEffects = false; + Explode(Location, vect(0,0,1)); + } +} +simulated function Explode(vector hitLocation, vector hitNormal){ + bHasExploded = true; + BlowUp(hitLocation); + PlaySound(ExplosionSound,,TransientSoundVolume); + if(Role == ROLE_Authority){ + bNeedToPlayEffects = true; + AmbientSound=Sound'Inf_WeaponsTwo.smoke_loop'; + } + if(EffectIsRelevant(location, false)){ + Spawn(class'NiceCryoNadeCloud',,, hitLocation, rotator(vect(0,0,1))); + Spawn(explosionDecal, self,, hitLocation, rotator(-hitNormal)); + if(level.detailMode >= DM_High) + Spawn(class'NiceNitroGroundEffect', self,, location); + } +} +function Timer(){ + if(!bHidden){ + if(!bHasExploded) + Explode(location, vect(0,0,1)); + } + else if(bDisintegrated){ + AmbientSound = none; + Destroy(); + } +} +simulated function BlowUp(vector hitLocation){ + DoFreeze(damage, damageRadius, MyDamageType, momentumTransfer, hitLocation); + if(role == ROLE_Authority) + MakeNoise(1.0); +} +function DoFreeze( float DamageAmount, float DamageRadius, + class DamageType, + float Momentum, vector HitLocation){ + local NiceMonster niceZed; + if(bHurtEntry) + return; + bHurtEntry = true; + nextFreezeTime = level.timeSeconds + freezeRate; + foreach CollidingActors(class 'NiceMonster', niceZed, + damageRadius, hitLocation){ + if(niceZed.Health <= 0) continue; + if(instigator == none || instigator.controller == none) + niceZed.SetDelayedDamageInstigatorController(instigatorController); + niceZed.TakeDamage( damageAmount, instigator, niceZed.location, + vect(0,0,0), damageType); + } + bHurtEntry = false; +} +function TakeDamage(int Damage, Pawn InstigatedBy, Vector hitlocation, + Vector momentum, class damageType, + optional int HitIndex){ + if(damageType == class'SirenScreamDamage') + Disintegrate(HitLocation, vect(0,0,1)); +} +// Overridden to tweak the handling of the impact sound +simulated function HitWall(vector hitNormal, Actor wall){ + local Vector vnorm; + local PlayerController player; + if(Pawn(wall) != none || GameObjective(wall) != none){ + Explode(Location, HitNormal); + return; + } + if(!bTimerSet){ + SetTimer(ExplodeTimer, false); + bTimerSet = true; + } + // Reflect off Wall w/damping + vnorm = (velocity dot hitNormal) * hitNormal; + Velocity = -vnorm * DampenFactor + + (Velocity - vnorm) * dampenFactorParallel; + RandSpin(100000); + desiredRotation.roll = 0; + RotationRate.roll = 0; + speed = VSize(velocity); + if(speed < 20){ + bBounce = False; + PrePivot.Z = -1.5; + SetPhysics(PHYS_None); + Timer(); + SetTimer(0.0,False); + desiredRotation = Rotation; + desiredRotation.Roll = 0; + desiredRotation.Pitch = 0; + SetRotation(desiredRotation); + if(trail != none) + trail.mRegen = false; + return; + } + if(level.NetMode != NM_DedicatedServer && Speed > 50) + PlaySound(ImpactSound, SLOT_Misc ); + else{ + bFixedRotationDir = false; + bRotateToDesired = true; + DesiredRotation.Pitch = 0; + RotationRate.Pitch = 50000; + } + + if(level.bDropDetail || level.DetailMode == DM_Low) + return; + if( (level.TimeSeconds - lastSparkTime > 0.5) + && EffectIsRelevant(location, false)){ + player = level.GetLocalPlayerController(); + if( player.viewTarget != none + && VSize(player.viewTarget.location - location) < 6000) + Spawn(HitEffectClass,,, Location, Rotator(HitNormal)); + LastSparkTime = Level.TimeSeconds; + } +} +function Tick(float deltaTime){ + if( totalFreezes > 0 && nextFreezeTime > 0 + && nextFreezeTime < level.timeSeconds){ + totalFreezes--; + DoFreeze(damage, damageRadius, myDamageType, momentumTransfer, location); + if(totalFreezes == 0) + ambientSound = none; + } +} +defaultproperties +{ + totalFreezes=100 + freezeRate=0.030000 + ExplosionSound=SoundGroup'KF_GrenadeSnd.NadeBase.MedicNade_Explode' + Damage=0.000000 + DamageRadius=175.000000 + MyDamageType=Class'NicePack.NiceDamTypeCryoNade' + ExplosionDecal=Class'NicePack.NiceNitroDecal' + StaticMesh=StaticMesh'KF_pickups5_Trip.nades.MedicNade_Pickup' + LifeSpan=8.000000 + DrawScale=1.000000 + SoundVolume=150 + SoundRadius=100.000000 + TransientSoundVolume=2.000000 + TransientSoundRadius=200.000000 +} diff --git a/sources/Weapons/Playable/Grenades/NiceCryoNadeCloud.uc b/sources/Weapons/Playable/Grenades/NiceCryoNadeCloud.uc index ab4c045..4ea1d3a 100644 --- a/sources/Weapons/Playable/Grenades/NiceCryoNadeCloud.uc +++ b/sources/Weapons/Playable/Grenades/NiceCryoNadeCloud.uc @@ -1,23 +1,57 @@ -// ScrN copy -class NiceCryoNadeCloud extends Emitter; -var bool bFlashed; -simulated function PostBeginPlay(){ - super.PostBeginPlay(); - NadeLight(); -} -simulated function NadeLight(){ - if(instigator == none) return; - if(Level.bDropDetail) return; - if( (Level.TimeSeconds - LastRenderTime < 0.2) || (PlayerController(instigator.controller) != none)){ - bDynamicLight = true; - SetTimer(0.25, false); - } - else Timer(); -} -simulated function Timer(){ - bDynamicLight = false; -} -defaultproperties -{ Begin Object Class=SpriteEmitter Name=SpriteEmitter0 UseColorScale=True RespawnDeadParticles=False SpinParticles=True UseSizeScale=True UseRegularSizeScale=False UniformSize=True AutomaticInitialSpawning=False BlendBetweenSubdivisions=True ColorScale(0)=(Color=(B=255,G=235,R=215,A=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=245,G=225,R=205,A=255)) FadeOutFactor=(W=0.000000,X=0.000000,Y=0.000000,Z=0.000000) FadeOutStartTime=5.000000 SpinsPerSecondRange=(Y=(Min=0.050000,Max=0.100000),Z=(Min=0.050000,Max=0.100000)) StartSpinRange=(X=(Min=-0.500000,Max=0.500000),Y=(Max=1.000000),Z=(Max=1.000000)) SizeScale(0)=(RelativeSize=1.000000) SizeScale(1)=(RelativeTime=1.000000,RelativeSize=5.000000) StartSizeRange=(X=(Min=40.000000,Max=40.000000),Y=(Min=40.000000,Max=40.000000),Z=(Min=40.000000,Max=40.000000)) InitialParticlesPerSecond=5000.000000 DrawStyle=PTDS_AlphaBlend Texture=Texture'kf_fx_trip_t.Misc.smoke_animated' TextureUSubdivisions=8 TextureVSubdivisions=8 LifetimeRange=(Min=3.000000,Max=3.000000) StartVelocityRange=(X=(Min=-750.000000,Max=750.000000),Y=(Min=-750.000000,Max=750.000000)) VelocityLossRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000)) End Object Emitters(0)=SpriteEmitter'NicePack.NiceCryoNadeCloud.SpriteEmitter0' - AutoDestroy=True bNoDelete=False RemoteRole=ROLE_SimulatedProxy bNotOnDedServer=False -} +// ScrN copy +class NiceCryoNadeCloud extends Emitter; +var bool bFlashed; +simulated function PostBeginPlay(){ + super.PostBeginPlay(); + NadeLight(); +} +simulated function NadeLight(){ + if(instigator == none) return; + if(Level.bDropDetail) return; + if( (Level.TimeSeconds - LastRenderTime < 0.2) + || (PlayerController(instigator.controller) != none)){ + bDynamicLight = true; + SetTimer(0.25, false); + } + else + Timer(); +} +simulated function Timer(){ + bDynamicLight = false; +} +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter0 + UseColorScale=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + BlendBetweenSubdivisions=True + ColorScale(0)=(Color=(B=255,G=235,R=215,A=255)) + ColorScale(1)=(RelativeTime=1.000000,Color=(B=245,G=225,R=205,A=255)) + FadeOutFactor=(W=0.000000,X=0.000000,Y=0.000000,Z=0.000000) + FadeOutStartTime=5.000000 + SpinsPerSecondRange=(Y=(Min=0.050000,Max=0.100000),Z=(Min=0.050000,Max=0.100000)) + StartSpinRange=(X=(Min=-0.500000,Max=0.500000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScale(0)=(RelativeSize=1.000000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=5.000000) + StartSizeRange=(X=(Min=40.000000,Max=40.000000),Y=(Min=40.000000,Max=40.000000),Z=(Min=40.000000,Max=40.000000)) + InitialParticlesPerSecond=5000.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'kf_fx_trip_t.Misc.smoke_animated' + TextureUSubdivisions=8 + TextureVSubdivisions=8 + LifetimeRange=(Min=3.000000,Max=3.000000) + StartVelocityRange=(X=(Min=-750.000000,Max=750.000000),Y=(Min=-750.000000,Max=750.000000)) + VelocityLossRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000)) + End Object + Emitters(0)=SpriteEmitter'NicePack.NiceCryoNadeCloud.SpriteEmitter0' + + AutoDestroy=True + bNoDelete=False + RemoteRole=ROLE_SimulatedProxy + bNotOnDedServer=False +} diff --git a/sources/Weapons/Playable/Grenades/NiceDamTypeCryoNade.uc b/sources/Weapons/Playable/Grenades/NiceDamTypeCryoNade.uc index 16a2a22..332e76b 100644 --- a/sources/Weapons/Playable/Grenades/NiceDamTypeCryoNade.uc +++ b/sources/Weapons/Playable/Grenades/NiceDamTypeCryoNade.uc @@ -1,5 +1,6 @@ -class NiceDamTypeCryoNade extends NiceWeaponDamageType - abstract; -defaultproperties -{ freezePower=200.000000 -} +class NiceDamTypeCryoNade extends NiceWeaponDamageType + abstract; +defaultproperties +{ + freezePower=200.000000 +} diff --git a/sources/Weapons/Playable/Grenades/NiceDamTypeFlameNade.uc b/sources/Weapons/Playable/Grenades/NiceDamTypeFlameNade.uc index 81386cc..f7d55c4 100644 --- a/sources/Weapons/Playable/Grenades/NiceDamTypeFlameNade.uc +++ b/sources/Weapons/Playable/Grenades/NiceDamTypeFlameNade.uc @@ -1,5 +1,9 @@ -class NiceDamTypeFlameNade extends NiceDamTypeFire - abstract; -defaultproperties -{ WeaponClass=None DeathString="%k incinerated %o (flame grenade)." FemaleSuicide="%o roasted herself alive (flame grenade)." MaleSuicide="%o roasted himself alive (flame grenade)." -} +class NiceDamTypeFlameNade extends NiceDamTypeFire + abstract; +defaultproperties +{ + WeaponClass=None + DeathString="%k incinerated %o (flame grenade)." + FemaleSuicide="%o roasted herself alive (flame grenade)." + MaleSuicide="%o roasted himself alive (flame grenade)." +} diff --git a/sources/Weapons/Playable/Grenades/NiceMedicNade.uc b/sources/Weapons/Playable/Grenades/NiceMedicNade.uc index dcbaa7d..a101378 100644 --- a/sources/Weapons/Playable/Grenades/NiceMedicNade.uc +++ b/sources/Weapons/Playable/Grenades/NiceMedicNade.uc @@ -1,166 +1,373 @@ -//============================================================================= -// MedicNade -//============================================================================= -// Medic grenade that heals friends and hurts enemies -//============================================================================= -// Killing Floor Source -// Copyright (C) 2012 Tripwire Interactive -// Author - John "Ramm-Jaeger" Gibson -//============================================================================= -class NiceMedicNade extends Nade; -#exec OBJ LOAD FILE=KF_GrenadeSnd.uax -#exec OBJ LOAD FILE=Inf_WeaponsTwo.uax -#exec OBJ LOAD FILE=KF_LAWSnd.uax -var() int HealBoostAmount;// How much we heal a player by default with the medic nade -var int TotalHeals; // The total number of times this nade has healed (or hurt enemies) -var() int MaxHeals; // The total number of times this nade will heal (or hurt enemies) until its done healing -var float NextHealTime; // The next time that this nade will heal friendlies or hurt enemies -var() float HealInterval; // How often to do healing -var() sound ExplosionSound; // The sound of the rocket exploding -var localized string SuccessfulHealMessage; -var int MaxNumberOfPlayers; -var bool bNeedToPlayEffects; // Whether or not effects have been played yet -replication -{ - reliable if (Role==ROLE_Authority) bNeedToPlayEffects; -} -simulated function PostNetReceive() -{ - super.PostNetReceive(); - if( !bHasExploded && bNeedToPlayEffects ) - { bNeedToPlayEffects = false; Explode(Location, vect(0,0,1)); - } -} -simulated function Explode(vector HitLocation, vector HitNormal) -{ - bHasExploded = True; - BlowUp(HitLocation); - PlaySound(ExplosionSound,,TransientSoundVolume); - if( Role == ROLE_Authority ) - { bNeedToPlayEffects = true; AmbientSound=Sound'Inf_WeaponsTwo.smoke_loop'; - } - if ( EffectIsRelevant(Location,false) ) - { Spawn(Class'NicePack.NiceNadeHealing',,, HitLocation, rotator(vect(0,0,1))); - } -} -function Timer() -{ - if( !bHidden ) - { if( !bHasExploded ) { Explode(Location, vect(0,0,1)); } - } - else if( bDisintegrated ) - { AmbientSound=none; Destroy(); - } -} -simulated function BlowUp(vector HitLocation) -{ - HealOrHurt(Damage,DamageRadius, MyDamageType, MomentumTransfer, HitLocation); - if ( Role == ROLE_Authority ) MakeNoise(1.0); -} -function HealOrHurt(float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation) -{ - local actor Victims; - local float damageScale; - local vector dir; - local int NumKilled; - local KFMonster KFMonsterVictim; - local Pawn P; - local KFPawn KFP; - local array CheckedPawns; - local int i; - local bool bAlreadyChecked; - // Healing - local KFPlayerReplicationInfo PRI; - local int MedicReward; - local float HealSum; // for modifying based on perks - local int PlayersHealed; - if ( bHurtEntry ) return; - NextHealTime = Level.TimeSeconds + HealInterval; - bHurtEntry = true; - if( Fear != none ) - { Fear.StartleBots(); - } - foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) - { // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') && ExtendedZCollision(Victims)==none ) { if( (Instigator==none || Instigator.Health<=0) && KFPawn(Victims)!=none ) Continue; - damageScale = 1.0; - if ( Instigator == none || Instigator.Controller == none ) { Victims.SetDelayedDamageInstigatorController( InstigatorController ); } - P = Pawn(Victims); - if( P != none ) { for (i = 0; i < CheckedPawns.Length; i++) { if (CheckedPawns[i] == P) { bAlreadyChecked = true; break; } } - if( bAlreadyChecked ) { bAlreadyChecked = false; P = none; continue; } - KFMonsterVictim = KFMonster(Victims); - if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { KFMonsterVictim = none; } - KFP = KFPawn(Victims); - if( KFMonsterVictim != none ) { damageScale *= KFMonsterVictim.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); } else if( KFP != none ) { damageScale *= KFP.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); } - CheckedPawns[CheckedPawns.Length] = P; - if ( damageScale <= 0) { P = none; continue; } else { //Victims = P; P = none; } } else { continue; } - if( KFP == none ) { //log(Level.TimeSeconds@"Hurting "$Victims$" for "$(damageScale * DamageAmount)$" damage"); - if( Pawn(Victims) != none && Pawn(Victims).Health > 0 ) { Victims.TakeDamage(damageScale * DamageAmount,Instigator,Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir,(damageScale * Momentum * dir),DamageType); - if( Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { NumKilled++; } } } else { if(Instigator != none && KFP.Health > 0) { if ( KFP.bCanBeHealed ) { PlayersHealed += 1; MedicReward = HealBoostAmount; - PRI = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo); - if ( PRI != none && PRI.ClientVeteranSkill != none ) { MedicReward *= PRI.ClientVeteranSkill.Static.GetHealPotency(PRI); } - HealSum = MedicReward; - if ( (KFP.Health + KFP.healthToGive + MedicReward) > KFP.HealthMax ) { MedicReward = KFP.HealthMax - (KFP.Health + KFP.healthToGive); if ( MedicReward < 0 ) { MedicReward = 0; } } - //log(Level.TimeSeconds@"Healing "$KFP$" for "$HealSum$" base healamount "$HealBoostAmount$" health"); KFP.GiveHealth(HealSum, KFP.HealthMax); KFP.ShieldStrength += HealSum * 0.25; if(KFP.ShieldStrength > KFP.ShieldStrengthMax) KFP.ShieldStrength = KFP.ShieldStrengthMax; - if ( PRI != none ) { if ( MedicReward > 0 && KFSteamStatsAndAchievements(PRI.SteamStatsAndAchievements) != none ) { KFSteamStatsAndAchievements(PRI.SteamStatsAndAchievements).AddDamageHealed(MedicReward, false, true); } - // Give the medic reward money as a percentage of how much of the person's health they healed MedicReward = int((FMin(float(MedicReward),KFP.HealthMax)/KFP.HealthMax) * 60); - PRI.ReceiveRewardForHealing( MedicReward, KFP ); - if ( KFHumanPawn(Instigator) != none ) { KFHumanPawn(Instigator).AlphaAmount = 255; } - if( PlayerController(Instigator.Controller) != none ) { PlayerController(Instigator.Controller).ClientMessage(SuccessfulHealMessage$KFP.GetPlayerName(), 'CriticalEvent'); } } } } } - KFP = none; } - if (PlayersHealed >= MaxNumberOfPlayers) { if (PRI != none) { KFSteamStatsAndAchievements(PRI.SteamStatsAndAchievements).HealedTeamWithMedicGrenade(); } } - } - bHurtEntry = false; -} -// Shoot nades in mid-air -// Alex -function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, optional int HitIndex) -{ - if ( Monster(instigatedBy) != none || instigatedBy == Instigator ) - { if( damageType == class'SirenScreamDamage') { Disintegrate(HitLocation, vect(0,0,1)); } - } -} -// Overridden to tweak the handling of the impact sound -simulated function HitWall( vector HitNormal, actor Wall ) -{ - local Vector VNorm; - local PlayerController PC; - if ( (Pawn(Wall) != none) || (GameObjective(Wall) != none) ) - { Explode(Location, HitNormal); return; - } - if (!bTimerSet) - { SetTimer(ExplodeTimer, false); bTimerSet = true; - } - // Reflect off Wall w/damping - VNorm = (Velocity dot HitNormal) * HitNormal; - Velocity = -VNorm * DampenFactor + (Velocity - VNorm) * DampenFactorParallel; - RandSpin(100000); - DesiredRotation.Roll = 0; - RotationRate.Roll = 0; - Speed = VSize(Velocity); - if ( Speed < 20 ) - { bBounce = False; PrePivot.Z = -1.5; SetPhysics(PHYS_none); Timer(); SetTimer(0.0,False); DesiredRotation = Rotation; DesiredRotation.Roll = 0; DesiredRotation.Pitch = 0; SetRotation(DesiredRotation); - if( Fear == none ) { //(jc) Changed to use MedicNade-specific grenade that's overridden to not make the ringmaster fear it Fear = Spawn(class'AvoidMarker_MedicNade'); Fear.SetCollisionSize(DamageRadius,DamageRadius); Fear.StartleBots(); } - if ( Trail != none ) Trail.mRegen = false; // stop the emitter from regenerating - } - else - { if ( (Level.NetMode != NM_DedicatedServer) && (Speed > 50) ) PlaySound(ImpactSound, SLOT_Misc ); else { bFixedRotationDir = false; bRotateToDesired = true; DesiredRotation.Pitch = 0; RotationRate.Pitch = 50000; } if ( !Level.bDropDetail && (Level.DetailMode != DM_Low) && (Level.TimeSeconds - LastSparkTime > 0.5) && EffectIsRelevant(Location,false) ) { PC = Level.GetLocalPlayerController(); if ( (PC.ViewTarget != none) && VSize(PC.ViewTarget.Location - Location) < 6000 ) Spawn(HitEffectClass,,, Location, Rotator(HitNormal)); LastSparkTime = Level.TimeSeconds; } - } -} -function Tick( float DeltaTime ) -{ - if( Role < ROLE_Authority ) - { return; - } -// if( class'ROEngine.ROLevelInfo'.static.RODebugMode() ) -// { -// DrawDebugSphere( Location, DamageRadius, 12, 255, 0, 0); -// } - if( TotalHeals < MaxHeals && NextHealTime > 0 && NextHealTime < Level.TimeSeconds ) - { TotalHeals += 1; - HealOrHurt(Damage,DamageRadius, MyDamageType, MomentumTransfer, Location); - if( TotalHeals >= MaxHeals ) { AmbientSound=none; } - } -} -defaultproperties -{ HealBoostAmount=10 MaxHeals=8 HealInterval=1.000000 ExplosionSound=SoundGroup'KF_GrenadeSnd.NadeBase.MedicNade_Explode' SuccessfulHealMessage="You healed " MaxNumberOfPlayers=6 Damage=50.000000 DamageRadius=175.000000 MyDamageType=Class'KFMod.DamTypeMedicNade' StaticMesh=StaticMesh'KF_pickups5_Trip.nades.MedicNade_Pickup' DrawScale=1.000000 SoundVolume=150 SoundRadius=100.000000 TransientSoundVolume=2.000000 TransientSoundRadius=200.000000 -} +//============================================================================= +// MedicNade +//============================================================================= +// Medic grenade that heals friends and hurts enemies +//============================================================================= +// Killing Floor Source +// Copyright (C) 2012 Tripwire Interactive +// Author - John "Ramm-Jaeger" Gibson +//============================================================================= +class NiceMedicNade extends Nade; +#exec OBJ LOAD FILE=KF_GrenadeSnd.uax +#exec OBJ LOAD FILE=Inf_WeaponsTwo.uax +#exec OBJ LOAD FILE=KF_LAWSnd.uax +var() int HealBoostAmount;// How much we heal a player by default with the medic nade +var int TotalHeals; // The total number of times this nade has healed (or hurt enemies) +var() int MaxHeals; // The total number of times this nade will heal (or hurt enemies) until its done healing +var float NextHealTime; // The next time that this nade will heal friendlies or hurt enemies +var() float HealInterval; // How often to do healing +var() sound ExplosionSound; // The sound of the rocket exploding +var localized string SuccessfulHealMessage; +var int MaxNumberOfPlayers; +var bool bNeedToPlayEffects; // Whether or not effects have been played yet +replication +{ + reliable if (Role==ROLE_Authority) + bNeedToPlayEffects; +} +simulated function PostNetReceive() +{ + super.PostNetReceive(); + if( !bHasExploded && bNeedToPlayEffects ) + { + bNeedToPlayEffects = false; + Explode(Location, vect(0,0,1)); + } +} +simulated function Explode(vector HitLocation, vector HitNormal) +{ + bHasExploded = True; + BlowUp(HitLocation); + PlaySound(ExplosionSound,,TransientSoundVolume); + if( Role == ROLE_Authority ) + { + bNeedToPlayEffects = true; + AmbientSound=Sound'Inf_WeaponsTwo.smoke_loop'; + } + if ( EffectIsRelevant(Location,false) ) + { + Spawn(Class'NicePack.NiceNadeHealing',,, HitLocation, rotator(vect(0,0,1))); + } +} +function Timer() +{ + if( !bHidden ) + { + if( !bHasExploded ) + { + Explode(Location, vect(0,0,1)); + } + } + else if( bDisintegrated ) + { + AmbientSound=none; + Destroy(); + } +} +simulated function BlowUp(vector HitLocation) +{ + HealOrHurt(Damage,DamageRadius, MyDamageType, MomentumTransfer, HitLocation); + if ( Role == ROLE_Authority ) + MakeNoise(1.0); +} +function HealOrHurt(float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation) +{ + local actor Victims; + local float damageScale; + local vector dir; + local int NumKilled; + local KFMonster KFMonsterVictim; + local Pawn P; + local KFPawn KFP; + local array CheckedPawns; + local int i; + local bool bAlreadyChecked; + // Healing + local KFPlayerReplicationInfo PRI; + local int MedicReward; + local float HealSum; // for modifying based on perks + local int PlayersHealed; + if ( bHurtEntry ) + return; + NextHealTime = Level.TimeSeconds + HealInterval; + bHurtEntry = true; + if( Fear != none ) + { + Fear.StartleBots(); + } + foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) + { + // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag + if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') + && ExtendedZCollision(Victims)==none ) + { + if( (Instigator==none || Instigator.Health<=0) && KFPawn(Victims)!=none ) + Continue; + + damageScale = 1.0; + + if ( Instigator == none || Instigator.Controller == none ) + { + Victims.SetDelayedDamageInstigatorController( InstigatorController ); + } + + P = Pawn(Victims); + + if( P != none ) + { + for (i = 0; i < CheckedPawns.Length; i++) + { + if (CheckedPawns[i] == P) + { + bAlreadyChecked = true; + break; + } + } + + if( bAlreadyChecked ) + { + bAlreadyChecked = false; + P = none; + continue; + } + + KFMonsterVictim = KFMonster(Victims); + + if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) + { + KFMonsterVictim = none; + } + + KFP = KFPawn(Victims); + + if( KFMonsterVictim != none ) + { + damageScale *= KFMonsterVictim.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); + } + else if( KFP != none ) + { + damageScale *= KFP.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); + } + + CheckedPawns[CheckedPawns.Length] = P; + + if ( damageScale <= 0) + { + P = none; + continue; + } + else + { + //Victims = P; + P = none; + } + } + else + { + continue; + } + + if( KFP == none ) + { + //log(Level.TimeSeconds@"Hurting "$Victims$" for "$(damageScale * DamageAmount)$" damage"); + + if( Pawn(Victims) != none && Pawn(Victims).Health > 0 ) + { + Victims.TakeDamage(damageScale * DamageAmount,Instigator,Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) + * dir,(damageScale * Momentum * dir),DamageType); + + if( Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) + { + NumKilled++; + } + } + } + else + { + if(Instigator != none && KFP.Health > 0) + { + if ( KFP.bCanBeHealed ) + { + PlayersHealed += 1; + MedicReward = HealBoostAmount; + + PRI = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo); + + if ( PRI != none && PRI.ClientVeteranSkill != none ) + { + MedicReward *= PRI.ClientVeteranSkill.Static.GetHealPotency(PRI); + } + + HealSum = MedicReward; + + if ( (KFP.Health + KFP.healthToGive + MedicReward) > KFP.HealthMax ) + { + MedicReward = KFP.HealthMax - (KFP.Health + KFP.healthToGive); + if ( MedicReward < 0 ) + { + MedicReward = 0; + } + } + + //log(Level.TimeSeconds@"Healing "$KFP$" for "$HealSum$" base healamount "$HealBoostAmount$" health"); + KFP.GiveHealth(HealSum, KFP.HealthMax); + KFP.ShieldStrength += HealSum * 0.25; + if(KFP.ShieldStrength > KFP.ShieldStrengthMax) + KFP.ShieldStrength = KFP.ShieldStrengthMax; + + if ( PRI != none ) + { + if ( MedicReward > 0 && KFSteamStatsAndAchievements(PRI.SteamStatsAndAchievements) != none ) + { + KFSteamStatsAndAchievements(PRI.SteamStatsAndAchievements).AddDamageHealed(MedicReward, false, true); + } + + // Give the medic reward money as a percentage of how much of the person's health they healed + MedicReward = int((FMin(float(MedicReward),KFP.HealthMax)/KFP.HealthMax) * 60); + + PRI.ReceiveRewardForHealing( MedicReward, KFP ); + + if ( KFHumanPawn(Instigator) != none ) + { + KFHumanPawn(Instigator).AlphaAmount = 255; + } + + if( PlayerController(Instigator.Controller) != none ) + { + PlayerController(Instigator.Controller).ClientMessage(SuccessfulHealMessage$KFP.GetPlayerName(), 'CriticalEvent'); + } + } + } + } + } + + KFP = none; + } + + if (PlayersHealed >= MaxNumberOfPlayers) + { + if (PRI != none) + { + KFSteamStatsAndAchievements(PRI.SteamStatsAndAchievements).HealedTeamWithMedicGrenade(); + } + } + } + bHurtEntry = false; +} +// Shoot nades in mid-air +// Alex +function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, optional int HitIndex) +{ + if ( Monster(instigatedBy) != none || instigatedBy == Instigator ) + { + if( damageType == class'SirenScreamDamage') + { + Disintegrate(HitLocation, vect(0,0,1)); + } + } +} +// Overridden to tweak the handling of the impact sound +simulated function HitWall( vector HitNormal, actor Wall ) +{ + local Vector VNorm; + local PlayerController PC; + if ( (Pawn(Wall) != none) || (GameObjective(Wall) != none) ) + { + Explode(Location, HitNormal); + return; + } + if (!bTimerSet) + { + SetTimer(ExplodeTimer, false); + bTimerSet = true; + } + // Reflect off Wall w/damping + VNorm = (Velocity dot HitNormal) * HitNormal; + Velocity = -VNorm * DampenFactor + (Velocity - VNorm) * DampenFactorParallel; + RandSpin(100000); + DesiredRotation.Roll = 0; + RotationRate.Roll = 0; + Speed = VSize(Velocity); + if ( Speed < 20 ) + { + bBounce = False; + PrePivot.Z = -1.5; + SetPhysics(PHYS_none); + Timer(); + SetTimer(0.0,False); + DesiredRotation = Rotation; + DesiredRotation.Roll = 0; + DesiredRotation.Pitch = 0; + SetRotation(DesiredRotation); + + if( Fear == none ) + { + //(jc) Changed to use MedicNade-specific grenade that's overridden to not make the ringmaster fear it + Fear = Spawn(class'AvoidMarker_MedicNade'); + Fear.SetCollisionSize(DamageRadius,DamageRadius); + Fear.StartleBots(); + } + + if ( Trail != none ) + Trail.mRegen = false; // stop the emitter from regenerating + } + else + { + if ( (Level.NetMode != NM_DedicatedServer) && (Speed > 50) ) + PlaySound(ImpactSound, SLOT_Misc ); + else + { + bFixedRotationDir = false; + bRotateToDesired = true; + DesiredRotation.Pitch = 0; + RotationRate.Pitch = 50000; + } + if ( !Level.bDropDetail && (Level.DetailMode != DM_Low) && (Level.TimeSeconds - LastSparkTime > 0.5) && EffectIsRelevant(Location,false) ) + { + PC = Level.GetLocalPlayerController(); + if ( (PC.ViewTarget != none) && VSize(PC.ViewTarget.Location - Location) < 6000 ) + Spawn(HitEffectClass,,, Location, Rotator(HitNormal)); + LastSparkTime = Level.TimeSeconds; + } + } +} +function Tick( float DeltaTime ) +{ + if( Role < ROLE_Authority ) + { + return; + } +// if( class'ROEngine.ROLevelInfo'.static.RODebugMode() ) +// { +// DrawDebugSphere( Location, DamageRadius, 12, 255, 0, 0); +// } + if( TotalHeals < MaxHeals && NextHealTime > 0 && NextHealTime < Level.TimeSeconds ) + { + TotalHeals += 1; + + HealOrHurt(Damage,DamageRadius, MyDamageType, MomentumTransfer, Location); + + if( TotalHeals >= MaxHeals ) + { + AmbientSound=none; + } + } +} +defaultproperties +{ + HealBoostAmount=10 + MaxHeals=8 + HealInterval=1.000000 + ExplosionSound=SoundGroup'KF_GrenadeSnd.NadeBase.MedicNade_Explode' + SuccessfulHealMessage="You healed " + MaxNumberOfPlayers=6 + Damage=50.000000 + DamageRadius=175.000000 + MyDamageType=Class'KFMod.DamTypeMedicNade' + StaticMesh=StaticMesh'KF_pickups5_Trip.nades.MedicNade_Pickup' + DrawScale=1.000000 + SoundVolume=150 + SoundRadius=100.000000 + TransientSoundVolume=2.000000 + TransientSoundRadius=200.000000 +} diff --git a/sources/Weapons/Playable/Grenades/NiceMedicNadePoison.uc b/sources/Weapons/Playable/Grenades/NiceMedicNadePoison.uc index 281fe72..a5c2e64 100644 --- a/sources/Weapons/Playable/Grenades/NiceMedicNadePoison.uc +++ b/sources/Weapons/Playable/Grenades/NiceMedicNadePoison.uc @@ -1,158 +1,365 @@ -class NiceMedicNadePoison extends Nade; -#exec OBJ LOAD FILE=KF_GrenadeSnd.uax -#exec OBJ LOAD FILE=Inf_WeaponsTwo.uax -#exec OBJ LOAD FILE=KF_LAWSnd.uax -var() int HealBoostAmount;// How much we heal a player by default with the medic nade -var int TotalHeals; // The total number of times this nade has healed (or hurt enemies) -var() int MaxHeals; // The total number of times this nade will heal (or hurt enemies) until its done healing -var float NextHealTime; // The next time that this nade will heal friendlies or hurt enemies -var() float HealInterval; // How often to do healing -var() sound ExplosionSound; // The sound of the rocket exploding -var localized string SuccessfulHealMessage; -var int MaxNumberOfPlayers; -var bool bNeedToPlayEffects; // Whether or not effects have been played yet -replication -{ - reliable if (Role==ROLE_Authority) bNeedToPlayEffects; -} -simulated function PostNetReceive() -{ - super.PostNetReceive(); - if( !bHasExploded && bNeedToPlayEffects ) - { bNeedToPlayEffects = false; Explode(Location, vect(0,0,1)); - } -} -simulated function Explode(vector HitLocation, vector HitNormal) -{ - bHasExploded = True; - BlowUp(HitLocation); - PlaySound(ExplosionSound,,TransientSoundVolume); - if( Role == ROLE_Authority ) - { bNeedToPlayEffects = true; AmbientSound=Sound'Inf_WeaponsTwo.smoke_loop'; - } - if ( EffectIsRelevant(Location,false) ) - { Spawn(Class'NicePack.NiceNadeHealingFast',,, HitLocation, rotator(vect(0,0,1))); - } -} -function Timer() -{ - if( !bHidden ) - { if( !bHasExploded ) { Explode(Location, vect(0,0,1)); } - } - else if( bDisintegrated ) - { AmbientSound=none; Destroy(); - } -} -simulated function BlowUp(vector HitLocation) -{ - HealOrHurt(Damage,DamageRadius, MyDamageType, MomentumTransfer, HitLocation); - if ( Role == ROLE_Authority ) MakeNoise(1.0); -} -function HealOrHurt(float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation) -{ - local actor Victims; - local float damageScale; - local vector dir; - local int NumKilled; - local KFMonster KFMonsterVictim; - local Pawn P; - local KFPawn KFP; - local array CheckedPawns; - local int i; - local bool bAlreadyChecked; - // Healing - local KFPlayerReplicationInfo PRI; - local int MedicReward; - local float HealSum; // for modifying based on perks - local int PlayersHealed; - local NiceMonster niceZed; - if ( bHurtEntry ) return; - NextHealTime = Level.TimeSeconds + HealInterval; - bHurtEntry = true; - if( Fear != none ) - { Fear.StartleBots(); - } - foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) - { // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') && ExtendedZCollision(Victims)==none ) { if( (Instigator==none || Instigator.Health<=0) && KFPawn(Victims)!=none ) Continue; - damageScale = 1.0; - if ( Instigator == none || Instigator.Controller == none ) { Victims.SetDelayedDamageInstigatorController( InstigatorController ); } - P = Pawn(Victims); - if( P != none ) { for (i = 0; i < CheckedPawns.Length; i++) { if (CheckedPawns[i] == P) { bAlreadyChecked = true; break; } } - if( bAlreadyChecked ) { bAlreadyChecked = false; P = none; continue; } - KFMonsterVictim = KFMonster(Victims); - if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { KFMonsterVictim = none; } - KFP = KFPawn(Victims); - if( KFMonsterVictim != none ) { damageScale *= KFMonsterVictim.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); } else if( KFP != none ) { damageScale *= KFP.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); } - CheckedPawns[CheckedPawns.Length] = P; - if ( damageScale <= 0) { P = none; continue; } else { //Victims = P; P = none; } } else { continue; } - if( KFP == none ) { //log(Level.TimeSeconds@"Hurting "$Victims$" for "$(damageScale * DamageAmount)$" damage"); - if(Pawn(Victims) != none && Pawn(Victims).Health > 0){ niceZed = NiceMonster(Victims); if(niceZed != none && niceZed.default.Health <= 500){ niceZed.madnessCountDown = FMax(5.0, niceZed.madnessCountDown); KFMonsterController(niceZed.Controller).FindNewEnemy(); } Victims.TakeDamage(damageScale * DamageAmount,Instigator,Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir,(damageScale * Momentum * dir),DamageType); - if(Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0) NumKilled ++; } } else { if( Instigator != none && KFP.Health > 0 && KFP.Health < KFP.HealthMax ) { if ( KFP.bCanBeHealed ) { PlayersHealed += 1; MedicReward = HealBoostAmount; - PRI = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo); - if ( PRI != none && PRI.ClientVeteranSkill != none ) { MedicReward *= PRI.ClientVeteranSkill.Static.GetHealPotency(PRI); } - HealSum = MedicReward; - if ( (KFP.Health + KFP.healthToGive + MedicReward) > KFP.HealthMax ) { MedicReward = KFP.HealthMax - (KFP.Health + KFP.healthToGive); if ( MedicReward < 0 ) { MedicReward = 0; } } - //log(Level.TimeSeconds@"Healing "$KFP$" for "$HealSum$" base healamount "$HealBoostAmount$" health"); KFP.GiveHealth(HealSum, KFP.HealthMax); - if ( PRI != none ) { if ( MedicReward > 0 && KFSteamStatsAndAchievements(PRI.SteamStatsAndAchievements) != none ) { KFSteamStatsAndAchievements(PRI.SteamStatsAndAchievements).AddDamageHealed(MedicReward, false, true); } - // Give the medic reward money as a percentage of how much of the person's health they healed MedicReward = int((FMin(float(MedicReward),KFP.HealthMax)/KFP.HealthMax) * 60); - PRI.ReceiveRewardForHealing( MedicReward, KFP ); - if ( KFHumanPawn(Instigator) != none ) { KFHumanPawn(Instigator).AlphaAmount = 255; } - if( PlayerController(Instigator.Controller) != none ) { PlayerController(Instigator.Controller).ClientMessage(SuccessfulHealMessage$KFP.GetPlayerName(), 'CriticalEvent'); } } } } } - KFP = none; } - if (PlayersHealed >= MaxNumberOfPlayers) { if (PRI != none) { KFSteamStatsAndAchievements(PRI.SteamStatsAndAchievements).HealedTeamWithMedicGrenade(); } } - } - bHurtEntry = false; -} -// Shoot nades in mid-air -// Alex -function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, optional int HitIndex) -{ - if ( Monster(instigatedBy) != none || instigatedBy == Instigator ) - { if( damageType == class'SirenScreamDamage') { Disintegrate(HitLocation, vect(0,0,1)); } - } -} -// Overridden to tweak the handling of the impact sound -simulated function HitWall( vector HitNormal, actor Wall ) -{ - local Vector VNorm; - local PlayerController PC; - if ( (Pawn(Wall) != none) || (GameObjective(Wall) != none) ) - { Explode(Location, HitNormal); return; - } - if (!bTimerSet) - { SetTimer(ExplodeTimer, false); bTimerSet = true; - } - // Reflect off Wall w/damping - VNorm = (Velocity dot HitNormal) * HitNormal; - Velocity = -VNorm * DampenFactor + (Velocity - VNorm) * DampenFactorParallel; - RandSpin(100000); - DesiredRotation.Roll = 0; - RotationRate.Roll = 0; - Speed = VSize(Velocity); - if ( Speed < 20 ) - { bBounce = False; PrePivot.Z = -1.5; SetPhysics(PHYS_none); Timer(); SetTimer(0.0,False); DesiredRotation = Rotation; DesiredRotation.Roll = 0; DesiredRotation.Pitch = 0; SetRotation(DesiredRotation); - if( Fear == none ) { //(jc) Changed to use MedicNade-specific grenade that's overridden to not make the ringmaster fear it Fear = Spawn(class'AvoidMarker_MedicNade'); Fear.SetCollisionSize(DamageRadius,DamageRadius); Fear.StartleBots(); } - if ( Trail != none ) Trail.mRegen = false; // stop the emitter from regenerating - } - else - { if ( (Level.NetMode != NM_DedicatedServer) && (Speed > 50) ) PlaySound(ImpactSound, SLOT_Misc ); else { bFixedRotationDir = false; bRotateToDesired = true; DesiredRotation.Pitch = 0; RotationRate.Pitch = 50000; } if ( !Level.bDropDetail && (Level.DetailMode != DM_Low) && (Level.TimeSeconds - LastSparkTime > 0.5) && EffectIsRelevant(Location,false) ) { PC = Level.GetLocalPlayerController(); if ( (PC.ViewTarget != none) && VSize(PC.ViewTarget.Location - Location) < 6000 ) Spawn(HitEffectClass,,, Location, Rotator(HitNormal)); LastSparkTime = Level.TimeSeconds; } - } -} -function Tick( float DeltaTime ) -{ - if( Role < ROLE_Authority ) - { return; - } -// if( class'ROEngine.ROLevelInfo'.static.RODebugMode() ) -// { -// DrawDebugSphere( Location, DamageRadius, 12, 255, 0, 0); -// } - if( TotalHeals < MaxHeals && NextHealTime > 0 && NextHealTime < Level.TimeSeconds ) - { TotalHeals += 1; - HealOrHurt(Damage,DamageRadius, MyDamageType, MomentumTransfer, Location); - if( TotalHeals >= MaxHeals ) { AmbientSound=none; } - } -} -defaultproperties -{ HealBoostAmount=10 MaxHeals=4 HealInterval=1.000000 ExplosionSound=SoundGroup'KF_GrenadeSnd.NadeBase.MedicNade_Explode' SuccessfulHealMessage="You healed " MaxNumberOfPlayers=6 Damage=50.000000 DamageRadius=175.000000 MyDamageType=Class'KFMod.DamTypeMedicNade' StaticMesh=StaticMesh'KF_pickups5_Trip.nades.MedicNade_Pickup' LifeSpan=8.000000 DrawScale=1.000000 SoundVolume=150 SoundRadius=100.000000 TransientSoundVolume=2.000000 TransientSoundRadius=200.000000 -} +class NiceMedicNadePoison extends Nade; +#exec OBJ LOAD FILE=KF_GrenadeSnd.uax +#exec OBJ LOAD FILE=Inf_WeaponsTwo.uax +#exec OBJ LOAD FILE=KF_LAWSnd.uax +var() int HealBoostAmount;// How much we heal a player by default with the medic nade +var int TotalHeals; // The total number of times this nade has healed (or hurt enemies) +var() int MaxHeals; // The total number of times this nade will heal (or hurt enemies) until its done healing +var float NextHealTime; // The next time that this nade will heal friendlies or hurt enemies +var() float HealInterval; // How often to do healing +var() sound ExplosionSound; // The sound of the rocket exploding +var localized string SuccessfulHealMessage; +var int MaxNumberOfPlayers; +var bool bNeedToPlayEffects; // Whether or not effects have been played yet +replication +{ + reliable if (Role==ROLE_Authority) + bNeedToPlayEffects; +} +simulated function PostNetReceive() +{ + super.PostNetReceive(); + if( !bHasExploded && bNeedToPlayEffects ) + { + bNeedToPlayEffects = false; + Explode(Location, vect(0,0,1)); + } +} +simulated function Explode(vector HitLocation, vector HitNormal) +{ + bHasExploded = True; + BlowUp(HitLocation); + PlaySound(ExplosionSound,,TransientSoundVolume); + if( Role == ROLE_Authority ) + { + bNeedToPlayEffects = true; + AmbientSound=Sound'Inf_WeaponsTwo.smoke_loop'; + } + if ( EffectIsRelevant(Location,false) ) + { + Spawn(Class'NicePack.NiceNadeHealingFast',,, HitLocation, rotator(vect(0,0,1))); + } +} +function Timer() +{ + if( !bHidden ) + { + if( !bHasExploded ) + { + Explode(Location, vect(0,0,1)); + } + } + else if( bDisintegrated ) + { + AmbientSound=none; + Destroy(); + } +} +simulated function BlowUp(vector HitLocation) +{ + HealOrHurt(Damage,DamageRadius, MyDamageType, MomentumTransfer, HitLocation); + if ( Role == ROLE_Authority ) + MakeNoise(1.0); +} +function HealOrHurt(float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation) +{ + local actor Victims; + local float damageScale; + local vector dir; + local int NumKilled; + local KFMonster KFMonsterVictim; + local Pawn P; + local KFPawn KFP; + local array CheckedPawns; + local int i; + local bool bAlreadyChecked; + // Healing + local KFPlayerReplicationInfo PRI; + local int MedicReward; + local float HealSum; // for modifying based on perks + local int PlayersHealed; + local NiceMonster niceZed; + if ( bHurtEntry ) + return; + NextHealTime = Level.TimeSeconds + HealInterval; + bHurtEntry = true; + if( Fear != none ) + { + Fear.StartleBots(); + } + foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) + { + // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag + if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') + && ExtendedZCollision(Victims)==none ) + { + if( (Instigator==none || Instigator.Health<=0) && KFPawn(Victims)!=none ) + Continue; + + damageScale = 1.0; + + if ( Instigator == none || Instigator.Controller == none ) + { + Victims.SetDelayedDamageInstigatorController( InstigatorController ); + } + + P = Pawn(Victims); + + if( P != none ) + { + for (i = 0; i < CheckedPawns.Length; i++) + { + if (CheckedPawns[i] == P) + { + bAlreadyChecked = true; + break; + } + } + + if( bAlreadyChecked ) + { + bAlreadyChecked = false; + P = none; + continue; + } + + KFMonsterVictim = KFMonster(Victims); + + if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) + { + KFMonsterVictim = none; + } + + KFP = KFPawn(Victims); + + if( KFMonsterVictim != none ) + { + damageScale *= KFMonsterVictim.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); + } + else if( KFP != none ) + { + damageScale *= KFP.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); + } + + CheckedPawns[CheckedPawns.Length] = P; + + if ( damageScale <= 0) + { + P = none; + continue; + } + else + { + //Victims = P; + P = none; + } + } + else + { + continue; + } + + if( KFP == none ) + { + //log(Level.TimeSeconds@"Hurting "$Victims$" for "$(damageScale * DamageAmount)$" damage"); + + if(Pawn(Victims) != none && Pawn(Victims).Health > 0){ + niceZed = NiceMonster(Victims); + if(niceZed != none && niceZed.default.Health <= 500){ + niceZed.madnessCountDown = FMax(5.0, niceZed.madnessCountDown); + KFMonsterController(niceZed.Controller).FindNewEnemy(); + } + Victims.TakeDamage(damageScale * DamageAmount,Instigator,Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) + * dir,(damageScale * Momentum * dir),DamageType); + + if(Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0) + NumKilled ++; + } + } + else + { + if( Instigator != none && KFP.Health > 0 && KFP.Health < KFP.HealthMax ) + { + if ( KFP.bCanBeHealed ) + { + PlayersHealed += 1; + MedicReward = HealBoostAmount; + + PRI = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo); + + if ( PRI != none && PRI.ClientVeteranSkill != none ) + { + MedicReward *= PRI.ClientVeteranSkill.Static.GetHealPotency(PRI); + } + + HealSum = MedicReward; + + if ( (KFP.Health + KFP.healthToGive + MedicReward) > KFP.HealthMax ) + { + MedicReward = KFP.HealthMax - (KFP.Health + KFP.healthToGive); + if ( MedicReward < 0 ) + { + MedicReward = 0; + } + } + + //log(Level.TimeSeconds@"Healing "$KFP$" for "$HealSum$" base healamount "$HealBoostAmount$" health"); + KFP.GiveHealth(HealSum, KFP.HealthMax); + + if ( PRI != none ) + { + if ( MedicReward > 0 && KFSteamStatsAndAchievements(PRI.SteamStatsAndAchievements) != none ) + { + KFSteamStatsAndAchievements(PRI.SteamStatsAndAchievements).AddDamageHealed(MedicReward, false, true); + } + + // Give the medic reward money as a percentage of how much of the person's health they healed + MedicReward = int((FMin(float(MedicReward),KFP.HealthMax)/KFP.HealthMax) * 60); + + PRI.ReceiveRewardForHealing( MedicReward, KFP ); + + if ( KFHumanPawn(Instigator) != none ) + { + KFHumanPawn(Instigator).AlphaAmount = 255; + } + + if( PlayerController(Instigator.Controller) != none ) + { + PlayerController(Instigator.Controller).ClientMessage(SuccessfulHealMessage$KFP.GetPlayerName(), 'CriticalEvent'); + } + } + } + } + } + + KFP = none; + } + + if (PlayersHealed >= MaxNumberOfPlayers) + { + if (PRI != none) + { + KFSteamStatsAndAchievements(PRI.SteamStatsAndAchievements).HealedTeamWithMedicGrenade(); + } + } + } + bHurtEntry = false; +} +// Shoot nades in mid-air +// Alex +function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, optional int HitIndex) +{ + if ( Monster(instigatedBy) != none || instigatedBy == Instigator ) + { + if( damageType == class'SirenScreamDamage') + { + Disintegrate(HitLocation, vect(0,0,1)); + } + } +} +// Overridden to tweak the handling of the impact sound +simulated function HitWall( vector HitNormal, actor Wall ) +{ + local Vector VNorm; + local PlayerController PC; + if ( (Pawn(Wall) != none) || (GameObjective(Wall) != none) ) + { + Explode(Location, HitNormal); + return; + } + if (!bTimerSet) + { + SetTimer(ExplodeTimer, false); + bTimerSet = true; + } + // Reflect off Wall w/damping + VNorm = (Velocity dot HitNormal) * HitNormal; + Velocity = -VNorm * DampenFactor + (Velocity - VNorm) * DampenFactorParallel; + RandSpin(100000); + DesiredRotation.Roll = 0; + RotationRate.Roll = 0; + Speed = VSize(Velocity); + if ( Speed < 20 ) + { + bBounce = False; + PrePivot.Z = -1.5; + SetPhysics(PHYS_none); + Timer(); + SetTimer(0.0,False); + DesiredRotation = Rotation; + DesiredRotation.Roll = 0; + DesiredRotation.Pitch = 0; + SetRotation(DesiredRotation); + + if( Fear == none ) + { + //(jc) Changed to use MedicNade-specific grenade that's overridden to not make the ringmaster fear it + Fear = Spawn(class'AvoidMarker_MedicNade'); + Fear.SetCollisionSize(DamageRadius,DamageRadius); + Fear.StartleBots(); + } + + if ( Trail != none ) + Trail.mRegen = false; // stop the emitter from regenerating + } + else + { + if ( (Level.NetMode != NM_DedicatedServer) && (Speed > 50) ) + PlaySound(ImpactSound, SLOT_Misc ); + else + { + bFixedRotationDir = false; + bRotateToDesired = true; + DesiredRotation.Pitch = 0; + RotationRate.Pitch = 50000; + } + if ( !Level.bDropDetail && (Level.DetailMode != DM_Low) && (Level.TimeSeconds - LastSparkTime > 0.5) && EffectIsRelevant(Location,false) ) + { + PC = Level.GetLocalPlayerController(); + if ( (PC.ViewTarget != none) && VSize(PC.ViewTarget.Location - Location) < 6000 ) + Spawn(HitEffectClass,,, Location, Rotator(HitNormal)); + LastSparkTime = Level.TimeSeconds; + } + } +} +function Tick( float DeltaTime ) +{ + if( Role < ROLE_Authority ) + { + return; + } +// if( class'ROEngine.ROLevelInfo'.static.RODebugMode() ) +// { +// DrawDebugSphere( Location, DamageRadius, 12, 255, 0, 0); +// } + if( TotalHeals < MaxHeals && NextHealTime > 0 && NextHealTime < Level.TimeSeconds ) + { + TotalHeals += 1; + + HealOrHurt(Damage,DamageRadius, MyDamageType, MomentumTransfer, Location); + + if( TotalHeals >= MaxHeals ) + { + AmbientSound=none; + } + } +} +defaultproperties +{ + HealBoostAmount=10 + MaxHeals=4 + HealInterval=1.000000 + ExplosionSound=SoundGroup'KF_GrenadeSnd.NadeBase.MedicNade_Explode' + SuccessfulHealMessage="You healed " + MaxNumberOfPlayers=6 + Damage=50.000000 + DamageRadius=175.000000 + MyDamageType=Class'KFMod.DamTypeMedicNade' + StaticMesh=StaticMesh'KF_pickups5_Trip.nades.MedicNade_Pickup' + LifeSpan=8.000000 + DrawScale=1.000000 + SoundVolume=150 + SoundRadius=100.000000 + TransientSoundVolume=2.000000 + TransientSoundRadius=200.000000 +} diff --git a/sources/Weapons/Playable/Grenades/NiceNade.uc b/sources/Weapons/Playable/Grenades/NiceNade.uc index a9b3610..9e45fa5 100644 --- a/sources/Weapons/Playable/Grenades/NiceNade.uc +++ b/sources/Weapons/Playable/Grenades/NiceNade.uc @@ -1,91 +1,215 @@ -class NiceNade extends ScrnNade; -var class AvoidMarkerClass; -var class niceExplosiveDamage; -// Overloaded to implement nade skills -simulated function Explode(vector HitLocation, vector HitNormal){ - local PlayerController LocalPlayer; - local Projectile P; - local byte i; - bHasExploded = true; - BlowUp(HitLocation); - // null reference fix - if(ExplodeSounds.length > 0) PlaySound(ExplodeSounds[rand(ExplodeSounds.length)],,2.0); - for(i = Rand(6);i < 10;i ++){ P = Spawn(ShrapnelClass,,,,RotRand(True)); if(P != none) P.RemoteRole = ROLE_None; - } - for(i = Rand(6);i < 10;i ++){ P = Spawn(ShrapnelClass,,,,RotRand(True)); if(P != none) P.RemoteRole = ROLE_none; - } - if(EffectIsRelevant(Location,false)){ Spawn(Class'KFmod.KFNadeExplosion',,, HitLocation, rotator(vect(0,0,1))); Spawn(ExplosionDecal, self,, HitLocation, rotator(-HitNormal)); - } - // Shake nearby players screens - LocalPlayer = Level.GetLocalPlayerController(); - if((LocalPlayer != none) && (VSize(Location - LocalPlayer.ViewTarget.Location) < (DamageRadius * 1.5))) LocalPlayer.ShakeView(RotMag, RotRate, RotTime, OffsetMag, OffsetRate, OffsetTime); - Destroy(); -} -function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Momentum, class damageType, optional int HitIndex){ - if(Monster(instigatedBy) != none || instigatedBy == Instigator){ if(DamageType == class'SirenScreamDamage') Disintegrate(HitLocation, vect(0,0,1)); else Explode(HitLocation, vect(0,0,1)); - } -} -simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) -{ - local actor Victims; - local float damageScale, dist; - local vector dir; - local int NumKilled; - local KFMonster KFMonsterVictim; - local bool bMonster; - local Pawn P; - local KFPawn KFP; - local array CheckedPawns; - local int i; - local bool bAlreadyChecked; - local SRStatsBase Stats; - - if ( bHurtEntry ) return; - bHurtEntry = true; - - if( Role == ROLE_Authority && Instigator != none && Instigator.PlayerReplicationInfo != none ) Stats = SRStatsBase(Instigator.PlayerReplicationInfo.SteamStatsAndAchievements); - foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) - { P = none; KFMonsterVictim = none; bMonster = false; KFP = none; bAlreadyChecked = false; - // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') && ExtendedZCollision(Victims)==None ) { if( (Instigator==None || Instigator.Health<=0) && KFPawn(Victims)!=None ) Continue; dir = Victims.Location - HitLocation; dist = FMax(1,VSize(dir)); dir = dir/dist; damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); - if ( Instigator == None || Instigator.Controller == None ) { Victims.SetDelayedDamageInstigatorController( InstigatorController ); } - P = Pawn(Victims); if( P != none ) { for (i = 0; i < CheckedPawns.Length; i++) { if (CheckedPawns[i] == P) { bAlreadyChecked = true; break; } } if( bAlreadyChecked ) continue; CheckedPawns[CheckedPawns.Length] = P; - KFMonsterVictim = KFMonster(Victims); if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) KFMonsterVictim = none; - KFP = KFPawn(Victims); - if( KFMonsterVictim != none ) { damageScale *= KFMonsterVictim.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); bMonster = true; // in case TakeDamage() and further Die() deletes the monster } else if( KFP != none ) { damageScale *= KFP.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); } - if ( damageScale <= 0) continue; - // Scrake Nader ach if ( Role == ROLE_Authority && KFMonsterVictim != none && ZombieScrake(KFMonsterVictim) != none ) { // need to check Scrake's stun before dealing damage, because he can unstun by himself from damage received ScrakeNader(damageScale * DamageAmount, ZombieScrake(KFMonsterVictim), Stats); } } if(NiceMonster(Victims) != none) Victims.TakeDamage(damageScale * DamageAmount,Instigator,Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir ,(damageScale * Momentum * dir), niceExplosiveDamage); else Victims.TakeDamage(damageScale * DamageAmount,Instigator,Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir ,(damageScale * Momentum * dir), DamageType); - if( bMonster && (KFMonsterVictim == none || KFMonsterVictim.Health < 1) ) { NumKilled++; } - if (Vehicle(Victims) != None && Vehicle(Victims).Health > 0) { Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); } } - } - - if( Role == ROLE_Authority ) - { if ( bBlewInHands && NumKilled >= 5 && Stats != none ) class'ScrnBalanceSrv.ScrnAchievements'.static.ProgressAchievementByID(Stats.Rep, 'SuicideBomber', 1); - if ( NumKilled >= 4 ) { KFGameType(Level.Game).DramaticEvent(0.05); } else if ( NumKilled >= 2 ) { KFGameType(Level.Game).DramaticEvent(0.03); } - } - bHurtEntry = false; -} -// Overridden to spawn different AvoidMarker -simulated function HitWall( vector HitNormal, actor Wall ){ - local Vector VNorm; - local PlayerController PC; - if((Pawn(Wall) != none) || (GameObjective(Wall) != none)){ Explode(Location, HitNormal); return; - } - if(!bTimerSet){ SetTimer(ExplodeTimer, false); bTimerSet = true; - } - // Reflect off Wall w/damping - VNorm = (Velocity dot HitNormal) * HitNormal; - Velocity = -VNorm * DampenFactor + (Velocity - VNorm) * DampenFactorParallel; - RandSpin(100000); - DesiredRotation.Roll = 0; - RotationRate.Roll = 0; - Speed = VSize(Velocity); - if(Speed < 20){ bBounce = false; PrePivot.Z = -1.5; SetPhysics(PHYS_none); DesiredRotation = Rotation; DesiredRotation.Roll = 0; DesiredRotation.Pitch = 0; SetRotation(DesiredRotation); - if(Fear == none){ Fear = Spawn(AvoidMarkerClass); Fear.SetCollisionSize(DamageRadius, DamageRadius); Fear.StartleBots(); } - if(Trail != none) Trail.mRegen = false; // stop the emitter from regenerating - } - else{ if((Level.NetMode != NM_DedicatedServer) && (Speed > 50)) PlaySound(ImpactSound, SLOT_Misc ); else{ bFixedRotationDir = false; bRotateToDesired = true; DesiredRotation.Pitch = 0; RotationRate.Pitch = 50000; } if(!Level.bDropDetail && (Level.DetailMode != DM_Low) && (Level.TimeSeconds - LastSparkTime > 0.5) && EffectIsRelevant(Location,false)){ PC = Level.GetLocalPlayerController(); if ( (PC.ViewTarget != none) && VSize(PC.ViewTarget.Location - Location) < 6000 ) Spawn(HitEffectClass,,, Location, Rotator(HitNormal)); LastSparkTime = Level.TimeSeconds; } - } -} -defaultproperties -{ AvoidMarkerClass=Class'NicePack.NiceAvoidMarkerExplosive' niceExplosiveDamage=Class'NicePack.NiceDamTypeDemoExplosion' -} +class NiceNade extends ScrnNade; +var class AvoidMarkerClass; +var class niceExplosiveDamage; +// Overloaded to implement nade skills +simulated function Explode(vector HitLocation, vector HitNormal){ + local PlayerController LocalPlayer; + local Projectile P; + local byte i; + bHasExploded = true; + BlowUp(HitLocation); + // null reference fix + if(ExplodeSounds.length > 0) + PlaySound(ExplodeSounds[rand(ExplodeSounds.length)],,2.0); + for(i = Rand(6);i < 10;i ++){ + P = Spawn(ShrapnelClass,,,,RotRand(True)); + if(P != none) + P.RemoteRole = ROLE_None; + } + for(i = Rand(6);i < 10;i ++){ + P = Spawn(ShrapnelClass,,,,RotRand(True)); + if(P != none) + P.RemoteRole = ROLE_none; + } + if(EffectIsRelevant(Location,false)){ + Spawn(Class'KFmod.KFNadeExplosion',,, HitLocation, rotator(vect(0,0,1))); + Spawn(ExplosionDecal, self,, HitLocation, rotator(-HitNormal)); + } + // Shake nearby players screens + LocalPlayer = Level.GetLocalPlayerController(); + if((LocalPlayer != none) && (VSize(Location - LocalPlayer.ViewTarget.Location) < (DamageRadius * 1.5))) + LocalPlayer.ShakeView(RotMag, RotRate, RotTime, OffsetMag, OffsetRate, OffsetTime); + Destroy(); +} +function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Momentum, class damageType, optional int HitIndex){ + if(Monster(instigatedBy) != none || instigatedBy == Instigator){ + if(DamageType == class'SirenScreamDamage') + Disintegrate(HitLocation, vect(0,0,1)); + else + Explode(HitLocation, vect(0,0,1)); + } +} +simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) +{ + local actor Victims; + local float damageScale, dist; + local vector dir; + local int NumKilled; + local KFMonster KFMonsterVictim; + local bool bMonster; + local Pawn P; + local KFPawn KFP; + local array CheckedPawns; + local int i; + local bool bAlreadyChecked; + local SRStatsBase Stats; + + if ( bHurtEntry ) + return; + bHurtEntry = true; + + if( Role == ROLE_Authority && Instigator != none && Instigator.PlayerReplicationInfo != none ) + Stats = SRStatsBase(Instigator.PlayerReplicationInfo.SteamStatsAndAchievements); + + foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) + { + P = none; + KFMonsterVictim = none; + bMonster = false; + KFP = none; + bAlreadyChecked = false; + + // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag + if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') + && ExtendedZCollision(Victims)==None ) + { + if( (Instigator==None || Instigator.Health<=0) && KFPawn(Victims)!=None ) + Continue; + dir = Victims.Location - HitLocation; + dist = FMax(1,VSize(dir)); + dir = dir/dist; + damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); + + if ( Instigator == None || Instigator.Controller == None ) + { + Victims.SetDelayedDamageInstigatorController( InstigatorController ); + } + + P = Pawn(Victims); + if( P != none ) { + for (i = 0; i < CheckedPawns.Length; i++) { + if (CheckedPawns[i] == P) { + bAlreadyChecked = true; + break; + } + } + if( bAlreadyChecked ) + continue; + CheckedPawns[CheckedPawns.Length] = P; + + KFMonsterVictim = KFMonster(Victims); + if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) + KFMonsterVictim = none; + + KFP = KFPawn(Victims); + + if( KFMonsterVictim != none ) { + damageScale *= KFMonsterVictim.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); + bMonster = true; // in case TakeDamage() and further Die() deletes the monster + } + else if( KFP != none ) { + damageScale *= KFP.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); + } + + if ( damageScale <= 0) + continue; + + // Scrake Nader ach + if ( Role == ROLE_Authority && KFMonsterVictim != none && ZombieScrake(KFMonsterVictim) != none ) { + // need to check Scrake's stun before dealing damage, because he can unstun by himself from damage received + ScrakeNader(damageScale * DamageAmount, ZombieScrake(KFMonsterVictim), Stats); + } + } + if(NiceMonster(Victims) != none) + Victims.TakeDamage(damageScale * DamageAmount,Instigator,Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir + ,(damageScale * Momentum * dir), niceExplosiveDamage); + else + Victims.TakeDamage(damageScale * DamageAmount,Instigator,Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir + ,(damageScale * Momentum * dir), DamageType); + + if( bMonster && (KFMonsterVictim == none || KFMonsterVictim.Health < 1) ) { + NumKilled++; + } + + if (Vehicle(Victims) != None && Vehicle(Victims).Health > 0) + { + Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); + } + } + } + + if( Role == ROLE_Authority ) + { + if ( bBlewInHands && NumKilled >= 5 && Stats != none ) + class'ScrnBalanceSrv.ScrnAchievements'.static.ProgressAchievementByID(Stats.Rep, 'SuicideBomber', 1); + + if ( NumKilled >= 4 ) + { + KFGameType(Level.Game).DramaticEvent(0.05); + } + else if ( NumKilled >= 2 ) + { + KFGameType(Level.Game).DramaticEvent(0.03); + } + } + bHurtEntry = false; +} +// Overridden to spawn different AvoidMarker +simulated function HitWall( vector HitNormal, actor Wall ){ + local Vector VNorm; + local PlayerController PC; + if((Pawn(Wall) != none) || (GameObjective(Wall) != none)){ + Explode(Location, HitNormal); + return; + } + if(!bTimerSet){ + SetTimer(ExplodeTimer, false); + bTimerSet = true; + } + // Reflect off Wall w/damping + VNorm = (Velocity dot HitNormal) * HitNormal; + Velocity = -VNorm * DampenFactor + (Velocity - VNorm) * DampenFactorParallel; + RandSpin(100000); + DesiredRotation.Roll = 0; + RotationRate.Roll = 0; + Speed = VSize(Velocity); + if(Speed < 20){ + bBounce = false; + PrePivot.Z = -1.5; + SetPhysics(PHYS_none); + DesiredRotation = Rotation; + DesiredRotation.Roll = 0; + DesiredRotation.Pitch = 0; + SetRotation(DesiredRotation); + + if(Fear == none){ + Fear = Spawn(AvoidMarkerClass); + Fear.SetCollisionSize(DamageRadius, DamageRadius); + Fear.StartleBots(); + } + + if(Trail != none) + Trail.mRegen = false; // stop the emitter from regenerating + } + else{ + if((Level.NetMode != NM_DedicatedServer) && (Speed > 50)) + PlaySound(ImpactSound, SLOT_Misc ); + else{ + bFixedRotationDir = false; + bRotateToDesired = true; + DesiredRotation.Pitch = 0; + RotationRate.Pitch = 50000; + } + if(!Level.bDropDetail && (Level.DetailMode != DM_Low) && (Level.TimeSeconds - LastSparkTime > 0.5) && EffectIsRelevant(Location,false)){ + PC = Level.GetLocalPlayerController(); + if ( (PC.ViewTarget != none) && VSize(PC.ViewTarget.Location - Location) < 6000 ) + Spawn(HitEffectClass,,, Location, Rotator(HitNormal)); + LastSparkTime = Level.TimeSeconds; + } + } +} +defaultproperties +{ + AvoidMarkerClass=Class'NicePack.NiceAvoidMarkerExplosive' + niceExplosiveDamage=Class'NicePack.NiceDamTypeDemoExplosion' +} diff --git a/sources/Weapons/Playable/Grenades/NiceNadeHealing.uc b/sources/Weapons/Playable/Grenades/NiceNadeHealing.uc index b0032b5..7133292 100644 --- a/sources/Weapons/Playable/Grenades/NiceNadeHealing.uc +++ b/sources/Weapons/Playable/Grenades/NiceNadeHealing.uc @@ -1,22 +1,57 @@ -class NiceNadeHealing extends Emitter; -var bool bFlashed; -simulated function PostBeginPlay() -{ - Super.Postbeginplay(); - NadeLight(); -} -simulated function NadeLight() -{ - if ( !Level.bDropDetail && (Instigator != none) && ((Level.TimeSeconds - LastRenderTime < 0.2) || (PlayerController(Instigator.Controller) != none)) ) - { bDynamicLight = true; SetTimer(0.25, false); - } - else Timer(); -} -simulated function Timer() -{ - bDynamicLight = false; -} -defaultproperties -{ Begin Object Class=SpriteEmitter Name=SpriteEmitter0 UseColorScale=True RespawnDeadParticles=False SpinParticles=True UseSizeScale=True UseRegularSizeScale=False UniformSize=True AutomaticInitialSpawning=False BlendBetweenSubdivisions=True ColorScale(0)=(Color=(B=255,G=128,A=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=161,G=61,R=61,A=255)) FadeOutFactor=(W=0.000000,X=0.000000,Y=0.000000,Z=0.000000) FadeOutStartTime=5.000000 SpinsPerSecondRange=(Y=(Min=0.050000,Max=0.100000),Z=(Min=0.050000,Max=0.100000)) StartSpinRange=(X=(Min=-0.500000,Max=0.500000),Y=(Max=1.000000),Z=(Max=1.000000)) SizeScale(0)=(RelativeSize=1.000000) SizeScale(1)=(RelativeTime=1.000000,RelativeSize=5.000000) StartSizeRange=(X=(Min=40.000000,Max=40.000000),Y=(Min=40.000000,Max=40.000000),Z=(Min=40.000000,Max=40.000000)) InitialParticlesPerSecond=5000.000000 DrawStyle=PTDS_AlphaBlend Texture=Texture'kf_fx_trip_t.Misc.smoke_animated' TextureUSubdivisions=8 TextureVSubdivisions=8 LifetimeRange=(Min=7.000000,Max=7.000000) StartVelocityRange=(X=(Min=-750.000000,Max=750.000000),Y=(Min=-750.000000,Max=750.000000)) VelocityLossRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000)) End Object Emitters(0)=SpriteEmitter'NicePack.NiceNadeHealing.SpriteEmitter0' - AutoDestroy=True bNoDelete=False RemoteRole=ROLE_SimulatedProxy bNotOnDedServer=False -} +class NiceNadeHealing extends Emitter; +var bool bFlashed; +simulated function PostBeginPlay() +{ + Super.Postbeginplay(); + NadeLight(); +} +simulated function NadeLight() +{ + if ( !Level.bDropDetail && (Instigator != none) + && ((Level.TimeSeconds - LastRenderTime < 0.2) || (PlayerController(Instigator.Controller) != none)) ) + { + bDynamicLight = true; + SetTimer(0.25, false); + } + else Timer(); +} +simulated function Timer() +{ + bDynamicLight = false; +} +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter0 + UseColorScale=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + BlendBetweenSubdivisions=True + ColorScale(0)=(Color=(B=255,G=128,A=255)) + ColorScale(1)=(RelativeTime=1.000000,Color=(B=161,G=61,R=61,A=255)) + FadeOutFactor=(W=0.000000,X=0.000000,Y=0.000000,Z=0.000000) + FadeOutStartTime=5.000000 + SpinsPerSecondRange=(Y=(Min=0.050000,Max=0.100000),Z=(Min=0.050000,Max=0.100000)) + StartSpinRange=(X=(Min=-0.500000,Max=0.500000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScale(0)=(RelativeSize=1.000000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=5.000000) + StartSizeRange=(X=(Min=40.000000,Max=40.000000),Y=(Min=40.000000,Max=40.000000),Z=(Min=40.000000,Max=40.000000)) + InitialParticlesPerSecond=5000.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'kf_fx_trip_t.Misc.smoke_animated' + TextureUSubdivisions=8 + TextureVSubdivisions=8 + LifetimeRange=(Min=7.000000,Max=7.000000) + StartVelocityRange=(X=(Min=-750.000000,Max=750.000000),Y=(Min=-750.000000,Max=750.000000)) + VelocityLossRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000)) + End Object + Emitters(0)=SpriteEmitter'NicePack.NiceNadeHealing.SpriteEmitter0' + + AutoDestroy=True + bNoDelete=False + RemoteRole=ROLE_SimulatedProxy + bNotOnDedServer=False +} diff --git a/sources/Weapons/Playable/Grenades/NiceNadeHealingFast.uc b/sources/Weapons/Playable/Grenades/NiceNadeHealingFast.uc index 1a2603c..eb8c513 100644 --- a/sources/Weapons/Playable/Grenades/NiceNadeHealingFast.uc +++ b/sources/Weapons/Playable/Grenades/NiceNadeHealingFast.uc @@ -1,22 +1,57 @@ -class NiceNadeHealingFast extends Emitter; -var bool bFlashed; -simulated function PostBeginPlay() -{ - Super.Postbeginplay(); - NadeLight(); -} -simulated function NadeLight() -{ - if ( !Level.bDropDetail && (Instigator != none) && ((Level.TimeSeconds - LastRenderTime < 0.2) || (PlayerController(Instigator.Controller) != none)) ) - { bDynamicLight = true; SetTimer(0.25, false); - } - else Timer(); -} -simulated function Timer() -{ - bDynamicLight = false; -} -defaultproperties -{ Begin Object Class=SpriteEmitter Name=SpriteEmitter0 UseColorScale=True RespawnDeadParticles=False SpinParticles=True UseSizeScale=True UseRegularSizeScale=False UniformSize=True AutomaticInitialSpawning=False BlendBetweenSubdivisions=True ColorScale(0)=(Color=(G=255,R=200,A=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=61,G=105,R=105,A=255)) FadeOutFactor=(W=0.000000,X=0.000000,Y=0.000000,Z=0.000000) FadeOutStartTime=5.000000 SpinsPerSecondRange=(Y=(Min=0.050000,Max=0.100000),Z=(Min=0.050000,Max=0.100000)) StartSpinRange=(X=(Min=-0.500000,Max=0.500000),Y=(Max=1.000000),Z=(Max=1.000000)) SizeScale(0)=(RelativeSize=1.000000) SizeScale(1)=(RelativeTime=1.000000,RelativeSize=5.000000) StartSizeRange=(X=(Min=40.000000,Max=40.000000),Y=(Min=40.000000,Max=40.000000),Z=(Min=40.000000,Max=40.000000)) InitialParticlesPerSecond=5000.000000 DrawStyle=PTDS_AlphaBlend Texture=Texture'kf_fx_trip_t.Misc.smoke_animated' TextureUSubdivisions=8 TextureVSubdivisions=8 LifetimeRange=(Min=3.000000,Max=3.000000) StartVelocityRange=(X=(Min=-750.000000,Max=750.000000),Y=(Min=-750.000000,Max=750.000000)) VelocityLossRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000)) End Object Emitters(0)=SpriteEmitter'NicePack.NiceNadeHealingFast.SpriteEmitter0' - AutoDestroy=True bNoDelete=False RemoteRole=ROLE_SimulatedProxy bNotOnDedServer=False -} +class NiceNadeHealingFast extends Emitter; +var bool bFlashed; +simulated function PostBeginPlay() +{ + Super.Postbeginplay(); + NadeLight(); +} +simulated function NadeLight() +{ + if ( !Level.bDropDetail && (Instigator != none) + && ((Level.TimeSeconds - LastRenderTime < 0.2) || (PlayerController(Instigator.Controller) != none)) ) + { + bDynamicLight = true; + SetTimer(0.25, false); + } + else Timer(); +} +simulated function Timer() +{ + bDynamicLight = false; +} +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter0 + UseColorScale=True + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + BlendBetweenSubdivisions=True + ColorScale(0)=(Color=(G=255,R=200,A=255)) + ColorScale(1)=(RelativeTime=1.000000,Color=(B=61,G=105,R=105,A=255)) + FadeOutFactor=(W=0.000000,X=0.000000,Y=0.000000,Z=0.000000) + FadeOutStartTime=5.000000 + SpinsPerSecondRange=(Y=(Min=0.050000,Max=0.100000),Z=(Min=0.050000,Max=0.100000)) + StartSpinRange=(X=(Min=-0.500000,Max=0.500000),Y=(Max=1.000000),Z=(Max=1.000000)) + SizeScale(0)=(RelativeSize=1.000000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=5.000000) + StartSizeRange=(X=(Min=40.000000,Max=40.000000),Y=(Min=40.000000,Max=40.000000),Z=(Min=40.000000,Max=40.000000)) + InitialParticlesPerSecond=5000.000000 + DrawStyle=PTDS_AlphaBlend + Texture=Texture'kf_fx_trip_t.Misc.smoke_animated' + TextureUSubdivisions=8 + TextureVSubdivisions=8 + LifetimeRange=(Min=3.000000,Max=3.000000) + StartVelocityRange=(X=(Min=-750.000000,Max=750.000000),Y=(Min=-750.000000,Max=750.000000)) + VelocityLossRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000)) + End Object + Emitters(0)=SpriteEmitter'NicePack.NiceNadeHealingFast.SpriteEmitter0' + + AutoDestroy=True + bNoDelete=False + RemoteRole=ROLE_SimulatedProxy + bNotOnDedServer=False +} diff --git a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1AR.uc b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1AR.uc index c1a93c5..83694de 100644 --- a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1AR.uc +++ b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1AR.uc @@ -1,13 +1,70 @@ -class NiceAUG_A1AR extends NiceScopedWeapon; -#EXEC OBJ LOAD FILE=HMG_T.utx -#EXEC OBJ LOAD FILE=HMG_S.uax -#EXEC OBJ LOAD FILE=HMG_A.ukx -simulated function AltFire(float F){ - if(ReadyToFire(0)) DoToggle(); -} -exec function SwitchModes(){ - DoToggle(); -} -defaultproperties -{ lenseMaterialID=4 scopePortalFOVHigh=17.000000 scopePortalFOV=17.000000 ZoomMatRef="HMG_T.AUG.AUG-A1_scope_FB" ScriptedTextureFallbackRef="HMG_T.AUG.alpha_lens_64x64" CrosshairTexRef="HMG_T.AUG.AUG-A1_scope" reloadPreEndFrame=0.400000 reloadEndFrame=0.645000 reloadChargeEndFrame=0.805000 reloadMagStartFrame=0.500000 reloadChargeStartFrame=0.700000 MagazineBone="clip" bHasScope=True ZoomedDisplayFOVHigh=70.000000 MagCapacity=30 ReloadRate=3.500000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_BullPup" Weight=9.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 SleeveNum=0 TraderInfoTexture=Texture'HMG_T.AUG.trader_AUG_A1' bIsTier2Weapon=True MeshRef="HMG_A.AUG_A1_mesh" SkinRefs(0)="KF_Weapons3_Trip_T.hands.Priest_Hands_1st_P" SkinRefs(1)="HMG_T.AUG.body" SkinRefs(2)="HMG_T.AUG.mag" SkinRefs(3)="HMG_T.AUG.Rec" SkinRefs(4)="HMG_T.AUG.alpha_lens_64x64" SelectSoundRef="HMG_S.AUGND.aug_draw" HudImageRef="HMG_T.AUG.AUG_A1_Unselected" SelectedHudImageRef="HMG_T.AUG.AUG_A1_Selected" PlayerIronSightFOV=32.000000 ZoomedDisplayFOV=70.000000 FireModeClass(0)=Class'NicePack.NiceAUG_A1ARFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="Steyr AUG 1977 Steyr-Daimler-Puch AG & Co KG" DisplayFOV=65.000000 Priority=170 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=3 PickupClass=Class'NicePack.NiceAUG_A1ARPickup' PlayerViewOffset=(X=15.000000,Y=12.000000,Z=-2.000000) BobDamping=5.000000 AttachmentClass=Class'NicePack.NiceAUG_A1ARAttachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="Steyr AUG A1" -} +class NiceAUG_A1AR extends NiceScopedWeapon; +#EXEC OBJ LOAD FILE=HMG_T.utx +#EXEC OBJ LOAD FILE=HMG_S.uax +#EXEC OBJ LOAD FILE=HMG_A.ukx +simulated function AltFire(float F){ + if(ReadyToFire(0)) + DoToggle(); +} +exec function SwitchModes(){ + DoToggle(); +} +defaultproperties +{ + lenseMaterialID=4 + scopePortalFOVHigh=17.000000 + scopePortalFOV=17.000000 + ZoomMatRef="HMG_T.AUG.AUG-A1_scope_FB" + ScriptedTextureFallbackRef="HMG_T.AUG.alpha_lens_64x64" + CrosshairTexRef="HMG_T.AUG.AUG-A1_scope" + reloadPreEndFrame=0.400000 + reloadEndFrame=0.645000 + reloadChargeEndFrame=0.805000 + reloadMagStartFrame=0.500000 + reloadChargeStartFrame=0.700000 + MagazineBone="clip" + bHasScope=True + ZoomedDisplayFOVHigh=70.000000 + MagCapacity=30 + ReloadRate=3.500000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_BullPup" + Weight=9.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=65.000000 + SleeveNum=0 + TraderInfoTexture=Texture'HMG_T.AUG.trader_AUG_A1' + bIsTier2Weapon=True + MeshRef="HMG_A.AUG_A1_mesh" + SkinRefs(0)="KF_Weapons3_Trip_T.hands.Priest_Hands_1st_P" + SkinRefs(1)="HMG_T.AUG.body" + SkinRefs(2)="HMG_T.AUG.mag" + SkinRefs(3)="HMG_T.AUG.Rec" + SkinRefs(4)="HMG_T.AUG.alpha_lens_64x64" + SelectSoundRef="HMG_S.AUGND.aug_draw" + HudImageRef="HMG_T.AUG.AUG_A1_Unselected" + SelectedHudImageRef="HMG_T.AUG.AUG_A1_Selected" + PlayerIronSightFOV=32.000000 + ZoomedDisplayFOV=70.000000 + FireModeClass(0)=Class'NicePack.NiceAUG_A1ARFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.650000 + CurrentRating=0.650000 + Description="Steyr AUG 1977 Steyr-Daimler-Puch AG & Co KG" + DisplayFOV=65.000000 + Priority=170 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=4 + GroupOffset=3 + PickupClass=Class'NicePack.NiceAUG_A1ARPickup' + PlayerViewOffset=(X=15.000000,Y=12.000000,Z=-2.000000) + BobDamping=5.000000 + AttachmentClass=Class'NicePack.NiceAUG_A1ARAttachment' + IconCoords=(X1=253,Y1=146,X2=333,Y2=181) + ItemName="Steyr AUG A1" +} diff --git a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAmmo.uc b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAmmo.uc index a3d199d..4a9618c 100644 --- a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAmmo.uc +++ b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAmmo.uc @@ -1,4 +1,12 @@ -class NiceAUG_A1ARAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceAUG_A1ARPickup' AmmoPickupAmount=30 MaxAmmo=240 InitialAmount=60 PickupClass=Class'NicePack.NiceAUG_A1ARAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="5.56mm NATO" -} +class NiceAUG_A1ARAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceAUG_A1ARPickup' + AmmoPickupAmount=30 + MaxAmmo=240 + InitialAmount=60 + PickupClass=Class'NicePack.NiceAUG_A1ARAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="5.56mm NATO" +} diff --git a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAmmoPickup.uc b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAmmoPickup.uc index 4b958e2..99fa1bf 100644 --- a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAmmoPickup.uc +++ b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceAUG_A1ARAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=30 InventoryType=Class'NicePack.NiceAUG_A1ARAmmo' PickupMessage="5.56mm NATO" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceAUG_A1ARAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=30 + InventoryType=Class'NicePack.NiceAUG_A1ARAmmo' + PickupMessage="5.56mm NATO" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAttachment.uc b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAttachment.uc index 0093a6b..c5fd180 100644 --- a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAttachment.uc +++ b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARAttachment.uc @@ -1,4 +1,59 @@ -class NiceAUG_A1ARAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_SCAR" MovementAnims(1)="JogB_SCAR" MovementAnims(2)="JogL_SCAR" MovementAnims(3)="JogR_SCAR" TurnLeftAnim="TurnL_SCAR" TurnRightAnim="TurnR_SCAR" CrouchAnims(0)="CHWalkF_SCAR" CrouchAnims(1)="CHWalkB_SCAR" CrouchAnims(2)="CHWalkL_SCAR" CrouchAnims(3)="CHWalkR_SCAR" WalkAnims(0)="WalkF_SCAR" WalkAnims(1)="WalkB_SCAR" WalkAnims(2)="WalkL_SCAR" WalkAnims(3)="WalkR_SCAR" CrouchTurnRightAnim="CH_TurnR_SCAR" CrouchTurnLeftAnim="CH_TurnL_SCAR" IdleCrouchAnim="CHIdle_SCAR" IdleWeaponAnim="Idle_SCAR" IdleRestAnim="Idle_SCAR" IdleChatAnim="Idle_SCAR" IdleHeavyAnim="Idle_SCAR" IdleRifleAnim="Idle_SCAR" FireAnims(0)="Fire_SCAR" FireAnims(1)="Fire_SCAR" FireAnims(2)="Fire_SCAR" FireAnims(3)="Fire_SCAR" FireAltAnims(0)="Fire_SCAR" FireAltAnims(1)="Fire_SCAR" FireAltAnims(2)="Fire_SCAR" FireAltAnims(3)="Fire_SCAR" FireCrouchAnims(0)="CHFire_SCAR" FireCrouchAnims(1)="CHFire_SCAR" FireCrouchAnims(2)="CHFire_SCAR" FireCrouchAnims(3)="CHFire_SCAR" FireCrouchAltAnims(0)="CHFire_SCAR" FireCrouchAltAnims(1)="CHFire_SCAR" FireCrouchAltAnims(2)="CHFire_SCAR" FireCrouchAltAnims(3)="CHFire_SCAR" HitAnims(0)="HitF_SCAR" HitAnims(1)="HitB_SCAR" HitAnims(2)="HitL_SCAR" HitAnims(3)="HitR_SCAR" PostFireBlendStandAnim="Blend_SCAR" PostFireBlendCrouchAnim="CHBlend_SCAR" MeshRef="HMG_A.AUG_A1_3rd" bHeavy=True bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 DrawScale=0.800000 -} +class NiceAUG_A1ARAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + ShellEjectBoneName="Shell_eject" + MovementAnims(0)="JogF_SCAR" + MovementAnims(1)="JogB_SCAR" + MovementAnims(2)="JogL_SCAR" + MovementAnims(3)="JogR_SCAR" + TurnLeftAnim="TurnL_SCAR" + TurnRightAnim="TurnR_SCAR" + CrouchAnims(0)="CHWalkF_SCAR" + CrouchAnims(1)="CHWalkB_SCAR" + CrouchAnims(2)="CHWalkL_SCAR" + CrouchAnims(3)="CHWalkR_SCAR" + WalkAnims(0)="WalkF_SCAR" + WalkAnims(1)="WalkB_SCAR" + WalkAnims(2)="WalkL_SCAR" + WalkAnims(3)="WalkR_SCAR" + CrouchTurnRightAnim="CH_TurnR_SCAR" + CrouchTurnLeftAnim="CH_TurnL_SCAR" + IdleCrouchAnim="CHIdle_SCAR" + IdleWeaponAnim="Idle_SCAR" + IdleRestAnim="Idle_SCAR" + IdleChatAnim="Idle_SCAR" + IdleHeavyAnim="Idle_SCAR" + IdleRifleAnim="Idle_SCAR" + FireAnims(0)="Fire_SCAR" + FireAnims(1)="Fire_SCAR" + FireAnims(2)="Fire_SCAR" + FireAnims(3)="Fire_SCAR" + FireAltAnims(0)="Fire_SCAR" + FireAltAnims(1)="Fire_SCAR" + FireAltAnims(2)="Fire_SCAR" + FireAltAnims(3)="Fire_SCAR" + FireCrouchAnims(0)="CHFire_SCAR" + FireCrouchAnims(1)="CHFire_SCAR" + FireCrouchAnims(2)="CHFire_SCAR" + FireCrouchAnims(3)="CHFire_SCAR" + FireCrouchAltAnims(0)="CHFire_SCAR" + FireCrouchAltAnims(1)="CHFire_SCAR" + FireCrouchAltAnims(2)="CHFire_SCAR" + FireCrouchAltAnims(3)="CHFire_SCAR" + HitAnims(0)="HitF_SCAR" + HitAnims(1)="HitB_SCAR" + HitAnims(2)="HitL_SCAR" + HitAnims(3)="HitR_SCAR" + PostFireBlendStandAnim="Blend_SCAR" + PostFireBlendCrouchAnim="CHBlend_SCAR" + MeshRef="HMG_A.AUG_A1_3rd" + bHeavy=True + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 + DrawScale=0.800000 +} diff --git a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARFire.uc b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARFire.uc index d02cd2e..94a0f86 100644 --- a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARFire.uc +++ b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARFire.uc @@ -1,4 +1,35 @@ -class NiceAUG_A1ARFire extends NiceHeavyFire; -defaultproperties -{ ProjectileSpeed=48500.000000 FireAimedAnim="Idle_Iron" RecoilRate=0.080000 maxVerticalRecoilAngle=500 maxHorizontalRecoilAngle=250 ShellEjectClass=Class'ROEffects.KFShellEjectBullpup' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True FireSoundRef="HMG_S.AUGND.aug_fire" StereoFireSoundRef="HMG_S.AUGND.aug_fire" NoAmmoSoundRef="HMG_S.AUGND.aug_empty" DamageType=Class'NicePack.NiceDamTypeAUG_A1AR' DamageMin=105 DamageMax=105 Momentum=12000.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.200000 AmmoClass=Class'NicePack.NiceAUG_A1ARAmmo' ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=0.500000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.000000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 -} +class NiceAUG_A1ARFire extends NiceHeavyFire; +defaultproperties +{ + ProjectileSpeed=48500.000000 + FireAimedAnim="Idle_Iron" + RecoilRate=0.080000 + maxVerticalRecoilAngle=500 + maxHorizontalRecoilAngle=250 + ShellEjectClass=Class'ROEffects.KFShellEjectBullpup' + ShellEjectBoneName="Shell_eject" + bAccuracyBonusForSemiAuto=True + FireSoundRef="HMG_S.AUGND.aug_fire" + StereoFireSoundRef="HMG_S.AUGND.aug_fire" + NoAmmoSoundRef="HMG_S.AUGND.aug_empty" + DamageType=Class'NicePack.NiceDamTypeAUG_A1AR' + DamageMin=105 + DamageMax=105 + Momentum=12000.000000 + bPawnRapidFireAnim=True + TransientSoundVolume=1.800000 + FireLoopAnim="Fire" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.200000 + AmmoClass=Class'NicePack.NiceAUG_A1ARAmmo' + ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeRotTime=0.500000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.000000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARPickup.uc b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARPickup.uc index 7307039..4d7b1a7 100644 --- a/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARPickup.uc +++ b/sources/Weapons/Playable/Heavy/AUG/NiceAUG_A1ARPickup.uc @@ -1,5 +1,24 @@ -class NiceAUG_A1ARPickup extends NiceWeaponPickup; -defaultproperties -{ - cost=1000 Weight=9.000000 AmmoCost=80 BuyClipSize=25 PowerValue=45 SpeedValue=65 RangeValue=90 Description="Steyr AUG 1977 Steyr-Daimler-Puch AG & Co KG" ItemName="Steyr AUG A1" ItemShortName="AUG A1" AmmoItemName="Rounds 5.56mm NATO" CorrespondingPerkIndex=1 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceAUG_A1AR' PickupMessage="You picked up the Steyr AUG A1" PickupSound=Sound'HMG_S.AUG.aug_pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'HMG_A.AUG_A1_st' CollisionRadius=30.000000 CollisionHeight=5.000000 +class NiceAUG_A1ARPickup extends NiceWeaponPickup; +defaultproperties +{ + cost=1000 + Weight=9.000000 + AmmoCost=80 + BuyClipSize=25 + PowerValue=45 + SpeedValue=65 + RangeValue=90 + Description="Steyr AUG 1977 Steyr-Daimler-Puch AG & Co KG" + ItemName="Steyr AUG A1" + ItemShortName="AUG A1" + AmmoItemName="Rounds 5.56mm NATO" + CorrespondingPerkIndex=1 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceAUG_A1AR' + PickupMessage="You picked up the Steyr AUG A1" + PickupSound=Sound'HMG_S.AUG.aug_pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'HMG_A.AUG_A1_st' + CollisionRadius=30.000000 + CollisionHeight=5.000000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/AUG/NiceDamTypeAUG_A1AR.uc b/sources/Weapons/Playable/Heavy/AUG/NiceDamTypeAUG_A1AR.uc index 3f65dc7..ba0ef29 100644 --- a/sources/Weapons/Playable/Heavy/AUG/NiceDamTypeAUG_A1AR.uc +++ b/sources/Weapons/Playable/Heavy/AUG/NiceDamTypeAUG_A1AR.uc @@ -1,5 +1,14 @@ -class NiceDamTypeAUG_A1AR extends NiceDamageTypeVetEnforcerBullets - abstract; -defaultproperties -{ bodyDestructionMult=1.000000 HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceAUG_A1AR' DeathString="%k killed %o (Steyr AUG A1)." bRagdollBullet=True DamageThreshold=1 KDamageImpulse=5000.000000 KDeathVel=600.000000 KDeathUpKick=20.000000 -} +class NiceDamTypeAUG_A1AR extends NiceDamageTypeVetEnforcerBullets + abstract; +defaultproperties +{ + bodyDestructionMult=1.000000 + HeadShotDamageMult=2.000000 + WeaponClass=Class'NicePack.NiceAUG_A1AR' + DeathString="%k killed %o (Steyr AUG A1)." + bRagdollBullet=True + DamageThreshold=1 + KDamageImpulse=5000.000000 + KDeathVel=600.000000 + KDeathUpKick=20.000000 +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGun.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGun.uc index be675a0..d45618d 100644 --- a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGun.uc +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGun.uc @@ -1,8 +1,14 @@ -class NiceChainGun extends ChainGun; -// Don't use alt fire to toggle -simulated function AltFire(float F){} -// Don't switch fire mode -exec function SwitchModes(){} -defaultproperties -{ MagCapacity=160 Weight=12.000000 FireModeClass(0)=Class'NicePack.NiceChainGunFire' FireModeClass(1)=Class'NicePack.NiceChainGunAltFire' PickupClass=Class'NicePack.NiceChainGunPickup' ItemName="Patriarch's Chaingun" -} +class NiceChainGun extends ChainGun; +// Don't use alt fire to toggle +simulated function AltFire(float F){} +// Don't switch fire mode +exec function SwitchModes(){} +defaultproperties +{ + MagCapacity=160 + Weight=12.000000 + FireModeClass(0)=Class'NicePack.NiceChainGunFire' + FireModeClass(1)=Class'NicePack.NiceChainGunAltFire' + PickupClass=Class'NicePack.NiceChainGunPickup' + ItemName="Patriarch's Chaingun" +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAltFire.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAltFire.uc index 0bc463c..7ff5bb7 100644 --- a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAltFire.uc +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAltFire.uc @@ -1,4 +1,7 @@ -class NiceChainGunAltFire extends ChainGunAltFire; -defaultproperties -{ FireRate=1.500000 AmmoClass=Class'NicePack.NiceRocketAmmo' ProjectileClass=Class'NicePack.NiceRocketProj' -} +class NiceChainGunAltFire extends ChainGunAltFire; +defaultproperties +{ + FireRate=1.500000 + AmmoClass=Class'NicePack.NiceRocketAmmo' + ProjectileClass=Class'NicePack.NiceRocketProj' +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAmmo.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAmmo.uc index af09a8f..549e55d 100644 --- a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAmmo.uc +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAmmo.uc @@ -1,4 +1,7 @@ -class NiceChainGunAmmo extends ChainGunAmmo; -defaultproperties -{ MaxAmmo=480 InitialAmount=120 PickupClass=Class'NicePack.NiceChainGunAmmoPickup' -} +class NiceChainGunAmmo extends ChainGunAmmo; +defaultproperties +{ + MaxAmmo=480 + InitialAmount=120 + PickupClass=Class'NicePack.NiceChainGunAmmoPickup' +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAmmoPickup.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAmmoPickup.uc index eb6372f..a04c8f6 100644 --- a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAmmoPickup.uc +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunAmmoPickup.uc @@ -1,4 +1,6 @@ -class NiceChainGunAmmoPickup extends ChainGunAmmoPickup; -defaultproperties -{ AmmoAmount=120 InventoryType=Class'NicePack.NiceChainGunAmmo' -} +class NiceChainGunAmmoPickup extends ChainGunAmmoPickup; +defaultproperties +{ + AmmoAmount=120 + InventoryType=Class'NicePack.NiceChainGunAmmo' +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunFire.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunFire.uc index 532e62a..dbf78fb 100644 --- a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunFire.uc +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunFire.uc @@ -1,4 +1,8 @@ -class NiceChainGunFire extends ChainGunFire; -defaultproperties -{ maxVerticalRecoilAngle=68 maxHorizontalRecoilAngle=34 DamageType=Class'NicePack.NiceDamTypeCG' AmmoClass=Class'NicePack.NiceChainGunAmmo' -} +class NiceChainGunFire extends ChainGunFire; +defaultproperties +{ + maxVerticalRecoilAngle=68 + maxHorizontalRecoilAngle=34 + DamageType=Class'NicePack.NiceDamTypeCG' + AmmoClass=Class'NicePack.NiceChainGunAmmo' +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunPickup.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunPickup.uc index 917e098..53c07e2 100644 --- a/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunPickup.uc +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceChainGunPickup.uc @@ -1,4 +1,12 @@ -class NiceChainGunPickup extends ChainGunPickup; -defaultproperties -{ Weight=12.000000 cost=2500 AmmoCost=160 BuyClipSize=75 ItemName="Pat's Chaingun" ItemShortName="Chaingun" InventoryType=Class'NicePack.NiceChainGun' PickupMessage="You got the Patriarch's Chain Gun NW." -} +class NiceChainGunPickup extends ChainGunPickup; +defaultproperties +{ + Weight=12.000000 + cost=2500 + AmmoCost=160 + BuyClipSize=75 + ItemName="Pat's Chaingun" + ItemShortName="Chaingun" + InventoryType=Class'NicePack.NiceChainGun' + PickupMessage="You got the Patriarch's Chain Gun NW." +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceDamTypeCG.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceDamTypeCG.uc index db1e4dd..979641a 100644 --- a/sources/Weapons/Playable/Heavy/Chaingun/NiceDamTypeCG.uc +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceDamTypeCG.uc @@ -1,5 +1,13 @@ -class NiceDamTypeCG extends NiceDamTypeSPAM - abstract; -defaultproperties -{ WeaponClass=Class'NicePack.NiceChainGun' DeathString="%k killed %o (Pat's Chain Gun)." DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' DeathOverlayTime=999.000000 KDamageImpulse=14500.000000 KDeathVel=1500.000000 KDeathUpKick=200.000000 VehicleDamageScaling=0.700000 -} +class NiceDamTypeCG extends NiceDamTypeSPAM + abstract; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceChainGun' + DeathString="%k killed %o (Pat's Chain Gun)." + DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' + DeathOverlayTime=999.000000 + KDamageImpulse=14500.000000 + KDeathVel=1500.000000 + KDeathUpKick=200.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceDamTypeRocket.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceDamTypeRocket.uc index 556c4f6..f2adaee 100644 --- a/sources/Weapons/Playable/Heavy/Chaingun/NiceDamTypeRocket.uc +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceDamTypeRocket.uc @@ -1,4 +1,5 @@ -class NiceDamTypeRocket extends DamTypeLAW; -defaultproperties -{ WeaponClass=Class'NicePack.NiceChainGun' -} +class NiceDamTypeRocket extends DamTypeLAW; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceChainGun' +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceRocket.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceRocket.uc index b858d46..cf47b02 100644 --- a/sources/Weapons/Playable/Heavy/Chaingun/NiceRocket.uc +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceRocket.uc @@ -1,4 +1,14 @@ -class NiceRocket extends NiceBullet; -defaultproperties -{ charMinExplosionDist=250.000000 bDisableComplexMovement=False movementAcceleration=(Z=-490.000000) movementFallTime=1.000000 TrailClass=Class'ROEffects.PanzerfaustTrail' trailXClass=None explosionImpact=(bImportanEffect=True,decalClass=Class'ROEffects.RocketMarkDirt',EmitterClass=Class'KFMod.LawExplosion',emitterShiftWall=20.000000,emitterShiftPawn=20.000000,noiseRef="KF_LAWSnd.Rocket_Explode",noiseVolume=2.000000) disintegrationImpact=(EmitterClass=Class'KFMod.SirenNadeDeflect',noiseRef="Inf_Weapons.faust_explode_distant02",noiseVolume=2.000000) StaticMeshRef="KillingFloorStatics.LAWRocket" DrawScale=0.700000 -} +class NiceRocket extends NiceBullet; +defaultproperties +{ + charMinExplosionDist=250.000000 + bDisableComplexMovement=False + movementAcceleration=(Z=-490.000000) + movementFallTime=1.000000 + TrailClass=Class'ROEffects.PanzerfaustTrail' + trailXClass=None + explosionImpact=(bImportanEffect=True,decalClass=Class'ROEffects.RocketMarkDirt',EmitterClass=Class'KFMod.LawExplosion',emitterShiftWall=20.000000,emitterShiftPawn=20.000000,noiseRef="KF_LAWSnd.Rocket_Explode",noiseVolume=2.000000) + disintegrationImpact=(EmitterClass=Class'KFMod.SirenNadeDeflect',noiseRef="Inf_Weapons.faust_explode_distant02",noiseVolume=2.000000) + StaticMeshRef="KillingFloorStatics.LAWRocket" + DrawScale=0.700000 +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketAmmo.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketAmmo.uc index ccb2fcd..39e440d 100644 --- a/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketAmmo.uc +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketAmmo.uc @@ -1,8 +1,10 @@ -//============================================================================= -// LAW Ammo. -//============================================================================= -class NiceRocketammo extends Rocketammo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ MaxAmmo=16 PickupClass=Class'NicePack.NiceRocketAmmoPickup' -} +//============================================================================= +// LAW Ammo. +//============================================================================= +class NiceRocketammo extends Rocketammo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + MaxAmmo=16 + PickupClass=Class'NicePack.NiceRocketAmmoPickup' +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketAmmoPickup.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketAmmoPickup.uc index 67aaf57..836041c 100644 --- a/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketAmmoPickup.uc +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketAmmoPickup.uc @@ -1,4 +1,5 @@ -class NiceRocketAmmoPickup extends RocketAmmoPickup; -defaultproperties -{ InventoryType=Class'NicePack.NiceRocketAmmo' -} +class NiceRocketAmmoPickup extends RocketAmmoPickup; +defaultproperties +{ + InventoryType=Class'NicePack.NiceRocketAmmo' +} diff --git a/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketProj.uc b/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketProj.uc index 01f3802..8b27363 100644 --- a/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketProj.uc +++ b/sources/Weapons/Playable/Heavy/Chaingun/NiceRocketProj.uc @@ -1,4 +1,6 @@ -class NiceRocketProj extends NiceHRLProj; -defaultproperties -{ Damage=750.000000 MyDamageType=Class'NicePack.NiceDamTypeRocket' -} +class NiceRocketProj extends NiceHRLProj; +defaultproperties +{ + Damage=750.000000 + MyDamageType=Class'NicePack.NiceDamTypeRocket' +} diff --git a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceDamTypeThompsonH.uc b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceDamTypeThompsonH.uc index 688777c..542c7f7 100644 --- a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceDamTypeThompsonH.uc +++ b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceDamTypeThompsonH.uc @@ -1,5 +1,14 @@ -class NiceDamTypeThompsonH extends NiceDamageTypeVetEnforcerBullets - abstract; -defaultproperties -{ HeadShotDamageMult=1.100000 WeaponClass=Class'NicePack.NiceThompsonH' DeathString="%k killed %o (Heavy Tommy Gun)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=5500.000000 KDeathVel=100.000000 KDeathUpKick=15.000000 -} +class NiceDamTypeThompsonH extends NiceDamageTypeVetEnforcerBullets + abstract; +defaultproperties +{ + HeadShotDamageMult=1.100000 + WeaponClass=Class'NicePack.NiceThompsonH' + DeathString="%k killed %o (Heavy Tommy Gun)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + KDamageImpulse=5500.000000 + KDeathVel=100.000000 + KDeathUpKick=15.000000 +} diff --git a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonH.uc b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonH.uc index f887797..6ec3f02 100644 --- a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonH.uc +++ b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonH.uc @@ -1,4 +1,52 @@ -class NiceThompsonH extends NiceHeavyGun; -defaultproperties -{ reloadPreEndFrame=0.196000 reloadEndFrame=0.587000 reloadChargeEndFrame=0.783000 reloadMagStartFrame=0.380000 reloadChargeStartFrame=0.641000 MagazineBone="mag" MagCapacity=40 ReloadRate=3.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_AK47" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 SleeveNum=0 TraderInfoTexture=Texture'HMG_T.Thompson.Thompson_Trader' bIsTier2Weapon=True MeshRef="HMG_A.thompson_mesh" SkinRefs(0)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" SkinRefs(1)="HMG_T.Thompson.Main" SkinRefs(2)="HMG_T.Thompson.stuff" SelectSoundRef="KF_IJC_HalloweenSnd.Thompson_Handling_Bolt_Back" HudImageRef="HMG_T.Thompson.Thompson_unselected" SelectedHudImageRef="HMG_T.Thompson.Thompson_selected" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceThompsonHFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 Description="Alternative, heavier version of the Thompson gun. Uses different type of ammunition, the one more suited for straight-up destroying zed, rather than quickly dispatching them." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=95 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=7 PickupClass=Class'NicePack.NiceThompsonHPickup' PlayerViewOffset=(X=4.000000,Y=5.000000,Z=-3.000000) BobDamping=4.000000 AttachmentClass=Class'NicePack.NiceThompsonHAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="Heavy Tommy Gun" TransientSoundVolume=1.250000 -} +class NiceThompsonH extends NiceHeavyGun; +defaultproperties +{ + reloadPreEndFrame=0.196000 + reloadEndFrame=0.587000 + reloadChargeEndFrame=0.783000 + reloadMagStartFrame=0.380000 + reloadChargeStartFrame=0.641000 + MagazineBone="mag" + MagCapacity=40 + ReloadRate=3.000000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_AK47" + Weight=6.000000 + bHasAimingMode=True + IdleAimAnim="Iron_Idle" + StandardDisplayFOV=65.000000 + SleeveNum=0 + TraderInfoTexture=Texture'HMG_T.Thompson.Thompson_Trader' + bIsTier2Weapon=True + MeshRef="HMG_A.thompson_mesh" + SkinRefs(0)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" + SkinRefs(1)="HMG_T.Thompson.Main" + SkinRefs(2)="HMG_T.Thompson.stuff" + SelectSoundRef="KF_IJC_HalloweenSnd.Thompson_Handling_Bolt_Back" + HudImageRef="HMG_T.Thompson.Thompson_unselected" + SelectedHudImageRef="HMG_T.Thompson.Thompson_selected" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=32.000000 + FireModeClass(0)=Class'NicePack.NiceThompsonHFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + Description="Alternative, heavier version of the Thompson gun. Uses different type of ammunition, the one more suited for straight-up destroying zed, rather than quickly dispatching them." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=65.000000 + Priority=95 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=3 + GroupOffset=7 + PickupClass=Class'NicePack.NiceThompsonHPickup' + PlayerViewOffset=(X=4.000000,Y=5.000000,Z=-3.000000) + BobDamping=4.000000 + AttachmentClass=Class'NicePack.NiceThompsonHAttachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="Heavy Tommy Gun" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAmmo.uc b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAmmo.uc index 657daa0..96e5742 100644 --- a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAmmo.uc +++ b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAmmo.uc @@ -1,5 +1,13 @@ -class NiceThompsonHAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceThompsonHPickup' AmmoPickupAmount=60 MaxAmmo=360 InitialAmount=90 PickupClass=Class'NicePack.NiceThompsonHAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="45. ACP bullets" -} +class NiceThompsonHAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceThompsonHPickup' + AmmoPickupAmount=60 + MaxAmmo=360 + InitialAmount=90 + PickupClass=Class'NicePack.NiceThompsonHAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="45. ACP bullets" +} diff --git a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAmmoPickup.uc b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAmmoPickup.uc index 538a68e..dae6a86 100644 --- a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAmmoPickup.uc +++ b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceThompsonHAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=60 InventoryType=Class'NicePack.NiceThompsonHAmmo' PickupMessage="Rounds 45. ACP" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceThompsonHAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=60 + InventoryType=Class'NicePack.NiceThompsonHAmmo' + PickupMessage="Rounds 45. ACP" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAttachment.uc b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAttachment.uc index 04d0e62..64e09a0 100644 --- a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAttachment.uc +++ b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHAttachment.uc @@ -1,4 +1,59 @@ -class NiceThompsonHAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_SCAR" MovementAnims(1)="JogB_SCAR" MovementAnims(2)="JogL_SCAR" MovementAnims(3)="JogR_SCAR" TurnLeftAnim="TurnL_SCAR" TurnRightAnim="TurnR_SCAR" CrouchAnims(0)="CHWalkF_SCAR" CrouchAnims(1)="CHWalkB_SCAR" CrouchAnims(2)="CHWalkL_SCAR" CrouchAnims(3)="CHWalkR_SCAR" WalkAnims(0)="WalkF_SCAR" WalkAnims(1)="WalkB_SCAR" WalkAnims(2)="WalkL_SCAR" WalkAnims(3)="WalkR_SCAR" CrouchTurnRightAnim="CH_TurnR_SCAR" CrouchTurnLeftAnim="CH_TurnL_SCAR" IdleCrouchAnim="CHIdle_SCAR" IdleWeaponAnim="Idle_SCAR" IdleRestAnim="Idle_SCAR" IdleChatAnim="Idle_SCAR" IdleHeavyAnim="Idle_SCAR" IdleRifleAnim="Idle_SCAR" FireAnims(0)="Fire_SCAR" FireAnims(1)="Fire_SCAR" FireAnims(2)="Fire_SCAR" FireAnims(3)="Fire_SCAR" FireAltAnims(0)="Fire_SCAR" FireAltAnims(1)="Fire_SCAR" FireAltAnims(2)="Fire_SCAR" FireAltAnims(3)="Fire_SCAR" FireCrouchAnims(0)="CHFire_SCAR" FireCrouchAnims(1)="CHFire_SCAR" FireCrouchAnims(2)="CHFire_SCAR" FireCrouchAnims(3)="CHFire_SCAR" FireCrouchAltAnims(0)="CHFire_SCAR" FireCrouchAltAnims(1)="CHFire_SCAR" FireCrouchAltAnims(2)="CHFire_SCAR" FireCrouchAltAnims(3)="CHFire_SCAR" HitAnims(0)="HitF_SCAR" HitAnims(1)="HitB_SCAR" HitAnims(2)="HitL_SCAR" HitAnims(3)="HitR_SCAR" PostFireBlendStandAnim="Blend_SCAR" PostFireBlendCrouchAnim="CHBlend_SCAR" MeshRef="HMG_A.thompson_3rd" bHeavy=True bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 DrawScale=0.800000 -} +class NiceThompsonHAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + ShellEjectBoneName="Shell_eject" + MovementAnims(0)="JogF_SCAR" + MovementAnims(1)="JogB_SCAR" + MovementAnims(2)="JogL_SCAR" + MovementAnims(3)="JogR_SCAR" + TurnLeftAnim="TurnL_SCAR" + TurnRightAnim="TurnR_SCAR" + CrouchAnims(0)="CHWalkF_SCAR" + CrouchAnims(1)="CHWalkB_SCAR" + CrouchAnims(2)="CHWalkL_SCAR" + CrouchAnims(3)="CHWalkR_SCAR" + WalkAnims(0)="WalkF_SCAR" + WalkAnims(1)="WalkB_SCAR" + WalkAnims(2)="WalkL_SCAR" + WalkAnims(3)="WalkR_SCAR" + CrouchTurnRightAnim="CH_TurnR_SCAR" + CrouchTurnLeftAnim="CH_TurnL_SCAR" + IdleCrouchAnim="CHIdle_SCAR" + IdleWeaponAnim="Idle_SCAR" + IdleRestAnim="Idle_SCAR" + IdleChatAnim="Idle_SCAR" + IdleHeavyAnim="Idle_SCAR" + IdleRifleAnim="Idle_SCAR" + FireAnims(0)="Fire_SCAR" + FireAnims(1)="Fire_SCAR" + FireAnims(2)="Fire_SCAR" + FireAnims(3)="Fire_SCAR" + FireAltAnims(0)="Fire_SCAR" + FireAltAnims(1)="Fire_SCAR" + FireAltAnims(2)="Fire_SCAR" + FireAltAnims(3)="Fire_SCAR" + FireCrouchAnims(0)="CHFire_SCAR" + FireCrouchAnims(1)="CHFire_SCAR" + FireCrouchAnims(2)="CHFire_SCAR" + FireCrouchAnims(3)="CHFire_SCAR" + FireCrouchAltAnims(0)="CHFire_SCAR" + FireCrouchAltAnims(1)="CHFire_SCAR" + FireCrouchAltAnims(2)="CHFire_SCAR" + FireCrouchAltAnims(3)="CHFire_SCAR" + HitAnims(0)="HitF_SCAR" + HitAnims(1)="HitB_SCAR" + HitAnims(2)="HitL_SCAR" + HitAnims(3)="HitR_SCAR" + PostFireBlendStandAnim="Blend_SCAR" + PostFireBlendCrouchAnim="CHBlend_SCAR" + MeshRef="HMG_A.thompson_3rd" + bHeavy=True + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 + DrawScale=0.800000 +} diff --git a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHFire.uc b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHFire.uc index 3f876b3..d2b6489 100644 --- a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHFire.uc +++ b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHFire.uc @@ -1,4 +1,36 @@ -class NiceThompsonHFire extends NiceHeavyFire; -defaultproperties -{ ProjectileSpeed=14250.000000 FireAimedAnim="Fire" RecoilRate=0.050000 maxVerticalRecoilAngle=400 maxHorizontalRecoilAngle=200 ShellEjectClass=Class'ROEffects.KFShellEjectMP5SMG' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="KF_IJC_HalloweenSnd.Thompson_Fire_Single_M" StereoFireSoundRef="KF_IJC_HalloweenSnd.Thompson_Fire_Single_S" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeThompsonH' DamageMin=90 DamageMax=90 Momentum=7500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.400000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.079000 AmmoClass=Class'NicePack.NiceThompsonHAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' aimerror=42.000000 -} +class NiceThompsonHFire extends NiceHeavyFire; +defaultproperties +{ + ProjectileSpeed=14250.000000 + FireAimedAnim="Fire" + RecoilRate=0.050000 + maxVerticalRecoilAngle=400 + maxHorizontalRecoilAngle=200 + ShellEjectClass=Class'ROEffects.KFShellEjectMP5SMG' + ShellEjectBoneName="Shell_eject" + bAccuracyBonusForSemiAuto=True + bRandomPitchFireSound=False + FireSoundRef="KF_IJC_HalloweenSnd.Thompson_Fire_Single_M" + StereoFireSoundRef="KF_IJC_HalloweenSnd.Thompson_Fire_Single_S" + NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" + DamageType=Class'NicePack.NiceDamTypeThompsonH' + DamageMin=90 + DamageMax=90 + Momentum=7500.000000 + bPawnRapidFireAnim=True + TransientSoundVolume=1.400000 + FireLoopAnim="Fire" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.079000 + AmmoClass=Class'NicePack.NiceThompsonHAmmo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) + ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) + ShakeRotTime=0.750000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.250000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHPickup.uc b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHPickup.uc index 1f621ad..a555059 100644 --- a/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHPickup.uc +++ b/sources/Weapons/Playable/Heavy/HeavyTommygun/NiceThompsonHPickup.uc @@ -1,4 +1,25 @@ -class NiceThompsonHPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=6.000000 cost=500 AmmoCost=30 BuyClipSize=40 PowerValue=30 SpeedValue=90 RangeValue=50 Description="Alternative, heavier version of the Thompson gun. Uses different type of ammunition, the one more suited for straight-up destroying zed, rather than quickly dispatching them." ItemName="Heavy Tommy Gun" ItemShortName="Heavy Tommy" AmmoItemName=".45 ACP" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=1 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceThompsonH' PickupMessage="You've got the Thompson Submachine Gun" PickupSound=Sound'KF_IJC_HalloweenSnd.Handling.Thompson_Handling_Bolt_Back' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'HMG_A.thompson_st' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceThompsonHPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=6.000000 + cost=500 + AmmoCost=30 + BuyClipSize=40 + PowerValue=30 + SpeedValue=90 + RangeValue=50 + Description="Alternative, heavier version of the Thompson gun. Uses different type of ammunition, the one more suited for straight-up destroying zed, rather than quickly dispatching them." + ItemName="Heavy Tommy Gun" + ItemShortName="Heavy Tommy" + AmmoItemName=".45 ACP" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=1 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceThompsonH' + PickupMessage="You've got the Thompson Submachine Gun" + PickupSound=Sound'KF_IJC_HalloweenSnd.Handling.Thompson_Handling_Bolt_Back' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'HMG_A.thompson_st' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Heavy/M249/NiceDamTypeM249SAW.uc b/sources/Weapons/Playable/Heavy/M249/NiceDamTypeM249SAW.uc index 1e85d60..c18bda5 100644 --- a/sources/Weapons/Playable/Heavy/M249/NiceDamTypeM249SAW.uc +++ b/sources/Weapons/Playable/Heavy/M249/NiceDamTypeM249SAW.uc @@ -1,6 +1,19 @@ -class NiceDamTypeM249SAW extends NiceDamageTypeVetEnforcerBullets - abstract; -defaultproperties -{ bodyDestructionMult=1.000000 WeaponClass=Class'NicePack.NiceM249SAW' DeathString="%k killed %o (M249 SAW)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' DeathOverlayTime=999.000000 KDamageImpulse=12500.000000 KDeathVel=1200.000000 KDeathUpKick=125.000000 VehicleDamageScaling=0.700000 - flinchMultiplier=0.9 -} +class NiceDamTypeM249SAW extends NiceDamageTypeVetEnforcerBullets + abstract; +defaultproperties +{ + bodyDestructionMult=1.000000 + WeaponClass=Class'NicePack.NiceM249SAW' + DeathString="%k killed %o (M249 SAW)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' + DeathOverlayTime=999.000000 + KDamageImpulse=12500.000000 + KDeathVel=1200.000000 + KDeathUpKick=125.000000 + VehicleDamageScaling=0.700000 + flinchMultiplier=0.9 +} diff --git a/sources/Weapons/Playable/Heavy/M249/NiceM249Ammo.uc b/sources/Weapons/Playable/Heavy/M249/NiceM249Ammo.uc index d673b3e..dd456bd 100644 --- a/sources/Weapons/Playable/Heavy/M249/NiceM249Ammo.uc +++ b/sources/Weapons/Playable/Heavy/M249/NiceM249Ammo.uc @@ -1,5 +1,13 @@ -class NiceM249Ammo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceM249Pickup' AmmoPickupAmount=80 MaxAmmo=240 InitialAmount=120 PickupClass=Class'NicePack.NiceM249AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="Rounds 5.56x45mm NATO" -} +class NiceM249Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceM249Pickup' + AmmoPickupAmount=80 + MaxAmmo=240 + InitialAmount=120 + PickupClass=Class'NicePack.NiceM249AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="Rounds 5.56x45mm NATO" +} diff --git a/sources/Weapons/Playable/Heavy/M249/NiceM249AmmoPickup.uc b/sources/Weapons/Playable/Heavy/M249/NiceM249AmmoPickup.uc index 011fa5c..450e4e5 100644 --- a/sources/Weapons/Playable/Heavy/M249/NiceM249AmmoPickup.uc +++ b/sources/Weapons/Playable/Heavy/M249/NiceM249AmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceM249AmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=80 InventoryType=Class'NicePack.NiceM249Ammo' PickupMessage="Rounds 5.56x45mm NATO" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceM249AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=80 + InventoryType=Class'NicePack.NiceM249Ammo' + PickupMessage="Rounds 5.56x45mm NATO" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Heavy/M249/NiceM249Attachment.uc b/sources/Weapons/Playable/Heavy/M249/NiceM249Attachment.uc index 1dbbe1f..9822dbb 100644 --- a/sources/Weapons/Playable/Heavy/M249/NiceM249Attachment.uc +++ b/sources/Weapons/Playable/Heavy/M249/NiceM249Attachment.uc @@ -1,4 +1,57 @@ -class NiceM249Attachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="IS_Fire_AK47" FireAltAnims(1)="IS_Fire_AK47" FireAltAnims(2)="IS_Fire_AK47" FireAltAnims(3)="IS_Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="HMG_A.m249_3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 DrawScale=0.700000 -} +class NiceM249Attachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + ShellEjectBoneName="Shell_eject" + MovementAnims(0)="JogF_AK47" + MovementAnims(1)="JogB_AK47" + MovementAnims(2)="JogL_AK47" + MovementAnims(3)="JogR_AK47" + TurnLeftAnim="TurnL_AK47" + TurnRightAnim="TurnR_AK47" + CrouchAnims(0)="CHWalkF_AK47" + CrouchAnims(1)="CHWalkB_AK47" + CrouchAnims(2)="CHWalkL_AK47" + CrouchAnims(3)="CHWalkR_AK47" + WalkAnims(0)="WalkF_AK47" + WalkAnims(1)="WalkB_AK47" + WalkAnims(2)="WalkL_AK47" + WalkAnims(3)="WalkR_AK47" + CrouchTurnRightAnim="CH_TurnR_AK47" + CrouchTurnLeftAnim="CH_TurnL_AK47" + IdleCrouchAnim="CHIdle_AK47" + IdleWeaponAnim="Idle_AK47" + IdleRestAnim="Idle_AK47" + IdleChatAnim="Idle_AK47" + IdleHeavyAnim="Idle_AK47" + IdleRifleAnim="Idle_AK47" + FireAnims(0)="Fire_AK47" + FireAnims(1)="Fire_AK47" + FireAnims(2)="Fire_AK47" + FireAnims(3)="Fire_AK47" + FireAltAnims(0)="IS_Fire_AK47" + FireAltAnims(1)="IS_Fire_AK47" + FireAltAnims(2)="IS_Fire_AK47" + FireAltAnims(3)="IS_Fire_AK47" + FireCrouchAnims(0)="CHFire_AK47" + FireCrouchAnims(1)="CHFire_AK47" + FireCrouchAnims(2)="CHFire_AK47" + FireCrouchAnims(3)="CHFire_AK47" + FireCrouchAltAnims(0)="CHFire_AK47" + FireCrouchAltAnims(1)="CHFire_AK47" + FireCrouchAltAnims(2)="CHFire_AK47" + FireCrouchAltAnims(3)="CHFire_AK47" + HitAnims(0)="HitF_AK47" + HitAnims(1)="HitB_AK47" + HitAnims(2)="HitL_AK47" + HitAnims(3)="HitR_AK47" + PostFireBlendStandAnim="Blend_AK47" + PostFireBlendCrouchAnim="CHBlend_AK47" + MeshRef="HMG_A.m249_3rd" + bHeavy=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 + DrawScale=0.700000 +} diff --git a/sources/Weapons/Playable/Heavy/M249/NiceM249Fire.uc b/sources/Weapons/Playable/Heavy/M249/NiceM249Fire.uc index 1d7a35a..efe300e 100644 --- a/sources/Weapons/Playable/Heavy/M249/NiceM249Fire.uc +++ b/sources/Weapons/Playable/Heavy/M249/NiceM249Fire.uc @@ -1,4 +1,36 @@ -class NiceM249Fire extends NiceHeavyFire; -defaultproperties -{ ProjectileSpeed=48250.000000 FireAimedAnim="Fire" RecoilRate=0.040000 maxVerticalRecoilAngle=550 maxHorizontalRecoilAngle=225 ShellEjectClass=Class'ROEffects.KFShellEjectAK' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="HMG_S.M249.m249_shoot_mono" StereoFireSoundRef="HMG_S.M249.m249_shoot_stereo" NoAmmoSoundRef="HMG_S.M249.m249_empty" DamageType=Class'NicePack.NiceDamTypeM249SAW' DamageMin=125 DamageMax=125 Momentum=12500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.400000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.084 AmmoClass=Class'NicePack.NiceM249Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' aimerror=42.000000 -} +class NiceM249Fire extends NiceHeavyFire; +defaultproperties +{ + ProjectileSpeed=48250.000000 + FireAimedAnim="Fire" + RecoilRate=0.040000 + maxVerticalRecoilAngle=550 + maxHorizontalRecoilAngle=225 + ShellEjectClass=Class'ROEffects.KFShellEjectAK' + ShellEjectBoneName="Shell_eject" + bAccuracyBonusForSemiAuto=True + bRandomPitchFireSound=False + FireSoundRef="HMG_S.M249.m249_shoot_mono" + StereoFireSoundRef="HMG_S.M249.m249_shoot_stereo" + NoAmmoSoundRef="HMG_S.M249.m249_empty" + DamageType=Class'NicePack.NiceDamTypeM249SAW' + DamageMin=125 + DamageMax=125 + Momentum=12500.000000 + bPawnRapidFireAnim=True + TransientSoundVolume=1.400000 + FireLoopAnim="Fire" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.084 + AmmoClass=Class'NicePack.NiceM249Ammo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) + ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) + ShakeRotTime=0.750000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.250000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/Heavy/M249/NiceM249Pickup.uc b/sources/Weapons/Playable/Heavy/M249/NiceM249Pickup.uc index dde40d1..13af3b5 100644 --- a/sources/Weapons/Playable/Heavy/M249/NiceM249Pickup.uc +++ b/sources/Weapons/Playable/Heavy/M249/NiceM249Pickup.uc @@ -1,5 +1,25 @@ -class NiceM249Pickup extends NiceWeaponPickup; -defaultproperties -{ - Weight=7.000000 cost=1250 AmmoCost=250 BuyClipSize=80 PowerValue=62 SpeedValue=92 RangeValue=60 Description="The M249 SAW/LMG is the US produced version of the the Belgian-made FN Minimi. The M249 uses the 5.56x45mm NATO round, which lowers the weight of the gun when loaded yet grants the user with highly accurate yet reasonably powerful fire." ItemName="M249 SAW" ItemShortName="M249 SAW" AmmoItemName="5.56x45mm NATO" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=1 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceM249SAW' PickupMessage="You picked up the M249 SAW SE" PickupSound=Sound'HMG_S.M249.m249_pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'HMG_A.M249_ST' CollisionRadius=25.000000 CollisionHeight=5.000000 +class NiceM249Pickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=7.000000 + cost=1250 + AmmoCost=250 + BuyClipSize=80 + PowerValue=62 + SpeedValue=92 + RangeValue=60 + Description="The M249 SAW/LMG is the US produced version of the the Belgian-made FN Minimi. The M249 uses the 5.56x45mm NATO round, which lowers the weight of the gun when loaded yet grants the user with highly accurate yet reasonably powerful fire." + ItemName="M249 SAW" + ItemShortName="M249 SAW" + AmmoItemName="5.56x45mm NATO" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=1 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceM249SAW' + PickupMessage="You picked up the M249 SAW SE" + PickupSound=Sound'HMG_S.M249.m249_pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'HMG_A.M249_ST' + CollisionRadius=25.000000 + CollisionHeight=5.000000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/M249/NiceM249SAW.uc b/sources/Weapons/Playable/Heavy/M249/NiceM249SAW.uc index e0570ce..323361e 100644 --- a/sources/Weapons/Playable/Heavy/M249/NiceM249SAW.uc +++ b/sources/Weapons/Playable/Heavy/M249/NiceM249SAW.uc @@ -1,41 +1,209 @@ -class NiceM249SAW extends NiceHeavyGun; -simulated function Notify_ShowBullets(){ - SetBoneScale (0, 1.0, 'Bullet01b'); - SetBoneScale (1, 1.0, 'Bullet02b'); - SetBoneScale (2, 1.0, 'Bullet03b'); - SetBoneScale (3, 1.0, 'Bullet04b'); - SetBoneScale (4, 1.0, 'Bullet05b'); - SetBoneScale (5, 1.0, 'Bullet06b'); - SetBoneScale (6, 1.0, 'Bullet07b'); - SetBoneScale (7, 1.0, 'Bullet08b'); - SetBoneScale (8, 1.0, 'Bullet09b'); - SetBoneScale (9, 1.0, 'Bullet10b'); -} -simulated function Notify_HideBullets(){ - if(MagAmmoRemaining == 0){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 0.0, 'Bullet03b'); SetBoneScale (3, 0.0, 'Bullet04b'); SetBoneScale (4, 0.0, 'Bullet05b'); SetBoneScale (5, 0.0, 'Bullet06b'); SetBoneScale (6, 0.0, 'Bullet07b'); SetBoneScale (7, 0.0, 'Bullet08b'); SetBoneScale (8, 0.0, 'Bullet09b'); SetBoneScale (9, 0.0, 'Bullet10b'); - } - else if(MagAmmoRemaining == 1){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 0.0, 'Bullet03b'); SetBoneScale (3, 0.0, 'Bullet04b'); SetBoneScale (4, 0.0, 'Bullet05b'); SetBoneScale (5, 0.0, 'Bullet06b'); SetBoneScale (6, 0.0, 'Bullet07b'); SetBoneScale (7, 0.0, 'Bullet08b'); SetBoneScale (8, 0.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); - } - else if(MagAmmoRemaining == 2){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 0.0, 'Bullet03b'); SetBoneScale (3, 0.0, 'Bullet04b'); SetBoneScale (4, 0.0, 'Bullet05b'); SetBoneScale (5, 0.0, 'Bullet06b'); SetBoneScale (6, 0.0, 'Bullet07b'); SetBoneScale (7, 0.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); - } - else if(MagAmmoRemaining == 3){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 0.0, 'Bullet03b'); SetBoneScale (3, 0.0, 'Bullet04b'); SetBoneScale (4, 0.0, 'Bullet05b'); SetBoneScale (5, 0.0, 'Bullet06b'); SetBoneScale (6, 0.0, 'Bullet07b'); SetBoneScale (7, 1.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); - } - else if(MagAmmoRemaining == 4){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 0.0, 'Bullet03b'); SetBoneScale (3, 0.0, 'Bullet04b'); SetBoneScale (4, 0.0, 'Bullet05b'); SetBoneScale (5, 0.0, 'Bullet06b'); SetBoneScale (6, 1.0, 'Bullet07b'); SetBoneScale (7, 1.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); - } - else if(MagAmmoRemaining == 5){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 0.0, 'Bullet03b'); SetBoneScale (3, 0.0, 'Bullet04b'); SetBoneScale (4, 0.0, 'Bullet05b'); SetBoneScale (5, 1.0, 'Bullet06b'); SetBoneScale (6, 1.0, 'Bullet07b'); SetBoneScale (7, 1.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); - } - else if(MagAmmoRemaining == 6){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 0.0, 'Bullet03b'); SetBoneScale (3, 0.0, 'Bullet04b'); SetBoneScale (4, 1.0, 'Bullet05b'); SetBoneScale (5, 1.0, 'Bullet06b'); SetBoneScale (6, 1.0, 'Bullet07b'); SetBoneScale (7, 1.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); - } - else if(MagAmmoRemaining == 7){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 0.0, 'Bullet03b'); SetBoneScale (3, 1.0, 'Bullet04b'); SetBoneScale (4, 1.0, 'Bullet05b'); SetBoneScale (5, 1.0, 'Bullet06b'); SetBoneScale (6, 1.0, 'Bullet07b'); SetBoneScale (7, 1.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); - } - else if(MagAmmoRemaining == 8){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 0.0, 'Bullet02b'); SetBoneScale (2, 1.0, 'Bullet03b'); SetBoneScale (3, 1.0, 'Bullet04b'); SetBoneScale (4, 1.0, 'Bullet05b'); SetBoneScale (5, 1.0, 'Bullet06b'); SetBoneScale (6, 1.0, 'Bullet07b'); SetBoneScale (7, 1.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); - } - else if(MagAmmoRemaining == 9){ SetBoneScale (0, 0.0, 'Bullet01b'); SetBoneScale (1, 1.0, 'Bullet02b'); SetBoneScale (2, 1.0, 'Bullet03b'); SetBoneScale (3, 1.0, 'Bullet04b'); SetBoneScale (4, 1.0, 'Bullet05b'); SetBoneScale (5, 1.0, 'Bullet06b'); SetBoneScale (6, 1.0, 'Bullet07b'); SetBoneScale (7, 1.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); - } - else{ SetBoneScale (0, 1.0, 'Bullet01b'); SetBoneScale (1, 1.0, 'Bullet02b'); SetBoneScale (2, 1.0, 'Bullet03b'); SetBoneScale (3, 1.0, 'Bullet04b'); SetBoneScale (4, 1.0, 'Bullet05b'); SetBoneScale (5, 1.0, 'Bullet06b'); SetBoneScale (6, 1.0, 'Bullet07b'); SetBoneScale (7, 1.0, 'Bullet08b'); SetBoneScale (8, 1.0, 'Bullet09b'); SetBoneScale (9, 1.0, 'Bullet10b'); - } -} -defaultproperties -{ - Weight=7.000000 reloadPreEndFrame=0.140000 reloadEndFrame=0.693000 reloadChargeEndFrame=0.933000 reloadMagStartFrame=0.140000 reloadChargeStartFrame=0.813000 MagazineBone="clip" MagCapacity=80 ReloadRate=5.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_AK47" bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 SleeveNum=0 TraderInfoTexture=Texture'HMG_T.M249.m249_Trader' bIsTier3Weapon=True MeshRef="HMG_A.m249mesh" SkinRefs(0)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" SkinRefs(1)="HMG_T.M249.v_m249" SkinRefs(2)="HMG_T.M249.v_m249_addons" SkinRefs(3)="HMG_T.M249.v_m249_box" SkinRefs(4)="HMG_T.M249.v_m249_bullets" SkinRefs(5)="HMG_T.M249.v_m249_front" SkinRefs(6)="HMG_T.M249.v_m249_heatshield" SkinRefs(7)="HMG_T.M249.v_m249_lid" SkinRefs(8)="HMG_T.M249.v_m249_receiver" SkinRefs(9)="HMG_T.M249.v_m249_sights" SkinRefs(10)="HMG_T.M249.v_m249_stock" SelectSoundRef="HMG_S.M249.m249_select" HudImageRef="HMG_T.M249.m249_Unselected" SelectedHudImageRef="HMG_T.M249.m249_selected" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceM249Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectAnimRate=1.000000 SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="The M249 SAW/LMG is the US produced version of the the Belgian-made FN Minimi. The M249 uses the 5.56x45mm NATO round, which lowers the weight of the gun when loaded yet grants the user with highly accurate yet reasonably powerful fire." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=150 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=7 PickupClass=Class'NicePack.NiceM249Pickup' PlayerViewOffset=(X=5.000000,Y=5.500000,Z=-3.000000) BobDamping=4.000000 AttachmentClass=Class'NicePack.NiceM249Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="M249 SAW" DrawScale=0.600000 TransientSoundVolume=1.250000 +class NiceM249SAW extends NiceHeavyGun; +simulated function Notify_ShowBullets(){ + SetBoneScale (0, 1.0, 'Bullet01b'); + SetBoneScale (1, 1.0, 'Bullet02b'); + SetBoneScale (2, 1.0, 'Bullet03b'); + SetBoneScale (3, 1.0, 'Bullet04b'); + SetBoneScale (4, 1.0, 'Bullet05b'); + SetBoneScale (5, 1.0, 'Bullet06b'); + SetBoneScale (6, 1.0, 'Bullet07b'); + SetBoneScale (7, 1.0, 'Bullet08b'); + SetBoneScale (8, 1.0, 'Bullet09b'); + SetBoneScale (9, 1.0, 'Bullet10b'); +} +simulated function Notify_HideBullets(){ + if(MagAmmoRemaining == 0){ + SetBoneScale (0, 0.0, 'Bullet01b'); + SetBoneScale (1, 0.0, 'Bullet02b'); + SetBoneScale (2, 0.0, 'Bullet03b'); + SetBoneScale (3, 0.0, 'Bullet04b'); + SetBoneScale (4, 0.0, 'Bullet05b'); + SetBoneScale (5, 0.0, 'Bullet06b'); + SetBoneScale (6, 0.0, 'Bullet07b'); + SetBoneScale (7, 0.0, 'Bullet08b'); + SetBoneScale (8, 0.0, 'Bullet09b'); + SetBoneScale (9, 0.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 1){ + SetBoneScale (0, 0.0, 'Bullet01b'); + SetBoneScale (1, 0.0, 'Bullet02b'); + SetBoneScale (2, 0.0, 'Bullet03b'); + SetBoneScale (3, 0.0, 'Bullet04b'); + SetBoneScale (4, 0.0, 'Bullet05b'); + SetBoneScale (5, 0.0, 'Bullet06b'); + SetBoneScale (6, 0.0, 'Bullet07b'); + SetBoneScale (7, 0.0, 'Bullet08b'); + SetBoneScale (8, 0.0, 'Bullet09b'); + SetBoneScale (9, 1.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 2){ + SetBoneScale (0, 0.0, 'Bullet01b'); + SetBoneScale (1, 0.0, 'Bullet02b'); + SetBoneScale (2, 0.0, 'Bullet03b'); + SetBoneScale (3, 0.0, 'Bullet04b'); + SetBoneScale (4, 0.0, 'Bullet05b'); + SetBoneScale (5, 0.0, 'Bullet06b'); + SetBoneScale (6, 0.0, 'Bullet07b'); + SetBoneScale (7, 0.0, 'Bullet08b'); + SetBoneScale (8, 1.0, 'Bullet09b'); + SetBoneScale (9, 1.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 3){ + SetBoneScale (0, 0.0, 'Bullet01b'); + SetBoneScale (1, 0.0, 'Bullet02b'); + SetBoneScale (2, 0.0, 'Bullet03b'); + SetBoneScale (3, 0.0, 'Bullet04b'); + SetBoneScale (4, 0.0, 'Bullet05b'); + SetBoneScale (5, 0.0, 'Bullet06b'); + SetBoneScale (6, 0.0, 'Bullet07b'); + SetBoneScale (7, 1.0, 'Bullet08b'); + SetBoneScale (8, 1.0, 'Bullet09b'); + SetBoneScale (9, 1.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 4){ + SetBoneScale (0, 0.0, 'Bullet01b'); + SetBoneScale (1, 0.0, 'Bullet02b'); + SetBoneScale (2, 0.0, 'Bullet03b'); + SetBoneScale (3, 0.0, 'Bullet04b'); + SetBoneScale (4, 0.0, 'Bullet05b'); + SetBoneScale (5, 0.0, 'Bullet06b'); + SetBoneScale (6, 1.0, 'Bullet07b'); + SetBoneScale (7, 1.0, 'Bullet08b'); + SetBoneScale (8, 1.0, 'Bullet09b'); + SetBoneScale (9, 1.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 5){ + SetBoneScale (0, 0.0, 'Bullet01b'); + SetBoneScale (1, 0.0, 'Bullet02b'); + SetBoneScale (2, 0.0, 'Bullet03b'); + SetBoneScale (3, 0.0, 'Bullet04b'); + SetBoneScale (4, 0.0, 'Bullet05b'); + SetBoneScale (5, 1.0, 'Bullet06b'); + SetBoneScale (6, 1.0, 'Bullet07b'); + SetBoneScale (7, 1.0, 'Bullet08b'); + SetBoneScale (8, 1.0, 'Bullet09b'); + SetBoneScale (9, 1.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 6){ + SetBoneScale (0, 0.0, 'Bullet01b'); + SetBoneScale (1, 0.0, 'Bullet02b'); + SetBoneScale (2, 0.0, 'Bullet03b'); + SetBoneScale (3, 0.0, 'Bullet04b'); + SetBoneScale (4, 1.0, 'Bullet05b'); + SetBoneScale (5, 1.0, 'Bullet06b'); + SetBoneScale (6, 1.0, 'Bullet07b'); + SetBoneScale (7, 1.0, 'Bullet08b'); + SetBoneScale (8, 1.0, 'Bullet09b'); + SetBoneScale (9, 1.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 7){ + SetBoneScale (0, 0.0, 'Bullet01b'); + SetBoneScale (1, 0.0, 'Bullet02b'); + SetBoneScale (2, 0.0, 'Bullet03b'); + SetBoneScale (3, 1.0, 'Bullet04b'); + SetBoneScale (4, 1.0, 'Bullet05b'); + SetBoneScale (5, 1.0, 'Bullet06b'); + SetBoneScale (6, 1.0, 'Bullet07b'); + SetBoneScale (7, 1.0, 'Bullet08b'); + SetBoneScale (8, 1.0, 'Bullet09b'); + SetBoneScale (9, 1.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 8){ + SetBoneScale (0, 0.0, 'Bullet01b'); + SetBoneScale (1, 0.0, 'Bullet02b'); + SetBoneScale (2, 1.0, 'Bullet03b'); + SetBoneScale (3, 1.0, 'Bullet04b'); + SetBoneScale (4, 1.0, 'Bullet05b'); + SetBoneScale (5, 1.0, 'Bullet06b'); + SetBoneScale (6, 1.0, 'Bullet07b'); + SetBoneScale (7, 1.0, 'Bullet08b'); + SetBoneScale (8, 1.0, 'Bullet09b'); + SetBoneScale (9, 1.0, 'Bullet10b'); + } + else if(MagAmmoRemaining == 9){ + SetBoneScale (0, 0.0, 'Bullet01b'); + SetBoneScale (1, 1.0, 'Bullet02b'); + SetBoneScale (2, 1.0, 'Bullet03b'); + SetBoneScale (3, 1.0, 'Bullet04b'); + SetBoneScale (4, 1.0, 'Bullet05b'); + SetBoneScale (5, 1.0, 'Bullet06b'); + SetBoneScale (6, 1.0, 'Bullet07b'); + SetBoneScale (7, 1.0, 'Bullet08b'); + SetBoneScale (8, 1.0, 'Bullet09b'); + SetBoneScale (9, 1.0, 'Bullet10b'); + } + else{ + SetBoneScale (0, 1.0, 'Bullet01b'); + SetBoneScale (1, 1.0, 'Bullet02b'); + SetBoneScale (2, 1.0, 'Bullet03b'); + SetBoneScale (3, 1.0, 'Bullet04b'); + SetBoneScale (4, 1.0, 'Bullet05b'); + SetBoneScale (5, 1.0, 'Bullet06b'); + SetBoneScale (6, 1.0, 'Bullet07b'); + SetBoneScale (7, 1.0, 'Bullet08b'); + SetBoneScale (8, 1.0, 'Bullet09b'); + SetBoneScale (9, 1.0, 'Bullet10b'); + } +} +defaultproperties +{ + Weight=7.000000 + reloadPreEndFrame=0.140000 + reloadEndFrame=0.693000 + reloadChargeEndFrame=0.933000 + reloadMagStartFrame=0.140000 + reloadChargeStartFrame=0.813000 + MagazineBone="clip" + MagCapacity=80 + ReloadRate=5.000000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_AK47" + bHasAimingMode=True + IdleAimAnim="Iron_Idle" + StandardDisplayFOV=65.000000 + SleeveNum=0 + TraderInfoTexture=Texture'HMG_T.M249.m249_Trader' + bIsTier3Weapon=True + MeshRef="HMG_A.m249mesh" + SkinRefs(0)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" + SkinRefs(1)="HMG_T.M249.v_m249" + SkinRefs(2)="HMG_T.M249.v_m249_addons" + SkinRefs(3)="HMG_T.M249.v_m249_box" + SkinRefs(4)="HMG_T.M249.v_m249_bullets" + SkinRefs(5)="HMG_T.M249.v_m249_front" + SkinRefs(6)="HMG_T.M249.v_m249_heatshield" + SkinRefs(7)="HMG_T.M249.v_m249_lid" + SkinRefs(8)="HMG_T.M249.v_m249_receiver" + SkinRefs(9)="HMG_T.M249.v_m249_sights" + SkinRefs(10)="HMG_T.M249.v_m249_stock" + SelectSoundRef="HMG_S.M249.m249_select" + HudImageRef="HMG_T.M249.m249_Unselected" + SelectedHudImageRef="HMG_T.M249.m249_selected" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=32.000000 + FireModeClass(0)=Class'NicePack.NiceM249Fire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectAnimRate=1.000000 + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="The M249 SAW/LMG is the US produced version of the the Belgian-made FN Minimi. The M249 uses the 5.56x45mm NATO round, which lowers the weight of the gun when loaded yet grants the user with highly accurate yet reasonably powerful fire." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=65.000000 + Priority=150 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=4 + GroupOffset=7 + PickupClass=Class'NicePack.NiceM249Pickup' + PlayerViewOffset=(X=5.000000,Y=5.500000,Z=-3.000000) + BobDamping=4.000000 + AttachmentClass=Class'NicePack.NiceM249Attachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="M249 SAW" + DrawScale=0.600000 + TransientSoundVolume=1.250000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AAssaultRifle.uc b/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AAssaultRifle.uc index 2b41f0d..1c7a6d3 100644 --- a/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AAssaultRifle.uc +++ b/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AAssaultRifle.uc @@ -1,5 +1,13 @@ -class NiceDamTypeM41AAssaultRifle extends NiceDamTypeSPAM - abstract; -defaultproperties -{ WeaponClass=Class'NicePack.NiceM41AAssaultRifle' DeathString="%k killed %o (Pulse Rifle)." DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' DeathOverlayTime=999.000000 KDamageImpulse=13500.000000 KDeathVel=1400.000000 KDeathUpKick=150.000000 VehicleDamageScaling=0.700000 -} +class NiceDamTypeM41AAssaultRifle extends NiceDamTypeSPAM + abstract; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceM41AAssaultRifle' + DeathString="%k killed %o (Pulse Rifle)." + DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' + DeathOverlayTime=999.000000 + KDamageImpulse=13500.000000 + KDeathVel=1400.000000 + KDeathUpKick=150.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41ABlunt.uc b/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41ABlunt.uc index c337dd6..2fab55a 100644 --- a/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41ABlunt.uc +++ b/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41ABlunt.uc @@ -1,4 +1,5 @@ -class NiceDamTypeM41ABlunt extends NiceDamageTypeVetEnforcerBullets; -defaultproperties -{ WeaponClass=Class'NicePack.NiceM41AAssaultRifle' -} +class NiceDamTypeM41ABlunt extends NiceDamageTypeVetEnforcerBullets; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceM41AAssaultRifle' +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AExplosion.uc b/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AExplosion.uc index c90189f..6a00892 100644 --- a/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AExplosion.uc +++ b/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AExplosion.uc @@ -1,4 +1,6 @@ -class NiceDamTypeM41AExplosion extends NiceDamageTypeVetEnforcerBullets; -defaultproperties -{ bIsExplosive=True WeaponClass=Class'NicePack.NiceM41AAssaultRifle' -} +class NiceDamTypeM41AExplosion extends NiceDamageTypeVetEnforcerBullets; +defaultproperties +{ + bIsExplosive=True + WeaponClass=Class'NicePack.NiceM41AAssaultRifle' +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AGrenade.uc b/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AGrenade.uc index e7a597e..5628d55 100644 --- a/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AGrenade.uc +++ b/sources/Weapons/Playable/Heavy/M41A/NiceDamTypeM41AGrenade.uc @@ -1,4 +1,5 @@ -class NiceDamTypeM41AGrenade extends DamTypeM203Grenade; -defaultproperties -{ WeaponClass=Class'NicePack.NiceM41AAssaultRifle' -} +class NiceDamTypeM41AGrenade extends DamTypeM203Grenade; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceM41AAssaultRifle' +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41AALTFire.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41AALTFire.uc index ffeef22..5ef6242 100644 --- a/sources/Weapons/Playable/Heavy/M41A/NiceM41AALTFire.uc +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41AALTFire.uc @@ -1,4 +1,37 @@ -class NiceM41AALTFire extends NiceFire; -defaultproperties -{ ProjSpawnOffset=(X=5.000000) EffectiveRange=2500.000000 ProjectileSpeed=3800.000000 bulletClass=Class'NicePack.NiceBallisticNade' ExplosionDamageType=Class'NicePack.NiceDamTypeM41AExplosion' ExplosionDamage=350 ExplosionRadius=400.000000 explosionExponent=1.000000 ExplosionMomentum=75000.000000 explodeOnPawnHit=True explodeOnWallHit=True projAffectedByScream=True FireAimedAnim="Iron_Fire" RecoilRate=0.100000 maxVerticalRecoilAngle=200 maxHorizontalRecoilAngle=50 FireSoundRef="KF_M79Snd.M79_Fire" StereoFireSoundRef="KF_M79Snd.M79_FireST" NoAmmoSoundRef="KF_M79Snd.M79_DryFire" DamageType=Class'NicePack.NiceDamTypeM41ABlunt' DamageMax=200 bWaitForRelease=True TransientSoundVolume=1.800000 FireAnim="AltFire" FireForce="AssaultRifleFire" FireRate=0.000000 AmmoClass=Class'NicePack.NiceM41AProjectileAmmo' ShakeRotMag=(X=3.000000,Y=4.000000,Z=2.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeOffsetMag=(X=3.000000,Y=3.000000,Z=3.000000) BotRefireRate=1.800000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stNadeL' aimerror=42.000000 -} +class NiceM41AALTFire extends NiceFire; +defaultproperties +{ + ProjSpawnOffset=(X=5.000000) + EffectiveRange=2500.000000 + ProjectileSpeed=3800.000000 + bulletClass=Class'NicePack.NiceBallisticNade' + ExplosionDamageType=Class'NicePack.NiceDamTypeM41AExplosion' + ExplosionDamage=350 + ExplosionRadius=400.000000 + explosionExponent=1.000000 + ExplosionMomentum=75000.000000 + explodeOnPawnHit=True + explodeOnWallHit=True + projAffectedByScream=True + FireAimedAnim="Iron_Fire" + RecoilRate=0.100000 + maxVerticalRecoilAngle=200 + maxHorizontalRecoilAngle=50 + FireSoundRef="KF_M79Snd.M79_Fire" + StereoFireSoundRef="KF_M79Snd.M79_FireST" + NoAmmoSoundRef="KF_M79Snd.M79_DryFire" + DamageType=Class'NicePack.NiceDamTypeM41ABlunt' + DamageMax=200 + bWaitForRelease=True + TransientSoundVolume=1.800000 + FireAnim="AltFire" + FireForce="AssaultRifleFire" + FireRate=0.000000 + AmmoClass=Class'NicePack.NiceM41AProjectileAmmo' + ShakeRotMag=(X=3.000000,Y=4.000000,Z=2.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeOffsetMag=(X=3.000000,Y=3.000000,Z=3.000000) + BotRefireRate=1.800000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stNadeL' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41AAmmo.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41AAmmo.uc index ba4fd13..1cbd1ac 100644 --- a/sources/Weapons/Playable/Heavy/M41A/NiceM41AAmmo.uc +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41AAmmo.uc @@ -1,5 +1,13 @@ -class NiceM41AAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceM41APickup' AmmoPickupAmount=66 MaxAmmo=300 InitialAmount=75 PickupClass=Class'NicePack.NiceM41AAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="M41A 10 mm caseless ammunition" -} +class NiceM41AAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceM41APickup' + AmmoPickupAmount=66 + MaxAmmo=300 + InitialAmount=75 + PickupClass=Class'NicePack.NiceM41AAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="M41A 10 mm caseless ammunition" +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41AAmmoPickup.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41AAmmoPickup.uc index 7d49b6a..fab5526 100644 --- a/sources/Weapons/Playable/Heavy/M41A/NiceM41AAmmoPickup.uc +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41AAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceM41AAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=66 InventoryType=Class'NicePack.NiceM41AAmmo' PickupMessage="M41A 10 mm caseless ammunition" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceM41AAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=66 + InventoryType=Class'NicePack.NiceM41AAmmo' + PickupMessage="M41A 10 mm caseless ammunition" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41AAssaultRifle.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41AAssaultRifle.uc index 29318dc..950e6c0 100644 --- a/sources/Weapons/Playable/Heavy/M41A/NiceM41AAssaultRifle.uc +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41AAssaultRifle.uc @@ -1,56 +1,130 @@ -class NiceM41AAssaultRifle extends NiceWeapon; - -var string MyMessage; -var ScriptedTexture AmmoDigitsScriptedTexture; -var Font AmmoDigitsFont; -var color AmmoDigitsColor, LowAmmoDigitsColor; -var int OldAmmoAmount; -var float MyYaw; - -simulated function RenderOverlays( Canvas Canvas ){ - if(AmmoAmount(0) <= 0){ if(OldAmmoAmount != -5){ OldAmmoAmount = -5; AmmoDigitsColor.R = 218; AmmoDigitsColor.G = 18; AmmoDigitsColor.B = 18; MyMessage = "--"; ++ AmmoDigitsScriptedTexture.Revision; } - } - else if(bIsReloading){ if(OldAmmoAmount != -4){ OldAmmoAmount = -4; AmmoDigitsColor.R = 218; AmmoDigitsColor.G = 218; AmmoDigitsColor.B = 18; MyMessage = "RL"; ++ AmmoDigitsScriptedTexture.Revision; } - } - else if(OldAmmoAmount!=(MagAmmoRemaining + 1)){ OldAmmoAmount = MagAmmoRemaining+1; if(MagAmmoRemaining <= (MagCapacity>>2)) AmmoDigitsColor = LowAmmoDigitsColor; AmmoDigitsColor = default.AmmoDigitsColor; MyMessage = String(MagAmmoRemaining); ++ AmmoDigitsScriptedTexture.Revision; - } - AmmoDigitsScriptedTexture.Client = Self; - Super.RenderOverlays(Canvas); - default.PlayerViewPivot.Yaw = 0; - AmmoDigitsScriptedTexture.Client = None; -} - -simulated function RenderTexture(ScriptedTexture Tex){ - local int w, h; - Tex.TextSize( MyMessage, AmmoDigitsFont, w, h ); - Tex.DrawText( ( Tex.USize / 2 ) - ( w / 2.2 ), ( Tex.VSize / 2 ) - ( h / 2.0 ),MyMessage, AmmoDigitsFont, AmmoDigitsColor ); -} - -simulated function ZoomIn(bool bAnimateTransition){ - default.PlayerViewPivot.Yaw = 0; - PlayerViewPivot.Yaw = 0; - super.ZoomIn(bAnimateTransition); -} - -simulated function ZoomOut(bool bAnimateTransition){ - default.PlayerViewPivot.Yaw = MyYaw; - PlayerViewPivot.Yaw = MyYaw; - super.ZoomOut(bAnimateTransition); -} - -simulated function PostBeginPlay(){ - local AutoReloadAnimDesc reloadDesc; - autoReloadsDescriptions.Length = 0; - reloadDesc.canInterruptFrame = 0.05; - reloadDesc.trashStartFrame = 0.183; - reloadDesc.resumeFrame = 0.06; - reloadDesc.speedFrame = 0.04; - reloadDesc.animName = 'AltFire'; - autoReloadsDescriptions[0] = reloadDesc; - super.PostBeginPlay(); -} - -defaultproperties -{ - Weight=7.000000 AmmoDigitsScriptedTexture=ScriptedTexture'HMG_T.M41A.AmmoText' AmmoDigitsFont=Font'BDFonts.DigitalMed' AmmoDigitsColor=(B=177,G=148,R=76,A=255) LowAmmoDigitsColor=(B=18,G=18,R=218,A=255) MyYaw=-648.000000 reloadPreEndFrame=0.198000 reloadEndFrame=0.716000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.247000 reloadChargeStartFrame=-1.000000 MagazineBone="mag" MagCapacity=66 ReloadRate=2.000000 bHasSecondaryAmmo=True bReduceMagAmmoOnSecondaryFire=False ReloadAnim="Reload" ReloadAnimRate=1.500000 WeaponReloadAnim="Reload_SCAR" bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 TraderInfoTexture=Texture'HMG_T.M41A.Trader_M41A' bIsTier3Weapon=True MeshRef="HMG_A.M41APulseRifle" SkinRefs(0)="HMG_T.M41A.M41A_cmb_final" SelectSoundRef="HMG_S.M41A.Select" HudImageRef="HMG_T.M41A.HUD.M41A_unselected" SelectedHudImageRef="HMG_T.M41A.HUD.M41A_selected" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceM41AFire' FireModeClass(1)=Class'NicePack.NiceM41AALTFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 Description="M41A Pulse Rifle. Designed to kill Aliens. Looks especially cool in Sigourney Weaver's hands." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=160 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=7 PickupClass=Class'NicePack.NiceM41APickup' PlayerViewOffset=(X=25.000000,Y=24.000000,Z=8.000000) PlayerViewPivot=(Yaw=-648) BobDamping=6.000000 AttachmentClass=Class'ScrnHMG.M41AAttachmentBeta' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="M41A Pulse Rifle" TransientSoundVolume=5.250000 +class NiceM41AAssaultRifle extends NiceWeapon; + +var string MyMessage; +var ScriptedTexture AmmoDigitsScriptedTexture; +var Font AmmoDigitsFont; +var color AmmoDigitsColor, LowAmmoDigitsColor; +var int OldAmmoAmount; +var float MyYaw; + +simulated function RenderOverlays( Canvas Canvas ){ + if(AmmoAmount(0) <= 0){ + if(OldAmmoAmount != -5){ + OldAmmoAmount = -5; + AmmoDigitsColor.R = 218; + AmmoDigitsColor.G = 18; + AmmoDigitsColor.B = 18; + MyMessage = "--"; + ++ AmmoDigitsScriptedTexture.Revision; + } + } + else if(bIsReloading){ + if(OldAmmoAmount != -4){ + OldAmmoAmount = -4; + AmmoDigitsColor.R = 218; + AmmoDigitsColor.G = 218; + AmmoDigitsColor.B = 18; + MyMessage = "RL"; + ++ AmmoDigitsScriptedTexture.Revision; + } + } + else if(OldAmmoAmount!=(MagAmmoRemaining + 1)){ + OldAmmoAmount = MagAmmoRemaining+1; + if(MagAmmoRemaining <= (MagCapacity>>2)) + AmmoDigitsColor = LowAmmoDigitsColor; + AmmoDigitsColor = default.AmmoDigitsColor; + MyMessage = String(MagAmmoRemaining); + ++ AmmoDigitsScriptedTexture.Revision; + } + AmmoDigitsScriptedTexture.Client = Self; + Super.RenderOverlays(Canvas); + default.PlayerViewPivot.Yaw = 0; + AmmoDigitsScriptedTexture.Client = None; +} + +simulated function RenderTexture(ScriptedTexture Tex){ + local int w, h; + Tex.TextSize( MyMessage, AmmoDigitsFont, w, h ); + Tex.DrawText( ( Tex.USize / 2 ) - ( w / 2.2 ), ( Tex.VSize / 2 ) - ( h / 2.0 ),MyMessage, AmmoDigitsFont, AmmoDigitsColor ); +} + +simulated function ZoomIn(bool bAnimateTransition){ + default.PlayerViewPivot.Yaw = 0; + PlayerViewPivot.Yaw = 0; + super.ZoomIn(bAnimateTransition); +} + +simulated function ZoomOut(bool bAnimateTransition){ + default.PlayerViewPivot.Yaw = MyYaw; + PlayerViewPivot.Yaw = MyYaw; + super.ZoomOut(bAnimateTransition); +} + +simulated function PostBeginPlay(){ + local AutoReloadAnimDesc reloadDesc; + autoReloadsDescriptions.Length = 0; + reloadDesc.canInterruptFrame = 0.05; + reloadDesc.trashStartFrame = 0.183; + reloadDesc.resumeFrame = 0.06; + reloadDesc.speedFrame = 0.04; + reloadDesc.animName = 'AltFire'; + autoReloadsDescriptions[0] = reloadDesc; + super.PostBeginPlay(); +} + +defaultproperties +{ + Weight=7.000000 + AmmoDigitsScriptedTexture=ScriptedTexture'HMG_T.M41A.AmmoText' + AmmoDigitsFont=Font'BDFonts.DigitalMed' + AmmoDigitsColor=(B=177,G=148,R=76,A=255) + LowAmmoDigitsColor=(B=18,G=18,R=218,A=255) + MyYaw=-648.000000 + reloadPreEndFrame=0.198000 + reloadEndFrame=0.716000 + reloadChargeEndFrame=-1.000000 + reloadMagStartFrame=0.247000 + reloadChargeStartFrame=-1.000000 + MagazineBone="mag" + MagCapacity=66 + ReloadRate=2.000000 + bHasSecondaryAmmo=True + bReduceMagAmmoOnSecondaryFire=False + ReloadAnim="Reload" + ReloadAnimRate=1.500000 + WeaponReloadAnim="Reload_SCAR" + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=55.000000 + TraderInfoTexture=Texture'HMG_T.M41A.Trader_M41A' + bIsTier3Weapon=True + MeshRef="HMG_A.M41APulseRifle" + SkinRefs(0)="HMG_T.M41A.M41A_cmb_final" + SelectSoundRef="HMG_S.M41A.Select" + HudImageRef="HMG_T.M41A.HUD.M41A_unselected" + SelectedHudImageRef="HMG_T.M41A.HUD.M41A_selected" + PlayerIronSightFOV=70.000000 + ZoomedDisplayFOV=45.000000 + FireModeClass(0)=Class'NicePack.NiceM41AFire' + FireModeClass(1)=Class'NicePack.NiceM41AALTFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + Description="M41A Pulse Rifle. Designed to kill Aliens. Looks especially cool in Sigourney Weaver's hands." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=55.000000 + Priority=160 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=4 + GroupOffset=7 + PickupClass=Class'NicePack.NiceM41APickup' + PlayerViewOffset=(X=25.000000,Y=24.000000,Z=8.000000) + PlayerViewPivot=(Yaw=-648) + BobDamping=6.000000 + AttachmentClass=Class'ScrnHMG.M41AAttachmentBeta' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="M41A Pulse Rifle" + TransientSoundVolume=5.250000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41AFire.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41AFire.uc index 5b890df..d5ab101 100644 --- a/sources/Weapons/Playable/Heavy/M41A/NiceM41AFire.uc +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41AFire.uc @@ -1,4 +1,34 @@ -class NiceM41AFire extends NiceFire; -defaultproperties -{ ProjectileSpeed=100000.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.050000 maxVerticalRecoilAngle=100 maxHorizontalRecoilAngle=50 ShellEjectClass=Class'ROEffects.KFShellEjectSCAR' ShellEjectBoneName="Shell Feeder" FireSoundRef="HMG_S.M41A.M41AFireMono" StereoFireSoundRef="HMG_S.M41A.M41AFire" NoAmmoSoundRef="HMG_S.M41A.DryFire" DamageType=Class'NicePack.NiceDamTypeM41AAssaultRifle' DamageMin=75 DamageMax=75 Momentum=13500.000000 bPawnRapidFireAnim=True TransientSoundVolume=5.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.070000 AmmoClass=Class'NicePack.NiceM41AAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=300.000000) ShakeRotRate=(X=7500.000000,Y=7500.000000,Z=7500.000000) ShakeRotTime=0.650000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.150000 BotRefireRate=0.990000 FlashEmitterClass=Class'ScrnHMG.MuzzleFlashM41A' aimerror=42.000000 +class NiceM41AFire extends NiceFire; +defaultproperties +{ + ProjectileSpeed=100000.000000 + FireAimedAnim="Fire_Iron" + RecoilRate=0.050000 + maxVerticalRecoilAngle=100 + maxHorizontalRecoilAngle=50 + ShellEjectClass=Class'ROEffects.KFShellEjectSCAR' + ShellEjectBoneName="Shell Feeder" + FireSoundRef="HMG_S.M41A.M41AFireMono" + StereoFireSoundRef="HMG_S.M41A.M41AFire" + NoAmmoSoundRef="HMG_S.M41A.DryFire" + DamageType=Class'NicePack.NiceDamTypeM41AAssaultRifle' + DamageMin=75 + DamageMax=75 + Momentum=13500.000000 + bPawnRapidFireAnim=True + TransientSoundVolume=5.800000 + FireLoopAnim="Fire" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.070000 + AmmoClass=Class'NicePack.NiceM41AAmmo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=300.000000) + ShakeRotRate=(X=7500.000000,Y=7500.000000,Z=7500.000000) + ShakeRotTime=0.650000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.150000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ScrnHMG.MuzzleFlashM41A' + aimerror=42.000000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41APickup.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41APickup.uc index d0f89c9..db381c5 100644 --- a/sources/Weapons/Playable/Heavy/M41A/NiceM41APickup.uc +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41APickup.uc @@ -1,5 +1,10 @@ -// secondary pickup required for grenades -class NiceM41APickup extends NiceM41APrimaryPickup; -defaultproperties -{ crossPerkIndecies(0)=6 AmmoCost=60 BuyClipSize=1 SecondaryAmmoShortName="M41A Frag Grenades" PrimaryWeaponPickup=Class'NicePack.NiceM41APrimaryPickup' -} +// secondary pickup required for grenades +class NiceM41APickup extends NiceM41APrimaryPickup; +defaultproperties +{ + crossPerkIndecies(0)=6 + AmmoCost=60 + BuyClipSize=1 + SecondaryAmmoShortName="M41A Frag Grenades" + PrimaryWeaponPickup=Class'NicePack.NiceM41APrimaryPickup' +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41APrimaryPickup.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41APrimaryPickup.uc index 8a715e5..14172a7 100644 --- a/sources/Weapons/Playable/Heavy/M41A/NiceM41APrimaryPickup.uc +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41APrimaryPickup.uc @@ -1,5 +1,25 @@ -class NiceM41APrimaryPickup extends NiceWeaponPickup; -defaultproperties -{ cost=750 - Weight=7.000000 AmmoCost=66 BuyClipSize=66 PowerValue=70 SpeedValue=100 RangeValue=80 Description="M41A Pulse Rifle. Designed to kill Aliens. Looks especially cool in Sigourney Weaver's hands." ItemName="M41A Pulse Rifle" ItemShortName="Pulse Rifle" AmmoItemName="M41A 10 mm caseless ammunition" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=1 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceM41AAssaultRifle' PickupMessage="You got the M41A" PickupSound=Sound'HMG_S.M41A.Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'HMG_A.M41APickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +class NiceM41APrimaryPickup extends NiceWeaponPickup; +defaultproperties +{ + cost=750 + Weight=7.000000 + AmmoCost=66 + BuyClipSize=66 + PowerValue=70 + SpeedValue=100 + RangeValue=80 + Description="M41A Pulse Rifle. Designed to kill Aliens. Looks especially cool in Sigourney Weaver's hands." + ItemName="M41A Pulse Rifle" + ItemShortName="Pulse Rifle" + AmmoItemName="M41A 10 mm caseless ammunition" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=1 + EquipmentCategoryID=3 + InventoryType=Class'NicePack.NiceM41AAssaultRifle' + PickupMessage="You got the M41A" + PickupSound=Sound'HMG_S.M41A.Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'HMG_A.M41APickup' + CollisionRadius=25.000000 + CollisionHeight=5.000000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41AProjectileAmmo.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41AProjectileAmmo.uc index 6189fe1..b8dfd4b 100644 --- a/sources/Weapons/Playable/Heavy/M41A/NiceM41AProjectileAmmo.uc +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41AProjectileAmmo.uc @@ -1,4 +1,11 @@ -class NiceM41AProjectileAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceM41APickup' AmmoPickupAmount=1 MaxAmmo=8 InitialAmount=2 IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=434,Y1=253,X2=506,Y2=292) ItemName="M41A Grenades" -} +class NiceM41AProjectileAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceM41APickup' + AmmoPickupAmount=1 + MaxAmmo=8 + InitialAmount=2 + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=434,Y1=253,X2=506,Y2=292) + ItemName="M41A Grenades" +} diff --git a/sources/Weapons/Playable/Heavy/M41A/NiceM41AProjectileAmmoPickup.uc b/sources/Weapons/Playable/Heavy/M41A/NiceM41AProjectileAmmoPickup.uc index fc879ea..af7582d 100644 --- a/sources/Weapons/Playable/Heavy/M41A/NiceM41AProjectileAmmoPickup.uc +++ b/sources/Weapons/Playable/Heavy/M41A/NiceM41AProjectileAmmoPickup.uc @@ -1,4 +1,9 @@ -class NiceM41AProjectileAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=2 InventoryType=Class'NicePack.NiceM41AProjectileAmmo' PickupMessage="M41A Grenades" StaticMesh=StaticMesh'KillingFloorStatics.FragPickup' CollisionRadius=25.000000 -} +class NiceM41AProjectileAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=2 + InventoryType=Class'NicePack.NiceM41AProjectileAmmo' + PickupMessage="M41A Grenades" + StaticMesh=StaticMesh'KillingFloorStatics.FragPickup' + CollisionRadius=25.000000 +} diff --git a/sources/Weapons/Playable/Heavy/RPK47/NiceDamTypeRPK47MG.uc b/sources/Weapons/Playable/Heavy/RPK47/NiceDamTypeRPK47MG.uc index ce8d937..55f1c92 100644 --- a/sources/Weapons/Playable/Heavy/RPK47/NiceDamTypeRPK47MG.uc +++ b/sources/Weapons/Playable/Heavy/RPK47/NiceDamTypeRPK47MG.uc @@ -1,6 +1,14 @@ -class NiceDamTypeRPK47MG extends NiceDamageTypeVetEnforcerBullets - abstract; -defaultproperties -{ WeaponClass=Class'NicePack.NiceRPK47MachineGun' DeathString="%k killed %o (RPK47)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True KDamageImpulse=6500.000000 KDeathVel=400.000000 KDeathUpKick=80.000000 - flinchMultiplier=0.75 +class NiceDamTypeRPK47MG extends NiceDamageTypeVetEnforcerBullets + abstract; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceRPK47MachineGun' + DeathString="%k killed %o (RPK47)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + KDamageImpulse=6500.000000 + KDeathVel=400.000000 + KDeathUpKick=80.000000 + flinchMultiplier=0.75 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Ammo.uc b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Ammo.uc index ccbb841..68c980c 100644 --- a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Ammo.uc +++ b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Ammo.uc @@ -1,4 +1,12 @@ -class NiceRPK47Ammo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceRPK47Pickup' AmmoPickupAmount=50 MaxAmmo=250 InitialAmount=50 PickupClass=Class'NicePack.NiceRPK47AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="Rounds 7.62mm" -} +class NiceRPK47Ammo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceRPK47Pickup' + AmmoPickupAmount=50 + MaxAmmo=250 + InitialAmount=50 + PickupClass=Class'NicePack.NiceRPK47AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="Rounds 7.62mm" +} diff --git a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47AmmoPickup.uc b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47AmmoPickup.uc index c3670b3..c6e2a4a 100644 --- a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47AmmoPickup.uc +++ b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47AmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceRPK47AmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=50 InventoryType=Class'NicePack.NiceRPK47Ammo' PickupMessage="7.62mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceRPK47AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=50 + InventoryType=Class'NicePack.NiceRPK47Ammo' + PickupMessage="7.62mm" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Attachment.uc b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Attachment.uc index dfc1ac2..a971276 100644 --- a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Attachment.uc +++ b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Attachment.uc @@ -1,4 +1,59 @@ -class NiceRPK47Attachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="Fire_AK47" FireAltAnims(1)="Fire_AK47" FireAltAnims(2)="Fire_AK47" FireAltAnims(3)="Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="HMG_A.RPK47_3rd" bHeavy=True bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 DrawScale=0.750000 -} +class NiceRPK47Attachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + ShellEjectBoneName="Shell_eject" + MovementAnims(0)="JogF_AK47" + MovementAnims(1)="JogB_AK47" + MovementAnims(2)="JogL_AK47" + MovementAnims(3)="JogR_AK47" + TurnLeftAnim="TurnL_AK47" + TurnRightAnim="TurnR_AK47" + CrouchAnims(0)="CHWalkF_AK47" + CrouchAnims(1)="CHWalkB_AK47" + CrouchAnims(2)="CHWalkL_AK47" + CrouchAnims(3)="CHWalkR_AK47" + WalkAnims(0)="WalkF_AK47" + WalkAnims(1)="WalkB_AK47" + WalkAnims(2)="WalkL_AK47" + WalkAnims(3)="WalkR_AK47" + CrouchTurnRightAnim="CH_TurnR_AK47" + CrouchTurnLeftAnim="CH_TurnL_AK47" + IdleCrouchAnim="CHIdle_AK47" + IdleWeaponAnim="Idle_AK47" + IdleRestAnim="Idle_AK47" + IdleChatAnim="Idle_AK47" + IdleHeavyAnim="Idle_AK47" + IdleRifleAnim="Idle_AK47" + FireAnims(0)="Fire_AK47" + FireAnims(1)="Fire_AK47" + FireAnims(2)="Fire_AK47" + FireAnims(3)="Fire_AK47" + FireAltAnims(0)="Fire_AK47" + FireAltAnims(1)="Fire_AK47" + FireAltAnims(2)="Fire_AK47" + FireAltAnims(3)="Fire_AK47" + FireCrouchAnims(0)="CHFire_AK47" + FireCrouchAnims(1)="CHFire_AK47" + FireCrouchAnims(2)="CHFire_AK47" + FireCrouchAnims(3)="CHFire_AK47" + FireCrouchAltAnims(0)="CHFire_AK47" + FireCrouchAltAnims(1)="CHFire_AK47" + FireCrouchAltAnims(2)="CHFire_AK47" + FireCrouchAltAnims(3)="CHFire_AK47" + HitAnims(0)="HitF_AK47" + HitAnims(1)="HitB_AK47" + HitAnims(2)="HitL_AK47" + HitAnims(3)="HitR_AK47" + PostFireBlendStandAnim="Blend_AK47" + PostFireBlendCrouchAnim="CHBlend_AK47" + MeshRef="HMG_A.RPK47_3rd" + bHeavy=True + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 + DrawScale=0.750000 +} diff --git a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Fire.uc b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Fire.uc index 658907f..a3692d9 100644 --- a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Fire.uc +++ b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Fire.uc @@ -1,4 +1,37 @@ -class NiceRPK47Fire extends NiceHeavyFire; -defaultproperties -{ ProjectileSpeed=37250.000000 contBonus=1.400000 FireAimedAnim="Fire_Iron" RecoilRate=0.050000 maxVerticalRecoilAngle=400 maxHorizontalRecoilAngle=200 ShellEjectClass=Class'ROEffects.KFShellEjectAK' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="HMG_S.RPK.rpk47_shoot" StereoFireSoundRef="HMG_S.RPK.rpk47_shoot" NoAmmoSoundRef="HMG_S.RPK.rpk47_empty" DamageType=Class'NicePack.NiceDamTypeRPK47MG' DamageMin=100 DamageMax=100 Momentum=10500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.300000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.109000 AmmoClass=Class'NicePack.NiceRPK47Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' aimerror=42.000000 +class NiceRPK47Fire extends NiceHeavyFire; +defaultproperties +{ + ProjectileSpeed=37250.000000 + contBonus=1.400000 + FireAimedAnim="Fire_Iron" + RecoilRate=0.050000 + maxVerticalRecoilAngle=400 + maxHorizontalRecoilAngle=200 + ShellEjectClass=Class'ROEffects.KFShellEjectAK' + ShellEjectBoneName="Shell_eject" + bAccuracyBonusForSemiAuto=True + bRandomPitchFireSound=False + FireSoundRef="HMG_S.RPK.rpk47_shoot" + StereoFireSoundRef="HMG_S.RPK.rpk47_shoot" + NoAmmoSoundRef="HMG_S.RPK.rpk47_empty" + DamageType=Class'NicePack.NiceDamTypeRPK47MG' + DamageMin=100 + DamageMax=100 + Momentum=10500.000000 + bPawnRapidFireAnim=True + TransientSoundVolume=1.300000 + FireLoopAnim="Fire" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.109000 + AmmoClass=Class'NicePack.NiceRPK47Ammo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) + ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) + ShakeRotTime=0.750000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.250000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' + aimerror=42.000000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47MachineGun.uc b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47MachineGun.uc index fd45c02..29260fd 100644 --- a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47MachineGun.uc +++ b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47MachineGun.uc @@ -1,5 +1,60 @@ -class NiceRPK47MachineGun extends NiceHeavyGun; - -defaultproperties -{ reloadPreEndFrame=0.140000 reloadEndFrame=0.500000 reloadChargeEndFrame=0.710000 reloadMagStartFrame=0.280000 reloadChargeStartFrame=0.550000 MagazineBone="clip" MagCapacity=50 ReloadRate=3.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_AK47" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'HMG_T.RPK.RPK47_Trader' bIsTier2Weapon=True MeshRef="HMG_A.RPK47_mesh" SkinRefs(0)="HMG_T.RPK.RPK_0" SkinRefs(1)="KF_Weapons3_Trip_T.hands.Priest_Hands_1st_P" SkinRefs(2)="HMG_T.RPK.RPK_1" SkinRefs(3)="HMG_T.RPK.RPK_2" SkinRefs(4)="HMG_T.RPK.RPK_3" SkinRefs(5)="HMG_T.RPK.RPK_4" SkinRefs(6)="HMG_T.RPK.RPK_5" SkinRefs(7)="HMG_T.RPK.RPK_6" SkinRefs(8)="HMG_T.RPK.RPK_7" SkinRefs(9)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" SelectSoundRef="HMG_S.RPK.rpk47_select" HudImageRef="HMG_T.RPK.RPK47_Unselected" SelectedHudImageRef="HMG_T.RPK.RPK47_selected" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceRPK47Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="The RPK (Russian: Ruchnoy Pulemyot Kalashnikova, Kalashnikov hand-held machine gun) is a 7.62x39mm light machine gun of Soviet design, developed by Mikhail Kalashnikov in the late 1950s, parallel with the AKM assault rifle." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=125 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=7 PickupClass=Class'NicePack.NiceRPK47Pickup' PlayerViewOffset=(X=8.000000,Y=8.000000,Z=-3.000000) BobDamping=4.000000 AttachmentClass=Class'NicePack.NiceRPK47Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="RPK-47" TransientSoundVolume=1.250000 +class NiceRPK47MachineGun extends NiceHeavyGun; + +defaultproperties +{ + reloadPreEndFrame=0.140000 + reloadEndFrame=0.500000 + reloadChargeEndFrame=0.710000 + reloadMagStartFrame=0.280000 + reloadChargeStartFrame=0.550000 + MagazineBone="clip" + MagCapacity=50 + ReloadRate=3.000000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_AK47" + Weight=6.000000 + bHasAimingMode=True + IdleAimAnim="Iron_Idle" + StandardDisplayFOV=65.000000 + TraderInfoTexture=Texture'HMG_T.RPK.RPK47_Trader' + bIsTier2Weapon=True + MeshRef="HMG_A.RPK47_mesh" + SkinRefs(0)="HMG_T.RPK.RPK_0" + SkinRefs(1)="KF_Weapons3_Trip_T.hands.Priest_Hands_1st_P" + SkinRefs(2)="HMG_T.RPK.RPK_1" + SkinRefs(3)="HMG_T.RPK.RPK_2" + SkinRefs(4)="HMG_T.RPK.RPK_3" + SkinRefs(5)="HMG_T.RPK.RPK_4" + SkinRefs(6)="HMG_T.RPK.RPK_5" + SkinRefs(7)="HMG_T.RPK.RPK_6" + SkinRefs(8)="HMG_T.RPK.RPK_7" + SkinRefs(9)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" + SelectSoundRef="HMG_S.RPK.rpk47_select" + HudImageRef="HMG_T.RPK.RPK47_Unselected" + SelectedHudImageRef="HMG_T.RPK.RPK47_selected" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=32.000000 + FireModeClass(0)=Class'NicePack.NiceRPK47Fire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="The RPK (Russian: Ruchnoy Pulemyot Kalashnikova, Kalashnikov hand-held machine gun) is a 7.62x39mm light machine gun of Soviet design, developed by Mikhail Kalashnikov in the late 1950s, parallel with the AKM assault rifle." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=65.000000 + Priority=125 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=3 + GroupOffset=7 + PickupClass=Class'NicePack.NiceRPK47Pickup' + PlayerViewOffset=(X=8.000000,Y=8.000000,Z=-3.000000) + BobDamping=4.000000 + AttachmentClass=Class'NicePack.NiceRPK47Attachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="RPK-47" + TransientSoundVolume=1.250000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Pickup.uc b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Pickup.uc index 33dd43c..7f87a3e 100644 --- a/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Pickup.uc +++ b/sources/Weapons/Playable/Heavy/RPK47/NiceRPK47Pickup.uc @@ -1,6 +1,26 @@ -class NiceRPK47Pickup extends NiceWeaponPickup; - -defaultproperties -{ - cost=250 Weight=8.000000 AmmoCost=45 BuyClipSize=30 PowerValue=49 SpeedValue=86 RangeValue=70 Description="The RPK (Russian: Ruchnoy Pulemyot Kalashnikova, Kalashnikov hand-held machine gun) is a 7.62x39mm light machine gun of Soviet design, developed by Mikhail Kalashnikov in the late 1950s, parallel with the AKM assault rifle." ItemName="RPK-47" ItemShortName="RPK-47" AmmoItemName="Rounds 7.62x39mm" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=1 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceRPK47MachineGun' PickupMessage="You picked up the RPK-47" PickupSound=Sound'HMG_S.RPK.rpk47_pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'HMG_A.RPK47_st' CollisionRadius=25.000000 CollisionHeight=5.000000 +class NiceRPK47Pickup extends NiceWeaponPickup; + +defaultproperties +{ + cost=250 + Weight=8.000000 + AmmoCost=45 + BuyClipSize=30 + PowerValue=49 + SpeedValue=86 + RangeValue=70 + Description="The RPK (Russian: Ruchnoy Pulemyot Kalashnikova, Kalashnikov hand-held machine gun) is a 7.62x39mm light machine gun of Soviet design, developed by Mikhail Kalashnikov in the late 1950s, parallel with the AKM assault rifle." + ItemName="RPK-47" + ItemShortName="RPK-47" + AmmoItemName="Rounds 7.62x39mm" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=1 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceRPK47MachineGun' + PickupMessage="You picked up the RPK-47" + PickupSound=Sound'HMG_S.RPK.rpk47_pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'HMG_A.RPK47_st' + CollisionRadius=25.000000 + CollisionHeight=5.000000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/SA80LSW/NiceDamTypeSA80LSW.uc b/sources/Weapons/Playable/Heavy/SA80LSW/NiceDamTypeSA80LSW.uc index a742a39..5208729 100644 --- a/sources/Weapons/Playable/Heavy/SA80LSW/NiceDamTypeSA80LSW.uc +++ b/sources/Weapons/Playable/Heavy/SA80LSW/NiceDamTypeSA80LSW.uc @@ -1,5 +1,15 @@ -class NiceDamTypeSA80LSW extends NiceDamageTypeVetEnforcerBullets - abstract; -defaultproperties -{ goodDecapMod=0.750000 stunMultiplier=1.400000 HeadShotDamageMult=1.000000 WeaponClass=Class'NicePack.NiceSA80LSW' DeathString="%k killed %o (SA80 LSW)." bRagdollBullet=True DamageThreshold=1 KDamageImpulse=3000.000000 KDeathVel=300.000000 KDeathUpKick=40.000000 -} +class NiceDamTypeSA80LSW extends NiceDamageTypeVetEnforcerBullets + abstract; +defaultproperties +{ + goodDecapMod=0.750000 + stunMultiplier=1.400000 + HeadShotDamageMult=1.000000 + WeaponClass=Class'NicePack.NiceSA80LSW' + DeathString="%k killed %o (SA80 LSW)." + bRagdollBullet=True + DamageThreshold=1 + KDamageImpulse=3000.000000 + KDeathVel=300.000000 + KDeathUpKick=40.000000 +} diff --git a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSW.uc b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSW.uc index cc1e208..3e16e72 100644 --- a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSW.uc +++ b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSW.uc @@ -1,5 +1,64 @@ -class NiceSA80LSW extends NiceScopedWeapon; -#exec OBJ LOAD FILE=ScopeShaders.utx -defaultproperties -{ lenseMaterialID=8 scopePortalFOVHigh=13.000000 scopePortalFOV=13.000000 tileSize=512 ZoomMatRef="HMG_T.SA80.SA80crosshairs_FB" ScriptedTextureFallbackRef="HMG_T.SA80.alpha_lens_64x64" CrosshairTexRef="HMG_T.SA80.SA80crosshairs" reloadPreEndFrame=0.131000 reloadEndFrame=0.570000 reloadChargeEndFrame=0.738000 reloadMagStartFrame=0.290000 reloadChargeStartFrame=0.664000 MagazineBone="clip" bHasScope=True ZoomedDisplayFOVHigh=50.000000 MagCapacity=30 ReloadRate=3.500000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_BullPup" Weight=5.000000 bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'HMG_T.SA80.SA80LSW_Trader' MeshRef="HMG_A.SA80LSW_mesh" SkinRefs(0)="HMG_T.SA80.SA80LSW_1" SkinRefs(1)="KF_Weapons3_Trip_T.hands.Priest_Hands_1st_P" SkinRefs(2)="HMG_T.SA80.SA80LSW_2" SkinRefs(3)="HMG_T.SA80.SA80LSW_3" SkinRefs(4)="HMG_T.SA80.SA80LSW_4" SkinRefs(5)="HMG_T.SA80.SA80LSW_5" SkinRefs(6)="HMG_T.SA80.SA80LSW_6" SkinRefs(7)="KF_Weapons_Trip_T.Rifles.CBLens_cmb" SkinRefs(8)="HMG_T.SA80.alpha_lens_64x64" SelectSoundRef="HMG_S.SA80.SA80LSW_select" HudImageRef="HMG_T.SA80.SA80LSW_Unselected" SelectedHudImageRef="HMG_T.SA80.SA80LSW_selected" PlayerIronSightFOV=32.000000 ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceSA80LSWFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="An odd member of a heavy machinegunner's arsenal, SA80 LSW was modified to have a stable aim and use ammunition that's good for both precise shots at vulnerable points and mangling whole zed's bodies." DisplayFOV=65.000000 Priority=100 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=3 PickupClass=Class'NicePack.NiceSA80LSWPickup' PlayerViewOffset=(X=20.000000,Y=10.000000,Z=-2.000000) BobDamping=5.000000 AttachmentClass=Class'NicePack.NiceSA80LSWAttachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="SA80 LSW" -} +class NiceSA80LSW extends NiceScopedWeapon; +#exec OBJ LOAD FILE=ScopeShaders.utx +defaultproperties +{ + lenseMaterialID=8 + scopePortalFOVHigh=13.000000 + scopePortalFOV=13.000000 + tileSize=512 + ZoomMatRef="HMG_T.SA80.SA80crosshairs_FB" + ScriptedTextureFallbackRef="HMG_T.SA80.alpha_lens_64x64" + CrosshairTexRef="HMG_T.SA80.SA80crosshairs" + reloadPreEndFrame=0.131000 + reloadEndFrame=0.570000 + reloadChargeEndFrame=0.738000 + reloadMagStartFrame=0.290000 + reloadChargeStartFrame=0.664000 + MagazineBone="clip" + bHasScope=True + ZoomedDisplayFOVHigh=50.000000 + MagCapacity=30 + ReloadRate=3.500000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_BullPup" + Weight=5.000000 + bHasAimingMode=True + IdleAimAnim="Iron_Idle" + StandardDisplayFOV=65.000000 + TraderInfoTexture=Texture'HMG_T.SA80.SA80LSW_Trader' + MeshRef="HMG_A.SA80LSW_mesh" + SkinRefs(0)="HMG_T.SA80.SA80LSW_1" + SkinRefs(1)="KF_Weapons3_Trip_T.hands.Priest_Hands_1st_P" + SkinRefs(2)="HMG_T.SA80.SA80LSW_2" + SkinRefs(3)="HMG_T.SA80.SA80LSW_3" + SkinRefs(4)="HMG_T.SA80.SA80LSW_4" + SkinRefs(5)="HMG_T.SA80.SA80LSW_5" + SkinRefs(6)="HMG_T.SA80.SA80LSW_6" + SkinRefs(7)="KF_Weapons_Trip_T.Rifles.CBLens_cmb" + SkinRefs(8)="HMG_T.SA80.alpha_lens_64x64" + SelectSoundRef="HMG_S.SA80.SA80LSW_select" + HudImageRef="HMG_T.SA80.SA80LSW_Unselected" + SelectedHudImageRef="HMG_T.SA80.SA80LSW_selected" + PlayerIronSightFOV=32.000000 + ZoomedDisplayFOV=50.000000 + FireModeClass(0)=Class'NicePack.NiceSA80LSWFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.650000 + CurrentRating=0.650000 + Description="An odd member of a heavy machinegunner's arsenal, SA80 LSW was modified to have a stable aim and use ammunition that's good for both precise shots at vulnerable points and mangling whole zed's bodies." + DisplayFOV=65.000000 + Priority=100 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=3 + GroupOffset=3 + PickupClass=Class'NicePack.NiceSA80LSWPickup' + PlayerViewOffset=(X=20.000000,Y=10.000000,Z=-2.000000) + BobDamping=5.000000 + AttachmentClass=Class'NicePack.NiceSA80LSWAttachment' + IconCoords=(X1=253,Y1=146,X2=333,Y2=181) + ItemName="SA80 LSW" +} diff --git a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAmmo.uc b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAmmo.uc index aa19610..44683b9 100644 --- a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAmmo.uc +++ b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAmmo.uc @@ -1,4 +1,12 @@ -class NiceSA80LSWAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceSA80LSWPickup' AmmoPickupAmount=30 MaxAmmo=360 InitialAmount=90 PickupClass=Class'NicePack.NiceSA80LSWAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="5.56x45" -} +class NiceSA80LSWAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceSA80LSWPickup' + AmmoPickupAmount=30 + MaxAmmo=360 + InitialAmount=90 + PickupClass=Class'NicePack.NiceSA80LSWAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="5.56x45" +} diff --git a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAmmoPickup.uc b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAmmoPickup.uc index 5dac048..bc9c752 100644 --- a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAmmoPickup.uc +++ b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceSA80LSWAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=30 InventoryType=Class'NicePack.NiceSA80LSWAmmo' PickupMessage="5.56x45" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceSA80LSWAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=30 + InventoryType=Class'NicePack.NiceSA80LSWAmmo' + PickupMessage="5.56x45" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAttachment.uc b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAttachment.uc index c36b453..736ff3d 100644 --- a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAttachment.uc +++ b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWAttachment.uc @@ -1,4 +1,56 @@ -class NiceSA80LSWAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="Fire_AK47" FireAltAnims(1)="Fire_AK47" FireAltAnims(2)="Fire_AK47" FireAltAnims(3)="Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="HMG_A.SA80LSW_3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 DrawScale=1.100000 -} +class NiceSA80LSWAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + MovementAnims(0)="JogF_AK47" + MovementAnims(1)="JogB_AK47" + MovementAnims(2)="JogL_AK47" + MovementAnims(3)="JogR_AK47" + TurnLeftAnim="TurnL_AK47" + TurnRightAnim="TurnR_AK47" + CrouchAnims(0)="CHWalkF_AK47" + CrouchAnims(1)="CHWalkB_AK47" + CrouchAnims(2)="CHWalkL_AK47" + CrouchAnims(3)="CHWalkR_AK47" + WalkAnims(0)="WalkF_AK47" + WalkAnims(1)="WalkB_AK47" + WalkAnims(2)="WalkL_AK47" + WalkAnims(3)="WalkR_AK47" + CrouchTurnRightAnim="CH_TurnR_AK47" + CrouchTurnLeftAnim="CH_TurnL_AK47" + IdleCrouchAnim="CHIdle_AK47" + IdleWeaponAnim="Idle_AK47" + IdleRestAnim="Idle_AK47" + IdleChatAnim="Idle_AK47" + IdleHeavyAnim="Idle_AK47" + IdleRifleAnim="Idle_AK47" + FireAnims(0)="Fire_AK47" + FireAnims(1)="Fire_AK47" + FireAnims(2)="Fire_AK47" + FireAnims(3)="Fire_AK47" + FireAltAnims(0)="Fire_AK47" + FireAltAnims(1)="Fire_AK47" + FireAltAnims(2)="Fire_AK47" + FireAltAnims(3)="Fire_AK47" + FireCrouchAnims(0)="CHFire_AK47" + FireCrouchAnims(1)="CHFire_AK47" + FireCrouchAnims(2)="CHFire_AK47" + FireCrouchAnims(3)="CHFire_AK47" + FireCrouchAltAnims(0)="CHFire_AK47" + FireCrouchAltAnims(1)="CHFire_AK47" + FireCrouchAltAnims(2)="CHFire_AK47" + FireCrouchAltAnims(3)="CHFire_AK47" + HitAnims(0)="HitF_AK47" + HitAnims(1)="HitB_AK47" + HitAnims(2)="HitL_AK47" + HitAnims(3)="HitR_AK47" + PostFireBlendStandAnim="Blend_AK47" + PostFireBlendCrouchAnim="CHBlend_AK47" + MeshRef="HMG_A.SA80LSW_3rd" + bHeavy=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 + DrawScale=1.100000 +} diff --git a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWFire.uc b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWFire.uc index 4465c22..79065b5 100644 --- a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWFire.uc +++ b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWFire.uc @@ -1,4 +1,35 @@ -class NiceSA80LSWFire extends NiceHeavyFire; -defaultproperties -{ ProjectileSpeed=46500.000000 FireAimedAnim="Iron_Idle" RecoilRate=0.050000 maxVerticalRecoilAngle=300 maxHorizontalRecoilAngle=150 ShellEjectClass=Class'ROEffects.KFShellEjectBullpup' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True FireSoundRef="HMG_S.SA80.SA80LSW_shot" StereoFireSoundRef="HMG_S.SA80.SA80LSW_shot" NoAmmoSoundRef="HMG_S.SA80.SA80LSW_empty" DamageType=Class'NicePack.NiceDamTypeSA80LSW' DamageMin=70 DamageMax=70 Momentum=12500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.400000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.200000 AmmoClass=Class'NicePack.NiceSA80LSWAmmo' ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=0.500000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.000000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 +class NiceSA80LSWFire extends NiceHeavyFire; +defaultproperties +{ + ProjectileSpeed=46500.000000 + FireAimedAnim="Iron_Idle" + RecoilRate=0.050000 + maxVerticalRecoilAngle=300 + maxHorizontalRecoilAngle=150 + ShellEjectClass=Class'ROEffects.KFShellEjectBullpup' + ShellEjectBoneName="Shell_eject" + bAccuracyBonusForSemiAuto=True + FireSoundRef="HMG_S.SA80.SA80LSW_shot" + StereoFireSoundRef="HMG_S.SA80.SA80LSW_shot" + NoAmmoSoundRef="HMG_S.SA80.SA80LSW_empty" + DamageType=Class'NicePack.NiceDamTypeSA80LSW' + DamageMin=70 + DamageMax=70 + Momentum=12500.000000 + bPawnRapidFireAnim=True + TransientSoundVolume=1.400000 + FireLoopAnim="Fire" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.200000 + AmmoClass=Class'NicePack.NiceSA80LSWAmmo' + ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeRotTime=0.500000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.000000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' + aimerror=42.000000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWPickup.uc b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWPickup.uc index 3ea80b9..2f57ce6 100644 --- a/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWPickup.uc +++ b/sources/Weapons/Playable/Heavy/SA80LSW/NiceSA80LSWPickup.uc @@ -1,5 +1,25 @@ -class NiceSA80LSWPickup extends NiceWeaponPickup; -defaultproperties -{ - cost=200 Weight=5.000000 AmmoCost=30 BuyClipSize=30 PowerValue=41 SpeedValue=60 RangeValue=60 Description="An odd member of a heavy machinegunner's arsenal, SA80 LSW was modified to have a stable aim and use ammunition that's good for both precise shots at vulnerable points and mangling whole zed's bodies." ItemName="SA80 LSW" ItemShortName="SA80 LSW" AmmoItemName="Rounds 5.56x45" CorrespondingPerkIndex=1 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceSA80LSW' PickupMessage="You picked up the SA80 LSW" PickupSound=Sound'HMG_S.SA80.SA80LSW_pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'HMG_A.SA80LSW_st' DrawScale=1.500000 CollisionRadius=30.000000 CollisionHeight=5.000000 -} +class NiceSA80LSWPickup extends NiceWeaponPickup; +defaultproperties +{ + cost=200 + Weight=5.000000 + AmmoCost=30 + BuyClipSize=30 + PowerValue=41 + SpeedValue=60 + RangeValue=60 + Description="An odd member of a heavy machinegunner's arsenal, SA80 LSW was modified to have a stable aim and use ammunition that's good for both precise shots at vulnerable points and mangling whole zed's bodies." + ItemName="SA80 LSW" + ItemShortName="SA80 LSW" + AmmoItemName="Rounds 5.56x45" + CorrespondingPerkIndex=1 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceSA80LSW' + PickupMessage="You picked up the SA80 LSW" + PickupSound=Sound'HMG_S.SA80.SA80LSW_pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'HMG_A.SA80LSW_st' + DrawScale=1.500000 + CollisionRadius=30.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Heavy/Stinger/NiceDamTypeStinger.uc b/sources/Weapons/Playable/Heavy/Stinger/NiceDamTypeStinger.uc index 804feae..23af6a0 100644 --- a/sources/Weapons/Playable/Heavy/Stinger/NiceDamTypeStinger.uc +++ b/sources/Weapons/Playable/Heavy/Stinger/NiceDamTypeStinger.uc @@ -1,5 +1,7 @@ -class NiceDamTypeStinger extends NiceDamTypeSPAM - abstract; -defaultproperties -{ WeaponClass=Class'NicePack.NiceStinger' DeathString="%k killed %o (Stinger)." -} +class NiceDamTypeStinger extends NiceDamTypeSPAM + abstract; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceStinger' + DeathString="%k killed %o (Stinger)." +} diff --git a/sources/Weapons/Playable/Heavy/Stinger/NiceStinger.uc b/sources/Weapons/Playable/Heavy/Stinger/NiceStinger.uc index 6f1eed0..3f9b414 100644 --- a/sources/Weapons/Playable/Heavy/Stinger/NiceStinger.uc +++ b/sources/Weapons/Playable/Heavy/Stinger/NiceStinger.uc @@ -1,4 +1,10 @@ -class NiceStinger extends Stinger; -defaultproperties -{ MagCapacity=160 Weight=8.000000 FireModeClass(0)=Class'NicePack.NiceStingerFire' FireModeClass(1)=Class'NicePack.NiceStingerAltFire' PickupClass=Class'NicePack.NiceStingerPickup' ItemName="Stinger Minigun" -} +class NiceStinger extends Stinger; +defaultproperties +{ + MagCapacity=160 + Weight=8.000000 + FireModeClass(0)=Class'NicePack.NiceStingerFire' + FireModeClass(1)=Class'NicePack.NiceStingerAltFire' + PickupClass=Class'NicePack.NiceStingerPickup' + ItemName="Stinger Minigun" +} diff --git a/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAltFire.uc b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAltFire.uc index 20df584..9b41c29 100644 --- a/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAltFire.uc +++ b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAltFire.uc @@ -1,4 +1,8 @@ -class NiceStingerAltFire extends StingerAltFire; -defaultproperties -{ DamageMin=120 DamageMax=120 AmmoClass=Class'NicePack.NiceStingerAmmo' AmmoPerFire=6 -} +class NiceStingerAltFire extends StingerAltFire; +defaultproperties +{ + DamageMin=120 + DamageMax=120 + AmmoClass=Class'NicePack.NiceStingerAmmo' + AmmoPerFire=6 +} diff --git a/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAmmo.uc b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAmmo.uc index cb4fab5..91f8ad0 100644 --- a/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAmmo.uc +++ b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAmmo.uc @@ -1,5 +1,9 @@ -class NiceStingerAmmo extends StingerAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ AmmoPickupAmount=80 MaxAmmo=640 InitialAmount=160 PickupClass=Class'NicePack.NiceStingerAmmoPickup' -} +class NiceStingerAmmo extends StingerAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + AmmoPickupAmount=80 + MaxAmmo=640 + InitialAmount=160 + PickupClass=Class'NicePack.NiceStingerAmmoPickup' +} diff --git a/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAmmoPickup.uc b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAmmoPickup.uc index 0941af5..ceb8537 100644 --- a/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAmmoPickup.uc +++ b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerAmmoPickup.uc @@ -1,4 +1,6 @@ -class NiceStingerAmmoPickup extends StingerAmmoPickup; -defaultproperties -{ AmmoAmount=80 InventoryType=Class'NicePack.NiceStingerAmmo' -} +class NiceStingerAmmoPickup extends StingerAmmoPickup; +defaultproperties +{ + AmmoAmount=80 + InventoryType=Class'NicePack.NiceStingerAmmo' +} diff --git a/sources/Weapons/Playable/Heavy/Stinger/NiceStingerFire.uc b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerFire.uc index edec40a..a6b0c31 100644 --- a/sources/Weapons/Playable/Heavy/Stinger/NiceStingerFire.uc +++ b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerFire.uc @@ -1,4 +1,10 @@ -class NiceStingerFire extends StingerFire; -defaultproperties -{ maxVerticalRecoilAngle=112 maxHorizontalRecoilAngle=56 DamageType=Class'NicePack.NiceDamTypeStinger' DamageMin=45 DamageMax=45 AmmoClass=Class'NicePack.NiceStingerAmmo' -} +class NiceStingerFire extends StingerFire; +defaultproperties +{ + maxVerticalRecoilAngle=112 + maxHorizontalRecoilAngle=56 + DamageType=Class'NicePack.NiceDamTypeStinger' + DamageMin=45 + DamageMax=45 + AmmoClass=Class'NicePack.NiceStingerAmmo' +} diff --git a/sources/Weapons/Playable/Heavy/Stinger/NiceStingerPickup.uc b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerPickup.uc index d4f2fa8..4bc9a12 100644 --- a/sources/Weapons/Playable/Heavy/Stinger/NiceStingerPickup.uc +++ b/sources/Weapons/Playable/Heavy/Stinger/NiceStingerPickup.uc @@ -1,4 +1,11 @@ -class NiceStingerPickup extends StingerPickup; -defaultproperties -{ Weight=8.000000 cost=750 AmmoCost=150 BuyClipSize=80 ItemName="Stinger Minigun" ItemShortName="Stinger" InventoryType=Class'NicePack.NiceStinger' -} +class NiceStingerPickup extends StingerPickup; +defaultproperties +{ + Weight=8.000000 + cost=750 + AmmoCost=150 + BuyClipSize=80 + ItemName="Stinger Minigun" + ItemShortName="Stinger" + InventoryType=Class'NicePack.NiceStinger' +} diff --git a/sources/Weapons/Playable/Heavy/XMV/NiceDamTypeXMV850M.uc b/sources/Weapons/Playable/Heavy/XMV/NiceDamTypeXMV850M.uc index 4043cc7..f850b82 100644 --- a/sources/Weapons/Playable/Heavy/XMV/NiceDamTypeXMV850M.uc +++ b/sources/Weapons/Playable/Heavy/XMV/NiceDamTypeXMV850M.uc @@ -1,6 +1,12 @@ -class NiceDamTypeXMV850M extends NiceDamageTypeVetEnforcerBullets - abstract; -defaultproperties -{ WeaponClass=Class'NicePack.NiceXMV850M' DeathString="%k killed %o (XMV850 Minigun)." - //stunMultiplier=0.5 bRagdollBullet=True KDamageImpulse=51500.000000 KDeathVel=275.000000 KDeathUpKick=45.000000 +class NiceDamTypeXMV850M extends NiceDamageTypeVetEnforcerBullets + abstract; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceXMV850M' + DeathString="%k killed %o (XMV850 Minigun)." + //stunMultiplier=0.5 + bRagdollBullet=True + KDamageImpulse=51500.000000 + KDeathVel=275.000000 + KDeathUpKick=45.000000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Ammo.uc b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Ammo.uc index 73230f0..81bf93a 100644 --- a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Ammo.uc +++ b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Ammo.uc @@ -1,5 +1,13 @@ -class NiceXMV850Ammo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceXMV850Pickup' AmmoPickupAmount=80 MaxAmmo=480 InitialAmount=120 PickupClass=Class'NicePack.NiceXMV850AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="XMV850 bullets" -} +class NiceXMV850Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceXMV850Pickup' + AmmoPickupAmount=80 + MaxAmmo=480 + InitialAmount=120 + PickupClass=Class'NicePack.NiceXMV850AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="XMV850 bullets" +} diff --git a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850AmmoPickup.uc b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850AmmoPickup.uc index 6ca8154..fa099f7 100644 --- a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850AmmoPickup.uc +++ b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850AmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceXMV850AmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=80 InventoryType=Class'NicePack.NiceXMV850Ammo' PickupMessage="Rounds 7.62x51mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceXMV850AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=80 + InventoryType=Class'NicePack.NiceXMV850Ammo' + PickupMessage="Rounds 7.62x51mm" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Attachment.uc b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Attachment.uc index 6b3a7a6..974de0f 100644 --- a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Attachment.uc +++ b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Attachment.uc @@ -1,19 +1,80 @@ -class NiceXMV850Attachment extends NiceAttachment; -var byte NetBarrelSpeed; -var int BarrelTurn; -var float BarrelSpeed; -replication -{ - reliable if(Role == ROLE_Authority) NetBarrelSpeed; -} -simulated event Tick(float dt){ - local Rotator bt; - super.Tick(dt); - if(Role == ROLE_Authority) NetBarrelSpeed = byte(BarrelSpeed * float(255)); - else BarrelSpeed = float(NetBarrelSpeed) / 255.00; - if(Level.NetMode != NM_DedicatedServer){ BarrelTurn += int(BarrelSpeed * float(655360) * dt); bt.Roll = BarrelTurn; SetBoneRotation('Barrels', bt); - } -} -defaultproperties -{ LaserAttachmentBone="Muzzle" mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="ejector" MovementAnims(0)="JogF_SCAR" MovementAnims(1)="JogB_SCAR" MovementAnims(2)="JogL_SCAR" MovementAnims(3)="JogR_SCAR" TurnLeftAnim="TurnL_SCAR" TurnRightAnim="TurnR_SCAR" CrouchAnims(0)="CHWalkF_SCAR" CrouchAnims(1)="CHWalkB_SCAR" CrouchAnims(2)="CHWalkL_SCAR" CrouchAnims(3)="CHWalkR_SCAR" WalkAnims(0)="WalkF_SCAR" WalkAnims(1)="WalkB_SCAR" WalkAnims(2)="WalkL_SCAR" WalkAnims(3)="WalkR_SCAR" CrouchTurnRightAnim="CH_TurnR_SCAR" CrouchTurnLeftAnim="CH_TurnL_SCAR" IdleCrouchAnim="CHIdle_SCAR" IdleWeaponAnim="Idle_SCAR" IdleRestAnim="Idle_SCAR" IdleChatAnim="Idle_SCAR" IdleHeavyAnim="Idle_SCAR" IdleRifleAnim="Idle_SCAR" FireAnims(0)="Fire_SCAR" FireAnims(1)="Fire_SCAR" FireAnims(2)="Fire_SCAR" FireAnims(3)="Fire_SCAR" FireAltAnims(0)="Fire_SCAR" FireAltAnims(1)="Fire_SCAR" FireAltAnims(2)="Fire_SCAR" FireAltAnims(3)="Fire_SCAR" FireCrouchAnims(0)="CHFire_SCAR" FireCrouchAnims(1)="CHFire_SCAR" FireCrouchAnims(2)="CHFire_SCAR" FireCrouchAnims(3)="CHFire_SCAR" FireCrouchAltAnims(0)="CHFire_SCAR" FireCrouchAltAnims(1)="CHFire_SCAR" FireCrouchAltAnims(2)="CHFire_SCAR" FireCrouchAltAnims(3)="CHFire_SCAR" HitAnims(0)="HitF_SCAR" HitAnims(1)="HitB_SCAR" HitAnims(2)="HitL_SCAR" HitAnims(3)="HitR_SCAR" PostFireBlendStandAnim="Blend_SCAR" PostFireBlendCrouchAnim="CHBlend_SCAR" MeshRef="HMG_A.XMV850_3rd" bHeavy=True bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceXMV850Attachment extends NiceAttachment; +var byte NetBarrelSpeed; +var int BarrelTurn; +var float BarrelSpeed; +replication +{ + reliable if(Role == ROLE_Authority) + NetBarrelSpeed; +} +simulated event Tick(float dt){ + local Rotator bt; + super.Tick(dt); + if(Role == ROLE_Authority) + NetBarrelSpeed = byte(BarrelSpeed * float(255)); + else + BarrelSpeed = float(NetBarrelSpeed) / 255.00; + if(Level.NetMode != NM_DedicatedServer){ + BarrelTurn += int(BarrelSpeed * float(655360) * dt); + bt.Roll = BarrelTurn; + SetBoneRotation('Barrels', bt); + } +} +defaultproperties +{ + LaserAttachmentBone="Muzzle" + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + ShellEjectBoneName="ejector" + MovementAnims(0)="JogF_SCAR" + MovementAnims(1)="JogB_SCAR" + MovementAnims(2)="JogL_SCAR" + MovementAnims(3)="JogR_SCAR" + TurnLeftAnim="TurnL_SCAR" + TurnRightAnim="TurnR_SCAR" + CrouchAnims(0)="CHWalkF_SCAR" + CrouchAnims(1)="CHWalkB_SCAR" + CrouchAnims(2)="CHWalkL_SCAR" + CrouchAnims(3)="CHWalkR_SCAR" + WalkAnims(0)="WalkF_SCAR" + WalkAnims(1)="WalkB_SCAR" + WalkAnims(2)="WalkL_SCAR" + WalkAnims(3)="WalkR_SCAR" + CrouchTurnRightAnim="CH_TurnR_SCAR" + CrouchTurnLeftAnim="CH_TurnL_SCAR" + IdleCrouchAnim="CHIdle_SCAR" + IdleWeaponAnim="Idle_SCAR" + IdleRestAnim="Idle_SCAR" + IdleChatAnim="Idle_SCAR" + IdleHeavyAnim="Idle_SCAR" + IdleRifleAnim="Idle_SCAR" + FireAnims(0)="Fire_SCAR" + FireAnims(1)="Fire_SCAR" + FireAnims(2)="Fire_SCAR" + FireAnims(3)="Fire_SCAR" + FireAltAnims(0)="Fire_SCAR" + FireAltAnims(1)="Fire_SCAR" + FireAltAnims(2)="Fire_SCAR" + FireAltAnims(3)="Fire_SCAR" + FireCrouchAnims(0)="CHFire_SCAR" + FireCrouchAnims(1)="CHFire_SCAR" + FireCrouchAnims(2)="CHFire_SCAR" + FireCrouchAnims(3)="CHFire_SCAR" + FireCrouchAltAnims(0)="CHFire_SCAR" + FireCrouchAltAnims(1)="CHFire_SCAR" + FireCrouchAltAnims(2)="CHFire_SCAR" + FireCrouchAltAnims(3)="CHFire_SCAR" + HitAnims(0)="HitF_SCAR" + HitAnims(1)="HitB_SCAR" + HitAnims(2)="HitL_SCAR" + HitAnims(3)="HitR_SCAR" + PostFireBlendStandAnim="Blend_SCAR" + PostFireBlendCrouchAnim="CHBlend_SCAR" + MeshRef="HMG_A.XMV850_3rd" + bHeavy=True + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Fire.uc b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Fire.uc index a8f87b1..6f91173 100644 --- a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Fire.uc +++ b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Fire.uc @@ -1,15 +1,46 @@ -class NiceXMV850Fire extends NiceHeavyFire; - -simulated function HandleRecoil(float Rec) -{ - local float truncatedContLenght; - local float recoilMod; - truncatedContLenght = FMin(currentContLenght, 20.0); - recoilMod = 1.0 - (truncatedContLenght / 20.0); - super.HandleRecoil(Rec * recoilMod); -} - -defaultproperties -{ ProjectileSpeed=42650.000000 maxBonusContLenght=5 - contBonusReset=false FireAimedAnim="FireLoop" RecoilRate=0.040000 maxVerticalRecoilAngle=450 maxHorizontalRecoilAngle=225 ShellEjectClass=Class'ROEffects.KFShellEjectSCAR' ShellEjectBoneName="ejector" FireSoundRef="HMG_S.XMV.XMV-Fire-1" StereoFireSoundRef="HMG_S.XMV.XMV-Fire-1" NoAmmoSoundRef="HMG_S.M41A.DryFire" DamageType=Class'NicePack.NiceDamTypeXMV850M' DamageMin=30 DamageMax=30 Momentum=8500.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.800000 FireAnim="FireLoop" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.065000 AmmoClass=Class'NicePack.NiceXMV850Ammo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=300.000000) ShakeRotRate=(X=7500.000000,Y=7500.000000,Z=7500.000000) ShakeRotTime=0.650000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.150000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 +class NiceXMV850Fire extends NiceHeavyFire; + +simulated function HandleRecoil(float Rec) +{ + local float truncatedContLenght; + local float recoilMod; + truncatedContLenght = FMin(currentContLenght, 20.0); + recoilMod = 1.0 - (truncatedContLenght / 20.0); + super.HandleRecoil(Rec * recoilMod); +} + +defaultproperties +{ + ProjectileSpeed=42650.000000 + maxBonusContLenght=5 + contBonusReset=false + FireAimedAnim="FireLoop" + RecoilRate=0.040000 + maxVerticalRecoilAngle=450 + maxHorizontalRecoilAngle=225 + ShellEjectClass=Class'ROEffects.KFShellEjectSCAR' + ShellEjectBoneName="ejector" + FireSoundRef="HMG_S.XMV.XMV-Fire-1" + StereoFireSoundRef="HMG_S.XMV.XMV-Fire-1" + NoAmmoSoundRef="HMG_S.M41A.DryFire" + DamageType=Class'NicePack.NiceDamTypeXMV850M' + DamageMin=30 + DamageMax=30 + Momentum=8500.000000 + bPawnRapidFireAnim=True + TransientSoundVolume=1.800000 + FireAnim="FireLoop" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.065000 + AmmoClass=Class'NicePack.NiceXMV850Ammo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=300.000000) + ShakeRotRate=(X=7500.000000,Y=7500.000000,Z=7500.000000) + ShakeRotTime=0.650000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.150000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' + aimerror=42.000000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850M.uc b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850M.uc index 19a8c9f..2fb970e 100644 --- a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850M.uc +++ b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850M.uc @@ -1,55 +1,133 @@ -class NiceXMV850M extends NiceHeavyGun; -var float DesiredSpeed; -var float BarrelSpeed; -var int BarrelTurn; -var Sound BarrelSpinSound, BarrelStopSound, BarrelStartSound; -var String BarrelSpinSoundRef, BarrelStopSoundRef, BarrelStartSoundRef; -static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount){ - local NiceXMV850M W; - super.PreloadAssets(Inv, bSkipRefCount); - if(default.BarrelSpinSound == none && default.BarrelSpinSoundRef != "") default.BarrelSpinSound = sound(DynamicLoadObject(default.BarrelSpinSoundRef, class'sound', true)); - if(default.BarrelStopSound == none && default.BarrelStopSoundRef != "") default.BarrelStopSound = sound(DynamicLoadObject(default.BarrelStopSoundRef, class'sound', true)); - if(default.BarrelStartSound == none && default.BarrelStartSoundRef != "") default.BarrelStartSound = sound(DynamicLoadObject(default.BarrelStartSoundRef, class'sound', true)); - W = NiceXMV850M(Inv); - if(W != none){ W.BarrelSpinSound = default.BarrelSpinSound; W.BarrelStopSound = default.BarrelStopSound; W.BarrelStartSound = default.BarrelStartSound; - } -} -static function bool UnloadAssets(){ - if(super.UnloadAssets()){ default.BarrelSpinSound = none; default.BarrelStopSound = none; default.BarrelStartSound = none; - } - return true; -} -// XMV uses custom hands -simulated function HandleSleeveSwapping(){} -simulated event WeaponTick(float dt){ - local Rotator bt; - super.WeaponTick(dt); - bt.Roll = BarrelTurn; - SetBoneRotation('Barrels', bt); - DesiredSpeed = 0.50; -} -simulated event Tick(float dt){ - local float OldBarrelTurn; - super.Tick(dt); - if(FireMode[0].IsFiring()){ BarrelSpeed = BarrelSpeed + FClamp(DesiredSpeed - BarrelSpeed, -0.20 * dt, 0.40 * dt); BarrelTurn += int(BarrelSpeed * float(655360) * dt); - } - else{ if(BarrelSpeed > 0){ BarrelSpeed = FMax(BarrelSpeed - 0.10 * dt, 0.01); OldBarrelTurn = float(BarrelTurn); BarrelTurn += int(BarrelSpeed * float(655360) * dt); if(BarrelSpeed <= 0.03 && (int(OldBarrelTurn / 10922.67) < int(float(BarrelTurn) / 10922.67))){ BarrelTurn = int(float(int(float(BarrelTurn) / 10922.67)) * 10922.67); BarrelSpeed = 0.00; PlaySound(BarrelStopSound, SLOT_none, 0.50,, 32.00, 1.00, true); AmbientSound = none; } } - } - if(BarrelSpeed > 0){ AmbientSound = BarrelSpinSound; SoundPitch = byte(float(32) + float(96) * BarrelSpeed); - } - - if(NiceXMV850Attachment(ThirdPersonActor) != none) NiceXMV850Attachment(ThirdPersonActor).BarrelSpeed = BarrelSpeed; -} -simulated function AltFire(float F){ - ToggleLaser(); -} -simulated function ToggleLaser(){ - if(!Instigator.IsLocallyControlled()) return; - // Will redo this bit later, but so far it'll have to do - if(LaserType == 0) LaserType = 3; - else LaserType = 0; - ApplyLaserState(); -} -defaultproperties -{ BarrelSpinSoundRef="HMG_S.XMV.XMV-BarrelSpinLoop" BarrelStopSoundRef="HMG_S.XMV.XMV-BarrelSpinEnd" BarrelStartSoundRef="HMG_S.XMV.XMV-BarrelSpinStart" LaserAttachmentOffset=(X=120.000000,Z=-10.000000) LaserAttachmentBone="Muzzle" reloadPreEndFrame=0.201000 reloadEndFrame=0.729000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.340000 reloadChargeStartFrame=-1.000000 MagazineBone="BeltBone1" MagCapacity=160 ReloadRate=4.400000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload" Weight=7.000000 StandardDisplayFOV=55.000000 TraderInfoTexture=Texture'HMG_T.XMV.Trader_XMV850' MeshRef="HMG_A.XMV850Mesh" SkinRefs(0)="HMG_T.XMV.XMV850_Main" SkinRefs(1)="HMG_T.XMV.Hands_Shdr" SkinRefs(2)="HMG_T.XMV.XMV850_Barrels_Shdr" SelectSoundRef="HMG_S.XMV.XMV-Pullout" HudImageRef="HMG_T.XMV.XMV850_Unselected" SelectedHudImageRef="HMG_T.XMV.XMV850_Selected" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=20.000000 FireModeClass(0)=Class'NicePack.NiceXMV850Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="Putaway" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="Minigun with reduced fire rate down to 950RPM. But still badass and has laser sight." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=135 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=7 PickupClass=Class'NicePack.NiceXMV850Pickup' PlayerViewOffset=(X=30.000000,Y=20.000000,Z=-10.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceXMV850Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="XMV850 Minigun" TransientSoundVolume=0.625000 +class NiceXMV850M extends NiceHeavyGun; +var float DesiredSpeed; +var float BarrelSpeed; +var int BarrelTurn; +var Sound BarrelSpinSound, BarrelStopSound, BarrelStartSound; +var String BarrelSpinSoundRef, BarrelStopSoundRef, BarrelStartSoundRef; +static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount){ + local NiceXMV850M W; + super.PreloadAssets(Inv, bSkipRefCount); + if(default.BarrelSpinSound == none && default.BarrelSpinSoundRef != "") + default.BarrelSpinSound = sound(DynamicLoadObject(default.BarrelSpinSoundRef, class'sound', true)); + if(default.BarrelStopSound == none && default.BarrelStopSoundRef != "") + default.BarrelStopSound = sound(DynamicLoadObject(default.BarrelStopSoundRef, class'sound', true)); + if(default.BarrelStartSound == none && default.BarrelStartSoundRef != "") + default.BarrelStartSound = sound(DynamicLoadObject(default.BarrelStartSoundRef, class'sound', true)); + W = NiceXMV850M(Inv); + if(W != none){ + W.BarrelSpinSound = default.BarrelSpinSound; + W.BarrelStopSound = default.BarrelStopSound; + W.BarrelStartSound = default.BarrelStartSound; + } +} +static function bool UnloadAssets(){ + if(super.UnloadAssets()){ + default.BarrelSpinSound = none; + default.BarrelStopSound = none; + default.BarrelStartSound = none; + } + return true; +} +// XMV uses custom hands +simulated function HandleSleeveSwapping(){} +simulated event WeaponTick(float dt){ + local Rotator bt; + super.WeaponTick(dt); + bt.Roll = BarrelTurn; + SetBoneRotation('Barrels', bt); + DesiredSpeed = 0.50; +} +simulated event Tick(float dt){ + local float OldBarrelTurn; + super.Tick(dt); + if(FireMode[0].IsFiring()){ + BarrelSpeed = BarrelSpeed + FClamp(DesiredSpeed - BarrelSpeed, -0.20 * dt, 0.40 * dt); + BarrelTurn += int(BarrelSpeed * float(655360) * dt); + } + else{ + if(BarrelSpeed > 0){ + BarrelSpeed = FMax(BarrelSpeed - 0.10 * dt, 0.01); + OldBarrelTurn = float(BarrelTurn); + BarrelTurn += int(BarrelSpeed * float(655360) * dt); + if(BarrelSpeed <= 0.03 && (int(OldBarrelTurn / 10922.67) < int(float(BarrelTurn) / 10922.67))){ + BarrelTurn = int(float(int(float(BarrelTurn) / 10922.67)) * 10922.67); + BarrelSpeed = 0.00; + PlaySound(BarrelStopSound, SLOT_none, 0.50,, 32.00, 1.00, true); + AmbientSound = none; + } + } + } + if(BarrelSpeed > 0){ + AmbientSound = BarrelSpinSound; + SoundPitch = byte(float(32) + float(96) * BarrelSpeed); + } + + if(NiceXMV850Attachment(ThirdPersonActor) != none) + NiceXMV850Attachment(ThirdPersonActor).BarrelSpeed = BarrelSpeed; +} +simulated function AltFire(float F){ + ToggleLaser(); +} +simulated function ToggleLaser(){ + if(!Instigator.IsLocallyControlled()) + return; + // Will redo this bit later, but so far it'll have to do + if(LaserType == 0) + LaserType = 3; + else + LaserType = 0; + ApplyLaserState(); +} +defaultproperties +{ + BarrelSpinSoundRef="HMG_S.XMV.XMV-BarrelSpinLoop" + BarrelStopSoundRef="HMG_S.XMV.XMV-BarrelSpinEnd" + BarrelStartSoundRef="HMG_S.XMV.XMV-BarrelSpinStart" + LaserAttachmentOffset=(X=120.000000,Z=-10.000000) + LaserAttachmentBone="Muzzle" + reloadPreEndFrame=0.201000 + reloadEndFrame=0.729000 + reloadChargeEndFrame=-1.000000 + reloadMagStartFrame=0.340000 + reloadChargeStartFrame=-1.000000 + MagazineBone="BeltBone1" + MagCapacity=160 + ReloadRate=4.400000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload" + Weight=7.000000 + StandardDisplayFOV=55.000000 + TraderInfoTexture=Texture'HMG_T.XMV.Trader_XMV850' + MeshRef="HMG_A.XMV850Mesh" + SkinRefs(0)="HMG_T.XMV.XMV850_Main" + SkinRefs(1)="HMG_T.XMV.Hands_Shdr" + SkinRefs(2)="HMG_T.XMV.XMV850_Barrels_Shdr" + SelectSoundRef="HMG_S.XMV.XMV-Pullout" + HudImageRef="HMG_T.XMV.XMV850_Unselected" + SelectedHudImageRef="HMG_T.XMV.XMV850_Selected" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=20.000000 + FireModeClass(0)=Class'NicePack.NiceXMV850Fire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="Putaway" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="Minigun with reduced fire rate down to 950RPM. But still badass and has laser sight." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=55.000000 + Priority=135 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=3 + GroupOffset=7 + PickupClass=Class'NicePack.NiceXMV850Pickup' + PlayerViewOffset=(X=30.000000,Y=20.000000,Z=-10.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceXMV850Attachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="XMV850 Minigun" + TransientSoundVolume=0.625000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Pickup.uc b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Pickup.uc index 08ec2b5..c3616f5 100644 --- a/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Pickup.uc +++ b/sources/Weapons/Playable/Heavy/XMV/NiceXMV850Pickup.uc @@ -1,9 +1,30 @@ -class NiceXMV850Pickup extends NiceWeaponPickup; - -#EXEC OBJ LOAD FILE=HMG_T.utx -#EXEC OBJ LOAD FILE=HMG_S.uax -#EXEC OBJ LOAD FILE=HMG_A.ukx - -defaultproperties -{ Weight=7.000000 cost=1000 AmmoCost=100 BuyClipSize=80 PowerValue=40 SpeedValue=100 RangeValue=50 Description="Minigun with reduced fire rate down to 950RPM. But still badass and has laser sight." ItemName="XMV850 Minigun" ItemShortName="XMV850 Minigun" AmmoItemName="7.62x51mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=1 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceXMV850M' PickupMessage="You got the XMV850 Minigun." PickupSound=Sound'HMG_S.XMV.XMV-Pullout' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'HMG_A.XMV850Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +class NiceXMV850Pickup extends NiceWeaponPickup; + +#EXEC OBJ LOAD FILE=HMG_T.utx +#EXEC OBJ LOAD FILE=HMG_S.uax +#EXEC OBJ LOAD FILE=HMG_A.ukx + +defaultproperties +{ + Weight=7.000000 + cost=1000 + AmmoCost=100 + BuyClipSize=80 + PowerValue=40 + SpeedValue=100 + RangeValue=50 + Description="Minigun with reduced fire rate down to 950RPM. But still badass and has laser sight." + ItemName="XMV850 Minigun" + ItemShortName="XMV850 Minigun" + AmmoItemName="7.62x51mm Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=1 + EquipmentCategoryID=3 + InventoryType=Class'NicePack.NiceXMV850M' + PickupMessage="You got the XMV850 Minigun." + PickupSound=Sound'HMG_S.XMV.XMV-Pullout' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'HMG_A.XMV850Pickup' + CollisionRadius=25.000000 + CollisionHeight=5.000000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceDamTypeFT.uc b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceDamTypeFT.uc index c7f0641..8380434 100644 --- a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceDamTypeFT.uc +++ b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceDamTypeFT.uc @@ -1,5 +1,7 @@ -class NiceDamTypeFT extends NiceDamTypeFire - abstract; -defaultproperties -{ WeaponClass=Class'NicePack.NiceFlameThrower' DeathString="%k incinerated %o (Flamethrower)." -} +class NiceDamTypeFT extends NiceDamTypeFire + abstract; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceFlameThrower' + DeathString="%k incinerated %o (Flamethrower)." +} diff --git a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameAmmo.uc b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameAmmo.uc index 93accc4..ccb9820 100644 --- a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameAmmo.uc +++ b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameAmmo.uc @@ -1,4 +1,7 @@ -class NiceFlameAmmo extends ScrnFlameAmmo; -defaultproperties -{ AmmoPickupAmount=30 MaxAmmo=200 InitialAmount=60 -} +class NiceFlameAmmo extends ScrnFlameAmmo; +defaultproperties +{ + AmmoPickupAmount=30 + MaxAmmo=200 + InitialAmount=60 +} diff --git a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameBurstFire.uc b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameBurstFire.uc index 22a3bed..98a1bc3 100644 --- a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameBurstFire.uc +++ b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameBurstFire.uc @@ -1,6 +1,8 @@ -// -//============================================================================= -class NiceFlameBurstFire extends ScrnFlameBurstFire ; -defaultproperties -{ AmmoClass=Class'NicePack.NiceFlameAmmo' ProjectileClass=Class'NicePack.NiceFlameTendril' -} +// +//============================================================================= +class NiceFlameBurstFire extends ScrnFlameBurstFire ; +defaultproperties +{ + AmmoClass=Class'NicePack.NiceFlameAmmo' + ProjectileClass=Class'NicePack.NiceFlameTendril' +} diff --git a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameNade.uc b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameNade.uc index cf56f5b..0dd6ea2 100644 --- a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameNade.uc +++ b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameNade.uc @@ -1,48 +1,114 @@ -class NiceFlameNade extends NiceNade; -#exec OBJ LOAD FILE=KF_GrenadeSnd.uax -simulated function HurtRadius(float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation){ - local actor Victims; - local float damageScale, dist; - local vector dirs; - local int NumKilled; - local KFMonster KFMonsterVictim; - local Pawn P; - local KFPawn KFP; - local array CheckedPawns; - local int i; - local bool bAlreadyChecked; - if(bHurtEntry) return; - bHurtEntry = true; - foreach CollidingActors(class 'Actor', Victims, DamageRadius, HitLocation){ // null pawn variables here just to be sure they didn't left from previous iteration // and waste another day of my life to looking for this fucking bug -- PooSH /totallyPissedOff!!! P = none; KFMonsterVictim = none; KFP = none; // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if((Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') && ExtendedZCollision(Victims) == none ){ dirs = Victims.Location - HitLocation; dist = FMax(1,VSize(dirs)); dirs = dirs/dist; damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); if(Instigator == none || Instigator.Controller == none) Victims.SetDelayedDamageInstigatorController(InstigatorController); if(Victims == LastTouched) LastTouched = none; - P = Pawn(Victims); - if(P != none){ for(i = 0; i < CheckedPawns.Length; i++){ if(CheckedPawns[i] == P){ bAlreadyChecked = true; break; } } - if(bAlreadyChecked){ bAlreadyChecked = false; P = none; continue; } - KFMonsterVictim = KFMonster(Victims); - if(KFMonsterVictim != none && KFMonsterVictim.Health <= 0) KFMonsterVictim = none; - KFP = KFPawn(Victims); - if(KFMonsterVictim != none ) damageScale *= KFMonsterVictim.GetExposureTo(HitLocation); else if(KFP != none) damageScale *= KFP.GetExposureTo(HitLocation); - CheckedPawns[CheckedPawns.Length] = P; - if(damageScale <= 0){ P = none; continue; } else P = none; } - if(KFP != none || KFMonsterVictim != none || Nade(Victims) != none) Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, (damageScale * Momentum * dirs), DamageType ); - if(Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0) NumKilled++; } - } - if(Role == ROLE_Authority){ if(NumKilled >= 4) KFGameType(Level.Game).DramaticEvent(0.05); else if(NumKilled >= 2) KFGameType(Level.Game).DramaticEvent(0.03); - } - bHurtEntry = false; -} -simulated function Explode(vector HitLocation, vector HitNormal){ - local PlayerController LocalPlayer; - bHasExploded = True; - BlowUp(HitLocation); - // Incendiary Effects.. - PlaySound(sound'KF_GrenadeSnd.FlameNade_Explode',, 100.5 * TransientSoundVolume); - if(EffectIsRelevant(Location, false)){ Spawn(Class'KFIncendiaryExplosion',,, HitLocation, rotator(vect(0,0,1))); Spawn(ExplosionDecal,self,,HitLocation, rotator(-HitNormal)); - } - // Shake nearby players screens - LocalPlayer = Level.GetLocalPlayerController(); - if((LocalPlayer != none) && (VSize(Location - LocalPlayer.ViewTarget.Location) < (DamageRadius * 1.5))) LocalPlayer.ShakeView(RotMag, RotRate, RotTime, OffsetMag, OffsetRate, OffsetTime); - Destroy(); -} -defaultproperties -{ AvoidMarkerClass=Class'NicePack.NiceAvoidMarkerFlame' MyDamageType=Class'NicePack.NiceDamTypeFlameNade' -} +class NiceFlameNade extends NiceNade; +#exec OBJ LOAD FILE=KF_GrenadeSnd.uax +simulated function HurtRadius(float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation){ + local actor Victims; + local float damageScale, dist; + local vector dirs; + local int NumKilled; + local KFMonster KFMonsterVictim; + local Pawn P; + local KFPawn KFP; + local array CheckedPawns; + local int i; + local bool bAlreadyChecked; + if(bHurtEntry) + return; + bHurtEntry = true; + foreach CollidingActors(class 'Actor', Victims, DamageRadius, HitLocation){ + // null pawn variables here just to be sure they didn't left from previous iteration + // and waste another day of my life to looking for this fucking bug -- PooSH /totallyPissedOff!!! + P = none; + KFMonsterVictim = none; + KFP = none; + // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag + if((Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') && ExtendedZCollision(Victims) == none ){ + dirs = Victims.Location - HitLocation; + dist = FMax(1,VSize(dirs)); + dirs = dirs/dist; + damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); + if(Instigator == none || Instigator.Controller == none) + Victims.SetDelayedDamageInstigatorController(InstigatorController); + if(Victims == LastTouched) + LastTouched = none; + + P = Pawn(Victims); + + if(P != none){ + for(i = 0; i < CheckedPawns.Length; i++){ + if(CheckedPawns[i] == P){ + bAlreadyChecked = true; + break; + } + } + + if(bAlreadyChecked){ + bAlreadyChecked = false; + P = none; + continue; + } + + KFMonsterVictim = KFMonster(Victims); + + if(KFMonsterVictim != none && KFMonsterVictim.Health <= 0) + KFMonsterVictim = none; + + KFP = KFPawn(Victims); + + if(KFMonsterVictim != none ) + damageScale *= KFMonsterVictim.GetExposureTo(HitLocation); + else if(KFP != none) + damageScale *= KFP.GetExposureTo(HitLocation); + + CheckedPawns[CheckedPawns.Length] = P; + + if(damageScale <= 0){ + P = none; + continue; + } + else + P = none; + } + + if(KFP != none || KFMonsterVictim != none || Nade(Victims) != none) + Victims.TakeDamage + ( + damageScale * DamageAmount, + Instigator, + Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, + (damageScale * Momentum * dirs), + DamageType + ); + + if(Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0) + NumKilled++; + } + } + if(Role == ROLE_Authority){ + if(NumKilled >= 4) + KFGameType(Level.Game).DramaticEvent(0.05); + else if(NumKilled >= 2) + KFGameType(Level.Game).DramaticEvent(0.03); + } + bHurtEntry = false; +} +simulated function Explode(vector HitLocation, vector HitNormal){ + local PlayerController LocalPlayer; + bHasExploded = True; + BlowUp(HitLocation); + // Incendiary Effects.. + PlaySound(sound'KF_GrenadeSnd.FlameNade_Explode',, 100.5 * TransientSoundVolume); + if(EffectIsRelevant(Location, false)){ + Spawn(Class'KFIncendiaryExplosion',,, HitLocation, rotator(vect(0,0,1))); + Spawn(ExplosionDecal,self,,HitLocation, rotator(-HitNormal)); + } + // Shake nearby players screens + LocalPlayer = Level.GetLocalPlayerController(); + if((LocalPlayer != none) && (VSize(Location - LocalPlayer.ViewTarget.Location) < (DamageRadius * 1.5))) + LocalPlayer.ShakeView(RotMag, RotRate, RotTime, OffsetMag, OffsetRate, OffsetTime); + Destroy(); +} +defaultproperties +{ + AvoidMarkerClass=Class'NicePack.NiceAvoidMarkerFlame' + MyDamageType=Class'NicePack.NiceDamTypeFlameNade' +} diff --git a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameTendril.uc b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameTendril.uc index 5acc7a9..3fbefec 100644 --- a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameTendril.uc +++ b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameTendril.uc @@ -1,28 +1,76 @@ -//============================================================================= -// Flame -//============================================================================= -class NiceFlameTendril extends ScrnFlameTendril; -simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) -{ - local actor Victims; - local float damageScale, dist; - local vector dir; - local KFMonster KFMonsterVictim; - - if ( bHurtEntry ) return; - bHurtEntry = true; - foreach VisibleCollidingActors( class 'Actor', Victims, DamageRadius, HitLocation ) - { KFMonsterVictim = none; //tbs // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') ) { dir = Victims.Location - HitLocation; dist = FMax(1,VSize(dir)); dir = dir/dist; damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); if ( Instigator == none || Instigator.Controller == none ) Victims.SetDelayedDamageInstigatorController( InstigatorController ); if ( Victims == LastTouched ) LastTouched = none; KFMonsterVictim = KFMonster(Victims); - if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { KFMonsterVictim = none; } Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, (damageScale * Momentum * dir), DamageType ); if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); - } - } - /* - if ( (LastTouched != none) && (LastTouched != self) && (LastTouched.Role == ROLE_Authority) && !LastTouched.IsA('FluidSurfaceInfo') ) - { Victims = LastTouched; LastTouched = none; dir = Victims.Location - HitLocation; dist = FMax(1,VSize(dir)); dir = dir/dist; damageScale = FMax(Victims.CollisionRadius/(Victims.CollisionRadius + Victims.CollisionHeight),1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius)); if ( Instigator == none || Instigator.Controller == none ) Victims.SetDelayedDamageInstigatorController(InstigatorController); Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, (damageScale * Momentum * dir), DamageType ); if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); - } - */ - bHurtEntry = false; -} -defaultproperties -{ Damage=16.000000 MyDamageType=Class'NicePack.NiceDamTypeFT' -} +//============================================================================= +// Flame +//============================================================================= +class NiceFlameTendril extends ScrnFlameTendril; +simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) +{ + local actor Victims; + local float damageScale, dist; + local vector dir; + local KFMonster KFMonsterVictim; + + if ( bHurtEntry ) + return; + bHurtEntry = true; + foreach VisibleCollidingActors( class 'Actor', Victims, DamageRadius, HitLocation ) + { + KFMonsterVictim = none; //tbs + // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag + if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') ) + { + dir = Victims.Location - HitLocation; + dist = FMax(1,VSize(dir)); + dir = dir/dist; + damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); + if ( Instigator == none || Instigator.Controller == none ) + Victims.SetDelayedDamageInstigatorController( InstigatorController ); + if ( Victims == LastTouched ) + LastTouched = none; + KFMonsterVictim = KFMonster(Victims); + + if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) + { + KFMonsterVictim = none; + } Victims.TakeDamage + ( + damageScale * DamageAmount, + Instigator, + Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, + (damageScale * Momentum * dir), + DamageType + ); + if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) + Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); + + } + } + /* + if ( (LastTouched != none) && (LastTouched != self) && (LastTouched.Role == ROLE_Authority) && !LastTouched.IsA('FluidSurfaceInfo') ) + { + Victims = LastTouched; + LastTouched = none; + dir = Victims.Location - HitLocation; + dist = FMax(1,VSize(dir)); + dir = dir/dist; + damageScale = FMax(Victims.CollisionRadius/(Victims.CollisionRadius + Victims.CollisionHeight),1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius)); + if ( Instigator == none || Instigator.Controller == none ) + Victims.SetDelayedDamageInstigatorController(InstigatorController); + Victims.TakeDamage + ( + damageScale * DamageAmount, + Instigator, + Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, + (damageScale * Momentum * dir), + DamageType + ); + if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) + Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); + } + */ + bHurtEntry = false; +} +defaultproperties +{ + Damage=16.000000 + MyDamageType=Class'NicePack.NiceDamTypeFT' +} diff --git a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameThrower.uc b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameThrower.uc index 9a293ab..df40b2b 100644 --- a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameThrower.uc +++ b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameThrower.uc @@ -1,41 +1,51 @@ -//============================================================================= -// FlameChucker -//============================================================================= -class NiceFlameThrower extends ScrnFlameThrower; -var bool bFiring; -simulated function bool StartFire(int Mode) -{ - if(MagAmmoRemaining >= 1 && FireMode[Mode].AllowFire()) - bFiring = true; - return Super.StartFire(Mode); -} -simulated event StopFire(int Mode) -{ - if(MagAmmoRemaining < 1 || Mode != 0){ - bFiring = false; - Super.StopFire(0); - } -} -simulated function bool PutDown() -{ - if ( bFiring && Instigator != none && Instigator.PendingWeapon != none && AmmoAmount(0) > 0 ) { Instigator.PendingWeapon = none; return false; - } - return Super.PutDown(); -} -function bool AllowReload() -{ - if ( bFiring ) return false; return Super.AllowReload(); -} -simulated function WeaponTick(float dt) -{ - if(MagAmmoRemaining < 1 && bFiring) - StartFire(0); - Super.WeaponTick(dt); -// if(FireMode[0].bIsFiring) -// Skins[4] = Shader 'KillingFloorWeapons.FlameThrower.FTFireShader'; -// else -// Skins[4] = default.Skins[4]; -} -defaultproperties -{ MagCapacity=30 Weight=8.000000 bModeZeroCanDryFire=False FireModeClass(0)=Class'NicePack.NiceFlameBurstFire' PickupClass=Class'NicePack.NiceFlameThrowerPickup' ItemName="FlameThrower NW" -} +//============================================================================= +// FlameChucker +//============================================================================= +class NiceFlameThrower extends ScrnFlameThrower; +var bool bFiring; +simulated function bool StartFire(int Mode) +{ + if(MagAmmoRemaining >= 1 && FireMode[Mode].AllowFire()) + bFiring = true; + return Super.StartFire(Mode); +} +simulated event StopFire(int Mode) +{ + if(MagAmmoRemaining < 1 || Mode != 0){ + bFiring = false; + Super.StopFire(0); + } +} +simulated function bool PutDown() +{ + if ( bFiring && Instigator != none && Instigator.PendingWeapon != none && AmmoAmount(0) > 0 ) { + Instigator.PendingWeapon = none; + return false; + } + return Super.PutDown(); +} +function bool AllowReload() +{ + if ( bFiring ) + return false; + return Super.AllowReload(); +} +simulated function WeaponTick(float dt) +{ + if(MagAmmoRemaining < 1 && bFiring) + StartFire(0); + Super.WeaponTick(dt); +// if(FireMode[0].bIsFiring) +// Skins[4] = Shader 'KillingFloorWeapons.FlameThrower.FTFireShader'; +// else +// Skins[4] = default.Skins[4]; +} +defaultproperties +{ + MagCapacity=30 + Weight=8.000000 + bModeZeroCanDryFire=False + FireModeClass(0)=Class'NicePack.NiceFlameBurstFire' + PickupClass=Class'NicePack.NiceFlameThrowerPickup' + ItemName="FlameThrower NW" +} diff --git a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameThrowerPickup.uc b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameThrowerPickup.uc index 52e6e1d..1abadb8 100644 --- a/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameThrowerPickup.uc +++ b/sources/Weapons/Playable/Incendiary/Flamethrower/NiceFlameThrowerPickup.uc @@ -1,7 +1,11 @@ -//============================================================================= -// L85 Pickup. -//============================================================================= -class NiceFlameThrowerPickup extends ScrnFlameThrowerPickup; -defaultproperties -{ ItemName="FlameThrower NW" ItemShortName="Flamer NW" InventoryType=Class'NicePack.NiceFlameThrower' PickupMessage="You got the Flamethrower NW." -} +//============================================================================= +// L85 Pickup. +//============================================================================= +class NiceFlameThrowerPickup extends ScrnFlameThrowerPickup; +defaultproperties +{ + ItemName="FlameThrower NW" + ItemShortName="Flamer NW" + InventoryType=Class'NicePack.NiceFlameThrower' + PickupMessage="You got the Flamethrower NW." +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDamTypeFlareProjectileFire.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDamTypeFlareProjectileFire.uc index 4be3466..6231ea9 100644 --- a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDamTypeFlareProjectileFire.uc +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDamTypeFlareProjectileFire.uc @@ -1,4 +1,6 @@ -class NiceDamTypeFlareProjectileFire extends NiceDamTypeFire; -defaultproperties -{ HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceFlareRevolver' -} +class NiceDamTypeFlareProjectileFire extends NiceDamTypeFire; +defaultproperties +{ + HeadShotDamageMult=2.000000 + WeaponClass=Class'NicePack.NiceFlareRevolver' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolver.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolver.uc index 332c97a..a41e861 100644 --- a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolver.uc +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolver.uc @@ -1,42 +1,76 @@ -class NiceDualFlareRevolver extends ScrnDualFlareRevolver; -function bool HandlePickupQuery( pickup Item ) -{ - if ( Item.InventoryType==Class'NicePack.NiceFlareRevolver' ) - { if( LastHasGunMsgTime < Level.TimeSeconds && PlayerController(Instigator.Controller) != none ) { LastHasGunMsgTime = Level.TimeSeconds + 0.5; PlayerController(Instigator.Controller).ReceiveLocalizedMessage(Class'KFMainMessages', 1); } - return True; - } - return Super.HandlePickupQuery(Item); -} -function DropFrom(vector StartLocation) -{ - local int m; - local KFWeaponPickup Pickup; - local int AmmoThrown, OtherAmmo; - local KFWeapon SinglePistol; - if( !bCanThrow ) return; - AmmoThrown = AmmoAmount(0); - ClientWeaponThrown(); - for (m = 0; m < NUM_FIRE_MODES; m++) - { if (FireMode[m].bIsFiring) StopFire(m); - } - if ( Instigator != none ) DetachFromPawn(Instigator); - if( Instigator.Health > 0 ) - { OtherAmmo = AmmoThrown / 2; AmmoThrown -= OtherAmmo; SinglePistol = Spawn(Class'NicePack.NiceFlareRevolver'); SinglePistol.SellValue = SellValue / 2; SinglePistol.GiveTo(Instigator); SinglePistol.Ammo[0].AmmoAmount = OtherAmmo; SinglePistol.MagAmmoRemaining = MagAmmoRemaining / 2; MagAmmoRemaining = Max(MagAmmoRemaining-SinglePistol.MagAmmoRemaining,0); - } - Pickup = Spawn(class'NicePack.NiceFlareRevolverPickup',,, StartLocation); - if ( Pickup != none ) - { Pickup.InitDroppedPickupFor(self); Pickup.DroppedBy = PlayerController(Instigator.Controller); Pickup.Velocity = Velocity; //fixing dropping exploit Pickup.SellValue = SellValue / 2; Pickup.Cost = Pickup.SellValue / 0.75; Pickup.AmmoAmount[0] = AmmoThrown; Pickup.MagAmmoRemaining = MagAmmoRemaining; if (Instigator.Health > 0) Pickup.bThrown = true; - } - Destroyed(); - Destroy(); -} -simulated function bool PutDown() -{ - if ( Instigator.PendingWeapon == none || Instigator.PendingWeapon.class == class'NicePack.NiceFlareRevolver' ) - { bIsReloading = false; - } - return super.PutDown(); -} -defaultproperties -{ AppID=0 FireModeClass(0)=Class'NicePack.NiceDualFlareRevolverFire' DemoReplacement=Class'NicePack.NiceFlareRevolver' PickupClass=Class'NicePack.NiceDualFlareRevolverPickup' ItemName="Dual Flare revolvers NW" -} +class NiceDualFlareRevolver extends ScrnDualFlareRevolver; +function bool HandlePickupQuery( pickup Item ) +{ + if ( Item.InventoryType==Class'NicePack.NiceFlareRevolver' ) + { + if( LastHasGunMsgTime < Level.TimeSeconds && PlayerController(Instigator.Controller) != none ) + { + LastHasGunMsgTime = Level.TimeSeconds + 0.5; + PlayerController(Instigator.Controller).ReceiveLocalizedMessage(Class'KFMainMessages', 1); + } + + return True; + } + return Super.HandlePickupQuery(Item); +} +function DropFrom(vector StartLocation) +{ + local int m; + local KFWeaponPickup Pickup; + local int AmmoThrown, OtherAmmo; + local KFWeapon SinglePistol; + if( !bCanThrow ) + return; + AmmoThrown = AmmoAmount(0); + ClientWeaponThrown(); + for (m = 0; m < NUM_FIRE_MODES; m++) + { + if (FireMode[m].bIsFiring) + StopFire(m); + } + if ( Instigator != none ) + DetachFromPawn(Instigator); + if( Instigator.Health > 0 ) + { + OtherAmmo = AmmoThrown / 2; + AmmoThrown -= OtherAmmo; + SinglePistol = Spawn(Class'NicePack.NiceFlareRevolver'); + SinglePistol.SellValue = SellValue / 2; + SinglePistol.GiveTo(Instigator); + SinglePistol.Ammo[0].AmmoAmount = OtherAmmo; + SinglePistol.MagAmmoRemaining = MagAmmoRemaining / 2; + MagAmmoRemaining = Max(MagAmmoRemaining-SinglePistol.MagAmmoRemaining,0); + } + Pickup = Spawn(class'NicePack.NiceFlareRevolverPickup',,, StartLocation); + if ( Pickup != none ) + { + Pickup.InitDroppedPickupFor(self); + Pickup.DroppedBy = PlayerController(Instigator.Controller); + Pickup.Velocity = Velocity; + //fixing dropping exploit + Pickup.SellValue = SellValue / 2; + Pickup.Cost = Pickup.SellValue / 0.75; + Pickup.AmmoAmount[0] = AmmoThrown; + Pickup.MagAmmoRemaining = MagAmmoRemaining; + if (Instigator.Health > 0) + Pickup.bThrown = true; + } + Destroyed(); + Destroy(); +} +simulated function bool PutDown() +{ + if ( Instigator.PendingWeapon == none || Instigator.PendingWeapon.class == class'NicePack.NiceFlareRevolver' ) + { + bIsReloading = false; + } + return super.PutDown(); +} +defaultproperties +{ + AppID=0 + FireModeClass(0)=Class'NicePack.NiceDualFlareRevolverFire' + DemoReplacement=Class'NicePack.NiceFlareRevolver' + PickupClass=Class'NicePack.NiceDualFlareRevolverPickup' + ItemName="Dual Flare revolvers NW" +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverAmmo.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverAmmo.uc index 55147e2..98e5053 100644 --- a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverAmmo.uc +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverAmmo.uc @@ -1,4 +1,5 @@ -class NiceDualFlareRevolverAmmo extends ScrnDualFlareRevolverAmmo; -defaultproperties -{ PickupClass=Class'NicePack.NiceDualFlareRevolverAmmoPickup' -} +class NiceDualFlareRevolverAmmo extends ScrnDualFlareRevolverAmmo; +defaultproperties +{ + PickupClass=Class'NicePack.NiceDualFlareRevolverAmmoPickup' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverAmmoPickup.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverAmmoPickup.uc index 5f66301..474fc6a 100644 --- a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverAmmoPickup.uc +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverAmmoPickup.uc @@ -1,4 +1,5 @@ -class NiceDualFlareRevolverAmmoPickup extends ScrnDualFlareRevolverAmmoPickup; -defaultproperties -{ InventoryType=Class'NicePack.NiceDualFlareRevolverAmmo' -} +class NiceDualFlareRevolverAmmoPickup extends ScrnDualFlareRevolverAmmoPickup; +defaultproperties +{ + InventoryType=Class'NicePack.NiceDualFlareRevolverAmmo' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverFire.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverFire.uc index 4e77c66..6be42be 100644 --- a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverFire.uc +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverFire.uc @@ -1,4 +1,6 @@ -class NiceDualFlareRevolverFire extends ScrnDualFlareRevolverFire; -defaultproperties -{ AmmoClass=Class'NicePack.NiceDualFlareRevolverAmmo' ProjectileClass=Class'NicePack.NiceFlareRevolverProjectile' -} +class NiceDualFlareRevolverFire extends ScrnDualFlareRevolverFire; +defaultproperties +{ + AmmoClass=Class'NicePack.NiceDualFlareRevolverAmmo' + ProjectileClass=Class'NicePack.NiceFlareRevolverProjectile' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverPickup.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverPickup.uc index 9eddb6c..2c5be18 100644 --- a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverPickup.uc +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceDualFlareRevolverPickup.uc @@ -1,4 +1,7 @@ -class NiceDualFlareRevolverPickup extends ScrnDualFlareRevolverPickup; -defaultproperties -{ ItemName="Dual Flare Revolvers NW" ItemShortName="Dual Flare Rev. NW" InventoryType=Class'NicePack.NiceDualFlareRevolver' -} +class NiceDualFlareRevolverPickup extends ScrnDualFlareRevolverPickup; +defaultproperties +{ + ItemName="Dual Flare Revolvers NW" + ItemShortName="Dual Flare Rev. NW" + InventoryType=Class'NicePack.NiceDualFlareRevolver' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolver.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolver.uc index fc3de4f..d6056f0 100644 --- a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolver.uc +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolver.uc @@ -1,23 +1,30 @@ -class NiceFlareRevolver extends ScrnFlareRevolver; -simulated function bool PutDown() -{ - if ( Instigator.PendingWeapon.class == class'NicePack.NiceDualFlareRevolver' ) - { bIsReloading = false; - } - return super(KFWeapon).PutDown(); -} - -function GiveTo( pawn Other, optional Pickup Pickup ) -{ - local KFPlayerReplicationInfo KFPRI; - local KFWeaponPickup WeapPickup; - KFPRI = KFPlayerReplicationInfo(Other.PlayerReplicationInfo); - WeapPickup = KFWeaponPickup(Pickup); - //pick the lowest sell value - if ( WeapPickup != none && KFPRI != none && KFPRI.ClientVeteranSkill != none ) { SellValue = 0.75 * min(WeapPickup.Cost, WeapPickup.default.Cost * KFPRI.ClientVeteranSkill.static.GetCostScaling(KFPRI, WeapPickup.class)); - } - Super.GiveTo(Other,Pickup); -} -defaultproperties -{ AppID=0 FireModeClass(0)=Class'NicePack.NiceFlareRevolverFire' PickupClass=Class'NicePack.NiceFlareRevolverPickup' ItemName="Flare Revolver NW" -} +class NiceFlareRevolver extends ScrnFlareRevolver; +simulated function bool PutDown() +{ + if ( Instigator.PendingWeapon.class == class'NicePack.NiceDualFlareRevolver' ) + { + bIsReloading = false; + } + return super(KFWeapon).PutDown(); +} + +function GiveTo( pawn Other, optional Pickup Pickup ) +{ + local KFPlayerReplicationInfo KFPRI; + local KFWeaponPickup WeapPickup; + KFPRI = KFPlayerReplicationInfo(Other.PlayerReplicationInfo); + WeapPickup = KFWeaponPickup(Pickup); + //pick the lowest sell value + if ( WeapPickup != none && KFPRI != none && KFPRI.ClientVeteranSkill != none ) { + SellValue = 0.75 * min(WeapPickup.Cost, WeapPickup.default.Cost + * KFPRI.ClientVeteranSkill.static.GetCostScaling(KFPRI, WeapPickup.class)); + } + Super.GiveTo(Other,Pickup); +} +defaultproperties +{ + AppID=0 + FireModeClass(0)=Class'NicePack.NiceFlareRevolverFire' + PickupClass=Class'NicePack.NiceFlareRevolverPickup' + ItemName="Flare Revolver NW" +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverAmmo.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverAmmo.uc index 14efe61..fc04027 100644 --- a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverAmmo.uc +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverAmmo.uc @@ -1,4 +1,5 @@ -class NiceFlareRevolverAmmo extends ScrnFlareRevolverAmmo; -defaultproperties -{ PickupClass=Class'NicePack.NiceFlareRevolverAmmoPickup' -} +class NiceFlareRevolverAmmo extends ScrnFlareRevolverAmmo; +defaultproperties +{ + PickupClass=Class'NicePack.NiceFlareRevolverAmmoPickup' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverAmmoPickup.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverAmmoPickup.uc index f665755..7f7feea 100644 --- a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverAmmoPickup.uc +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverAmmoPickup.uc @@ -1,4 +1,5 @@ -class NiceFlareRevolverAmmoPickup extends ScrnFlareRevolverAmmoPickup; -defaultproperties -{ InventoryType=Class'NicePack.NiceFlareRevolverAmmo' -} +class NiceFlareRevolverAmmoPickup extends ScrnFlareRevolverAmmoPickup; +defaultproperties +{ + InventoryType=Class'NicePack.NiceFlareRevolverAmmo' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverFire.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverFire.uc index 57c690a..75c0133 100644 --- a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverFire.uc +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverFire.uc @@ -1,4 +1,6 @@ -class NiceFlareRevolverFire extends ScrnFlareRevolverFire; -defaultproperties -{ AmmoClass=Class'NicePack.NiceFlareRevolverAmmo' ProjectileClass=Class'NicePack.NiceFlareRevolverProjectile' -} +class NiceFlareRevolverFire extends ScrnFlareRevolverFire; +defaultproperties +{ + AmmoClass=Class'NicePack.NiceFlareRevolverAmmo' + ProjectileClass=Class'NicePack.NiceFlareRevolverProjectile' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverPickup.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverPickup.uc index 884bdc3..7722d63 100644 --- a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverPickup.uc +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverPickup.uc @@ -1,24 +1,64 @@ -class NiceFlareRevolverPickup extends ScrnFlareRevolverPickup; -function inventory SpawnCopy( pawn Other ) { - local Inventory CurInv; - local KFWeapon PistolInInventory; - For( CurInv=Other.Inventory; CurInv!=none; CurInv=CurInv.Inventory ) { PistolInInventory = KFWeapon(CurInv); if( PistolInInventory != none && PistolInInventory.class == default.InventoryType ) { // destroy the inventory to force parent SpawnCopy() to make a new instance of class // we specified below if( Inventory!=none ) Inventory.Destroy(); // spawn dual guns instead of another instance of single InventoryType = DualInventoryType; // Make dualies to cost twice of lowest value in case of PERKED+UNPERKED pistols SellValue = 2 * min(SellValue, PistolInInventory.SellValue); AmmoAmount[0]+= PistolInInventory.AmmoAmount(0); MagAmmoRemaining+= PistolInInventory.MagAmmoRemaining; CurInv.Destroyed(); CurInv.Destroy(); Return Super(KFWeaponPickup).SpawnCopy(Other); } - } - InventoryType = Default.InventoryType; - Return Super(KFWeaponPickup).SpawnCopy(Other); -} -function bool CheckCanCarry(KFHumanPawn Hm) { - local Inventory CurInv; - local bool bHasSinglePistol; - local float AddWeight; - AddWeight = class(default.InventoryType).default.Weight; - for ( CurInv = Hm.Inventory; CurInv != none; CurInv = CurInv.Inventory ) { if ( CurInv.class == default.DualInventoryType ) { //already have duals, can't carry a single if ( LastCantCarryTime < Level.TimeSeconds && PlayerController(Hm.Controller) != none ) { LastCantCarryTime = Level.TimeSeconds + 0.5; PlayerController(Hm.Controller).ReceiveLocalizedMessage(Class'KFMainMessages', 2); } return false; } else if ( CurInv.class == default.InventoryType ) { bHasSinglePistol = true; AddWeight = default.DualInventoryType.default.Weight - AddWeight; break; } - } - if ( !Hm.CanCarry(AddWeight) ) { if ( LastCantCarryTime < Level.TimeSeconds && PlayerController(Hm.Controller) != none ) { LastCantCarryTime = Level.TimeSeconds + 0.5; PlayerController(Hm.Controller).ReceiveLocalizedMessage(Class'KFMainMessages', 2); } - return false; - } - return true; -} -defaultproperties -{ DualInventoryType=Class'NicePack.NiceDualFlareRevolver' ItemName="Flare Revolver NW" ItemShortName="Flare Rev. NW" InventoryType=Class'NicePack.NiceFlareRevolver' -} +class NiceFlareRevolverPickup extends ScrnFlareRevolverPickup; +function inventory SpawnCopy( pawn Other ) { + local Inventory CurInv; + local KFWeapon PistolInInventory; + For( CurInv=Other.Inventory; CurInv!=none; CurInv=CurInv.Inventory ) { + PistolInInventory = KFWeapon(CurInv); + if( PistolInInventory != none && PistolInInventory.class == default.InventoryType ) { + // destroy the inventory to force parent SpawnCopy() to make a new instance of class + // we specified below + if( Inventory!=none ) + Inventory.Destroy(); + // spawn dual guns instead of another instance of single + InventoryType = DualInventoryType; + // Make dualies to cost twice of lowest value in case of PERKED+UNPERKED pistols + SellValue = 2 * min(SellValue, PistolInInventory.SellValue); + AmmoAmount[0]+= PistolInInventory.AmmoAmount(0); + MagAmmoRemaining+= PistolInInventory.MagAmmoRemaining; + CurInv.Destroyed(); + CurInv.Destroy(); + Return Super(KFWeaponPickup).SpawnCopy(Other); + } + } + InventoryType = Default.InventoryType; + Return Super(KFWeaponPickup).SpawnCopy(Other); +} +function bool CheckCanCarry(KFHumanPawn Hm) { + local Inventory CurInv; + local bool bHasSinglePistol; + local float AddWeight; + AddWeight = class(default.InventoryType).default.Weight; + for ( CurInv = Hm.Inventory; CurInv != none; CurInv = CurInv.Inventory ) { + if ( CurInv.class == default.DualInventoryType ) { + //already have duals, can't carry a single + if ( LastCantCarryTime < Level.TimeSeconds && PlayerController(Hm.Controller) != none ) + { + LastCantCarryTime = Level.TimeSeconds + 0.5; + PlayerController(Hm.Controller).ReceiveLocalizedMessage(Class'KFMainMessages', 2); + } + return false; + } + else if ( CurInv.class == default.InventoryType ) { + bHasSinglePistol = true; + AddWeight = default.DualInventoryType.default.Weight - AddWeight; + break; + } + } + if ( !Hm.CanCarry(AddWeight) ) { + if ( LastCantCarryTime < Level.TimeSeconds && PlayerController(Hm.Controller) != none ) + { + LastCantCarryTime = Level.TimeSeconds + 0.5; + PlayerController(Hm.Controller).ReceiveLocalizedMessage(Class'KFMainMessages', 2); + } + + return false; + } + return true; +} +defaultproperties +{ + DualInventoryType=Class'NicePack.NiceDualFlareRevolver' + ItemName="Flare Revolver NW" + ItemShortName="Flare Rev. NW" + InventoryType=Class'NicePack.NiceFlareRevolver' +} diff --git a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverProjectile.uc b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverProjectile.uc index 02e0633..aa0690d 100644 --- a/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverProjectile.uc +++ b/sources/Weapons/Playable/Incendiary/FlareRevolver/NiceFlareRevolverProjectile.uc @@ -1,43 +1,151 @@ -class NiceFlareRevolverProjectile extends ScrnFlareRevolverProjectile; -//overrided to use alternate burning mechanism -simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) -{ - local actor Victims; - local float damageScale, dist; - local vector dirs; - local int NumKilled; - local KFMonster KFMonsterVictim; - local Pawn P; - local KFPawn KFP; - local array CheckedPawns; - local int i; - local bool bAlreadyChecked; - if ( bHurtEntry ) return; - bHurtEntry = true; - foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) { // null pawn variables here just to be sure they didn't left from previous iteration // and waste another day of my life to looking for this fucking bug -- PooSH /totallyPissedOff!!! P = none; KFMonsterVictim = none; KFP = none; // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if( (Victims != self) && (Victims != Instigator) &&(Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') && ExtendedZCollision(Victims)==none && KFBulletWhipAttachment(Victims)==none ) { dirs = Victims.Location - HitLocation; dist = FMax(1,VSize(dirs)); dirs = dirs/dist; damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); if ( Instigator == none || Instigator.Controller == none ) Victims.SetDelayedDamageInstigatorController( InstigatorController ); if ( Victims == LastTouched ) LastTouched = none; - P = Pawn(Victims); - if( P != none ) { for (i = 0; i < CheckedPawns.Length; i++) { if (CheckedPawns[i] == P) { bAlreadyChecked = true; break; } } - if( bAlreadyChecked ) { bAlreadyChecked = false; P = none; continue; } - KFMonsterVictim = KFMonster(Victims); - if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { KFMonsterVictim = none; } - KFP = KFPawn(Victims); - if( KFMonsterVictim != none ) { damageScale *= KFMonsterVictim.GetExposureTo(HitLocation); } else if( KFP != none ) { damageScale *= KFP.GetExposureTo(HitLocation); } - CheckedPawns[CheckedPawns.Length] = P; - if ( damageScale <= 0) { P = none; continue; } else { P = none; } } - Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, (damageScale * Momentum * dirs), DamageType//Class'NicePack.NiceDamTypeFlareProjectileFire' ); if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType,//Class'NicePack.NiceDamTypeFlareProjectileFire', Momentum, HitLocation); - if( Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { NumKilled++; } } - } - /* - if ( (LastTouched != none) && (LastTouched != self) && (LastTouched != Instigator) && (LastTouched.Role == ROLE_Authority) && !LastTouched.IsA('FluidSurfaceInfo') ) - { Victims = LastTouched; LastTouched = none; dirs = Victims.Location - HitLocation; dist = FMax(1,VSize(dirs)); dirs = dirs/dist; damageScale = FMax(Victims.CollisionRadius/(Victims.CollisionRadius + Victims.CollisionHeight),1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius)); if ( Instigator == none || Instigator.Controller == none ) Victims.SetDelayedDamageInstigatorController(InstigatorController); - log("Part 2 Doing "$(damageScale * DamageAmount)$" damage to "$Victims); Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, (damageScale * Momentum * dirs), DamageType ); if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); - } - */ - if( Role == ROLE_Authority ) - { if( NumKilled >= 4 ) { KFGameType(Level.Game).DramaticEvent(0.05); } else if( NumKilled >= 2 ) { KFGameType(Level.Game).DramaticEvent(0.03); } - } - bHurtEntry = false; -} -defaultproperties -{ ImpactDamageType=Class'NicePack.NiceDamTypeFlareProjectileImpact' MyDamageType=Class'NicePack.NiceDamTypeFlareProjectileFire' -} +class NiceFlareRevolverProjectile extends ScrnFlareRevolverProjectile; +//overrided to use alternate burning mechanism +simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) +{ + local actor Victims; + local float damageScale, dist; + local vector dirs; + local int NumKilled; + local KFMonster KFMonsterVictim; + local Pawn P; + local KFPawn KFP; + local array CheckedPawns; + local int i; + local bool bAlreadyChecked; + if ( bHurtEntry ) + return; + bHurtEntry = true; + foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) { + // null pawn variables here just to be sure they didn't left from previous iteration + // and waste another day of my life to looking for this fucking bug -- PooSH /totallyPissedOff!!! + P = none; + KFMonsterVictim = none; + KFP = none; + // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag + if( (Victims != self) && (Victims != Instigator) &&(Hurtwall != Victims) + && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') + && ExtendedZCollision(Victims)==none && KFBulletWhipAttachment(Victims)==none ) + { + dirs = Victims.Location - HitLocation; + dist = FMax(1,VSize(dirs)); + dirs = dirs/dist; + damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); + if ( Instigator == none || Instigator.Controller == none ) + Victims.SetDelayedDamageInstigatorController( InstigatorController ); + if ( Victims == LastTouched ) + LastTouched = none; + + P = Pawn(Victims); + + if( P != none ) + { + for (i = 0; i < CheckedPawns.Length; i++) + { + if (CheckedPawns[i] == P) + { + bAlreadyChecked = true; + break; + } + } + + if( bAlreadyChecked ) + { + bAlreadyChecked = false; + P = none; + continue; + } + + KFMonsterVictim = KFMonster(Victims); + + if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) + { + KFMonsterVictim = none; + } + + KFP = KFPawn(Victims); + + if( KFMonsterVictim != none ) + { + damageScale *= KFMonsterVictim.GetExposureTo(HitLocation); + } + else if( KFP != none ) + { + damageScale *= KFP.GetExposureTo(HitLocation); + } + + CheckedPawns[CheckedPawns.Length] = P; + + if ( damageScale <= 0) + { + P = none; + continue; + } + else + { + P = none; + } + } + + Victims.TakeDamage + ( + damageScale * DamageAmount, + Instigator, + Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, + (damageScale * Momentum * dirs), + DamageType//Class'NicePack.NiceDamTypeFlareProjectileFire' + ); + if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) + Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, + DamageType,//Class'NicePack.NiceDamTypeFlareProjectileFire', + Momentum, HitLocation); + + if( Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) + { + NumKilled++; + } + } + } + /* + if ( (LastTouched != none) && (LastTouched != self) && (LastTouched != Instigator) && + (LastTouched.Role == ROLE_Authority) && !LastTouched.IsA('FluidSurfaceInfo') ) + { + Victims = LastTouched; + LastTouched = none; + dirs = Victims.Location - HitLocation; + dist = FMax(1,VSize(dirs)); + dirs = dirs/dist; + damageScale = FMax(Victims.CollisionRadius/(Victims.CollisionRadius + Victims.CollisionHeight),1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius)); + if ( Instigator == none || Instigator.Controller == none ) + Victims.SetDelayedDamageInstigatorController(InstigatorController); + + log("Part 2 Doing "$(damageScale * DamageAmount)$" damage to "$Victims); + Victims.TakeDamage + ( + damageScale * DamageAmount, + Instigator, + Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, + (damageScale * Momentum * dirs), + DamageType + ); + if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) + Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); + } + */ + if( Role == ROLE_Authority ) + { + if( NumKilled >= 4 ) + { + KFGameType(Level.Game).DramaticEvent(0.05); + } + else if( NumKilled >= 2 ) + { + KFGameType(Level.Game).DramaticEvent(0.03); + } + } + bHurtEntry = false; +} +defaultproperties +{ + ImpactDamageType=Class'NicePack.NiceDamTypeFlareProjectileImpact' + MyDamageType=Class'NicePack.NiceDamTypeFlareProjectileFire' +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceDamTypeHFR.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceDamTypeHFR.uc index 83115dc..c0eb61f 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceDamTypeHFR.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceDamTypeHFR.uc @@ -1,5 +1,7 @@ -class NiceDamTypeHFR extends NiceDamTypeFire - abstract; -defaultproperties -{ WeaponClass=Class'NicePack.NiceHFR' DeathString="%k incinerated %o (Horzine Flame Rifle)." -} +class NiceDamTypeHFR extends NiceDamTypeFire + abstract; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceHFR' + DeathString="%k incinerated %o (Horzine Flame Rifle)." +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceDamTypeHFRAssaultRifle.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceDamTypeHFRAssaultRifle.uc index 0b2c9ea..6db0ea5 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceDamTypeHFRAssaultRifle.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceDamTypeHFRAssaultRifle.uc @@ -1,5 +1,19 @@ -class NiceDamTypeHFRAssaultRifle extends NiceDamTypeFire - abstract; -defaultproperties -{ heatPart=0.500000 HeadShotDamageMult=6.000000 bCheckForHeadShots=True WeaponClass=Class'NicePack.NiceHFR' DeathString="%k killed %o (Horzine Flame Rifle)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' KDamageImpulse=5500.000000 KDeathVel=175.000000 KDeathUpKick=15.000000 -} +class NiceDamTypeHFRAssaultRifle extends NiceDamTypeFire + abstract; +defaultproperties +{ + heatPart=0.500000 + HeadShotDamageMult=6.000000 + bCheckForHeadShots=True + WeaponClass=Class'NicePack.NiceHFR' + DeathString="%k killed %o (Horzine Flame Rifle)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + PawnDamageEmitter=Class'ROEffects.ROBloodPuff' + LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' + LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' + KDamageImpulse=5500.000000 + KDeathVel=175.000000 + KDeathUpKick=15.000000 +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFR.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFR.uc index cec1283..e04fc98 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceHFR.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFR.uc @@ -1,296 +1,585 @@ -// Modification of the AAR525 weapons by: [B.R]HekuT -class NiceHFR extends KFWeapon; -#exec OBJ LOAD FILE=KillingFloorWeapons.utx -#exec OBJ LOAD FILE=KillingFloorHUD.utx -#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax -#exec OBJ LOAD FILE=KF_Weapons5_Scopes_Trip_T.utx -var() Material ZoomMat; -var() int lenseMaterialID; -var() float scopePortalFOVHigh; -var() float scopePortalFOV; -var() vector XoffsetScoped; -var() vector XoffsetHighDetail; -var() int scopePitch; -var() int scopeYaw; -var() int scopePitchHigh; -var() int scopeYawHigh; -var ScriptedTexture ScopeScriptedTexture; -var Shader ScopeScriptedShader; -var Material ScriptedTextureFallback; -var Combiner ScriptedScopeCombiner; -var Combiner ScriptedScopeStatic; -var texture TexturedScopeTexture; -var bool bInitializedScope; -var string ZoomMatRef; -var string ScriptedTextureFallbackRef; -static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount) -{ - super.PreloadAssets(Inv, bSkipRefCount); - default.ZoomMat = FinalBlend(DynamicLoadObject(default.ZoomMatRef, class'FinalBlend', true)); - default.ScriptedTextureFallback = texture(DynamicLoadObject(default.ScriptedTextureFallbackRef, class'texture', true)); - if ( M99SniperRifle(Inv) != none ) - { M99SniperRifle(Inv).ZoomMat = default.ZoomMat; M99SniperRifle(Inv).ScriptedTextureFallback = default.ScriptedTextureFallback; - } -} -static function bool UnloadAssets() -{ - if ( super.UnloadAssets() ) - { default.ZoomMat = none; default.ScriptedTextureFallback = none; - } - return true; -} -exec function pfov(int thisFOV) -{ - if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) return; - scopePortalFOV = thisFOV; -} -exec function pPitch(int num) -{ - if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) return; - scopePitch = num; - scopePitchHigh = num; -} -exec function pYaw(int num) -{ - if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) return; - scopeYaw = num; - scopeYawHigh = num; -} -simulated exec function TexSize(int i, int j) -{ - if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) return; - ScopeScriptedTexture.SetSize(i, j); -} -simulated function bool ShouldDrawPortal() -{ - if( bAimingRifle ) return true; - else return false; -} -simulated function PostBeginPlay() -{ - super.PostBeginPlay(); - KFScopeDetail = class'KFMod.KFWeapon'.default.KFScopeDetail; - UpdateScopeMode(); -} -simulated function UpdateScopeMode() -{ - if (Level.NetMode != NM_DedicatedServer && Instigator != none && Instigator.IsLocallyControlled() && Instigator.IsHumanControlled() ) - { if( KFScopeDetail == KF_ModelScope ) { scopePortalFOV = default.scopePortalFOV; ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); if (bAimingRifle) { PlayerViewOffset = XoffsetScoped; } - if( ScopeScriptedTexture == none ) { ScopeScriptedTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture')); } - ScopeScriptedTexture.FallBackMaterial = ScriptedTextureFallback; ScopeScriptedTexture.SetSize(512,512); ScopeScriptedTexture.Client = Self; - if( ScriptedScopeCombiner == none ) { ScriptedScopeCombiner = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); ScriptedScopeCombiner.Material1 = Texture'KF_Weapons5_Scopes_Trip_T.Scope.MilDot'; ScriptedScopeCombiner.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; ScriptedScopeCombiner.CombineOperation = CO_Multiply; ScriptedScopeCombiner.AlphaOperation = AO_Use_Mask; ScriptedScopeCombiner.Material2 = ScopeScriptedTexture; } - if( ScopeScriptedShader == none ) { ScopeScriptedShader = Shader(Level.ObjectPool.AllocateObject(class'Shader')); ScopeScriptedShader.Diffuse = ScriptedScopeCombiner; ScopeScriptedShader.SelfIllumination = ScriptedScopeCombiner; ScopeScriptedShader.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; } - bInitializedScope = true; } else if( KFScopeDetail == KF_ModelScopeHigh ) { scopePortalFOV = scopePortalFOVHigh; ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOVHigh); if (bAimingRifle) { PlayerViewOffset = XoffsetHighDetail; } - if( ScopeScriptedTexture == none ) { ScopeScriptedTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture')); } ScopeScriptedTexture.FallBackMaterial = ScriptedTextureFallback; ScopeScriptedTexture.SetSize(1024,1024); ScopeScriptedTexture.Client = Self; - if( ScriptedScopeCombiner == none ) { ScriptedScopeCombiner = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); ScriptedScopeCombiner.Material1 = Texture'KF_Weapons5_Scopes_Trip_T.Scope.MilDot'; ScriptedScopeCombiner.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; ScriptedScopeCombiner.CombineOperation = CO_Multiply; ScriptedScopeCombiner.AlphaOperation = AO_Use_Mask; ScriptedScopeCombiner.Material2 = ScopeScriptedTexture; } - if( ScopeScriptedShader == none ) { ScopeScriptedShader = Shader(Level.ObjectPool.AllocateObject(class'Shader')); ScopeScriptedShader.Diffuse = ScriptedScopeCombiner; ScopeScriptedShader.SelfIllumination = ScriptedScopeCombiner; ScopeScriptedShader.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; } - bInitializedScope = true; } else if (KFScopeDetail == KF_TextureScope) { ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); PlayerViewOffset.X = default.PlayerViewOffset.X; - bInitializedScope = true; } - } -} -simulated event RenderTexture(ScriptedTexture Tex) -{ - local rotator RollMod; - RollMod = Instigator.GetViewRotation(); - if(Owner != none && Instigator != none && Tex != none && Tex.Client != none) Tex.DrawPortal(0,0,Tex.USize,Tex.VSize,Owner,(Instigator.Location + Instigator.EyePosition()), RollMod, scopePortalFOV ); -} -/** - * Handles all the functionality for zooming in including - * setting the parameters for the weapon, pawn, and playercontroller - * - * @param bAnimateTransition whether or not to animate this zoom transition - */ -simulated function ZoomIn(bool bAnimateTransition) -{ - super(BaseKFWeapon).ZoomIn(bAnimateTransition); - bAimingRifle = True; - if( KFHumanPawn(Instigator)!=none ) KFHumanPawn(Instigator).SetAiming(True); - if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) - { if( AimInSound != none ) { PlayOwnedSound(AimInSound, SLOT_Interact,,,,, false); } - } -} -/** - * Handles all the functionality for zooming out including - * setting the parameters for the weapon, pawn, and playercontroller - * - * @param bAnimateTransition whether or not to animate this zoom transition - */ -simulated function ZoomOut(bool bAnimateTransition) -{ - super.ZoomOut(bAnimateTransition); - bAimingRifle = False; - if( KFHumanPawn(Instigator)!=none ) KFHumanPawn(Instigator).SetAiming(False); - if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) - { if( AimOutSound != none ) { PlayOwnedSound(AimOutSound, SLOT_Interact,,,,, false); } KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); - } -} -simulated event OnZoomInFinished() -{ - local name anim; - local float frame, rate; - GetAnimParams(0, anim, frame, rate); - if (ClientState == WS_ReadyToFire) - { if (anim == IdleAnim) { PlayIdle(); } - } - if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none && KFScopeDetail == KF_TextureScope ) - { KFPlayerController(Instigator.Controller).TransitionFOV(PlayerIronSightFOV,0.0); - } -} -simulated event RenderOverlays(Canvas Canvas) -{ - local int m; - local PlayerController PC; - if (Instigator == none) return; - PC = PlayerController(Instigator.Controller); - if(PC == none) return; - if(!bInitializedScope && PC != none ) - { UpdateScopeMode(); - } - Canvas.DrawActor(none, false, true); - for (m = 0; m < NUM_FIRE_MODES; m++) - { if (FireMode[m] != none) { FireMode[m].DrawMuzzleFlash(Canvas); } - } - - SetLocation( Instigator.Location + Instigator.CalcDrawOffset(self) ); - SetRotation( Instigator.GetViewRotation() + ZoomRotInterp); - PreDrawFPWeapon(); - if(bAimingRifle && PC != none && (KFScopeDetail == KF_ModelScope || KFScopeDetail == KF_ModelScopeHigh)) { if (ShouldDrawPortal()) { if ( ScopeScriptedTexture != none ) { Skins[LenseMaterialID] = ScopeScriptedShader; ScopeScriptedTexture.Client = Self; ScopeScriptedTexture.Revision = (ScopeScriptedTexture.Revision +1); } } - bDrawingFirstPerson = true; Canvas.DrawBoundActor(self, false, false,DisplayFOV,PC.Rotation,rot(0,0,0),Instigator.CalcZoomedDrawOffset(self)); bDrawingFirstPerson = false; - } - else if( KFScopeDetail == KF_TextureScope && PC.DesiredFOV == PlayerIronSightFOV && bAimingRifle) - { Skins[LenseMaterialID] = ScriptedTextureFallback; - SetZoomBlendColor(Canvas); - Canvas.Style = ERenderStyle.STY_Normal; Canvas.SetPos(0, 0); Canvas.DrawTile(ZoomMat, (Canvas.SizeX - Canvas.SizeY) / 2, Canvas.SizeY, 0.0, 0.0, 8, 8); Canvas.SetPos(Canvas.SizeX, 0); Canvas.DrawTile(ZoomMat, -(Canvas.SizeX - Canvas.SizeY) / 2, Canvas.SizeY, 0.0, 0.0, 8, 8); - Canvas.Style = 255; Canvas.SetPos((Canvas.SizeX - Canvas.SizeY) / 2,0); Canvas.DrawTile(ZoomMat, Canvas.SizeY, Canvas.SizeY, 0.0, 0.0, 1024, 1024); - Canvas.Font = Canvas.MedFont; Canvas.SetDrawColor(200,150,0); - Canvas.SetPos(Canvas.SizeX * 0.16, Canvas.SizeY * 0.43); Canvas.DrawText("Zoom: 3.0"); - Canvas.SetPos(Canvas.SizeX * 0.16, Canvas.SizeY * 0.47); - } else { Skins[LenseMaterialID] = ScriptedTextureFallback; bDrawingFirstPerson = true; Canvas.DrawActor(self, false, false, DisplayFOV); bDrawingFirstPerson = false; } -} -simulated function float CalcAspectRatioAdjustedFOV(float AdjustFOV) -{ - local KFPlayerController KFPC; - local float ResX, ResY; - local float AspectRatio; - KFPC = KFPlayerController(Level.GetLocalPlayerController()); - if( KFPC == none ) - { return AdjustFOV; - } - ResX = float(GUIController(KFPC.Player.GUIController).ResX); - ResY = float(GUIController(KFPC.Player.GUIController).ResY); - AspectRatio = ResX / ResY; - if ( KFPC.bUseTrueWideScreenFOV && AspectRatio >= 1.60 ) //1.6 = 16/10 which is 16:10 ratio and 16:9 comes to 1.77 - { return CalcFOVForAspectRatio(AdjustFOV); - } - else - { return AdjustFOV; - } -} -simulated function AdjustIngameScope() -{ - local PlayerController PC; - if(Instigator == none || PlayerController(Instigator.Controller) == none) return; - PC = PlayerController(Instigator.Controller); - if( !bHasScope ) return; - switch (KFScopeDetail) - { case KF_ModelScope: if( bAimingRifle ) DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); if ( PC.DesiredFOV == PlayerIronSightFOV && bAimingRifle ) { if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) { KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); -} } break; - case KF_TextureScope: if( bAimingRifle ) DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); if ( bAimingRifle && PC.DesiredFOV != PlayerIronSightFOV ) { if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) { KFPlayerController(Instigator.Controller).TransitionFOV(PlayerIronSightFOV,0.0); } } break; - case KF_ModelScopeHigh: if( bAimingRifle ) { if( ZoomedDisplayFOVHigh > 0 ) { DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOVHigh); } else { DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); } } if ( bAimingRifle && PC.DesiredFOV == PlayerIronSightFOV ) { if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) { KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); } } break; - } - UpdateScopeMode(); -} -simulated event Destroyed() -{ - if (ScopeScriptedTexture != none) - { ScopeScriptedTexture.Client = none; Level.ObjectPool.FreeObject(ScopeScriptedTexture); ScopeScriptedTexture=none; - } - if (ScriptedScopeCombiner != none) - { ScriptedScopeCombiner.Material2 = none; Level.ObjectPool.FreeObject(ScriptedScopeCombiner); ScriptedScopeCombiner = none; - } - if (ScopeScriptedShader != none) - { ScopeScriptedShader.Diffuse = none; ScopeScriptedShader.SelfIllumination = none; Level.ObjectPool.FreeObject(ScopeScriptedShader); ScopeScriptedShader = none; - } - Super.Destroyed(); -} -simulated function PreTravelCleanUp() -{ - if (ScopeScriptedTexture != none) - { ScopeScriptedTexture.Client = none; Level.ObjectPool.FreeObject(ScopeScriptedTexture); ScopeScriptedTexture=none; - } - if (ScriptedScopeCombiner != none) - { ScriptedScopeCombiner.Material2 = none; Level.ObjectPool.FreeObject(ScriptedScopeCombiner); ScriptedScopeCombiner = none; - } - if (ScopeScriptedShader != none) - { ScopeScriptedShader.Diffuse = none; ScopeScriptedShader.SelfIllumination = none; Level.ObjectPool.FreeObject(ScopeScriptedShader); ScopeScriptedShader = none; - } -} -state PendingClientWeaponSet -{ - simulated function Timer() - { if ( Pawn(Owner) != none && !bIsReloading ) { ClientWeaponSet(bPendingSwitch); } - if ( IsInState('PendingClientWeaponSet') ) { SetTimer(0.1, false); } - } - simulated function BeginState() - { SetTimer(0.1, false); - } - simulated function EndState() - { - } -} -simulated function SetZoomBlendColor(Canvas c) -{ - local Byte val; - local Color clr; - local Color fog; - clr.R = 255; - clr.G = 255; - clr.B = 255; - clr.A = 255; - if( Instigator.Region.Zone.bDistanceFog ) - { fog = Instigator.Region.Zone.DistanceFogColor; val = 0; val = Max( val, fog.R); val = Max( val, fog.G); val = Max( val, fog.B); if( val > 128 ) { val -= 128; clr.R -= val; clr.G -= val; clr.B -= val; } - } - c.DrawColor = clr; -} -function bool RecommendRangedAttack() -{ - return true; -} -function float SuggestAttackStyle() -{ - return -1.0; -} -function bool RecommendLongRangedAttack() -{ - return true; -} -simulated function AnimEnd(int channel) -{ - if(!FireMode[1].IsInState('FireLoop')) - { Super.AnimEnd(channel); - } -} -simulated function WeaponTick(float dt) -{ - Super.WeaponTick(dt); -} -simulated function bool StartFire(int Mode) -{ - if( Mode == 0 ) return super.StartFire(Mode); - if( !super.StartFire(Mode) ) return false; - - if( AmmoAmount(0) <= 0 ) - { return false; - } - AnimStopLooping(); - if( !FireMode[Mode].IsInState('FireLoop') && (AmmoAmount(0) > 0) ) - { FireMode[Mode].StartFiring(); return true; - } - else - { return false; - } - return true; -} -defaultproperties -{ lenseMaterialID=3 scopePortalFOVHigh=22.000000 scopePortalFOV=12.000000 ZoomMatRef="KillingFloorWeapons.Xbow.CommandoCrossFinalBlend" ScriptedTextureFallbackRef="NicePackT.HFR.CBLens_cmb" bHasScope=True ZoomedDisplayFOVHigh=35.000000 MagCapacity=10 ReloadRate=3.000000 ReloadAnim="Reload" ReloadAnimRate=0.600000 WeaponReloadAnim="Reload_M4" bSteadyAim=True Weight=7.000000 bHasAimingMode=True IdleAimAnim="Idle" StandardDisplayFOV=60.000000 bModeZeroCanDryFire=True SleeveNum=0 TraderInfoTexture=Texture'NicePackT.HFR.AAR525S_Trader' bIsTier2Weapon=True MeshRef="NicePackA.HFR" SkinRefs(0)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" SkinRefs(1)="NicePackT.HFR.AAR525S_TEX_cmb" SkinRefs(2)="KF_Weapons_Trip_T.Rifles.crossbow_cmb" SelectSoundRef="KF_AK47Snd.AK47_Select" HudImageRef="NicePackT.HFR.AAR525S_unselected" SelectedHudImageRef="NicePackT.HFR.AAR525S_selected" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceHFRPFire' FireModeClass(1)=Class'NicePack.NiceHFRBurstFire' PutDownAnim="PutDown" AIRating=0.700000 CurrentRating=0.700000 Description="Advanced horzine flame rifle." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=145 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=8 PickupClass=Class'NicePack.NiceHFRPickup' PlayerViewOffset=(X=18.000000,Y=15.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceHFRAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="Horzine flame rifle" DrawScale=0.900000 TransientSoundVolume=1.250000 -} +// Modification of the AAR525 weapons by: [B.R]HekuT +class NiceHFR extends KFWeapon; +#exec OBJ LOAD FILE=KillingFloorWeapons.utx +#exec OBJ LOAD FILE=KillingFloorHUD.utx +#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax +#exec OBJ LOAD FILE=KF_Weapons5_Scopes_Trip_T.utx +var() Material ZoomMat; +var() int lenseMaterialID; +var() float scopePortalFOVHigh; +var() float scopePortalFOV; +var() vector XoffsetScoped; +var() vector XoffsetHighDetail; +var() int scopePitch; +var() int scopeYaw; +var() int scopePitchHigh; +var() int scopeYawHigh; +var ScriptedTexture ScopeScriptedTexture; +var Shader ScopeScriptedShader; +var Material ScriptedTextureFallback; +var Combiner ScriptedScopeCombiner; +var Combiner ScriptedScopeStatic; +var texture TexturedScopeTexture; +var bool bInitializedScope; +var string ZoomMatRef; +var string ScriptedTextureFallbackRef; +static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount) +{ + super.PreloadAssets(Inv, bSkipRefCount); + default.ZoomMat = FinalBlend(DynamicLoadObject(default.ZoomMatRef, class'FinalBlend', true)); + default.ScriptedTextureFallback = texture(DynamicLoadObject(default.ScriptedTextureFallbackRef, class'texture', true)); + if ( M99SniperRifle(Inv) != none ) + { + M99SniperRifle(Inv).ZoomMat = default.ZoomMat; + M99SniperRifle(Inv).ScriptedTextureFallback = default.ScriptedTextureFallback; + } +} +static function bool UnloadAssets() +{ + if ( super.UnloadAssets() ) + { + default.ZoomMat = none; + default.ScriptedTextureFallback = none; + } + return true; +} +exec function pfov(int thisFOV) +{ + if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) + return; + scopePortalFOV = thisFOV; +} +exec function pPitch(int num) +{ + if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) + return; + scopePitch = num; + scopePitchHigh = num; +} +exec function pYaw(int num) +{ + if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) + return; + scopeYaw = num; + scopeYawHigh = num; +} +simulated exec function TexSize(int i, int j) +{ + if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) + return; + ScopeScriptedTexture.SetSize(i, j); +} +simulated function bool ShouldDrawPortal() +{ + if( bAimingRifle ) + return true; + else + return false; +} +simulated function PostBeginPlay() +{ + super.PostBeginPlay(); + KFScopeDetail = class'KFMod.KFWeapon'.default.KFScopeDetail; + UpdateScopeMode(); +} +simulated function UpdateScopeMode() +{ + if (Level.NetMode != NM_DedicatedServer && Instigator != none && Instigator.IsLocallyControlled() && + Instigator.IsHumanControlled() ) + { + if( KFScopeDetail == KF_ModelScope ) + { + scopePortalFOV = default.scopePortalFOV; + ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); + if (bAimingRifle) + { + PlayerViewOffset = XoffsetScoped; + } + + if( ScopeScriptedTexture == none ) + { + ScopeScriptedTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture')); + } + + ScopeScriptedTexture.FallBackMaterial = ScriptedTextureFallback; + ScopeScriptedTexture.SetSize(512,512); + ScopeScriptedTexture.Client = Self; + + if( ScriptedScopeCombiner == none ) + { + ScriptedScopeCombiner = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); + ScriptedScopeCombiner.Material1 = Texture'KF_Weapons5_Scopes_Trip_T.Scope.MilDot'; + ScriptedScopeCombiner.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; + ScriptedScopeCombiner.CombineOperation = CO_Multiply; + ScriptedScopeCombiner.AlphaOperation = AO_Use_Mask; + ScriptedScopeCombiner.Material2 = ScopeScriptedTexture; + } + + if( ScopeScriptedShader == none ) + { + ScopeScriptedShader = Shader(Level.ObjectPool.AllocateObject(class'Shader')); + ScopeScriptedShader.Diffuse = ScriptedScopeCombiner; + ScopeScriptedShader.SelfIllumination = ScriptedScopeCombiner; + ScopeScriptedShader.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; + } + + bInitializedScope = true; + } + else if( KFScopeDetail == KF_ModelScopeHigh ) + { + scopePortalFOV = scopePortalFOVHigh; + ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOVHigh); + if (bAimingRifle) + { + PlayerViewOffset = XoffsetHighDetail; + } + + if( ScopeScriptedTexture == none ) + { + ScopeScriptedTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture')); + } + ScopeScriptedTexture.FallBackMaterial = ScriptedTextureFallback; + ScopeScriptedTexture.SetSize(1024,1024); + ScopeScriptedTexture.Client = Self; + + if( ScriptedScopeCombiner == none ) + { + ScriptedScopeCombiner = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); + ScriptedScopeCombiner.Material1 = Texture'KF_Weapons5_Scopes_Trip_T.Scope.MilDot'; + ScriptedScopeCombiner.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; + ScriptedScopeCombiner.CombineOperation = CO_Multiply; + ScriptedScopeCombiner.AlphaOperation = AO_Use_Mask; + ScriptedScopeCombiner.Material2 = ScopeScriptedTexture; + } + + if( ScopeScriptedShader == none ) + { + ScopeScriptedShader = Shader(Level.ObjectPool.AllocateObject(class'Shader')); + ScopeScriptedShader.Diffuse = ScriptedScopeCombiner; + ScopeScriptedShader.SelfIllumination = ScriptedScopeCombiner; + ScopeScriptedShader.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; + } + + bInitializedScope = true; + } + else if (KFScopeDetail == KF_TextureScope) + { + ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); + PlayerViewOffset.X = default.PlayerViewOffset.X; + + bInitializedScope = true; + } + } +} +simulated event RenderTexture(ScriptedTexture Tex) +{ + local rotator RollMod; + RollMod = Instigator.GetViewRotation(); + if(Owner != none && Instigator != none && Tex != none && Tex.Client != none) + Tex.DrawPortal(0,0,Tex.USize,Tex.VSize,Owner,(Instigator.Location + Instigator.EyePosition()), RollMod, scopePortalFOV ); +} +/** + * Handles all the functionality for zooming in including + * setting the parameters for the weapon, pawn, and playercontroller + * + * @param bAnimateTransition whether or not to animate this zoom transition + */ +simulated function ZoomIn(bool bAnimateTransition) +{ + super(BaseKFWeapon).ZoomIn(bAnimateTransition); + bAimingRifle = True; + if( KFHumanPawn(Instigator)!=none ) + KFHumanPawn(Instigator).SetAiming(True); + if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) + { + if( AimInSound != none ) + { + PlayOwnedSound(AimInSound, SLOT_Interact,,,,, false); + } + } +} +/** + * Handles all the functionality for zooming out including + * setting the parameters for the weapon, pawn, and playercontroller + * + * @param bAnimateTransition whether or not to animate this zoom transition + */ +simulated function ZoomOut(bool bAnimateTransition) +{ + super.ZoomOut(bAnimateTransition); + bAimingRifle = False; + if( KFHumanPawn(Instigator)!=none ) + KFHumanPawn(Instigator).SetAiming(False); + if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) + { + if( AimOutSound != none ) + { + PlayOwnedSound(AimOutSound, SLOT_Interact,,,,, false); + } + KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); + } +} +simulated event OnZoomInFinished() +{ + local name anim; + local float frame, rate; + GetAnimParams(0, anim, frame, rate); + if (ClientState == WS_ReadyToFire) + { + if (anim == IdleAnim) + { + PlayIdle(); + } + } + if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none && + KFScopeDetail == KF_TextureScope ) + { + KFPlayerController(Instigator.Controller).TransitionFOV(PlayerIronSightFOV,0.0); + } +} +simulated event RenderOverlays(Canvas Canvas) +{ + local int m; + local PlayerController PC; + if (Instigator == none) + return; + PC = PlayerController(Instigator.Controller); + if(PC == none) + return; + if(!bInitializedScope && PC != none ) + { + UpdateScopeMode(); + } + Canvas.DrawActor(none, false, true); + for (m = 0; m < NUM_FIRE_MODES; m++) + { + if (FireMode[m] != none) + { + FireMode[m].DrawMuzzleFlash(Canvas); + } + } + + SetLocation( Instigator.Location + Instigator.CalcDrawOffset(self) ); + SetRotation( Instigator.GetViewRotation() + ZoomRotInterp); + PreDrawFPWeapon(); + + if(bAimingRifle && PC != none && (KFScopeDetail == KF_ModelScope || KFScopeDetail == KF_ModelScopeHigh)) + { + if (ShouldDrawPortal()) + { + if ( ScopeScriptedTexture != none ) + { + Skins[LenseMaterialID] = ScopeScriptedShader; + ScopeScriptedTexture.Client = Self; + ScopeScriptedTexture.Revision = (ScopeScriptedTexture.Revision +1); + } + } + + bDrawingFirstPerson = true; + Canvas.DrawBoundActor(self, false, false,DisplayFOV,PC.Rotation,rot(0,0,0),Instigator.CalcZoomedDrawOffset(self)); + bDrawingFirstPerson = false; + } + else if( KFScopeDetail == KF_TextureScope && PC.DesiredFOV == PlayerIronSightFOV && bAimingRifle) + { + Skins[LenseMaterialID] = ScriptedTextureFallback; + + SetZoomBlendColor(Canvas); + + Canvas.Style = ERenderStyle.STY_Normal; + Canvas.SetPos(0, 0); + Canvas.DrawTile(ZoomMat, (Canvas.SizeX - Canvas.SizeY) / 2, Canvas.SizeY, 0.0, 0.0, 8, 8); + Canvas.SetPos(Canvas.SizeX, 0); + Canvas.DrawTile(ZoomMat, -(Canvas.SizeX - Canvas.SizeY) / 2, Canvas.SizeY, 0.0, 0.0, 8, 8); + + Canvas.Style = 255; + Canvas.SetPos((Canvas.SizeX - Canvas.SizeY) / 2,0); + Canvas.DrawTile(ZoomMat, Canvas.SizeY, Canvas.SizeY, 0.0, 0.0, 1024, 1024); + + Canvas.Font = Canvas.MedFont; + Canvas.SetDrawColor(200,150,0); + + Canvas.SetPos(Canvas.SizeX * 0.16, Canvas.SizeY * 0.43); + Canvas.DrawText("Zoom: 3.0"); + + Canvas.SetPos(Canvas.SizeX * 0.16, Canvas.SizeY * 0.47); + } + else + { + Skins[LenseMaterialID] = ScriptedTextureFallback; + bDrawingFirstPerson = true; + Canvas.DrawActor(self, false, false, DisplayFOV); + bDrawingFirstPerson = false; + } +} +simulated function float CalcAspectRatioAdjustedFOV(float AdjustFOV) +{ + local KFPlayerController KFPC; + local float ResX, ResY; + local float AspectRatio; + KFPC = KFPlayerController(Level.GetLocalPlayerController()); + if( KFPC == none ) + { + return AdjustFOV; + } + ResX = float(GUIController(KFPC.Player.GUIController).ResX); + ResY = float(GUIController(KFPC.Player.GUIController).ResY); + AspectRatio = ResX / ResY; + if ( KFPC.bUseTrueWideScreenFOV && AspectRatio >= 1.60 ) //1.6 = 16/10 which is 16:10 ratio and 16:9 comes to 1.77 + { + return CalcFOVForAspectRatio(AdjustFOV); + } + else + { + return AdjustFOV; + } +} +simulated function AdjustIngameScope() +{ + local PlayerController PC; + if(Instigator == none || PlayerController(Instigator.Controller) == none) + return; + PC = PlayerController(Instigator.Controller); + if( !bHasScope ) + return; + switch (KFScopeDetail) + { + case KF_ModelScope: + if( bAimingRifle ) + DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); + if ( PC.DesiredFOV == PlayerIronSightFOV && bAimingRifle ) + { + if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) + { + KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); +} + } + break; + + case KF_TextureScope: + if( bAimingRifle ) + DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); + if ( bAimingRifle && PC.DesiredFOV != PlayerIronSightFOV ) + { + if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) + { + KFPlayerController(Instigator.Controller).TransitionFOV(PlayerIronSightFOV,0.0); + } + } + break; + + case KF_ModelScopeHigh: + if( bAimingRifle ) + { + if( ZoomedDisplayFOVHigh > 0 ) + { + DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOVHigh); + } + else + { + DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); + } + } + if ( bAimingRifle && PC.DesiredFOV == PlayerIronSightFOV ) + { + if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) + { + KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); + } + } + break; + } + UpdateScopeMode(); +} +simulated event Destroyed() +{ + if (ScopeScriptedTexture != none) + { + ScopeScriptedTexture.Client = none; + Level.ObjectPool.FreeObject(ScopeScriptedTexture); + ScopeScriptedTexture=none; + } + if (ScriptedScopeCombiner != none) + { + ScriptedScopeCombiner.Material2 = none; + Level.ObjectPool.FreeObject(ScriptedScopeCombiner); + ScriptedScopeCombiner = none; + } + if (ScopeScriptedShader != none) + { + ScopeScriptedShader.Diffuse = none; + ScopeScriptedShader.SelfIllumination = none; + Level.ObjectPool.FreeObject(ScopeScriptedShader); + ScopeScriptedShader = none; + } + Super.Destroyed(); +} +simulated function PreTravelCleanUp() +{ + if (ScopeScriptedTexture != none) + { + ScopeScriptedTexture.Client = none; + Level.ObjectPool.FreeObject(ScopeScriptedTexture); + ScopeScriptedTexture=none; + } + if (ScriptedScopeCombiner != none) + { + ScriptedScopeCombiner.Material2 = none; + Level.ObjectPool.FreeObject(ScriptedScopeCombiner); + ScriptedScopeCombiner = none; + } + if (ScopeScriptedShader != none) + { + ScopeScriptedShader.Diffuse = none; + ScopeScriptedShader.SelfIllumination = none; + Level.ObjectPool.FreeObject(ScopeScriptedShader); + ScopeScriptedShader = none; + } +} +state PendingClientWeaponSet +{ + simulated function Timer() + { + if ( Pawn(Owner) != none && !bIsReloading ) + { + ClientWeaponSet(bPendingSwitch); + } + + if ( IsInState('PendingClientWeaponSet') ) + { + SetTimer(0.1, false); + } + } + simulated function BeginState() + { + SetTimer(0.1, false); + } + simulated function EndState() + { + } +} +simulated function SetZoomBlendColor(Canvas c) +{ + local Byte val; + local Color clr; + local Color fog; + clr.R = 255; + clr.G = 255; + clr.B = 255; + clr.A = 255; + if( Instigator.Region.Zone.bDistanceFog ) + { + fog = Instigator.Region.Zone.DistanceFogColor; + val = 0; + val = Max( val, fog.R); + val = Max( val, fog.G); + val = Max( val, fog.B); + if( val > 128 ) + { + val -= 128; + clr.R -= val; + clr.G -= val; + clr.B -= val; + } + } + c.DrawColor = clr; +} +function bool RecommendRangedAttack() +{ + return true; +} +function float SuggestAttackStyle() +{ + return -1.0; +} +function bool RecommendLongRangedAttack() +{ + return true; +} +simulated function AnimEnd(int channel) +{ + if(!FireMode[1].IsInState('FireLoop')) + { + Super.AnimEnd(channel); + } +} +simulated function WeaponTick(float dt) +{ + Super.WeaponTick(dt); +} +simulated function bool StartFire(int Mode) +{ + if( Mode == 0 ) + return super.StartFire(Mode); + if( !super.StartFire(Mode) ) + return false; + + if( AmmoAmount(0) <= 0 ) + { + return false; + } + AnimStopLooping(); + if( !FireMode[Mode].IsInState('FireLoop') && (AmmoAmount(0) > 0) ) + { + FireMode[Mode].StartFiring(); + return true; + } + else + { + return false; + } + return true; +} +defaultproperties +{ + lenseMaterialID=3 + scopePortalFOVHigh=22.000000 + scopePortalFOV=12.000000 + ZoomMatRef="KillingFloorWeapons.Xbow.CommandoCrossFinalBlend" + ScriptedTextureFallbackRef="NicePackT.HFR.CBLens_cmb" + bHasScope=True + ZoomedDisplayFOVHigh=35.000000 + MagCapacity=10 + ReloadRate=3.000000 + ReloadAnim="Reload" + ReloadAnimRate=0.600000 + WeaponReloadAnim="Reload_M4" + bSteadyAim=True + Weight=7.000000 + bHasAimingMode=True + IdleAimAnim="Idle" + StandardDisplayFOV=60.000000 + bModeZeroCanDryFire=True + SleeveNum=0 + TraderInfoTexture=Texture'NicePackT.HFR.AAR525S_Trader' + bIsTier2Weapon=True + MeshRef="NicePackA.HFR" + SkinRefs(0)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" + SkinRefs(1)="NicePackT.HFR.AAR525S_TEX_cmb" + SkinRefs(2)="KF_Weapons_Trip_T.Rifles.crossbow_cmb" + SelectSoundRef="KF_AK47Snd.AK47_Select" + HudImageRef="NicePackT.HFR.AAR525S_unselected" + SelectedHudImageRef="NicePackT.HFR.AAR525S_selected" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=32.000000 + FireModeClass(0)=Class'NicePack.NiceHFRPFire' + FireModeClass(1)=Class'NicePack.NiceHFRBurstFire' + PutDownAnim="PutDown" + AIRating=0.700000 + CurrentRating=0.700000 + Description="Advanced horzine flame rifle." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=60.000000 + Priority=145 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=4 + GroupOffset=8 + PickupClass=Class'NicePack.NiceHFRPickup' + PlayerViewOffset=(X=18.000000,Y=15.000000,Z=-6.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceHFRAttachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="Horzine flame rifle" + DrawScale=0.900000 + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmo.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmo.uc index 658f2b8..07a77e3 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmo.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmo.uc @@ -1,5 +1,12 @@ -class NiceHFRAmmo extends KFAmmunition; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ AmmoPickupAmount=15 MaxAmmo=100 InitialAmount=40 PickupClass=Class'NicePack.NiceHFRAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="Fire balloon" -} +class NiceHFRAmmo extends KFAmmunition; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + AmmoPickupAmount=15 + MaxAmmo=100 + InitialAmount=40 + PickupClass=Class'NicePack.NiceHFRAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="Fire balloon" +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmoPickup.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmoPickup.uc index b6d2eeb..2b4bc75 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmoPickup.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceHFRAmmoPickup extends KFAmmoPickup; -defaultproperties -{ AmmoAmount=15 InventoryType=Class'NicePack.NiceHFRAmmo' PickupMessage="Fire balloon" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceHFRAmmoPickup extends KFAmmoPickup; +defaultproperties +{ + AmmoAmount=15 + InventoryType=Class'NicePack.NiceHFRAmmo' + PickupMessage="Fire balloon" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAttachment.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAttachment.uc index 97a1722..a2133dd 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAttachment.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAttachment.uc @@ -1,4 +1,52 @@ -class NiceHFRAttachment extends KFWeaponAttachment; -defaultproperties -{ mTracerClass=Class'KFMod.SPSniperTracer' MovementAnims(0)="JogF_M4203" MovementAnims(1)="JogB_M4203" MovementAnims(2)="JogL_M4203" MovementAnims(3)="JogR_M4203" TurnLeftAnim="TurnL_M4203" TurnRightAnim="TurnR_M4203" CrouchAnims(0)="CHWalkF_M4203" CrouchAnims(1)="CHWalkB_M4203" CrouchAnims(2)="CHWalkL_M4203" CrouchAnims(3)="CHWalkR_M4203" WalkAnims(0)="WalkF_M4203" WalkAnims(1)="WalkB_M4203" WalkAnims(2)="WalkL_M4203" WalkAnims(3)="WalkR_M4203" CrouchTurnRightAnim="CH_TurnR_M4203" CrouchTurnLeftAnim="CH_TurnL_M4203" IdleCrouchAnim="CHIdle_M4203" IdleWeaponAnim="Idle_M4203" IdleRestAnim="Idle_M4203" IdleChatAnim="Idle_M4203" IdleHeavyAnim="Idle_M4203" IdleRifleAnim="Idle_M4203" FireAnims(0)="Fire_M4203" FireAnims(1)="Fire_M4203" FireAnims(2)="Fire_M4203" FireAnims(3)="Fire_M4203" FireAltAnims(0)="Reload_Secondary_M4203" FireAltAnims(1)="Reload_Secondary_M4203" FireAltAnims(2)="Reload_Secondary_M4203" FireAltAnims(3)="Reload_Secondary_M4203" FireCrouchAnims(0)="CHFire_M4203" FireCrouchAnims(1)="CHFire_M4203" FireCrouchAnims(2)="CHFire_M4203" FireCrouchAnims(3)="CHFire_M4203" FireCrouchAltAnims(0)="Reload_Secondary_M4203" FireCrouchAltAnims(1)="Reload_Secondary_M4203" FireCrouchAltAnims(2)="Reload_Secondary_M4203" FireCrouchAltAnims(3)="Reload_Secondary_M4203" HitAnims(0)="HitF_M4203" HitAnims(1)="HitB_M4203" HitAnims(2)="HitL_M4203" HitAnims(3)="HitR_M4203" PostFireBlendStandAnim="Blend_M4203" PostFireBlendCrouchAnim="CHBlend_M4203" MeshRef="NicePackA.HFR_3rd" WeaponAmbientScale=2.000000 SplashEffect=Class'ROEffects.BulletSplashEmitter' -} +class NiceHFRAttachment extends KFWeaponAttachment; +defaultproperties +{ + mTracerClass=Class'KFMod.SPSniperTracer' + MovementAnims(0)="JogF_M4203" + MovementAnims(1)="JogB_M4203" + MovementAnims(2)="JogL_M4203" + MovementAnims(3)="JogR_M4203" + TurnLeftAnim="TurnL_M4203" + TurnRightAnim="TurnR_M4203" + CrouchAnims(0)="CHWalkF_M4203" + CrouchAnims(1)="CHWalkB_M4203" + CrouchAnims(2)="CHWalkL_M4203" + CrouchAnims(3)="CHWalkR_M4203" + WalkAnims(0)="WalkF_M4203" + WalkAnims(1)="WalkB_M4203" + WalkAnims(2)="WalkL_M4203" + WalkAnims(3)="WalkR_M4203" + CrouchTurnRightAnim="CH_TurnR_M4203" + CrouchTurnLeftAnim="CH_TurnL_M4203" + IdleCrouchAnim="CHIdle_M4203" + IdleWeaponAnim="Idle_M4203" + IdleRestAnim="Idle_M4203" + IdleChatAnim="Idle_M4203" + IdleHeavyAnim="Idle_M4203" + IdleRifleAnim="Idle_M4203" + FireAnims(0)="Fire_M4203" + FireAnims(1)="Fire_M4203" + FireAnims(2)="Fire_M4203" + FireAnims(3)="Fire_M4203" + FireAltAnims(0)="Reload_Secondary_M4203" + FireAltAnims(1)="Reload_Secondary_M4203" + FireAltAnims(2)="Reload_Secondary_M4203" + FireAltAnims(3)="Reload_Secondary_M4203" + FireCrouchAnims(0)="CHFire_M4203" + FireCrouchAnims(1)="CHFire_M4203" + FireCrouchAnims(2)="CHFire_M4203" + FireCrouchAnims(3)="CHFire_M4203" + FireCrouchAltAnims(0)="Reload_Secondary_M4203" + FireCrouchAltAnims(1)="Reload_Secondary_M4203" + FireCrouchAltAnims(2)="Reload_Secondary_M4203" + FireCrouchAltAnims(3)="Reload_Secondary_M4203" + HitAnims(0)="HitF_M4203" + HitAnims(1)="HitB_M4203" + HitAnims(2)="HitL_M4203" + HitAnims(3)="HitR_M4203" + PostFireBlendStandAnim="Blend_M4203" + PostFireBlendCrouchAnim="CHBlend_M4203" + MeshRef="NicePackA.HFR_3rd" + WeaponAmbientScale=2.000000 + SplashEffect=Class'ROEffects.BulletSplashEmitter' +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRBurstFire.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRBurstFire.uc index 919ef05..6a856e5 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRBurstFire.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRBurstFire.uc @@ -1,4 +1,7 @@ -class NiceHFRBurstFire extends FlameBurstFire; -defaultproperties -{ FireLoopAnim="Fire_Flame" AmmoClass=Class'NicePack.NiceHFRAmmo' ProjectileClass=Class'NicePack.NiceHFRTendril' -} +class NiceHFRBurstFire extends FlameBurstFire; +defaultproperties +{ + FireLoopAnim="Fire_Flame" + AmmoClass=Class'NicePack.NiceHFRAmmo' + ProjectileClass=Class'NicePack.NiceHFRTendril' +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRFlame.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRFlame.uc index 61aacd5..090d36f 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRFlame.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRFlame.uc @@ -1,20 +1,58 @@ -class NiceHFRFlame extends HitFlame; -var float LastFlameSpawnTime; -var () float FlameSpawnInterval; -var Emitter SecondaryFlame; -state Ticking -{ - simulated function Tick( float dt ) - { if( LifeSpan < 2.0 ) { mRegenRange[0] *= LifeSpan * 0.5; mRegenRange[1] = mRegenRange[0]; SoundVolume = byte(float(SoundVolume) * (LifeSpan * 0.5)); } - if (Level.TimeSeconds - LastFlameSpawnTime > FlameSpawnInterval) { if( SecondaryFlame != none ) { SecondaryFlame.Kill(); } SecondaryFlame = Spawn(class'NicePack.NiceHFRFlameB',self); } - } -} -simulated function Destroyed() -{ - if( SecondaryFlame != none ) - { SecondaryFlame.Kill(); - } -} -defaultproperties -{ FlameSpawnInterval=0.500000 mParticleType=PT_Stream mLifeRange(0)=1.000000 mLifeRange(1)=1.500000 mRegenRange(0)=60.000000 mRegenRange(1)=60.000000 mMassRange(0)=0.500000 mMassRange(1)=1.000000 mSizeRange(0)=4.000000 mSizeRange(1)=8.000000 mGrowthRate=-52.000000 mAttenKa=0.000000 mAttenKb=0.000000 mRandTextures=True mAttraction=100.000000 Physics=PHYS_Trailer AmbientSound=Sound'Amb_Destruction.Fire.Kessel_Fire_Small_Barrel' Skins(0)=Texture'KFX.KFFlames' Style=STY_Additive SoundVolume=255 TransientSoundVolume=0.000000 TransientSoundRadius=50.000000 bNotOnDedServer=False -} +class NiceHFRFlame extends HitFlame; +var float LastFlameSpawnTime; +var () float FlameSpawnInterval; +var Emitter SecondaryFlame; +state Ticking +{ + simulated function Tick( float dt ) + { + if( LifeSpan < 2.0 ) + { + mRegenRange[0] *= LifeSpan * 0.5; + mRegenRange[1] = mRegenRange[0]; + SoundVolume = byte(float(SoundVolume) * (LifeSpan * 0.5)); + } + + if (Level.TimeSeconds - LastFlameSpawnTime > FlameSpawnInterval) + { + if( SecondaryFlame != none ) + { + SecondaryFlame.Kill(); + } + SecondaryFlame = Spawn(class'NicePack.NiceHFRFlameB',self); + } + } +} +simulated function Destroyed() +{ + if( SecondaryFlame != none ) + { + SecondaryFlame.Kill(); + } +} +defaultproperties +{ + FlameSpawnInterval=0.500000 + mParticleType=PT_Stream + mLifeRange(0)=1.000000 + mLifeRange(1)=1.500000 + mRegenRange(0)=60.000000 + mRegenRange(1)=60.000000 + mMassRange(0)=0.500000 + mMassRange(1)=1.000000 + mSizeRange(0)=4.000000 + mSizeRange(1)=8.000000 + mGrowthRate=-52.000000 + mAttenKa=0.000000 + mAttenKb=0.000000 + mRandTextures=True + mAttraction=100.000000 + Physics=PHYS_Trailer + AmbientSound=Sound'Amb_Destruction.Fire.Kessel_Fire_Small_Barrel' + Skins(0)=Texture'KFX.KFFlames' + Style=STY_Additive + SoundVolume=255 + TransientSoundVolume=0.000000 + TransientSoundRadius=50.000000 + bNotOnDedServer=False +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRFlameB.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRFlameB.uc index 344667a..da886a6 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRFlameB.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRFlameB.uc @@ -1,5 +1,45 @@ -class NiceHFRFlameB extends Emitter; -defaultproperties -{ Begin Object Class=SpriteEmitter Name=SpriteEmitter0 UseColorScale=True FadeOut=True SpinParticles=True UseSizeScale=True UseRegularSizeScale=False UniformSize=True UseRandomSubdivision=True ColorScale(1)=(RelativeTime=0.300000,Color=(B=255,G=255,R=255)) ColorScale(2)=(RelativeTime=0.750000,Color=(B=255,G=255,R=255)) ColorScale(3)=(RelativeTime=1.000000) ColorMultiplierRange=(Z=(Min=0.670000,Max=2.000000)) FadeOutStartTime=0.501500 MaxParticles=15 StartLocationShape=PTLS_Sphere SphereRadiusRange=(Max=1.000000) SpinsPerSecondRange=(X=(Max=0.070000)) StartSpinRange=(X=(Max=1.000000)) SizeScale(0)=(RelativeTime=1.000000,RelativeSize=1.250000) StartSizeRange=(X=(Min=1.000000,Max=15.000000),Y=(Min=0.000000,Max=0.000000),Z=(Min=0.000000,Max=0.000000)) ScaleSizeByVelocityMultiplier=(X=0.000000,Y=0.000000,Z=0.000000) ScaleSizeByVelocityMax=0.000000 Texture=Texture'KillingFloorWeapons.FlameThrower.FlameThrowerFire' TextureUSubdivisions=1 TextureVSubdivisions=1 SecondsBeforeInactive=30.000000 LifetimeRange=(Min=0.450000,Max=0.850000) StartVelocityRange=(X=(Min=-10.000000,Max=10.000000),Y=(Min=-10.000000,Max=10.000000),Z=(Min=2.000000,Max=25.000000)) MaxAbsVelocity=(X=100.000000,Y=100.000000,Z=100.000000) End Object Emitters(0)=SpriteEmitter'NicePack.NiceHFRFlameB.SpriteEmitter0' - LightType=LT_Pulse LightHue=30 LightSaturation=100 LightBrightness=300.000000 LightRadius=4.000000 bNoDelete=False bDynamicLight=True bNetTemporary=True Physics=PHYS_Trailer -} +class NiceHFRFlameB extends Emitter; +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter0 + UseColorScale=True + FadeOut=True + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + UseRandomSubdivision=True + ColorScale(1)=(RelativeTime=0.300000,Color=(B=255,G=255,R=255)) + ColorScale(2)=(RelativeTime=0.750000,Color=(B=255,G=255,R=255)) + ColorScale(3)=(RelativeTime=1.000000) + ColorMultiplierRange=(Z=(Min=0.670000,Max=2.000000)) + FadeOutStartTime=0.501500 + MaxParticles=15 + StartLocationShape=PTLS_Sphere + SphereRadiusRange=(Max=1.000000) + SpinsPerSecondRange=(X=(Max=0.070000)) + StartSpinRange=(X=(Max=1.000000)) + SizeScale(0)=(RelativeTime=1.000000,RelativeSize=1.250000) + StartSizeRange=(X=(Min=1.000000,Max=15.000000),Y=(Min=0.000000,Max=0.000000),Z=(Min=0.000000,Max=0.000000)) + ScaleSizeByVelocityMultiplier=(X=0.000000,Y=0.000000,Z=0.000000) + ScaleSizeByVelocityMax=0.000000 + Texture=Texture'KillingFloorWeapons.FlameThrower.FlameThrowerFire' + TextureUSubdivisions=1 + TextureVSubdivisions=1 + SecondsBeforeInactive=30.000000 + LifetimeRange=(Min=0.450000,Max=0.850000) + StartVelocityRange=(X=(Min=-10.000000,Max=10.000000),Y=(Min=-10.000000,Max=10.000000),Z=(Min=2.000000,Max=25.000000)) + MaxAbsVelocity=(X=100.000000,Y=100.000000,Z=100.000000) + End Object + Emitters(0)=SpriteEmitter'NicePack.NiceHFRFlameB.SpriteEmitter0' + + LightType=LT_Pulse + LightHue=30 + LightSaturation=100 + LightBrightness=300.000000 + LightRadius=4.000000 + bNoDelete=False + bDynamicLight=True + bNetTemporary=True + Physics=PHYS_Trailer +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPFire.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPFire.uc index f79fa3a..ad15b00 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPFire.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPFire.uc @@ -1,4 +1,36 @@ -class NiceHFRPFire extends KFFire; -defaultproperties -{ FireAimedAnim="Fire_Iron" RecoilRate=0.120000 maxVerticalRecoilAngle=500 bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="KF_SP_LongmusketSnd.KFO_Sniper_Fire_M" StereoFireSoundRef="KF_SP_LongmusketSnd.KFO_Sniper_Fire_S" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeHFRAssaultRifle' DamageMax=50 Momentum=8500.000000 bWaitForRelease=True TransientSoundVolume=1.200000 TransientSoundRadius=500.000000 FireLoopAnim="Fire" FireAnimRate=0.909000 TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.600000 AmmoClass=Class'NicePack.NiceHFRAmmo' AmmoPerFire=1 ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSPSniper' aimerror=42.000000 Spread=0.015000 SpreadStyle=SS_Random -} +class NiceHFRPFire extends KFFire; +defaultproperties +{ + FireAimedAnim="Fire_Iron" + RecoilRate=0.120000 + maxVerticalRecoilAngle=500 + bAccuracyBonusForSemiAuto=True + bRandomPitchFireSound=False + FireSoundRef="KF_SP_LongmusketSnd.KFO_Sniper_Fire_M" + StereoFireSoundRef="KF_SP_LongmusketSnd.KFO_Sniper_Fire_S" + NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" + DamageType=Class'NicePack.NiceDamTypeHFRAssaultRifle' + DamageMax=50 + Momentum=8500.000000 + bWaitForRelease=True + TransientSoundVolume=1.200000 + TransientSoundRadius=500.000000 + FireLoopAnim="Fire" + FireAnimRate=0.909000 + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.600000 + AmmoClass=Class'NicePack.NiceHFRAmmo' + AmmoPerFire=1 + ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) + ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) + ShakeRotTime=0.750000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.250000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSPSniper' + aimerror=42.000000 + Spread=0.015000 + SpreadStyle=SS_Random +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPickup.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPickup.uc index 6746b23..4734930 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPickup.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPickup.uc @@ -1,4 +1,24 @@ -class NiceHFRPickup extends KFWeaponPickup; -defaultproperties -{ Weight=7.000000 AmmoCost=30 BuyClipSize=15 PowerValue=100 SpeedValue=100 RangeValue=40 Description="Advanced horzine flame rifle." ItemName="Horzine flame rifle" ItemShortName="HFR" AmmoItemName="Fire balloon" AmmoMesh=StaticMesh'KillingFloorStatics.FT_AmmoMesh' CorrespondingPerkIndex=5 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceHFR' PickupMessage="You got the HFR." PickupSound=Sound'KF_AK47Snd.AK47_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'NicePackSM.HFR.AAR525_Black_Pickup' CollisionRadius=30.000000 CollisionHeight=5.000000 -} +class NiceHFRPickup extends KFWeaponPickup; +defaultproperties +{ + Weight=7.000000 + AmmoCost=30 + BuyClipSize=15 + PowerValue=100 + SpeedValue=100 + RangeValue=40 + Description="Advanced horzine flame rifle." + ItemName="Horzine flame rifle" + ItemShortName="HFR" + AmmoItemName="Fire balloon" + AmmoMesh=StaticMesh'KillingFloorStatics.FT_AmmoMesh' + CorrespondingPerkIndex=5 + EquipmentCategoryID=3 + InventoryType=Class'NicePack.NiceHFR' + PickupMessage="You got the HFR." + PickupSound=Sound'KF_AK47Snd.AK47_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'NicePackSM.HFR.AAR525_Black_Pickup' + CollisionRadius=30.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRTendril.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRTendril.uc index ba7c044..515e031 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRTendril.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRTendril.uc @@ -1,4 +1,6 @@ -class NiceHFRTendril extends FlameTendril; -defaultproperties -{ Damage=36.000000 MyDamageType=Class'NicePack.NiceDamTypeHFR' -} +class NiceHFRTendril extends FlameTendril; +defaultproperties +{ + Damage=36.000000 + MyDamageType=Class'NicePack.NiceDamTypeHFR' +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGun.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGun.uc index 287de45..9dbc810 100644 --- a/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGun.uc +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGun.uc @@ -1,5 +1,10 @@ -class NiceDamTypeHuskGun extends NiceDamTypeFire - abstract; -defaultproperties -{ bCheckForHeadShots=True WeaponClass=Class'NicePack.NiceHuskGun' DeathString="%k killed %o (Husk Gun)." FemaleSuicide="%o blew up." MaleSuicide="%o blew up." -} +class NiceDamTypeHuskGun extends NiceDamTypeFire + abstract; +defaultproperties +{ + bCheckForHeadShots=True + WeaponClass=Class'NicePack.NiceHuskGun' + DeathString="%k killed %o (Husk Gun)." + FemaleSuicide="%o blew up." + MaleSuicide="%o blew up." +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGunProjectileImpact.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGunProjectileImpact.uc index 17f56a8..26b6319 100644 --- a/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGunProjectileImpact.uc +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGunProjectileImpact.uc @@ -1,14 +1,33 @@ -class NiceDamTypeHuskGunProjectileImpact extends NiceDamTypeFire; -static function GetHitEffects(out class HitEffects[4], int VictimHealth) -{ - HitEffects[0] = class'HitSmoke'; - if( VictimHealth <= 0 ) HitEffects[1] = class'KFHitFlame'; - else if ( FRand() < 0.8 ) HitEffects[1] = class'KFHitFlame'; -} -static function AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount) -{ - KFStatsAndAchievements.AddFlameThrowerDamage(Amount); -} -defaultproperties -{ HeadShotDamageMult=1.500000 bCheckForHeadShots=True WeaponClass=Class'NicePack.NiceHuskGun' DeathString="%k killed %o (Husk Gun)." FemaleSuicide="%o blew up." MaleSuicide="%o blew up." bRagdollBullet=True bBulletHit=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' DeathOverlayTime=999.000000 KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 HumanObliterationThreshhold=200 -} +class NiceDamTypeHuskGunProjectileImpact extends NiceDamTypeFire; +static function GetHitEffects(out class HitEffects[4], int VictimHealth) +{ + HitEffects[0] = class'HitSmoke'; + if( VictimHealth <= 0 ) + HitEffects[1] = class'KFHitFlame'; + else if ( FRand() < 0.8 ) + HitEffects[1] = class'KFHitFlame'; +} +static function AwardDamage(KFSteamStatsAndAchievements KFStatsAndAchievements, int Amount) +{ + KFStatsAndAchievements.AddFlameThrowerDamage(Amount); +} +defaultproperties +{ + HeadShotDamageMult=1.500000 + bCheckForHeadShots=True + WeaponClass=Class'NicePack.NiceHuskGun' + DeathString="%k killed %o (Husk Gun)." + FemaleSuicide="%o blew up." + MaleSuicide="%o blew up." + bRagdollBullet=True + bBulletHit=True + PawnDamageEmitter=Class'ROEffects.ROBloodPuff' + LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' + LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' + DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' + DeathOverlayTime=999.000000 + KDamageImpulse=10000.000000 + KDeathVel=300.000000 + KDeathUpKick=100.000000 + HumanObliterationThreshhold=200 +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGun_Alt.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGun_Alt.uc index 384de67..03fcaca 100644 --- a/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGun_Alt.uc +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceDamTypeHuskGun_Alt.uc @@ -1,5 +1,10 @@ -class NiceDamTypeHuskGun_Alt extends NiceDamTypeHuskGun - abstract; -defaultproperties -{ HeadShotDamageMult=1.000000 bCheckForHeadShots=False DeathString="%k burned down %o with Napalm." FemaleSuicide="%o burned her pretty butt up." MaleSuicide="%o burned his a** up." -} +class NiceDamTypeHuskGun_Alt extends NiceDamTypeHuskGun + abstract; +defaultproperties +{ + HeadShotDamageMult=1.000000 + bCheckForHeadShots=False + DeathString="%k burned down %o with Napalm." + FemaleSuicide="%o burned her pretty butt up." + MaleSuicide="%o burned his a** up." +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGun.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGun.uc index aa4d677..60b0b71 100644 --- a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGun.uc +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGun.uc @@ -1,52 +1,126 @@ -/** - * Attempt to make Husk Gun actually usefull. - */ - -class NiceHuskGun extends ScrnHuskGun; -/* -// both fire modes share the same ammo pool, so don't give ammo twice -function GiveAmmo(int m, WeaponPickup WP, bool bJustSpawned) -{ - local bool bJustSpawnedAmmo; - local int addAmount, InitialAmount; - local float AddMultiplier; - UpdateMagCapacity(Instigator.PlayerReplicationInfo); - if ( FireMode[m] != none && FireMode[m].AmmoClass != none ) - { Ammo[m] = Ammunition(Instigator.FindInventoryType(FireMode[m].AmmoClass)); bJustSpawnedAmmo = false; - if ( bNoAmmoInstances ) { if ( (FireMode[m].AmmoClass == none) || ((m != 0) && (FireMode[m].AmmoClass == FireMode[0].AmmoClass)) ) return; - InitialAmount = FireMode[m].AmmoClass.Default.InitialAmount; - if(WP!=none && WP.bThrown==true) InitialAmount = WP.AmmoAmount[m]; else { // Other change - if not thrown, give the gun a full clip MagAmmoRemaining = MagCapacity; } - if ( Ammo[m] != none ) { addamount = InitialAmount + Ammo[m].AmmoAmount; Ammo[m].Destroy(); } else addAmount = InitialAmount; - AddAmmo(addAmount,m); } else { if ( (Ammo[m] == none) && (FireMode[m].AmmoClass != none) ) { Ammo[m] = Spawn(FireMode[m].AmmoClass, Instigator); Instigator.AddInventory(Ammo[m]); bJustSpawnedAmmo = true; } else if ( (m == 0) || (FireMode[m].AmmoClass != FireMode[0].AmmoClass) ) bJustSpawnedAmmo = ( bJustSpawned || ((WP != none) && !WP.bWeaponStay) ); - // and here is the modification for instanced ammo actors - if(WP!=none && WP.bThrown==true) { addAmount = WP.AmmoAmount[m]; } else if ( bJustSpawnedAmmo ) { if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none ) { AddMultiplier = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.static.AddExtraAmmoFor(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), FireMode[m].AmmoClass); } else { AddMultiplier = 1.0; } - if (default.MagCapacity == 0) addAmount = 0; // prevent division by zero. else addAmount = Ammo[m].InitialAmount * (float(MagCapacity) / float(default.MagCapacity)) * AddMultiplier; } - //removed: WP.Class == class'BoomstickPickup' -- (c) PooSH if ( WP != none && m > 0 ) { return; } - Ammo[m].AddAmmo(addAmount); Ammo[m].GotoState(''); } - } -} -*/ -/* -simulated function bool ConsumeAmmo( int Mode, float Load, optional bool bAmountNeededIsMax ) -{ - return super.ConsumeAmmo(0, Load, bAmountNeededIsMax); -} -simulated function int AmmoAmount(int mode) -{ - return super.AmmoAmount(0); -} -*/ -/* -//v2.60: Reload speed bonus affects charge rate -simulated function bool StartFire(int Mode) -{ - local ScrnHuskGunFire f; - local KFPlayerReplicationInfo KFPRI; - if ( super.StartFire(Mode) ) { f = ScrnHuskGunFire(FireMode[Mode]); if ( Mode == 0 && f != none ) { f.MaxChargeTime = f.default.MaxChargeTime; KFPRI = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo); if ( KFPRI != none && KFPRI.ClientVeteranSkill != none) f.MaxChargeTime /= KFPRI.ClientVeteranSkill.static.GetReloadSpeedModifier(KFPRI, self); } return true; - } - return false; -} -*/ -defaultproperties -{ Weight=8.000000 FireModeClass(0)=Class'NicePack.NiceHuskGunFire' FireModeClass(1)=Class'NicePack.NiceHuskGunAltFire' PickupClass=Class'NicePack.NiceHuskGunPickup' ItemName="Husk Gun / Napalm Launcher NW" -} +/** + * Attempt to make Husk Gun actually usefull. + */ + +class NiceHuskGun extends ScrnHuskGun; +/* +// both fire modes share the same ammo pool, so don't give ammo twice +function GiveAmmo(int m, WeaponPickup WP, bool bJustSpawned) +{ + local bool bJustSpawnedAmmo; + local int addAmount, InitialAmount; + local float AddMultiplier; + UpdateMagCapacity(Instigator.PlayerReplicationInfo); + if ( FireMode[m] != none && FireMode[m].AmmoClass != none ) + { + Ammo[m] = Ammunition(Instigator.FindInventoryType(FireMode[m].AmmoClass)); + bJustSpawnedAmmo = false; + + if ( bNoAmmoInstances ) + { + if ( (FireMode[m].AmmoClass == none) || ((m != 0) && (FireMode[m].AmmoClass == FireMode[0].AmmoClass)) ) + return; + + InitialAmount = FireMode[m].AmmoClass.Default.InitialAmount; + + if(WP!=none && WP.bThrown==true) + InitialAmount = WP.AmmoAmount[m]; + else + { + // Other change - if not thrown, give the gun a full clip + MagAmmoRemaining = MagCapacity; + } + + if ( Ammo[m] != none ) + { + addamount = InitialAmount + Ammo[m].AmmoAmount; + Ammo[m].Destroy(); + } + else + addAmount = InitialAmount; + + AddAmmo(addAmount,m); + } + else + { + if ( (Ammo[m] == none) && (FireMode[m].AmmoClass != none) ) + { + Ammo[m] = Spawn(FireMode[m].AmmoClass, Instigator); + Instigator.AddInventory(Ammo[m]); + bJustSpawnedAmmo = true; + } + else if ( (m == 0) || (FireMode[m].AmmoClass != FireMode[0].AmmoClass) ) + bJustSpawnedAmmo = ( bJustSpawned || ((WP != none) && !WP.bWeaponStay) ); + + // and here is the modification for instanced ammo actors + + if(WP!=none && WP.bThrown==true) + { + addAmount = WP.AmmoAmount[m]; + } + else if ( bJustSpawnedAmmo ) + { + if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none ) + { + AddMultiplier = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.static.AddExtraAmmoFor(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), FireMode[m].AmmoClass); + } + else + { + AddMultiplier = 1.0; + } + + if (default.MagCapacity == 0) + addAmount = 0; // prevent division by zero. + else + addAmount = Ammo[m].InitialAmount * (float(MagCapacity) / float(default.MagCapacity)) * AddMultiplier; + } + + //removed: WP.Class == class'BoomstickPickup' -- (c) PooSH + if ( WP != none && m > 0 ) + { + return; + } + + Ammo[m].AddAmmo(addAmount); + Ammo[m].GotoState(''); + } + } +} +*/ +/* +simulated function bool ConsumeAmmo( int Mode, float Load, optional bool bAmountNeededIsMax ) +{ + return super.ConsumeAmmo(0, Load, bAmountNeededIsMax); +} +simulated function int AmmoAmount(int mode) +{ + return super.AmmoAmount(0); +} +*/ +/* +//v2.60: Reload speed bonus affects charge rate +simulated function bool StartFire(int Mode) +{ + local ScrnHuskGunFire f; + local KFPlayerReplicationInfo KFPRI; + if ( super.StartFire(Mode) ) { + f = ScrnHuskGunFire(FireMode[Mode]); + if ( Mode == 0 && f != none ) { + f.MaxChargeTime = f.default.MaxChargeTime; + KFPRI = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo); + if ( KFPRI != none && KFPRI.ClientVeteranSkill != none) + f.MaxChargeTime /= KFPRI.ClientVeteranSkill.static.GetReloadSpeedModifier(KFPRI, self); + } + return true; + } + return false; +} +*/ +defaultproperties +{ + Weight=8.000000 + FireModeClass(0)=Class'NicePack.NiceHuskGunFire' + FireModeClass(1)=Class'NicePack.NiceHuskGunAltFire' + PickupClass=Class'NicePack.NiceHuskGunPickup' + ItemName="Husk Gun / Napalm Launcher NW" +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAltFire.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAltFire.uc index b5c5c6c..8362973 100644 --- a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAltFire.uc +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAltFire.uc @@ -1,29 +1,33 @@ -// NAPALM THROWER -class NiceHuskGunAltFire extends ScrnHuskGunAltFire; -/* -//instant shot, without holding -function ModeHoldFire() { } -function Charge() { } -function PlayPreFire() { } -function Timer() { } -function class GetDesiredProjectileClass() -{ - return ProjectileClass; -} -function PostSpawnProjectile(Projectile P) -{ - super(KFShotgunFire).PostSpawnProjectile(P); // bypass HuskGunFire -} -simulated function bool AllowFire() -{ - return (Weapon.AmmoAmount(ThisModeNum) >= MaxChargeAmmo); -} -function ModeDoFire() -{ - if (!AllowFire()) return; Weapon.ConsumeAmmo(ThisModeNum, MaxChargeAmmo-1); // +1 will be consumed in parent function - super(KFShotgunFire).ModeDoFire(); -} -*/ -defaultproperties -{ MaxChargeAmmo=30 ProjectileClass=Class'NicePack.NiceHuskGunProjectile_Alt' -} +// NAPALM THROWER +class NiceHuskGunAltFire extends ScrnHuskGunAltFire; +/* +//instant shot, without holding +function ModeHoldFire() { } +function Charge() { } +function PlayPreFire() { } +function Timer() { } +function class GetDesiredProjectileClass() +{ + return ProjectileClass; +} +function PostSpawnProjectile(Projectile P) +{ + super(KFShotgunFire).PostSpawnProjectile(P); // bypass HuskGunFire +} +simulated function bool AllowFire() +{ + return (Weapon.AmmoAmount(ThisModeNum) >= MaxChargeAmmo); +} +function ModeDoFire() +{ + if (!AllowFire()) + return; + Weapon.ConsumeAmmo(ThisModeNum, MaxChargeAmmo-1); // +1 will be consumed in parent function + super(KFShotgunFire).ModeDoFire(); +} +*/ +defaultproperties +{ + MaxChargeAmmo=30 + ProjectileClass=Class'NicePack.NiceHuskGunProjectile_Alt' +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAmmo.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAmmo.uc index 7a0a7b9..345d83f 100644 --- a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAmmo.uc +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAmmo.uc @@ -1,4 +1,7 @@ -class NiceHuskGunAmmo extends ScrnHuskGunAmmo; -defaultproperties -{ MaxAmmo=150 InitialAmount=75 PickupClass=Class'NicePack.NiceHuskGunAmmoPickup' -} +class NiceHuskGunAmmo extends ScrnHuskGunAmmo; +defaultproperties +{ + MaxAmmo=150 + InitialAmount=75 + PickupClass=Class'NicePack.NiceHuskGunAmmoPickup' +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAmmoPickup.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAmmoPickup.uc index 557258f..f5e16e1 100644 --- a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAmmoPickup.uc +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunAmmoPickup.uc @@ -1,4 +1,5 @@ -class NiceHuskGunAmmoPickup extends ScrnHuskGunAmmoPickup; -defaultproperties -{ InventoryType=Class'NicePack.NiceHuskGunAmmo' -} +class NiceHuskGunAmmoPickup extends ScrnHuskGunAmmoPickup; +defaultproperties +{ + InventoryType=Class'NicePack.NiceHuskGunAmmo' +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunFire.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunFire.uc index d255809..2e87235 100644 --- a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunFire.uc +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunFire.uc @@ -1,93 +1,160 @@ -class NiceHuskGunFire extends ScrnHuskGunFire; -/* -var int AmmoInCharge; //current charged amount var() int MaxChargeAmmo; //maximum charge - -function Timer() -{ - //local PlayerController Player; - //consume ammo while charging - if ( HoldTime > 0.0 && !bNowWaiting && AmmoInCharge < MaxChargeAmmo && Weapon.AmmoAmount(ThisModeNum) > 0 ) { Charge(); // if (AmmoInCharge == MaxChargeAmmo) { // Player = Level.GetLocalPlayerController(); // if (Player != none) // Player.ReceiveLocalizedMessage(class'ScrnBalanceSrv.ScrnPlayerMessage',0); // } - } - super.Timer(); -} -function Charge() -{ - local int AmmoShouldConsumed; - if( HoldTime < MaxChargeTime) AmmoShouldConsumed = clamp(round(MaxChargeAmmo*HoldTime/MaxChargeTime), 1, MaxChargeAmmo); - else AmmoShouldConsumed = MaxChargeAmmo;// full charge - if (AmmoShouldConsumed != AmmoInCharge) { if (AmmoShouldConsumed - AmmoInCharge > Weapon.AmmoAmount(ThisModeNum)) AmmoShouldConsumed = Weapon.AmmoAmount(ThisModeNum) + AmmoInCharge; Weapon.ConsumeAmmo(ThisModeNum, AmmoShouldConsumed - AmmoInCharge); AmmoInCharge = AmmoShouldConsumed; ScrnHuskGun(Weapon).ChargeAmount = GetChargeAmount(); - } -} -function float GetChargeAmount() -{ - return float(AmmoInCharge) / float(MaxChargeAmmo); -} -simulated function bool AllowFire() -{ - return (Weapon.AmmoAmount(ThisModeNum) >= AmmoPerFire); -} -*/ -//overrided to restore old damage radius -//(c) PooSH -function PostSpawnProjectile(Projectile P) -{ - local HuskGunProjectile HGP; - super(KFShotgunFire).PostSpawnProjectile(P); - HGP = HuskGunProjectile(p); - if ( HGP != none ) { if( AmmoInCharge < MaxChargeAmmo ) { HGP.ImpactDamage *= AmmoInCharge; HGP.Damage *= 1.0 + GetChargeAmount(); // up to 2x damage HGP.DamageRadius *= 1.0 + 2 * GetChargeAmount();// up 2x the damage radius } else { HGP.ImpactDamage *= MaxChargeAmmo; //50*10 = 500 HGP.Damage *= 2.0; // up from 2x HGP.DamageRadius *= 3.0; // down from x3 } AmmoInCharge = 0; //reset charge after spawning a projectile ScrnHuskGun(Weapon).ChargeAmount = 0; - } -} -/* -//copy pasted and cutted out ammo consuming, because we did it in time -function ModeDoFire() -{ - local float Rec; - if (!AllowFire() && HoldTime ~= 0) return; - Spread = Default.Spread; - Rec = 1; - - if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none ) - { Spread *= KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.ModifyRecoilSpread(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), self, Rec); - } - if( !bFiringDoesntAffectMovement ) - { if (FireRate > 0.25) { Instigator.Velocity.x *= 0.1; Instigator.Velocity.y *= 0.1; } else { Instigator.Velocity.x *= 0.5; Instigator.Velocity.y *= 0.5; } - } - if (!AllowFire() && HoldTime ~= 0) return; - if (MaxHoldTime > 0.0) HoldTime = FMin(HoldTime, MaxHoldTime); - // server - if (Weapon.Role == ROLE_Authority) - { Charge(); - DoFireEffect(); HoldTime = 0; // if bot decides to stop firing, HoldTime must be reset first if ( (Instigator == none) || (Instigator.Controller == none) ) return; - if ( AIController(Instigator.Controller) != none ) AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true); - Instigator.DeactivateSpawnProtection(); - } - // client - if (Instigator.IsLocallyControlled()) - { ShakeView(); PlayFiring(); FlashMuzzleFlash(); StartMuzzleSmoke(); - } - else // server - { ServerPlayFiring(); - } - Weapon.IncrementFlashCount(ThisModeNum); - // set the next firing time. must be careful here so client and server do not get out of sync - if (bFireOnRelease) - { if (bIsFiring) NextFireTime += MaxHoldTime + FireRate; else NextFireTime = Level.TimeSeconds + FireRate; - } - else - { NextFireTime += FireRate; NextFireTime = FMax(NextFireTime, Level.TimeSeconds); - } - Load = AmmoPerFire; - HoldTime = 0; - AmmoInCharge = 0; - if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != none) - { bIsFiring = false; Weapon.PutDown(); - } - // client - if (Instigator.IsLocallyControlled()) - { HandleRecoil(Rec); - } -} -*/ -defaultproperties -{ WeakProjectileClass=Class'NicePack.NiceHuskGunProjectile_Weak' StrongProjectileClass=Class'NicePack.NiceHuskGunProjectile_Strong' AmmoClass=Class'NicePack.NiceHuskGunAmmo' ProjectileClass=Class'NicePack.NiceHuskGunProjectile' -} +class NiceHuskGunFire extends ScrnHuskGunFire; +/* +var int AmmoInCharge; //current charged amount var() int MaxChargeAmmo; //maximum charge + +function Timer() +{ + //local PlayerController Player; + //consume ammo while charging + if ( HoldTime > 0.0 && !bNowWaiting && AmmoInCharge < MaxChargeAmmo && Weapon.AmmoAmount(ThisModeNum) > 0 ) { + Charge(); + // if (AmmoInCharge == MaxChargeAmmo) { + // Player = Level.GetLocalPlayerController(); + // if (Player != none) + // Player.ReceiveLocalizedMessage(class'ScrnBalanceSrv.ScrnPlayerMessage',0); + // } + } + super.Timer(); +} +function Charge() +{ + local int AmmoShouldConsumed; + if( HoldTime < MaxChargeTime) + AmmoShouldConsumed = clamp(round(MaxChargeAmmo*HoldTime/MaxChargeTime), 1, MaxChargeAmmo); + else + AmmoShouldConsumed = MaxChargeAmmo;// full charge + if (AmmoShouldConsumed != AmmoInCharge) { + if (AmmoShouldConsumed - AmmoInCharge > Weapon.AmmoAmount(ThisModeNum)) + AmmoShouldConsumed = Weapon.AmmoAmount(ThisModeNum) + AmmoInCharge; + Weapon.ConsumeAmmo(ThisModeNum, AmmoShouldConsumed - AmmoInCharge); + AmmoInCharge = AmmoShouldConsumed; + ScrnHuskGun(Weapon).ChargeAmount = GetChargeAmount(); + } +} +function float GetChargeAmount() +{ + return float(AmmoInCharge) / float(MaxChargeAmmo); +} +simulated function bool AllowFire() +{ + return (Weapon.AmmoAmount(ThisModeNum) >= AmmoPerFire); +} +*/ +//overrided to restore old damage radius +//(c) PooSH +function PostSpawnProjectile(Projectile P) +{ + local HuskGunProjectile HGP; + super(KFShotgunFire).PostSpawnProjectile(P); + HGP = HuskGunProjectile(p); + if ( HGP != none ) { + if( AmmoInCharge < MaxChargeAmmo ) + { + HGP.ImpactDamage *= AmmoInCharge; + HGP.Damage *= 1.0 + GetChargeAmount(); // up to 2x damage + HGP.DamageRadius *= 1.0 + 2 * GetChargeAmount();// up 2x the damage radius + } + else + { + HGP.ImpactDamage *= MaxChargeAmmo; //50*10 = 500 + HGP.Damage *= 2.0; // up from 2x + HGP.DamageRadius *= 3.0; // down from x3 + } + AmmoInCharge = 0; //reset charge after spawning a projectile + ScrnHuskGun(Weapon).ChargeAmount = 0; + } +} +/* +//copy pasted and cutted out ammo consuming, because we did it in time +function ModeDoFire() +{ + local float Rec; + if (!AllowFire() && HoldTime ~= 0) + return; + Spread = Default.Spread; + Rec = 1; + + if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none ) + { + Spread *= KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.ModifyRecoilSpread(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo), self, Rec); + } + if( !bFiringDoesntAffectMovement ) + { + if (FireRate > 0.25) + { + Instigator.Velocity.x *= 0.1; + Instigator.Velocity.y *= 0.1; + } + else + { + Instigator.Velocity.x *= 0.5; + Instigator.Velocity.y *= 0.5; + } + } + if (!AllowFire() && HoldTime ~= 0) + return; + if (MaxHoldTime > 0.0) + HoldTime = FMin(HoldTime, MaxHoldTime); + // server + if (Weapon.Role == ROLE_Authority) + { + Charge(); + + DoFireEffect(); + HoldTime = 0; // if bot decides to stop firing, HoldTime must be reset first + if ( (Instigator == none) || (Instigator.Controller == none) ) + return; + + if ( AIController(Instigator.Controller) != none ) + AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true); + + Instigator.DeactivateSpawnProtection(); + } + // client + if (Instigator.IsLocallyControlled()) + { + ShakeView(); + PlayFiring(); + FlashMuzzleFlash(); + StartMuzzleSmoke(); + } + else // server + { + ServerPlayFiring(); + } + Weapon.IncrementFlashCount(ThisModeNum); + // set the next firing time. must be careful here so client and server do not get out of sync + if (bFireOnRelease) + { + if (bIsFiring) + NextFireTime += MaxHoldTime + FireRate; + else + NextFireTime = Level.TimeSeconds + FireRate; + } + else + { + NextFireTime += FireRate; + NextFireTime = FMax(NextFireTime, Level.TimeSeconds); + } + Load = AmmoPerFire; + HoldTime = 0; + AmmoInCharge = 0; + if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != none) + { + bIsFiring = false; + Weapon.PutDown(); + } + // client + if (Instigator.IsLocallyControlled()) + { + HandleRecoil(Rec); + } +} +*/ +defaultproperties +{ + WeakProjectileClass=Class'NicePack.NiceHuskGunProjectile_Weak' + StrongProjectileClass=Class'NicePack.NiceHuskGunProjectile_Strong' + AmmoClass=Class'NicePack.NiceHuskGunAmmo' + ProjectileClass=Class'NicePack.NiceHuskGunProjectile' +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunPickup.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunPickup.uc index da8bfd4..6ca8bc3 100644 --- a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunPickup.uc +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunPickup.uc @@ -1,4 +1,8 @@ -class NiceHuskGunPickup extends ScrnHuskGunPickup; -defaultproperties -{ Weight=8.000000 ItemName="Husk Gun / Napalm Launcher NW" ItemShortName="Husk Gun NW" InventoryType=Class'NicePack.NiceHuskGun' -} +class NiceHuskGunPickup extends ScrnHuskGunPickup; +defaultproperties +{ + Weight=8.000000 + ItemName="Husk Gun / Napalm Launcher NW" + ItemShortName="Husk Gun NW" + InventoryType=Class'NicePack.NiceHuskGun' +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile.uc index cc6d6b9..adfbe50 100644 --- a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile.uc +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile.uc @@ -1,74 +1,188 @@ -class NiceHuskGunProjectile extends ScrnHuskGunProjectile; -simulated function ProcessTouch(Actor Other, Vector HitLocation) -{ - local vector X; - local Vector TempHitLocation, HitNormal; - local array HitPoints; - local KFPawn HitPawn; - // Don't let it hit this player, or blow up on another player - if ( Other == none || Other == Instigator || Other.Base == Instigator ) return; - // Don't collide with bullet whip attachments - if( KFBulletWhipAttachment(Other) != none ) - { return; - } - // Don't allow hits on poeple on the same team - if( KFHumanPawn(Other) != none && Instigator != none && KFHumanPawn(Other).PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex ) - { return; - } - if( !bDud ) - { Explode(HitLocation,Normal(HitLocation-Other.Location)); - } - // Use the instigator's location if it exists. This fixes issues with - // the original location of the projectile being really far away from - // the real Origloc due to it taking a couple of milliseconds to - // replicate the location to the client and the first replicated location has - // already moved quite a bit. - if( Instigator != none ) - { OrigLoc = Instigator.Location; - } - X = Vector(Rotation); - if( Role == ROLE_Authority ) - { if( ROBulletWhipAttachment(Other) != none ) { if(!Other.Base.bDeleteMe) { Other = Instigator.HitPointTrace(TempHitLocation, HitNormal, HitLocation + (200 * X), HitPoints, HitLocation,, 1); - if( Other == none || HitPoints.Length == 0 ) return; - HitPawn = KFPawn(Other); - if (Role == ROLE_Authority) { if ( HitPawn != none ) { // Hit detection debugging /*log("Bullet hit "$HitPawn.PlayerReplicationInfo.PlayerName); HitPawn.HitStart = HitLocation; HitPawn.HitEnd = HitLocation + (65535 * X);*/ - if( !HitPawn.bDeleteMe ) HitPawn.ProcessLocationalDamage(ImpactDamage, Instigator, TempHitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType,HitPoints); - // Hit detection debugging //if( Level.NetMode == NM_Standalone) // HitPawn.DrawBoneLocation(); } } } } else { if (Pawn(Other) != none && Pawn(Other).IsHeadShot(HitLocation, X, 1.0)) { Pawn(Other).TakeDamage(ImpactDamage * HeadShotDamageMult, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType); } else { Other.TakeDamage(ImpactDamage, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType); } } - } -} -// Overrided to not use alternate burning mechanism -simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) -{ - local actor Victims; - local float damageScale, dist; - local vector dirs; - local int NumKilled; - local Pawn P; - local KFMonster KFMonsterVictim; - local KFPawn KFP; - local array CheckedPawns; - local int i; - local bool bAlreadyChecked; - //local int OldHealth; - if ( bHurtEntry ) return; - bHurtEntry = true; - foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) { // null pawn variables here just to be sure they didn't left from previous iteration // and waste another day of my life to looking for this fucking bug -- PooSH /totallyPissedOff!!! P = none; KFMonsterVictim = none; KFP = none; if(Victims == none) continue; // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if( (Victims != self) && (Victims != Instigator) &&(Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') && ExtendedZCollision(Victims)==none && KFBulletWhipAttachment(Victims)==none ) { dirs = Victims.Location - HitLocation; dist = FMax(1,VSize(dirs)); dirs = dirs/dist; damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); if ( Instigator == none || Instigator.Controller == none ) Victims.SetDelayedDamageInstigatorController( InstigatorController ); if ( Victims == LastTouched ) LastTouched = none; - P = Pawn(Victims); - if( P != none ) { for (i = 0; i < CheckedPawns.Length; i++) { if (CheckedPawns[i] == P) { bAlreadyChecked = true; break; } } - if( bAlreadyChecked ) { bAlreadyChecked = false; P = none; continue; } - if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { KFMonsterVictim = none; } - KFMonsterVictim = KFMonster(Victims); KFP = KFPawn(Victims); - if( KFMonsterVictim != none ) damageScale *= KFMonsterVictim.GetExposureTo(HitLocation); else if( KFP != none ) damageScale *= KFP.GetExposureTo(HitLocation); - CheckedPawns[CheckedPawns.Length] = P; - if ( damageScale <= 0) continue; } - Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, (damageScale * Momentum * dirs), DamageType ); - if( Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { NumKilled++; } } - } - if( Role == ROLE_Authority ) - { if( NumKilled >= 4 ) { KFGameType(Level.Game).DramaticEvent(0.05); } else if( NumKilled >= 2 ) { KFGameType(Level.Game).DramaticEvent(0.03); } - } - bHurtEntry = false; -} -defaultproperties -{ HeadShotDamageMult=1.500000 ImpactDamageType=Class'NicePack.NiceDamTypeHuskGunProjectileImpact' ImpactDamage=50 -} +class NiceHuskGunProjectile extends ScrnHuskGunProjectile; +simulated function ProcessTouch(Actor Other, Vector HitLocation) +{ + local vector X; + local Vector TempHitLocation, HitNormal; + local array HitPoints; + local KFPawn HitPawn; + // Don't let it hit this player, or blow up on another player + if ( Other == none || Other == Instigator || Other.Base == Instigator ) + return; + // Don't collide with bullet whip attachments + if( KFBulletWhipAttachment(Other) != none ) + { + return; + } + // Don't allow hits on poeple on the same team + if( KFHumanPawn(Other) != none && Instigator != none + && KFHumanPawn(Other).PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex ) + { + return; + } + if( !bDud ) + { + Explode(HitLocation,Normal(HitLocation-Other.Location)); + } + // Use the instigator's location if it exists. This fixes issues with + // the original location of the projectile being really far away from + // the real Origloc due to it taking a couple of milliseconds to + // replicate the location to the client and the first replicated location has + // already moved quite a bit. + if( Instigator != none ) + { + OrigLoc = Instigator.Location; + } + X = Vector(Rotation); + if( Role == ROLE_Authority ) + { + if( ROBulletWhipAttachment(Other) != none ) + { + if(!Other.Base.bDeleteMe) + { + Other = Instigator.HitPointTrace(TempHitLocation, HitNormal, HitLocation + (200 * X), HitPoints, HitLocation,, 1); + + if( Other == none || HitPoints.Length == 0 ) + return; + + HitPawn = KFPawn(Other); + + if (Role == ROLE_Authority) + { + if ( HitPawn != none ) + { + // Hit detection debugging + /*log("Bullet hit "$HitPawn.PlayerReplicationInfo.PlayerName); + HitPawn.HitStart = HitLocation; + HitPawn.HitEnd = HitLocation + (65535 * X);*/ + + if( !HitPawn.bDeleteMe ) + HitPawn.ProcessLocationalDamage(ImpactDamage, Instigator, TempHitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType,HitPoints); + + // Hit detection debugging + //if( Level.NetMode == NM_Standalone) + // HitPawn.DrawBoneLocation(); + } + } + } + } + else + { + if (Pawn(Other) != none && Pawn(Other).IsHeadShot(HitLocation, X, 1.0)) + { + Pawn(Other).TakeDamage(ImpactDamage * HeadShotDamageMult, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType); + } + else + { + Other.TakeDamage(ImpactDamage, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType); + } + } + } +} +// Overrided to not use alternate burning mechanism +simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) +{ + local actor Victims; + local float damageScale, dist; + local vector dirs; + local int NumKilled; + local Pawn P; + local KFMonster KFMonsterVictim; + local KFPawn KFP; + local array CheckedPawns; + local int i; + local bool bAlreadyChecked; + //local int OldHealth; + if ( bHurtEntry ) + return; + bHurtEntry = true; + foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) { + // null pawn variables here just to be sure they didn't left from previous iteration + // and waste another day of my life to looking for this fucking bug -- PooSH /totallyPissedOff!!! + P = none; + KFMonsterVictim = none; + KFP = none; + if(Victims == none) + continue; + // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag + if( (Victims != self) && (Victims != Instigator) &&(Hurtwall != Victims) + && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') + && ExtendedZCollision(Victims)==none && KFBulletWhipAttachment(Victims)==none ) + { + dirs = Victims.Location - HitLocation; + dist = FMax(1,VSize(dirs)); + dirs = dirs/dist; + damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); + if ( Instigator == none || Instigator.Controller == none ) + Victims.SetDelayedDamageInstigatorController( InstigatorController ); + if ( Victims == LastTouched ) + LastTouched = none; + + P = Pawn(Victims); + + if( P != none ) { + for (i = 0; i < CheckedPawns.Length; i++) { + if (CheckedPawns[i] == P) { + bAlreadyChecked = true; + break; + } + } + + if( bAlreadyChecked ) + { + bAlreadyChecked = false; + P = none; + continue; + } + + if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { + KFMonsterVictim = none; + } + + KFMonsterVictim = KFMonster(Victims); + KFP = KFPawn(Victims); + + if( KFMonsterVictim != none ) + damageScale *= KFMonsterVictim.GetExposureTo(HitLocation); + else if( KFP != none ) + damageScale *= KFP.GetExposureTo(HitLocation); + + CheckedPawns[CheckedPawns.Length] = P; + + if ( damageScale <= 0) + continue; + } + + Victims.TakeDamage + ( + damageScale * DamageAmount, + Instigator, + Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, + (damageScale * Momentum * dirs), + DamageType + ); + + if( Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) + { + NumKilled++; + } + } + } + if( Role == ROLE_Authority ) + { + if( NumKilled >= 4 ) + { + KFGameType(Level.Game).DramaticEvent(0.05); + } + else if( NumKilled >= 2 ) + { + KFGameType(Level.Game).DramaticEvent(0.03); + } + } + bHurtEntry = false; +} +defaultproperties +{ + HeadShotDamageMult=1.500000 + ImpactDamageType=Class'NicePack.NiceDamTypeHuskGunProjectileImpact' + ImpactDamage=50 +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Alt.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Alt.uc index 08892e7..cbaf5e8 100644 --- a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Alt.uc +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Alt.uc @@ -1,43 +1,60 @@ -class NiceHuskGunProjectile_Alt extends NiceHuskGunProjectile_Strong; -/* -//can't be destroyed by Siren's scream -//Explode only by heavy explosive damage -function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, optional int HitIndex) -{ - if ( !bDud && !bHasExploded && Damage >= 100 && class(damageType) != none && class(damageType).default.bIsExplosive ) { Explode(HitLocation, vect(0,0,0)); - } -} -*/ -/* -simulated function float MosterDamageMult( KFMonster Victim ) -{ - float mult; - mult = super.MosterDamageMult(); - // prevent big monsters from 1-shot be killed by hitting all projectiles - if ( KFMonsterVictim.bBurnified && KFMonsterVictim.default.Health >= 1000 ) mult *= 0.5; - return mult; -} -*/ -/* -// copy-pasted with deletion of impact damage -simulated function ProcessTouch(Actor Other, Vector HitLocation) -{ - // Don't let it hit this player, or blow up on another player - if ( Other == none || Other == Instigator || Other.Base == Instigator ) return; - // Don't collide with bullet whip attachments - if( ROBulletWhipAttachment(Other) != none ) - { return; - } - // Don't allow hits on people on the same team - //if( KFHumanPawn(Other) != none && Instigator != none - // && KFHumanPawn(Other).PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex ) - //{ - // return; - //} - if( !bDud && !bHasExploded ) - { Explode(HitLocation,Normal(HitLocation-Other.Location)); - } -}*/ -defaultproperties -{ HeadShotDamageMult=1.000000 ExplosionSoundVolume=1.000000 ImpactDamageType=Class'NicePack.NiceDamTypeHuskGun_Alt' ImpactDamage=0 AmbientVolumeScale=1.000000 Speed=750.000000 MaxSpeed=1000.000000 Damage=35.000000 DamageRadius=500.000000 MyDamageType=Class'NicePack.NiceDamTypeHuskGun_Alt' LifeSpan=5.000000 -} +class NiceHuskGunProjectile_Alt extends NiceHuskGunProjectile_Strong; +/* +//can't be destroyed by Siren's scream +//Explode only by heavy explosive damage +function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, optional int HitIndex) +{ + if ( !bDud && !bHasExploded && Damage >= 100 && class(damageType) != none + && class(damageType).default.bIsExplosive ) { + Explode(HitLocation, vect(0,0,0)); + } +} +*/ +/* +simulated function float MosterDamageMult( KFMonster Victim ) +{ + float mult; + mult = super.MosterDamageMult(); + // prevent big monsters from 1-shot be killed by hitting all projectiles + if ( KFMonsterVictim.bBurnified && KFMonsterVictim.default.Health >= 1000 ) + mult *= 0.5; + return mult; +} +*/ +/* +// copy-pasted with deletion of impact damage +simulated function ProcessTouch(Actor Other, Vector HitLocation) +{ + // Don't let it hit this player, or blow up on another player + if ( Other == none || Other == Instigator || Other.Base == Instigator ) + return; + // Don't collide with bullet whip attachments + if( ROBulletWhipAttachment(Other) != none ) + { + return; + } + // Don't allow hits on people on the same team + //if( KFHumanPawn(Other) != none && Instigator != none + // && KFHumanPawn(Other).PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex ) + //{ + // return; + //} + if( !bDud && !bHasExploded ) + { + Explode(HitLocation,Normal(HitLocation-Other.Location)); + } +}*/ +defaultproperties +{ + HeadShotDamageMult=1.000000 + ExplosionSoundVolume=1.000000 + ImpactDamageType=Class'NicePack.NiceDamTypeHuskGun_Alt' + ImpactDamage=0 + AmbientVolumeScale=1.000000 + Speed=750.000000 + MaxSpeed=1000.000000 + Damage=35.000000 + DamageRadius=500.000000 + MyDamageType=Class'NicePack.NiceDamTypeHuskGun_Alt' + LifeSpan=5.000000 +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Strong.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Strong.uc index 400a858..a11e812 100644 --- a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Strong.uc +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Strong.uc @@ -1,4 +1,8 @@ -class NiceHuskGunProjectile_Strong extends NiceHuskGunProjectile; -defaultproperties -{ ExplosionEmitter=Class'KFMod.FlameImpact_Strong' FlameTrailEmitterClass=Class'KFMod.FlameThrowerHusk_Strong' ExplosionSoundVolume=2.000000 ExplosionDecal=Class'KFMod.FlameThrowerBurnMark_Large' -} +class NiceHuskGunProjectile_Strong extends NiceHuskGunProjectile; +defaultproperties +{ + ExplosionEmitter=Class'KFMod.FlameImpact_Strong' + FlameTrailEmitterClass=Class'KFMod.FlameThrowerHusk_Strong' + ExplosionSoundVolume=2.000000 + ExplosionDecal=Class'KFMod.FlameThrowerBurnMark_Large' +} diff --git a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Weak.uc b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Weak.uc index 80d434b..b6b6adb 100644 --- a/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Weak.uc +++ b/sources/Weapons/Playable/Incendiary/HuskGun/NiceHuskGunProjectile_Weak.uc @@ -1,4 +1,8 @@ -class NiceHuskGunProjectile_Weak extends NiceHuskGunProjectile; -defaultproperties -{ ExplosionEmitter=Class'KFMod.FlameImpact_Weak' FlameTrailEmitterClass=Class'KFMod.FlameThrowerHusk_Weak' ExplosionSoundVolume=1.250000 ExplosionDecal=Class'KFMod.FlameThrowerBurnMark_Small' -} +class NiceHuskGunProjectile_Weak extends NiceHuskGunProjectile; +defaultproperties +{ + ExplosionEmitter=Class'KFMod.FlameImpact_Weak' + FlameTrailEmitterClass=Class'KFMod.FlameThrowerHusk_Weak' + ExplosionSoundVolume=1.250000 + ExplosionDecal=Class'KFMod.FlameThrowerBurnMark_Small' +} diff --git a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79Inc.uc b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79Inc.uc index 9d40bc0..a8a85b5 100644 --- a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79Inc.uc +++ b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79Inc.uc @@ -1,5 +1,8 @@ -// Incendiary M79 -class NiceM79Inc extends ScrnM79Inc; -defaultproperties -{ FireModeClass(0)=Class'NicePack.NiceM79IncFire' PickupClass=Class'NicePack.NiceM79IncPickup' ItemName="M79 Incendiary NW" -} +// Incendiary M79 +class NiceM79Inc extends ScrnM79Inc; +defaultproperties +{ + FireModeClass(0)=Class'NicePack.NiceM79IncFire' + PickupClass=Class'NicePack.NiceM79IncPickup' + ItemName="M79 Incendiary NW" +} diff --git a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncAmmo.uc b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncAmmo.uc index 86021d1..fbd2aa3 100644 --- a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncAmmo.uc +++ b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncAmmo.uc @@ -1,4 +1,6 @@ -class NiceM79IncAmmo extends ScrnM79IncAmmo; -defaultproperties -{ PickupClass=Class'NicePack.NiceM79IncAmmoPickup' ItemName="M79 Incendiary Grenades NW" -} +class NiceM79IncAmmo extends ScrnM79IncAmmo; +defaultproperties +{ + PickupClass=Class'NicePack.NiceM79IncAmmoPickup' + ItemName="M79 Incendiary Grenades NW" +} diff --git a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncAmmoPickup.uc b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncAmmoPickup.uc index 9c469e4..130cb66 100644 --- a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncAmmoPickup.uc +++ b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncAmmoPickup.uc @@ -1,4 +1,6 @@ -class NiceM79IncAmmoPickup extends ScrnM79IncAmmoPickup; -defaultproperties -{ InventoryType=Class'NicePack.NiceM79IncAmmo' PickupMessage="M79 Incendiary Grenades NW" -} +class NiceM79IncAmmoPickup extends ScrnM79IncAmmoPickup; +defaultproperties +{ + InventoryType=Class'NicePack.NiceM79IncAmmo' + PickupMessage="M79 Incendiary Grenades NW" +} diff --git a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncFire.uc b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncFire.uc index 11007bf..07f91d1 100644 --- a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncFire.uc +++ b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncFire.uc @@ -1,4 +1,6 @@ -class NiceM79IncFire extends ScrnM79IncFire; -defaultproperties -{ AmmoClass=Class'NicePack.NiceM79IncAmmo' ProjectileClass=Class'NicePack.NiceM79IncGrenadeProjectile' -} +class NiceM79IncFire extends ScrnM79IncFire; +defaultproperties +{ + AmmoClass=Class'NicePack.NiceM79IncAmmo' + ProjectileClass=Class'NicePack.NiceM79IncGrenadeProjectile' +} diff --git a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncGrenadeProjectile.uc b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncGrenadeProjectile.uc index f6ae6d4..8d06288 100644 --- a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncGrenadeProjectile.uc +++ b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncGrenadeProjectile.uc @@ -1,72 +1,191 @@ -class NiceM79IncGrenadeProjectile extends ScrnM79IncGrenadeProjectile; -#exec OBJ LOAD FILE=KF_GrenadeSnd.uax -simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) -{ - local actor Victims; - local float damageScale, dist; - local vector dirs; - local int NumKilled; - local KFMonster KFMonsterVictim; - local Pawn P; - local KFPawn KFP; - local array CheckedPawns; - local int i; - local bool bAlreadyChecked; - - if ( bHurtEntry ) return; - bHurtEntry = true; - foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) - { // null pawn variables here just to be sure they didn't left from previous iteration // and waste another day of my life to looking for this fucking bug -- PooSH /totallyPissedOff!!! P = none; KFMonsterVictim = none; KFP = none; // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') && ExtendedZCollision(Victims)==none ) { dirs = Victims.Location - HitLocation; dist = FMax(1,VSize(dirs)); dirs = dirs/dist; damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); if ( Instigator == none || Instigator.Controller == none ) Victims.SetDelayedDamageInstigatorController( InstigatorController ); if ( Victims == LastTouched ) LastTouched = none; - P = Pawn(Victims); - if( P != none ) { for (i = 0; i < CheckedPawns.Length; i++) { if (CheckedPawns[i] == P) { bAlreadyChecked = true; break; } } - if( bAlreadyChecked ) { bAlreadyChecked = false; P = none; // and if you forget to re-null it somewhere?!! and then look for a bug during 2 days?!! Damned Tripwire, I hate you so much continue; } - KFMonsterVictim = KFMonster(Victims); - if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { KFMonsterVictim = none; } - KFP = KFPawn(Victims); - if( KFMonsterVictim != none ) { damageScale *= KFMonsterVictim.GetExposureTo(HitLocation/*Location + 15 * -Normal(PhysicsVolume.Gravity)*/); } else if( KFP != none ) { damageScale *= KFP.GetExposureTo(HitLocation/*Location + 15 * -Normal(PhysicsVolume.Gravity)*/); } - CheckedPawns[CheckedPawns.Length] = P; - if ( damageScale <= 0) { P = none; continue; } else { //Victims = P; P = none; } } - Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, (damageScale * Momentum * dirs), DamageType ); if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); - if( Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { NumKilled++; } } - } - /* - if ( (LastTouched != none) && (LastTouched != self) && (LastTouched.Role == ROLE_Authority) && !LastTouched.IsA('FluidSurfaceInfo') ) - { Victims = LastTouched; LastTouched = none; dirs = Victims.Location - HitLocation; dist = FMax(1,VSize(dirs)); dirs = dirs/dist; damageScale = FMax(Victims.CollisionRadius/(Victims.CollisionRadius + Victims.CollisionHeight),1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius)); if ( Instigator == none || Instigator.Controller == none ) Victims.SetDelayedDamageInstigatorController(InstigatorController); Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, (damageScale * Momentum * dirs), DamageType ); if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); - } - */ - if( Role == ROLE_Authority ) - { if( NumKilled >= 4 ) { KFGameType(Level.Game).DramaticEvent(0.05); } else if( NumKilled >= 2 ) { KFGameType(Level.Game).DramaticEvent(0.03); } - } - bHurtEntry = false; -} - -simulated function ProcessTouch(Actor Other, Vector HitLocation) -{ - // Don't let it hit this player, or blow up on another player - if ( Other == none || Other == Instigator || Other.Base == Instigator ) return; - // Don't collide with bullet whip attachments - if( KFBulletWhipAttachment(Other) != none ) - { return; - } - // Don't allow hits on people on the same team - except hardcore mode - if( !class'ScrnBalance'.default.Mut.bHardcore && KFHumanPawn(Other) != none && Instigator != none && KFHumanPawn(Other).PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex ) - { return; - } - // Use the instigator's location if it exists. This fixes issues with - // the original location of the projectile being really far away from - // the real Origloc due to it taking a couple of milliseconds to - // replicate the location to the client and the first replicated location has - // already moved quite a bit. - if( Instigator != none ) - { OrigLoc = Instigator.Location; - } - if( !bDud && ((VSizeSquared(Location - OrigLoc) < ArmDistSquared) || OrigLoc == vect(0,0,0)) ) - { if( Role == ROLE_Authority ) { AmbientSound=none; PlaySound(Sound'ProjectileSounds.PTRD_deflect04',,2.0); Other.TakeDamage( ImpactDamage, Instigator, HitLocation, Normal(Velocity), ImpactDamageType ); } bDud = true; Velocity = vect(0,0,0); LifeSpan=1.0; SetPhysics(PHYS_Falling); - } - if( !bDud ) - { Explode(HitLocation,Normal(HitLocation-Other.Location)); - } -} -defaultproperties -{ MyDamageType=Class'NicePack.NiceDamTypeFlameNade' -} +class NiceM79IncGrenadeProjectile extends ScrnM79IncGrenadeProjectile; +#exec OBJ LOAD FILE=KF_GrenadeSnd.uax +simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) +{ + local actor Victims; + local float damageScale, dist; + local vector dirs; + local int NumKilled; + local KFMonster KFMonsterVictim; + local Pawn P; + local KFPawn KFP; + local array CheckedPawns; + local int i; + local bool bAlreadyChecked; + + if ( bHurtEntry ) + return; + bHurtEntry = true; + foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) + { + // null pawn variables here just to be sure they didn't left from previous iteration + // and waste another day of my life to looking for this fucking bug -- PooSH /totallyPissedOff!!! + P = none; + KFMonsterVictim = none; + KFP = none; + // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag + if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') + && ExtendedZCollision(Victims)==none ) + { + dirs = Victims.Location - HitLocation; + dist = FMax(1,VSize(dirs)); + dirs = dirs/dist; + damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); + if ( Instigator == none || Instigator.Controller == none ) + Victims.SetDelayedDamageInstigatorController( InstigatorController ); + if ( Victims == LastTouched ) + LastTouched = none; + + P = Pawn(Victims); + + if( P != none ) + { + for (i = 0; i < CheckedPawns.Length; i++) + { + if (CheckedPawns[i] == P) + { + bAlreadyChecked = true; + break; + } + } + + if( bAlreadyChecked ) + { + bAlreadyChecked = false; + P = none; // and if you forget to re-null it somewhere?!! and then look for a bug during 2 days?!! Damned Tripwire, I hate you so much + continue; + } + + KFMonsterVictim = KFMonster(Victims); + + if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) + { + KFMonsterVictim = none; + } + + KFP = KFPawn(Victims); + + if( KFMonsterVictim != none ) + { + damageScale *= KFMonsterVictim.GetExposureTo(HitLocation/*Location + 15 * -Normal(PhysicsVolume.Gravity)*/); + } + else if( KFP != none ) + { + damageScale *= KFP.GetExposureTo(HitLocation/*Location + 15 * -Normal(PhysicsVolume.Gravity)*/); + } + + CheckedPawns[CheckedPawns.Length] = P; + + if ( damageScale <= 0) + { + P = none; + continue; + } + else + { + //Victims = P; + P = none; + } + } + + Victims.TakeDamage + ( + damageScale * DamageAmount, + Instigator, + Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, + (damageScale * Momentum * dirs), + DamageType + ); + if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) + Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); + + if( Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) + { + NumKilled++; + } + } + } + /* + if ( (LastTouched != none) && (LastTouched != self) && (LastTouched.Role == ROLE_Authority) && !LastTouched.IsA('FluidSurfaceInfo') ) + { + Victims = LastTouched; + LastTouched = none; + dirs = Victims.Location - HitLocation; + dist = FMax(1,VSize(dirs)); + dirs = dirs/dist; + damageScale = FMax(Victims.CollisionRadius/(Victims.CollisionRadius + Victims.CollisionHeight),1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius)); + if ( Instigator == none || Instigator.Controller == none ) + Victims.SetDelayedDamageInstigatorController(InstigatorController); + Victims.TakeDamage + ( + damageScale * DamageAmount, + Instigator, + Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, + (damageScale * Momentum * dirs), + DamageType + ); + if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) + Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); + } + */ + if( Role == ROLE_Authority ) + { + if( NumKilled >= 4 ) + { + KFGameType(Level.Game).DramaticEvent(0.05); + } + else if( NumKilled >= 2 ) + { + KFGameType(Level.Game).DramaticEvent(0.03); + } + } + bHurtEntry = false; +} + +simulated function ProcessTouch(Actor Other, Vector HitLocation) +{ + // Don't let it hit this player, or blow up on another player + if ( Other == none || Other == Instigator || Other.Base == Instigator ) + return; + // Don't collide with bullet whip attachments + if( KFBulletWhipAttachment(Other) != none ) + { + return; + } + // Don't allow hits on people on the same team - except hardcore mode + if( !class'ScrnBalance'.default.Mut.bHardcore && KFHumanPawn(Other) != none && Instigator != none + && KFHumanPawn(Other).PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex ) + { + return; + } + // Use the instigator's location if it exists. This fixes issues with + // the original location of the projectile being really far away from + // the real Origloc due to it taking a couple of milliseconds to + // replicate the location to the client and the first replicated location has + // already moved quite a bit. + if( Instigator != none ) + { + OrigLoc = Instigator.Location; + } + if( !bDud && ((VSizeSquared(Location - OrigLoc) < ArmDistSquared) || OrigLoc == vect(0,0,0)) ) + { + if( Role == ROLE_Authority ) + { + AmbientSound=none; + PlaySound(Sound'ProjectileSounds.PTRD_deflect04',,2.0); + Other.TakeDamage( ImpactDamage, Instigator, HitLocation, Normal(Velocity), ImpactDamageType ); + } + bDud = true; + Velocity = vect(0,0,0); + LifeSpan=1.0; + SetPhysics(PHYS_Falling); + } + if( !bDud ) + { + Explode(HitLocation,Normal(HitLocation-Other.Location)); + } +} +defaultproperties +{ + MyDamageType=Class'NicePack.NiceDamTypeFlameNade' +} diff --git a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncPickup.uc b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncPickup.uc index 3f0f6da..b3d89d9 100644 --- a/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncPickup.uc +++ b/sources/Weapons/Playable/Incendiary/M79Inc/NiceM79IncPickup.uc @@ -1,4 +1,8 @@ -class NiceM79IncPickup extends ScrnM79IncPickup; -defaultproperties -{ ItemName="M79 Incendiary NW" ItemShortName="M79 Inc NW" InventoryType=Class'NicePack.NiceM79Inc' PickupMessage="You got the M79 Incendiary Grenade Launcher NW." -} +class NiceM79IncPickup extends ScrnM79IncPickup; +defaultproperties +{ + ItemName="M79 Incendiary NW" + ItemShortName="M79 Inc NW" + InventoryType=Class'NicePack.NiceM79Inc' + PickupMessage="You got the M79 Incendiary Grenade Launcher NW." +} diff --git a/sources/Weapons/Playable/Incendiary/MAC10/NiceDamTypeMAC10Z.uc b/sources/Weapons/Playable/Incendiary/MAC10/NiceDamTypeMAC10Z.uc index b0757e7..4c16841 100644 --- a/sources/Weapons/Playable/Incendiary/MAC10/NiceDamTypeMAC10Z.uc +++ b/sources/Weapons/Playable/Incendiary/MAC10/NiceDamTypeMAC10Z.uc @@ -1,5 +1,9 @@ -class NiceDamTypeMAC10Z extends NiceDamTypeFire - abstract; -defaultproperties -{ heatPart=0.150000 bSniperWeapon=True bCheckForHeadShots=True WeaponClass=Class'NicePack.NiceMAC10Z' -} +class NiceDamTypeMAC10Z extends NiceDamTypeFire + abstract; +defaultproperties +{ + heatPart=0.150000 + bSniperWeapon=True + bCheckForHeadShots=True + WeaponClass=Class'NicePack.NiceMAC10Z' +} diff --git a/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Ammo.uc b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Ammo.uc index 44ea829..a1da611 100644 --- a/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Ammo.uc +++ b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Ammo.uc @@ -1,5 +1,13 @@ -class NiceMAC10Ammo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceMAC10Pickup' AmmoPickupAmount=30 MaxAmmo=300 InitialAmount=75 PickupClass=Class'NicePack.NiceMAC10AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="MAC-10 bullets" -} +class NiceMAC10Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceMAC10Pickup' + AmmoPickupAmount=30 + MaxAmmo=300 + InitialAmount=75 + PickupClass=Class'NicePack.NiceMAC10AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="MAC-10 bullets" +} diff --git a/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10AmmoPickup.uc b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10AmmoPickup.uc index 29c2f86..12d55e7 100644 --- a/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10AmmoPickup.uc +++ b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10AmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceMAC10AmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=30 InventoryType=Class'NicePack.NiceMAC10Ammo' PickupMessage="Rounds .45 cal" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceMAC10AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=30 + InventoryType=Class'NicePack.NiceMAC10Ammo' + PickupMessage="Rounds .45 cal" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Fire.uc b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Fire.uc index 9dca348..ccd893e 100644 --- a/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Fire.uc +++ b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Fire.uc @@ -1,4 +1,33 @@ -class NiceMAC10Fire extends NiceHighROFFire; -defaultproperties -{ FireEndSoundRef="KF_MAC10MPSnd.MAC10_Fire_Loop_End_M" FireEndStereoSoundRef="KF_MAC10MPSnd.MAC10_Fire_Loop_End_S" AmbientFireSoundRef="KF_MAC10MPSnd.MAC10_Fire_Loop" ProjectileSpeed=18300.000000 RecoilRate=0.050000 maxVerticalRecoilAngle=150 maxHorizontalRecoilAngle=100 RecoilVelocityScale=1.500000 ShellEjectClass=Class'ROEffects.KFShellEjectMac' ShellEjectBoneName="Mac11_Ejector" bRandomPitchFireSound=False FireSoundRef="KF_MAC10MPSnd.MAC10_Silenced_Fire" StereoFireSoundRef="KF_MAC10MPSnd.MAC10_Silenced_FireST" NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" DamageType=Class'NicePack.NiceDamTypeMAC10Z' DamageMin=36 DamageMax=36 Momentum=6500.000000 FireRate=0.052000 AmmoClass=Class'NicePack.NiceMAC10Ammo' ShakeRotMag=(X=35.000000,Y=35.000000,Z=200.000000) ShakeRotRate=(X=8000.000000,Y=8000.000000,Z=8000.000000) ShakeRotTime=3.000000 ShakeOffsetMag=(X=4.500000,Y=2.800000,Z=5.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=35.000000 -} +class NiceMAC10Fire extends NiceHighROFFire; +defaultproperties +{ + FireEndSoundRef="KF_MAC10MPSnd.MAC10_Fire_Loop_End_M" + FireEndStereoSoundRef="KF_MAC10MPSnd.MAC10_Fire_Loop_End_S" + AmbientFireSoundRef="KF_MAC10MPSnd.MAC10_Fire_Loop" + ProjectileSpeed=18300.000000 + RecoilRate=0.050000 + maxVerticalRecoilAngle=150 + maxHorizontalRecoilAngle=100 + RecoilVelocityScale=1.500000 + ShellEjectClass=Class'ROEffects.KFShellEjectMac' + ShellEjectBoneName="Mac11_Ejector" + bRandomPitchFireSound=False + FireSoundRef="KF_MAC10MPSnd.MAC10_Silenced_Fire" + StereoFireSoundRef="KF_MAC10MPSnd.MAC10_Silenced_FireST" + NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" + DamageType=Class'NicePack.NiceDamTypeMAC10Z' + DamageMin=36 + DamageMax=36 + Momentum=6500.000000 + FireRate=0.052000 + AmmoClass=Class'NicePack.NiceMAC10Ammo' + ShakeRotMag=(X=35.000000,Y=35.000000,Z=200.000000) + ShakeRotRate=(X=8000.000000,Y=8000.000000,Z=8000.000000) + ShakeRotTime=3.000000 + ShakeOffsetMag=(X=4.500000,Y=2.800000,Z=5.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.250000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' + aimerror=35.000000 +} diff --git a/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Pickup.uc b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Pickup.uc index d5a1c56..f7aaa90 100644 --- a/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Pickup.uc +++ b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Pickup.uc @@ -1,4 +1,27 @@ -class NiceMAC10Pickup extends NiceWeaponPickup; -defaultproperties -{ bBackupWeapon=True crossPerkIndecies(0)=2 Weight=3.000000 cost=200 AmmoCost=10 BuyClipSize=30 PowerValue=30 SpeedValue=98 RangeValue=40 Description="A highly compact machine pistol. Can be fired in semi or full auto." ItemName="MAC-10" ItemShortName="MAC-10" AmmoItemName=".45 Cal" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=5 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceMAC10Z' PickupMessage="You got the MAC-10" PickupSound=Sound'KF_MAC10MPSnd.MAC10_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups2_Trip.Supers.MAC10_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceMAC10Pickup extends NiceWeaponPickup; +defaultproperties +{ + bBackupWeapon=True + crossPerkIndecies(0)=2 + Weight=3.000000 + cost=200 + AmmoCost=10 + BuyClipSize=30 + PowerValue=30 + SpeedValue=98 + RangeValue=40 + Description="A highly compact machine pistol. Can be fired in semi or full auto." + ItemName="MAC-10" + ItemShortName="MAC-10" + AmmoItemName=".45 Cal" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=5 + EquipmentCategoryID=3 + InventoryType=Class'NicePack.NiceMAC10Z' + PickupMessage="You got the MAC-10" + PickupSound=Sound'KF_MAC10MPSnd.MAC10_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups2_Trip.Supers.MAC10_Pickup' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Z.uc b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Z.uc index 750f324..13bb90d 100644 --- a/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Z.uc +++ b/sources/Weapons/Playable/Incendiary/MAC10/NiceMAC10Z.uc @@ -1,9 +1,58 @@ -class NiceMAC10Z extends NiceWeapon; -#exec OBJ LOAD FILE=KillingFloorHUD.utx -#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax -simulated function AltFire(float F){ - DoToggle(); -} -defaultproperties -{ reloadPreEndFrame=0.115000 reloadEndFrame=0.538000 reloadChargeEndFrame=0.750000 reloadMagStartFrame=0.288000 reloadChargeStartFrame=0.644000 MagazineBone="Mac11_Mag" MagCapacity=30 ReloadRate=3.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 FlashBoneName="tipS" WeaponReloadAnim="Reload_Mac10" Weight=3.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=60.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Mac_10' bIsTier2Weapon=True MeshRef="KF_Weapons2_Trip.Mac10_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.Special.MAC10_cmb" SkinRefs(1)="KF_Weapons2_Trip_T.Special.MAC10_SIL_cmb" SelectSoundRef="KF_MAC10MPSnd.MAC10_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.Mac_10_Unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Mac_10" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceMAC10Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="A highly compact machine pistol. Can be fired in semi or full auto." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=75 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=6 PickupClass=Class'NicePack.NiceMAC10Pickup' PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'KFMod.MAC10Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="MAC10" TransientSoundVolume=1.250000 -} +class NiceMAC10Z extends NiceWeapon; +#exec OBJ LOAD FILE=KillingFloorHUD.utx +#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax +simulated function AltFire(float F){ + DoToggle(); +} +defaultproperties +{ + reloadPreEndFrame=0.115000 + reloadEndFrame=0.538000 + reloadChargeEndFrame=0.750000 + reloadMagStartFrame=0.288000 + reloadChargeStartFrame=0.644000 + MagazineBone="Mac11_Mag" + MagCapacity=30 + ReloadRate=3.000000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + FlashBoneName="tipS" + WeaponReloadAnim="Reload_Mac10" + Weight=3.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=60.000000 + SleeveNum=2 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Mac_10' + bIsTier2Weapon=True + MeshRef="KF_Weapons2_Trip.Mac10_Trip" + SkinRefs(0)="KF_Weapons2_Trip_T.Special.MAC10_cmb" + SkinRefs(1)="KF_Weapons2_Trip_T.Special.MAC10_SIL_cmb" + SelectSoundRef="KF_MAC10MPSnd.MAC10_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.Mac_10_Unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Mac_10" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=32.000000 + FireModeClass(0)=Class'NicePack.NiceMAC10Fire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="A highly compact machine pistol. Can be fired in semi or full auto." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=55.000000 + Priority=75 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=3 + GroupOffset=6 + PickupClass=Class'NicePack.NiceMAC10Pickup' + PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-6.000000) + BobDamping=6.000000 + AttachmentClass=Class'KFMod.MAC10Attachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="MAC10" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtecta.uc b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtecta.uc index e6da9ac..fe61649 100644 --- a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtecta.uc +++ b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtecta.uc @@ -1,15 +1,19 @@ -class NiceProtecta extends Protecta; -// Use alt fire to switch fire modes -simulated function AltFire(float F) -{ - if(ReadyToFire(0)) - { DoToggle(); - } -} -exec function SwitchModes() -{ - DoToggle(); -} -defaultproperties -{ FireModeClass(0)=Class'NicePack.NiceProtectaFire' PickupClass=Class'NicePack.NiceProtectaPickup' ItemName="Flare Shotgun 'Protecta' NW" -} +class NiceProtecta extends Protecta; +// Use alt fire to switch fire modes +simulated function AltFire(float F) +{ + if(ReadyToFire(0)) + { + DoToggle(); + } +} +exec function SwitchModes() +{ + DoToggle(); +} +defaultproperties +{ + FireModeClass(0)=Class'NicePack.NiceProtectaFire' + PickupClass=Class'NicePack.NiceProtectaPickup' + ItemName="Flare Shotgun 'Protecta' NW" +} diff --git a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaAmmo.uc b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaAmmo.uc index 70903b9..6cc4377 100644 --- a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaAmmo.uc +++ b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaAmmo.uc @@ -1,4 +1,5 @@ -class NiceProtectaAmmo extends ProtectaAmmo; -defaultproperties -{ PickupClass=Class'NicePack.NiceProtectaAmmoPickup' -} +class NiceProtectaAmmo extends ProtectaAmmo; +defaultproperties +{ + PickupClass=Class'NicePack.NiceProtectaAmmoPickup' +} diff --git a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaAmmoPickup.uc b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaAmmoPickup.uc index 8974252..f037b96 100644 --- a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaAmmoPickup.uc +++ b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaAmmoPickup.uc @@ -1,4 +1,5 @@ -class NiceProtectaAmmoPickup extends ProtectaAmmoPickup; -defaultproperties -{ InventoryType=Class'NicePack.NiceProtectaAmmo' -} +class NiceProtectaAmmoPickup extends ProtectaAmmoPickup; +defaultproperties +{ + InventoryType=Class'NicePack.NiceProtectaAmmo' +} diff --git a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaFire.uc b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaFire.uc index c87fca8..312707c 100644 --- a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaFire.uc +++ b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaFire.uc @@ -1,15 +1,24 @@ -class NiceProtectaFire extends ProtectaFire; -simulated function bool AllowFire() -{ - if( KFWeapon(Weapon).bIsReloading && KFWeapon(Weapon).MagAmmoRemaining < 1) return false; - if(KFPawn(Instigator).SecondaryItem!=none) return false; - if( KFPawn(Instigator).bThrowingNade ) return false; - if( Level.TimeSeconds - LastClickTime>FireRate ) - { LastClickTime = Level.TimeSeconds; - } - if( KFWeapon(Weapon).MagAmmoRemaining<1 ) return false; - return super(WeaponFire).AllowFire(); -} -defaultproperties -{ maxVerticalRecoilAngle=1000 maxHorizontalRecoilAngle=300 AmmoClass=Class'NicePack.NiceProtectaAmmo' ProjectileClass=Class'NicePack.NiceProtectaFlare' -} +class NiceProtectaFire extends ProtectaFire; +simulated function bool AllowFire() +{ + if( KFWeapon(Weapon).bIsReloading && KFWeapon(Weapon).MagAmmoRemaining < 1) + return false; + if(KFPawn(Instigator).SecondaryItem!=none) + return false; + if( KFPawn(Instigator).bThrowingNade ) + return false; + if( Level.TimeSeconds - LastClickTime>FireRate ) + { + LastClickTime = Level.TimeSeconds; + } + if( KFWeapon(Weapon).MagAmmoRemaining<1 ) + return false; + return super(WeaponFire).AllowFire(); +} +defaultproperties +{ + maxVerticalRecoilAngle=1000 + maxHorizontalRecoilAngle=300 + AmmoClass=Class'NicePack.NiceProtectaAmmo' + ProjectileClass=Class'NicePack.NiceProtectaFlare' +} diff --git a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaFlare.uc b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaFlare.uc index 82eaa33..cf7bce1 100644 --- a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaFlare.uc +++ b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaFlare.uc @@ -1,4 +1,6 @@ -class NiceProtectaFlare extends NiceFlareRevolverProjectile; -defaultproperties -{ Speed=4500.000000 MaxSpeed=5000.000000 -} +class NiceProtectaFlare extends NiceFlareRevolverProjectile; +defaultproperties +{ + Speed=4500.000000 + MaxSpeed=5000.000000 +} diff --git a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaPickup.uc b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaPickup.uc index 386f6c7..c9e757c 100644 --- a/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaPickup.uc +++ b/sources/Weapons/Playable/Incendiary/Protecta/NiceProtectaPickup.uc @@ -1,4 +1,8 @@ -class NiceProtectaPickup extends ProtectaPickup; -defaultproperties -{ ItemName="Protecta NW" ItemShortName="Protecta NW" InventoryType=Class'NicePack.NiceProtecta' PickupMessage="You got the Protecta NW" -} +class NiceProtectaPickup extends ProtectaPickup; +defaultproperties +{ + ItemName="Protecta NW" + ItemShortName="Protecta NW" + InventoryType=Class'NicePack.NiceProtecta' + PickupMessage="You got the Protecta NW" +} diff --git a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceDamTypeThompsonInc.uc b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceDamTypeThompsonInc.uc index ee89048..69548af 100644 --- a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceDamTypeThompsonInc.uc +++ b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceDamTypeThompsonInc.uc @@ -1,5 +1,8 @@ -class NiceDamTypeThompsonInc extends NiceDamTypeFire - abstract; -defaultproperties -{ heatPart=0.300000 bCheckForHeadShots=True WeaponClass=Class'NicePack.NiceThompsonInc' -} +class NiceDamTypeThompsonInc extends NiceDamTypeFire + abstract; +defaultproperties +{ + heatPart=0.300000 + bCheckForHeadShots=True + WeaponClass=Class'NicePack.NiceThompsonInc' +} diff --git a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonInc.uc b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonInc.uc index 2383e52..7ab8084 100644 --- a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonInc.uc +++ b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonInc.uc @@ -1,5 +1,8 @@ -class NiceThompsonInc extends ScrnThompsonInc - config(user); -defaultproperties -{ FireModeClass(0)=Class'NicePack.NiceThompsonIncFire' PickupClass=Class'NicePack.NiceThompsonIncPickup' ItemName="Incendiary Tommy Gun NW" -} +class NiceThompsonInc extends ScrnThompsonInc + config(user); +defaultproperties +{ + FireModeClass(0)=Class'NicePack.NiceThompsonIncFire' + PickupClass=Class'NicePack.NiceThompsonIncPickup' + ItemName="Incendiary Tommy Gun NW" +} diff --git a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncAmmo.uc b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncAmmo.uc index f5db7ca..7bb80dc 100644 --- a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncAmmo.uc +++ b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncAmmo.uc @@ -1,5 +1,6 @@ -class NiceThompsonIncAmmo extends ScrnThompsonIncAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ PickupClass=Class'NicePack.NiceThompsonIncAmmoPickup' -} +class NiceThompsonIncAmmo extends ScrnThompsonIncAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + PickupClass=Class'NicePack.NiceThompsonIncAmmoPickup' +} diff --git a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncAmmoPickup.uc b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncAmmoPickup.uc index e12c9b9..a786eee 100644 --- a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncAmmoPickup.uc +++ b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncAmmoPickup.uc @@ -1,4 +1,5 @@ -class NiceThompsonIncAmmoPickup extends ScrnThompsonIncAmmoPickup; -defaultproperties -{ InventoryType=Class'NicePack.NiceThompsonIncAmmo' -} +class NiceThompsonIncAmmoPickup extends ScrnThompsonIncAmmoPickup; +defaultproperties +{ + InventoryType=Class'NicePack.NiceThompsonIncAmmo' +} diff --git a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncFire.uc b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncFire.uc index a60a892..f8b2414 100644 --- a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncFire.uc +++ b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncFire.uc @@ -1,34 +1,72 @@ -class NiceThompsonIncFire extends ScrnThompsonIncFire; -// Overwritten to not switch damage types for the firebug -function DoTrace(Vector Start, Rotator Dir) -{ - local Vector X,Y,Z, End, HitLocation, HitNormal, ArcEnd; - local Actor Other; - local KFWeaponAttachment WeapAttach; - local array HitPoints; - local KFPawn HitPawn; - MaxRange(); - Weapon.GetViewAxes(X, Y, Z); - if ( Weapon.WeaponCentered() ) - { ArcEnd = (Instigator.Location + Weapon.EffectOffset.X * X + 1.5 * Weapon.EffectOffset.Z * Z); - } - else - { ArcEnd = (Instigator.Location + Instigator.CalcDrawOffset(Weapon) + Weapon.EffectOffset.X * X + Weapon.Hand * Weapon.EffectOffset.Y * Y + Weapon.EffectOffset.Z * Z); - } - X = Vector(Dir); - End = Start + TraceRange * X; - Other = Instigator.HitPointTrace(HitLocation, HitNormal, End, HitPoints, Start,, 1); - if ( Other != none && Other != Instigator && Other.Base != Instigator ) - { WeapAttach = KFWeaponAttachment(Weapon.ThirdPersonActor); - if ( !Other.bWorldGeometry ) { // Update hit effect except for pawns if ( !Other.IsA('Pawn') && !Other.IsA('HitScanBlockingVolume') && !Other.IsA('ExtendedZCollision') ) { if( WeapAttach!=none ) { WeapAttach.UpdateHit(Other, HitLocation, HitNormal); } } - HitPawn = KFPawn(Other); - if ( HitPawn != none ) { if ( !HitPawn.bDeleteMe ) { HitPawn.ProcessLocationalDamage(DamageMax, Instigator, HitLocation, Momentum * X, DamageType, HitPoints); } } else Other.TakeDamage(DamageMax, Instigator, HitLocation, Momentum * X, DamageType); } else { HitLocation = HitLocation + 2.0 * HitNormal; - if ( WeapAttach != none ) { WeapAttach.UpdateHit(Other,HitLocation,HitNormal); } } - } - else - { HitLocation = End; HitNormal = Normal(Start - End); - } -} -defaultproperties -{ DamageType=Class'NicePack.NiceDamTypeThompsonInc' AmmoClass=Class'NicePack.NiceThompsonIncAmmo' -} +class NiceThompsonIncFire extends ScrnThompsonIncFire; +// Overwritten to not switch damage types for the firebug +function DoTrace(Vector Start, Rotator Dir) +{ + local Vector X,Y,Z, End, HitLocation, HitNormal, ArcEnd; + local Actor Other; + local KFWeaponAttachment WeapAttach; + local array HitPoints; + local KFPawn HitPawn; + MaxRange(); + Weapon.GetViewAxes(X, Y, Z); + if ( Weapon.WeaponCentered() ) + { + ArcEnd = (Instigator.Location + Weapon.EffectOffset.X * X + 1.5 * Weapon.EffectOffset.Z * Z); + } + else + { + ArcEnd = (Instigator.Location + Instigator.CalcDrawOffset(Weapon) + Weapon.EffectOffset.X * X + Weapon.Hand * Weapon.EffectOffset.Y * Y + + Weapon.EffectOffset.Z * Z); + } + X = Vector(Dir); + End = Start + TraceRange * X; + Other = Instigator.HitPointTrace(HitLocation, HitNormal, End, HitPoints, Start,, 1); + if ( Other != none && Other != Instigator && Other.Base != Instigator ) + { + WeapAttach = KFWeaponAttachment(Weapon.ThirdPersonActor); + + if ( !Other.bWorldGeometry ) + { + // Update hit effect except for pawns + if ( !Other.IsA('Pawn') && !Other.IsA('HitScanBlockingVolume') && + !Other.IsA('ExtendedZCollision') ) + { + if( WeapAttach!=none ) + { + WeapAttach.UpdateHit(Other, HitLocation, HitNormal); + } + } + + HitPawn = KFPawn(Other); + + if ( HitPawn != none ) + { + if ( !HitPawn.bDeleteMe ) + { + HitPawn.ProcessLocationalDamage(DamageMax, Instigator, HitLocation, Momentum * X, DamageType, HitPoints); + } + } + else + Other.TakeDamage(DamageMax, Instigator, HitLocation, Momentum * X, DamageType); + } + else + { + HitLocation = HitLocation + 2.0 * HitNormal; + + if ( WeapAttach != none ) + { + WeapAttach.UpdateHit(Other,HitLocation,HitNormal); + } + } + } + else + { + HitLocation = End; + HitNormal = Normal(Start - End); + } +} +defaultproperties +{ + DamageType=Class'NicePack.NiceDamTypeThompsonInc' + AmmoClass=Class'NicePack.NiceThompsonIncAmmo' +} diff --git a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncPickup.uc b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncPickup.uc index 6796254..7001460 100644 --- a/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncPickup.uc +++ b/sources/Weapons/Playable/Incendiary/TommygunInc/NiceThompsonIncPickup.uc @@ -1,4 +1,8 @@ -class NiceThompsonIncPickup extends ScrnThompsonIncPickup; -defaultproperties -{ ItemName="Tommy Gun Incendiary NW" ItemShortName="Tommy Gun Inc. NW" InventoryType=Class'NicePack.NiceThompsonInc' PickupMessage="You got the Incendiary Tommy Gun NW" -} +class NiceThompsonIncPickup extends ScrnThompsonIncPickup; +defaultproperties +{ + ItemName="Tommy Gun Incendiary NW" + ItemShortName="Tommy Gun Inc. NW" + InventoryType=Class'NicePack.NiceThompsonInc' + PickupMessage="You got the Incendiary Tommy Gun NW" +} diff --git a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceDamTypeTrenchgun.uc b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceDamTypeTrenchgun.uc index 8442e22..4cb2db6 100644 --- a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceDamTypeTrenchgun.uc +++ b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceDamTypeTrenchgun.uc @@ -1,5 +1,20 @@ -class NiceDamTypeTrenchgun extends NiceDamTypeFire - abstract; -defaultproperties -{ heatPart=0.400000 MaxPenetrations=3 bIsPowerWeapon=True bCheckForHeadShots=True WeaponClass=Class'NicePack.NiceTrenchgun' DeathString="%k killed %o (Trenchgun)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 -} +class NiceDamTypeTrenchgun extends NiceDamTypeFire + abstract; +defaultproperties +{ + heatPart=0.400000 + MaxPenetrations=3 + bIsPowerWeapon=True + bCheckForHeadShots=True + WeaponClass=Class'NicePack.NiceTrenchgun' + DeathString="%k killed %o (Trenchgun)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + FlashFog=(X=600.000000) + KDamageImpulse=10000.000000 + KDeathVel=300.000000 + KDeathUpKick=100.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgun.uc b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgun.uc index 26b1dc7..7cb5509 100644 --- a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgun.uc +++ b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgun.uc @@ -1,8 +1,47 @@ -class NiceTrenchgun extends NiceWeapon; -simulated function fillSubReloadStages(){ - // Loading 6 shells during 143 frames tops, with first shell loaded at frame 14, with 18 frames between load moments - generateReloadStages(6, 143, 14, 18); -} -defaultproperties -{ reloadType=RTYPE_SINGLE ForceZoomOutOnFireTime=0.010000 MagCapacity=6 ReloadRate=0.700000 ReloadAnim="Reload" ReloadAnimRate=1.000000 bHoldToReload=True WeaponReloadAnim="Reload_Shotgun" Weight=8.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_TrenchGun' bIsTier2Weapon=True MeshRef="KF_Wep_TrenchGun.TrenchGun" SkinRefs(0)="KF_Weapons8_Trip_T.Weapons.Trenchgun_cmb" SelectSoundRef="KF_PumpSGSnd.SG_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.TrenchGun_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.TrenchGun" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceTrenchgunFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" AIRating=0.600000 CurrentRating=0.600000 bShowChargingBar=True Description="A WWII-era trench shotgun in 12 gauge, loaded with Dragon's Breath flame rounds. Toasty." DisplayFOV=65.000000 Priority=142 InventoryGroup=3 GroupOffset=14 PickupClass=Class'NicePack.NiceTrenchgunPickup' PlayerViewOffset=(X=20.000000,Y=18.750000,Z=-8.000000) BobDamping=7.000000 AttachmentClass=Class'KFMod.TrenchgunAttachment' IconCoords=(X1=169,Y1=172,X2=245,Y2=208) ItemName="Dragon's Breath Trenchgun" TransientSoundVolume=1.000000 -} +class NiceTrenchgun extends NiceWeapon; +simulated function fillSubReloadStages(){ + // Loading 6 shells during 143 frames tops, with first shell loaded at frame 14, with 18 frames between load moments + generateReloadStages(6, 143, 14, 18); +} +defaultproperties +{ + reloadType=RTYPE_SINGLE + ForceZoomOutOnFireTime=0.010000 + MagCapacity=6 + ReloadRate=0.700000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + bHoldToReload=True + WeaponReloadAnim="Reload_Shotgun" + Weight=8.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=65.000000 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_TrenchGun' + bIsTier2Weapon=True + MeshRef="KF_Wep_TrenchGun.TrenchGun" + SkinRefs(0)="KF_Weapons8_Trip_T.Weapons.Trenchgun_cmb" + SelectSoundRef="KF_PumpSGSnd.SG_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.TrenchGun_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.TrenchGun" + PlayerIronSightFOV=70.000000 + ZoomedDisplayFOV=50.000000 + FireModeClass(0)=Class'NicePack.NiceTrenchgunFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + AIRating=0.600000 + CurrentRating=0.600000 + bShowChargingBar=True + Description="A WWII-era trench shotgun in 12 gauge, loaded with Dragon's Breath flame rounds. Toasty." + DisplayFOV=65.000000 + Priority=142 + InventoryGroup=3 + GroupOffset=14 + PickupClass=Class'NicePack.NiceTrenchgunPickup' + PlayerViewOffset=(X=20.000000,Y=18.750000,Z=-8.000000) + BobDamping=7.000000 + AttachmentClass=Class'KFMod.TrenchgunAttachment' + IconCoords=(X1=169,Y1=172,X2=245,Y2=208) + ItemName="Dragon's Breath Trenchgun" + TransientSoundVolume=1.000000 +} diff --git a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunAmmo.uc b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunAmmo.uc index 61fea07..a465a5f 100644 --- a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunAmmo.uc +++ b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunAmmo.uc @@ -1,5 +1,11 @@ -class NiceTrenchgunAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceTrenchgunPickup' AmmoPickupAmount=6 MaxAmmo=48 InitialAmount=24 IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) -} +class NiceTrenchgunAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceTrenchgunPickup' + AmmoPickupAmount=6 + MaxAmmo=48 + InitialAmount=24 + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunAmmoPickup.uc b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunAmmoPickup.uc index 41bffcd..dc05fd0 100644 --- a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunAmmoPickup.uc +++ b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceTrenchgunAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=8 InventoryType=Class'NicePack.NiceTrenchgunAmmo' PickupMessage="Dragon's Breath Shells" StaticMesh=None -} +class NiceTrenchgunAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=8 + InventoryType=Class'NicePack.NiceTrenchgunAmmo' + PickupMessage="Dragon's Breath Shells" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunFire.uc b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunFire.uc index 206ab89..7d1bdc7 100644 --- a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunFire.uc +++ b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunFire.uc @@ -1,4 +1,12 @@ -class NiceTrenchgunFire extends NiceShotgunFire; -defaultproperties -{ ProjPerFire=14 bRandomPitchFireSound=True FireSoundRef="KF_ShotgunDragonsBreathSnd.ShotgunDragon_Fire_Single_M" StereoFireSoundRef="KF_ShotgunDragonsBreathSnd.ShotgunDragon_Fire_Single_S" DamageType=Class'NicePack.NiceDamTypeTrenchgun' DamageMax=18 AmmoClass=Class'NicePack.NiceTrenchgunAmmo' FlashEmitterClass=Class'KFMod.TrenchgunMuzzFlash' -} +class NiceTrenchgunFire extends NiceShotgunFire; +defaultproperties +{ + ProjPerFire=14 + bRandomPitchFireSound=True + FireSoundRef="KF_ShotgunDragonsBreathSnd.ShotgunDragon_Fire_Single_M" + StereoFireSoundRef="KF_ShotgunDragonsBreathSnd.ShotgunDragon_Fire_Single_S" + DamageType=Class'NicePack.NiceDamTypeTrenchgun' + DamageMax=18 + AmmoClass=Class'NicePack.NiceTrenchgunAmmo' + FlashEmitterClass=Class'KFMod.TrenchgunMuzzFlash' +} diff --git a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunPickup.uc b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunPickup.uc index f0b3717..efdccb5 100644 --- a/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunPickup.uc +++ b/sources/Weapons/Playable/Incendiary/Trenchgun/NiceTrenchgunPickup.uc @@ -1,4 +1,23 @@ -class NiceTrenchgunPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=8.000000 cost=1250 BuyClipSize=6 PowerValue=75 SpeedValue=40 RangeValue=15 Description="A WWII-era trench shotgun in 12 gauge, loaded with Dragon's Breath flame rounds. Toasty." ItemName="Trenchgun" ItemShortName="Trenchgun" AmmoItemName="Dragon's breath shells" CorrespondingPerkIndex=5 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceTrenchgun' PickupMessage="You got the Trenchgun." PickupSound=Sound'KF_ShotgunDragonsBreathSnd.Handling.TrenchGun_Pump_Back' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups5_Trip.Rifles.TrenchGun_Pickup' CollisionRadius=35.000000 CollisionHeight=5.000000 -} +class NiceTrenchgunPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=8.000000 + cost=1250 + BuyClipSize=6 + PowerValue=75 + SpeedValue=40 + RangeValue=15 + Description="A WWII-era trench shotgun in 12 gauge, loaded with Dragon's Breath flame rounds. Toasty." + ItemName="Trenchgun" + ItemShortName="Trenchgun" + AmmoItemName="Dragon's breath shells" + CorrespondingPerkIndex=5 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceTrenchgun' + PickupMessage="You got the Trenchgun." + PickupSound=Sound'KF_ShotgunDragonsBreathSnd.Handling.TrenchGun_Pump_Back' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups5_Trip.Rifles.TrenchGun_Pickup' + CollisionRadius=35.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Melee/Axe/NiceAxe.uc b/sources/Weapons/Playable/Melee/Axe/NiceAxe.uc index 75ee17f..c6ec618 100644 --- a/sources/Weapons/Playable/Melee/Axe/NiceAxe.uc +++ b/sources/Weapons/Playable/Melee/Axe/NiceAxe.uc @@ -1,4 +1,29 @@ -class NiceAxe extends NiceMeleeWeapon; -defaultproperties -{ weaponRange=80.000000 BloodSkinSwitchArray=0 BloodyMaterialRef="KF_Weapons_Trip_T.melee.axe_bloody_cmb" bSpeedMeUp=True Weight=5.000000 StandardDisplayFOV=75.000000 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Axe' bIsTier2Weapon=True MeshRef="KF_Weapons_Trip.Axe_Trip" SkinRefs(0)="KF_Weapons_Trip_T.melee.axe_cmb" SelectSoundRef="KF_AxeSnd.Axe_Select" HudImageRef="KillingFloorHUD.WeaponSelect.Axe_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.Axe" FireModeClass(0)=Class'NicePack.NiceAxeFire' FireModeClass(1)=Class'NicePack.NiceAxeFireB' AIRating=0.300000 Description="A common two-handed fireman's axe." DisplayFOV=75.000000 Priority=55 GroupOffset=3 PickupClass=Class'NicePack.NiceAxePickup' BobDamping=8.000000 AttachmentClass=Class'NicePack.NiceAxeAttachment' IconCoords=(X1=169,Y1=39,X2=241,Y2=77) ItemName="Axe" -} +class NiceAxe extends NiceMeleeWeapon; +defaultproperties +{ + weaponRange=80.000000 + BloodSkinSwitchArray=0 + BloodyMaterialRef="KF_Weapons_Trip_T.melee.axe_bloody_cmb" + bSpeedMeUp=True + Weight=5.000000 + StandardDisplayFOV=75.000000 + TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Axe' + bIsTier2Weapon=True + MeshRef="KF_Weapons_Trip.Axe_Trip" + SkinRefs(0)="KF_Weapons_Trip_T.melee.axe_cmb" + SelectSoundRef="KF_AxeSnd.Axe_Select" + HudImageRef="KillingFloorHUD.WeaponSelect.Axe_unselected" + SelectedHudImageRef="KillingFloorHUD.WeaponSelect.Axe" + FireModeClass(0)=Class'NicePack.NiceAxeFire' + FireModeClass(1)=Class'NicePack.NiceAxeFireB' + AIRating=0.300000 + Description="A common two-handed fireman's axe." + DisplayFOV=75.000000 + Priority=55 + GroupOffset=3 + PickupClass=Class'NicePack.NiceAxePickup' + BobDamping=8.000000 + AttachmentClass=Class'NicePack.NiceAxeAttachment' + IconCoords=(X1=169,Y1=39,X2=241,Y2=77) + ItemName="Axe" +} diff --git a/sources/Weapons/Playable/Melee/Axe/NiceAxeAttachment.uc b/sources/Weapons/Playable/Melee/Axe/NiceAxeAttachment.uc index 091e8a2..7d5390a 100644 --- a/sources/Weapons/Playable/Melee/Axe/NiceAxeAttachment.uc +++ b/sources/Weapons/Playable/Melee/Axe/NiceAxeAttachment.uc @@ -1,4 +1,45 @@ -class NiceAxeAttachment extends NiceMeleeAttachment; -defaultproperties -{ MovementAnims(0)="JogF_Axe" MovementAnims(1)="JogB_Axe" MovementAnims(2)="JogL_Axe" MovementAnims(3)="JogR_Axe" TurnLeftAnim="TurnL_Axe" TurnRightAnim="TurnR_Axe" CrouchAnims(0)="CHwalkF_Axe" CrouchAnims(1)="CHwalkB_Axe" CrouchAnims(2)="CHwalkL_Axe" CrouchAnims(3)="CHwalkR_Axe" CrouchTurnRightAnim="CH_TurnR_Axe" CrouchTurnLeftAnim="CH_TurnL_Axe" IdleCrouchAnim="CHIdle_Axe" IdleWeaponAnim="Idle_Axe" IdleRestAnim="Idle_Axe" IdleChatAnim="Idle_Axe" IdleHeavyAnim="Idle_Axe" IdleRifleAnim="Idle_Axe" FireAnims(0)="Attack1_Axe" FireAnims(1)="Attack2_Axe" FireAnims(2)="Attack3_Axe" FireAnims(3)="Attack3_Axe" FireAltAnims(0)="Attack1_Axe" FireAltAnims(1)="Attack2_Axe" FireAltAnims(2)="Attack3_Axe" FireAltAnims(3)="Attack3_Axe" FireCrouchAnims(0)="CHAttack1_Axe" FireCrouchAnims(1)="CHAttack2_Axe" FireCrouchAnims(2)="CHAttack3_Axe" FireCrouchAnims(3)="CHAttack3_Axe" FireCrouchAltAnims(0)="CHAttack1_Axe" FireCrouchAltAnims(1)="CHAttack2_Axe" FireCrouchAltAnims(2)="CHAttack3_Axe" FireCrouchAltAnims(3)="CHAttack3_Axe" HitAnims(0)="HitF_Axe" HitAnims(1)="HitB_Axe" HitAnims(2)="HitL_Axe" HitAnims(3)="HitR_Axe" PostFireBlendStandAnim="Blend_Axe" PostFireBlendCrouchAnim="CHBlend_Axe" MeshRef="KF_Weapons3rd_Trip.Axe_3rd" -} +class NiceAxeAttachment extends NiceMeleeAttachment; +defaultproperties +{ + MovementAnims(0)="JogF_Axe" + MovementAnims(1)="JogB_Axe" + MovementAnims(2)="JogL_Axe" + MovementAnims(3)="JogR_Axe" + TurnLeftAnim="TurnL_Axe" + TurnRightAnim="TurnR_Axe" + CrouchAnims(0)="CHwalkF_Axe" + CrouchAnims(1)="CHwalkB_Axe" + CrouchAnims(2)="CHwalkL_Axe" + CrouchAnims(3)="CHwalkR_Axe" + CrouchTurnRightAnim="CH_TurnR_Axe" + CrouchTurnLeftAnim="CH_TurnL_Axe" + IdleCrouchAnim="CHIdle_Axe" + IdleWeaponAnim="Idle_Axe" + IdleRestAnim="Idle_Axe" + IdleChatAnim="Idle_Axe" + IdleHeavyAnim="Idle_Axe" + IdleRifleAnim="Idle_Axe" + FireAnims(0)="Attack1_Axe" + FireAnims(1)="Attack2_Axe" + FireAnims(2)="Attack3_Axe" + FireAnims(3)="Attack3_Axe" + FireAltAnims(0)="Attack1_Axe" + FireAltAnims(1)="Attack2_Axe" + FireAltAnims(2)="Attack3_Axe" + FireAltAnims(3)="Attack3_Axe" + FireCrouchAnims(0)="CHAttack1_Axe" + FireCrouchAnims(1)="CHAttack2_Axe" + FireCrouchAnims(2)="CHAttack3_Axe" + FireCrouchAnims(3)="CHAttack3_Axe" + FireCrouchAltAnims(0)="CHAttack1_Axe" + FireCrouchAltAnims(1)="CHAttack2_Axe" + FireCrouchAltAnims(2)="CHAttack3_Axe" + FireCrouchAltAnims(3)="CHAttack3_Axe" + HitAnims(0)="HitF_Axe" + HitAnims(1)="HitB_Axe" + HitAnims(2)="HitL_Axe" + HitAnims(3)="HitR_Axe" + PostFireBlendStandAnim="Blend_Axe" + PostFireBlendCrouchAnim="CHBlend_Axe" + MeshRef="KF_Weapons3rd_Trip.Axe_3rd" +} diff --git a/sources/Weapons/Playable/Melee/Axe/NiceAxeFire.uc b/sources/Weapons/Playable/Melee/Axe/NiceAxeFire.uc index 6251dd6..2521425 100644 --- a/sources/Weapons/Playable/Melee/Axe/NiceAxeFire.uc +++ b/sources/Weapons/Playable/Melee/Axe/NiceAxeFire.uc @@ -1,4 +1,18 @@ -class NiceAxeFire extends NiceMeleeFire; -defaultproperties -{ weaponRange=90.000000 damageDelay=0.600000 FireAnims(0)="Fire" FireAnims(1)="Fire2" FireAnims(2)="fire3" FireAnims(3)="Fire4" HitEffectClass=Class'KFMod.AxeHitEffect' MeleeHitSoundRefs(0)="KF_AxeSnd.Axe_HitFlesh" WideDamageMinHitAngle=0.750000 DamageType=Class'NicePack.NiceDamTypeAxe' DamageMax=175 FireAnimRate=0.893333 FireRate=1.100000 BotRefireRate=0.850000 -} +class NiceAxeFire extends NiceMeleeFire; +defaultproperties +{ + weaponRange=90.000000 + damageDelay=0.600000 + FireAnims(0)="Fire" + FireAnims(1)="Fire2" + FireAnims(2)="fire3" + FireAnims(3)="Fire4" + HitEffectClass=Class'KFMod.AxeHitEffect' + MeleeHitSoundRefs(0)="KF_AxeSnd.Axe_HitFlesh" + WideDamageMinHitAngle=0.750000 + DamageType=Class'NicePack.NiceDamTypeAxe' + DamageMax=175 + FireAnimRate=0.893333 + FireRate=1.100000 + BotRefireRate=0.850000 +} diff --git a/sources/Weapons/Playable/Melee/Axe/NiceAxeFireB.uc b/sources/Weapons/Playable/Melee/Axe/NiceAxeFireB.uc index 3c7928d..6b55ad1 100644 --- a/sources/Weapons/Playable/Melee/Axe/NiceAxeFireB.uc +++ b/sources/Weapons/Playable/Melee/Axe/NiceAxeFireB.uc @@ -1,4 +1,14 @@ -class NiceAxeFireB extends NiceMeleeFire; -defaultproperties -{ weaponRange=90.000000 damageDelay=0.760000 FireAnims(0)="PowerAttack" HitEffectClass=Class'KFMod.AxeHitEffect' MeleeHitSoundRefs(0)="KF_AxeSnd.Axe_HitFlesh" DamageType=Class'NicePack.NiceDamTypeAxe' DamageMax=275 bWaitForRelease=True FireRate=1.333000 BotRefireRate=0.850000 -} +class NiceAxeFireB extends NiceMeleeFire; +defaultproperties +{ + weaponRange=90.000000 + damageDelay=0.760000 + FireAnims(0)="PowerAttack" + HitEffectClass=Class'KFMod.AxeHitEffect' + MeleeHitSoundRefs(0)="KF_AxeSnd.Axe_HitFlesh" + DamageType=Class'NicePack.NiceDamTypeAxe' + DamageMax=275 + bWaitForRelease=True + FireRate=1.333000 + BotRefireRate=0.850000 +} diff --git a/sources/Weapons/Playable/Melee/Axe/NiceAxePickup.uc b/sources/Weapons/Playable/Melee/Axe/NiceAxePickup.uc index 3e296c8..9978e11 100644 --- a/sources/Weapons/Playable/Melee/Axe/NiceAxePickup.uc +++ b/sources/Weapons/Playable/Melee/Axe/NiceAxePickup.uc @@ -1,4 +1,21 @@ -class NiceAxePickup extends NiceWeaponPickup; -defaultproperties -{ Weight=5.000000 cost=250 PowerValue=56 SpeedValue=32 RangeValue=-20 Description="A sturdy fireman's axe." ItemName="Axe" ItemShortName="Axe" CorrespondingPerkIndex=4 VariantClasses(0)=Class'KFMod.GoldenKatanaPickup' InventoryType=Class'NicePack.NiceAxe' PickupMessage="You got the Fire Axe." PickupSound=Sound'KF_AxeSnd.Axe_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.melee.Axe_Pickup' CollisionRadius=27.000000 CollisionHeight=5.000000 -} +class NiceAxePickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=5.000000 + cost=250 + PowerValue=56 + SpeedValue=32 + RangeValue=-20 + Description="A sturdy fireman's axe." + ItemName="Axe" + ItemShortName="Axe" + CorrespondingPerkIndex=4 + VariantClasses(0)=Class'KFMod.GoldenKatanaPickup' + InventoryType=Class'NicePack.NiceAxe' + PickupMessage="You got the Fire Axe." + PickupSound=Sound'KF_AxeSnd.Axe_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups_Trip.melee.Axe_Pickup' + CollisionRadius=27.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Melee/Axe/NiceDamTypeAxe.uc b/sources/Weapons/Playable/Melee/Axe/NiceDamTypeAxe.uc index 1b5b276..b615750 100644 --- a/sources/Weapons/Playable/Melee/Axe/NiceDamTypeAxe.uc +++ b/sources/Weapons/Playable/Melee/Axe/NiceDamTypeAxe.uc @@ -1,4 +1,8 @@ -class NiceDamTypeAxe extends NiceDamageTypeVetBerserker; -defaultproperties -{ HeadShotDamageMult=1.300000 WeaponClass=Class'NicePack.NiceAxe' PawnDamageSounds(0)=SoundGroup'KF_AxeSnd.Axe_HitFlesh' VehicleDamageScaling=0.700000 -} +class NiceDamTypeAxe extends NiceDamageTypeVetBerserker; +defaultproperties +{ + HeadShotDamageMult=1.300000 + WeaponClass=Class'NicePack.NiceAxe' + PawnDamageSounds(0)=SoundGroup'KF_AxeSnd.Axe_HitFlesh' + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Melee/Claymore/NiceClaymore.uc b/sources/Weapons/Playable/Melee/Claymore/NiceClaymore.uc index 8a0a73c..4096e36 100644 --- a/sources/Weapons/Playable/Melee/Claymore/NiceClaymore.uc +++ b/sources/Weapons/Playable/Melee/Claymore/NiceClaymore.uc @@ -1,4 +1,30 @@ -class NiceClaymore extends NiceMeleeWeapon; -defaultproperties -{ weaponRange=100.000000 BloodSkinSwitchArray=0 BloodyMaterialRef="KF_Weapons4_Trip_T.Claymore_Bloody_cmb" bSpeedMeUp=True Weight=6.000000 StandardDisplayFOV=75.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Claymore' bIsTier2Weapon=True MeshRef="KF_Wep_Claymore.Claymore_Trip" SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.Claymore_cmb" SelectSoundRef="KF_ClaymoreSnd.WEP_Claymore_Foley_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.Claymore_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Claymore" FireModeClass(0)=Class'NicePack.NiceClaymoreFire' FireModeClass(1)=Class'NicePack.NiceClaymoreFireB' AIRating=0.400000 CurrentRating=0.600000 Description="A medieval claymore sword." DisplayFOV=75.000000 Priority=105 GroupOffset=4 PickupClass=Class'NicePack.NiceClaymorePickup' BobDamping=8.000000 AttachmentClass=Class'NicePack.NiceClaymoreAttachment' IconCoords=(X1=246,Y1=80,X2=332,Y2=106) ItemName="Claymore Sword" -} +class NiceClaymore extends NiceMeleeWeapon; +defaultproperties +{ + weaponRange=100.000000 + BloodSkinSwitchArray=0 + BloodyMaterialRef="KF_Weapons4_Trip_T.Claymore_Bloody_cmb" + bSpeedMeUp=True + Weight=6.000000 + StandardDisplayFOV=75.000000 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Claymore' + bIsTier2Weapon=True + MeshRef="KF_Wep_Claymore.Claymore_Trip" + SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.Claymore_cmb" + SelectSoundRef="KF_ClaymoreSnd.WEP_Claymore_Foley_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.Claymore_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Claymore" + FireModeClass(0)=Class'NicePack.NiceClaymoreFire' + FireModeClass(1)=Class'NicePack.NiceClaymoreFireB' + AIRating=0.400000 + CurrentRating=0.600000 + Description="A medieval claymore sword." + DisplayFOV=75.000000 + Priority=105 + GroupOffset=4 + PickupClass=Class'NicePack.NiceClaymorePickup' + BobDamping=8.000000 + AttachmentClass=Class'NicePack.NiceClaymoreAttachment' + IconCoords=(X1=246,Y1=80,X2=332,Y2=106) + ItemName="Claymore Sword" +} diff --git a/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreAttachment.uc b/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreAttachment.uc index 81a749b..da69f97 100644 --- a/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreAttachment.uc +++ b/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreAttachment.uc @@ -1,4 +1,45 @@ -class NiceClaymoreAttachment extends NiceMeleeAttachment; -defaultproperties -{ MovementAnims(0)="JogF_Katana" MovementAnims(1)="JogB_Katana" MovementAnims(2)="JogL_Katana" MovementAnims(3)="JogR_Katana" TurnLeftAnim="TurnL_Katana" TurnRightAnim="TurnR_Katana" CrouchAnims(0)="CHWalkF_Katana" CrouchAnims(1)="CHWalkB_Katana" CrouchAnims(2)="CHWalkL_Katana" CrouchAnims(3)="CHWalkR_Katana" CrouchTurnRightAnim="CH_TurnR_Katana" CrouchTurnLeftAnim="CH_TurnL_Katana" IdleCrouchAnim="CHIdle_Katana" IdleWeaponAnim="Idle_Katana" IdleRestAnim="Idle_Katana" IdleChatAnim="Idle_Katana" IdleHeavyAnim="Idle_Katana" IdleRifleAnim="Idle_Katana" FireAnims(0)="FastAttack1_Claymore" FireAnims(1)="FastAttack2_Claymore" FireAnims(2)="FastAttack3_Claymore" FireAnims(3)="FastAttack4_Claymore" FireAltAnims(0)="HardAttack1_Claymore" FireAltAnims(1)="HardAttack1_Claymore" FireAltAnims(2)="HardAttack1_Claymore" FireAltAnims(3)="HardAttack1_Claymore" FireCrouchAnims(0)="CHFastAttack1_Claymore" FireCrouchAnims(1)="CHFastAttack2_Claymore" FireCrouchAnims(2)="CHFastAttack3_Claymore" FireCrouchAnims(3)="CHFastAttack4_Claymore" FireCrouchAltAnims(0)="CHHardAttack1_Claymore" FireCrouchAltAnims(1)="CHHardAttack1_Claymore" FireCrouchAltAnims(2)="CHHardAttack1_Claymore" FireCrouchAltAnims(3)="CHHardAttack1_Claymore" HitAnims(0)="HitF_Katana" HitAnims(1)="HitB_Katana" HitAnims(2)="HitL_Katana" HitAnims(3)="HitR_Katana" PostFireBlendStandAnim="Blend_Katana" PostFireBlendCrouchAnim="CHBlend_Katana" MeshRef="KF_Weapons3rd3_Trip.Claymore_3rd" -} +class NiceClaymoreAttachment extends NiceMeleeAttachment; +defaultproperties +{ + MovementAnims(0)="JogF_Katana" + MovementAnims(1)="JogB_Katana" + MovementAnims(2)="JogL_Katana" + MovementAnims(3)="JogR_Katana" + TurnLeftAnim="TurnL_Katana" + TurnRightAnim="TurnR_Katana" + CrouchAnims(0)="CHWalkF_Katana" + CrouchAnims(1)="CHWalkB_Katana" + CrouchAnims(2)="CHWalkL_Katana" + CrouchAnims(3)="CHWalkR_Katana" + CrouchTurnRightAnim="CH_TurnR_Katana" + CrouchTurnLeftAnim="CH_TurnL_Katana" + IdleCrouchAnim="CHIdle_Katana" + IdleWeaponAnim="Idle_Katana" + IdleRestAnim="Idle_Katana" + IdleChatAnim="Idle_Katana" + IdleHeavyAnim="Idle_Katana" + IdleRifleAnim="Idle_Katana" + FireAnims(0)="FastAttack1_Claymore" + FireAnims(1)="FastAttack2_Claymore" + FireAnims(2)="FastAttack3_Claymore" + FireAnims(3)="FastAttack4_Claymore" + FireAltAnims(0)="HardAttack1_Claymore" + FireAltAnims(1)="HardAttack1_Claymore" + FireAltAnims(2)="HardAttack1_Claymore" + FireAltAnims(3)="HardAttack1_Claymore" + FireCrouchAnims(0)="CHFastAttack1_Claymore" + FireCrouchAnims(1)="CHFastAttack2_Claymore" + FireCrouchAnims(2)="CHFastAttack3_Claymore" + FireCrouchAnims(3)="CHFastAttack4_Claymore" + FireCrouchAltAnims(0)="CHHardAttack1_Claymore" + FireCrouchAltAnims(1)="CHHardAttack1_Claymore" + FireCrouchAltAnims(2)="CHHardAttack1_Claymore" + FireCrouchAltAnims(3)="CHHardAttack1_Claymore" + HitAnims(0)="HitF_Katana" + HitAnims(1)="HitB_Katana" + HitAnims(2)="HitL_Katana" + HitAnims(3)="HitR_Katana" + PostFireBlendStandAnim="Blend_Katana" + PostFireBlendCrouchAnim="CHBlend_Katana" + MeshRef="KF_Weapons3rd3_Trip.Claymore_3rd" +} diff --git a/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreFire.uc b/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreFire.uc index 954e1c6..7bd2548 100644 --- a/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreFire.uc +++ b/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreFire.uc @@ -1,4 +1,21 @@ -class NiceClaymoreFire extends NiceMeleeFire; -defaultproperties -{ weaponRange=110.000000 damageDelay=0.570000 FireAnims(0)="Fire" FireAnims(1)="Fire2" FireAnims(2)="fire3" FireAnims(3)="Fire4" FireAnims(4)="Fire5" FireAnims(5)="Fire6" HitEffectClass=Class'KFMod.AxeHitEffect' MeleeHitSoundRefs(0)="KF_ClaymoreSnd.Claymore_Impact_Flesh" WideDamageMinHitAngle=0.833333 DamageType=Class'NicePack.NiceDamTypeClaymore' DamageMax=210 bWaitForRelease=True FireAnimRate=1.105263 FireRate=0.950000 BotRefireRate=1.000000 -} +class NiceClaymoreFire extends NiceMeleeFire; +defaultproperties +{ + weaponRange=110.000000 + damageDelay=0.570000 + FireAnims(0)="Fire" + FireAnims(1)="Fire2" + FireAnims(2)="fire3" + FireAnims(3)="Fire4" + FireAnims(4)="Fire5" + FireAnims(5)="Fire6" + HitEffectClass=Class'KFMod.AxeHitEffect' + MeleeHitSoundRefs(0)="KF_ClaymoreSnd.Claymore_Impact_Flesh" + WideDamageMinHitAngle=0.833333 + DamageType=Class'NicePack.NiceDamTypeClaymore' + DamageMax=210 + bWaitForRelease=True + FireAnimRate=1.105263 + FireRate=0.950000 + BotRefireRate=1.000000 +} diff --git a/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreFireB.uc b/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreFireB.uc index 68765fb..380d0af 100644 --- a/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreFireB.uc +++ b/sources/Weapons/Playable/Melee/Claymore/NiceClaymoreFireB.uc @@ -1,4 +1,15 @@ -class NiceClaymoreFireB extends NiceMeleeFire; -defaultproperties -{ weaponRange=110.000000 damageDelay=0.970000 FireAnims(0)="HardAttack" HitEffectClass=Class'KFMod.AxeHitEffect' MeleeHitSoundRefs(0)="KF_ClaymoreSnd.Claymore_Impact_Flesh" WideDamageMinHitAngle=0.600000 DamageType=Class'NicePack.NiceDamTypeClaymore' DamageMax=320 bWaitForRelease=True FireRate=1.250000 BotRefireRate=1.100000 -} +class NiceClaymoreFireB extends NiceMeleeFire; +defaultproperties +{ + weaponRange=110.000000 + damageDelay=0.970000 + FireAnims(0)="HardAttack" + HitEffectClass=Class'KFMod.AxeHitEffect' + MeleeHitSoundRefs(0)="KF_ClaymoreSnd.Claymore_Impact_Flesh" + WideDamageMinHitAngle=0.600000 + DamageType=Class'NicePack.NiceDamTypeClaymore' + DamageMax=320 + bWaitForRelease=True + FireRate=1.250000 + BotRefireRate=1.100000 +} diff --git a/sources/Weapons/Playable/Melee/Claymore/NiceClaymorePickup.uc b/sources/Weapons/Playable/Melee/Claymore/NiceClaymorePickup.uc index e8ced08..be2e848 100644 --- a/sources/Weapons/Playable/Melee/Claymore/NiceClaymorePickup.uc +++ b/sources/Weapons/Playable/Melee/Claymore/NiceClaymorePickup.uc @@ -1,5 +1,20 @@ -class NiceClaymorePickup extends NiceWeaponPickup; -defaultproperties -{ - cost=1000 Weight=6.000000 PowerValue=75 SpeedValue=40 RangeValue=-23 Description="A medieval claymore sword." ItemName="Claymore Sword" ItemShortName="Claymore" CorrespondingPerkIndex=4 InventoryType=Class'NicePack.NiceClaymore' PickupMessage="You got the Claymore Sword." PickupSound=Sound'KF_ClaymoreSnd.foley.WEP_Claymore_Foley_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups3_Trip.melee.Claymore_Pickup' CollisionRadius=27.000000 CollisionHeight=5.000000 -} +class NiceClaymorePickup extends NiceWeaponPickup; +defaultproperties +{ + cost=1000 + Weight=6.000000 + PowerValue=75 + SpeedValue=40 + RangeValue=-23 + Description="A medieval claymore sword." + ItemName="Claymore Sword" + ItemShortName="Claymore" + CorrespondingPerkIndex=4 + InventoryType=Class'NicePack.NiceClaymore' + PickupMessage="You got the Claymore Sword." + PickupSound=Sound'KF_ClaymoreSnd.foley.WEP_Claymore_Foley_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups3_Trip.melee.Claymore_Pickup' + CollisionRadius=27.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Melee/Claymore/NiceDamTypeClaymore.uc b/sources/Weapons/Playable/Melee/Claymore/NiceDamTypeClaymore.uc index 2d45164..098be03 100644 --- a/sources/Weapons/Playable/Melee/Claymore/NiceDamTypeClaymore.uc +++ b/sources/Weapons/Playable/Melee/Claymore/NiceDamTypeClaymore.uc @@ -1,4 +1,9 @@ -class NiceDamTypeClaymore extends NiceDamageTypeVetBerserker; -defaultproperties -{ HeadShotDamageMult=1.500000 WeaponClass=Class'NicePack.NiceClaymore' PawnDamageSounds(0)=Sound'KFPawnDamageSound.MeleeDamageSounds.axehitflesh' KDamageImpulse=3000.000000 VehicleDamageScaling=0.500000 -} +class NiceDamTypeClaymore extends NiceDamageTypeVetBerserker; +defaultproperties +{ + HeadShotDamageMult=1.500000 + WeaponClass=Class'NicePack.NiceClaymore' + PawnDamageSounds(0)=Sound'KFPawnDamageSound.MeleeDamageSounds.axehitflesh' + KDamageImpulse=3000.000000 + VehicleDamageScaling=0.500000 +} diff --git a/sources/Weapons/Playable/Melee/Katana/NiceDamTypeKatana.uc b/sources/Weapons/Playable/Melee/Katana/NiceDamTypeKatana.uc index 7cad523..c76bee9 100644 --- a/sources/Weapons/Playable/Melee/Katana/NiceDamTypeKatana.uc +++ b/sources/Weapons/Playable/Melee/Katana/NiceDamTypeKatana.uc @@ -1,4 +1,8 @@ -class NiceDamTypeKatana extends NiceDamageTypeVetBerserker; -defaultproperties -{ HeadShotDamageMult=1.300000 WeaponClass=Class'NicePack.NiceKatana' PawnDamageSounds(0)=Sound'KFPawnDamageSound.MeleeDamageSounds.axehitflesh' VehicleDamageScaling=0.500000 -} +class NiceDamTypeKatana extends NiceDamageTypeVetBerserker; +defaultproperties +{ + HeadShotDamageMult=1.300000 + WeaponClass=Class'NicePack.NiceKatana' + PawnDamageSounds(0)=Sound'KFPawnDamageSound.MeleeDamageSounds.axehitflesh' + VehicleDamageScaling=0.500000 +} diff --git a/sources/Weapons/Playable/Melee/Katana/NiceKatana.uc b/sources/Weapons/Playable/Melee/Katana/NiceKatana.uc index af33800..8c75aeb 100644 --- a/sources/Weapons/Playable/Melee/Katana/NiceKatana.uc +++ b/sources/Weapons/Playable/Melee/Katana/NiceKatana.uc @@ -1,4 +1,30 @@ -class NiceKatana extends NiceMeleeWeapon; -defaultproperties -{ weaponRange=90.000000 BloodSkinSwitchArray=0 BloodyMaterialRef="KF_Weapons2_Trip_T.melee.Katana_Bloody_cmb" bSpeedMeUp=True Weight=3.000000 StandardDisplayFOV=75.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Katana' bIsTier2Weapon=True MeshRef="KF_Weapons2_Trip.Katana_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.melee.Katana_cmb" SelectSoundRef="KF_KatanaSnd.Katana_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.katana_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Katana" FireModeClass(0)=Class'NicePack.NiceKatanaFire' FireModeClass(1)=Class'NicePack.NiceKatanaFireB' AIRating=0.400000 CurrentRating=0.600000 Description="An incredibly sharp katana sword." DisplayFOV=75.000000 Priority=110 GroupOffset=5 PickupClass=Class'NicePack.NiceKatanaPickup' BobDamping=8.000000 AttachmentClass=Class'NicePack.NiceKatanaAttachment' IconCoords=(X1=246,Y1=80,X2=332,Y2=106) ItemName="Katana" -} +class NiceKatana extends NiceMeleeWeapon; +defaultproperties +{ + weaponRange=90.000000 + BloodSkinSwitchArray=0 + BloodyMaterialRef="KF_Weapons2_Trip_T.melee.Katana_Bloody_cmb" + bSpeedMeUp=True + Weight=3.000000 + StandardDisplayFOV=75.000000 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Katana' + bIsTier2Weapon=True + MeshRef="KF_Weapons2_Trip.Katana_Trip" + SkinRefs(0)="KF_Weapons2_Trip_T.melee.Katana_cmb" + SelectSoundRef="KF_KatanaSnd.Katana_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.katana_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Katana" + FireModeClass(0)=Class'NicePack.NiceKatanaFire' + FireModeClass(1)=Class'NicePack.NiceKatanaFireB' + AIRating=0.400000 + CurrentRating=0.600000 + Description="An incredibly sharp katana sword." + DisplayFOV=75.000000 + Priority=110 + GroupOffset=5 + PickupClass=Class'NicePack.NiceKatanaPickup' + BobDamping=8.000000 + AttachmentClass=Class'NicePack.NiceKatanaAttachment' + IconCoords=(X1=246,Y1=80,X2=332,Y2=106) + ItemName="Katana" +} diff --git a/sources/Weapons/Playable/Melee/Katana/NiceKatanaAttachment.uc b/sources/Weapons/Playable/Melee/Katana/NiceKatanaAttachment.uc index ebeb395..bbc94ad 100644 --- a/sources/Weapons/Playable/Melee/Katana/NiceKatanaAttachment.uc +++ b/sources/Weapons/Playable/Melee/Katana/NiceKatanaAttachment.uc @@ -1,4 +1,45 @@ -class NiceKatanaAttachment extends NiceMeleeAttachment; -defaultproperties -{ MovementAnims(0)="JogF_Katana" MovementAnims(1)="JogB_Katana" MovementAnims(2)="JogL_Katana" MovementAnims(3)="JogR_Katana" TurnLeftAnim="TurnL_Katana" TurnRightAnim="TurnR_Katana" CrouchAnims(0)="CHWalkF_Katana" CrouchAnims(1)="CHWalkB_Katana" CrouchAnims(2)="CHWalkL_Katana" CrouchAnims(3)="CHWalkR_Katana" CrouchTurnRightAnim="CH_TurnR_Katana" CrouchTurnLeftAnim="CH_TurnL_Katana" IdleCrouchAnim="CHIdle_Katana" IdleWeaponAnim="Idle_Katana" IdleRestAnim="Idle_Katana" IdleChatAnim="Idle_Katana" IdleHeavyAnim="Idle_Katana" IdleRifleAnim="Idle_Katana" FireAnims(0)="FastAttack1_Katana" FireAnims(1)="FastAttack2_Katana" FireAnims(2)="FastAttack3_Katana" FireAnims(3)="FastAttack4_Katana" FireAltAnims(0)="HardAttack1_Katana" FireAltAnims(1)="HardAttack1_Katana" FireAltAnims(2)="HardAttack1_Katana" FireAltAnims(3)="HardAttack1_Katana" FireCrouchAnims(0)="CHFastAttack1_Katana" FireCrouchAnims(1)="CHFastAttack2_Katana" FireCrouchAnims(2)="CHFastAttack3_Katana" FireCrouchAnims(3)="CHFastAttack4_Katana" FireCrouchAltAnims(0)="CHHardAttack1_Katana" FireCrouchAltAnims(1)="CHHardAttack1_Katana" FireCrouchAltAnims(2)="CHHardAttack1_Katana" FireCrouchAltAnims(3)="CHHardAttack1_Katana" HitAnims(0)="HitF_Katana" HitAnims(1)="HitB_Katana" HitAnims(2)="HitL_Katana" HitAnims(3)="HitR_Katana" PostFireBlendStandAnim="Blend_Katana" PostFireBlendCrouchAnim="CHBlend_Katana" MeshRef="KF_Weapons3rd_Trip.Katana_3rd" -} +class NiceKatanaAttachment extends NiceMeleeAttachment; +defaultproperties +{ + MovementAnims(0)="JogF_Katana" + MovementAnims(1)="JogB_Katana" + MovementAnims(2)="JogL_Katana" + MovementAnims(3)="JogR_Katana" + TurnLeftAnim="TurnL_Katana" + TurnRightAnim="TurnR_Katana" + CrouchAnims(0)="CHWalkF_Katana" + CrouchAnims(1)="CHWalkB_Katana" + CrouchAnims(2)="CHWalkL_Katana" + CrouchAnims(3)="CHWalkR_Katana" + CrouchTurnRightAnim="CH_TurnR_Katana" + CrouchTurnLeftAnim="CH_TurnL_Katana" + IdleCrouchAnim="CHIdle_Katana" + IdleWeaponAnim="Idle_Katana" + IdleRestAnim="Idle_Katana" + IdleChatAnim="Idle_Katana" + IdleHeavyAnim="Idle_Katana" + IdleRifleAnim="Idle_Katana" + FireAnims(0)="FastAttack1_Katana" + FireAnims(1)="FastAttack2_Katana" + FireAnims(2)="FastAttack3_Katana" + FireAnims(3)="FastAttack4_Katana" + FireAltAnims(0)="HardAttack1_Katana" + FireAltAnims(1)="HardAttack1_Katana" + FireAltAnims(2)="HardAttack1_Katana" + FireAltAnims(3)="HardAttack1_Katana" + FireCrouchAnims(0)="CHFastAttack1_Katana" + FireCrouchAnims(1)="CHFastAttack2_Katana" + FireCrouchAnims(2)="CHFastAttack3_Katana" + FireCrouchAnims(3)="CHFastAttack4_Katana" + FireCrouchAltAnims(0)="CHHardAttack1_Katana" + FireCrouchAltAnims(1)="CHHardAttack1_Katana" + FireCrouchAltAnims(2)="CHHardAttack1_Katana" + FireCrouchAltAnims(3)="CHHardAttack1_Katana" + HitAnims(0)="HitF_Katana" + HitAnims(1)="HitB_Katana" + HitAnims(2)="HitL_Katana" + HitAnims(3)="HitR_Katana" + PostFireBlendStandAnim="Blend_Katana" + PostFireBlendCrouchAnim="CHBlend_Katana" + MeshRef="KF_Weapons3rd_Trip.Katana_3rd" +} diff --git a/sources/Weapons/Playable/Melee/Katana/NiceKatanaFire.uc b/sources/Weapons/Playable/Melee/Katana/NiceKatanaFire.uc index 4da6f8c..d48fff4 100644 --- a/sources/Weapons/Playable/Melee/Katana/NiceKatanaFire.uc +++ b/sources/Weapons/Playable/Melee/Katana/NiceKatanaFire.uc @@ -1,4 +1,19 @@ -class NiceKatanaFire extends NiceMeleeFire; -defaultproperties -{ weaponRange=95.000000 damageDelay=0.358209 FireAnims(0)="Fire" FireAnims(1)="Fire2" FireAnims(2)="fire3" FireAnims(3)="Fire4" FireAnims(4)="Fire5" FireAnims(5)="Fire6" HitEffectClass=Class'KFMod.AxeHitEffect' MeleeHitSoundRefs(0)="KF_KatanaSnd.Katana_HitFlesh" DamageType=Class'NicePack.NiceDamTypeKatana' DamageMax=135 FireAnimRate=0.893333 FireRate=0.750000 BotRefireRate=0.850000 -} +class NiceKatanaFire extends NiceMeleeFire; +defaultproperties +{ + weaponRange=95.000000 + damageDelay=0.358209 + FireAnims(0)="Fire" + FireAnims(1)="Fire2" + FireAnims(2)="fire3" + FireAnims(3)="Fire4" + FireAnims(4)="Fire5" + FireAnims(5)="Fire6" + HitEffectClass=Class'KFMod.AxeHitEffect' + MeleeHitSoundRefs(0)="KF_KatanaSnd.Katana_HitFlesh" + DamageType=Class'NicePack.NiceDamTypeKatana' + DamageMax=135 + FireAnimRate=0.893333 + FireRate=0.750000 + BotRefireRate=0.850000 +} diff --git a/sources/Weapons/Playable/Melee/Katana/NiceKatanaFireB.uc b/sources/Weapons/Playable/Melee/Katana/NiceKatanaFireB.uc index 745d2c6..d1e2ace 100644 --- a/sources/Weapons/Playable/Melee/Katana/NiceKatanaFireB.uc +++ b/sources/Weapons/Playable/Melee/Katana/NiceKatanaFireB.uc @@ -1,4 +1,15 @@ -class NiceKatanaFireB extends NiceMeleeFire; -defaultproperties -{ weaponRange=95.000000 damageDelay=0.650000 FireAnims(0)="HardAttack" HitEffectClass=Class'KFMod.AxeHitEffect' MeleeHitSoundRefs(0)="KF_AxeSnd.Axe_HitFlesh" WideDamageMinHitAngle=0.650000 DamageType=Class'NicePack.NiceDamTypeKatana' DamageMax=205 bWaitForRelease=True FireRate=1.000000 BotRefireRate=0.850000 -} +class NiceKatanaFireB extends NiceMeleeFire; +defaultproperties +{ + weaponRange=95.000000 + damageDelay=0.650000 + FireAnims(0)="HardAttack" + HitEffectClass=Class'KFMod.AxeHitEffect' + MeleeHitSoundRefs(0)="KF_AxeSnd.Axe_HitFlesh" + WideDamageMinHitAngle=0.650000 + DamageType=Class'NicePack.NiceDamTypeKatana' + DamageMax=205 + bWaitForRelease=True + FireRate=1.000000 + BotRefireRate=0.850000 +} diff --git a/sources/Weapons/Playable/Melee/Katana/NiceKatanaPickup.uc b/sources/Weapons/Playable/Melee/Katana/NiceKatanaPickup.uc index 41cbf54..43cdce8 100644 --- a/sources/Weapons/Playable/Melee/Katana/NiceKatanaPickup.uc +++ b/sources/Weapons/Playable/Melee/Katana/NiceKatanaPickup.uc @@ -1,4 +1,21 @@ -class NiceKatanaPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=3.000000 cost=750 PowerValue=60 SpeedValue=55 RangeValue=-21 Description="An incredibly sharp katana sword." ItemName="Katana" ItemShortName="Katana" CorrespondingPerkIndex=4 VariantClasses(0)=Class'KFMod.GoldenKatanaPickup' InventoryType=Class'NicePack.NiceKatana' PickupMessage="You got the Katana." PickupSound=Sound'KF_AxeSnd.Axe_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.melee.Katana_pickup' CollisionRadius=27.000000 CollisionHeight=5.000000 -} +class NiceKatanaPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=3.000000 + cost=750 + PowerValue=60 + SpeedValue=55 + RangeValue=-21 + Description="An incredibly sharp katana sword." + ItemName="Katana" + ItemShortName="Katana" + CorrespondingPerkIndex=4 + VariantClasses(0)=Class'KFMod.GoldenKatanaPickup' + InventoryType=Class'NicePack.NiceKatana' + PickupMessage="You got the Katana." + PickupSound=Sound'KF_AxeSnd.Axe_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups_Trip.melee.Katana_pickup' + CollisionRadius=27.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Melee/Knife/NiceDamTypeKnife.uc b/sources/Weapons/Playable/Melee/Knife/NiceDamTypeKnife.uc index 88d2da2..e60f2d2 100644 --- a/sources/Weapons/Playable/Melee/Knife/NiceDamTypeKnife.uc +++ b/sources/Weapons/Playable/Melee/Knife/NiceDamTypeKnife.uc @@ -1,4 +1,8 @@ -class NiceDamTypeKnife extends NiceDamageTypeVetBerserker; -defaultproperties -{ HeadShotDamageMult=1.100000 WeaponClass=Class'NicePack.NiceKnife' KDamageImpulse=1500.000000 VehicleDamageScaling=0.500000 -} +class NiceDamTypeKnife extends NiceDamageTypeVetBerserker; +defaultproperties +{ + HeadShotDamageMult=1.100000 + WeaponClass=Class'NicePack.NiceKnife' + KDamageImpulse=1500.000000 + VehicleDamageScaling=0.500000 +} diff --git a/sources/Weapons/Playable/Melee/Knife/NiceKnife.uc b/sources/Weapons/Playable/Melee/Knife/NiceKnife.uc index 9cb3478..a9e6ffd 100644 --- a/sources/Weapons/Playable/Melee/Knife/NiceKnife.uc +++ b/sources/Weapons/Playable/Melee/Knife/NiceKnife.uc @@ -1,4 +1,31 @@ -class NiceKnife extends NiceMeleeWeapon; -defaultproperties -{ weaponRange=65.000000 BloodyMaterial=Combiner'KF_Weapons_Trip_T.melee.knife_bloody_cmb' BloodSkinSwitchArray=0 bSpeedMeUp=True HudImage=Texture'KillingFloorHUD.WeaponSelect.knife_unselected' SelectedHudImage=Texture'KillingFloorHUD.WeaponSelect.knife' Weight=0.000000 bKFNeverThrow=True StandardDisplayFOV=75.000000 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Knife' bIsTier2Weapon=True FireModeClass(0)=Class'NicePack.NiceKnifeFire' FireModeClass(1)=Class'NicePack.NiceKnifeFireB' SelectSound=SoundGroup'KF_KnifeSnd.Knife_Select' AIRating=0.200000 CurrentRating=0.200000 Description="Military Combat Knife" DisplayFOV=75.000000 Priority=45 GroupOffset=1 PickupClass=Class'NicePack.NiceKnifePickup' BobDamping=8.000000 AttachmentClass=Class'NicePack.NiceKnifeAttachment' IconCoords=(X1=246,Y1=80,X2=332,Y2=106) ItemName="Knife" Mesh=SkeletalMesh'KF_Weapons_Trip.Knife_Trip' Skins(0)=Combiner'KF_Weapons_Trip_T.melee.knife_cmb' -} +class NiceKnife extends NiceMeleeWeapon; +defaultproperties +{ + weaponRange=65.000000 + BloodyMaterial=Combiner'KF_Weapons_Trip_T.melee.knife_bloody_cmb' + BloodSkinSwitchArray=0 + bSpeedMeUp=True + HudImage=Texture'KillingFloorHUD.WeaponSelect.knife_unselected' + SelectedHudImage=Texture'KillingFloorHUD.WeaponSelect.knife' + Weight=0.000000 + bKFNeverThrow=True + StandardDisplayFOV=75.000000 + TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Knife' + bIsTier2Weapon=True + FireModeClass(0)=Class'NicePack.NiceKnifeFire' + FireModeClass(1)=Class'NicePack.NiceKnifeFireB' + SelectSound=SoundGroup'KF_KnifeSnd.Knife_Select' + AIRating=0.200000 + CurrentRating=0.200000 + Description="Military Combat Knife" + DisplayFOV=75.000000 + Priority=45 + GroupOffset=1 + PickupClass=Class'NicePack.NiceKnifePickup' + BobDamping=8.000000 + AttachmentClass=Class'NicePack.NiceKnifeAttachment' + IconCoords=(X1=246,Y1=80,X2=332,Y2=106) + ItemName="Knife" + Mesh=SkeletalMesh'KF_Weapons_Trip.Knife_Trip' + Skins(0)=Combiner'KF_Weapons_Trip_T.melee.knife_cmb' +} diff --git a/sources/Weapons/Playable/Melee/Knife/NiceKnifeAttachment.uc b/sources/Weapons/Playable/Melee/Knife/NiceKnifeAttachment.uc index f898990..b9ce2d0 100644 --- a/sources/Weapons/Playable/Melee/Knife/NiceKnifeAttachment.uc +++ b/sources/Weapons/Playable/Melee/Knife/NiceKnifeAttachment.uc @@ -1,4 +1,45 @@ -class NiceKnifeAttachment extends NiceMeleeAttachment; -defaultproperties -{ MovementAnims(0)="JogF_Knife" MovementAnims(1)="JogB_Knife" MovementAnims(2)="JogL_Knife" MovementAnims(3)="JogR_Knife" TurnLeftAnim="TurnL_Knife" TurnRightAnim="TurnR_Knife" CrouchAnims(0)="CHwalkF_Knife" CrouchAnims(1)="CHwalkB_Knife" CrouchAnims(2)="CHwalkL_Knife" CrouchAnims(3)="CHwalkR_Knife" CrouchTurnRightAnim="CH_TurnR_Knife" CrouchTurnLeftAnim="CH_TurnL_Knife" IdleCrouchAnim="CHIdle_Knife" IdleWeaponAnim="Idle_Knife" IdleRestAnim="Idle_Knife" IdleChatAnim="Idle_Knife" IdleHeavyAnim="Idle_Knife" IdleRifleAnim="Idle_Knife" FireAnims(0)="Attack2_Knife" FireAnims(1)="Attack2_Knife" FireAnims(2)="Attack2_Knife" FireAnims(3)="Attack2_Knife" FireAltAnims(0)="Attack1_Knife" FireAltAnims(1)="Attack1_Knife" FireAltAnims(2)="Attack1_Knife" FireAltAnims(3)="Attack1_Knife" FireCrouchAnims(0)="CHAttack2_Knife" FireCrouchAnims(1)="CHAttack2_Knife" FireCrouchAnims(2)="CHAttack2_Knife" FireCrouchAnims(3)="CHAttack2_Knife" FireCrouchAltAnims(0)="CHAttack1_Knife" FireCrouchAltAnims(1)="CHAttack1_Knife" FireCrouchAltAnims(2)="CHAttack1_Knife" FireCrouchAltAnims(3)="CHAttack1_Knife" HitAnims(0)="HitF_Knife" HitAnims(1)="HitB_Knife" HitAnims(2)="HitL_Knife" HitAnims(3)="HitR_Knife" PostFireBlendStandAnim="Blend_Knife" PostFireBlendCrouchAnim="CHBlend_Knife" Mesh=SkeletalMesh'KF_Weapons3rd_Trip.Knife_3rd' -} +class NiceKnifeAttachment extends NiceMeleeAttachment; +defaultproperties +{ + MovementAnims(0)="JogF_Knife" + MovementAnims(1)="JogB_Knife" + MovementAnims(2)="JogL_Knife" + MovementAnims(3)="JogR_Knife" + TurnLeftAnim="TurnL_Knife" + TurnRightAnim="TurnR_Knife" + CrouchAnims(0)="CHwalkF_Knife" + CrouchAnims(1)="CHwalkB_Knife" + CrouchAnims(2)="CHwalkL_Knife" + CrouchAnims(3)="CHwalkR_Knife" + CrouchTurnRightAnim="CH_TurnR_Knife" + CrouchTurnLeftAnim="CH_TurnL_Knife" + IdleCrouchAnim="CHIdle_Knife" + IdleWeaponAnim="Idle_Knife" + IdleRestAnim="Idle_Knife" + IdleChatAnim="Idle_Knife" + IdleHeavyAnim="Idle_Knife" + IdleRifleAnim="Idle_Knife" + FireAnims(0)="Attack2_Knife" + FireAnims(1)="Attack2_Knife" + FireAnims(2)="Attack2_Knife" + FireAnims(3)="Attack2_Knife" + FireAltAnims(0)="Attack1_Knife" + FireAltAnims(1)="Attack1_Knife" + FireAltAnims(2)="Attack1_Knife" + FireAltAnims(3)="Attack1_Knife" + FireCrouchAnims(0)="CHAttack2_Knife" + FireCrouchAnims(1)="CHAttack2_Knife" + FireCrouchAnims(2)="CHAttack2_Knife" + FireCrouchAnims(3)="CHAttack2_Knife" + FireCrouchAltAnims(0)="CHAttack1_Knife" + FireCrouchAltAnims(1)="CHAttack1_Knife" + FireCrouchAltAnims(2)="CHAttack1_Knife" + FireCrouchAltAnims(3)="CHAttack1_Knife" + HitAnims(0)="HitF_Knife" + HitAnims(1)="HitB_Knife" + HitAnims(2)="HitL_Knife" + HitAnims(3)="HitR_Knife" + PostFireBlendStandAnim="Blend_Knife" + PostFireBlendCrouchAnim="CHBlend_Knife" + Mesh=SkeletalMesh'KF_Weapons3rd_Trip.Knife_3rd' +} diff --git a/sources/Weapons/Playable/Melee/Knife/NiceKnifeFireB.uc b/sources/Weapons/Playable/Melee/Knife/NiceKnifeFireB.uc index e8bd0c3..d9fcaf8 100644 --- a/sources/Weapons/Playable/Melee/Knife/NiceKnifeFireB.uc +++ b/sources/Weapons/Playable/Melee/Knife/NiceKnifeFireB.uc @@ -1,4 +1,15 @@ -class NiceKnifeFireB extends NiceMeleeFire; -defaultproperties -{ weaponRange=95.000000 damageDelay=0.600000 MeleeHitSounds(0)=SoundGroup'KF_KnifeSnd.Knife_HitFlesh' FireAnims(0)="Stab" HitEffectClass=Class'KFMod.KnifeHitEffect' MeleeHitSoundRefs(0)="KF_AxeSnd.Axe_HitFlesh" DamageType=Class'NicePack.NiceDamTypeKnife' DamageMax=55 bWaitForRelease=True FireRate=1.100000 BotRefireRate=1.100000 -} +class NiceKnifeFireB extends NiceMeleeFire; +defaultproperties +{ + weaponRange=95.000000 + damageDelay=0.600000 + MeleeHitSounds(0)=SoundGroup'KF_KnifeSnd.Knife_HitFlesh' + FireAnims(0)="Stab" + HitEffectClass=Class'KFMod.KnifeHitEffect' + MeleeHitSoundRefs(0)="KF_AxeSnd.Axe_HitFlesh" + DamageType=Class'NicePack.NiceDamTypeKnife' + DamageMax=55 + bWaitForRelease=True + FireRate=1.100000 + BotRefireRate=1.100000 +} diff --git a/sources/Weapons/Playable/Melee/Knife/NiceKnifePickup.uc b/sources/Weapons/Playable/Melee/Knife/NiceKnifePickup.uc index ce322f3..cd6255d 100644 --- a/sources/Weapons/Playable/Melee/Knife/NiceKnifePickup.uc +++ b/sources/Weapons/Playable/Melee/Knife/NiceKnifePickup.uc @@ -1,4 +1,19 @@ -class NiceKnifePickup extends NiceWeaponPickup; -defaultproperties -{ Weight=0.000000 cost=50 PowerValue=5 SpeedValue=60 RangeValue=-20 Description="Basic kitchen utensil. Sharp." ItemName="Knife" ItemShortName="Knife" CorrespondingPerkIndex=4 InventoryType=Class'NicePack.NiceKnife' PickupMessage="You got the Kitchen Knife." PickupSound=None PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.melee.Knife_pickup' CollisionHeight=5.000000 -} +class NiceKnifePickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=0.000000 + cost=50 + PowerValue=5 + SpeedValue=60 + RangeValue=-20 + Description="Basic kitchen utensil. Sharp." + ItemName="Knife" + ItemShortName="Knife" + CorrespondingPerkIndex=4 + InventoryType=Class'NicePack.NiceKnife' + PickupMessage="You got the Kitchen Knife." + PickupSound=None + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups_Trip.melee.Knife_pickup' + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Melee/Machete/NiceDamTypeMachete.uc b/sources/Weapons/Playable/Melee/Machete/NiceDamTypeMachete.uc index 7e02d72..14d973e 100644 --- a/sources/Weapons/Playable/Melee/Machete/NiceDamTypeMachete.uc +++ b/sources/Weapons/Playable/Melee/Machete/NiceDamTypeMachete.uc @@ -1,4 +1,8 @@ -class NiceDamTypeMachete extends NiceDamageTypeVetBerserker; -defaultproperties -{ WeaponClass=Class'NicePack.NiceMachete' PawnDamageSounds(0)=SoundGroup'KF_AxeSnd.Axe_HitFlesh' KDamageImpulse=3000.000000 VehicleDamageScaling=0.500000 -} +class NiceDamTypeMachete extends NiceDamageTypeVetBerserker; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceMachete' + PawnDamageSounds(0)=SoundGroup'KF_AxeSnd.Axe_HitFlesh' + KDamageImpulse=3000.000000 + VehicleDamageScaling=0.500000 +} diff --git a/sources/Weapons/Playable/Melee/Machete/NiceMachete.uc b/sources/Weapons/Playable/Melee/Machete/NiceMachete.uc index bcddbf7..ac7942a 100644 --- a/sources/Weapons/Playable/Melee/Machete/NiceMachete.uc +++ b/sources/Weapons/Playable/Melee/Machete/NiceMachete.uc @@ -1,4 +1,31 @@ -class NiceMachete extends NiceMeleeWeapon; -defaultproperties -{ weaponRange=80.000000 BloodSkinSwitchArray=0 BloodyMaterialRef="KF_Weapons_Trip_T.melee.machete_bloody_cmb" bSpeedMeUp=True Weight=1.000000 StandardDisplayFOV=70.000000 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Machete' bIsTier2Weapon=True MeshRef="KF_Weapons_Trip.Machete_Trip" SkinRefs(0)="KF_Weapons_Trip_T.melee.Machete_cmb" SkinRefs(1)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" SelectSoundRef="KF_MacheteSnd.Machete_Select" HudImageRef="KillingFloorHUD.WeaponSelect.machette_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.machette" FireModeClass(0)=Class'NicePack.NiceMacheteFire' FireModeClass(1)=Class'NicePack.NiceMacheteFireB' AIRating=0.400000 CurrentRating=0.400000 Description="A machete - commonly used for hacking through brush, or the limbs of ZEDs." DisplayFOV=70.000000 Priority=50 GroupOffset=2 PickupClass=Class'NicePack.NiceMachetePickup' BobDamping=8.000000 AttachmentClass=Class'NicePack.NiceMacheteAttachment' IconCoords=(Y1=407,X2=118,Y2=442) ItemName="Machete" -} +class NiceMachete extends NiceMeleeWeapon; +defaultproperties +{ + weaponRange=80.000000 + BloodSkinSwitchArray=0 + BloodyMaterialRef="KF_Weapons_Trip_T.melee.machete_bloody_cmb" + bSpeedMeUp=True + Weight=1.000000 + StandardDisplayFOV=70.000000 + TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Machete' + bIsTier2Weapon=True + MeshRef="KF_Weapons_Trip.Machete_Trip" + SkinRefs(0)="KF_Weapons_Trip_T.melee.Machete_cmb" + SkinRefs(1)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" + SelectSoundRef="KF_MacheteSnd.Machete_Select" + HudImageRef="KillingFloorHUD.WeaponSelect.machette_unselected" + SelectedHudImageRef="KillingFloorHUD.WeaponSelect.machette" + FireModeClass(0)=Class'NicePack.NiceMacheteFire' + FireModeClass(1)=Class'NicePack.NiceMacheteFireB' + AIRating=0.400000 + CurrentRating=0.400000 + Description="A machete - commonly used for hacking through brush, or the limbs of ZEDs." + DisplayFOV=70.000000 + Priority=50 + GroupOffset=2 + PickupClass=Class'NicePack.NiceMachetePickup' + BobDamping=8.000000 + AttachmentClass=Class'NicePack.NiceMacheteAttachment' + IconCoords=(Y1=407,X2=118,Y2=442) + ItemName="Machete" +} diff --git a/sources/Weapons/Playable/Melee/Machete/NiceMacheteAttachment.uc b/sources/Weapons/Playable/Melee/Machete/NiceMacheteAttachment.uc index 5873169..fac19cd 100644 --- a/sources/Weapons/Playable/Melee/Machete/NiceMacheteAttachment.uc +++ b/sources/Weapons/Playable/Melee/Machete/NiceMacheteAttachment.uc @@ -1,4 +1,45 @@ -class NiceMacheteAttachment extends NiceMeleeAttachment; -defaultproperties -{ MovementAnims(0)="JogF_Pipe" MovementAnims(1)="JogB_Pipe" MovementAnims(2)="JogL_Pipe" MovementAnims(3)="JogR_Pipe" TurnLeftAnim="TurnL_Pipe" TurnRightAnim="TurnR_Pipe" CrouchAnims(0)="CHwalkF_Pipe" CrouchAnims(1)="CHwalkB_Pipe" CrouchAnims(2)="CHwalkL_Pipe" CrouchAnims(3)="CHwalkR_Pipe" CrouchTurnRightAnim="CH_TurnR_Pipe" CrouchTurnLeftAnim="CH_TurnL_Pipe" IdleCrouchAnim="CHIdle_Pipe" IdleWeaponAnim="Idle_Pipe" IdleRestAnim="Idle_Pipe" IdleChatAnim="Idle_Pipe" IdleHeavyAnim="Idle_Pipe" IdleRifleAnim="Idle_Pipe" FireAnims(0)="Attack1_Pipe" FireAnims(1)="Attack2_Pipe" FireAnims(2)="Attack3_Pipe" FireAnims(3)="Attack4_Pipe" FireAltAnims(0)="Attack1_Pipe" FireAltAnims(1)="Attack2_Pipe" FireAltAnims(2)="Attack3_Pipe" FireAltAnims(3)="Attack4_Pipe" FireCrouchAnims(0)="CHAttack1_Pipe" FireCrouchAnims(1)="CHAttack2_Pipe" FireCrouchAnims(2)="CHAttack3_Pipe" FireCrouchAnims(3)="CHAttack3_Pipe" FireCrouchAltAnims(0)="CHAttack1_Pipe" FireCrouchAltAnims(1)="CHAttack2_Pipe" FireCrouchAltAnims(2)="CHAttack2_Pipe" FireCrouchAltAnims(3)="CHAttack3_Pipe" HitAnims(0)="HitF_Pipe" HitAnims(1)="HitB_Pipe" HitAnims(2)="HitL_Pipe" HitAnims(3)="HitR_Pipe" PostFireBlendStandAnim="Blend_Pipe" PostFireBlendCrouchAnim="CHBlend_Pipe" MeshRef="KF_Weapons3rd_Trip.machete_3rd" -} +class NiceMacheteAttachment extends NiceMeleeAttachment; +defaultproperties +{ + MovementAnims(0)="JogF_Pipe" + MovementAnims(1)="JogB_Pipe" + MovementAnims(2)="JogL_Pipe" + MovementAnims(3)="JogR_Pipe" + TurnLeftAnim="TurnL_Pipe" + TurnRightAnim="TurnR_Pipe" + CrouchAnims(0)="CHwalkF_Pipe" + CrouchAnims(1)="CHwalkB_Pipe" + CrouchAnims(2)="CHwalkL_Pipe" + CrouchAnims(3)="CHwalkR_Pipe" + CrouchTurnRightAnim="CH_TurnR_Pipe" + CrouchTurnLeftAnim="CH_TurnL_Pipe" + IdleCrouchAnim="CHIdle_Pipe" + IdleWeaponAnim="Idle_Pipe" + IdleRestAnim="Idle_Pipe" + IdleChatAnim="Idle_Pipe" + IdleHeavyAnim="Idle_Pipe" + IdleRifleAnim="Idle_Pipe" + FireAnims(0)="Attack1_Pipe" + FireAnims(1)="Attack2_Pipe" + FireAnims(2)="Attack3_Pipe" + FireAnims(3)="Attack4_Pipe" + FireAltAnims(0)="Attack1_Pipe" + FireAltAnims(1)="Attack2_Pipe" + FireAltAnims(2)="Attack3_Pipe" + FireAltAnims(3)="Attack4_Pipe" + FireCrouchAnims(0)="CHAttack1_Pipe" + FireCrouchAnims(1)="CHAttack2_Pipe" + FireCrouchAnims(2)="CHAttack3_Pipe" + FireCrouchAnims(3)="CHAttack3_Pipe" + FireCrouchAltAnims(0)="CHAttack1_Pipe" + FireCrouchAltAnims(1)="CHAttack2_Pipe" + FireCrouchAltAnims(2)="CHAttack2_Pipe" + FireCrouchAltAnims(3)="CHAttack3_Pipe" + HitAnims(0)="HitF_Pipe" + HitAnims(1)="HitB_Pipe" + HitAnims(2)="HitL_Pipe" + HitAnims(3)="HitR_Pipe" + PostFireBlendStandAnim="Blend_Pipe" + PostFireBlendCrouchAnim="CHBlend_Pipe" + MeshRef="KF_Weapons3rd_Trip.machete_3rd" +} diff --git a/sources/Weapons/Playable/Melee/Machete/NiceMacheteFireB.uc b/sources/Weapons/Playable/Melee/Machete/NiceMacheteFireB.uc index 43c5630..8c7192f 100644 --- a/sources/Weapons/Playable/Melee/Machete/NiceMacheteFireB.uc +++ b/sources/Weapons/Playable/Melee/Machete/NiceMacheteFireB.uc @@ -1,4 +1,14 @@ -class NiceMacheteFireB extends NiceMeleeFire; -defaultproperties -{ weaponRange=95.000000 damageDelay=0.710000 FireAnims(0)="PowerAttack" HitEffectClass=Class'KFMod.KnifeHitEffect' MeleeHitSoundRefs(0)="KF_AxeSnd.Axe_HitFlesh" DamageType=Class'NicePack.NiceDamTypeMachete' DamageMax=130 bWaitForRelease=True FireRate=1.100000 BotRefireRate=0.710000 -} +class NiceMacheteFireB extends NiceMeleeFire; +defaultproperties +{ + weaponRange=95.000000 + damageDelay=0.710000 + FireAnims(0)="PowerAttack" + HitEffectClass=Class'KFMod.KnifeHitEffect' + MeleeHitSoundRefs(0)="KF_AxeSnd.Axe_HitFlesh" + DamageType=Class'NicePack.NiceDamTypeMachete' + DamageMax=130 + bWaitForRelease=True + FireRate=1.100000 + BotRefireRate=0.710000 +} diff --git a/sources/Weapons/Playable/Melee/Machete/NiceMachetePickup.uc b/sources/Weapons/Playable/Melee/Machete/NiceMachetePickup.uc index 9f9b2f7..3d6ec5b 100644 --- a/sources/Weapons/Playable/Melee/Machete/NiceMachetePickup.uc +++ b/sources/Weapons/Playable/Melee/Machete/NiceMachetePickup.uc @@ -1,4 +1,20 @@ -class NiceMachetePickup extends NiceWeaponPickup; -defaultproperties -{ Weight=1.000000 cost=200 PowerValue=35 SpeedValue=56 RangeValue=-20 Description="A machete - commonly used for hacking through brush, or the limbs of ZEDs." ItemName="Machete" ItemShortName="Machete" CorrespondingPerkIndex=4 InventoryType=Class'NicePack.NiceMachete' PickupMessage="You got a machete." PickupSound=Sound'KF_MacheteSnd.Machete_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.melee.machette_pickup' CollisionRadius=28.000000 CollisionHeight=5.000000 -} +class NiceMachetePickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=1.000000 + cost=200 + PowerValue=35 + SpeedValue=56 + RangeValue=-20 + Description="A machete - commonly used for hacking through brush, or the limbs of ZEDs." + ItemName="Machete" + ItemShortName="Machete" + CorrespondingPerkIndex=4 + InventoryType=Class'NicePack.NiceMachete' + PickupMessage="You got a machete." + PickupSound=Sound'KF_MacheteSnd.Machete_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups_Trip.melee.machette_pickup' + CollisionRadius=28.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/PKM/NiceDamTypePKM.uc b/sources/Weapons/Playable/PKM/NiceDamTypePKM.uc index d09ff6b..4a9977f 100644 --- a/sources/Weapons/Playable/PKM/NiceDamTypePKM.uc +++ b/sources/Weapons/Playable/PKM/NiceDamTypePKM.uc @@ -1,5 +1,17 @@ -class NiceDamTypePKM extends NiceDamageTypeVetEnforcerBullets - abstract; -defaultproperties -{ WeaponClass=Class'NicePack.NicePKM' DeathString="%k killed %o (PKM)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' DeathOverlayTime=999.000000 KDamageImpulse=8500.000000 KDeathVel=1000.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 -} +class NiceDamTypePKM extends NiceDamageTypeVetEnforcerBullets + abstract; +defaultproperties +{ + WeaponClass=Class'NicePack.NicePKM' + DeathString="%k killed %o (PKM)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + DeathOverlayMaterial=Combiner'Effects_Tex.GoreDecals.PlayerDeathOverlay' + DeathOverlayTime=999.000000 + KDamageImpulse=8500.000000 + KDeathVel=1000.000000 + KDeathUpKick=100.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/PKM/NicePKM.uc b/sources/Weapons/Playable/PKM/NicePKM.uc index 688150d..3c1dd53 100644 --- a/sources/Weapons/Playable/PKM/NicePKM.uc +++ b/sources/Weapons/Playable/PKM/NicePKM.uc @@ -1,4 +1,56 @@ -class NicePKM extends NiceAssaultRifle; -defaultproperties -{ bSemiAutoFireEnabled=False reloadPreEndFrame=0.079000 reloadEndFrame=0.758000 reloadChargeEndFrame=0.858000 reloadMagStartFrame=0.356000 reloadChargeStartFrame=0.805000 MagazineBone="cartridge01" MagCapacity=80 ReloadRate=6.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 FlashBoneName="tip_1" WeaponReloadAnim="Reload_M14" bHasAimingMode=True IdleAimAnim="Iron_Idle" QuickPutDownTime=0.300000 QuickBringUpTime=0.300000 StandardDisplayFOV=65.000000 SleeveNum=2 TraderInfoTexture=Texture'HMG_T.PKM.PKM_Trader' bIsTier2Weapon=True MeshRef="HMG_A.pkmmesh" SkinRefs(0)="HMG_T.PKM.wpn_pkm" SkinRefs(1)="HMG_T.PKM.wpn_pkm_lenta" SkinRefs(2)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" SelectSoundRef="HMG_S.PKM.pkm_draw" HudImageRef="HMG_T.PKM.PKM_Unselected" SelectedHudImageRef="HMG_T.PKM.PKM_selected" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NicePKMFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="The PKM (Kalashnikov's Machine-gun Modernized) adopted to service in 1969. It is a modernized, product-improved version of the PK (Pulemyot Kalashnikova)." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=190 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=7 PickupClass=Class'NicePack.NicePKMPickup' PlayerViewOffset=(X=-10.000000,Y=18.000000,Z=-11.000000) BobDamping=5.000000 AttachmentClass=Class'NicePack.NicePKMAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="PKM" TransientSoundVolume=1.250000 -} +class NicePKM extends NiceAssaultRifle; +defaultproperties +{ + bSemiAutoFireEnabled=False + reloadPreEndFrame=0.079000 + reloadEndFrame=0.758000 + reloadChargeEndFrame=0.858000 + reloadMagStartFrame=0.356000 + reloadChargeStartFrame=0.805000 + MagazineBone="cartridge01" + MagCapacity=80 + ReloadRate=6.000000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + FlashBoneName="tip_1" + WeaponReloadAnim="Reload_M14" + bHasAimingMode=True + IdleAimAnim="Iron_Idle" + QuickPutDownTime=0.300000 + QuickBringUpTime=0.300000 + StandardDisplayFOV=65.000000 + SleeveNum=2 + TraderInfoTexture=Texture'HMG_T.PKM.PKM_Trader' + bIsTier2Weapon=True + MeshRef="HMG_A.pkmmesh" + SkinRefs(0)="HMG_T.PKM.wpn_pkm" + SkinRefs(1)="HMG_T.PKM.wpn_pkm_lenta" + SkinRefs(2)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" + SelectSoundRef="HMG_S.PKM.pkm_draw" + HudImageRef="HMG_T.PKM.PKM_Unselected" + SelectedHudImageRef="HMG_T.PKM.PKM_selected" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=32.000000 + FireModeClass(0)=Class'NicePack.NicePKMFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="The PKM (Kalashnikov's Machine-gun Modernized) adopted to service in 1969. It is a modernized, product-improved version of the PK (Pulemyot Kalashnikova)." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=65.000000 + Priority=190 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=3 + GroupOffset=7 + PickupClass=Class'NicePack.NicePKMPickup' + PlayerViewOffset=(X=-10.000000,Y=18.000000,Z=-11.000000) + BobDamping=5.000000 + AttachmentClass=Class'NicePack.NicePKMAttachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="PKM" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/PKM/NicePKMAmmo.uc b/sources/Weapons/Playable/PKM/NicePKMAmmo.uc index 1304220..5573fcf 100644 --- a/sources/Weapons/Playable/PKM/NicePKMAmmo.uc +++ b/sources/Weapons/Playable/PKM/NicePKMAmmo.uc @@ -1,5 +1,13 @@ -class NicePKMAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NicePKMPickup' AmmoPickupAmount=80 MaxAmmo=240 InitialAmount=120 PickupClass=Class'NicePack.NicePKMAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="Rounds 7.62mm" -} +class NicePKMAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NicePKMPickup' + AmmoPickupAmount=80 + MaxAmmo=240 + InitialAmount=120 + PickupClass=Class'NicePack.NicePKMAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="Rounds 7.62mm" +} diff --git a/sources/Weapons/Playable/PKM/NicePKMAmmoPickup.uc b/sources/Weapons/Playable/PKM/NicePKMAmmoPickup.uc index 0bb8a5c..ce35d1d 100644 --- a/sources/Weapons/Playable/PKM/NicePKMAmmoPickup.uc +++ b/sources/Weapons/Playable/PKM/NicePKMAmmoPickup.uc @@ -1,4 +1,8 @@ -class NicePKMAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=80 InventoryType=Class'NicePack.NicePKMAmmo' PickupMessage="7.62mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NicePKMAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=80 + InventoryType=Class'NicePack.NicePKMAmmo' + PickupMessage="7.62mm" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/PKM/NicePKMAttachment.uc b/sources/Weapons/Playable/PKM/NicePKMAttachment.uc index 0e2591b..3f8aa10 100644 --- a/sources/Weapons/Playable/PKM/NicePKMAttachment.uc +++ b/sources/Weapons/Playable/PKM/NicePKMAttachment.uc @@ -1,9 +1,66 @@ -class NicePKMAttachment extends NiceAttachment; -simulated function DoFlashEmitter(){ - if(mMuzFlash3rd == none){ mMuzFlash3rd = Spawn(mMuzFlashClass); AttachToBone(mMuzFlash3rd, 'wpn_silencer'); - } - if(mMuzFlash3rd != none) mMuzFlash3rd.SpawnParticle(1); -} -defaultproperties -{ mMuzFlashClass=Class'ScrnHMG.MuzzleFlash3rdPKM' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'ScrnHMG.PKMShellSpewer' ShellEjectBoneName="magazin" MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="Fire_AK47" FireAltAnims(1)="Fire_AK47" FireAltAnims(2)="Fire_AK47" FireAltAnims(3)="Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="HMG_A.pkm3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 DrawScale=0.700000 -} +class NicePKMAttachment extends NiceAttachment; +simulated function DoFlashEmitter(){ + if(mMuzFlash3rd == none){ + mMuzFlash3rd = Spawn(mMuzFlashClass); + AttachToBone(mMuzFlash3rd, 'wpn_silencer'); + } + if(mMuzFlash3rd != none) + mMuzFlash3rd.SpawnParticle(1); +} +defaultproperties +{ + mMuzFlashClass=Class'ScrnHMG.MuzzleFlash3rdPKM' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'ScrnHMG.PKMShellSpewer' + ShellEjectBoneName="magazin" + MovementAnims(0)="JogF_AK47" + MovementAnims(1)="JogB_AK47" + MovementAnims(2)="JogL_AK47" + MovementAnims(3)="JogR_AK47" + TurnLeftAnim="TurnL_AK47" + TurnRightAnim="TurnR_AK47" + CrouchAnims(0)="CHWalkF_AK47" + CrouchAnims(1)="CHWalkB_AK47" + CrouchAnims(2)="CHWalkL_AK47" + CrouchAnims(3)="CHWalkR_AK47" + WalkAnims(0)="WalkF_AK47" + WalkAnims(1)="WalkB_AK47" + WalkAnims(2)="WalkL_AK47" + WalkAnims(3)="WalkR_AK47" + CrouchTurnRightAnim="CH_TurnR_AK47" + CrouchTurnLeftAnim="CH_TurnL_AK47" + IdleCrouchAnim="CHIdle_AK47" + IdleWeaponAnim="Idle_AK47" + IdleRestAnim="Idle_AK47" + IdleChatAnim="Idle_AK47" + IdleHeavyAnim="Idle_AK47" + IdleRifleAnim="Idle_AK47" + FireAnims(0)="Fire_AK47" + FireAnims(1)="Fire_AK47" + FireAnims(2)="Fire_AK47" + FireAnims(3)="Fire_AK47" + FireAltAnims(0)="Fire_AK47" + FireAltAnims(1)="Fire_AK47" + FireAltAnims(2)="Fire_AK47" + FireAltAnims(3)="Fire_AK47" + FireCrouchAnims(0)="CHFire_AK47" + FireCrouchAnims(1)="CHFire_AK47" + FireCrouchAnims(2)="CHFire_AK47" + FireCrouchAnims(3)="CHFire_AK47" + FireCrouchAltAnims(0)="CHFire_AK47" + FireCrouchAltAnims(1)="CHFire_AK47" + FireCrouchAltAnims(2)="CHFire_AK47" + FireCrouchAltAnims(3)="CHFire_AK47" + HitAnims(0)="HitF_AK47" + HitAnims(1)="HitB_AK47" + HitAnims(2)="HitL_AK47" + HitAnims(3)="HitR_AK47" + PostFireBlendStandAnim="Blend_AK47" + PostFireBlendCrouchAnim="CHBlend_AK47" + MeshRef="HMG_A.pkm3rd" + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 + DrawScale=0.700000 +} diff --git a/sources/Weapons/Playable/PKM/NicePKMFire.uc b/sources/Weapons/Playable/PKM/NicePKMFire.uc index 91b13dd..c1ae794 100644 --- a/sources/Weapons/Playable/PKM/NicePKMFire.uc +++ b/sources/Weapons/Playable/PKM/NicePKMFire.uc @@ -1,4 +1,37 @@ -class NicePKMFire extends NiceHeavyFire; -defaultproperties -{ ProjectileSpeed=41250.000000 MaxBurstLength=5 FireAimedAnim="Fire" RecoilRate=0.055000 maxVerticalRecoilAngle=600 maxHorizontalRecoilAngle=300 ShellEjectClass=Class'ScrnHMG.KFShellEjectPKM' ShellEjectBoneName="shell_13" bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False FireSoundRef="HMG_S.PKM.pkm_shoot_mono" StereoFireSoundRef="HMG_S.PKM.pkm_shoot_stereo" NoAmmoSoundRef="HMG_S.PKM.pkm_empty" DamageType=Class'NicePack.NiceDamTypePKM' DamageMin=104 DamageMax=104 Momentum=10900.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.500000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.095000 AmmoClass=Class'NicePack.NicePKMAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.990000 FlashEmitterClass=Class'ScrnHMG.MuzzleFlash1stPKM' aimerror=42.000000 -} +class NicePKMFire extends NiceHeavyFire; +defaultproperties +{ + ProjectileSpeed=41250.000000 + MaxBurstLength=5 + FireAimedAnim="Fire" + RecoilRate=0.055000 + maxVerticalRecoilAngle=600 + maxHorizontalRecoilAngle=300 + ShellEjectClass=Class'ScrnHMG.KFShellEjectPKM' + ShellEjectBoneName="shell_13" + bAccuracyBonusForSemiAuto=True + bRandomPitchFireSound=False + FireSoundRef="HMG_S.PKM.pkm_shoot_mono" + StereoFireSoundRef="HMG_S.PKM.pkm_shoot_stereo" + NoAmmoSoundRef="HMG_S.PKM.pkm_empty" + DamageType=Class'NicePack.NiceDamTypePKM' + DamageMin=104 + DamageMax=104 + Momentum=10900.000000 + bPawnRapidFireAnim=True + TransientSoundVolume=1.500000 + FireLoopAnim="Fire" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.095000 + AmmoClass=Class'NicePack.NicePKMAmmo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) + ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) + ShakeRotTime=0.750000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.250000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ScrnHMG.MuzzleFlash1stPKM' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/PKM/NicePKMPickup.uc b/sources/Weapons/Playable/PKM/NicePKMPickup.uc index b7c6dc5..a550176 100644 --- a/sources/Weapons/Playable/PKM/NicePKMPickup.uc +++ b/sources/Weapons/Playable/PKM/NicePKMPickup.uc @@ -1,5 +1,24 @@ -class NicePKMPickup extends NiceWeaponPickup; -defaultproperties -{ - cost=1000 AmmoCost=160 BuyClipSize=80 PowerValue=55 SpeedValue=86 RangeValue=70 Description="The PKM (Kalashnikov's Machine-gun Modernized) adopted to service in 1969. It is a modernized, product-improved version of the PK (Pulemyot Kalashnikova)" ItemName="PKM" ItemShortName="PKM" AmmoItemName="PKM 7.62x54mmR" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=1 EquipmentCategoryID=2 InventoryType=Class'NicePack.NicePKM' PickupMessage="You picked up the PKM" PickupSound=Sound'HMG_S.PKM.pkm_holster' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'HMG_A.PkmSM' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NicePKMPickup extends NiceWeaponPickup; +defaultproperties +{ + cost=1000 + AmmoCost=160 + BuyClipSize=80 + PowerValue=55 + SpeedValue=86 + RangeValue=70 + Description="The PKM (Kalashnikov's Machine-gun Modernized) adopted to service in 1969. It is a modernized, product-improved version of the PK (Pulemyot Kalashnikova)" + ItemName="PKM" + ItemShortName="PKM" + AmmoItemName="PKM 7.62x54mmR" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=1 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NicePKM' + PickupMessage="You picked up the PKM" + PickupSound=Sound'HMG_S.PKM.pkm_holster' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'HMG_A.PkmSM' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Pistols/9mm/Nice9mmAmmo.uc b/sources/Weapons/Playable/Pistols/9mm/Nice9mmAmmo.uc index 9365ee1..679a8e4 100644 --- a/sources/Weapons/Playable/Pistols/9mm/Nice9mmAmmo.uc +++ b/sources/Weapons/Playable/Pistols/9mm/Nice9mmAmmo.uc @@ -1,5 +1,13 @@ -class Nice9mmAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=InterfaceContent.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.Nice9mmPickup' AmmoPickupAmount=30 MaxAmmo=240 InitialAmount=60 PickupClass=Class'KFMod.SingleAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=413,Y1=82,X2=457,Y2=125) ItemName="9mm bullets" -} +class Nice9mmAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.Nice9mmPickup' + AmmoPickupAmount=30 + MaxAmmo=240 + InitialAmount=60 + PickupClass=Class'KFMod.SingleAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=413,Y1=82,X2=457,Y2=125) + ItemName="9mm bullets" +} diff --git a/sources/Weapons/Playable/Pistols/9mm/Nice9mmAmmoPickup.uc b/sources/Weapons/Playable/Pistols/9mm/Nice9mmAmmoPickup.uc index 0ceaa92..c83c034 100644 --- a/sources/Weapons/Playable/Pistols/9mm/Nice9mmAmmoPickup.uc +++ b/sources/Weapons/Playable/Pistols/9mm/Nice9mmAmmoPickup.uc @@ -1,4 +1,9 @@ -class Nice9mmAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=30 InventoryType=Class'NicePack.Nice9mmAmmo' RespawnTime=0.000000 PickupMessage="Rounds (9mm)" StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' -} +class Nice9mmAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=30 + InventoryType=Class'NicePack.Nice9mmAmmo' + RespawnTime=0.000000 + PickupMessage="Rounds (9mm)" + StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/9mm/Nice9mmAttachment.uc b/sources/Weapons/Playable/Pistols/9mm/Nice9mmAttachment.uc index 52f7fa9..65ce2f7 100644 --- a/sources/Weapons/Playable/Pistols/9mm/Nice9mmAttachment.uc +++ b/sources/Weapons/Playable/Pistols/9mm/Nice9mmAttachment.uc @@ -1,4 +1,5 @@ -class Nice9mmAttachment extends NiceSingleAttachment; -defaultproperties -{ Mesh=SkeletalMesh'KF_Weapons3rd_Trip.Single9mm_3rd' -} +class Nice9mmAttachment extends NiceSingleAttachment; +defaultproperties +{ + Mesh=SkeletalMesh'KF_Weapons3rd_Trip.Single9mm_3rd' +} diff --git a/sources/Weapons/Playable/Pistols/9mm/Nice9mmFire.uc b/sources/Weapons/Playable/Pistols/9mm/Nice9mmFire.uc index 17db5be..3b3f2b2 100644 --- a/sources/Weapons/Playable/Pistols/9mm/Nice9mmFire.uc +++ b/sources/Weapons/Playable/Pistols/9mm/Nice9mmFire.uc @@ -1,4 +1,12 @@ -class Nice9mmFire extends NiceSingleFire; -defaultproperties -{ ProjectileSpeed=21300.000000 maxVerticalRecoilAngle=75 maxHorizontalRecoilAngle=35 StereoFireSound=SoundGroup'KF_9MMSnd.9mm_FireST' DamageType=Class'NicePack.NiceDamType9mm' FireSound=SoundGroup'KF_9MMSnd.9mm_Fire' NoAmmoSound=Sound'KF_9MMSnd.9mm_DryFire' AmmoClass=Class'NicePack.Nice9mmAmmo' -} +class Nice9mmFire extends NiceSingleFire; +defaultproperties +{ + ProjectileSpeed=21300.000000 + maxVerticalRecoilAngle=75 + maxHorizontalRecoilAngle=35 + StereoFireSound=SoundGroup'KF_9MMSnd.9mm_FireST' + DamageType=Class'NicePack.NiceDamType9mm' + FireSound=SoundGroup'KF_9MMSnd.9mm_Fire' + NoAmmoSound=Sound'KF_9MMSnd.9mm_DryFire' + AmmoClass=Class'NicePack.Nice9mmAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/9mm/Nice9mmPickup.uc b/sources/Weapons/Playable/Pistols/9mm/Nice9mmPickup.uc index 28a220a..049f28f 100644 --- a/sources/Weapons/Playable/Pistols/9mm/Nice9mmPickup.uc +++ b/sources/Weapons/Playable/Pistols/9mm/Nice9mmPickup.uc @@ -1,4 +1,10 @@ -class Nice9mmPickup extends NiceSinglePickup; -defaultproperties -{ bBackupWeapon=True cost=100 Description="A 9mm Pistol. What it lacks in stopping power, it compensates for with a quick refire." ItemName="Beretta" ItemShortName="Beretta" InventoryType=Class'NicePack.Nice9mm' -} +class Nice9mmPickup extends NiceSinglePickup; +defaultproperties +{ + bBackupWeapon=True + cost=100 + Description="A 9mm Pistol. What it lacks in stopping power, it compensates for with a quick refire." + ItemName="Beretta" + ItemShortName="Beretta" + InventoryType=Class'NicePack.Nice9mm' +} diff --git a/sources/Weapons/Playable/Pistols/9mm/NiceDamType9mm.uc b/sources/Weapons/Playable/Pistols/9mm/NiceDamType9mm.uc index e28498d..8a0f926 100644 --- a/sources/Weapons/Playable/Pistols/9mm/NiceDamType9mm.uc +++ b/sources/Weapons/Playable/Pistols/9mm/NiceDamType9mm.uc @@ -1,5 +1,16 @@ -class NiceDamType9mm extends NiceWeaponDamageType - abstract; -defaultproperties -{ HeadShotDamageMult=1.000000 WeaponClass=Class'NicePack.Nice9mm' DeathString="%k killed %o (Beretta)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=750.000000 KDeathVel=100.000000 VehicleDamageScaling=0.700000 -} +class NiceDamType9mm extends NiceWeaponDamageType + abstract; +defaultproperties +{ + HeadShotDamageMult=1.000000 + WeaponClass=Class'NicePack.Nice9mm' + DeathString="%k killed %o (Beretta)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + FlashFog=(X=600.000000) + KDamageImpulse=750.000000 + KDeathVel=100.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mm.uc b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mm.uc index 7051d4e..ff38c9a 100644 --- a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mm.uc +++ b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mm.uc @@ -1,4 +1,16 @@ -class NiceDual9mm extends NiceDualies; -defaultproperties -{ SingleClass=Class'NicePack.Nice9mm' HudImage=Texture'KillingFloorHUD.WeaponSelect.dual_9mm_unselected' SelectedHudImage=Texture'KillingFloorHUD.WeaponSelect.dual_9mm' Weight=1.000000 FireModeClass(0)=Class'NicePack.NiceDual9mmFire' SelectSound=Sound'KFPlayerSound.getweaponout' Description="A pair of 9mm pistols. What they lack in stopping power, they compensate for with a quick refire." PickupClass=Class'NicePack.NiceDual9mmPickup' AttachmentClass=Class'NicePack.NiceDual9mmAttachment' ItemName="Dual Berettas" Mesh=SkeletalMesh'KF_Weapons_Trip.Dual9mm' Skins(0)=Combiner'KF_Weapons_Trip_T.Pistols.Ninemm_cmb' -} +class NiceDual9mm extends NiceDualies; +defaultproperties +{ + SingleClass=Class'NicePack.Nice9mm' + HudImage=Texture'KillingFloorHUD.WeaponSelect.dual_9mm_unselected' + SelectedHudImage=Texture'KillingFloorHUD.WeaponSelect.dual_9mm' + Weight=1.000000 + FireModeClass(0)=Class'NicePack.NiceDual9mmFire' + SelectSound=Sound'KFPlayerSound.getweaponout' + Description="A pair of 9mm pistols. What they lack in stopping power, they compensate for with a quick refire." + PickupClass=Class'NicePack.NiceDual9mmPickup' + AttachmentClass=Class'NicePack.NiceDual9mmAttachment' + ItemName="Dual Berettas" + Mesh=SkeletalMesh'KF_Weapons_Trip.Dual9mm' + Skins(0)=Combiner'KF_Weapons_Trip_T.Pistols.Ninemm_cmb' +} diff --git a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAmmo.uc b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAmmo.uc index 1583e0c..34e5444 100644 --- a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAmmo.uc +++ b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAmmo.uc @@ -1,5 +1,13 @@ -class NiceDual9mmAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=InterfaceContent.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceDual9mmPickup' AmmoPickupAmount=15 MaxAmmo=240 InitialAmount=60 PickupClass=Class'NicePack.NiceDual9mmAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=413,Y1=82,X2=457,Y2=125) ItemName="Dual 9mm bullets" -} +class NiceDual9mmAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceDual9mmPickup' + AmmoPickupAmount=15 + MaxAmmo=240 + InitialAmount=60 + PickupClass=Class'NicePack.NiceDual9mmAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=413,Y1=82,X2=457,Y2=125) + ItemName="Dual 9mm bullets" +} diff --git a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAmmoPickup.uc b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAmmoPickup.uc index f23d803..1fe6eb1 100644 --- a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAmmoPickup.uc +++ b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceDual9mmAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=15 InventoryType=Class'NicePack.NiceDual9mmAmmo' PickupMessage="Rounds (9mm)" StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' -} +class NiceDual9mmAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=15 + InventoryType=Class'NicePack.NiceDual9mmAmmo' + PickupMessage="Rounds (9mm)" + StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAttachment.uc b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAttachment.uc index 2d2c776..ff98089 100644 --- a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAttachment.uc +++ b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmAttachment.uc @@ -1,4 +1,5 @@ -class NiceDual9mmAttachment extends NiceDualiesAttachment; -defaultproperties -{ Mesh=SkeletalMesh'KF_Weapons3rd_Trip.Single9mm_3rd' -} +class NiceDual9mmAttachment extends NiceDualiesAttachment; +defaultproperties +{ + Mesh=SkeletalMesh'KF_Weapons3rd_Trip.Single9mm_3rd' +} diff --git a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmFire.uc b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmFire.uc index 326f8c4..da51755 100644 --- a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmFire.uc +++ b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmFire.uc @@ -1,4 +1,12 @@ -class NiceDual9mmFire extends NiceDualiesFire; -defaultproperties -{ ProjectileSpeed=19000.000000 maxVerticalRecoilAngle=75 maxHorizontalRecoilAngle=35 StereoFireSound=SoundGroup'KF_9MMSnd.9mm_FireST' DamageType=Class'NicePack.NiceDamType9mm' FireSound=SoundGroup'KF_9MMSnd.9mm_Fire' NoAmmoSound=Sound'KF_9MMSnd.9mm_DryFire' AmmoClass=Class'NicePack.NiceDual9mmAmmo' -} +class NiceDual9mmFire extends NiceDualiesFire; +defaultproperties +{ + ProjectileSpeed=19000.000000 + maxVerticalRecoilAngle=75 + maxHorizontalRecoilAngle=35 + StereoFireSound=SoundGroup'KF_9MMSnd.9mm_FireST' + DamageType=Class'NicePack.NiceDamType9mm' + FireSound=SoundGroup'KF_9MMSnd.9mm_Fire' + NoAmmoSound=Sound'KF_9MMSnd.9mm_DryFire' + AmmoClass=Class'NicePack.NiceDual9mmAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmPickup.uc b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmPickup.uc index 45fe85a..b0c12f1 100644 --- a/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmPickup.uc +++ b/sources/Weapons/Playable/Pistols/9mm/NiceDual9mmPickup.uc @@ -1,4 +1,9 @@ -class NiceDual9mmPickup extends NiceDualiesPickup; -defaultproperties -{ bBackupWeapon=True cost=200 ItemName="Dual Berettas" ItemShortName="Dual Berettas" InventoryType=Class'NicePack.NiceDual9mm' -} +class NiceDual9mmPickup extends NiceDualiesPickup; +defaultproperties +{ + bBackupWeapon=True + cost=200 + ItemName="Dual Berettas" + ItemShortName="Dual Berettas" + InventoryType=Class'NicePack.NiceDual9mm' +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlus.uc b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlus.uc index fb15080..bd16623 100644 --- a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlus.uc +++ b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlus.uc @@ -1,18 +1,47 @@ -class Nice9mmPlus extends NiceSingle; -simulated function AltFire(float F){ - if(bIsDual) super.AltFire(F); - else ToggleLaser(); -} -simulated function SecondDoToggle(){ - ToggleLaser(); -} -simulated function ToggleLaser(){ - if(!Instigator.IsLocallyControlled()) return; - // Will redo this bit later, but so far it'll have to do - if(LaserType == 0) LaserType = 1; - else LaserType = 0; - ApplyLaserState(); -} -defaultproperties -{ DualClass=Class'NicePack.NiceDual9mmPlus' bUseFlashlightToToggle=True reloadPreEndFrame=0.117000 reloadEndFrame=0.617000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.167000 reloadChargeStartFrame=-1.000000 bTorchEnabled=True SleeveNum=0 TraderInfoTexture=Texture'NicePackT.NinePP.HUD_Single_Trader' MeshRef="NicePackA.NinePP.Single_1P" SkinRefs(1)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" SkinRefs(2)="ScrnWeaponPack_T.MedicPistol.frame_cmb" SkinRefs(3)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" SkinRefs(4)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" SelectSoundRef="KF_9MMSnd.9mm_Select" HudImageRef="NicePackT.NinePP.HUD_Single_UnSelected" SelectedHudImageRef="NicePackT.NinePP.HUD_Single_Selected" FireModeClass(0)=Class'NicePack.Nice9mmPlusFire' Description="A 9mm handgun, with a functional laser sight and flashlight. The barrel has been replaced with one that can chamber hotter ammunition loads, meaning faster bullets, meaning more damage!" GroupOffset=3 PickupClass=Class'NicePack.Nice9mmPlusPickup' AttachmentClass=Class'NicePack.Nice9mmPlusAttachment' ItemName="Beretta" -} +class Nice9mmPlus extends NiceSingle; +simulated function AltFire(float F){ + if(bIsDual) + super.AltFire(F); + else + ToggleLaser(); +} +simulated function SecondDoToggle(){ + ToggleLaser(); +} +simulated function ToggleLaser(){ + if(!Instigator.IsLocallyControlled()) + return; + // Will redo this bit later, but so far it'll have to do + if(LaserType == 0) + LaserType = 1; + else + LaserType = 0; + ApplyLaserState(); +} +defaultproperties +{ + DualClass=Class'NicePack.NiceDual9mmPlus' + bUseFlashlightToToggle=True + reloadPreEndFrame=0.117000 + reloadEndFrame=0.617000 + reloadChargeEndFrame=-1.000000 + reloadMagStartFrame=0.167000 + reloadChargeStartFrame=-1.000000 + bTorchEnabled=True + SleeveNum=0 + TraderInfoTexture=Texture'NicePackT.NinePP.HUD_Single_Trader' + MeshRef="NicePackA.NinePP.Single_1P" + SkinRefs(1)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" + SkinRefs(2)="ScrnWeaponPack_T.MedicPistol.frame_cmb" + SkinRefs(3)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" + SkinRefs(4)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" + SelectSoundRef="KF_9MMSnd.9mm_Select" + HudImageRef="NicePackT.NinePP.HUD_Single_UnSelected" + SelectedHudImageRef="NicePackT.NinePP.HUD_Single_Selected" + FireModeClass(0)=Class'NicePack.Nice9mmPlusFire' + Description="A 9mm handgun, with a functional laser sight and flashlight. The barrel has been replaced with one that can chamber hotter ammunition loads, meaning faster bullets, meaning more damage!" + GroupOffset=3 + PickupClass=Class'NicePack.Nice9mmPlusPickup' + AttachmentClass=Class'NicePack.Nice9mmPlusAttachment' + ItemName="Beretta" +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAmmo.uc b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAmmo.uc index 198d3f0..0137f57 100644 --- a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAmmo.uc +++ b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAmmo.uc @@ -1,4 +1,12 @@ -class Nice9mmPlusAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.Nice9mmPlusPickup' AmmoPickupAmount=15 MaxAmmo=150 InitialAmount=60 PickupClass=Class'NicePack.Nice9mmPlusAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=413,Y1=82,X2=457,Y2=125) ItemName="9mm +P+ bullets" -} +class Nice9mmPlusAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.Nice9mmPlusPickup' + AmmoPickupAmount=15 + MaxAmmo=150 + InitialAmount=60 + PickupClass=Class'NicePack.Nice9mmPlusAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=413,Y1=82,X2=457,Y2=125) + ItemName="9mm +P+ bullets" +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAmmoPickup.uc b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAmmoPickup.uc index 64faabb..a5c4233 100644 --- a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAmmoPickup.uc +++ b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAmmoPickup.uc @@ -1,4 +1,9 @@ -class Nice9mmPlusAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=15 InventoryType=Class'NicePack.Nice9mmPlusAmmo' RespawnTime=0.000000 PickupMessage="Rounds (9mm +P+)" StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' -} +class Nice9mmPlusAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=15 + InventoryType=Class'NicePack.Nice9mmPlusAmmo' + RespawnTime=0.000000 + PickupMessage="Rounds (9mm +P+)" + StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAttachment.uc b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAttachment.uc index ec8a11b..e914df4 100644 --- a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAttachment.uc +++ b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusAttachment.uc @@ -1,4 +1,5 @@ -class Nice9mmPlusAttachment extends NiceSingleAttachment; -defaultproperties -{ MeshRef="NicePackA.NinePP.Single_3P" -} +class Nice9mmPlusAttachment extends NiceSingleAttachment; +defaultproperties +{ + MeshRef="NicePackA.NinePP.Single_3P" +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusFire.uc b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusFire.uc index ec097ac..3171f68 100644 --- a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusFire.uc +++ b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusFire.uc @@ -1,4 +1,13 @@ -class Nice9mmPlusFire extends NiceSingleFire; -defaultproperties -{ ProjectileSpeed=21300.000000 maxVerticalRecoilAngle=0 maxHorizontalRecoilAngle=0 FireSoundRef="NicePackSnd.NinePP.Fire1" StereoFireSoundRef="NicePackSnd.NinePP.Fire1" NoAmmoSoundRef="KF_9MMSnd.9mm_DryFire" DamageType=Class'NicePack.NiceDamType9mmPlus' FireRate=0.250000 AmmoClass=Class'NicePack.Nice9mmPlusAmmo' -} +class Nice9mmPlusFire extends NiceSingleFire; +defaultproperties +{ + ProjectileSpeed=21300.000000 + maxVerticalRecoilAngle=0 + maxHorizontalRecoilAngle=0 + FireSoundRef="NicePackSnd.NinePP.Fire1" + StereoFireSoundRef="NicePackSnd.NinePP.Fire1" + NoAmmoSoundRef="KF_9MMSnd.9mm_DryFire" + DamageType=Class'NicePack.NiceDamType9mmPlus' + FireRate=0.250000 + AmmoClass=Class'NicePack.Nice9mmPlusAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusPickup.uc b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusPickup.uc index 674e77b..609d6c0 100644 --- a/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusPickup.uc +++ b/sources/Weapons/Playable/Pistols/9mmPlus/Nice9mmPlusPickup.uc @@ -1,4 +1,14 @@ -class Nice9mmPlusPickup extends NiceSinglePickup; -defaultproperties -{ bBackupWeapon=True cost=100 AmmoCost=8 Description="A 9mm handgun, with a functional laser sight and flashlight. The barrel has been replaced with one that can chamber hotter ammunition loads, meaning faster bullets, meaning more damage!" ItemName="Beretta" ItemShortName="9mm" InventoryType=Class'NicePack.Nice9mmPlus' PickupMessage="You got the 9mm!" StaticMesh=StaticMesh'NicePackSM.NinePP.Pickup' DrawScale=0.100000 -} +class Nice9mmPlusPickup extends NiceSinglePickup; +defaultproperties +{ + bBackupWeapon=True + cost=100 + AmmoCost=8 + Description="A 9mm handgun, with a functional laser sight and flashlight. The barrel has been replaced with one that can chamber hotter ammunition loads, meaning faster bullets, meaning more damage!" + ItemName="Beretta" + ItemShortName="9mm" + InventoryType=Class'NicePack.Nice9mmPlus' + PickupMessage="You got the 9mm!" + StaticMesh=StaticMesh'NicePackSM.NinePP.Pickup' + DrawScale=0.100000 +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDamType9mmPlus.uc b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDamType9mmPlus.uc index 3a03fce..559aee9 100644 --- a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDamType9mmPlus.uc +++ b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDamType9mmPlus.uc @@ -1,5 +1,16 @@ -class NiceDamType9mmPlus extends NiceDamageTypeVetSharpshooter - abstract; -defaultproperties -{ goodDecapMod=0.500000 WeaponClass=Class'NicePack.Nice9mmPlus' DeathString="%k killed %o (Beretta)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=750.000000 KDeathVel=100.000000 VehicleDamageScaling=0.700000 -} +class NiceDamType9mmPlus extends NiceDamageTypeVetSharpshooter + abstract; +defaultproperties +{ + goodDecapMod=0.500000 + WeaponClass=Class'NicePack.Nice9mmPlus' + DeathString="%k killed %o (Beretta)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + FlashFog=(X=600.000000) + KDamageImpulse=750.000000 + KDeathVel=100.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlus.uc b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlus.uc index b7f64d2..77a03ef 100644 --- a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlus.uc +++ b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlus.uc @@ -1,17 +1,40 @@ -class NiceDual9mmPlus extends NiceDualies; -simulated function SecondDoToggle(){ - ToggleLaser(); -} -simulated function ToggleLaser(){ - if(!Instigator.IsLocallyControlled()) return; - // Will redo this bit later, but so far it'll have to do - if(LaserType == 0) LaserType = 1; - else LaserType = 0; - ApplyLaserState(); -} -simulated function ApplyLaserState(){ - super(NiceWeapon).ApplyLaserState(); -} -defaultproperties -{ SingleClass=Class'NicePack.Nice9mmPlus' bUseFlashlightToToggle=True Weight=1.000000 bTorchEnabled=True SleeveNum=0 TraderInfoTexture=Texture'NicePackT.NinePP.HUD_Dual_Trader' MeshRef="NicePackA.NinePP.Dual_1P" SkinRefs(1)="ScrnWeaponPack_T.MedicPistol.NinePP.Frame_cmb" SkinRefs(2)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" SkinRefs(3)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" SkinRefs(4)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" SelectSoundRef="KFPlayerSound.getweaponout" HudImageRef="NicePackT.NinePP.HUD_Dual_UnSelected" SelectedHudImageRef="NicePackT.NinePP.HUD_Dual_Selected" FireModeClass(0)=Class'NicePack.NiceDual9mmPlusFire' Description="A pair of custom 9mm +P+ handguns. These have been improved with a laser sight and more powerful ammunition" GroupOffset=4 PickupClass=Class'NicePack.NiceDual9mmPickup' AttachmentClass=Class'NicePack.NiceDual9mmPlusAttachment' ItemName="Dual Berettas" -} +class NiceDual9mmPlus extends NiceDualies; +simulated function SecondDoToggle(){ + ToggleLaser(); +} +simulated function ToggleLaser(){ + if(!Instigator.IsLocallyControlled()) + return; + // Will redo this bit later, but so far it'll have to do + if(LaserType == 0) + LaserType = 1; + else + LaserType = 0; + ApplyLaserState(); +} +simulated function ApplyLaserState(){ + super(NiceWeapon).ApplyLaserState(); +} +defaultproperties +{ + SingleClass=Class'NicePack.Nice9mmPlus' + bUseFlashlightToToggle=True + Weight=1.000000 + bTorchEnabled=True + SleeveNum=0 + TraderInfoTexture=Texture'NicePackT.NinePP.HUD_Dual_Trader' + MeshRef="NicePackA.NinePP.Dual_1P" + SkinRefs(1)="ScrnWeaponPack_T.MedicPistol.NinePP.Frame_cmb" + SkinRefs(2)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" + SkinRefs(3)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" + SkinRefs(4)="ScrnWeaponPack_T.MedicPistol.Slide_cmb" + SelectSoundRef="KFPlayerSound.getweaponout" + HudImageRef="NicePackT.NinePP.HUD_Dual_UnSelected" + SelectedHudImageRef="NicePackT.NinePP.HUD_Dual_Selected" + FireModeClass(0)=Class'NicePack.NiceDual9mmPlusFire' + Description="A pair of custom 9mm +P+ handguns. These have been improved with a laser sight and more powerful ammunition" + GroupOffset=4 + PickupClass=Class'NicePack.NiceDual9mmPickup' + AttachmentClass=Class'NicePack.NiceDual9mmPlusAttachment' + ItemName="Dual Berettas" +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAmmo.uc b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAmmo.uc index 0040d1b..f2a1f0b 100644 --- a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAmmo.uc +++ b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAmmo.uc @@ -1,4 +1,12 @@ -class NiceDual9mmPlusAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceDual9mmPlusPickup' AmmoPickupAmount=15 MaxAmmo=150 InitialAmount=60 PickupClass=Class'NicePack.NiceDual9mmPlusAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=413,Y1=82,X2=457,Y2=125) ItemName="9mm +P+ bullets" -} +class NiceDual9mmPlusAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceDual9mmPlusPickup' + AmmoPickupAmount=15 + MaxAmmo=150 + InitialAmount=60 + PickupClass=Class'NicePack.NiceDual9mmPlusAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=413,Y1=82,X2=457,Y2=125) + ItemName="9mm +P+ bullets" +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAmmoPickup.uc b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAmmoPickup.uc index 7e24afc..4b5c985 100644 --- a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAmmoPickup.uc +++ b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceDual9mmPlusAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=15 InventoryType=Class'NicePack.NiceDual9mmPlusAmmo' PickupMessage="Rounds (9mm +P+)" StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' -} +class NiceDual9mmPlusAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=15 + InventoryType=Class'NicePack.NiceDual9mmPlusAmmo' + PickupMessage="Rounds (9mm +P+)" + StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAttachment.uc b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAttachment.uc index 99c5fed..ce8b091 100644 --- a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAttachment.uc +++ b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusAttachment.uc @@ -1,4 +1,6 @@ -class NiceDual9mmPlusAttachment extends NiceDualiesAttachment; -defaultproperties -{ BrotherMesh=SkeletalMesh'NicePackA.NinePP.Single_3P' MeshRef="NicePackA.NinePP.Single_3P" -} +class NiceDual9mmPlusAttachment extends NiceDualiesAttachment; +defaultproperties +{ + BrotherMesh=SkeletalMesh'NicePackA.NinePP.Single_3P' + MeshRef="NicePackA.NinePP.Single_3P" +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusFire.uc b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusFire.uc index 4a61d57..6a2395b 100644 --- a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusFire.uc +++ b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusFire.uc @@ -1,4 +1,15 @@ -class NiceDual9mmPlusFire extends NiceDualiesFire; -defaultproperties -{ ProjectileSpeed=21300.000000 maxVerticalRecoilAngle=0 maxHorizontalRecoilAngle=0 FireSoundRef="NicePackSnd.NinePP.Fire1" StereoFireSoundRef="NicePackSnd.NinePP.Fire1" NoAmmoSoundRef="KF_9MMSnd.9mm_DryFire" DamageType=Class'NicePack.NiceDamType9mmPlus' Momentum=10000.000000 bWaitForRelease=False FireRate=0.125000 AmmoClass=Class'NicePack.NiceDual9mmPlusAmmo' -} +class NiceDual9mmPlusFire extends NiceDualiesFire; +defaultproperties +{ + ProjectileSpeed=21300.000000 + maxVerticalRecoilAngle=0 + maxHorizontalRecoilAngle=0 + FireSoundRef="NicePackSnd.NinePP.Fire1" + StereoFireSoundRef="NicePackSnd.NinePP.Fire1" + NoAmmoSoundRef="KF_9MMSnd.9mm_DryFire" + DamageType=Class'NicePack.NiceDamType9mmPlus' + Momentum=10000.000000 + bWaitForRelease=False + FireRate=0.125000 + AmmoClass=Class'NicePack.NiceDual9mmPlusAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusPickup.uc b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusPickup.uc index 3abb66e..2e86650 100644 --- a/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusPickup.uc +++ b/sources/Weapons/Playable/Pistols/9mmPlus/NiceDual9mmPlusPickup.uc @@ -1,4 +1,12 @@ -class NiceDual9mmPlusPickup extends NiceDualiesPickup; -defaultproperties -{ bBackupWeapon=True cost=200 AmmoCost=16 Description="A pair of custom 9mm handguns. These have been improved with a laser sight and more powerful ammunition" ItemName="Dual Berettas" ItemShortName="Dual Berettas" InventoryType=Class'NicePack.NiceDual9mmPlus' PickupMessage="You got the Dual 9mm +P+!" -} +class NiceDual9mmPlusPickup extends NiceDualiesPickup; +defaultproperties +{ + bBackupWeapon=True + cost=200 + AmmoCost=16 + Description="A pair of custom 9mm handguns. These have been improved with a laser sight and more powerful ammunition" + ItemName="Dual Berettas" + ItemShortName="Dual Berettas" + InventoryType=Class'NicePack.NiceDual9mmPlus' + PickupMessage="You got the Dual 9mm +P+!" +} diff --git a/sources/Weapons/Playable/Pistols/Colt/NiceColt.uc b/sources/Weapons/Playable/Pistols/Colt/NiceColt.uc index def2997..7eeca7f 100644 --- a/sources/Weapons/Playable/Pistols/Colt/NiceColt.uc +++ b/sources/Weapons/Playable/Pistols/Colt/NiceColt.uc @@ -1,8 +1,46 @@ -class NiceColt extends NiceWeapon; -simulated function fillSubReloadStages(){ - // Loading 6 shells during 132 frames tops, with first shell loaded at frame 36, with 11 frames between load moments - generateReloadStages(6, 132, 36, 11); -} -defaultproperties -{ reloadType=RTYPE_SINGLE alwaysPlayAnimEnd=True FirstPersonFlashlightOffset=(X=-20.000000,Y=-22.000000,Z=8.000000) MagCapacity=6 ReloadRate=6.100000 ReloadAnim="Reload" ReloadAnimRate=1.200000 bHoldToReload=True WeaponReloadAnim="Reload_Revolver" Weight=5.000000 bHasAimingMode=True IdleAimAnim="IronIdle" StandardDisplayFOV=70.000000 SleeveNum=0 TraderInfoTexture=Texture'ScrnWeaponPack_T.Colt.Trader_WColt' MeshRef="ScrnWeaponPack_A.colt_weapon" SkinRefs(1)="ScrnWeaponPack_T.Colt.ColtV2_T" HudImageRef="ScrnWeaponPack_T.Colt.WColt_Unselected" SelectedHudImageRef="ScrnWeaponPack_T.Colt.WColt" ZoomedDisplayFOV=65.000000 FireModeClass(0)=Class'NicePack.NiceColtFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectSound=Sound'KF_9MMSnd.9mm_Select' AIRating=0.250000 CurrentRating=0.250000 bShowChargingBar=True Description="The Colt Python is a double action handgun chambered for the .357 Magnum cartridge, built on Colt's large I-frame. Pythons have a reputation for accuracy, smooth trigger pull, and a tight cylinder lock-up." DisplayFOV=70.000000 Priority=110 InventoryGroup=2 GroupOffset=15 PickupClass=Class'NicePack.NiceColtPickup' PlayerViewOffset=(X=20.000000,Y=25.000000,Z=-10.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceColtAttachment' IconCoords=(X1=434,Y1=253,X2=506,Y2=292) ItemName="Colt Python" -} +class NiceColt extends NiceWeapon; +simulated function fillSubReloadStages(){ + // Loading 6 shells during 132 frames tops, with first shell loaded at frame 36, with 11 frames between load moments + generateReloadStages(6, 132, 36, 11); +} +defaultproperties +{ + reloadType=RTYPE_SINGLE + alwaysPlayAnimEnd=True + FirstPersonFlashlightOffset=(X=-20.000000,Y=-22.000000,Z=8.000000) + MagCapacity=6 + ReloadRate=6.100000 + ReloadAnim="Reload" + ReloadAnimRate=1.200000 + bHoldToReload=True + WeaponReloadAnim="Reload_Revolver" + Weight=5.000000 + bHasAimingMode=True + IdleAimAnim="IronIdle" + StandardDisplayFOV=70.000000 + SleeveNum=0 + TraderInfoTexture=Texture'ScrnWeaponPack_T.Colt.Trader_WColt' + MeshRef="ScrnWeaponPack_A.colt_weapon" + SkinRefs(1)="ScrnWeaponPack_T.Colt.ColtV2_T" + HudImageRef="ScrnWeaponPack_T.Colt.WColt_Unselected" + SelectedHudImageRef="ScrnWeaponPack_T.Colt.WColt" + ZoomedDisplayFOV=65.000000 + FireModeClass(0)=Class'NicePack.NiceColtFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectSound=Sound'KF_9MMSnd.9mm_Select' + AIRating=0.250000 + CurrentRating=0.250000 + bShowChargingBar=True + Description="The Colt Python is a double action handgun chambered for the .357 Magnum cartridge, built on Colt's large I-frame. Pythons have a reputation for accuracy, smooth trigger pull, and a tight cylinder lock-up." + DisplayFOV=70.000000 + Priority=110 + InventoryGroup=2 + GroupOffset=15 + PickupClass=Class'NicePack.NiceColtPickup' + PlayerViewOffset=(X=20.000000,Y=25.000000,Z=-10.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceColtAttachment' + IconCoords=(X1=434,Y1=253,X2=506,Y2=292) + ItemName="Colt Python" +} diff --git a/sources/Weapons/Playable/Pistols/Colt/NiceColtAmmo.uc b/sources/Weapons/Playable/Pistols/Colt/NiceColtAmmo.uc index 834d04a..fe39381 100644 --- a/sources/Weapons/Playable/Pistols/Colt/NiceColtAmmo.uc +++ b/sources/Weapons/Playable/Pistols/Colt/NiceColtAmmo.uc @@ -1,5 +1,13 @@ -class NiceColtAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=InterfaceContent.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceColtPickup' AmmoPickupAmount=6 MaxAmmo=96 InitialAmount=24 PickupClass=Class'NicePack.NiceColtAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=413,Y1=82,X2=457,Y2=125) ItemName=".357 bullets" -} +class NiceColtAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceColtPickup' + AmmoPickupAmount=6 + MaxAmmo=96 + InitialAmount=24 + PickupClass=Class'NicePack.NiceColtAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=413,Y1=82,X2=457,Y2=125) + ItemName=".357 bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Colt/NiceColtAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Colt/NiceColtAmmoPickup.uc index 80fab5b..44cb049 100644 --- a/sources/Weapons/Playable/Pistols/Colt/NiceColtAmmoPickup.uc +++ b/sources/Weapons/Playable/Pistols/Colt/NiceColtAmmoPickup.uc @@ -1,4 +1,9 @@ -class NiceColtAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=6 InventoryType=Class'NicePack.NiceColtAmmo' RespawnTime=0.000000 PickupMessage=".357 Ammo" StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' -} +class NiceColtAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=6 + InventoryType=Class'NicePack.NiceColtAmmo' + RespawnTime=0.000000 + PickupMessage=".357 Ammo" + StaticMesh=StaticMesh'KillingFloorStatics.DualiesAmmo' +} diff --git a/sources/Weapons/Playable/Pistols/Colt/NiceColtAttachment.uc b/sources/Weapons/Playable/Pistols/Colt/NiceColtAttachment.uc index 67b365c..fbc1d43 100644 --- a/sources/Weapons/Playable/Pistols/Colt/NiceColtAttachment.uc +++ b/sources/Weapons/Playable/Pistols/Colt/NiceColtAttachment.uc @@ -1,4 +1,50 @@ -class NiceColtAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdPistol' mTracerClass=Class'KFMod.KFLargeTracer' MovementAnims(0)="JogF_Single9mm" MovementAnims(1)="JogB_Single9mm" MovementAnims(2)="JogL_Single9mm" MovementAnims(3)="JogR_Single9mm" TurnLeftAnim="TurnL_Single9mm" TurnRightAnim="TurnR_Single9mm" CrouchAnims(0)="CHwalkF_Single9mm" CrouchAnims(1)="CHwalkB_Single9mm" CrouchAnims(2)="CHwalkL_Single9mm" CrouchAnims(3)="CHwalkR_Single9mm" CrouchTurnRightAnim="CH_TurnR_Single9mm" CrouchTurnLeftAnim="CH_TurnL_Single9mm" IdleCrouchAnim="CHIdle_Single9mm" IdleWeaponAnim="Idle_Single9mm" IdleRestAnim="Idle_Single9mm" IdleChatAnim="Idle_Single9mm" IdleHeavyAnim="Idle_Single9mm" IdleRifleAnim="Idle_Single9mm" FireAnims(0)="Fire_Single9mm" FireAnims(1)="Fire_Single9mm" FireAnims(2)="Fire_Single9mm" FireAnims(3)="Fire_Single9mm" FireAltAnims(0)="Fire_Single9mm" FireAltAnims(1)="Fire_Single9mm" FireAltAnims(2)="Fire_Single9mm" FireAltAnims(3)="Fire_Single9mm" FireCrouchAnims(0)="CHFire_Single9mm" FireCrouchAnims(1)="CHFire_Single9mm" FireCrouchAnims(2)="CHFire_Single9mm" FireCrouchAnims(3)="CHFire_Single9mm" FireCrouchAltAnims(0)="CHFire_Single9mm" FireCrouchAltAnims(1)="CHFire_Single9mm" FireCrouchAltAnims(2)="CHFire_Single9mm" FireCrouchAltAnims(3)="CHFire_Single9mm" HitAnims(0)="HitF_Single9mm" HitAnims(1)="HitB_Single9mm" HitAnims(2)="HitL_Single9mm" HitAnims(3)="HitR_Single9mm" PostFireBlendStandAnim="Blend_Single9mm" PostFireBlendCrouchAnim="CHBlend_Single9mm" MeshRef="ScrnWeaponPack_A.W_Colt_Python_3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceColtAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdPistol' + mTracerClass=Class'KFMod.KFLargeTracer' + MovementAnims(0)="JogF_Single9mm" + MovementAnims(1)="JogB_Single9mm" + MovementAnims(2)="JogL_Single9mm" + MovementAnims(3)="JogR_Single9mm" + TurnLeftAnim="TurnL_Single9mm" + TurnRightAnim="TurnR_Single9mm" + CrouchAnims(0)="CHwalkF_Single9mm" + CrouchAnims(1)="CHwalkB_Single9mm" + CrouchAnims(2)="CHwalkL_Single9mm" + CrouchAnims(3)="CHwalkR_Single9mm" + CrouchTurnRightAnim="CH_TurnR_Single9mm" + CrouchTurnLeftAnim="CH_TurnL_Single9mm" + IdleCrouchAnim="CHIdle_Single9mm" + IdleWeaponAnim="Idle_Single9mm" + IdleRestAnim="Idle_Single9mm" + IdleChatAnim="Idle_Single9mm" + IdleHeavyAnim="Idle_Single9mm" + IdleRifleAnim="Idle_Single9mm" + FireAnims(0)="Fire_Single9mm" + FireAnims(1)="Fire_Single9mm" + FireAnims(2)="Fire_Single9mm" + FireAnims(3)="Fire_Single9mm" + FireAltAnims(0)="Fire_Single9mm" + FireAltAnims(1)="Fire_Single9mm" + FireAltAnims(2)="Fire_Single9mm" + FireAltAnims(3)="Fire_Single9mm" + FireCrouchAnims(0)="CHFire_Single9mm" + FireCrouchAnims(1)="CHFire_Single9mm" + FireCrouchAnims(2)="CHFire_Single9mm" + FireCrouchAnims(3)="CHFire_Single9mm" + FireCrouchAltAnims(0)="CHFire_Single9mm" + FireCrouchAltAnims(1)="CHFire_Single9mm" + FireCrouchAltAnims(2)="CHFire_Single9mm" + FireCrouchAltAnims(3)="CHFire_Single9mm" + HitAnims(0)="HitF_Single9mm" + HitAnims(1)="HitB_Single9mm" + HitAnims(2)="HitL_Single9mm" + HitAnims(3)="HitR_Single9mm" + PostFireBlendStandAnim="Blend_Single9mm" + PostFireBlendCrouchAnim="CHBlend_Single9mm" + MeshRef="ScrnWeaponPack_A.W_Colt_Python_3rd" + bHeavy=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Colt/NiceColtFire.uc b/sources/Weapons/Playable/Pistols/Colt/NiceColtFire.uc index 803df43..94fb137 100644 --- a/sources/Weapons/Playable/Pistols/Colt/NiceColtFire.uc +++ b/sources/Weapons/Playable/Pistols/Colt/NiceColtFire.uc @@ -1,4 +1,31 @@ -class NiceColtFire extends NiceFire; -defaultproperties -{ RecoilRate=0.850000 maxVerticalRecoilAngle=150 maxHorizontalRecoilAngle=75 FireSoundRef="ScrnWeaponPack_SND.Colt.357_fire3" StereoFireSoundRef="ScrnWeaponPack_SND.Colt.ScrnWeaponPack.357_fire3_ST" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeColt' DamageMin=175 DamageMax=175 Momentum=10000.000000 bWaitForRelease=True bAttachSmokeEmitter=True TransientSoundVolume=2.500000 FireAnimRate=1.200000 TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.900000 AmmoClass=Class'NicePack.NiceColtAmmo' ShakeRotMag=(X=75.000000,Y=75.000000,Z=400.000000) ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=10000.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(X=6.000000,Y=1.000000,Z=8.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=2.500000 BotRefireRate=0.350000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' aimerror=30.000000 -} +class NiceColtFire extends NiceFire; +defaultproperties +{ + RecoilRate=0.850000 + maxVerticalRecoilAngle=150 + maxHorizontalRecoilAngle=75 + FireSoundRef="ScrnWeaponPack_SND.Colt.357_fire3" + StereoFireSoundRef="ScrnWeaponPack_SND.Colt.ScrnWeaponPack.357_fire3_ST" + NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" + DamageType=Class'NicePack.NiceDamTypeColt' + DamageMin=175 + DamageMax=175 + Momentum=10000.000000 + bWaitForRelease=True + bAttachSmokeEmitter=True + TransientSoundVolume=2.500000 + FireAnimRate=1.200000 + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.900000 + AmmoClass=Class'NicePack.NiceColtAmmo' + ShakeRotMag=(X=75.000000,Y=75.000000,Z=400.000000) + ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=10000.000000) + ShakeRotTime=3.500000 + ShakeOffsetMag=(X=6.000000,Y=1.000000,Z=8.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=2.500000 + BotRefireRate=0.350000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' + aimerror=30.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Colt/NiceColtPickup.uc b/sources/Weapons/Playable/Pistols/Colt/NiceColtPickup.uc index c05c1ce..0c12ac6 100644 --- a/sources/Weapons/Playable/Pistols/Colt/NiceColtPickup.uc +++ b/sources/Weapons/Playable/Pistols/Colt/NiceColtPickup.uc @@ -1,4 +1,23 @@ -class NiceColtPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=5.000000 cost=1500 AmmoCost=40 BuyClipSize=6 PowerValue=85 SpeedValue=20 RangeValue=35 Description="The Colt Python is a double action handgun chambered for the .357 Magnum cartridge, built on Colt's large I-frame. Pythons have a reputation for accuracy, smooth trigger pull, and a tight cylinder lock-up." ItemName="Colt Python" ItemShortName="Colt" AmmoItemName=".357" CorrespondingPerkIndex=2 EquipmentCategoryID=1 InventoryType=Class'NicePack.NiceColt' PickupMessage="You got the Colt Python handgun" PickupSound=Sound'KF_9MMSnd.9mm_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.WColt_Pickup' CollisionHeight=5.000000 -} +class NiceColtPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=5.000000 + cost=1500 + AmmoCost=40 + BuyClipSize=6 + PowerValue=85 + SpeedValue=20 + RangeValue=35 + Description="The Colt Python is a double action handgun chambered for the .357 Magnum cartridge, built on Colt's large I-frame. Pythons have a reputation for accuracy, smooth trigger pull, and a tight cylinder lock-up." + ItemName="Colt Python" + ItemShortName="Colt" + AmmoItemName=".357" + CorrespondingPerkIndex=2 + EquipmentCategoryID=1 + InventoryType=Class'NicePack.NiceColt' + PickupMessage="You got the Colt Python handgun" + PickupSound=Sound'KF_9MMSnd.9mm_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'ScrnWeaponPack_SM.WColt_Pickup' + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Colt/NiceDamTypeColt.uc b/sources/Weapons/Playable/Pistols/Colt/NiceDamTypeColt.uc index a407674..8261929 100644 --- a/sources/Weapons/Playable/Pistols/Colt/NiceDamTypeColt.uc +++ b/sources/Weapons/Playable/Pistols/Colt/NiceDamTypeColt.uc @@ -1,5 +1,19 @@ -class NiceDamTypeColt extends NiceDamageTypeVetSharpshooter - abstract; -defaultproperties -{ MaxPenetrations=1 PenDmgReduction=0.500000 HeadShotDamageMult=1.300000 WeaponClass=Class'NicePack.NiceColt' DeathString="%k killed %o (Colt Python)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=12000.000000 KDeathVel=800.000000 KDeathUpKick=160.000000 VehicleDamageScaling=0.800000 -} +class NiceDamTypeColt extends NiceDamageTypeVetSharpshooter + abstract; +defaultproperties +{ + MaxPenetrations=1 + PenDmgReduction=0.500000 + HeadShotDamageMult=1.300000 + WeaponClass=Class'NicePack.NiceColt' + DeathString="%k killed %o (Colt Python)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + FlashFog=(X=600.000000) + KDamageImpulse=12000.000000 + KDeathVel=800.000000 + KDeathUpKick=160.000000 + VehicleDamageScaling=0.800000 +} diff --git a/sources/Weapons/Playable/Pistols/Colt/NiceDamTypeColtProj.uc b/sources/Weapons/Playable/Pistols/Colt/NiceDamTypeColtProj.uc index a94fe96..6b7cae8 100644 --- a/sources/Weapons/Playable/Pistols/Colt/NiceDamTypeColtProj.uc +++ b/sources/Weapons/Playable/Pistols/Colt/NiceDamTypeColtProj.uc @@ -1,5 +1,6 @@ -class NiceDamTypeColtProj extends NiceDamTypeShotgun - abstract; -defaultproperties -{ DeathString="%k killed %o (Colt Python)." -} +class NiceDamTypeColtProj extends NiceDamTypeShotgun + abstract; +defaultproperties +{ + DeathString="%k killed %o (Colt Python)." +} diff --git a/sources/Weapons/Playable/Pistols/Contender/NiceContender.uc b/sources/Weapons/Playable/Pistols/Contender/NiceContender.uc index 2d35308..d91a29b 100644 --- a/sources/Weapons/Playable/Pistols/Contender/NiceContender.uc +++ b/sources/Weapons/Playable/Pistols/Contender/NiceContender.uc @@ -1,15 +1,67 @@ -class NiceContender extends NiceScopedWeapon; -simulated function PostBeginPlay(){ - local AutoReloadAnimDesc reloadDesc; - autoReloadsDescriptions.Length = 0; - reloadDesc.canInterruptFrame = 3 / 37; - reloadDesc.trashStartFrame = 21 / 37; - reloadDesc.resumeFrame = 13 / 37; - reloadDesc.speedFrame = 3 / 37; - reloadDesc.animName = 'Fire'; - autoReloadsDescriptions[0] = reloadDesc; - super.PostBeginPlay(); -} -defaultproperties -{ lenseMaterialID=1 scopePortalFOVHigh=8.000000 scopePortalFOV=8.000000 tileSize=512 ZoomMatRef="NicePackT.Contender.gdcw_acog_FB" ScriptedTextureFallbackRef="NicePackT.Contender.alpha_lens_64x64" CrosshairTexRef="NicePackT.Contender.gdcw_acog" bChangeClipIcon=True hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' reloadType=RTYPE_AUTO bHasScope=True ZoomedDisplayFOVHigh=25.000000 MagCapacity=1 ReloadRate=1.376000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_HuntingShotgun" Weight=3.000000 bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=55.000000 SleeveNum=3 TraderInfoTexture=Texture'NicePackT.Contender.g2contender_trader' bIsTier2Weapon=True MeshRef="NicePackA.Contender.G2ContenderMesh" SkinRefs(0)="NicePackT.Contender.Contender_diffuse_cmb" SkinRefs(1)="NicePackT.Contender.alpha_lens_64x64" SkinRefs(2)="NicePackT.Contender.uv1024_cmb" SkinRefs(3)="KF_Weapons2_Trip_T.hands.BritishPara_Hands_1st_P" SkinRefs(4)="NicePackT.Contender.Bullet_cmb" SelectSoundRef="NicePackSnd.Contender.G2_Pickup" HudImageRef="NicePackT.Contender.g2contender_unselected" SelectedHudImageRef="NicePackT.Contender.g2contender_selected" PlayerIronSightFOV=40.000000 ZoomTime=0.285000 ZoomedDisplayFOV=25.000000 FireModeClass(0)=Class'NicePack.NiceContenderFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" PutDownAnimRate=1.000000 AIRating=0.550000 CurrentRating=0.550000 Description="Thompson G2 Contender - hinting pistol" DisplayFOV=55.000000 Priority=120 InventoryGroup=2 GroupOffset=16 PickupClass=Class'NicePack.NiceContenderPickup' PlayerViewOffset=(X=13.000000,Y=14.000000,Z=-5.500000) BobDamping=4.500000 AttachmentClass=Class'NicePack.NiceContenderAttachment' ItemName="Thompson Contender" -} +class NiceContender extends NiceScopedWeapon; +simulated function PostBeginPlay(){ + local AutoReloadAnimDesc reloadDesc; + autoReloadsDescriptions.Length = 0; + reloadDesc.canInterruptFrame = 3 / 37; + reloadDesc.trashStartFrame = 21 / 37; + reloadDesc.resumeFrame = 13 / 37; + reloadDesc.speedFrame = 3 / 37; + reloadDesc.animName = 'Fire'; + autoReloadsDescriptions[0] = reloadDesc; + super.PostBeginPlay(); +} +defaultproperties +{ + lenseMaterialID=1 + scopePortalFOVHigh=8.000000 + scopePortalFOV=8.000000 + tileSize=512 + ZoomMatRef="NicePackT.Contender.gdcw_acog_FB" + ScriptedTextureFallbackRef="NicePackT.Contender.alpha_lens_64x64" + CrosshairTexRef="NicePackT.Contender.gdcw_acog" + bChangeClipIcon=True + hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' + reloadType=RTYPE_AUTO + bHasScope=True + ZoomedDisplayFOVHigh=25.000000 + MagCapacity=1 + ReloadRate=1.376000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_HuntingShotgun" + Weight=3.000000 + bHasAimingMode=True + IdleAimAnim="Iron_Idle" + StandardDisplayFOV=55.000000 + SleeveNum=3 + TraderInfoTexture=Texture'NicePackT.Contender.g2contender_trader' + bIsTier2Weapon=True + MeshRef="NicePackA.Contender.G2ContenderMesh" + SkinRefs(0)="NicePackT.Contender.Contender_diffuse_cmb" + SkinRefs(1)="NicePackT.Contender.alpha_lens_64x64" + SkinRefs(2)="NicePackT.Contender.uv1024_cmb" + SkinRefs(3)="KF_Weapons2_Trip_T.hands.BritishPara_Hands_1st_P" + SkinRefs(4)="NicePackT.Contender.Bullet_cmb" + SelectSoundRef="NicePackSnd.Contender.G2_Pickup" + HudImageRef="NicePackT.Contender.g2contender_unselected" + SelectedHudImageRef="NicePackT.Contender.g2contender_selected" + PlayerIronSightFOV=40.000000 + ZoomTime=0.285000 + ZoomedDisplayFOV=25.000000 + FireModeClass(0)=Class'NicePack.NiceContenderFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + PutDownAnimRate=1.000000 + AIRating=0.550000 + CurrentRating=0.550000 + Description="Thompson G2 Contender - hinting pistol" + DisplayFOV=55.000000 + Priority=120 + InventoryGroup=2 + GroupOffset=16 + PickupClass=Class'NicePack.NiceContenderPickup' + PlayerViewOffset=(X=13.000000,Y=14.000000,Z=-5.500000) + BobDamping=4.500000 + AttachmentClass=Class'NicePack.NiceContenderAttachment' + ItemName="Thompson Contender" +} diff --git a/sources/Weapons/Playable/Pistols/Contender/NiceContenderAmmo.uc b/sources/Weapons/Playable/Pistols/Contender/NiceContenderAmmo.uc index 5beb7b4..d3a8b83 100644 --- a/sources/Weapons/Playable/Pistols/Contender/NiceContenderAmmo.uc +++ b/sources/Weapons/Playable/Pistols/Contender/NiceContenderAmmo.uc @@ -1,4 +1,12 @@ -class NiceContenderAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceContenderPickup' AmmoPickupAmount=8 MaxAmmo=40 InitialAmount=10 PickupClass=Class'NicePack.NiceContenderAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=4,Y1=350,X2=110,Y2=395) ItemName=".35 rem" -} +class NiceContenderAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceContenderPickup' + AmmoPickupAmount=8 + MaxAmmo=40 + InitialAmount=10 + PickupClass=Class'NicePack.NiceContenderAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=4,Y1=350,X2=110,Y2=395) + ItemName=".35 rem" +} diff --git a/sources/Weapons/Playable/Pistols/Contender/NiceContenderAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Contender/NiceContenderAmmoPickup.uc index 6e11d09..fad2cc8 100644 --- a/sources/Weapons/Playable/Pistols/Contender/NiceContenderAmmoPickup.uc +++ b/sources/Weapons/Playable/Pistols/Contender/NiceContenderAmmoPickup.uc @@ -1,4 +1,9 @@ -class NiceContenderAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=8 InventoryType=Class'NicePack.NiceContenderAmmo' PickupMessage=".35 rem" StaticMesh=StaticMesh'KillingFloorStatics.XbowAmmo' CollisionRadius=25.000000 -} +class NiceContenderAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=8 + InventoryType=Class'NicePack.NiceContenderAmmo' + PickupMessage=".35 rem" + StaticMesh=StaticMesh'KillingFloorStatics.XbowAmmo' + CollisionRadius=25.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Contender/NiceContenderAttachment.uc b/sources/Weapons/Playable/Pistols/Contender/NiceContenderAttachment.uc index dacbffe..37efb5b 100644 --- a/sources/Weapons/Playable/Pistols/Contender/NiceContenderAttachment.uc +++ b/sources/Weapons/Playable/Pistols/Contender/NiceContenderAttachment.uc @@ -1,4 +1,51 @@ -class NiceContenderAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdPistol' MovementAnims(0)="JogF_HuntingShotgun" MovementAnims(1)="JogB_HuntingShotgun" MovementAnims(2)="JogL_HuntingShotgun" MovementAnims(3)="JogR_HuntingShotgun" TurnLeftAnim="TurnL_HuntingShotgun" TurnRightAnim="TurnR_HuntingShotgun" CrouchAnims(0)="CHwalkF_HuntingShotgun" CrouchAnims(1)="CHwalkB_HuntingShotgun" CrouchAnims(2)="CHwalkL_HuntingShotgun" CrouchAnims(3)="CHwalkR_HuntingShotgun" WalkAnims(0)="WalkF_HuntingShotgun" WalkAnims(1)="WalkB_HuntingShotgun" WalkAnims(2)="WalkL_HuntingShotgun" WalkAnims(3)="WalkR_HuntingShotgun" CrouchTurnRightAnim="CH_TurnR_HuntingShotgun" CrouchTurnLeftAnim="CH_TurnL_HuntingShotgun" IdleCrouchAnim="CHIdle_HuntingShotgun" IdleWeaponAnim="Idle_HuntingShotgun" IdleRestAnim="Idle_HuntingShotgun" IdleChatAnim="Idle_HuntingShotgun" IdleHeavyAnim="Idle_HuntingShotgun" IdleRifleAnim="Idle_HuntingShotgun" FireAnims(0)="Fire_HuntingShotgun" FireAnims(1)="Fire_HuntingShotgun" FireAnims(2)="Fire_HuntingShotgun" FireAnims(3)="Fire_HuntingShotgun" FireAltAnims(0)="Fire_HuntingShotgun" FireAltAnims(1)="Fire_HuntingShotgun" FireAltAnims(2)="Fire_HuntingShotgun" FireAltAnims(3)="Fire_HuntingShotgun" FireCrouchAnims(0)="CHFire_HuntingShotgun" FireCrouchAnims(1)="CHFire_HuntingShotgun" FireCrouchAnims(2)="CHFire_HuntingShotgun" FireCrouchAnims(3)="CHFire_HuntingShotgun" FireCrouchAltAnims(0)="CHFire_HuntingShotgun" FireCrouchAltAnims(1)="CHFire_HuntingShotgun" FireCrouchAltAnims(2)="CHFire_HuntingShotgun" FireCrouchAltAnims(3)="CHFire_HuntingShotgun" HitAnims(0)="HitF_HuntingShotgun" HitAnims(1)="HitB_HuntingShotgun" HitAnims(2)="HitL_HuntingShotgun" HitAnims(3)="HitR_HuntingShotgun" PostFireBlendStandAnim="Blend_HuntingShotgun" PostFireBlendCrouchAnim="CHBlend_HuntingShotgun" MeshRef="NicePackA.Contender.G2Contender_3rd" DrawScale=2.200000 -} +class NiceContenderAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdPistol' + MovementAnims(0)="JogF_HuntingShotgun" + MovementAnims(1)="JogB_HuntingShotgun" + MovementAnims(2)="JogL_HuntingShotgun" + MovementAnims(3)="JogR_HuntingShotgun" + TurnLeftAnim="TurnL_HuntingShotgun" + TurnRightAnim="TurnR_HuntingShotgun" + CrouchAnims(0)="CHwalkF_HuntingShotgun" + CrouchAnims(1)="CHwalkB_HuntingShotgun" + CrouchAnims(2)="CHwalkL_HuntingShotgun" + CrouchAnims(3)="CHwalkR_HuntingShotgun" + WalkAnims(0)="WalkF_HuntingShotgun" + WalkAnims(1)="WalkB_HuntingShotgun" + WalkAnims(2)="WalkL_HuntingShotgun" + WalkAnims(3)="WalkR_HuntingShotgun" + CrouchTurnRightAnim="CH_TurnR_HuntingShotgun" + CrouchTurnLeftAnim="CH_TurnL_HuntingShotgun" + IdleCrouchAnim="CHIdle_HuntingShotgun" + IdleWeaponAnim="Idle_HuntingShotgun" + IdleRestAnim="Idle_HuntingShotgun" + IdleChatAnim="Idle_HuntingShotgun" + IdleHeavyAnim="Idle_HuntingShotgun" + IdleRifleAnim="Idle_HuntingShotgun" + FireAnims(0)="Fire_HuntingShotgun" + FireAnims(1)="Fire_HuntingShotgun" + FireAnims(2)="Fire_HuntingShotgun" + FireAnims(3)="Fire_HuntingShotgun" + FireAltAnims(0)="Fire_HuntingShotgun" + FireAltAnims(1)="Fire_HuntingShotgun" + FireAltAnims(2)="Fire_HuntingShotgun" + FireAltAnims(3)="Fire_HuntingShotgun" + FireCrouchAnims(0)="CHFire_HuntingShotgun" + FireCrouchAnims(1)="CHFire_HuntingShotgun" + FireCrouchAnims(2)="CHFire_HuntingShotgun" + FireCrouchAnims(3)="CHFire_HuntingShotgun" + FireCrouchAltAnims(0)="CHFire_HuntingShotgun" + FireCrouchAltAnims(1)="CHFire_HuntingShotgun" + FireCrouchAltAnims(2)="CHFire_HuntingShotgun" + FireCrouchAltAnims(3)="CHFire_HuntingShotgun" + HitAnims(0)="HitF_HuntingShotgun" + HitAnims(1)="HitB_HuntingShotgun" + HitAnims(2)="HitL_HuntingShotgun" + HitAnims(3)="HitR_HuntingShotgun" + PostFireBlendStandAnim="Blend_HuntingShotgun" + PostFireBlendCrouchAnim="CHBlend_HuntingShotgun" + MeshRef="NicePackA.Contender.G2Contender_3rd" + DrawScale=2.200000 +} diff --git a/sources/Weapons/Playable/Pistols/Contender/NiceContenderFire.uc b/sources/Weapons/Playable/Pistols/Contender/NiceContenderFire.uc index 0b27e76..97d224b 100644 --- a/sources/Weapons/Playable/Pistols/Contender/NiceContenderFire.uc +++ b/sources/Weapons/Playable/Pistols/Contender/NiceContenderFire.uc @@ -1,4 +1,28 @@ -class NiceContenderFire extends NiceFire; -defaultproperties -{ EffectiveRange=25000.000000 ProjectileSpeed=30000.000000 FireAimedAnim="Fire" RecoilRate=0.100000 maxVerticalRecoilAngle=350 maxHorizontalRecoilAngle=175 bRandomPitchFireSound=False FireSoundRef="NicePackSnd.Contender.G2_Shot" StereoFireSoundRef="NicePackSnd.Contender.G2_Shot" NoAmmoSoundRef="KF_SCARSnd.SCAR_DryFire" DamageType=Class'NicePack.NiceDamTypeContender' DamageMin=156 DamageMax=156 bWaitForRelease=True TransientSoundVolume=1.800000 FireForce="AssaultRifleFire" FireRate=1.600000 AmmoClass=Class'NicePack.NiceContenderAmmo' ShakeRotMag=(X=5.000000,Y=7.000000,Z=3.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeOffsetMag=(X=5.000000,Y=5.000000,Z=5.000000) BotRefireRate=3.570000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' aimerror=0.000000 -} +class NiceContenderFire extends NiceFire; +defaultproperties +{ + EffectiveRange=25000.000000 + ProjectileSpeed=30000.000000 + FireAimedAnim="Fire" + RecoilRate=0.100000 + maxVerticalRecoilAngle=350 + maxHorizontalRecoilAngle=175 + bRandomPitchFireSound=False + FireSoundRef="NicePackSnd.Contender.G2_Shot" + StereoFireSoundRef="NicePackSnd.Contender.G2_Shot" + NoAmmoSoundRef="KF_SCARSnd.SCAR_DryFire" + DamageType=Class'NicePack.NiceDamTypeContender' + DamageMin=156 + DamageMax=156 + bWaitForRelease=True + TransientSoundVolume=1.800000 + FireForce="AssaultRifleFire" + FireRate=1.600000 + AmmoClass=Class'NicePack.NiceContenderAmmo' + ShakeRotMag=(X=5.000000,Y=7.000000,Z=3.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeOffsetMag=(X=5.000000,Y=5.000000,Z=5.000000) + BotRefireRate=3.570000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' + aimerror=0.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Contender/NiceContenderPickup.uc b/sources/Weapons/Playable/Pistols/Contender/NiceContenderPickup.uc index bec842f..1a6205b 100644 --- a/sources/Weapons/Playable/Pistols/Contender/NiceContenderPickup.uc +++ b/sources/Weapons/Playable/Pistols/Contender/NiceContenderPickup.uc @@ -1,5 +1,26 @@ -class NiceContenderPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=3.000000 AmmoCost=8 - cost=1000 BuyClipSize=1 PowerValue=60 SpeedValue=35 RangeValue=90 Description="Thompson G2 Contender - hunting pistol" ItemName="Thompson Contender" ItemShortName="Contender" AmmoItemName=".35 rem" CorrespondingPerkIndex=2 EquipmentCategoryID=2 MaxDesireability=0.790000 InventoryType=Class'NicePack.NiceContender' PickupMessage="You got the Thompson G2 Contender" PickupSound=Sound'NicePackSnd.Contender.G2_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'NicePackSM.Contender.G2Contender_sm' DrawScale=2.000000 CollisionRadius=10.000000 CollisionHeight=5.000000 -} +class NiceContenderPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=3.000000 + AmmoCost=8 + cost=1000 + BuyClipSize=1 + PowerValue=60 + SpeedValue=35 + RangeValue=90 + Description="Thompson G2 Contender - hunting pistol" + ItemName="Thompson Contender" + ItemShortName="Contender" + AmmoItemName=".35 rem" + CorrespondingPerkIndex=2 + EquipmentCategoryID=2 + MaxDesireability=0.790000 + InventoryType=Class'NicePack.NiceContender' + PickupMessage="You got the Thompson G2 Contender" + PickupSound=Sound'NicePackSnd.Contender.G2_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'NicePackSM.Contender.G2Contender_sm' + DrawScale=2.000000 + CollisionRadius=10.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Contender/NiceDamTypeContender.uc b/sources/Weapons/Playable/Pistols/Contender/NiceDamTypeContender.uc index 3d17de1..07d5c02 100644 --- a/sources/Weapons/Playable/Pistols/Contender/NiceDamTypeContender.uc +++ b/sources/Weapons/Playable/Pistols/Contender/NiceDamTypeContender.uc @@ -1,7 +1,18 @@ -class NiceDamTypeContender extends NiceDamageTypeVetSharpshooter - abstract; -defaultproperties -{ - stunMultiplier=1.500000 - HeadShotDamageMult=2.500000 WeaponClass=Class'NicePack.NiceContender' DeathString="%k killed %o with Contender." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=1850.000000 KDeathVel=150.000000 KDeathUpKick=5.000000 VehicleDamageScaling=0.800000 -} +class NiceDamTypeContender extends NiceDamageTypeVetSharpshooter + abstract; +defaultproperties +{ + stunMultiplier=1.500000 + HeadShotDamageMult=2.500000 + WeaponClass=Class'NicePack.NiceContender' + DeathString="%k killed %o with Contender." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + FlashFog=(X=600.000000) + KDamageImpulse=1850.000000 + KDeathVel=150.000000 + KDeathUpKick=5.000000 + VehicleDamageScaling=0.800000 +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDeagle.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagle.uc index 1f59c5d..05391ba 100644 --- a/sources/Weapons/Playable/Pistols/Deagle/NiceDeagle.uc +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagle.uc @@ -1,4 +1,37 @@ -class NiceDeagle extends NiceSingle; -defaultproperties -{ DualClass=Class'NicePack.NiceDualDeagle' reloadPreEndFrame=0.197000 reloadEndFrame=0.682000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.288000 reloadChargeStartFrame=-1.000000 MagCapacity=8 ReloadRate=2.200000 Weight=2.000000 StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Handcannon' bIsTier2Weapon=True MeshRef="KF_Weapons_Trip.Handcannon_Trip" SkinRefs(0)="KF_Weapons_Trip_T.Pistols.deagle_cmb" SelectSoundRef="KF_HandcannonSnd.50AE_Select" HudImageRef="KillingFloorHUD.WeaponSelect.handcannon_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.handcannon" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceDeagleFire' AIRating=0.450000 CurrentRating=0.450000 Description=".50 calibre action express handgun. This is about as big and nasty as personal weapons are going to get. But with a 7 round magazine, it should be used conservatively. " EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=100 GroupOffset=11 PickupClass=Class'NicePack.NiceDeaglePickup' PlayerViewOffset=(X=5.000000,Y=20.000000) AttachmentClass=Class'NicePack.NiceDeagleAttachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="Desert Eagle" bUseDynamicLights=True TransientSoundVolume=1.000000 -} +class NiceDeagle extends NiceSingle; +defaultproperties +{ + DualClass=Class'NicePack.NiceDualDeagle' + reloadPreEndFrame=0.197000 + reloadEndFrame=0.682000 + reloadChargeEndFrame=-1.000000 + reloadMagStartFrame=0.288000 + reloadChargeStartFrame=-1.000000 + MagCapacity=8 + ReloadRate=2.200000 + Weight=2.000000 + StandardDisplayFOV=60.000000 + TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Handcannon' + bIsTier2Weapon=True + MeshRef="KF_Weapons_Trip.Handcannon_Trip" + SkinRefs(0)="KF_Weapons_Trip_T.Pistols.deagle_cmb" + SelectSoundRef="KF_HandcannonSnd.50AE_Select" + HudImageRef="KillingFloorHUD.WeaponSelect.handcannon_unselected" + SelectedHudImageRef="KillingFloorHUD.WeaponSelect.handcannon" + ZoomedDisplayFOV=50.000000 + FireModeClass(0)=Class'NicePack.NiceDeagleFire' + AIRating=0.450000 + CurrentRating=0.450000 + Description=".50 calibre action express handgun. This is about as big and nasty as personal weapons are going to get. But with a 7 round magazine, it should be used conservatively. " + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=60.000000 + Priority=100 + GroupOffset=11 + PickupClass=Class'NicePack.NiceDeaglePickup' + PlayerViewOffset=(X=5.000000,Y=20.000000) + AttachmentClass=Class'NicePack.NiceDeagleAttachment' + IconCoords=(X1=250,Y1=110,X2=330,Y2=145) + ItemName="Desert Eagle" + bUseDynamicLights=True + TransientSoundVolume=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAmmo.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAmmo.uc index 4a77018..afd33b3 100644 --- a/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAmmo.uc +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAmmo.uc @@ -1,5 +1,13 @@ -class NiceDeagleAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=InterfaceContent.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceDeaglePickup' AmmoPickupAmount=8 MaxAmmo=72 InitialAmount=24 PickupClass=Class'NicePack.NiceDeagleAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="Deagle bullets" -} +class NiceDeagleAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceDeaglePickup' + AmmoPickupAmount=8 + MaxAmmo=72 + InitialAmount=24 + PickupClass=Class'NicePack.NiceDeagleAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=338,Y1=40,X2=393,Y2=79) + ItemName="Deagle bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAmmoPickup.uc index 2a2386f..9a3a795 100644 --- a/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAmmoPickup.uc +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAmmoPickup.uc @@ -1,4 +1,9 @@ -class NiceDeagleAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' AmmoAmount=8 InventoryType=Class'NicePack.NiceDeagleAmmo' PickupMessage="Rounds (.300 JHP)" StaticMesh=None -} +class NiceDeagleAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' + AmmoAmount=8 + InventoryType=Class'NicePack.NiceDeagleAmmo' + PickupMessage="Rounds (.300 JHP)" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAttachment.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAttachment.uc index 8c207ef..8fe678f 100644 --- a/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAttachment.uc +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDeagleAttachment.uc @@ -1,4 +1,7 @@ -class NiceDeagleAttachment extends NiceSingleAttachment; -defaultproperties -{ mTracerClass=Class'KFMod.KFLargeTracer' MeshRef="KF_Weapons3rd_Trip.Handcannon_3rd" bHeavy=True -} +class NiceDeagleAttachment extends NiceSingleAttachment; +defaultproperties +{ + mTracerClass=Class'KFMod.KFLargeTracer' + MeshRef="KF_Weapons3rd_Trip.Handcannon_3rd" + bHeavy=True +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDeaglePickup.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDeaglePickup.uc index ea11ae4..0d9606d 100644 --- a/sources/Weapons/Playable/Pistols/Deagle/NiceDeaglePickup.uc +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDeaglePickup.uc @@ -1,4 +1,21 @@ -class NiceDeaglePickup extends NiceSinglePickup; -defaultproperties -{ Weight=2.000000 cost=250 AmmoCost=11 BuyClipSize=8 PowerValue=65 SpeedValue=35 RangeValue=60 Description="50 Cal AE handgun. A powerful personal choice for personal defense." ItemName="Desert Eagle" ItemShortName="Deagle" AmmoItemName=".300 JHP Ammo" AmmoMesh=None VariantClasses(0)=Class'NicePack.SkinGoldenDeaglePickup' InventoryType=Class'NicePack.NiceDeagle' PickupMessage="You got the Desert Eagle" PickupSound=Sound'KF_HandcannonSnd.50AE_Pickup' StaticMesh=StaticMesh'KF_pickups_Trip.pistol.deagle_pickup' -} +class NiceDeaglePickup extends NiceSinglePickup; +defaultproperties +{ + Weight=2.000000 + cost=250 + AmmoCost=11 + BuyClipSize=8 + PowerValue=65 + SpeedValue=35 + RangeValue=60 + Description="50 Cal AE handgun. A powerful personal choice for personal defense." + ItemName="Desert Eagle" + ItemShortName="Deagle" + AmmoItemName=".300 JHP Ammo" + AmmoMesh=None + VariantClasses(0)=Class'NicePack.SkinGoldenDeaglePickup' + InventoryType=Class'NicePack.NiceDeagle' + PickupMessage="You got the Desert Eagle" + PickupSound=Sound'KF_HandcannonSnd.50AE_Pickup' + StaticMesh=StaticMesh'KF_pickups_Trip.pistol.deagle_pickup' +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagle.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagle.uc index 86177a0..d3544e5 100644 --- a/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagle.uc +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagle.uc @@ -1,4 +1,35 @@ -class NiceDualDeagle extends NiceDualies; -defaultproperties -{ SingleClass=Class'NicePack.NiceDeagle' altFlashBoneName="tip01" leftEject=0.120000 rightEject=0.111000 rightInsert=0.778000 MagCapacity=16 FlashBoneName="tip" Weight=4.000000 StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Dual_Handcannons' bIsTier2Weapon=True MeshRef="KF_Weapons_Trip.Dual50_Trip" SkinRefs(0)="KF_Weapons_Trip_T.Pistols.deagle_cmb" SelectSoundRef="KF_HandcannonSnd.50AE_Select" HudImageRef="KillingFloorHUD.WeaponSelect.dual_handcannon_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.dual_handcannon" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceDualDeagleFire' AIRating=0.450000 CurrentRating=0.450000 Description="Dual .50 calibre action express handgun. Dual 50's is double the fun." DisplayFOV=60.000000 Priority=125 GroupOffset=12 PickupClass=Class'NicePack.NiceDualDeaglePickup' PlayerViewOffset=(X=25.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceDualDeagleAttachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="Dual Desert Eagles" DrawScale=1.000000 -} +class NiceDualDeagle extends NiceDualies; +defaultproperties +{ + SingleClass=Class'NicePack.NiceDeagle' + altFlashBoneName="tip01" + leftEject=0.120000 + rightEject=0.111000 + rightInsert=0.778000 + MagCapacity=16 + FlashBoneName="tip" + Weight=4.000000 + StandardDisplayFOV=60.000000 + TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Dual_Handcannons' + bIsTier2Weapon=True + MeshRef="KF_Weapons_Trip.Dual50_Trip" + SkinRefs(0)="KF_Weapons_Trip_T.Pistols.deagle_cmb" + SelectSoundRef="KF_HandcannonSnd.50AE_Select" + HudImageRef="KillingFloorHUD.WeaponSelect.dual_handcannon_unselected" + SelectedHudImageRef="KillingFloorHUD.WeaponSelect.dual_handcannon" + ZoomedDisplayFOV=50.000000 + FireModeClass(0)=Class'NicePack.NiceDualDeagleFire' + AIRating=0.450000 + CurrentRating=0.450000 + Description="Dual .50 calibre action express handgun. Dual 50's is double the fun." + DisplayFOV=60.000000 + Priority=125 + GroupOffset=12 + PickupClass=Class'NicePack.NiceDualDeaglePickup' + PlayerViewOffset=(X=25.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceDualDeagleAttachment' + IconCoords=(X1=250,Y1=110,X2=330,Y2=145) + ItemName="Dual Desert Eagles" + DrawScale=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAmmo.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAmmo.uc index 2272701..f75c903 100644 --- a/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAmmo.uc +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAmmo.uc @@ -1,5 +1,13 @@ -class NiceDualDeagleAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=InterfaceContent.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceDualDeaglePickup' AmmoPickupAmount=8 MaxAmmo=72 InitialAmount=24 PickupClass=Class'NicePack.NiceDualDeagleAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="Deagle bullets" -} +class NiceDualDeagleAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceDualDeaglePickup' + AmmoPickupAmount=8 + MaxAmmo=72 + InitialAmount=24 + PickupClass=Class'NicePack.NiceDualDeagleAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=338,Y1=40,X2=393,Y2=79) + ItemName="Deagle bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAmmoPickup.uc index cc8050e..81c29b9 100644 --- a/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAmmoPickup.uc +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAmmoPickup.uc @@ -1,4 +1,9 @@ -class NiceDualDeagleAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' AmmoAmount=8 InventoryType=Class'NicePack.NiceDualDeagleAmmo' PickupMessage="Rounds (.300 JHP)" StaticMesh=None -} +class NiceDualDeagleAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' + AmmoAmount=8 + InventoryType=Class'NicePack.NiceDualDeagleAmmo' + PickupMessage="Rounds (.300 JHP)" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAttachment.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAttachment.uc index adeb2d8..1912cea 100644 --- a/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAttachment.uc +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeagleAttachment.uc @@ -1,4 +1,10 @@ -class NiceDualDeagleAttachment extends NiceDualiesAttachment; -defaultproperties -{ BrotherMesh=SkeletalMesh'KF_Weapons3rd_Trip.Handcannon_3rd' mTracerClass=Class'KFMod.KFLargeTracer' MeshRef="KF_Weapons3rd_Trip.Handcannon_3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceDualDeagleAttachment extends NiceDualiesAttachment; +defaultproperties +{ + BrotherMesh=SkeletalMesh'KF_Weapons3rd_Trip.Handcannon_3rd' + mTracerClass=Class'KFMod.KFLargeTracer' + MeshRef="KF_Weapons3rd_Trip.Handcannon_3rd" + bHeavy=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeaglePickup.uc b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeaglePickup.uc index 9149caf..bb2f35b 100644 --- a/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeaglePickup.uc +++ b/sources/Weapons/Playable/Pistols/Deagle/NiceDualDeaglePickup.uc @@ -1,4 +1,21 @@ -class NiceDualDeaglePickup extends NiceDualiesPickup; -defaultproperties -{ Weight=4.000000 cost=500 AmmoCost=22 BuyClipSize=8 PowerValue=85 SpeedValue=35 RangeValue=60 Description="A pair of 50 Cal AE handguns." ItemName="Dual Desert Eagles" ItemShortName="Dual Deagles" AmmoItemName=".300 JHP Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.DeagleAmmo' VariantClasses(0)=Class'NicePack.SkinGoldenDualDeaglePickup' InventoryType=Class'NicePack.NiceDualDeagle' PickupMessage="You found another Handcannon" PickupSound=Sound'KF_HandcannonSnd.50AE_Pickup' StaticMesh=StaticMesh'KF_pickups_Trip.pistol.deagle_pickup' -} +class NiceDualDeaglePickup extends NiceDualiesPickup; +defaultproperties +{ + Weight=4.000000 + cost=500 + AmmoCost=22 + BuyClipSize=8 + PowerValue=85 + SpeedValue=35 + RangeValue=60 + Description="A pair of 50 Cal AE handguns." + ItemName="Dual Desert Eagles" + ItemShortName="Dual Deagles" + AmmoItemName=".300 JHP Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.DeagleAmmo' + VariantClasses(0)=Class'NicePack.SkinGoldenDualDeaglePickup' + InventoryType=Class'NicePack.NiceDualDeagle' + PickupMessage="You found another Handcannon" + PickupSound=Sound'KF_HandcannonSnd.50AE_Pickup' + StaticMesh=StaticMesh'KF_pickups_Trip.pistol.deagle_pickup' +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceDamTypeGlock.uc b/sources/Weapons/Playable/Pistols/Glock/NiceDamTypeGlock.uc index 27626d5..def3bc9 100644 --- a/sources/Weapons/Playable/Pistols/Glock/NiceDamTypeGlock.uc +++ b/sources/Weapons/Playable/Pistols/Glock/NiceDamTypeGlock.uc @@ -1,6 +1,18 @@ -class NiceDamTypeGlock extends NiceDamageTypeVetSharpshooter - abstract; -defaultproperties -{ - goodDecapMod=0.500000 HeadShotDamageMult=1.100000 WeaponClass=Class'NicePack.NiceGlock' DeathString="%k killed %o with Glock." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=1850.000000 KDeathVel=150.000000 KDeathUpKick=5.000000 VehicleDamageScaling=0.800000 -} +class NiceDamTypeGlock extends NiceDamageTypeVetSharpshooter + abstract; +defaultproperties +{ + goodDecapMod=0.500000 + HeadShotDamageMult=1.100000 + WeaponClass=Class'NicePack.NiceGlock' + DeathString="%k killed %o with Glock." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + FlashFog=(X=600.000000) + KDamageImpulse=1850.000000 + KDeathVel=150.000000 + KDeathUpKick=5.000000 + VehicleDamageScaling=0.800000 +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlock.uc b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlock.uc index 19ca862..f1e0546 100644 --- a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlock.uc +++ b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlock.uc @@ -1,5 +1,36 @@ -class NiceDualGlock extends NiceDualies; -defaultproperties -{ SingleClass=Class'NicePack.NiceGlock' bLoadResourcesAsMaterial=True MagCapacity=24 StandardDisplayFOV=65.000000 SleeveNum=4 TraderInfoTexture=Texture'NicePackT.Glock17.DualGlock17_trader' bIsTier2Weapon=True - Weight=2.000000 MeshRef="NicePackA.Glock17.v2_dual_Glock17" SkinRefs(0)="NicePackT.Glock17.frame_cmb" SkinRefs(1)="NicePackT.Glock17.17Slide_cmb" SkinRefs(2)="NicePackT.Glock17.Internals_cmb" SkinRefs(3)="NicePackT.Glock17.Magazine_cmb" SkinRefs(4)="KF_Weapons_Trip_T.hands.hands_1stP_military_diff" SelectSoundRef="KF_MK23Snd.MK23_Select" HudImageRef="NicePackT.Glock17.DualGlock17_unselect" SelectedHudImageRef="NicePackT.Glock17.DualGlock17_select" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceDualGlockFire' AIRating=0.450000 CurrentRating=0.450000 Description="Dual Glock-17 match grade pistols. Dual 9mm is double the fun." DisplayFOV=65.000000 Priority=90 GroupOffset=6 PickupClass=Class'NicePack.NiceDualGlockPickup' PlayerViewOffset=(X=25.000000) BobDamping=3.800000 AttachmentClass=Class'NicePack.NiceDualGlockAttachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="Dual Glock-17" DrawScale=1.000000 -} +class NiceDualGlock extends NiceDualies; +defaultproperties +{ + SingleClass=Class'NicePack.NiceGlock' + bLoadResourcesAsMaterial=True + MagCapacity=24 + StandardDisplayFOV=65.000000 + SleeveNum=4 + TraderInfoTexture=Texture'NicePackT.Glock17.DualGlock17_trader' + bIsTier2Weapon=True + Weight=2.000000 + MeshRef="NicePackA.Glock17.v2_dual_Glock17" + SkinRefs(0)="NicePackT.Glock17.frame_cmb" + SkinRefs(1)="NicePackT.Glock17.17Slide_cmb" + SkinRefs(2)="NicePackT.Glock17.Internals_cmb" + SkinRefs(3)="NicePackT.Glock17.Magazine_cmb" + SkinRefs(4)="KF_Weapons_Trip_T.hands.hands_1stP_military_diff" + SelectSoundRef="KF_MK23Snd.MK23_Select" + HudImageRef="NicePackT.Glock17.DualGlock17_unselect" + SelectedHudImageRef="NicePackT.Glock17.DualGlock17_select" + ZoomedDisplayFOV=50.000000 + FireModeClass(0)=Class'NicePack.NiceDualGlockFire' + AIRating=0.450000 + CurrentRating=0.450000 + Description="Dual Glock-17 match grade pistols. Dual 9mm is double the fun." + DisplayFOV=65.000000 + Priority=90 + GroupOffset=6 + PickupClass=Class'NicePack.NiceDualGlockPickup' + PlayerViewOffset=(X=25.000000) + BobDamping=3.800000 + AttachmentClass=Class'NicePack.NiceDualGlockAttachment' + IconCoords=(X1=250,Y1=110,X2=330,Y2=145) + ItemName="Dual Glock-17" + DrawScale=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAmmo.uc b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAmmo.uc index d4bd626..3b83111 100644 --- a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAmmo.uc +++ b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAmmo.uc @@ -1,4 +1,12 @@ -class NiceDualGlockAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceDualGlockPickup' AmmoPickupAmount=12 MaxAmmo=180 InitialAmount=45 PickupClass=Class'NicePack.NiceDualGlockAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="Glock-17 bullets" -} +class NiceDualGlockAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceDualGlockPickup' + AmmoPickupAmount=12 + MaxAmmo=180 + InitialAmount=45 + PickupClass=Class'NicePack.NiceDualGlockAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=338,Y1=40,X2=393,Y2=79) + ItemName="Glock-17 bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAmmoPickup.uc index 6cede34..873ce93 100644 --- a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAmmoPickup.uc +++ b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceDualGlockAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' AmmoAmount=12 InventoryType=Class'NicePack.NiceDualGlockAmmo' PickupMessage="Rounds (9x19mm)" -} +class NiceDualGlockAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' + AmmoAmount=12 + InventoryType=Class'NicePack.NiceDualGlockAmmo' + PickupMessage="Rounds (9x19mm)" +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAttachment.uc b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAttachment.uc index 93fdca8..a3a2234 100644 --- a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAttachment.uc +++ b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockAttachment.uc @@ -1,4 +1,6 @@ -class NiceDualGlockAttachment extends NiceDualiesAttachment; -defaultproperties -{ BrotherMesh=SkeletalMesh'NicePackA.Glock17.SingleGlock17_3rd' MeshRef="NicePackA.Glock17.SingleGlock17_3rd" -} +class NiceDualGlockAttachment extends NiceDualiesAttachment; +defaultproperties +{ + BrotherMesh=SkeletalMesh'NicePackA.Glock17.SingleGlock17_3rd' + MeshRef="NicePackA.Glock17.SingleGlock17_3rd" +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockFire.uc b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockFire.uc index bb23c0c..7d5f899 100644 --- a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockFire.uc +++ b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockFire.uc @@ -1,4 +1,23 @@ -class NiceDualGlockFire extends NiceDualiesFire; -defaultproperties -{ ProjectileSpeed=18750.000000 maxVerticalRecoilAngle=200 maxHorizontalRecoilAngle=100 ShellEjectClass=Class'NicePack.NiceGlockShell' FireSoundRef="NicePackSnd.Glock17.glock17_Fire" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeGlock' DamageMax=35 Momentum=18000.000000 bWaitForRelease=False FireRate=0.087500 AmmoClass=Class'NicePack.NiceDualGlockAmmo' ShakeRotMag=(Z=290.000000) ShakeRotRate=(X=10080.000000,Y=10080.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(Y=1.000000,Z=8.000000) ShakeOffsetTime=2.500000 FlashEmitterClass=Class'KFMod.MuzzleFlashMK' aimerror=40.000000 -} +class NiceDualGlockFire extends NiceDualiesFire; +defaultproperties +{ + ProjectileSpeed=18750.000000 + maxVerticalRecoilAngle=200 + maxHorizontalRecoilAngle=100 + ShellEjectClass=Class'NicePack.NiceGlockShell' + FireSoundRef="NicePackSnd.Glock17.glock17_Fire" + NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" + DamageType=Class'NicePack.NiceDamTypeGlock' + DamageMax=35 + Momentum=18000.000000 + bWaitForRelease=False + FireRate=0.087500 + AmmoClass=Class'NicePack.NiceDualGlockAmmo' + ShakeRotMag=(Z=290.000000) + ShakeRotRate=(X=10080.000000,Y=10080.000000) + ShakeRotTime=3.500000 + ShakeOffsetMag=(Y=1.000000,Z=8.000000) + ShakeOffsetTime=2.500000 + FlashEmitterClass=Class'KFMod.MuzzleFlashMK' + aimerror=40.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockPickup.uc b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockPickup.uc index 8ae098c..6935979 100644 --- a/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockPickup.uc +++ b/sources/Weapons/Playable/Pistols/Glock/NiceDualGlockPickup.uc @@ -1,4 +1,19 @@ -class NiceDualGlockPickup extends NiceDualiesPickup; -defaultproperties -{ bBackupWeapon=True Weight=4.000000 cost=250 BuyClipSize=12 PowerValue=70 SpeedValue=45 RangeValue=60 Description="Dual Glock-17 match grade pistols. Dual 9mm is double the fun." ItemName="Dual Glock-17" ItemShortName="Dual Glock-17" AmmoItemName="9mm Ammo" InventoryType=Class'NicePack.NiceDualGlock' PickupMessage="You found another - Glock-17" PickupSound=Sound'KF_MK23Snd.MK23_Pickup' StaticMesh=StaticMesh'NicePackSM.Glock17.singleGlock17_stc' -} +class NiceDualGlockPickup extends NiceDualiesPickup; +defaultproperties +{ + bBackupWeapon=True + Weight=4.000000 + cost=250 + BuyClipSize=12 + PowerValue=70 + SpeedValue=45 + RangeValue=60 + Description="Dual Glock-17 match grade pistols. Dual 9mm is double the fun." + ItemName="Dual Glock-17" + ItemShortName="Dual Glock-17" + AmmoItemName="9mm Ammo" + InventoryType=Class'NicePack.NiceDualGlock' + PickupMessage="You found another - Glock-17" + PickupSound=Sound'KF_MK23Snd.MK23_Pickup' + StaticMesh=StaticMesh'NicePackSM.Glock17.singleGlock17_stc' +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceGlock.uc b/sources/Weapons/Playable/Pistols/Glock/NiceGlock.uc index a5b1e14..0b670cc 100644 --- a/sources/Weapons/Playable/Pistols/Glock/NiceGlock.uc +++ b/sources/Weapons/Playable/Pistols/Glock/NiceGlock.uc @@ -1,4 +1,42 @@ -class NiceGlock extends NiceSingle; -defaultproperties -{ DualClass=Class'NicePack.NiceDualGlock' reloadPreEndFrame=0.117000 reloadEndFrame=0.617000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.250000 reloadChargeStartFrame=-1.000000 MagCapacity=12 Weight=1.000000 StandardDisplayFOV=65.000000 SleeveNum=4 TraderInfoTexture=Texture'NicePackT.Glock17.SingleGlock17_trader' bIsTier2Weapon=True MeshRef="NicePackA.Glock17.v_glock17" SkinRefs(0)="NicePackT.Glock17.Frame_cmb" SkinRefs(1)="NicePackT.Glock17.17Slide_cmb" SkinRefs(2)="NicePackT.Glock17.Internals_cmb" SkinRefs(3)="NicePackT.Glock17.Magazine_cmb" SkinRefs(4)="KF_Weapons_Trip_T.hands.hands_1stP_military_diff" SelectSoundRef="KF_MK23Snd.MK23_Select" HudImageRef="NicePackT.Glock17.SingleGlock17_unselect" SelectedHudImageRef="NicePackT.Glock17.SingleGlock17_select" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceGlockFire' AIRating=0.450000 CurrentRating=0.450000 Description="Specifically for the needs of the army and police special forces company Glock created version of the model 17." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=65 GroupOffset=5 PickupClass=Class'NicePack.NiceGlockPickup' PlayerViewOffset=(X=10.000000,Y=18.750000,Z=-7.000000) BobDamping=4.500000 AttachmentClass=Class'NicePack.NiceGlockAttachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="Glock-17" bUseDynamicLights=True TransientSoundVolume=1.000000 -} +class NiceGlock extends NiceSingle; +defaultproperties +{ + DualClass=Class'NicePack.NiceDualGlock' + reloadPreEndFrame=0.117000 + reloadEndFrame=0.617000 + reloadChargeEndFrame=-1.000000 + reloadMagStartFrame=0.250000 + reloadChargeStartFrame=-1.000000 + MagCapacity=12 + Weight=1.000000 + StandardDisplayFOV=65.000000 + SleeveNum=4 + TraderInfoTexture=Texture'NicePackT.Glock17.SingleGlock17_trader' + bIsTier2Weapon=True + MeshRef="NicePackA.Glock17.v_glock17" + SkinRefs(0)="NicePackT.Glock17.Frame_cmb" + SkinRefs(1)="NicePackT.Glock17.17Slide_cmb" + SkinRefs(2)="NicePackT.Glock17.Internals_cmb" + SkinRefs(3)="NicePackT.Glock17.Magazine_cmb" + SkinRefs(4)="KF_Weapons_Trip_T.hands.hands_1stP_military_diff" + SelectSoundRef="KF_MK23Snd.MK23_Select" + HudImageRef="NicePackT.Glock17.SingleGlock17_unselect" + SelectedHudImageRef="NicePackT.Glock17.SingleGlock17_select" + ZoomedDisplayFOV=50.000000 + FireModeClass(0)=Class'NicePack.NiceGlockFire' + AIRating=0.450000 + CurrentRating=0.450000 + Description="Specifically for the needs of the army and police special forces company Glock created version of the model 17." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=65.000000 + Priority=65 + GroupOffset=5 + PickupClass=Class'NicePack.NiceGlockPickup' + PlayerViewOffset=(X=10.000000,Y=18.750000,Z=-7.000000) + BobDamping=4.500000 + AttachmentClass=Class'NicePack.NiceGlockAttachment' + IconCoords=(X1=250,Y1=110,X2=330,Y2=145) + ItemName="Glock-17" + bUseDynamicLights=True + TransientSoundVolume=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceGlockAmmo.uc b/sources/Weapons/Playable/Pistols/Glock/NiceGlockAmmo.uc index 8e50a21..7e44865 100644 --- a/sources/Weapons/Playable/Pistols/Glock/NiceGlockAmmo.uc +++ b/sources/Weapons/Playable/Pistols/Glock/NiceGlockAmmo.uc @@ -1,4 +1,12 @@ -class NiceGlockAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceGlockPickup' AmmoPickupAmount=12 MaxAmmo=180 InitialAmount=45 PickupClass=Class'NicePack.NiceGlockAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="Glock-17 bullets" -} +class NiceGlockAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceGlockPickup' + AmmoPickupAmount=12 + MaxAmmo=180 + InitialAmount=45 + PickupClass=Class'NicePack.NiceGlockAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=338,Y1=40,X2=393,Y2=79) + ItemName="Glock-17 bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceGlockAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Glock/NiceGlockAmmoPickup.uc index 129ed46..e217582 100644 --- a/sources/Weapons/Playable/Pistols/Glock/NiceGlockAmmoPickup.uc +++ b/sources/Weapons/Playable/Pistols/Glock/NiceGlockAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceGlockAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' AmmoAmount=12 InventoryType=Class'NicePack.NiceGlockAmmo' PickupMessage="Rounds (9x19mm)" -} +class NiceGlockAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' + AmmoAmount=12 + InventoryType=Class'NicePack.NiceGlockAmmo' + PickupMessage="Rounds (9x19mm)" +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceGlockAttachment.uc b/sources/Weapons/Playable/Pistols/Glock/NiceGlockAttachment.uc index 48ce2ec..3653c6f 100644 --- a/sources/Weapons/Playable/Pistols/Glock/NiceGlockAttachment.uc +++ b/sources/Weapons/Playable/Pistols/Glock/NiceGlockAttachment.uc @@ -1,4 +1,5 @@ -class NiceGlockAttachment extends NiceSingleAttachment; -defaultproperties -{ MeshRef="NicePackA.Glock17.SingleGlock17_3rd" -} +class NiceGlockAttachment extends NiceSingleAttachment; +defaultproperties +{ + MeshRef="NicePackA.Glock17.SingleGlock17_3rd" +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceGlockFire.uc b/sources/Weapons/Playable/Pistols/Glock/NiceGlockFire.uc index 1401102..b0fe671 100644 --- a/sources/Weapons/Playable/Pistols/Glock/NiceGlockFire.uc +++ b/sources/Weapons/Playable/Pistols/Glock/NiceGlockFire.uc @@ -1,4 +1,22 @@ -class NiceGlockFire extends NiceSingleFire; -defaultproperties -{ ProjectileSpeed=18750.000000 RecoilRate=0.030000 maxVerticalRecoilAngle=200 maxHorizontalRecoilAngle=100 FireSoundRef="NicePackSnd.Glock17.glock17_Fire" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeGlock' DamageMax=35 Momentum=18000.000000 FireRate=0.17500000 AmmoClass=Class'NicePack.NiceGlockAmmo' ShakeRotMag=(Z=290.000000) ShakeRotRate=(X=10080.000000,Y=10080.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(Y=1.000000,Z=8.000000) ShakeOffsetTime=2.500000 BotRefireRate=0.650000 FlashEmitterClass=Class'KFMod.MuzzleFlashMK' -} +class NiceGlockFire extends NiceSingleFire; +defaultproperties +{ + ProjectileSpeed=18750.000000 + RecoilRate=0.030000 + maxVerticalRecoilAngle=200 + maxHorizontalRecoilAngle=100 + FireSoundRef="NicePackSnd.Glock17.glock17_Fire" + NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" + DamageType=Class'NicePack.NiceDamTypeGlock' + DamageMax=35 + Momentum=18000.000000 + FireRate=0.17500000 + AmmoClass=Class'NicePack.NiceGlockAmmo' + ShakeRotMag=(Z=290.000000) + ShakeRotRate=(X=10080.000000,Y=10080.000000) + ShakeRotTime=3.500000 + ShakeOffsetMag=(Y=1.000000,Z=8.000000) + ShakeOffsetTime=2.500000 + BotRefireRate=0.650000 + FlashEmitterClass=Class'KFMod.MuzzleFlashMK' +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceGlockPickup.uc b/sources/Weapons/Playable/Pistols/Glock/NiceGlockPickup.uc index f1d75bb..0a0e914 100644 --- a/sources/Weapons/Playable/Pistols/Glock/NiceGlockPickup.uc +++ b/sources/Weapons/Playable/Pistols/Glock/NiceGlockPickup.uc @@ -1,4 +1,19 @@ -class NiceGlockPickup extends NiceSinglePickup; -defaultproperties -{ bBackupWeapon=True Weight=2.000000 cost=125 BuyClipSize=12 PowerValue=50 SpeedValue=45 RangeValue=60 Description="Specifically for the needs of the army and police special forces company Glock created version of the model 17." ItemName="Glock-17" ItemShortName="Glock-17" AmmoItemName="9mm Ammo" InventoryType=Class'NicePack.NiceGlock' PickupMessage="You got the Glock-17" PickupSound=Sound'KF_MK23Snd.MK23_Pickup' StaticMesh=StaticMesh'NicePackSM.Glock17.singleGlock17_stc' -} +class NiceGlockPickup extends NiceSinglePickup; +defaultproperties +{ + bBackupWeapon=True + Weight=2.000000 + cost=125 + BuyClipSize=12 + PowerValue=50 + SpeedValue=45 + RangeValue=60 + Description="Specifically for the needs of the army and police special forces company Glock created version of the model 17." + ItemName="Glock-17" + ItemShortName="Glock-17" + AmmoItemName="9mm Ammo" + InventoryType=Class'NicePack.NiceGlock' + PickupMessage="You got the Glock-17" + PickupSound=Sound'KF_MK23Snd.MK23_Pickup' + StaticMesh=StaticMesh'NicePackSM.Glock17.singleGlock17_stc' +} diff --git a/sources/Weapons/Playable/Pistols/Glock/NiceGlockShell.uc b/sources/Weapons/Playable/Pistols/Glock/NiceGlockShell.uc index ee55c9b..0436e11 100644 --- a/sources/Weapons/Playable/Pistols/Glock/NiceGlockShell.uc +++ b/sources/Weapons/Playable/Pistols/Glock/NiceGlockShell.uc @@ -1,9 +1,61 @@ -class NiceGlockShell extends KFShellEject; -simulated function Trigger(Actor Other, Pawn EventInstigator){ - Emitters[0].SpawnParticle(1); - Emitters[1].SpawnParticle(3); -} -defaultproperties -{ Begin Object Class=MeshEmitter Name=MeshEmitter10 StaticMesh=StaticMesh'kf_generic_sm.Bullet_Shells.Handcannon_Shell' RespawnDeadParticles=False ZTest=False SpinParticles=True AutomaticInitialSpawning=False Acceleration=(Z=-500.000000) ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) MaxParticles=25 UseRotationFrom=PTRS_Actor SpinsPerSecondRange=(X=(Min=-3.000000,Max=3.000000),Y=(Min=-3.000000,Max=3.000000),Z=(Min=-3.000000,Max=3.000000)) StartSizeRange=(X=(Min=2.500000,Max=2.500000),Y=(Min=2.500000,Max=2.500000),Z=(Min=2.500000,Max=2.500000)) LifetimeRange=(Min=5.000000,Max=5.000000) StartVelocityRange=(X=(Min=-45.000000,Max=45.000000),Y=(Min=-45.000000,Max=45.000000),Z=(Min=180.000000,Max=220.000000)) End Object Emitters(0)=MeshEmitter'KFMod.MK23Shell.MeshEmitter10' - Begin Object Class=SpriteEmitter Name=SpriteEmitter93 UseDirectionAs=PTDU_Up UseCollision=True UseColorScale=True FadeOut=True FadeIn=True RespawnDeadParticles=False ZTest=False UseSizeScale=True UseRegularSizeScale=False UniformSize=True ScaleSizeXByVelocity=True AutomaticInitialSpawning=False Acceleration=(Z=-210.000000) DampingFactorRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.500000,Max=0.500000),Z=(Min=0.500000,Max=0.500000)) ColorScale(0)=(Color=(B=255,G=255,R=187)) ColorScale(1)=(RelativeTime=0.214286,Color=(G=103,R=206,A=255)) ColorScale(2)=(RelativeTime=0.439286,Color=(B=100,G=177,R=255,A=255)) ColorScale(3)=(RelativeTime=1.000000,Color=(G=103,R=206,A=255)) ColorScale(4)=(RelativeTime=1.000000,Color=(G=103,R=206,A=255)) ColorScale(5)=(RelativeTime=1.000000,Color=(R=128,A=255)) ColorScale(6)=(RelativeTime=1.000000) ColorScale(7)=(RelativeTime=1.000000) FadeOutStartTime=0.336000 FadeInEndTime=0.064000 MaxParticles=25 SizeScale(0)=(RelativeSize=1.000000) SizeScale(1)=(RelativeTime=1.000000,RelativeSize=0.250000) StartSizeRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.500000,Max=0.500000),Z=(Min=0.500000,Max=0.500000)) ScaleSizeByVelocityMultiplier=(X=0.010000,Y=0.010000) Texture=Texture'KFX.KFSparkHead' LifetimeRange=(Min=1.500000,Max=1.500000) StartVelocityRange=(X=(Min=-100.000000,Max=100.000000),Y=(Min=-100.000000,Max=100.000000),Z=(Min=50.000000,Max=100.000000)) End Object Emitters(1)=SpriteEmitter'KFMod.MK23Shell.SpriteEmitter93' -} +class NiceGlockShell extends KFShellEject; +simulated function Trigger(Actor Other, Pawn EventInstigator){ + Emitters[0].SpawnParticle(1); + Emitters[1].SpawnParticle(3); +} +defaultproperties +{ + Begin Object Class=MeshEmitter Name=MeshEmitter10 + StaticMesh=StaticMesh'kf_generic_sm.Bullet_Shells.Handcannon_Shell' + RespawnDeadParticles=False + ZTest=False + SpinParticles=True + AutomaticInitialSpawning=False + Acceleration=(Z=-500.000000) + ColorScale(0)=(Color=(B=255,G=255,R=255,A=255)) + ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255)) + MaxParticles=25 + UseRotationFrom=PTRS_Actor + SpinsPerSecondRange=(X=(Min=-3.000000,Max=3.000000),Y=(Min=-3.000000,Max=3.000000),Z=(Min=-3.000000,Max=3.000000)) + StartSizeRange=(X=(Min=2.500000,Max=2.500000),Y=(Min=2.500000,Max=2.500000),Z=(Min=2.500000,Max=2.500000)) + LifetimeRange=(Min=5.000000,Max=5.000000) + StartVelocityRange=(X=(Min=-45.000000,Max=45.000000),Y=(Min=-45.000000,Max=45.000000),Z=(Min=180.000000,Max=220.000000)) + End Object + Emitters(0)=MeshEmitter'KFMod.MK23Shell.MeshEmitter10' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter93 + UseDirectionAs=PTDU_Up + UseCollision=True + UseColorScale=True + FadeOut=True + FadeIn=True + RespawnDeadParticles=False + ZTest=False + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + ScaleSizeXByVelocity=True + AutomaticInitialSpawning=False + Acceleration=(Z=-210.000000) + DampingFactorRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.500000,Max=0.500000),Z=(Min=0.500000,Max=0.500000)) + ColorScale(0)=(Color=(B=255,G=255,R=187)) + ColorScale(1)=(RelativeTime=0.214286,Color=(G=103,R=206,A=255)) + ColorScale(2)=(RelativeTime=0.439286,Color=(B=100,G=177,R=255,A=255)) + ColorScale(3)=(RelativeTime=1.000000,Color=(G=103,R=206,A=255)) + ColorScale(4)=(RelativeTime=1.000000,Color=(G=103,R=206,A=255)) + ColorScale(5)=(RelativeTime=1.000000,Color=(R=128,A=255)) + ColorScale(6)=(RelativeTime=1.000000) + ColorScale(7)=(RelativeTime=1.000000) + FadeOutStartTime=0.336000 + FadeInEndTime=0.064000 + MaxParticles=25 + SizeScale(0)=(RelativeSize=1.000000) + SizeScale(1)=(RelativeTime=1.000000,RelativeSize=0.250000) + StartSizeRange=(X=(Min=0.500000,Max=0.500000),Y=(Min=0.500000,Max=0.500000),Z=(Min=0.500000,Max=0.500000)) + ScaleSizeByVelocityMultiplier=(X=0.010000,Y=0.010000) + Texture=Texture'KFX.KFSparkHead' + LifetimeRange=(Min=1.500000,Max=1.500000) + StartVelocityRange=(X=(Min=-100.000000,Max=100.000000),Y=(Min=-100.000000,Max=100.000000),Z=(Min=50.000000,Max=100.000000)) + End Object + Emitters(1)=SpriteEmitter'KFMod.MK23Shell.SpriteEmitter93' +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceDamTypeJudge.uc b/sources/Weapons/Playable/Pistols/Judge/NiceDamTypeJudge.uc index 2636faf..11ce6b9 100644 --- a/sources/Weapons/Playable/Pistols/Judge/NiceDamTypeJudge.uc +++ b/sources/Weapons/Playable/Pistols/Judge/NiceDamTypeJudge.uc @@ -1,5 +1,19 @@ -class NiceDamTypeJudge extends NiceDamageTypeVetSharpshooter - abstract; -defaultproperties -{ bFinisher=True MaxPenetrations=-1 HeadShotDamageMult=1.400000 WeaponClass=Class'NicePack.NiceJudgePistol' DeathString="%k killed %o with Taurus Raging Judge." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=12000.000000 KDeathVel=800.000000 KDeathUpKick=160.000000 VehicleDamageScaling=0.800000 -} +class NiceDamTypeJudge extends NiceDamageTypeVetSharpshooter + abstract; +defaultproperties +{ + bFinisher=True + MaxPenetrations=-1 + HeadShotDamageMult=1.400000 + WeaponClass=Class'NicePack.NiceJudgePistol' + DeathString="%k killed %o with Taurus Raging Judge." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + FlashFog=(X=600.000000) + KDamageImpulse=12000.000000 + KDeathVel=800.000000 + KDeathUpKick=160.000000 + VehicleDamageScaling=0.800000 +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgeAmmo.uc b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgeAmmo.uc index f439143..e2df30d 100644 --- a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgeAmmo.uc +++ b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgeAmmo.uc @@ -1,4 +1,12 @@ -class NiceDualJudgeAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceDualJudgePistolPickup' AmmoPickupAmount=5 MaxAmmo=60 InitialAmount=15 PickupClass=Class'NicePack.NiceDualJudgeAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="Judge bullets" -} +class NiceDualJudgeAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceDualJudgePistolPickup' + AmmoPickupAmount=5 + MaxAmmo=60 + InitialAmount=15 + PickupClass=Class'NicePack.NiceDualJudgeAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=338,Y1=40,X2=393,Y2=79) + ItemName="Judge bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgeAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgeAmmoPickup.uc index 2d0d2f4..e74db73 100644 --- a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgeAmmoPickup.uc +++ b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgeAmmoPickup.uc @@ -1,4 +1,9 @@ -class NiceDualJudgeAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' AmmoAmount=5 InventoryType=Class'NicePack.NiceDualJudgeAmmo' PickupMessage="Rounds (.45 ACP)" StaticMesh=None -} +class NiceDualJudgeAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' + AmmoAmount=5 + InventoryType=Class'NicePack.NiceDualJudgeAmmo' + PickupMessage="Rounds (.45 ACP)" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistol.uc b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistol.uc index 46a83de..2cf8299 100644 --- a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistol.uc +++ b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistol.uc @@ -1,4 +1,43 @@ -class NiceDualJudgePistol extends NiceDualies; -defaultproperties -{ SingleClass=Class'NicePack.NiceJudgePistol' leftEject=0.192000 rightEject=0.626000 leftInsert=0.396000 rightInsert=0.747000 MagCapacity=10 ReloadRate=5.933333 ReloadAnimRate=1.200000 WeaponReloadAnim="Reload_DualRevolver" Weight=8.000000 StandardDisplayFOV=60.000000 SleeveNum=6 TraderInfoTexture=Texture'NicePackT.judge.dualjuj_p_trader' bIsTier2Weapon=True MeshRef="NicePackA.Judge.dual_judges" SkinRefs(0)="NicePackT.Judge.kfjudge_cmb" SkinRefs(1)="NicePackT.Judge.trit_grn_shdr" SkinRefs(2)="KF_Weapons4_Trip_T.Weapons.Revolver_cmb" SkinRefs(3)="NicePackT.Judge.jujload" SkinRefs(4)="NicePackT.Judge.trit_red_shdr" SkinRefs(5)="NicePackT.Judge.juj_shell_cmb" SelectSoundRef="NicePackSnd.Judge.judge_draw" HudImageRef="NicePackT.Judge.dualjuj_p_unsel" SelectedHudImageRef="NicePackT.Judge.dualjuj_p_sel" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceDualJudgePistolFire' AIRating=0.450000 CurrentRating=0.450000 Description="Dual .50 calibre action express handgun. Dual 50's is double the fun." DisplayFOV=60.000000 Priority=125 GroupOffset=14 PickupClass=Class'NicePack.NiceDualJudgePistolPickup' PlayerViewOffset=(X=25.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceDualJudgePistolAttachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="Dual Raging Judges" DrawScale=1.000000 -} +class NiceDualJudgePistol extends NiceDualies; +defaultproperties +{ + SingleClass=Class'NicePack.NiceJudgePistol' + leftEject=0.192000 + rightEject=0.626000 + leftInsert=0.396000 + rightInsert=0.747000 + MagCapacity=10 + ReloadRate=5.933333 + ReloadAnimRate=1.200000 + WeaponReloadAnim="Reload_DualRevolver" + Weight=8.000000 + StandardDisplayFOV=60.000000 + SleeveNum=6 + TraderInfoTexture=Texture'NicePackT.judge.dualjuj_p_trader' + bIsTier2Weapon=True + MeshRef="NicePackA.Judge.dual_judges" + SkinRefs(0)="NicePackT.Judge.kfjudge_cmb" + SkinRefs(1)="NicePackT.Judge.trit_grn_shdr" + SkinRefs(2)="KF_Weapons4_Trip_T.Weapons.Revolver_cmb" + SkinRefs(3)="NicePackT.Judge.jujload" + SkinRefs(4)="NicePackT.Judge.trit_red_shdr" + SkinRefs(5)="NicePackT.Judge.juj_shell_cmb" + SelectSoundRef="NicePackSnd.Judge.judge_draw" + HudImageRef="NicePackT.Judge.dualjuj_p_unsel" + SelectedHudImageRef="NicePackT.Judge.dualjuj_p_sel" + ZoomedDisplayFOV=50.000000 + FireModeClass(0)=Class'NicePack.NiceDualJudgePistolFire' + AIRating=0.450000 + CurrentRating=0.450000 + Description="Dual .50 calibre action express handgun. Dual 50's is double the fun." + DisplayFOV=60.000000 + Priority=125 + GroupOffset=14 + PickupClass=Class'NicePack.NiceDualJudgePistolPickup' + PlayerViewOffset=(X=25.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceDualJudgePistolAttachment' + IconCoords=(X1=250,Y1=110,X2=330,Y2=145) + ItemName="Dual Raging Judges" + DrawScale=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolAttachment.uc b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolAttachment.uc index eb916ef..f9873cc 100644 --- a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolAttachment.uc +++ b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolAttachment.uc @@ -1,4 +1,11 @@ -class NiceDualJudgePistolAttachment extends NiceDualiesAttachment; -defaultproperties -{ BrotherMesh=SkeletalMesh'NicePackA.judge.juj_3rd' mTracerClass=None mShellCaseEmitterClass=None MeshRef="NicePackA.Judge.juj_3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceDualJudgePistolAttachment extends NiceDualiesAttachment; +defaultproperties +{ + BrotherMesh=SkeletalMesh'NicePackA.judge.juj_3rd' + mTracerClass=None + mShellCaseEmitterClass=None + MeshRef="NicePackA.Judge.juj_3rd" + bHeavy=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolFire.uc b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolFire.uc index 0b226bc..7d4c103 100644 --- a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolFire.uc +++ b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolFire.uc @@ -1,4 +1,25 @@ -class NiceDualJudgePistolFire extends NiceDualiesFire; -defaultproperties -{ ProjectileSpeed=31600.000000 maxVerticalRecoilAngle=600 maxHorizontalRecoilAngle=300 FireSoundRef="NicePackSnd.Judge.raging_judge_fire_m" StereoFireSoundRef="NicePackSnd.Judge.raging_judge_fire_s" NoAmmoSoundRef="KF_9MMSnd.9mm_DryFire" DamageType=Class'NicePack.NiceDamTypeJudge' DamageMin=125 DamageMax=125 TransientSoundVolume=2.000000 TransientSoundRadius=500.000000 TweenTime=0.000000 FireRate=0.325000 AmmoClass=Class'NicePack.NiceDualJudgeAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=400.000000) ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=12500.000000) ShakeRotTime=5.000000 ShakeOffsetMag=(Y=2.000000) ShakeOffsetTime=3.000000 FlashEmitterClass=Class'NicePack.NiceJudgePistolFlash' aimerror=1.000000 -} +class NiceDualJudgePistolFire extends NiceDualiesFire; +defaultproperties +{ + ProjectileSpeed=31600.000000 + maxVerticalRecoilAngle=600 + maxHorizontalRecoilAngle=300 + FireSoundRef="NicePackSnd.Judge.raging_judge_fire_m" + StereoFireSoundRef="NicePackSnd.Judge.raging_judge_fire_s" + NoAmmoSoundRef="KF_9MMSnd.9mm_DryFire" + DamageType=Class'NicePack.NiceDamTypeJudge' + DamageMin=125 + DamageMax=125 + TransientSoundVolume=2.000000 + TransientSoundRadius=500.000000 + TweenTime=0.000000 + FireRate=0.325000 + AmmoClass=Class'NicePack.NiceDualJudgeAmmo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=400.000000) + ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=12500.000000) + ShakeRotTime=5.000000 + ShakeOffsetMag=(Y=2.000000) + ShakeOffsetTime=3.000000 + FlashEmitterClass=Class'NicePack.NiceJudgePistolFlash' + aimerror=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolPickup.uc b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolPickup.uc index 1e0699e..5383ada 100644 --- a/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolPickup.uc +++ b/sources/Weapons/Playable/Pistols/Judge/NiceDualJudgePistolPickup.uc @@ -1,4 +1,21 @@ -class NiceDualJudgePistolPickup extends NiceDualiesPickup; -defaultproperties -{ Weight=8.000000 cost=2500 AmmoCost=30 BuyClipSize=5 PowerValue=85 SpeedValue=35 RangeValue=60 Description="A pair of 50 Cal AE handguns." ItemName="Dual Raging Judges" ItemShortName="Dual Raging Judges" AmmoItemName=".300 JHP Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.DeagleAmmo' VariantClasses(0)=Class'NicePack.SkinGoldenDualJudgePistolPickup' InventoryType=Class'NicePack.NiceDualJudgePistol' PickupMessage="You found another Taurus Raging Judge." PickupSound=Sound'KF_RevolverSnd.foley.WEP_Revolver_Foley_Pickup' StaticMesh=StaticMesh'NicePackSM.judge.judge_pickup' -} +class NiceDualJudgePistolPickup extends NiceDualiesPickup; +defaultproperties +{ + Weight=8.000000 + cost=2500 + AmmoCost=30 + BuyClipSize=5 + PowerValue=85 + SpeedValue=35 + RangeValue=60 + Description="A pair of 50 Cal AE handguns." + ItemName="Dual Raging Judges" + ItemShortName="Dual Raging Judges" + AmmoItemName=".300 JHP Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.DeagleAmmo' + VariantClasses(0)=Class'NicePack.SkinGoldenDualJudgePistolPickup' + InventoryType=Class'NicePack.NiceDualJudgePistol' + PickupMessage="You found another Taurus Raging Judge." + PickupSound=Sound'KF_RevolverSnd.foley.WEP_Revolver_Foley_Pickup' + StaticMesh=StaticMesh'NicePackSM.judge.judge_pickup' +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgeAmmo.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgeAmmo.uc index c31233f..258b4b3 100644 --- a/sources/Weapons/Playable/Pistols/Judge/NiceJudgeAmmo.uc +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgeAmmo.uc @@ -1,4 +1,12 @@ -class NiceJudgeAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceJudgePistolPickup' AmmoPickupAmount=5 MaxAmmo=60 InitialAmount=15 PickupClass=Class'NicePack.NiceJudgeAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="Judge bullets" -} +class NiceJudgeAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceJudgePistolPickup' + AmmoPickupAmount=5 + MaxAmmo=60 + InitialAmount=15 + PickupClass=Class'NicePack.NiceJudgeAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=338,Y1=40,X2=393,Y2=79) + ItemName="Judge bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgeAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgeAmmoPickup.uc index 0ed7be1..ac35ec6 100644 --- a/sources/Weapons/Playable/Pistols/Judge/NiceJudgeAmmoPickup.uc +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgeAmmoPickup.uc @@ -1,4 +1,9 @@ -class NiceJudgeAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' AmmoAmount=5 InventoryType=Class'NicePack.NiceJudgeAmmo' PickupMessage="Rounds (.45 ACP)" StaticMesh=None -} +class NiceJudgeAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' + AmmoAmount=5 + InventoryType=Class'NicePack.NiceJudgeAmmo' + PickupMessage="Rounds (.45 ACP)" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgeBarrelSmoke.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgeBarrelSmoke.uc index b272cd1..e930c8c 100644 --- a/sources/Weapons/Playable/Pistols/Judge/NiceJudgeBarrelSmoke.uc +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgeBarrelSmoke.uc @@ -1,11 +1,28 @@ -class NiceJudgeBarrelSmoke extends SpeedTrail; -var float WaitCount; -simulated function Tick(float DeltaTime){ - super.Tick(DeltaTime); - WaitCount += DeltaTime; - if(WaitCount > 1.500000){ mRegen = False; mRegenRange[0]=0.000000; mRegenRange[1]=0.000000; - } -} -defaultproperties -{ mLifeRange(0)=1.000000 mLifeRange(1)=1.000000 mRegenRange(0)=30.000000 mRegenRange(1)=30.000000 mDirDev=(X=0.100000,Y=0.100000,Z=0.010000) mPosDev=(X=0.000000,Y=0.000000,Z=0.000000) mSpeedRange(0)=50.000000 mSpeedRange(1)=50.000000 mSizeRange(0)=10.000000 mSizeRange(1)=10.000000 mGrowthRate=-10.000000 mColorRange(0)=(A=128) mColorRange(1)=(A=128) LifeSpan=3.000000 -} +class NiceJudgeBarrelSmoke extends SpeedTrail; +var float WaitCount; +simulated function Tick(float DeltaTime){ + super.Tick(DeltaTime); + WaitCount += DeltaTime; + if(WaitCount > 1.500000){ + mRegen = False; + mRegenRange[0]=0.000000; + mRegenRange[1]=0.000000; + } +} +defaultproperties +{ + mLifeRange(0)=1.000000 + mLifeRange(1)=1.000000 + mRegenRange(0)=30.000000 + mRegenRange(1)=30.000000 + mDirDev=(X=0.100000,Y=0.100000,Z=0.010000) + mPosDev=(X=0.000000,Y=0.000000,Z=0.000000) + mSpeedRange(0)=50.000000 + mSpeedRange(1)=50.000000 + mSizeRange(0)=10.000000 + mSizeRange(1)=10.000000 + mGrowthRate=-10.000000 + mColorRange(0)=(A=128) + mColorRange(1)=(A=128) + LifeSpan=3.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistol.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistol.uc index 262adba..7548aec 100644 --- a/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistol.uc +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistol.uc @@ -1,4 +1,47 @@ -class NiceJudgePistol extends NiceSingle; -defaultproperties -{ DualClass=Class'NicePack.NiceDualJudgePistol' reloadPreEndFrame=0.272000 reloadEndFrame=0.790000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.400000 reloadChargeStartFrame=-1.000000 MagCapacity=5 ReloadRate=2.277778 ReloadAnimRate=1.200000 WeaponReloadAnim="Reload_Revolver" Weight=4.000000 StandardDisplayFOV=60.000000 SleeveNum=6 TraderInfoTexture=Texture'NicePackT.judge.juj_p_trader' bIsTier2Weapon=True MeshRef="NicePackA.Judge.judge" SkinRefs(0)="NicePackT.Judge.kfjudge_cmb" SkinRefs(1)="NicePackT.Judge.trit_grn_shdr" SkinRefs(2)="KF_Weapons4_Trip_T.Weapons.Revolver_cmb" SkinRefs(3)="NicePackT.Judge.jujload" SkinRefs(4)="NicePackT.Judge.trit_red_shdr" SkinRefs(5)="NicePackT.Judge.juj_shell_cmb" SelectSoundRef="NicePackSnd.Judge.judge_draw" HudImageRef="NicePackT.Judge.juj_p_unsel" SelectedHudImageRef="NicePackT.Judge.juj_p_sel" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceJudgePistolFire' SelectAnimRate=1.000000 BringUpTime=0.533333 AIRating=0.450000 CurrentRating=0.450000 Description=".50 calibre action express handgun. This is about as big and nasty as personal weapons are going to get. But with a 5 round magazine, it should be used conservatively." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=100 GroupOffset=13 PickupClass=Class'NicePack.NiceJudgePistolPickup' PlayerViewOffset=(X=30.000000,Y=20.000000) AttachmentClass=Class'NicePack.NiceJudgePistolAttachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="Taurus Raging Judge" bUseDynamicLights=True TransientSoundVolume=1.000000 -} +class NiceJudgePistol extends NiceSingle; +defaultproperties +{ + DualClass=Class'NicePack.NiceDualJudgePistol' + reloadPreEndFrame=0.272000 + reloadEndFrame=0.790000 + reloadChargeEndFrame=-1.000000 + reloadMagStartFrame=0.400000 + reloadChargeStartFrame=-1.000000 + MagCapacity=5 + ReloadRate=2.277778 + ReloadAnimRate=1.200000 + WeaponReloadAnim="Reload_Revolver" + Weight=4.000000 + StandardDisplayFOV=60.000000 + SleeveNum=6 + TraderInfoTexture=Texture'NicePackT.judge.juj_p_trader' + bIsTier2Weapon=True + MeshRef="NicePackA.Judge.judge" + SkinRefs(0)="NicePackT.Judge.kfjudge_cmb" + SkinRefs(1)="NicePackT.Judge.trit_grn_shdr" + SkinRefs(2)="KF_Weapons4_Trip_T.Weapons.Revolver_cmb" + SkinRefs(3)="NicePackT.Judge.jujload" + SkinRefs(4)="NicePackT.Judge.trit_red_shdr" + SkinRefs(5)="NicePackT.Judge.juj_shell_cmb" + SelectSoundRef="NicePackSnd.Judge.judge_draw" + HudImageRef="NicePackT.Judge.juj_p_unsel" + SelectedHudImageRef="NicePackT.Judge.juj_p_sel" + ZoomedDisplayFOV=50.000000 + FireModeClass(0)=Class'NicePack.NiceJudgePistolFire' + SelectAnimRate=1.000000 + BringUpTime=0.533333 + AIRating=0.450000 + CurrentRating=0.450000 + Description=".50 calibre action express handgun. This is about as big and nasty as personal weapons are going to get. But with a 5 round magazine, it should be used conservatively." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=60.000000 + Priority=100 + GroupOffset=13 + PickupClass=Class'NicePack.NiceJudgePistolPickup' + PlayerViewOffset=(X=30.000000,Y=20.000000) + AttachmentClass=Class'NicePack.NiceJudgePistolAttachment' + IconCoords=(X1=250,Y1=110,X2=330,Y2=145) + ItemName="Taurus Raging Judge" + bUseDynamicLights=True + TransientSoundVolume=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolAttachment.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolAttachment.uc index 9029b16..6bdecc3 100644 --- a/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolAttachment.uc +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolAttachment.uc @@ -1,4 +1,7 @@ -class NiceJudgePistolAttachment extends NiceSingleAttachment; -defaultproperties -{ mTracerClass=None MeshRef="NicePackA.Judge.juj_3rd" bHeavy=True -} +class NiceJudgePistolAttachment extends NiceSingleAttachment; +defaultproperties +{ + mTracerClass=None + MeshRef="NicePackA.Judge.juj_3rd" + bHeavy=True +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolFire.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolFire.uc index 202ca96..15dfd28 100644 --- a/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolFire.uc +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolFire.uc @@ -1,4 +1,27 @@ -class NiceJudgePistolFire extends NiceSingleFire; -defaultproperties -{ ProjectileSpeed=31600.000000 maxVerticalRecoilAngle=600 maxHorizontalRecoilAngle=300 FireSoundRef="NicePackSnd.Judge.raging_judge_fire_m" StereoFireSoundRef="NicePackSnd.Judge.raging_judge_fire_s" NoAmmoSoundRef="KF_PumpSGSnd.SG_DryFire" DamageType=Class'NicePack.NiceDamTypeJudge' DamageMin=125 DamageMax=125 TransientSoundVolume=2.000000 TransientSoundRadius=500.000000 FireAnimRate=1.000000 TweenTime=0.000000 FireRate=0.650000 AmmoClass=Class'NicePack.NiceJudgeAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=400.000000) ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=12500.000000) ShakeRotTime=5.000000 ShakeOffsetMag=(Y=2.000000) ShakeOffsetTime=3.000000 BotRefireRate=1.500000 FlashEmitterClass=Class'NicePack.NiceJudgePistolFlash' aimerror=1.000000 -} +class NiceJudgePistolFire extends NiceSingleFire; +defaultproperties +{ + ProjectileSpeed=31600.000000 + maxVerticalRecoilAngle=600 + maxHorizontalRecoilAngle=300 + FireSoundRef="NicePackSnd.Judge.raging_judge_fire_m" + StereoFireSoundRef="NicePackSnd.Judge.raging_judge_fire_s" + NoAmmoSoundRef="KF_PumpSGSnd.SG_DryFire" + DamageType=Class'NicePack.NiceDamTypeJudge' + DamageMin=125 + DamageMax=125 + TransientSoundVolume=2.000000 + TransientSoundRadius=500.000000 + FireAnimRate=1.000000 + TweenTime=0.000000 + FireRate=0.650000 + AmmoClass=Class'NicePack.NiceJudgeAmmo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=400.000000) + ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=12500.000000) + ShakeRotTime=5.000000 + ShakeOffsetMag=(Y=2.000000) + ShakeOffsetTime=3.000000 + BotRefireRate=1.500000 + FlashEmitterClass=Class'NicePack.NiceJudgePistolFlash' + aimerror=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolFlash.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolFlash.uc index 48859cc..b8c68b4 100644 --- a/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolFlash.uc +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolFlash.uc @@ -1,9 +1,46 @@ -class NiceJudgePistolFlash extends ROMuzzleFlash1st; -simulated function Trigger(Actor Other, Pawn EventInstigator){ - Emitters[0].SpawnParticle(2); - Emitters[1].SpawnParticle(1); -} -defaultproperties -{ Begin Object Class=SpriteEmitter Name=SpriteEmitter0 RespawnDeadParticles=False SpinParticles=True UseSizeScale=True UseRegularSizeScale=False UniformSize=True AutomaticInitialSpawning=False BlendBetweenSubdivisions=True UseSubdivisionScale=True UseRandomSubdivision=True Opacity=0.500000 CoordinateSystem=PTCS_Relative UseRotationFrom=PTRS_Actor StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000)) SizeScale(0)=(RelativeSize=4.000000) SizeScale(1)=(RelativeTime=0.500000,RelativeSize=4.000000) SizeScale(2)=(RelativeTime=1.000000,RelativeSize=3.000000) StartSizeRange=(X=(Min=11.000000,Max=11.000000)) DrawStyle=PTDS_Brighten Texture=Texture'Effects_Tex.Weapons.STGmuzzleflash_4frame' TextureUSubdivisions=2 TextureVSubdivisions=2 LifetimeRange=(Min=0.100000,Max=0.100000) End Object Emitters(0)=SpriteEmitter'NicePack.NiceJudgePistolFlash.SpriteEmitter0' - Begin Object Class=SpriteEmitter Name=SpriteEmitter1 RespawnDeadParticles=False UniformSize=True AutomaticInitialSpawning=False Opacity=0.100000 MaxParticles=1 StartSizeRange=(X=(Min=50.000000,Max=50.000000)) DrawStyle=PTDS_Brighten Texture=Texture'Effects_Tex.Smoke.MuzzleCorona1stP' LifetimeRange=(Min=0.100000,Max=0.100000) End Object Emitters(1)=SpriteEmitter'NicePack.NiceJudgePistolFlash.SpriteEmitter1' -} +class NiceJudgePistolFlash extends ROMuzzleFlash1st; +simulated function Trigger(Actor Other, Pawn EventInstigator){ + Emitters[0].SpawnParticle(2); + Emitters[1].SpawnParticle(1); +} +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter0 + RespawnDeadParticles=False + SpinParticles=True + UseSizeScale=True + UseRegularSizeScale=False + UniformSize=True + AutomaticInitialSpawning=False + BlendBetweenSubdivisions=True + UseSubdivisionScale=True + UseRandomSubdivision=True + Opacity=0.500000 + CoordinateSystem=PTCS_Relative + UseRotationFrom=PTRS_Actor + StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000)) + SizeScale(0)=(RelativeSize=4.000000) + SizeScale(1)=(RelativeTime=0.500000,RelativeSize=4.000000) + SizeScale(2)=(RelativeTime=1.000000,RelativeSize=3.000000) + StartSizeRange=(X=(Min=11.000000,Max=11.000000)) + DrawStyle=PTDS_Brighten + Texture=Texture'Effects_Tex.Weapons.STGmuzzleflash_4frame' + TextureUSubdivisions=2 + TextureVSubdivisions=2 + LifetimeRange=(Min=0.100000,Max=0.100000) + End Object + Emitters(0)=SpriteEmitter'NicePack.NiceJudgePistolFlash.SpriteEmitter0' + + Begin Object Class=SpriteEmitter Name=SpriteEmitter1 + RespawnDeadParticles=False + UniformSize=True + AutomaticInitialSpawning=False + Opacity=0.100000 + MaxParticles=1 + StartSizeRange=(X=(Min=50.000000,Max=50.000000)) + DrawStyle=PTDS_Brighten + Texture=Texture'Effects_Tex.Smoke.MuzzleCorona1stP' + LifetimeRange=(Min=0.100000,Max=0.100000) + End Object + Emitters(1)=SpriteEmitter'NicePack.NiceJudgePistolFlash.SpriteEmitter1' +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolPickup.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolPickup.uc index 61625b8..de9fc2c 100644 --- a/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolPickup.uc +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgePistolPickup.uc @@ -1,4 +1,20 @@ -class NiceJudgePistolPickup extends NiceSinglePickup; -defaultproperties -{ Weight=4.000000 cost=2500 AmmoCost=15 BuyClipSize=5 PowerValue=65 SpeedValue=35 RangeValue=60 Description="50 Cal AE handgun. A powerful personal choice for personal defense." ItemName="Raging Judge" ItemShortName="Raging Judge" AmmoItemName=".300 JHP Ammo" VariantClasses(0)=Class'NicePack.SkinGoldenJudgePistolPickup' InventoryType=Class'NicePack.NiceJudgePistol' PickupMessage="You got the Taurus Raging Judge." PickupSound=Sound'KF_RevolverSnd.foley.WEP_Revolver_Foley_Pickup' StaticMesh=StaticMesh'NicePackSM.judge.judge_pickup' -} +class NiceJudgePistolPickup extends NiceSinglePickup; +defaultproperties +{ + Weight=4.000000 + cost=2500 + AmmoCost=15 + BuyClipSize=5 + PowerValue=65 + SpeedValue=35 + RangeValue=60 + Description="50 Cal AE handgun. A powerful personal choice for personal defense." + ItemName="Raging Judge" + ItemShortName="Raging Judge" + AmmoItemName=".300 JHP Ammo" + VariantClasses(0)=Class'NicePack.SkinGoldenJudgePistolPickup' + InventoryType=Class'NicePack.NiceJudgePistol' + PickupMessage="You got the Taurus Raging Judge." + PickupSound=Sound'KF_RevolverSnd.foley.WEP_Revolver_Foley_Pickup' + StaticMesh=StaticMesh'NicePackSM.judge.judge_pickup' +} diff --git a/sources/Weapons/Playable/Pistols/Judge/NiceJudgeTracer.uc b/sources/Weapons/Playable/Pistols/Judge/NiceJudgeTracer.uc index 808eda6..2356783 100644 --- a/sources/Weapons/Playable/Pistols/Judge/NiceJudgeTracer.uc +++ b/sources/Weapons/Playable/Pistols/Judge/NiceJudgeTracer.uc @@ -1,4 +1,23 @@ -class NiceJudgeTracer extends pclSmoke; -defaultproperties -{ mParticleType=PT_Stream mStartParticles=0 mMaxParticles=40 mLifeRange(0)=0.050000 mLifeRange(1)=0.050000 mRegenRange(0)=60.000000 mRegenRange(1)=60.000000 mSpawnVecB=(X=20.000000,Z=0.000000) mSizeRange(0)=2.000000 mSizeRange(1)=2.000000 mGrowthRate=-0.500000 mColorRange(0)=(B=82,G=231,R=252,A=60) mColorRange(1)=(B=82,G=231,R=252,A=60) mNumTileColumns=1 mNumTileRows=1 Physics=PHYS_Trailer LifeSpan=1.300000 Skins(0)=Texture'KFX.TransTrailT' Style=STY_Additive -} +class NiceJudgeTracer extends pclSmoke; +defaultproperties +{ + mParticleType=PT_Stream + mStartParticles=0 + mMaxParticles=40 + mLifeRange(0)=0.050000 + mLifeRange(1)=0.050000 + mRegenRange(0)=60.000000 + mRegenRange(1)=60.000000 + mSpawnVecB=(X=20.000000,Z=0.000000) + mSizeRange(0)=2.000000 + mSizeRange(1)=2.000000 + mGrowthRate=-0.500000 + mColorRange(0)=(B=82,G=231,R=252,A=60) + mColorRange(1)=(B=82,G=231,R=252,A=60) + mNumTileColumns=1 + mNumTileRows=1 + Physics=PHYS_Trailer + LifeSpan=1.300000 + Skins(0)=Texture'KFX.TransTrailT' + Style=STY_Additive +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Ammo.uc b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Ammo.uc index 505c3ac..d9cba87 100644 --- a/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Ammo.uc +++ b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Ammo.uc @@ -1,4 +1,11 @@ -class NiceDualMK23Ammo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceDualMK23Pickup' AmmoPickupAmount=12 MaxAmmo=144 PickupClass=Class'NicePack.NiceDualMK23AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="MK23 bullets" -} +class NiceDualMK23Ammo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceDualMK23Pickup' + AmmoPickupAmount=12 + MaxAmmo=144 + PickupClass=Class'NicePack.NiceDualMK23AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=338,Y1=40,X2=393,Y2=79) + ItemName="MK23 bullets" +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23AmmoPickup.uc b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23AmmoPickup.uc index 44f29a2..eb1281a 100644 --- a/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23AmmoPickup.uc +++ b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23AmmoPickup.uc @@ -1,4 +1,9 @@ -class NiceDualMK23AmmoPickup extends NiceAmmoPickup; -defaultproperties -{ KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' AmmoAmount=12 InventoryType=Class'NicePack.NiceDualMK23Ammo' PickupMessage="Rounds (.45 ACP)" StaticMesh=None -} +class NiceDualMK23AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' + AmmoAmount=12 + InventoryType=Class'NicePack.NiceDualMK23Ammo' + PickupMessage="Rounds (.45 ACP)" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Attachment.uc b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Attachment.uc index fcafe21..5d0b8ee 100644 --- a/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Attachment.uc +++ b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Attachment.uc @@ -1,4 +1,6 @@ -class NiceDualMK23Attachment extends NiceDualiesAttachment; -defaultproperties -{ BrotherMesh=SkeletalMesh'KF_Weapons3rd4_Trip.MK23_3rd' MeshRef="KF_Weapons3rd4_Trip.MK23_3rd" -} +class NiceDualMK23Attachment extends NiceDualiesAttachment; +defaultproperties +{ + BrotherMesh=SkeletalMesh'KF_Weapons3rd4_Trip.MK23_3rd' + MeshRef="KF_Weapons3rd4_Trip.MK23_3rd" +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Pickup.uc b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Pickup.uc index ee8ddf7..375bfd2 100644 --- a/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Pickup.uc +++ b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Pickup.uc @@ -1,4 +1,19 @@ -class NiceDualMK23Pickup extends NiceDualiesPickup; -defaultproperties -{ Weight=4.000000 cost=500 AmmoCost=32 BuyClipSize=12 PowerValue=70 SpeedValue=45 RangeValue=60 Description="Dual MK23 match grade pistols. Dual 45's is double the fun." ItemName="DualMK23" ItemShortName="DualMK23" AmmoItemName=".45 ACP Ammo" InventoryType=Class'NicePack.NiceDualMK23Pistol' PickupMessage="You found another - MK23" PickupSound=Sound'KF_MK23Snd.MK23_Pickup' StaticMesh=StaticMesh'KF_pickups4_Trip.Pistols.MK23_Pickup' -} +class NiceDualMK23Pickup extends NiceDualiesPickup; +defaultproperties +{ + Weight=4.000000 + cost=500 + AmmoCost=32 + BuyClipSize=12 + PowerValue=70 + SpeedValue=45 + RangeValue=60 + Description="Dual MK23 match grade pistols. Dual 45's is double the fun." + ItemName="DualMK23" + ItemShortName="DualMK23" + AmmoItemName=".45 ACP Ammo" + InventoryType=Class'NicePack.NiceDualMK23Pistol' + PickupMessage="You found another - MK23" + PickupSound=Sound'KF_MK23Snd.MK23_Pickup' + StaticMesh=StaticMesh'KF_pickups4_Trip.Pistols.MK23_Pickup' +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Pistol.uc b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Pistol.uc index e04970c..cb9dc39 100644 --- a/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Pistol.uc +++ b/sources/Weapons/Playable/Pistols/MK32/NiceDualMK23Pistol.uc @@ -1,14 +1,54 @@ -class NiceDualMK23Pistol extends NiceDualies; -simulated function SecondDoToggle(){ - ToggleLaser(); -} -simulated function ToggleLaser(){ - if(!Instigator.IsLocallyControlled()) return; - // Will redo this bit later, but so far it'll have to do - if(LaserType == 0) LaserType = 2; - else LaserType = 0; - ApplyLaserState(); -} -defaultproperties -{ SingleClass=Class'NicePack.NiceMK23Pistol' leftEject=0.079000 rightEject=0.086000 leftInsert=0.329000 rightInsert=0.650000 bUseFlashlightToToggle=True bAllowFreeDot=True LaserAttachmentRotation=(Yaw=16384) altLaserAttachmentRotation=(Yaw=16384) LaserAttachmentBone="Tip_Right" altLaserAttachmentBone="Tip_Left" MagCapacity=24 ReloadRate=4.466700 Weight=4.000000 StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Dual_MK23' bIsTier2Weapon=True MeshRef="KF_Wep_Dual_MK23.Dual_MK23" SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.MK23_SHDR" SelectSoundRef="KF_MK23Snd.MK23_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.Dual_MK23_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Dual_MK23" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceDualMK23Fire' AIRating=0.450000 CurrentRating=0.450000 Description="Dual MK23 match grade pistols. Dual 45's is double the fun." DisplayFOV=60.000000 Priority=90 GroupOffset=10 PickupClass=Class'NicePack.NiceDualMK23Pickup' PlayerViewOffset=(X=25.000000) BobDamping=3.800000 AttachmentClass=Class'NicePack.NiceDualMK23Attachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="Dual MK23s" DrawScale=1.000000 -} +class NiceDualMK23Pistol extends NiceDualies; +simulated function SecondDoToggle(){ + ToggleLaser(); +} +simulated function ToggleLaser(){ + if(!Instigator.IsLocallyControlled()) + return; + // Will redo this bit later, but so far it'll have to do + if(LaserType == 0) + LaserType = 2; + else + LaserType = 0; + ApplyLaserState(); +} +defaultproperties +{ + SingleClass=Class'NicePack.NiceMK23Pistol' + leftEject=0.079000 + rightEject=0.086000 + leftInsert=0.329000 + rightInsert=0.650000 + bUseFlashlightToToggle=True + bAllowFreeDot=True + LaserAttachmentRotation=(Yaw=16384) + altLaserAttachmentRotation=(Yaw=16384) + LaserAttachmentBone="Tip_Right" + altLaserAttachmentBone="Tip_Left" + MagCapacity=24 + ReloadRate=4.466700 + Weight=4.000000 + StandardDisplayFOV=60.000000 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Dual_MK23' + bIsTier2Weapon=True + MeshRef="KF_Wep_Dual_MK23.Dual_MK23" + SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.MK23_SHDR" + SelectSoundRef="KF_MK23Snd.MK23_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.Dual_MK23_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Dual_MK23" + ZoomedDisplayFOV=50.000000 + FireModeClass(0)=Class'NicePack.NiceDualMK23Fire' + AIRating=0.450000 + CurrentRating=0.450000 + Description="Dual MK23 match grade pistols. Dual 45's is double the fun." + DisplayFOV=60.000000 + Priority=90 + GroupOffset=10 + PickupClass=Class'NicePack.NiceDualMK23Pickup' + PlayerViewOffset=(X=25.000000) + BobDamping=3.800000 + AttachmentClass=Class'NicePack.NiceDualMK23Attachment' + IconCoords=(X1=250,Y1=110,X2=330,Y2=145) + ItemName="Dual MK23s" + DrawScale=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceMK23Ammo.uc b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Ammo.uc index d427a1f..b530572 100644 --- a/sources/Weapons/Playable/Pistols/MK32/NiceMK23Ammo.uc +++ b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Ammo.uc @@ -1,4 +1,12 @@ -class NiceMK23Ammo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceMK23Pickup' AmmoPickupAmount=12 MaxAmmo=144 InitialAmount=36 PickupClass=Class'NicePack.NiceMK23AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="MK23 bullets" -} +class NiceMK23Ammo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceMK23Pickup' + AmmoPickupAmount=12 + MaxAmmo=144 + InitialAmount=36 + PickupClass=Class'NicePack.NiceMK23AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=338,Y1=40,X2=393,Y2=79) + ItemName="MK23 bullets" +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceMK23AmmoPickup.uc b/sources/Weapons/Playable/Pistols/MK32/NiceMK23AmmoPickup.uc index 73956a4..409c967 100644 --- a/sources/Weapons/Playable/Pistols/MK32/NiceMK23AmmoPickup.uc +++ b/sources/Weapons/Playable/Pistols/MK32/NiceMK23AmmoPickup.uc @@ -1,4 +1,9 @@ -class NiceMK23AmmoPickup extends NiceAmmoPickup; -defaultproperties -{ KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' AmmoAmount=12 InventoryType=Class'NicePack.NiceMK23Ammo' PickupMessage="Rounds (.45 ACP)" StaticMesh=None -} +class NiceMK23AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + KFPickupImage=Texture'KillingFloorHUD.ClassMenu.Deagle' + AmmoAmount=12 + InventoryType=Class'NicePack.NiceMK23Ammo' + PickupMessage="Rounds (.45 ACP)" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceMK23Attachment.uc b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Attachment.uc index 8db3689..38e8c03 100644 --- a/sources/Weapons/Playable/Pistols/MK32/NiceMK23Attachment.uc +++ b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Attachment.uc @@ -1,4 +1,5 @@ -class NiceMK23Attachment extends NiceSingleAttachment; -defaultproperties -{ MeshRef="KF_Weapons3rd4_Trip.MK23_3rd" -} +class NiceMK23Attachment extends NiceSingleAttachment; +defaultproperties +{ + MeshRef="KF_Weapons3rd4_Trip.MK23_3rd" +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceMK23Pickup.uc b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Pickup.uc index efabe2d..0caf1c5 100644 --- a/sources/Weapons/Playable/Pistols/MK32/NiceMK23Pickup.uc +++ b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Pickup.uc @@ -1,4 +1,20 @@ -class NiceMK23Pickup extends NiceSinglePickup; -defaultproperties -{ Weight=2.000000 cost=250 AmmoCost=16 BuyClipSize=12 PowerValue=50 SpeedValue=45 RangeValue=60 Description="Match grade 45 caliber pistol. Good balance between power, ammo count and rate of fire." ItemName="MK23" ItemShortName="MK23" AmmoItemName=".45 ACP Ammo" AmmoMesh=None InventoryType=Class'NicePack.NiceMK23Pistol' PickupMessage="You got the MK.23" PickupSound=Sound'KF_MK23Snd.MK23_Pickup' StaticMesh=StaticMesh'KF_pickups4_Trip.Pistols.MK23_Pickup' -} +class NiceMK23Pickup extends NiceSinglePickup; +defaultproperties +{ + Weight=2.000000 + cost=250 + AmmoCost=16 + BuyClipSize=12 + PowerValue=50 + SpeedValue=45 + RangeValue=60 + Description="Match grade 45 caliber pistol. Good balance between power, ammo count and rate of fire." + ItemName="MK23" + ItemShortName="MK23" + AmmoItemName=".45 ACP Ammo" + AmmoMesh=None + InventoryType=Class'NicePack.NiceMK23Pistol' + PickupMessage="You got the MK.23" + PickupSound=Sound'KF_MK23Snd.MK23_Pickup' + StaticMesh=StaticMesh'KF_pickups4_Trip.Pistols.MK23_Pickup' +} diff --git a/sources/Weapons/Playable/Pistols/MK32/NiceMK23Pistol.uc b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Pistol.uc index 82f629b..e67bf8e 100644 --- a/sources/Weapons/Playable/Pistols/MK32/NiceMK23Pistol.uc +++ b/sources/Weapons/Playable/Pistols/MK32/NiceMK23Pistol.uc @@ -1,18 +1,60 @@ -class NiceMK23Pistol extends NiceSingle; -simulated function AltFire(float F){ - if(bIsDual) super.AltFire(F); - else ToggleLaser(); -} -simulated function SecondDoToggle(){ - ToggleLaser(); -} -simulated function ToggleLaser(){ - if(!Instigator.IsLocallyControlled()) return; - // Will redo this bit later, but so far it'll have to do - if(LaserType == 0) LaserType = 2; - else LaserType = 0; - ApplyLaserState(); -} -defaultproperties -{ DualClass=Class'NicePack.NiceDualMK23Pistol' bUseFlashlightToToggle=True LaserAttachmentRotation=(Yaw=16384) LaserAttachmentBone="tip" reloadPreEndFrame=0.156000 reloadEndFrame=0.636000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.286000 reloadChargeStartFrame=-1.000000 MagCapacity=12 ReloadRate=2.600000 Weight=2.000000 StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_MK23' bIsTier2Weapon=True MeshRef="KF_Wep_MK23.MK23" SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.MK23_SHDR" SelectSoundRef="KF_MK23Snd.MK23_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.MK23_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.MK23" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceMK23Fire' AIRating=0.450000 CurrentRating=0.450000 Description="Match grade 45 caliber pistol. Good balance between power, ammo count and rate of fire." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=65 GroupOffset=9 PickupClass=Class'NicePack.NiceMK23Pickup' PlayerViewOffset=(X=10.000000,Y=18.750000,Z=-7.000000) BobDamping=4.500000 AttachmentClass=Class'NicePack.NiceMK23Attachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="MK23" bUseDynamicLights=True TransientSoundVolume=1.000000 -} +class NiceMK23Pistol extends NiceSingle; +simulated function AltFire(float F){ + if(bIsDual) + super.AltFire(F); + else + ToggleLaser(); +} +simulated function SecondDoToggle(){ + ToggleLaser(); +} +simulated function ToggleLaser(){ + if(!Instigator.IsLocallyControlled()) + return; + // Will redo this bit later, but so far it'll have to do + if(LaserType == 0) + LaserType = 2; + else + LaserType = 0; + ApplyLaserState(); +} +defaultproperties +{ + DualClass=Class'NicePack.NiceDualMK23Pistol' + bUseFlashlightToToggle=True + LaserAttachmentRotation=(Yaw=16384) + LaserAttachmentBone="tip" + reloadPreEndFrame=0.156000 + reloadEndFrame=0.636000 + reloadChargeEndFrame=-1.000000 + reloadMagStartFrame=0.286000 + reloadChargeStartFrame=-1.000000 + MagCapacity=12 + ReloadRate=2.600000 + Weight=2.000000 + StandardDisplayFOV=60.000000 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_MK23' + bIsTier2Weapon=True + MeshRef="KF_Wep_MK23.MK23" + SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.MK23_SHDR" + SelectSoundRef="KF_MK23Snd.MK23_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.MK23_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.MK23" + ZoomedDisplayFOV=50.000000 + FireModeClass(0)=Class'NicePack.NiceMK23Fire' + AIRating=0.450000 + CurrentRating=0.450000 + Description="Match grade 45 caliber pistol. Good balance between power, ammo count and rate of fire." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=60.000000 + Priority=65 + GroupOffset=9 + PickupClass=Class'NicePack.NiceMK23Pickup' + PlayerViewOffset=(X=10.000000,Y=18.750000,Z=-7.000000) + BobDamping=4.500000 + AttachmentClass=Class'NicePack.NiceMK23Attachment' + IconCoords=(X1=250,Y1=110,X2=330,Y2=145) + ItemName="MK23" + bUseDynamicLights=True + TransientSoundVolume=1.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAmmo.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAmmo.uc index 47ecac1..b956cf5 100644 --- a/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAmmo.uc +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAmmo.uc @@ -1,4 +1,11 @@ -class NiceDualMagnumAmmo extends NiceAmmo; -defaultproperties -{ AmmoPickupAmount=12 MaxAmmo=120 InitialAmount=30 PickupClass=Class'NicePack.NiceDualMagnumAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="44 Magnum bullets" -} +class NiceDualMagnumAmmo extends NiceAmmo; +defaultproperties +{ + AmmoPickupAmount=12 + MaxAmmo=120 + InitialAmount=30 + PickupClass=Class'NicePack.NiceDualMagnumAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=338,Y1=40,X2=393,Y2=79) + ItemName="44 Magnum bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAmmoPickup.uc index 011ddd7..f2f543f 100644 --- a/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAmmoPickup.uc +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceDualMagnumAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=12 InventoryType=Class'NicePack.NiceDualMagnumAmmo' PickupMessage="Rounds (44 Mag)" StaticMesh=None -} +class NiceDualMagnumAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=12 + InventoryType=Class'NicePack.NiceDualMagnumAmmo' + PickupMessage="Rounds (44 Mag)" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAttachment.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAttachment.uc index b8a5dac..5083f2f 100644 --- a/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAttachment.uc +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumAttachment.uc @@ -1,4 +1,11 @@ -class NiceDualMagnumAttachment extends NiceDualiesAttachment; -defaultproperties -{ BrotherMesh=SkeletalMesh'KF_Weapons3rd3_Trip.revolver_3rd' mTracerClass=Class'KFMod.KFLargeTracer' mShellCaseEmitterClass=None MeshRef="KF_Weapons3rd3_Trip.revolver_3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceDualMagnumAttachment extends NiceDualiesAttachment; +defaultproperties +{ + BrotherMesh=SkeletalMesh'KF_Weapons3rd3_Trip.revolver_3rd' + mTracerClass=Class'KFMod.KFLargeTracer' + mShellCaseEmitterClass=None + MeshRef="KF_Weapons3rd3_Trip.revolver_3rd" + bHeavy=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumFire.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumFire.uc index 549193a..304a9f7 100644 --- a/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumFire.uc +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumFire.uc @@ -1,4 +1,25 @@ -class NiceDualMagnumFire extends NiceDualiesFire; -defaultproperties -{ ProjectileSpeed=22500.000000 maxVerticalRecoilAngle=300 maxHorizontalRecoilAngle=150 ShellEjectClass=None FireSoundRef="KF_RevolverSnd.Revolver_Fire_M" StereoFireSoundRef="KF_RevolverSnd.Revolver_Fire_S" NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" DamageType=Class'NicePack.NiceDamTypeMagnumPistol' DamageMin=61 DamageMax=61 Momentum=15000.000000 bWaitForRelease=False FireRate=0.125000 AmmoClass=Class'NicePack.NiceDualMagnumAmmo' ShakeRotMag=(Z=400.000000) ShakeRotRate=(X=12500.000000,Y=12500.000000) ShakeRotTime=3.500000 ShakeOffsetMag=(Y=1.000000,Z=8.000000) ShakeOffsetTime=2.500000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' aimerror=40.000000 -} +class NiceDualMagnumFire extends NiceDualiesFire; +defaultproperties +{ + ProjectileSpeed=22500.000000 + maxVerticalRecoilAngle=300 + maxHorizontalRecoilAngle=150 + ShellEjectClass=None + FireSoundRef="KF_RevolverSnd.Revolver_Fire_M" + StereoFireSoundRef="KF_RevolverSnd.Revolver_Fire_S" + NoAmmoSoundRef="KF_HandcannonSnd.50AE_DryFire" + DamageType=Class'NicePack.NiceDamTypeMagnumPistol' + DamageMin=61 + DamageMax=61 + Momentum=15000.000000 + bWaitForRelease=False + FireRate=0.125000 + AmmoClass=Class'NicePack.NiceDualMagnumAmmo' + ShakeRotMag=(Z=400.000000) + ShakeRotRate=(X=12500.000000,Y=12500.000000) + ShakeRotTime=3.500000 + ShakeOffsetMag=(Y=1.000000,Z=8.000000) + ShakeOffsetTime=2.500000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' + aimerror=40.000000 +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumPickup.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumPickup.uc index f3f0e40..7701cf1 100644 --- a/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumPickup.uc +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceDualMagnumPickup.uc @@ -1,4 +1,20 @@ -class NiceDualMagnumPickup extends NiceDualiesPickup; -defaultproperties -{ Weight=2.000000 cost=250 AmmoCost=16 BuyClipSize=6 PowerValue=80 SpeedValue=50 RangeValue=65 Description="A pair of 44 Magnum Pistols. Make my day!" ItemName="Dual 44 Magnums" ItemShortName="Dual 44s" AmmoItemName="44 Magnum Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.DeagleAmmo' InventoryType=Class'KFMod.Dual44Magnum' PickupMessage="You found another 44 Magnum" PickupSound=Sound'KF_RevolverSnd.foley.WEP_Revolver_Foley_Pickup' StaticMesh=StaticMesh'KF_pickups3_Trip.Pistols.revolver_Pickup' -} +class NiceDualMagnumPickup extends NiceDualiesPickup; +defaultproperties +{ + Weight=2.000000 + cost=250 + AmmoCost=16 + BuyClipSize=6 + PowerValue=80 + SpeedValue=50 + RangeValue=65 + Description="A pair of 44 Magnum Pistols. Make my day!" + ItemName="Dual 44 Magnums" + ItemShortName="Dual 44s" + AmmoItemName="44 Magnum Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.DeagleAmmo' + InventoryType=Class'KFMod.Dual44Magnum' + PickupMessage="You found another 44 Magnum" + PickupSound=Sound'KF_RevolverSnd.foley.WEP_Revolver_Foley_Pickup' + StaticMesh=StaticMesh'KF_pickups3_Trip.Pistols.revolver_Pickup' +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAmmo.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAmmo.uc index fc30320..e546489 100644 --- a/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAmmo.uc +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAmmo.uc @@ -1,4 +1,11 @@ -class NiceMagnumAmmo extends NiceAmmo; -defaultproperties -{ AmmoPickupAmount=6 MaxAmmo=120 InitialAmount=30 PickupClass=Class'NicePack.NiceMagnumAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="44 Magnum bullets" -} +class NiceMagnumAmmo extends NiceAmmo; +defaultproperties +{ + AmmoPickupAmount=6 + MaxAmmo=120 + InitialAmount=30 + PickupClass=Class'NicePack.NiceMagnumAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=338,Y1=40,X2=393,Y2=79) + ItemName="44 Magnum bullets" +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAmmoPickup.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAmmoPickup.uc index 70a2743..4661f59 100644 --- a/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAmmoPickup.uc +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceMagnumAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=6 InventoryType=Class'NicePack.NiceMagnumAmmo' PickupMessage="Rounds (44 Mag)" StaticMesh=None -} +class NiceMagnumAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=6 + InventoryType=Class'NicePack.NiceMagnumAmmo' + PickupMessage="Rounds (44 Mag)" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAttachment.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAttachment.uc index bfb1d2d..536cd90 100644 --- a/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAttachment.uc +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumAttachment.uc @@ -1,4 +1,7 @@ -class NiceMagnumAttachment extends NiceSingleAttachment; -defaultproperties -{ mTracerClass=Class'KFMod.KFLargeTracer' MeshRef="KF_Weapons3rd3_Trip.revolver_3rd" bHeavy=True -} +class NiceMagnumAttachment extends NiceSingleAttachment; +defaultproperties +{ + mTracerClass=Class'KFMod.KFLargeTracer' + MeshRef="KF_Weapons3rd3_Trip.revolver_3rd" + bHeavy=True +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumPickup.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumPickup.uc index a58b3a3..7c8c4c7 100644 --- a/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumPickup.uc +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumPickup.uc @@ -1,4 +1,20 @@ -class NiceMagnumPickup extends NiceSinglePickup; -defaultproperties -{ Weight=1.000000 cost=125 AmmoCost=8 BuyClipSize=6 PowerValue=60 SpeedValue=40 RangeValue=65 Description="44 Magnum pistol, the most 'powerful' handgun in the world. Do you feel lucky?" ItemName="44 Magnum" ItemShortName="44 Magnum" AmmoItemName="44 Magnum Ammo" AmmoMesh=None InventoryType=Class'NicePack.NiceMagnumPistol' PickupMessage="You got the 44 Magnum" PickupSound=Sound'KF_RevolverSnd.foley.WEP_Revolver_Foley_Pickup' StaticMesh=StaticMesh'KF_pickups3_Trip.Pistols.revolver_Pickup' -} +class NiceMagnumPickup extends NiceSinglePickup; +defaultproperties +{ + Weight=1.000000 + cost=125 + AmmoCost=8 + BuyClipSize=6 + PowerValue=60 + SpeedValue=40 + RangeValue=65 + Description="44 Magnum pistol, the most 'powerful' handgun in the world. Do you feel lucky?" + ItemName="44 Magnum" + ItemShortName="44 Magnum" + AmmoItemName="44 Magnum Ammo" + AmmoMesh=None + InventoryType=Class'NicePack.NiceMagnumPistol' + PickupMessage="You got the 44 Magnum" + PickupSound=Sound'KF_RevolverSnd.foley.WEP_Revolver_Foley_Pickup' + StaticMesh=StaticMesh'KF_pickups3_Trip.Pistols.revolver_Pickup' +} diff --git a/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumPistol.uc b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumPistol.uc index bbf6421..472f26d 100644 --- a/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumPistol.uc +++ b/sources/Weapons/Playable/Pistols/Magnum/NiceMagnumPistol.uc @@ -1,4 +1,39 @@ -class NiceMagnumPistol extends NiceSingle; -defaultproperties -{ DualClass=Class'NicePack.NiceDualMagnum' reloadPreEndFrame=0.220000 reloadEndFrame=0.750000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.380000 reloadChargeStartFrame=-1.000000 MagCapacity=6 ReloadRate=1.2625 ReloadAnimRate=2 WeaponReloadAnim="Reload_Revolver" Weight=1.000000 StandardDisplayFOV=60.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Revolver' bIsTier2Weapon=True MeshRef="KF_Wep_Revolver.Revolver_Trip" SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.Revolver_cmb" SelectSoundRef="KF_RevolverSnd.WEP_Revolver_Foley_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.Revolver_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Revolver" ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceMagnumFire' AIRating=0.450000 CurrentRating=0.450000 Description="44 Magnum pistol, the most 'powerful' handgun in the world. Do you feel lucky?" EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=60.000000 Priority=105 GroupOffset=7 PickupClass=Class'NicePack.NiceMagnumPickup' PlayerViewOffset=(X=12.000000,Y=15.000000,Z=-7.000000) AttachmentClass=Class'NicePack.NiceMagnumAttachment' IconCoords=(X1=250,Y1=110,X2=330,Y2=145) ItemName="44 Magnum" bUseDynamicLights=True TransientSoundVolume=1.000000 -} +class NiceMagnumPistol extends NiceSingle; +defaultproperties +{ + DualClass=Class'NicePack.NiceDualMagnum' + reloadPreEndFrame=0.220000 + reloadEndFrame=0.750000 + reloadChargeEndFrame=-1.000000 + reloadMagStartFrame=0.380000 + reloadChargeStartFrame=-1.000000 + MagCapacity=6 + ReloadRate=1.2625 + ReloadAnimRate=2 + WeaponReloadAnim="Reload_Revolver" + Weight=1.000000 + StandardDisplayFOV=60.000000 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Revolver' + bIsTier2Weapon=True + MeshRef="KF_Wep_Revolver.Revolver_Trip" + SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.Revolver_cmb" + SelectSoundRef="KF_RevolverSnd.WEP_Revolver_Foley_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.Revolver_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Revolver" + ZoomedDisplayFOV=50.000000 + FireModeClass(0)=Class'NicePack.NiceMagnumFire' + AIRating=0.450000 + CurrentRating=0.450000 + Description="44 Magnum pistol, the most 'powerful' handgun in the world. Do you feel lucky?" + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=60.000000 + Priority=105 + GroupOffset=7 + PickupClass=Class'NicePack.NiceMagnumPickup' + PlayerViewOffset=(X=12.000000,Y=15.000000,Z=-7.000000) + AttachmentClass=Class'NicePack.NiceMagnumAttachment' + IconCoords=(X1=250,Y1=110,X2=330,Y2=145) + ItemName="44 Magnum" + bUseDynamicLights=True + TransientSoundVolume=1.000000 +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceDamTypeKrissM.uc b/sources/Weapons/Playable/SMG/Kriss/NiceDamTypeKrissM.uc index 8e2eeda..120d92d 100644 --- a/sources/Weapons/Playable/SMG/Kriss/NiceDamTypeKrissM.uc +++ b/sources/Weapons/Playable/SMG/Kriss/NiceDamTypeKrissM.uc @@ -1,5 +1,6 @@ -class NiceDamTypeKrissM extends NiceDamTypeMedicBullet - abstract; -defaultproperties -{ WeaponClass=Class'NicePack.NiceKrissMMedicGun' -} +class NiceDamTypeKrissM extends NiceDamTypeMedicBullet + abstract; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceKrissMMedicGun' +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceDamTypeKrissMDart.uc b/sources/Weapons/Playable/SMG/Kriss/NiceDamTypeKrissMDart.uc index 19bc6d0..bbb07b8 100644 --- a/sources/Weapons/Playable/SMG/Kriss/NiceDamTypeKrissMDart.uc +++ b/sources/Weapons/Playable/SMG/Kriss/NiceDamTypeKrissMDart.uc @@ -1,5 +1,7 @@ -class NiceDamTypeKrissMDart extends NiceDamTypeMedicDart - abstract; -defaultproperties -{ HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceKrissMMedicGun' -} +class NiceDamTypeKrissMDart extends NiceDamTypeMedicDart + abstract; +defaultproperties +{ + HeadShotDamageMult=2.000000 + WeaponClass=Class'NicePack.NiceKrissMMedicGun' +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAltFire.uc b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAltFire.uc index 7e54892..71e2d04 100644 --- a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAltFire.uc +++ b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAltFire.uc @@ -1,4 +1,6 @@ -class NiceKrissMAltFire extends NiceMedicDartFire; -defaultproperties -{ DamageType=Class'NicePack.NiceDamTypeKrissMDart' AmmoPerFire=75 -} +class NiceKrissMAltFire extends NiceMedicDartFire; +defaultproperties +{ + DamageType=Class'NicePack.NiceDamTypeKrissMDart' + AmmoPerFire=75 +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAmmo.uc b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAmmo.uc index 5640f8f..35344d5 100644 --- a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAmmo.uc +++ b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAmmo.uc @@ -1,4 +1,11 @@ -class NiceKrissMAmmo extends NiceAmmo; -defaultproperties -{ AmmoPickupAmount=33 MaxAmmo=528 InitialAmount=132 PickupClass=Class'NicePack.NiceKrissMAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="45. ACP bullets" -} +class NiceKrissMAmmo extends NiceAmmo; +defaultproperties +{ + AmmoPickupAmount=33 + MaxAmmo=528 + InitialAmount=132 + PickupClass=Class'NicePack.NiceKrissMAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="45. ACP bullets" +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAmmoPickup.uc b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAmmoPickup.uc index 173686a..67bc496 100644 --- a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAmmoPickup.uc +++ b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceKrissMAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=33 InventoryType=Class'NicePack.NiceKrissMAmmo' PickupMessage="Rounds 45. ACP" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceKrissMAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=33 + InventoryType=Class'NicePack.NiceKrissMAmmo' + PickupMessage="Rounds 45. ACP" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAttachment.uc b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAttachment.uc index d50f498..2ba377c 100644 --- a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAttachment.uc +++ b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMAttachment.uc @@ -1,4 +1,57 @@ -class NiceKrissMAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_Kriss" MovementAnims(1)="JogB_Kriss" MovementAnims(2)="JogL_Kriss" MovementAnims(3)="JogR_Kriss" TurnLeftAnim="TurnL_Kriss" TurnRightAnim="TurnR_Kriss" CrouchAnims(0)="CHWalkF_Kriss" CrouchAnims(1)="CHWalkB_Kriss" CrouchAnims(2)="CHWalkL_Kriss" CrouchAnims(3)="CHWalkR_Kriss" WalkAnims(0)="WalkF_Kriss" WalkAnims(1)="WalkB_Kriss" WalkAnims(2)="WalkL_Kriss" WalkAnims(3)="WalkR_Kriss" CrouchTurnRightAnim="CH_TurnR_Kriss" CrouchTurnLeftAnim="CH_TurnL_Kriss" IdleCrouchAnim="CHIdle_Kriss" IdleWeaponAnim="Idle_Kriss" IdleRestAnim="Idle_Kriss" IdleChatAnim="Idle_Kriss" IdleHeavyAnim="Idle_Kriss" IdleRifleAnim="Idle_Kriss" FireAnims(0)="Fire_Kriss" FireAnims(1)="Fire_Kriss" FireAnims(2)="Fire_Kriss" FireAnims(3)="Fire_Kriss" FireAltAnims(0)="Fire_Kriss" FireAltAnims(1)="Fire_Kriss" FireAltAnims(2)="Fire_Kriss" FireAltAnims(3)="Fire_Kriss" FireCrouchAnims(0)="CHFire_Kriss" FireCrouchAnims(1)="CHFire_Kriss" FireCrouchAnims(2)="CHFire_Kriss" FireCrouchAnims(3)="CHFire_Kriss" FireCrouchAltAnims(0)="CHFire_Kriss" FireCrouchAltAnims(1)="CHFire_Kriss" FireCrouchAltAnims(2)="CHFire_Kriss" FireCrouchAltAnims(3)="CHFire_Kriss" HitAnims(0)="HitF_Kriss" HitAnims(1)="HitB_Kriss" HitAnims(2)="HitL_Kriss" HitAnims(3)="HitR_Kriss" PostFireBlendStandAnim="Blend_Kriss" PostFireBlendCrouchAnim="CHBlend_Kriss" MeshRef="KF_Weapons3rd6_Trip.Kriss_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceKrissMAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + MovementAnims(0)="JogF_Kriss" + MovementAnims(1)="JogB_Kriss" + MovementAnims(2)="JogL_Kriss" + MovementAnims(3)="JogR_Kriss" + TurnLeftAnim="TurnL_Kriss" + TurnRightAnim="TurnR_Kriss" + CrouchAnims(0)="CHWalkF_Kriss" + CrouchAnims(1)="CHWalkB_Kriss" + CrouchAnims(2)="CHWalkL_Kriss" + CrouchAnims(3)="CHWalkR_Kriss" + WalkAnims(0)="WalkF_Kriss" + WalkAnims(1)="WalkB_Kriss" + WalkAnims(2)="WalkL_Kriss" + WalkAnims(3)="WalkR_Kriss" + CrouchTurnRightAnim="CH_TurnR_Kriss" + CrouchTurnLeftAnim="CH_TurnL_Kriss" + IdleCrouchAnim="CHIdle_Kriss" + IdleWeaponAnim="Idle_Kriss" + IdleRestAnim="Idle_Kriss" + IdleChatAnim="Idle_Kriss" + IdleHeavyAnim="Idle_Kriss" + IdleRifleAnim="Idle_Kriss" + FireAnims(0)="Fire_Kriss" + FireAnims(1)="Fire_Kriss" + FireAnims(2)="Fire_Kriss" + FireAnims(3)="Fire_Kriss" + FireAltAnims(0)="Fire_Kriss" + FireAltAnims(1)="Fire_Kriss" + FireAltAnims(2)="Fire_Kriss" + FireAltAnims(3)="Fire_Kriss" + FireCrouchAnims(0)="CHFire_Kriss" + FireCrouchAnims(1)="CHFire_Kriss" + FireCrouchAnims(2)="CHFire_Kriss" + FireCrouchAnims(3)="CHFire_Kriss" + FireCrouchAltAnims(0)="CHFire_Kriss" + FireCrouchAltAnims(1)="CHFire_Kriss" + FireCrouchAltAnims(2)="CHFire_Kriss" + FireCrouchAltAnims(3)="CHFire_Kriss" + HitAnims(0)="HitF_Kriss" + HitAnims(1)="HitB_Kriss" + HitAnims(2)="HitL_Kriss" + HitAnims(3)="HitR_Kriss" + PostFireBlendStandAnim="Blend_Kriss" + PostFireBlendCrouchAnim="CHBlend_Kriss" + MeshRef="KF_Weapons3rd6_Trip.Kriss_3rd" + WeaponAmbientScale=2.000000 + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMFire.uc b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMFire.uc index 5c8a50e..9302994 100644 --- a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMFire.uc +++ b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMFire.uc @@ -1,4 +1,28 @@ -class NiceKrissMFire extends NiceHighROFFire; -defaultproperties -{ FireEndSoundRef="KF_KrissSND.Kriss_Fire_End" FireEndStereoSoundRef="KF_KrissSND.KF_WEP_KRISS_END_S" AmbientFireSoundRef="KF_KrissSND.Kriss_Fire_Loop" ProjectileSpeed=15200.000000 RecoilRate=0.100000 maxVerticalRecoilAngle=20 maxHorizontalRecoilAngle=10 RecoilVelocityScale=0.000000 ShellEjectClass=Class'KFMod.ShellEjectKriss' ShellEjectBoneName="Shell_eject" NoAmmoSoundRef="KF_MP7Snd.MP7_DryFire" DamageType=Class'NicePack.NiceDamTypeKrissM' DamageMin=35 DamageMax=35 Momentum=12500.000000 FireRate=0.040000 AmmoClass=Class'NicePack.NiceKrissMAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) ShakeRotTime=0.750000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' -} +class NiceKrissMFire extends NiceHighROFFire; +defaultproperties +{ + FireEndSoundRef="KF_KrissSND.Kriss_Fire_End" + FireEndStereoSoundRef="KF_KrissSND.KF_WEP_KRISS_END_S" + AmbientFireSoundRef="KF_KrissSND.Kriss_Fire_Loop" + ProjectileSpeed=15200.000000 + RecoilRate=0.100000 + maxVerticalRecoilAngle=20 + maxHorizontalRecoilAngle=10 + RecoilVelocityScale=0.000000 + ShellEjectClass=Class'KFMod.ShellEjectKriss' + ShellEjectBoneName="Shell_eject" + NoAmmoSoundRef="KF_MP7Snd.MP7_DryFire" + DamageType=Class'NicePack.NiceDamTypeKrissM' + DamageMin=35 + DamageMax=35 + Momentum=12500.000000 + FireRate=0.040000 + AmmoClass=Class'NicePack.NiceKrissMAmmo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) + ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000) + ShakeRotTime=0.750000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.250000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMMedicGun.uc b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMMedicGun.uc index 1c5eb7c..bd76e77 100644 --- a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMMedicGun.uc +++ b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMMedicGun.uc @@ -1,4 +1,48 @@ -class NiceKrissMMedicGun extends NiceMedicGun; -defaultproperties -{ medicChargeRegenRate=20.000000 reloadPreEndFrame=0.150000 reloadEndFrame=0.580000 reloadChargeEndFrame=0.780000 reloadMagStartFrame=0.290000 reloadChargeStartFrame=0.680000 MagCapacity=33 ReloadRate=3.330000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_Kriss" Weight=4.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_KRISS' bIsTier3Weapon=True MeshRef="KF_Wep_Kriss.Kriss_Trip" SkinRefs(0)="Kf_Weapons9_Trip_T.Weapons.Medic_Kriss_cmb" SelectSoundRef="KF_KrissSND.KF_WEP_KRISS_Handling_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.KRISS_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.KRISS" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceKrissMFire' FireModeClass(1)=Class'NicePack.NiceKrissMAltFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="The KRISS Vector has a very high rate of fire and is equipped with the attachment for the Horzine medical darts." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=120 InventoryGroup=3 GroupOffset=17 PickupClass=Class'NicePack.NiceKrissMPickup' PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceKrissMAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="KRISS Vector Medic Gun" TransientSoundVolume=1.250000 -} +class NiceKrissMMedicGun extends NiceMedicGun; +defaultproperties +{ + medicChargeRegenRate=20.000000 + reloadPreEndFrame=0.150000 + reloadEndFrame=0.580000 + reloadChargeEndFrame=0.780000 + reloadMagStartFrame=0.290000 + reloadChargeStartFrame=0.680000 + MagCapacity=33 + ReloadRate=3.330000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_Kriss" + Weight=4.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=55.000000 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_KRISS' + bIsTier3Weapon=True + MeshRef="KF_Wep_Kriss.Kriss_Trip" + SkinRefs(0)="Kf_Weapons9_Trip_T.Weapons.Medic_Kriss_cmb" + SelectSoundRef="KF_KrissSND.KF_WEP_KRISS_Handling_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.KRISS_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.KRISS" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=45.000000 + FireModeClass(0)=Class'NicePack.NiceKrissMFire' + FireModeClass(1)=Class'NicePack.NiceKrissMAltFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="The KRISS Vector has a very high rate of fire and is equipped with the attachment for the Horzine medical darts." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=55.000000 + Priority=120 + InventoryGroup=3 + GroupOffset=17 + PickupClass=Class'NicePack.NiceKrissMPickup' + PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-6.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceKrissMAttachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="KRISS Vector Medic Gun" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMPickup.uc b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMPickup.uc index 70358b4..f477b4c 100644 --- a/sources/Weapons/Playable/SMG/Kriss/NiceKrissMPickup.uc +++ b/sources/Weapons/Playable/SMG/Kriss/NiceKrissMPickup.uc @@ -1,4 +1,24 @@ -class NiceKrissMPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=4.000000 cost=750 BuyClipSize=33 PowerValue=50 SpeedValue=90 RangeValue=40 Description="The KRISS Vector has a very high rate of fire and is equipped with the attachment for the Horzine medical darts." ItemName="KRISS Vector Medic Gun" ItemShortName="KRISS Vector" AmmoItemName="45. ACP Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' EquipmentCategoryID=3 VariantClasses(0)=Class'KFMod.NeonKrissMPickup' InventoryType=Class'NicePack.NiceKrissMMedicGun' PickupMessage="You got the KRISS Vector Medic Gun" PickupSound=Sound'KF_KrissSND.Handling.KF_WEP_KRISS_Handling_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups6_Trip.Rifles.Kriss_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceKrissMPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=4.000000 + cost=750 + BuyClipSize=33 + PowerValue=50 + SpeedValue=90 + RangeValue=40 + Description="The KRISS Vector has a very high rate of fire and is equipped with the attachment for the Horzine medical darts." + ItemName="KRISS Vector Medic Gun" + ItemShortName="KRISS Vector" + AmmoItemName="45. ACP Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + EquipmentCategoryID=3 + VariantClasses(0)=Class'KFMod.NeonKrissMPickup' + InventoryType=Class'NicePack.NiceKrissMMedicGun' + PickupMessage="You got the KRISS Vector Medic Gun" + PickupSound=Sound'KF_KrissSND.Handling.KF_WEP_KRISS_Handling_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups6_Trip.Rifles.Kriss_Pickup' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceDamTypeM7A3M.uc b/sources/Weapons/Playable/SMG/M7A3/NiceDamTypeM7A3M.uc index 7282bba..81b6f8f 100644 --- a/sources/Weapons/Playable/SMG/M7A3/NiceDamTypeM7A3M.uc +++ b/sources/Weapons/Playable/SMG/M7A3/NiceDamTypeM7A3M.uc @@ -1,5 +1,7 @@ -class NiceDamTypeM7A3M extends NiceDamTypeMedicBullet - abstract; -defaultproperties -{ HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceM7A3MMedicGun' -} +class NiceDamTypeM7A3M extends NiceDamTypeMedicBullet + abstract; +defaultproperties +{ + HeadShotDamageMult=2.000000 + WeaponClass=Class'NicePack.NiceM7A3MMedicGun' +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceDamTypeM7A3MDart.uc b/sources/Weapons/Playable/SMG/M7A3/NiceDamTypeM7A3MDart.uc index c12ee60..020da02 100644 --- a/sources/Weapons/Playable/SMG/M7A3/NiceDamTypeM7A3MDart.uc +++ b/sources/Weapons/Playable/SMG/M7A3/NiceDamTypeM7A3MDart.uc @@ -1,5 +1,7 @@ -class NiceDamTypeM7A3MDart extends NiceDamTypeMedicDart - abstract; -defaultproperties -{ HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceM7A3MMedicGun' -} +class NiceDamTypeM7A3MDart extends NiceDamTypeMedicDart + abstract; +defaultproperties +{ + HeadShotDamageMult=2.000000 + WeaponClass=Class'NicePack.NiceM7A3MMedicGun' +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAltFire.uc b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAltFire.uc index 6815772..1579cc9 100644 --- a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAltFire.uc +++ b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAltFire.uc @@ -1,4 +1,5 @@ -class NiceM7A3MAltFire extends NiceMedicDartFire; -defaultproperties -{ DamageType=Class'NicePack.NiceDamTypeM7A3MDart' -} +class NiceM7A3MAltFire extends NiceMedicDartFire; +defaultproperties +{ + DamageType=Class'NicePack.NiceDamTypeM7A3MDart' +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAmmo.uc b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAmmo.uc index 989fa52..05528f6 100644 --- a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAmmo.uc +++ b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAmmo.uc @@ -1,4 +1,12 @@ -class NiceM7A3MAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceM7A3MPickup' AmmoPickupAmount=15 MaxAmmo=300 InitialAmount=75 PickupClass=Class'NicePack.NiceM7A3MAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="M7A3 bullets" -} +class NiceM7A3MAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceM7A3MPickup' + AmmoPickupAmount=15 + MaxAmmo=300 + InitialAmount=75 + PickupClass=Class'NicePack.NiceM7A3MAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="M7A3 bullets" +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAmmoPickup.uc b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAmmoPickup.uc index d75d111..b94117f 100644 --- a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAmmoPickup.uc +++ b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceM7A3MAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=15 InventoryType=Class'NicePack.NiceM7A3MAmmo' PickupMessage="Rounds 7.6x40mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceM7A3MAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=15 + InventoryType=Class'NicePack.NiceM7A3MAmmo' + PickupMessage="Rounds 7.6x40mm" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAttachment.uc b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAttachment.uc index 9a9b73a..358d426 100644 --- a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAttachment.uc +++ b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MAttachment.uc @@ -1,4 +1,56 @@ -class NiceM7A3MAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_Kriss" MovementAnims(1)="JogB_Kriss" MovementAnims(2)="JogL_Kriss" MovementAnims(3)="JogR_Kriss" TurnLeftAnim="TurnL_Kriss" TurnRightAnim="TurnR_Kriss" CrouchAnims(0)="CHWalkF_Kriss" CrouchAnims(1)="CHWalkB_Kriss" CrouchAnims(2)="CHWalkL_Kriss" CrouchAnims(3)="CHWalkR_Kriss" WalkAnims(0)="WalkF_Kriss" WalkAnims(1)="WalkB_Kriss" WalkAnims(2)="WalkL_Kriss" WalkAnims(3)="WalkR_Kriss" CrouchTurnRightAnim="CH_TurnR_Kriss" CrouchTurnLeftAnim="CH_TurnL_Kriss" IdleCrouchAnim="CHIdle_Kriss" IdleWeaponAnim="Idle_Kriss" IdleRestAnim="Idle_Kriss" IdleChatAnim="Idle_Kriss" IdleHeavyAnim="Idle_Kriss" IdleRifleAnim="Idle_Kriss" FireAnims(0)="Fire_Kriss" FireAnims(1)="Fire_Kriss" FireAnims(2)="Fire_Kriss" FireAnims(3)="Fire_Kriss" FireAltAnims(0)="Fire_Kriss" FireAltAnims(1)="Fire_Kriss" FireAltAnims(2)="Fire_Kriss" FireAltAnims(3)="Fire_Kriss" FireCrouchAnims(0)="CHFire_Kriss" FireCrouchAnims(1)="CHFire_Kriss" FireCrouchAnims(2)="CHFire_Kriss" FireCrouchAnims(3)="CHFire_Kriss" FireCrouchAltAnims(0)="CHFire_Kriss" FireCrouchAltAnims(1)="CHFire_Kriss" FireCrouchAltAnims(2)="CHFire_Kriss" FireCrouchAltAnims(3)="CHFire_Kriss" HitAnims(0)="HitF_Kriss" HitAnims(1)="HitB_Kriss" HitAnims(2)="HitL_Kriss" HitAnims(3)="HitR_Kriss" PostFireBlendStandAnim="Blend_Kriss" PostFireBlendCrouchAnim="CHBlend_Kriss" MeshRef="KF_Weapons3rd4_Trip.M7A3_3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceM7A3MAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + MovementAnims(0)="JogF_Kriss" + MovementAnims(1)="JogB_Kriss" + MovementAnims(2)="JogL_Kriss" + MovementAnims(3)="JogR_Kriss" + TurnLeftAnim="TurnL_Kriss" + TurnRightAnim="TurnR_Kriss" + CrouchAnims(0)="CHWalkF_Kriss" + CrouchAnims(1)="CHWalkB_Kriss" + CrouchAnims(2)="CHWalkL_Kriss" + CrouchAnims(3)="CHWalkR_Kriss" + WalkAnims(0)="WalkF_Kriss" + WalkAnims(1)="WalkB_Kriss" + WalkAnims(2)="WalkL_Kriss" + WalkAnims(3)="WalkR_Kriss" + CrouchTurnRightAnim="CH_TurnR_Kriss" + CrouchTurnLeftAnim="CH_TurnL_Kriss" + IdleCrouchAnim="CHIdle_Kriss" + IdleWeaponAnim="Idle_Kriss" + IdleRestAnim="Idle_Kriss" + IdleChatAnim="Idle_Kriss" + IdleHeavyAnim="Idle_Kriss" + IdleRifleAnim="Idle_Kriss" + FireAnims(0)="Fire_Kriss" + FireAnims(1)="Fire_Kriss" + FireAnims(2)="Fire_Kriss" + FireAnims(3)="Fire_Kriss" + FireAltAnims(0)="Fire_Kriss" + FireAltAnims(1)="Fire_Kriss" + FireAltAnims(2)="Fire_Kriss" + FireAltAnims(3)="Fire_Kriss" + FireCrouchAnims(0)="CHFire_Kriss" + FireCrouchAnims(1)="CHFire_Kriss" + FireCrouchAnims(2)="CHFire_Kriss" + FireCrouchAnims(3)="CHFire_Kriss" + FireCrouchAltAnims(0)="CHFire_Kriss" + FireCrouchAltAnims(1)="CHFire_Kriss" + FireCrouchAltAnims(2)="CHFire_Kriss" + FireCrouchAltAnims(3)="CHFire_Kriss" + HitAnims(0)="HitF_Kriss" + HitAnims(1)="HitB_Kriss" + HitAnims(2)="HitL_Kriss" + HitAnims(3)="HitR_Kriss" + PostFireBlendStandAnim="Blend_Kriss" + PostFireBlendCrouchAnim="CHBlend_Kriss" + MeshRef="KF_Weapons3rd4_Trip.M7A3_3rd" + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MFire.uc b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MFire.uc index 57fcb50..65e4c17 100644 --- a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MFire.uc +++ b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MFire.uc @@ -1,4 +1,35 @@ -class NiceM7A3MFire extends NiceFire; -defaultproperties -{ ProjectileSpeed=21250.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.085000 maxVerticalRecoilAngle=120 maxHorizontalRecoilAngle=60 ShellEjectClass=Class'ROEffects.KFShellEjectSCAR' ShellEjectBoneName="Shell_eject" bAccuracyBonusForSemiAuto=True FireSoundRef="KF_M7A3Snd.M7A3_Fire_M" StereoFireSoundRef="KF_M7A3Snd.M7A3_Fire_S" NoAmmoSoundRef="KF_SCARSnd.SCAR_DryFire" DamageType=Class'NicePack.NiceDamTypeM7A3M' DamageMin=70 DamageMax=70 Momentum=7000.000000 bPawnRapidFireAnim=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" TweenTime=0.050000 FireForce="AssaultRifleFire" FireRate=0.080000 AmmoClass=Class'NicePack.NiceM7A3MAmmo' ShakeRotMag=(X=30.000000,Y=30.000000,Z=240.000000) ShakeRotRate=(X=8500.000000,Y=8500.000000,Z=8500.000000) ShakeRotTime=2.500000 ShakeOffsetMag=(X=6.000000,Y=2.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.500000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 -} +class NiceM7A3MFire extends NiceFire; +defaultproperties +{ + ProjectileSpeed=21250.000000 + FireAimedAnim="Fire_Iron" + RecoilRate=0.085000 + maxVerticalRecoilAngle=120 + maxHorizontalRecoilAngle=60 + ShellEjectClass=Class'ROEffects.KFShellEjectSCAR' + ShellEjectBoneName="Shell_eject" + bAccuracyBonusForSemiAuto=True + FireSoundRef="KF_M7A3Snd.M7A3_Fire_M" + StereoFireSoundRef="KF_M7A3Snd.M7A3_Fire_S" + NoAmmoSoundRef="KF_SCARSnd.SCAR_DryFire" + DamageType=Class'NicePack.NiceDamTypeM7A3M' + DamageMin=70 + DamageMax=70 + Momentum=7000.000000 + bPawnRapidFireAnim=True + TransientSoundVolume=1.800000 + FireLoopAnim="Fire" + TweenTime=0.050000 + FireForce="AssaultRifleFire" + FireRate=0.080000 + AmmoClass=Class'NicePack.NiceM7A3MAmmo' + ShakeRotMag=(X=30.000000,Y=30.000000,Z=240.000000) + ShakeRotRate=(X=8500.000000,Y=8500.000000,Z=8500.000000) + ShakeRotTime=2.500000 + ShakeOffsetMag=(X=6.000000,Y=2.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.500000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MMedicGun.uc b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MMedicGun.uc index dfc759b..48e0fd3 100644 --- a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MMedicGun.uc +++ b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MMedicGun.uc @@ -1,72 +1,173 @@ -class NiceM7A3MMedicGun extends NiceMedicGun; -var localized string ReloadMessage; -var localized string EmptyMessage; -var Material ScopeGreen; -var Material ScopeRed; -var ScriptedTexture MyScriptedTexture; -var string MyMessage; -var Font MyFont; -var Font MyFont2; -var Font SmallMyFont; -var color MyFontColor; -var color MyFontColor2; -var int OldValue; - -static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount) -{ - if(default.ScopeGreen == none) default.ScopeGreen = Material(DynamicLoadObject("KF_Weapons5_Scopes_Trip_T.M7A3.Scope_Finall", class'Material', true)); - if(default.ScopeRed == none) default.ScopeRed = Material(DynamicLoadObject("KF_Weapons5_Scopes_Trip_T.M7A3.ScopeRed_Shader", class'Material', true)); - if(default.MyScriptedTexture == none) default.MyScriptedTexture = ScriptedTexture(DynamicLoadObject("KF_Weapons5_Scopes_Trip_T.M7A3_Ammo_Script.AmmoNumber", class'ScriptedTexture', true)); - if(default.MyFont == none) default.MyFont = Font(DynamicLoadObject("IJCFonts.DigitalBig", class'Font', true)); - if(default.MyFont2 == none) default.MyFont2 = Font(DynamicLoadObject("IJCFonts.DigitalBig", class'Font', true)); - if(default.SmallMyFont == none) default.SmallMyFont = Font(DynamicLoadObject("IJCFonts.DigitalMed", class'Font', true)); - if(M7A3MMedicGun(Inv) != none){ M7A3MMedicGun(Inv).ScopeGreen = default.ScopeGreen; M7A3MMedicGun(Inv).ScopeRed = default.ScopeRed; M7A3MMedicGun(Inv).MyScriptedTexture = default.MyScriptedTexture; M7A3MMedicGun(Inv).MyFont = default.MyFont; M7A3MMedicGun(Inv).MyFont2 = default.MyFont2; M7A3MMedicGun(Inv).SmallMyFont = default.SmallMyFont; - } - super.PreloadAssets(Inv, bSkipRefCount); -} -static function bool UnloadAssets(){ - if(super.UnloadAssets()){ default.ScopeGreen = none; default.ScopeRed = none; default.MyScriptedTexture = none; default.MyFont = none; default.MyFont2 = none; default.SmallMyFont = none; return true; - } - return false; -} -simulated final function SetTextColor(byte R, byte G, byte B){ - MyFontColor.R = R; - MyFontColor.G = G; - MyFontColor.B = B; - MyFontColor.A = 255; -} -simulated final function SetTextColor2(byte R, byte G, byte B){ - MyFontColor2.R = R; - MyFontColor2.G = G; - MyFontColor2.B = B; - MyFontColor2.A = 255; - } -simulated function RenderOverlays(Canvas Canvas){ - if(medicCharge >= 50){ SetTextColor2(76,148,177); MyScriptedTexture.Revision ++; - } - else{ SetTextColor2(218,18,18); MyScriptedTexture.Revision ++; - } - if(AmmoAmount(0) <= 0){ if(OldValue != -5){ OldValue = -5; Skins[2] = ScopeRed; MyFont = SmallMyFont; SetTextColor(218,18,18); MyMessage = EmptyMessage; MyScriptedTexture.Revision ++; } - } - else if(bIsReloading){ if(OldValue != -4){ OldValue = -4; MyFont = SmallMyFont; SetTextColor(32,187,112); MyMessage = ReloadMessage; ++MyScriptedTexture.Revision; } - } - else if(OldValue != (MagAmmoRemaining + 1)){ OldValue = MagAmmoRemaining+1; Skins[2] = ScopeGreen; MyFont = Default.MyFont; - if(MagAmmoRemaining <= (MagCapacity/2)) SetTextColor(32,187,112); if(MagAmmoRemaining <= (MagCapacity / 3)){ SetTextColor(218,18,18); Skins[2] = ScopeRed; } if(MagAmmoRemaining >= (MagCapacity/2)) SetTextColor(76,148,177); MyMessage = String(MagAmmoRemaining); - MyScriptedTexture.Revision ++; - } - MyScriptedTexture.Client = Self; - Super.RenderOverlays(Canvas); - MyScriptedTexture.Client = None; -} -simulated function RenderTexture(ScriptedTexture Tex){ - local int w, h; - // Ammo - Tex.TextSize( MyMessage, MyFont, w, h ); - Tex.DrawText( ( Tex.USize / 2 ) - ( w / 2 ), ( Tex.VSize / 2 ) - ( h / 1.2 ),MyMessage, MyFont, MyFontColor ); - // Health - Tex.TextSize( int(medicCharge), MyFont2, w, h ); - Tex.DrawText( ( Tex.USize / 2 ) - ( w / 2 ), ( Tex.VSize / 2 ) - 8, int(medicCharge), MyFont2, MyFontColor2 ); -} -defaultproperties -{ ReloadMessage="REL" EmptyMessage="Empty" MyFontColor=(B=177,G=148,R=76,A=255) MyFontColor2=(B=177,G=148,R=76,A=255) reloadPreEndFrame=0.148000 reloadEndFrame=0.519000 reloadChargeEndFrame=0.740000 reloadMagStartFrame=0.222000 reloadChargeStartFrame=0.531000 MagCapacity=30 ReloadRate=3.066000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_M7A3" Weight=5.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 SleeveNum=3 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M7A3' bIsTier3Weapon=True MeshRef="KF_Wep_M7A3.M7A3" SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.M7A3_cmb" SkinRefs(1)="KF_Weapons5_Scopes_Trip_T.M7A3_Ammo_Script.AmmoShader" SkinRefs(2)="KF_Weapons5_Scopes_Trip_T.M7A3.Scope_Finall" SelectSoundRef="KF_M7A3Snd.M7A3_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.M7A3_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M7A3" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceM7A3MFire' FireModeClass(1)=Class'NicePack.NiceM7A3MAltFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="An advanced Horzine prototype assault rifle. Modified to fire healing darts." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=100 InventoryGroup=4 GroupOffset=13 PickupClass=Class'NicePack.NiceM7A3MPickup' PlayerViewOffset=(X=20.000000,Y=15.000000,Z=-5.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceM7A3MAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="M7A3 Medic Gun" TransientSoundVolume=1.250000 -} +class NiceM7A3MMedicGun extends NiceMedicGun; +var localized string ReloadMessage; +var localized string EmptyMessage; +var Material ScopeGreen; +var Material ScopeRed; +var ScriptedTexture MyScriptedTexture; +var string MyMessage; +var Font MyFont; +var Font MyFont2; +var Font SmallMyFont; +var color MyFontColor; +var color MyFontColor2; +var int OldValue; + +static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount) +{ + if(default.ScopeGreen == none) + default.ScopeGreen = Material(DynamicLoadObject("KF_Weapons5_Scopes_Trip_T.M7A3.Scope_Finall", class'Material', true)); + if(default.ScopeRed == none) + default.ScopeRed = Material(DynamicLoadObject("KF_Weapons5_Scopes_Trip_T.M7A3.ScopeRed_Shader", class'Material', true)); + if(default.MyScriptedTexture == none) + default.MyScriptedTexture = ScriptedTexture(DynamicLoadObject("KF_Weapons5_Scopes_Trip_T.M7A3_Ammo_Script.AmmoNumber", class'ScriptedTexture', true)); + if(default.MyFont == none) + default.MyFont = Font(DynamicLoadObject("IJCFonts.DigitalBig", class'Font', true)); + if(default.MyFont2 == none) + default.MyFont2 = Font(DynamicLoadObject("IJCFonts.DigitalBig", class'Font', true)); + if(default.SmallMyFont == none) + default.SmallMyFont = Font(DynamicLoadObject("IJCFonts.DigitalMed", class'Font', true)); + if(M7A3MMedicGun(Inv) != none){ + M7A3MMedicGun(Inv).ScopeGreen = default.ScopeGreen; + M7A3MMedicGun(Inv).ScopeRed = default.ScopeRed; + M7A3MMedicGun(Inv).MyScriptedTexture = default.MyScriptedTexture; + M7A3MMedicGun(Inv).MyFont = default.MyFont; + M7A3MMedicGun(Inv).MyFont2 = default.MyFont2; + M7A3MMedicGun(Inv).SmallMyFont = default.SmallMyFont; + } + super.PreloadAssets(Inv, bSkipRefCount); +} +static function bool UnloadAssets(){ + if(super.UnloadAssets()){ + default.ScopeGreen = none; + default.ScopeRed = none; + default.MyScriptedTexture = none; + default.MyFont = none; + default.MyFont2 = none; + default.SmallMyFont = none; + return true; + } + return false; +} +simulated final function SetTextColor(byte R, byte G, byte B){ + MyFontColor.R = R; + MyFontColor.G = G; + MyFontColor.B = B; + MyFontColor.A = 255; +} +simulated final function SetTextColor2(byte R, byte G, byte B){ + MyFontColor2.R = R; + MyFontColor2.G = G; + MyFontColor2.B = B; + MyFontColor2.A = 255; + } +simulated function RenderOverlays(Canvas Canvas){ + if(medicCharge >= 50){ + SetTextColor2(76,148,177); + MyScriptedTexture.Revision ++; + } + else{ + SetTextColor2(218,18,18); + MyScriptedTexture.Revision ++; + } + if(AmmoAmount(0) <= 0){ + if(OldValue != -5){ + OldValue = -5; + Skins[2] = ScopeRed; + MyFont = SmallMyFont; + SetTextColor(218,18,18); + MyMessage = EmptyMessage; + MyScriptedTexture.Revision ++; + } + } + else if(bIsReloading){ + if(OldValue != -4){ + OldValue = -4; + MyFont = SmallMyFont; + SetTextColor(32,187,112); + MyMessage = ReloadMessage; + ++MyScriptedTexture.Revision; + } + } + else if(OldValue != (MagAmmoRemaining + 1)){ + OldValue = MagAmmoRemaining+1; + Skins[2] = ScopeGreen; + MyFont = Default.MyFont; + + if(MagAmmoRemaining <= (MagCapacity/2)) + SetTextColor(32,187,112); + if(MagAmmoRemaining <= (MagCapacity / 3)){ + SetTextColor(218,18,18); + Skins[2] = ScopeRed; + } + if(MagAmmoRemaining >= (MagCapacity/2)) + SetTextColor(76,148,177); + MyMessage = String(MagAmmoRemaining); + + MyScriptedTexture.Revision ++; + } + MyScriptedTexture.Client = Self; + Super.RenderOverlays(Canvas); + MyScriptedTexture.Client = None; +} +simulated function RenderTexture(ScriptedTexture Tex){ + local int w, h; + // Ammo + Tex.TextSize( MyMessage, MyFont, w, h ); + Tex.DrawText( ( Tex.USize / 2 ) - ( w / 2 ), ( Tex.VSize / 2 ) - ( h / 1.2 ),MyMessage, MyFont, MyFontColor ); + // Health + Tex.TextSize( int(medicCharge), MyFont2, w, h ); + Tex.DrawText( ( Tex.USize / 2 ) - ( w / 2 ), ( Tex.VSize / 2 ) - 8, int(medicCharge), MyFont2, MyFontColor2 ); +} +defaultproperties +{ + ReloadMessage="REL" + EmptyMessage="Empty" + MyFontColor=(B=177,G=148,R=76,A=255) + MyFontColor2=(B=177,G=148,R=76,A=255) + reloadPreEndFrame=0.148000 + reloadEndFrame=0.519000 + reloadChargeEndFrame=0.740000 + reloadMagStartFrame=0.222000 + reloadChargeStartFrame=0.531000 + MagCapacity=30 + ReloadRate=3.066000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_M7A3" + Weight=5.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=55.000000 + SleeveNum=3 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M7A3' + bIsTier3Weapon=True + MeshRef="KF_Wep_M7A3.M7A3" + SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.M7A3_cmb" + SkinRefs(1)="KF_Weapons5_Scopes_Trip_T.M7A3_Ammo_Script.AmmoShader" + SkinRefs(2)="KF_Weapons5_Scopes_Trip_T.M7A3.Scope_Finall" + SelectSoundRef="KF_M7A3Snd.M7A3_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.M7A3_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M7A3" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=45.000000 + FireModeClass(0)=Class'NicePack.NiceM7A3MFire' + FireModeClass(1)=Class'NicePack.NiceM7A3MAltFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="An advanced Horzine prototype assault rifle. Modified to fire healing darts." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=55.000000 + Priority=100 + InventoryGroup=4 + GroupOffset=13 + PickupClass=Class'NicePack.NiceM7A3MPickup' + PlayerViewOffset=(X=20.000000,Y=15.000000,Z=-5.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceM7A3MAttachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="M7A3 Medic Gun" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MPickup.uc b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MPickup.uc index f1169d8..ee2d1fa 100644 --- a/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MPickup.uc +++ b/sources/Weapons/Playable/SMG/M7A3/NiceM7A3MPickup.uc @@ -1,4 +1,24 @@ -class NiceM7A3MPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=5.000000 cost=1250 AmmoCost=50 BuyClipSize=30 PowerValue=45 SpeedValue=60 RangeValue=55 Description="An advanced Horzine prototype assault rifle. Modified to fire healing darts." ItemName="M7A3 Medic Gun" ItemShortName="M7A3M" AmmoItemName="7.6x40mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceM7A3MMedicGun' PickupMessage="You got the M7A3 Medic Gun" PickupSound=Sound'KF_M7A3Snd.M7A3_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups4_Trip.Rifles.M7A3_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceM7A3MPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=5.000000 + cost=1250 + AmmoCost=50 + BuyClipSize=30 + PowerValue=45 + SpeedValue=60 + RangeValue=55 + Description="An advanced Horzine prototype assault rifle. Modified to fire healing darts." + ItemName="M7A3 Medic Gun" + ItemShortName="M7A3M" + AmmoItemName="7.6x40mm Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + EquipmentCategoryID=3 + InventoryType=Class'NicePack.NiceM7A3MMedicGun' + PickupMessage="You got the M7A3 Medic Gun" + PickupSound=Sound'KF_M7A3Snd.M7A3_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups4_Trip.Rifles.M7A3_Pickup' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceDamTypeMP5M.uc b/sources/Weapons/Playable/SMG/MP5M/NiceDamTypeMP5M.uc index 056a74f..2e24965 100644 --- a/sources/Weapons/Playable/SMG/MP5M/NiceDamTypeMP5M.uc +++ b/sources/Weapons/Playable/SMG/MP5M/NiceDamTypeMP5M.uc @@ -1,5 +1,7 @@ -class NiceDamTypeMP5M extends NiceDamTypeMedicBullet - abstract; -defaultproperties -{ HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceMP5MMedicGun' -} +class NiceDamTypeMP5M extends NiceDamTypeMedicBullet + abstract; +defaultproperties +{ + HeadShotDamageMult=2.000000 + WeaponClass=Class'NicePack.NiceMP5MMedicGun' +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceDamTypeMP5MDart.uc b/sources/Weapons/Playable/SMG/MP5M/NiceDamTypeMP5MDart.uc index 795fe86..9ca4cf8 100644 --- a/sources/Weapons/Playable/SMG/MP5M/NiceDamTypeMP5MDart.uc +++ b/sources/Weapons/Playable/SMG/MP5M/NiceDamTypeMP5MDart.uc @@ -1,5 +1,7 @@ -class NiceDamTypeMP5MDart extends NiceDamTypeMedicDart - abstract; -defaultproperties -{ HeadShotDamageMult=2.000000 WeaponClass=Class'NicePack.NiceMP5MMedicGun' -} +class NiceDamTypeMP5MDart extends NiceDamTypeMedicDart + abstract; +defaultproperties +{ + HeadShotDamageMult=2.000000 + WeaponClass=Class'NicePack.NiceMP5MMedicGun' +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAltFire.uc b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAltFire.uc index bfaf798..f7e1e8f 100644 --- a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAltFire.uc +++ b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAltFire.uc @@ -1,4 +1,5 @@ -class NiceMP5MAltFire extends NiceMedicDartFire; -defaultproperties -{ DamageType=Class'NicePack.NiceDamTypeMP5MDart' -} +class NiceMP5MAltFire extends NiceMedicDartFire; +defaultproperties +{ + DamageType=Class'NicePack.NiceDamTypeMP5MDart' +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAmmo.uc b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAmmo.uc index 657f55b..58ee47d 100644 --- a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAmmo.uc +++ b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAmmo.uc @@ -1,4 +1,12 @@ -class NiceMP5MAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceMP5MPickup' AmmoPickupAmount=30 MaxAmmo=600 InitialAmount=150 PickupClass=Class'NicePack.NiceMP5MAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="MP5M bullets" -} +class NiceMP5MAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceMP5MPickup' + AmmoPickupAmount=30 + MaxAmmo=600 + InitialAmount=150 + PickupClass=Class'NicePack.NiceMP5MAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="MP5M bullets" +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAmmoPickup.uc b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAmmoPickup.uc index 8289d36..8aad287 100644 --- a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAmmoPickup.uc +++ b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceMP5MAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=30 InventoryType=Class'NicePack.NiceMP5MAmmo' PickupMessage="Rounds 9x19mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceMP5MAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=30 + InventoryType=Class'NicePack.NiceMP5MAmmo' + PickupMessage="Rounds 9x19mm" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAttachment.uc b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAttachment.uc index 19297fe..18a43cb 100644 --- a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAttachment.uc +++ b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MAttachment.uc @@ -1,4 +1,58 @@ -class NiceMP5MAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_MP5" MovementAnims(1)="JogB_MP5" MovementAnims(2)="JogL_MP5" MovementAnims(3)="JogR_MP5" TurnLeftAnim="TurnL_MP5" TurnRightAnim="TurnR_MP5" CrouchAnims(0)="CHWalkF_MP5" CrouchAnims(1)="CHWalkB_MP5" CrouchAnims(2)="CHWalkL_MP5" CrouchAnims(3)="CHWalkR_MP5" WalkAnims(0)="WalkF_MP5" WalkAnims(1)="WalkB_MP5" WalkAnims(2)="WalkL_MP5" WalkAnims(3)="WalkR_MP5" CrouchTurnRightAnim="CH_TurnR_MP5" CrouchTurnLeftAnim="CH_TurnL_MP5" IdleCrouchAnim="CHIdle_MP5" IdleWeaponAnim="Idle_MP5" IdleRestAnim="Idle_MP5" IdleChatAnim="Idle_MP5" IdleHeavyAnim="Idle_MP5" IdleRifleAnim="Idle_MP5" FireAnims(0)="Fire_MP5" FireAnims(1)="Fire_MP5" FireAnims(2)="Fire_MP5" FireAnims(3)="Fire_MP5" FireAltAnims(0)="Fire_MP5" FireAltAnims(1)="Fire_MP5" FireAltAnims(2)="Fire_MP5" FireAltAnims(3)="Fire_MP5" FireCrouchAnims(0)="CHFire_MP5" FireCrouchAnims(1)="CHFire_MP5" FireCrouchAnims(2)="CHFire_MP5" FireCrouchAnims(3)="CHFire_MP5" FireCrouchAltAnims(0)="CHFire_MP5" FireCrouchAltAnims(1)="CHFire_MP5" FireCrouchAltAnims(2)="CHFire_MP5" FireCrouchAltAnims(3)="CHFire_MP5" HitAnims(0)="HitF_MP5" HitAnims(1)="HitB_MP5" HitAnims(2)="HitL_MP5" HitAnims(3)="HitR_MP5" PostFireBlendStandAnim="Blend_MP5" PostFireBlendCrouchAnim="CHBlend_MP5" MeshRef="KF_Weapons3rd3_Trip.Mp5_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceMP5MAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + ShellEjectBoneName="Shell_eject" + MovementAnims(0)="JogF_MP5" + MovementAnims(1)="JogB_MP5" + MovementAnims(2)="JogL_MP5" + MovementAnims(3)="JogR_MP5" + TurnLeftAnim="TurnL_MP5" + TurnRightAnim="TurnR_MP5" + CrouchAnims(0)="CHWalkF_MP5" + CrouchAnims(1)="CHWalkB_MP5" + CrouchAnims(2)="CHWalkL_MP5" + CrouchAnims(3)="CHWalkR_MP5" + WalkAnims(0)="WalkF_MP5" + WalkAnims(1)="WalkB_MP5" + WalkAnims(2)="WalkL_MP5" + WalkAnims(3)="WalkR_MP5" + CrouchTurnRightAnim="CH_TurnR_MP5" + CrouchTurnLeftAnim="CH_TurnL_MP5" + IdleCrouchAnim="CHIdle_MP5" + IdleWeaponAnim="Idle_MP5" + IdleRestAnim="Idle_MP5" + IdleChatAnim="Idle_MP5" + IdleHeavyAnim="Idle_MP5" + IdleRifleAnim="Idle_MP5" + FireAnims(0)="Fire_MP5" + FireAnims(1)="Fire_MP5" + FireAnims(2)="Fire_MP5" + FireAnims(3)="Fire_MP5" + FireAltAnims(0)="Fire_MP5" + FireAltAnims(1)="Fire_MP5" + FireAltAnims(2)="Fire_MP5" + FireAltAnims(3)="Fire_MP5" + FireCrouchAnims(0)="CHFire_MP5" + FireCrouchAnims(1)="CHFire_MP5" + FireCrouchAnims(2)="CHFire_MP5" + FireCrouchAnims(3)="CHFire_MP5" + FireCrouchAltAnims(0)="CHFire_MP5" + FireCrouchAltAnims(1)="CHFire_MP5" + FireCrouchAltAnims(2)="CHFire_MP5" + FireCrouchAltAnims(3)="CHFire_MP5" + HitAnims(0)="HitF_MP5" + HitAnims(1)="HitB_MP5" + HitAnims(2)="HitL_MP5" + HitAnims(3)="HitR_MP5" + PostFireBlendStandAnim="Blend_MP5" + PostFireBlendCrouchAnim="CHBlend_MP5" + MeshRef="KF_Weapons3rd3_Trip.Mp5_3rd" + WeaponAmbientScale=2.000000 + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MFire.uc b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MFire.uc index 41eaf73..aed3c5e 100644 --- a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MFire.uc +++ b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MFire.uc @@ -1,4 +1,28 @@ -class NiceMP5MFire extends NiceHighROFFire; -defaultproperties -{ FireEndSoundRef="KF_MP5Snd.MP5_Fire_Loop_End_M" FireEndStereoSoundRef="KF_MP5Snd.MP5_Fire_Loop_End_S" AmbientFireSoundRef="KF_MP5Snd.MP5_Fire_Loop" ProjectileSpeed=21250.000000 RecoilRate=0.075000 maxVerticalRecoilAngle=160 maxHorizontalRecoilAngle=80 RecoilVelocityScale=0.000000 ShellEjectClass=Class'ROEffects.KFShellEjectMP5SMG' ShellEjectBoneName="Shell_eject" NoAmmoSoundRef="KF_MP7Snd.MP7_DryFire" DamageType=Class'NicePack.NiceDamTypeMP5M' DamageMin=35 DamageMax=35 Momentum=5500.000000 FireRate=0.075000 AmmoClass=Class'NicePack.NiceMP5MAmmo' ShakeRotMag=(X=25.000000,Y=25.000000,Z=125.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=3.000000 ShakeOffsetMag=(X=4.000000,Y=2.500000,Z=5.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' -} +class NiceMP5MFire extends NiceHighROFFire; +defaultproperties +{ + FireEndSoundRef="KF_MP5Snd.MP5_Fire_Loop_End_M" + FireEndStereoSoundRef="KF_MP5Snd.MP5_Fire_Loop_End_S" + AmbientFireSoundRef="KF_MP5Snd.MP5_Fire_Loop" + ProjectileSpeed=21250.000000 + RecoilRate=0.075000 + maxVerticalRecoilAngle=160 + maxHorizontalRecoilAngle=80 + RecoilVelocityScale=0.000000 + ShellEjectClass=Class'ROEffects.KFShellEjectMP5SMG' + ShellEjectBoneName="Shell_eject" + NoAmmoSoundRef="KF_MP7Snd.MP7_DryFire" + DamageType=Class'NicePack.NiceDamTypeMP5M' + DamageMin=35 + DamageMax=35 + Momentum=5500.000000 + FireRate=0.075000 + AmmoClass=Class'NicePack.NiceMP5MAmmo' + ShakeRotMag=(X=25.000000,Y=25.000000,Z=125.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeRotTime=3.000000 + ShakeOffsetMag=(X=4.000000,Y=2.500000,Z=5.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.250000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MMedicGun.uc b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MMedicGun.uc index af19c6d..2084507 100644 --- a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MMedicGun.uc +++ b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MMedicGun.uc @@ -1,45 +1,107 @@ -class NiceMP5MMedicGun extends NiceMedicGun; -var bool chargerOpen; -var float chargerStartOpeningTiming, chargerOpenedTiming, chargeCloseTiming; -var const string chargerStartOpeningTimeStr, chargerOpenedTimeStr, chargeCloseTimeStr; -function NicePlainData.Data GetNiceData(){ - local NicePlainData.Data transferData; - transferData = super.GetNiceData(); - class'NicePlainData'.static.SetBool(transferData, "MP5MChargerOpen", chargerOpen); - return transferData; -} -function SetNiceData(NicePlainData.Data transferData, optional NiceHumanPawn newOwner){ - super.SetNiceData(transferData, newOwner); - chargerOpen = class'NicePlainData'.static.GetBool(transferData, "MP5MChargerOpen", false); -} -simulated function PostBeginPlay(){ - local EventRecord record; - // Setup reload events - record.eventName = chargerStartOpeningTimeStr; - record.eventFrame = chargerStartOpeningTiming; - relEvents[relEvents.Length] = record; - record.eventName = chargerOpenedTimeStr; - record.eventFrame = chargerOpenedTiming; - relEvents[relEvents.Length] = record; - record.eventName = chargeCloseTimeStr; - record.eventFrame = chargeCloseTiming; - relEvents[relEvents.Length] = record; - super.PostBeginPlay(); -} -simulated function ReloadEvent(string eventName){ - local float magStart; - // Calculate the point from which we should resume the magazine part - if(bMagazineOut) magStart = 0.605; - else if(IsMagazineFull()) magStart = 0.868; - else magStart = 0.351; - // Jump if needed - if(eventName ~= chargerStartOpeningTimeStr && (bRoundInChamber || chargerOpen)){ ScrollAnim(magStart); lastEventCheckFrame = magStart; - } - // Flag changes - if(eventName ~= chargerOpenedTimeStr){ chargerOpen = true; if(bMagazineOut || !IsMagazineFull()){ ScrollAnim(magStart); lastEventCheckFrame = magStart; } - } - if(eventName ~= chargeCloseTimeStr) chargerOpen = false; -} -defaultproperties -{ chargerOpen=True chargerStartOpeningTiming=0.010000 chargerOpenedTiming=0.175000 chargeCloseTiming=0.895000 chargerStartOpeningTimeStr="openChargerS" chargerOpenedTimeStr="openChargerE" chargeCloseTimeStr="closeCharger" reloadPreEndFrame=0.544000 reloadEndFrame=0.728000 reloadChargeEndFrame=0.895000 MagazineBone="Empty_Magazine" MagCapacity=30 ReloadRate=3.040000 ReloadAnim="Reload" ReloadAnimRate=1.250000 WeaponReloadAnim="Reload_MP5" Weight=4.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Mp5Medic' bIsTier2Weapon=True MeshRef="KF_Wep_MP5.MP5_Trip" SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.MP5_cmb" SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" SelectSoundRef="KF_MP5Snd.WEP_MP5_Foley_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.Mp5Medic_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Mp5Medic" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceMP5MFire' FireModeClass(1)=Class'NicePack.NiceMP5MAltFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="MP5 sub machine gun. Modified to fire healing darts. Better damage and healing than MP7M with a larger mag." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=80 InventoryGroup=3 GroupOffset=4 PickupClass=Class'NicePack.NiceMP5MPickup' PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceMP5MAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="MP5M Medic Gun" TransientSoundVolume=1.250000 -} +class NiceMP5MMedicGun extends NiceMedicGun; +var bool chargerOpen; +var float chargerStartOpeningTiming, chargerOpenedTiming, chargeCloseTiming; +var const string chargerStartOpeningTimeStr, chargerOpenedTimeStr, chargeCloseTimeStr; +function NicePlainData.Data GetNiceData(){ + local NicePlainData.Data transferData; + transferData = super.GetNiceData(); + class'NicePlainData'.static.SetBool(transferData, "MP5MChargerOpen", chargerOpen); + return transferData; +} +function SetNiceData(NicePlainData.Data transferData, optional NiceHumanPawn newOwner){ + super.SetNiceData(transferData, newOwner); + chargerOpen = class'NicePlainData'.static.GetBool(transferData, "MP5MChargerOpen", false); +} +simulated function PostBeginPlay(){ + local EventRecord record; + // Setup reload events + record.eventName = chargerStartOpeningTimeStr; + record.eventFrame = chargerStartOpeningTiming; + relEvents[relEvents.Length] = record; + record.eventName = chargerOpenedTimeStr; + record.eventFrame = chargerOpenedTiming; + relEvents[relEvents.Length] = record; + record.eventName = chargeCloseTimeStr; + record.eventFrame = chargeCloseTiming; + relEvents[relEvents.Length] = record; + super.PostBeginPlay(); +} +simulated function ReloadEvent(string eventName){ + local float magStart; + // Calculate the point from which we should resume the magazine part + if(bMagazineOut) + magStart = 0.605; + else if(IsMagazineFull()) + magStart = 0.868; + else + magStart = 0.351; + // Jump if needed + if(eventName ~= chargerStartOpeningTimeStr && (bRoundInChamber || chargerOpen)){ + ScrollAnim(magStart); + lastEventCheckFrame = magStart; + } + // Flag changes + if(eventName ~= chargerOpenedTimeStr){ + chargerOpen = true; + if(bMagazineOut || !IsMagazineFull()){ + ScrollAnim(magStart); + lastEventCheckFrame = magStart; + } + } + if(eventName ~= chargeCloseTimeStr) + chargerOpen = false; +} +defaultproperties +{ + chargerOpen=True + chargerStartOpeningTiming=0.010000 + chargerOpenedTiming=0.175000 + chargeCloseTiming=0.895000 + chargerStartOpeningTimeStr="openChargerS" + chargerOpenedTimeStr="openChargerE" + chargeCloseTimeStr="closeCharger" + reloadPreEndFrame=0.544000 + reloadEndFrame=0.728000 + reloadChargeEndFrame=0.895000 + MagazineBone="Empty_Magazine" + MagCapacity=30 + ReloadRate=3.040000 + ReloadAnim="Reload" + ReloadAnimRate=1.250000 + WeaponReloadAnim="Reload_MP5" + Weight=4.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=55.000000 + SleeveNum=2 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Mp5Medic' + bIsTier2Weapon=True + MeshRef="KF_Wep_MP5.MP5_Trip" + SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.MP5_cmb" + SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" + SelectSoundRef="KF_MP5Snd.WEP_MP5_Foley_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.Mp5Medic_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Mp5Medic" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=45.000000 + FireModeClass(0)=Class'NicePack.NiceMP5MFire' + FireModeClass(1)=Class'NicePack.NiceMP5MAltFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="MP5 sub machine gun. Modified to fire healing darts. Better damage and healing than MP7M with a larger mag." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=55.000000 + Priority=80 + InventoryGroup=3 + GroupOffset=4 + PickupClass=Class'NicePack.NiceMP5MPickup' + PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-6.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceMP5MAttachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="MP5M Medic Gun" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MPickup.uc b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MPickup.uc index e0bd83f..7c6a695 100644 --- a/sources/Weapons/Playable/SMG/MP5M/NiceMP5MPickup.uc +++ b/sources/Weapons/Playable/SMG/MP5M/NiceMP5MPickup.uc @@ -1,4 +1,25 @@ -class NiceMP5MPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=4.000000 cost=250 AmmoCost=10 BuyClipSize=30 PowerValue=30 SpeedValue=85 RangeValue=45 Description="MP5 sub machine gun. Modified to fire healing darts. Better damage and healing than MP7M with a larger mag." ItemName="MP5M Medic Gun" ItemShortName="MP5M" AmmoItemName="9x19mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' EquipmentCategoryID=3 VariantClasses(0)=Class'KFMod.CamoMP5MPickup' InventoryType=Class'NicePack.NiceMP5MMedicGun' PickupMessage="You got the MP5M Medic Gun" PickupSound=Sound'KF_MP5Snd.foley.WEP_MP5_Foley_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups3_Trip.Rifles.Mp5_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceMP5MPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=4.000000 + cost=250 + AmmoCost=10 + BuyClipSize=30 + PowerValue=30 + SpeedValue=85 + RangeValue=45 + Description="MP5 sub machine gun. Modified to fire healing darts. Better damage and healing than MP7M with a larger mag." + ItemName="MP5M Medic Gun" + ItemShortName="MP5M" + AmmoItemName="9x19mm Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + EquipmentCategoryID=3 + VariantClasses(0)=Class'KFMod.CamoMP5MPickup' + InventoryType=Class'NicePack.NiceMP5MMedicGun' + PickupMessage="You got the MP5M Medic Gun" + PickupSound=Sound'KF_MP5Snd.foley.WEP_MP5_Foley_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups3_Trip.Rifles.Mp5_Pickup' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceDamTypeMP7M.uc b/sources/Weapons/Playable/SMG/MP7M/NiceDamTypeMP7M.uc index 54216be..bf26e34 100644 --- a/sources/Weapons/Playable/SMG/MP7M/NiceDamTypeMP7M.uc +++ b/sources/Weapons/Playable/SMG/MP7M/NiceDamTypeMP7M.uc @@ -1,5 +1,9 @@ -class NiceDamTypeMP7M extends NiceDamTypeMedicBullet - abstract; -defaultproperties -{ bPenetrationHSOnly=True MaxPenetrations=1 HeadShotDamageMult=2.250000 WeaponClass=Class'NicePack.NiceMP7MMedicGun' -} +class NiceDamTypeMP7M extends NiceDamTypeMedicBullet + abstract; +defaultproperties +{ + bPenetrationHSOnly=True + MaxPenetrations=1 + HeadShotDamageMult=2.250000 + WeaponClass=Class'NicePack.NiceMP7MMedicGun' +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceDamTypeMP7MDart.uc b/sources/Weapons/Playable/SMG/MP7M/NiceDamTypeMP7MDart.uc index e3c049c..f06d856 100644 --- a/sources/Weapons/Playable/SMG/MP7M/NiceDamTypeMP7MDart.uc +++ b/sources/Weapons/Playable/SMG/MP7M/NiceDamTypeMP7MDart.uc @@ -1,5 +1,7 @@ -class NiceDamTypeMP7MDart extends NiceDamTypeMedicDart - abstract; -defaultproperties -{ HeadShotDamageMult=3.000000 WeaponClass=Class'NicePack.NiceMP7MMedicGun' -} +class NiceDamTypeMP7MDart extends NiceDamTypeMedicDart + abstract; +defaultproperties +{ + HeadShotDamageMult=3.000000 + WeaponClass=Class'NicePack.NiceMP7MMedicGun' +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAltFire.uc b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAltFire.uc index 82e4a30..e9dd0df 100644 --- a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAltFire.uc +++ b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAltFire.uc @@ -1,4 +1,6 @@ -class NiceMP7MAltFire extends NiceMedicDartFire; -defaultproperties -{ DamageType=Class'NicePack.NiceDamTypeMP7MDart' AmmoPerFire=35 -} +class NiceMP7MAltFire extends NiceMedicDartFire; +defaultproperties +{ + DamageType=Class'NicePack.NiceDamTypeMP7MDart' + AmmoPerFire=35 +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAmmo.uc b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAmmo.uc index 7ddb7ba..8bc1bd8 100644 --- a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAmmo.uc +++ b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAmmo.uc @@ -1,4 +1,11 @@ -class NiceMP7MAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceMP7MPickup' MaxAmmo=400 InitialAmount=100 PickupClass=Class'NicePack.NiceMP7MAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="MP7M bullets" -} +class NiceMP7MAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceMP7MPickup' + MaxAmmo=400 + InitialAmount=100 + PickupClass=Class'NicePack.NiceMP7MAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="MP7M bullets" +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAmmoPickup.uc b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAmmoPickup.uc index c66870f..4ec4879 100644 --- a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAmmoPickup.uc +++ b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceMP7MAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=40 InventoryType=Class'NicePack.NiceMP7MAmmo' PickupMessage="Rounds 4.6x30mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceMP7MAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=40 + InventoryType=Class'NicePack.NiceMP7MAmmo' + PickupMessage="Rounds 4.6x30mm" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAttachment.uc b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAttachment.uc index d64dbe1..398add6 100644 --- a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAttachment.uc +++ b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MAttachment.uc @@ -1,4 +1,57 @@ -class NiceMP7MAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_MP7" MovementAnims(1)="JogB_MP7" MovementAnims(2)="JogL_MP7" MovementAnims(3)="JogR_MP7" TurnLeftAnim="TurnL_MP7" TurnRightAnim="TurnR_MP7" CrouchAnims(0)="CHWalkF_MP7" CrouchAnims(1)="CHWalkB_MP7" CrouchAnims(2)="CHWalkL_MP7" CrouchAnims(3)="CHWalkR_MP7" WalkAnims(0)="WalkF_MP7" WalkAnims(1)="WalkB_MP7" WalkAnims(2)="WalkL_MP7" WalkAnims(3)="WalkR_MP7" CrouchTurnRightAnim="CH_TurnR_MP7" CrouchTurnLeftAnim="CH_TurnL_MP7" IdleCrouchAnim="CHIdle_MP7" IdleWeaponAnim="Idle_MP7" IdleRestAnim="Idle_MP7" IdleChatAnim="Idle_MP7" IdleHeavyAnim="Idle_MP7" IdleRifleAnim="Idle_MP7" FireAnims(0)="Fire_MP7" FireAnims(1)="Fire_MP7" FireAnims(2)="Fire_MP7" FireAnims(3)="Fire_MP7" FireAltAnims(0)="Fire_MP7" FireAltAnims(1)="Fire_MP7" FireAltAnims(2)="Fire_MP7" FireAltAnims(3)="Fire_MP7" FireCrouchAnims(0)="CHFire_MP7" FireCrouchAnims(1)="CHFire_MP7" FireCrouchAnims(2)="CHFire_MP7" FireCrouchAnims(3)="CHFire_MP7" FireCrouchAltAnims(0)="CHFire_MP7" FireCrouchAltAnims(1)="CHFire_MP7" FireCrouchAltAnims(2)="CHFire_MP7" FireCrouchAltAnims(3)="CHFire_MP7" HitAnims(0)="HitF_MP7" HitAnims(1)="HitB_MP7" HitAnims(2)="HitL_MP7" HitAnims(3)="HitR_MP7" PostFireBlendStandAnim="Blend_MP7" PostFireBlendCrouchAnim="CHBlend_MP7" MeshRef="KF_Weapons3rd2_Trip.mp7_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceMP7MAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + MovementAnims(0)="JogF_MP7" + MovementAnims(1)="JogB_MP7" + MovementAnims(2)="JogL_MP7" + MovementAnims(3)="JogR_MP7" + TurnLeftAnim="TurnL_MP7" + TurnRightAnim="TurnR_MP7" + CrouchAnims(0)="CHWalkF_MP7" + CrouchAnims(1)="CHWalkB_MP7" + CrouchAnims(2)="CHWalkL_MP7" + CrouchAnims(3)="CHWalkR_MP7" + WalkAnims(0)="WalkF_MP7" + WalkAnims(1)="WalkB_MP7" + WalkAnims(2)="WalkL_MP7" + WalkAnims(3)="WalkR_MP7" + CrouchTurnRightAnim="CH_TurnR_MP7" + CrouchTurnLeftAnim="CH_TurnL_MP7" + IdleCrouchAnim="CHIdle_MP7" + IdleWeaponAnim="Idle_MP7" + IdleRestAnim="Idle_MP7" + IdleChatAnim="Idle_MP7" + IdleHeavyAnim="Idle_MP7" + IdleRifleAnim="Idle_MP7" + FireAnims(0)="Fire_MP7" + FireAnims(1)="Fire_MP7" + FireAnims(2)="Fire_MP7" + FireAnims(3)="Fire_MP7" + FireAltAnims(0)="Fire_MP7" + FireAltAnims(1)="Fire_MP7" + FireAltAnims(2)="Fire_MP7" + FireAltAnims(3)="Fire_MP7" + FireCrouchAnims(0)="CHFire_MP7" + FireCrouchAnims(1)="CHFire_MP7" + FireCrouchAnims(2)="CHFire_MP7" + FireCrouchAnims(3)="CHFire_MP7" + FireCrouchAltAnims(0)="CHFire_MP7" + FireCrouchAltAnims(1)="CHFire_MP7" + FireCrouchAltAnims(2)="CHFire_MP7" + FireCrouchAltAnims(3)="CHFire_MP7" + HitAnims(0)="HitF_MP7" + HitAnims(1)="HitB_MP7" + HitAnims(2)="HitL_MP7" + HitAnims(3)="HitR_MP7" + PostFireBlendStandAnim="Blend_MP7" + PostFireBlendCrouchAnim="CHBlend_MP7" + MeshRef="KF_Weapons3rd2_Trip.mp7_3rd" + WeaponAmbientScale=2.000000 + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MFire.uc b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MFire.uc index 0365294..4aacdd0 100644 --- a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MFire.uc +++ b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MFire.uc @@ -1,4 +1,30 @@ -class NiceMP7MFire extends NiceHighROFFire; -defaultproperties -{ FireEndSoundRef="KF_MP7Snd.MP7_tail" FireEndStereoSoundRef="KF_MP7Snd.MP7_tailST" AmbientFireSoundRef="KF_MP7Snd.MP7_FireLoop" ProjectileSpeed=36750.000000 RecoilRate=0.060000 maxVerticalRecoilAngle=70 maxHorizontalRecoilAngle=35 RecoilVelocityScale=0.000000 ShellEjectClass=Class'ROEffects.KFShellEjectMP' ShellEjectBoneName="Shell_eject" NoAmmoSoundRef="KF_MP7Snd.MP7_DryFire" DamageType=Class'NicePack.NiceDamTypeMP7M' DamageMin=20 DamageMax=20 Momentum=5500.000000 FireRate=0.063000 AmmoClass=Class'NicePack.NiceMP7MAmmo' ShakeRotMag=(X=25.000000,Y=25.000000,Z=125.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=3.000000 ShakeOffsetMag=(X=4.000000,Y=2.500000,Z=5.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.250000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' Spread=0.012000 SpreadStyle=SS_Random -} +class NiceMP7MFire extends NiceHighROFFire; +defaultproperties +{ + FireEndSoundRef="KF_MP7Snd.MP7_tail" + FireEndStereoSoundRef="KF_MP7Snd.MP7_tailST" + AmbientFireSoundRef="KF_MP7Snd.MP7_FireLoop" + ProjectileSpeed=36750.000000 + RecoilRate=0.060000 + maxVerticalRecoilAngle=70 + maxHorizontalRecoilAngle=35 + RecoilVelocityScale=0.000000 + ShellEjectClass=Class'ROEffects.KFShellEjectMP' + ShellEjectBoneName="Shell_eject" + NoAmmoSoundRef="KF_MP7Snd.MP7_DryFire" + DamageType=Class'NicePack.NiceDamTypeMP7M' + DamageMin=20 + DamageMax=20 + Momentum=5500.000000 + FireRate=0.063000 + AmmoClass=Class'NicePack.NiceMP7MAmmo' + ShakeRotMag=(X=25.000000,Y=25.000000,Z=125.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeRotTime=3.000000 + ShakeOffsetMag=(X=4.000000,Y=2.500000,Z=5.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.250000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' + Spread=0.012000 + SpreadStyle=SS_Random +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MMedicGun.uc b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MMedicGun.uc index 461a713..ac490b1 100644 --- a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MMedicGun.uc +++ b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MMedicGun.uc @@ -1,4 +1,50 @@ -class NiceMP7MMedicGun extends NiceMedicGun; -defaultproperties -{ medicChargeRegenRate=7.000000 reloadPreEndFrame=0.074000 reloadEndFrame=0.574000 reloadChargeEndFrame=0.809000 reloadMagStartFrame=0.117000 reloadChargeStartFrame=0.681000 MagCapacity=40 ReloadRate=3.166000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_MP7" Weight=3.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_MP7m' bIsTier2Weapon=True MeshRef="KF_Weapons2_Trip.MP7_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.Special.MP_7_cmb" SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" SelectSoundRef="KF_MP7Snd.MP7_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.MP7m_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.MP7m" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceMP7MFire' FireModeClass(1)=Class'NicePack.NiceMP7MAltFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="An advanced prototype submachine gun. Modified to fire healing darts." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=90 InventoryGroup=3 GroupOffset=5 PickupClass=Class'NicePack.NiceMP7MPickup' PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-6.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceMP7MAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="MP7M Medic Gun" TransientSoundVolume=1.250000 -} +class NiceMP7MMedicGun extends NiceMedicGun; +defaultproperties +{ + medicChargeRegenRate=7.000000 + reloadPreEndFrame=0.074000 + reloadEndFrame=0.574000 + reloadChargeEndFrame=0.809000 + reloadMagStartFrame=0.117000 + reloadChargeStartFrame=0.681000 + MagCapacity=40 + ReloadRate=3.166000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_MP7" + Weight=3.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=55.000000 + SleeveNum=2 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_MP7m' + bIsTier2Weapon=True + MeshRef="KF_Weapons2_Trip.MP7_Trip" + SkinRefs(0)="KF_Weapons2_Trip_T.Special.MP_7_cmb" + SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" + SelectSoundRef="KF_MP7Snd.MP7_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.MP7m_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.MP7m" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=45.000000 + FireModeClass(0)=Class'NicePack.NiceMP7MFire' + FireModeClass(1)=Class'NicePack.NiceMP7MAltFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="An advanced prototype submachine gun. Modified to fire healing darts." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=55.000000 + Priority=90 + InventoryGroup=3 + GroupOffset=5 + PickupClass=Class'NicePack.NiceMP7MPickup' + PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-6.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceMP7MAttachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="MP7M Medic Gun" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MPickup.uc b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MPickup.uc index 89e8184..7c02564 100644 --- a/sources/Weapons/Playable/SMG/MP7M/NiceMP7MPickup.uc +++ b/sources/Weapons/Playable/SMG/MP7M/NiceMP7MPickup.uc @@ -1,4 +1,24 @@ -class NiceMP7MPickup extends NiceWeaponPickup; -defaultproperties -{ bBackupWeapon=True Weight=3.000000 cost=200 BuyClipSize=40 PowerValue=22 SpeedValue=95 RangeValue=45 Description="Prototype sub machine gun. Modified to fire healing darts." ItemName="MP7M Medic Gun" ItemShortName="MP7M" AmmoItemName="4.6x30mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceMP7MMedicGun' PickupMessage="You got the MP7M Medic Gun" PickupSound=Sound'KF_MP7Snd.MP7_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups2_Trip.Supers.MP7_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 +class NiceMP7MPickup extends NiceWeaponPickup; +defaultproperties +{ + bBackupWeapon=True + Weight=3.000000 + cost=200 + BuyClipSize=40 + PowerValue=22 + SpeedValue=95 + RangeValue=45 + Description="Prototype sub machine gun. Modified to fire healing darts." + ItemName="MP7M Medic Gun" + ItemShortName="MP7M" + AmmoItemName="4.6x30mm Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + EquipmentCategoryID=3 + InventoryType=Class'NicePack.NiceMP7MMedicGun' + PickupMessage="You got the MP7M Medic Gun" + PickupSound=Sound'KF_MP7Snd.MP7_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups2_Trip.Supers.MP7_Pickup' + CollisionRadius=25.000000 + CollisionHeight=5.000000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Ammo.uc b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Ammo.uc index 9c28ccb..e14a0b2 100644 --- a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Ammo.uc +++ b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Ammo.uc @@ -1,5 +1,12 @@ -class NiceAA12Ammo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceAA12Pickup' AmmoPickupAmount=20 MaxAmmo=100 InitialAmount=25 PickupClass=Class'NicePack.NiceAA12AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) -} +class NiceAA12Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceAA12Pickup' + AmmoPickupAmount=20 + MaxAmmo=100 + InitialAmount=25 + PickupClass=Class'NicePack.NiceAA12AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12AmmoPickup.uc b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12AmmoPickup.uc index 351a44d..e1c2ea1 100644 --- a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12AmmoPickup.uc +++ b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12AmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceAA12AmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=20 InventoryType=Class'NicePack.NiceAA12Ammo' PickupMessage="12-Gauge Drum" StaticMesh=None -} +class NiceAA12AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=20 + InventoryType=Class'NicePack.NiceAA12Ammo' + PickupMessage="12-Gauge Drum" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Attachment.uc b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Attachment.uc index 3a5b35c..5491386 100644 --- a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Attachment.uc +++ b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Attachment.uc @@ -1,4 +1,51 @@ -class NiceAA12Attachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' MovementAnims(0)="JogF_AA12" MovementAnims(1)="JogB_AA12" MovementAnims(2)="JogL_AA12" MovementAnims(3)="JogR_AA12" TurnLeftAnim="TurnL_AA12" TurnRightAnim="TurnR_AA12" CrouchAnims(0)="CHWalkF_AA12" CrouchAnims(1)="CHWalkB_AA12" CrouchAnims(2)="CHWalkL_AA12" CrouchAnims(3)="CHWalkR_AA12" WalkAnims(0)="WalkF_AA12" WalkAnims(1)="WalkB_AA12" WalkAnims(2)="WalkL_AA12" WalkAnims(3)="WalkR_AA12" CrouchTurnRightAnim="CH_TurnR_AA12" CrouchTurnLeftAnim="CH_TurnL_AA12" IdleCrouchAnim="CHIdle_AA12" IdleWeaponAnim="Idle_AA12" IdleRestAnim="Idle_AA12" IdleChatAnim="Idle_AA12" IdleHeavyAnim="Idle_AA12" IdleRifleAnim="Idle_AA12" FireAnims(0)="Fire_AA12" FireAnims(1)="Fire_AA12" FireAnims(2)="Fire_AA12" FireAnims(3)="Fire_AA12" FireAltAnims(0)="Fire_AA12" FireAltAnims(1)="Fire_AA12" FireAltAnims(2)="Fire_AA12" FireAltAnims(3)="Fire_AA12" FireCrouchAnims(0)="CHFire_AA12" FireCrouchAnims(1)="CHFire_AA12" FireCrouchAnims(2)="CHFire_AA12" FireCrouchAnims(3)="CHFire_AA12" FireCrouchAltAnims(0)="CHFire_AA12" FireCrouchAltAnims(1)="CHFire_AA12" FireCrouchAltAnims(2)="CHFire_AA12" FireCrouchAltAnims(3)="CHFire_AA12" HitAnims(0)="HitF_AA12" HitAnims(1)="HitB_AA12" HitAnims(2)="HitL_AA12" HitAnims(3)="HitR_AA12" PostFireBlendStandAnim="Blend_AA12" PostFireBlendCrouchAnim="CHBlend_AA12" MeshRef="KF_Weapons3rd2_Trip.AA12_3rd" -} +class NiceAA12Attachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' + mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' + MovementAnims(0)="JogF_AA12" + MovementAnims(1)="JogB_AA12" + MovementAnims(2)="JogL_AA12" + MovementAnims(3)="JogR_AA12" + TurnLeftAnim="TurnL_AA12" + TurnRightAnim="TurnR_AA12" + CrouchAnims(0)="CHWalkF_AA12" + CrouchAnims(1)="CHWalkB_AA12" + CrouchAnims(2)="CHWalkL_AA12" + CrouchAnims(3)="CHWalkR_AA12" + WalkAnims(0)="WalkF_AA12" + WalkAnims(1)="WalkB_AA12" + WalkAnims(2)="WalkL_AA12" + WalkAnims(3)="WalkR_AA12" + CrouchTurnRightAnim="CH_TurnR_AA12" + CrouchTurnLeftAnim="CH_TurnL_AA12" + IdleCrouchAnim="CHIdle_AA12" + IdleWeaponAnim="Idle_AA12" + IdleRestAnim="Idle_AA12" + IdleChatAnim="Idle_AA12" + IdleHeavyAnim="Idle_AA12" + IdleRifleAnim="Idle_AA12" + FireAnims(0)="Fire_AA12" + FireAnims(1)="Fire_AA12" + FireAnims(2)="Fire_AA12" + FireAnims(3)="Fire_AA12" + FireAltAnims(0)="Fire_AA12" + FireAltAnims(1)="Fire_AA12" + FireAltAnims(2)="Fire_AA12" + FireAltAnims(3)="Fire_AA12" + FireCrouchAnims(0)="CHFire_AA12" + FireCrouchAnims(1)="CHFire_AA12" + FireCrouchAnims(2)="CHFire_AA12" + FireCrouchAnims(3)="CHFire_AA12" + FireCrouchAltAnims(0)="CHFire_AA12" + FireCrouchAltAnims(1)="CHFire_AA12" + FireCrouchAltAnims(2)="CHFire_AA12" + FireCrouchAltAnims(3)="CHFire_AA12" + HitAnims(0)="HitF_AA12" + HitAnims(1)="HitB_AA12" + HitAnims(2)="HitL_AA12" + HitAnims(3)="HitR_AA12" + PostFireBlendStandAnim="Blend_AA12" + PostFireBlendCrouchAnim="CHBlend_AA12" + MeshRef="KF_Weapons3rd2_Trip.AA12_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12AutoShotgun.uc b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12AutoShotgun.uc index 8aae5a0..d3825bc 100644 --- a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12AutoShotgun.uc +++ b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12AutoShotgun.uc @@ -1,15 +1,57 @@ -class NiceAA12AutoShotgun extends NiceWeapon; - -// Use alt fire to switch fire modes -simulated function AltFire(float F){ - DoToggle(); -} - -exec function SwitchModes(){ - DoToggle(); -} - -defaultproperties -{ reloadPreEndFrame=0.473000 reloadEndFrame=0.828000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.591000 reloadChargeStartFrame=-1.000000 MagCapacity=20 - Weight=6.000000 ReloadRate=3.133000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_AA12" bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_AA12' bIsTier3Weapon=True MeshRef="KF_Weapons2_Trip.AA12_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.Special.AA12_cmb" SelectSoundRef="KF_AA12Snd.AA12_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.AA12_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.AA12" PlayerIronSightFOV=80.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceAA12Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="An advanced fully automatic shotgun." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=200 InventoryGroup=4 GroupOffset=10 PickupClass=Class'NicePack.NiceAA12Pickup' PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-2.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceAA12Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="AA12 Shotgun" TransientSoundVolume=1.250000 +class NiceAA12AutoShotgun extends NiceWeapon; + +// Use alt fire to switch fire modes +simulated function AltFire(float F){ + DoToggle(); +} + +exec function SwitchModes(){ + DoToggle(); +} + +defaultproperties +{ + reloadPreEndFrame=0.473000 + reloadEndFrame=0.828000 + reloadChargeEndFrame=-1.000000 + reloadMagStartFrame=0.591000 + reloadChargeStartFrame=-1.000000 + MagCapacity=20 + Weight=6.000000 + ReloadRate=3.133000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_AA12" + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=65.000000 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_AA12' + bIsTier3Weapon=True + MeshRef="KF_Weapons2_Trip.AA12_Trip" + SkinRefs(0)="KF_Weapons2_Trip_T.Special.AA12_cmb" + SelectSoundRef="KF_AA12Snd.AA12_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.AA12_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.AA12" + PlayerIronSightFOV=80.000000 + ZoomedDisplayFOV=45.000000 + FireModeClass(0)=Class'NicePack.NiceAA12Fire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="An advanced fully automatic shotgun." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=65.000000 + Priority=200 + InventoryGroup=4 + GroupOffset=10 + PickupClass=Class'NicePack.NiceAA12Pickup' + PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-2.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceAA12Attachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="AA12 Shotgun" + TransientSoundVolume=1.250000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Fire.uc b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Fire.uc index 5d066d0..ef2374d 100644 --- a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Fire.uc +++ b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Fire.uc @@ -1,4 +1,25 @@ -class NiceAA12Fire extends NiceShotgunFire; -defaultproperties -{ ProjPerFire=5 KickMomentum=(X=-35.000000,Z=5.000000) maxVerticalRecoilAngle=1000 maxHorizontalRecoilAngle=500 ShellEjectClass=Class'ROEffects.KFShellEjectShotty' ShellEjectBoneName="Shell_eject" FireSoundRef="KF_AA12Snd.AA12_Fire" StereoFireSoundRef="KF_AA12Snd.AA12_FireST" NoAmmoSoundRef="KF_AA12Snd.AA12_DryFire" DamageType=Class'NicePack.NiceDamTypeAA12Shotgun' DamageMax=48 Momentum=60000.000000 bWaitForRelease=False FireAnimRate=1.000000 FireRate=0.200000 AmmoClass=Class'NicePack.NiceAA12Ammo' ShakeRotMag=(Z=250.000000) ShakeRotTime=3.000000 ShakeOffsetMag=(Z=6.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.250000 -} +class NiceAA12Fire extends NiceShotgunFire; +defaultproperties +{ + ProjPerFire=5 + KickMomentum=(X=-35.000000,Z=5.000000) + maxVerticalRecoilAngle=1000 + maxHorizontalRecoilAngle=500 + ShellEjectClass=Class'ROEffects.KFShellEjectShotty' + ShellEjectBoneName="Shell_eject" + FireSoundRef="KF_AA12Snd.AA12_Fire" + StereoFireSoundRef="KF_AA12Snd.AA12_FireST" + NoAmmoSoundRef="KF_AA12Snd.AA12_DryFire" + DamageType=Class'NicePack.NiceDamTypeAA12Shotgun' + DamageMax=48 + Momentum=60000.000000 + bWaitForRelease=False + FireAnimRate=1.000000 + FireRate=0.200000 + AmmoClass=Class'NicePack.NiceAA12Ammo' + ShakeRotMag=(Z=250.000000) + ShakeRotTime=3.000000 + ShakeOffsetMag=(Z=6.000000) + ShakeOffsetTime=1.250000 + BotRefireRate=0.250000 +} diff --git a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Pickup.uc b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Pickup.uc index 279fb47..c5f2dfe 100644 --- a/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Pickup.uc +++ b/sources/Weapons/Playable/Shotguns/AA12/NiceAA12Pickup.uc @@ -1,4 +1,24 @@ -class NiceAA12Pickup extends NiceWeaponPickup; -defaultproperties -{ cost=1250 AmmoCost=80 BuyClipSize=20 PowerValue=85 SpeedValue=65 RangeValue=20 Description="An advanced fully automatic shotgun." ItemName="AA12 Shotgun" ItemShortName="AA12 Shotgun" AmmoItemName="12-gauge drum" CorrespondingPerkIndex=1 EquipmentCategoryID=3 VariantClasses(0)=Class'KFMod.GoldenAA12Pickup' InventoryType=Class'NicePack.NiceAA12AutoShotgun' PickupMessage="You got the AA12 auto shotgun." PickupSound=Sound'KF_AA12Snd.AA12_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups2_Trip.Shotguns.AA12_Pickup' CollisionRadius=35.000000 CollisionHeight=5.000000 +class NiceAA12Pickup extends NiceWeaponPickup; +defaultproperties +{ + cost=1250 + AmmoCost=80 + BuyClipSize=20 + PowerValue=85 + SpeedValue=65 + RangeValue=20 + Description="An advanced fully automatic shotgun." + ItemName="AA12 Shotgun" + ItemShortName="AA12 Shotgun" + AmmoItemName="12-gauge drum" + CorrespondingPerkIndex=1 + EquipmentCategoryID=3 + VariantClasses(0)=Class'KFMod.GoldenAA12Pickup' + InventoryType=Class'NicePack.NiceAA12AutoShotgun' + PickupMessage="You got the AA12 auto shotgun." + PickupSound=Sound'KF_AA12Snd.AA12_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups2_Trip.Shotguns.AA12_Pickup' + CollisionRadius=35.000000 + CollisionHeight=5.000000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/AA12/NiceDamTypeAA12Shotgun.uc b/sources/Weapons/Playable/Shotguns/AA12/NiceDamTypeAA12Shotgun.uc index bf5e4ce..be9e302 100644 --- a/sources/Weapons/Playable/Shotguns/AA12/NiceDamTypeAA12Shotgun.uc +++ b/sources/Weapons/Playable/Shotguns/AA12/NiceDamTypeAA12Shotgun.uc @@ -1,5 +1,19 @@ -class NiceDamTypeAA12Shotgun extends NiceDamageTypeVetEnforcer - abstract; -defaultproperties -{ MaxPenetrations=5 PenDmgReduction=0.900000 bIsPowerWeapon=True WeaponClass=Class'NicePack.NiceAA12AutoShotgun' DeathString="%k killed %o (AA12 Shotgun)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 +class NiceDamTypeAA12Shotgun extends NiceDamageTypeVetEnforcer + abstract; +defaultproperties +{ + MaxPenetrations=5 + PenDmgReduction=0.900000 + bIsPowerWeapon=True + WeaponClass=Class'NicePack.NiceAA12AutoShotgun' + DeathString="%k killed %o (AA12 Shotgun)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + FlashFog=(X=600.000000) + KDamageImpulse=10000.000000 + KDeathVel=300.000000 + KDeathUpKick=100.000000 + VehicleDamageScaling=0.700000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAmmo.uc b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAmmo.uc index 0fcfe55..016c1c3 100644 --- a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAmmo.uc +++ b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAmmo.uc @@ -1,4 +1,11 @@ -class NiceBenelliAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceBenelliPickup' AmmoPickupAmount=6 MaxAmmo=60 InitialAmount=15 PickupClass=Class'NicePack.NiceBenelliAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) -} +class NiceBenelliAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceBenelliPickup' + AmmoPickupAmount=6 + MaxAmmo=60 + InitialAmount=15 + PickupClass=Class'NicePack.NiceBenelliAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAmmoPickup.uc b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAmmoPickup.uc index 014b44d..4f7c0cf 100644 --- a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAmmoPickup.uc +++ b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceBenelliAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=6 InventoryType=Class'NicePack.NiceBenelliAmmo' PickupMessage="12-Gauge Shells" StaticMesh=None -} +class NiceBenelliAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=6 + InventoryType=Class'NicePack.NiceBenelliAmmo' + PickupMessage="12-Gauge Shells" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAttachment.uc b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAttachment.uc index d335d45..d10e04e 100644 --- a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAttachment.uc +++ b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliAttachment.uc @@ -1,4 +1,21 @@ -class NiceBenelliAttachment extends NiceShotgunAttachment; -defaultproperties -{ FireAnims(0)="Fire_Benelli" FireAnims(1)="Fire_Benelli" FireAnims(2)="Fire_Benelli" FireAnims(3)="Fire_Benelli" FireAltAnims(0)="Fire_Benelli" FireAltAnims(1)="Fire_Benelli" FireAltAnims(2)="Fire_Benelli" FireAltAnims(3)="Fire_Benelli" FireCrouchAnims(0)="CHFire_Benelli" FireCrouchAnims(1)="CHFire_Benelli" FireCrouchAnims(2)="CHFire_Benelli" FireCrouchAnims(3)="CHFire_Benelli" FireCrouchAltAnims(0)="CHFire_Benelli" FireCrouchAltAnims(1)="CHFire_Benelli" FireCrouchAltAnims(2)="CHFire_Benelli" FireCrouchAltAnims(3)="CHFire_Benelli" MeshRef="KF_Weapons3rd3_Trip.Benelli_3rd" -} +class NiceBenelliAttachment extends NiceShotgunAttachment; +defaultproperties +{ + FireAnims(0)="Fire_Benelli" + FireAnims(1)="Fire_Benelli" + FireAnims(2)="Fire_Benelli" + FireAnims(3)="Fire_Benelli" + FireAltAnims(0)="Fire_Benelli" + FireAltAnims(1)="Fire_Benelli" + FireAltAnims(2)="Fire_Benelli" + FireAltAnims(3)="Fire_Benelli" + FireCrouchAnims(0)="CHFire_Benelli" + FireCrouchAnims(1)="CHFire_Benelli" + FireCrouchAnims(2)="CHFire_Benelli" + FireCrouchAnims(3)="CHFire_Benelli" + FireCrouchAltAnims(0)="CHFire_Benelli" + FireCrouchAltAnims(1)="CHFire_Benelli" + FireCrouchAltAnims(2)="CHFire_Benelli" + FireCrouchAltAnims(3)="CHFire_Benelli" + MeshRef="KF_Weapons3rd3_Trip.Benelli_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliFire.uc b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliFire.uc index 4646c37..d677c26 100644 --- a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliFire.uc +++ b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliFire.uc @@ -1,4 +1,12 @@ -class NiceBenelliFire extends NiceShotgunFire; -defaultproperties -{ KickMomentum=(X=-45.000000,Z=10.000000) ShellEjectClass=Class'ROEffects.KFShellEjectBenelli' ShellEjectBoneName="Shell_eject" DamageType=Class'NicePack.NiceDamTypeBenelli' FireAnimRate=1.000000 FireRate=0.200000 AmmoClass=Class'NicePack.NiceBenelliAmmo' BotRefireRate=0.200000 -} +class NiceBenelliFire extends NiceShotgunFire; +defaultproperties +{ + KickMomentum=(X=-45.000000,Z=10.000000) + ShellEjectClass=Class'ROEffects.KFShellEjectBenelli' + ShellEjectBoneName="Shell_eject" + DamageType=Class'NicePack.NiceDamTypeBenelli' + FireAnimRate=1.000000 + FireRate=0.200000 + AmmoClass=Class'NicePack.NiceBenelliAmmo' + BotRefireRate=0.200000 +} diff --git a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliPickup.uc b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliPickup.uc index ccfeeb0..ee088b6 100644 --- a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliPickup.uc +++ b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliPickup.uc @@ -1,4 +1,24 @@ -class NiceBenelliPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=8.000000 cost=500 BuyClipSize=6 PowerValue=70 SpeedValue=60 RangeValue=15 Description="A military tactical shotgun with semi automatic fire capability. Holds up to 6 shells. " ItemName="Benelli shotgun" ItemShortName="Benelli shotgun" AmmoItemName="12-gauge shells" CorrespondingPerkIndex=1 EquipmentCategoryID=2 VariantClasses(0)=Class'KFMod.GoldenBenelliPickup' InventoryType=Class'NicePack.NiceBenelliShotgun' PickupMessage="You got the Benelli shotgun" PickupSound=Sound'KF_M4ShotgunSnd.foley.WEP_Benelli_Foley_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups3_Trip.Rifles.Benelli_Pickup' CollisionRadius=35.000000 CollisionHeight=5.000000 +class NiceBenelliPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=8.000000 + cost=500 + BuyClipSize=6 + PowerValue=70 + SpeedValue=60 + RangeValue=15 + Description="A military tactical shotgun with semi automatic fire capability. Holds up to 6 shells. " + ItemName="Benelli shotgun" + ItemShortName="Benelli shotgun" + AmmoItemName="12-gauge shells" + CorrespondingPerkIndex=1 + EquipmentCategoryID=2 + VariantClasses(0)=Class'KFMod.GoldenBenelliPickup' + InventoryType=Class'NicePack.NiceBenelliShotgun' + PickupMessage="You got the Benelli shotgun" + PickupSound=Sound'KF_M4ShotgunSnd.foley.WEP_Benelli_Foley_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups3_Trip.Rifles.Benelli_Pickup' + CollisionRadius=35.000000 + CollisionHeight=5.000000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliShotgun.uc b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliShotgun.uc index 35a2648..14895e5 100644 --- a/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliShotgun.uc +++ b/sources/Weapons/Playable/Shotguns/Benelli/NiceBenelliShotgun.uc @@ -1,8 +1,52 @@ -class NiceBenelliShotgun extends NiceWeapon; -simulated function fillSubReloadStages(){ - // Loading 6 shells during 174 frames tops, with first shell loaded at frame 22, with 24 frames between load moments - generateReloadStages(6, 174, 22, 24); -} -defaultproperties -{ bChangeClipIcon=True hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' reloadType=RTYPE_SINGLE FirstPersonFlashlightOffset=(X=-25.000000,Y=-18.000000,Z=8.000000) MagCapacity=6 ReloadRate=0.750000 ReloadAnim="Reload" ReloadAnimRate=1.200000 bHoldToReload=True WeaponReloadAnim="Reload_Shotgun" Weight=5.000000 bTorchEnabled=True bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 SleeveNum=2 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Beneli' bIsTier2Weapon=True MeshRef="KF_Wep_Benelli.Benelli_Trip" SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.Benelli_M4_cmb" SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" SelectSoundRef="KF_M4ShotgunSnd.WEP_Benelli_Foley_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.Beneli_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Beneli" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceBenelliFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" AIRating=0.600000 CurrentRating=0.600000 bShowChargingBar=True Description="A military tactical shotgun with semi automatic fire capability. Holds up to 6 shells. " DisplayFOV=65.000000 Priority=170 InventoryGroup=3 GroupOffset=9 PickupClass=Class'NicePack.NiceBenelliPickup' PlayerViewOffset=(X=20.000000,Y=18.750000,Z=-7.500000) BobDamping=7.000000 AttachmentClass=Class'NicePack.NiceBenelliAttachment' IconCoords=(X1=169,Y1=172,X2=245,Y2=208) ItemName="Benelli shotgun" TransientSoundVolume=1.000000 -} +class NiceBenelliShotgun extends NiceWeapon; +simulated function fillSubReloadStages(){ + // Loading 6 shells during 174 frames tops, with first shell loaded at frame 22, with 24 frames between load moments + generateReloadStages(6, 174, 22, 24); +} +defaultproperties +{ + bChangeClipIcon=True + hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' + reloadType=RTYPE_SINGLE + FirstPersonFlashlightOffset=(X=-25.000000,Y=-18.000000,Z=8.000000) + MagCapacity=6 + ReloadRate=0.750000 + ReloadAnim="Reload" + ReloadAnimRate=1.200000 + bHoldToReload=True + WeaponReloadAnim="Reload_Shotgun" + Weight=5.000000 + bTorchEnabled=True + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=65.000000 + SleeveNum=2 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Beneli' + bIsTier2Weapon=True + MeshRef="KF_Wep_Benelli.Benelli_Trip" + SkinRefs(0)="KF_Weapons4_Trip_T.Weapons.Benelli_M4_cmb" + SkinRefs(1)="KF_Weapons2_Trip_T.Special.Aimpoint_sight_shdr" + SelectSoundRef="KF_M4ShotgunSnd.WEP_Benelli_Foley_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.Beneli_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Beneli" + PlayerIronSightFOV=70.000000 + ZoomedDisplayFOV=40.000000 + FireModeClass(0)=Class'NicePack.NiceBenelliFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + AIRating=0.600000 + CurrentRating=0.600000 + bShowChargingBar=True + Description="A military tactical shotgun with semi automatic fire capability. Holds up to 6 shells. " + DisplayFOV=65.000000 + Priority=170 + InventoryGroup=3 + GroupOffset=9 + PickupClass=Class'NicePack.NiceBenelliPickup' + PlayerViewOffset=(X=20.000000,Y=18.750000,Z=-7.500000) + BobDamping=7.000000 + AttachmentClass=Class'NicePack.NiceBenelliAttachment' + IconCoords=(X1=169,Y1=172,X2=245,Y2=208) + ItemName="Benelli shotgun" + TransientSoundVolume=1.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/Benelli/NiceDamTypeBenelli.uc b/sources/Weapons/Playable/Shotguns/Benelli/NiceDamTypeBenelli.uc index 24b352d..d43b269 100644 --- a/sources/Weapons/Playable/Shotguns/Benelli/NiceDamTypeBenelli.uc +++ b/sources/Weapons/Playable/Shotguns/Benelli/NiceDamTypeBenelli.uc @@ -1,5 +1,19 @@ -class NiceDamTypeBenelli extends NiceDamageTypeVetEnforcer - abstract; -defaultproperties -{ MaxPenetrations=3 MediumZedPenDmgReduction=1.000000 bIsPowerWeapon=True WeaponClass=Class'NicePack.NiceBenelliShotgun' DeathString="%k killed %o (Benelli Shotgun)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 -} +class NiceDamTypeBenelli extends NiceDamageTypeVetEnforcer + abstract; +defaultproperties +{ + MaxPenetrations=3 + MediumZedPenDmgReduction=1.000000 + bIsPowerWeapon=True + WeaponClass=Class'NicePack.NiceBenelliShotgun' + DeathString="%k killed %o (Benelli Shotgun)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + FlashFog=(X=600.000000) + KDamageImpulse=10000.000000 + KDeathVel=300.000000 + KDeathUpKick=100.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStickAttachment.uc b/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStickAttachment.uc index 4185a16..3aba8c2 100644 --- a/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStickAttachment.uc +++ b/sources/Weapons/Playable/Shotguns/Boomstick/NiceBoomStickAttachment.uc @@ -1,4 +1,51 @@ -class NiceBoomStickAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' MovementAnims(0)="JogF_HuntingShotgun" MovementAnims(1)="JogB_HuntingShotgun" MovementAnims(2)="JogL_HuntingShotgun" MovementAnims(3)="JogR_HuntingShotgun" TurnLeftAnim="TurnL_HuntingShotgun" TurnRightAnim="TurnR_HuntingShotgun" CrouchAnims(0)="CHwalkF_HuntingShotgun" CrouchAnims(1)="CHwalkB_HuntingShotgun" CrouchAnims(2)="CHwalkL_HuntingShotgun" CrouchAnims(3)="CHwalkR_HuntingShotgun" WalkAnims(0)="WalkF_HuntingShotgun" WalkAnims(1)="WalkB_HuntingShotgun" WalkAnims(2)="WalkL_HuntingShotgun" WalkAnims(3)="WalkR_HuntingShotgun" CrouchTurnRightAnim="CH_TurnR_HuntingShotgun" CrouchTurnLeftAnim="CH_TurnL_HuntingShotgun" IdleCrouchAnim="CHIdle_HuntingShotgun" IdleWeaponAnim="Idle_HuntingShotgun" IdleRestAnim="Idle_HuntingShotgun" IdleChatAnim="Idle_HuntingShotgun" IdleHeavyAnim="Idle_HuntingShotgun" IdleRifleAnim="Idle_HuntingShotgun" FireAnims(0)="Fire_HuntingShotgun" FireAnims(1)="Fire_HuntingShotgun" FireAnims(2)="Fire_HuntingShotgun" FireAnims(3)="Fire_HuntingShotgun" FireAltAnims(0)="Fire_HuntingShotgun" FireAltAnims(1)="Fire_HuntingShotgun" FireAltAnims(2)="Fire_HuntingShotgun" FireAltAnims(3)="Fire_HuntingShotgun" FireCrouchAnims(0)="CHFire_HuntingShotgun" FireCrouchAnims(1)="CHFire_HuntingShotgun" FireCrouchAnims(2)="CHFire_HuntingShotgun" FireCrouchAnims(3)="CHFire_HuntingShotgun" FireCrouchAltAnims(0)="CHFire_HuntingShotgun" FireCrouchAltAnims(1)="CHFire_HuntingShotgun" FireCrouchAltAnims(2)="CHFire_HuntingShotgun" FireCrouchAltAnims(3)="CHFire_HuntingShotgun" HitAnims(0)="HitF_HuntingShotgun" HitAnims(1)="HitB_HuntingShotgun" HitAnims(2)="HitL_HuntingShotgun" HitAnims(3)="HitR_HuntingShotgun" PostFireBlendStandAnim="Blend_HuntingShotgun" PostFireBlendCrouchAnim="CHBlend_HuntingShotgun" MeshRef="KF_Weapons3rd_Trip.HuntingShot_3rd" -} +class NiceBoomStickAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' + mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' + MovementAnims(0)="JogF_HuntingShotgun" + MovementAnims(1)="JogB_HuntingShotgun" + MovementAnims(2)="JogL_HuntingShotgun" + MovementAnims(3)="JogR_HuntingShotgun" + TurnLeftAnim="TurnL_HuntingShotgun" + TurnRightAnim="TurnR_HuntingShotgun" + CrouchAnims(0)="CHwalkF_HuntingShotgun" + CrouchAnims(1)="CHwalkB_HuntingShotgun" + CrouchAnims(2)="CHwalkL_HuntingShotgun" + CrouchAnims(3)="CHwalkR_HuntingShotgun" + WalkAnims(0)="WalkF_HuntingShotgun" + WalkAnims(1)="WalkB_HuntingShotgun" + WalkAnims(2)="WalkL_HuntingShotgun" + WalkAnims(3)="WalkR_HuntingShotgun" + CrouchTurnRightAnim="CH_TurnR_HuntingShotgun" + CrouchTurnLeftAnim="CH_TurnL_HuntingShotgun" + IdleCrouchAnim="CHIdle_HuntingShotgun" + IdleWeaponAnim="Idle_HuntingShotgun" + IdleRestAnim="Idle_HuntingShotgun" + IdleChatAnim="Idle_HuntingShotgun" + IdleHeavyAnim="Idle_HuntingShotgun" + IdleRifleAnim="Idle_HuntingShotgun" + FireAnims(0)="Fire_HuntingShotgun" + FireAnims(1)="Fire_HuntingShotgun" + FireAnims(2)="Fire_HuntingShotgun" + FireAnims(3)="Fire_HuntingShotgun" + FireAltAnims(0)="Fire_HuntingShotgun" + FireAltAnims(1)="Fire_HuntingShotgun" + FireAltAnims(2)="Fire_HuntingShotgun" + FireAltAnims(3)="Fire_HuntingShotgun" + FireCrouchAnims(0)="CHFire_HuntingShotgun" + FireCrouchAnims(1)="CHFire_HuntingShotgun" + FireCrouchAnims(2)="CHFire_HuntingShotgun" + FireCrouchAnims(3)="CHFire_HuntingShotgun" + FireCrouchAltAnims(0)="CHFire_HuntingShotgun" + FireCrouchAltAnims(1)="CHFire_HuntingShotgun" + FireCrouchAltAnims(2)="CHFire_HuntingShotgun" + FireCrouchAltAnims(3)="CHFire_HuntingShotgun" + HitAnims(0)="HitF_HuntingShotgun" + HitAnims(1)="HitB_HuntingShotgun" + HitAnims(2)="HitL_HuntingShotgun" + HitAnims(3)="HitR_HuntingShotgun" + PostFireBlendStandAnim="Blend_HuntingShotgun" + PostFireBlendCrouchAnim="CHBlend_HuntingShotgun" + MeshRef="KF_Weapons3rd_Trip.HuntingShot_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/Boomstick/NiceDBShotgunAmmo.uc b/sources/Weapons/Playable/Shotguns/Boomstick/NiceDBShotgunAmmo.uc index f495687..8ae2a41 100644 --- a/sources/Weapons/Playable/Shotguns/Boomstick/NiceDBShotgunAmmo.uc +++ b/sources/Weapons/Playable/Shotguns/Boomstick/NiceDBShotgunAmmo.uc @@ -1,5 +1,13 @@ -class NiceDBShotgunAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceBoomStickPickup' AmmoPickupAmount=6 MaxAmmo=64 InitialAmount=16 PickupClass=Class'NicePack.NiceDBShotgunAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) ItemName="Shotgun Ammo" -} +class NiceDBShotgunAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceBoomStickPickup' + AmmoPickupAmount=6 + MaxAmmo=64 + InitialAmount=16 + PickupClass=Class'NicePack.NiceDBShotgunAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=451,Y1=445,X2=510,Y2=500) + ItemName="Shotgun Ammo" +} diff --git a/sources/Weapons/Playable/Shotguns/Boomstick/NiceDBShotgunAmmoPickup.uc b/sources/Weapons/Playable/Shotguns/Boomstick/NiceDBShotgunAmmoPickup.uc index 8ba6658..8104c93 100644 --- a/sources/Weapons/Playable/Shotguns/Boomstick/NiceDBShotgunAmmoPickup.uc +++ b/sources/Weapons/Playable/Shotguns/Boomstick/NiceDBShotgunAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceDBShotgunAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=6 InventoryType=Class'NicePack.NiceDBShotgunAmmo' PickupMessage="12 Gauge Premium Slugs" StaticMesh=None -} +class NiceDBShotgunAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=6 + InventoryType=Class'NicePack.NiceDBShotgunAmmo' + PickupMessage="12 Gauge Premium Slugs" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/Shotguns/Boomstick/NiceDamTypeDBShotgun.uc b/sources/Weapons/Playable/Shotguns/Boomstick/NiceDamTypeDBShotgun.uc index 972ef97..d73cf53 100644 --- a/sources/Weapons/Playable/Shotguns/Boomstick/NiceDamTypeDBShotgun.uc +++ b/sources/Weapons/Playable/Shotguns/Boomstick/NiceDamTypeDBShotgun.uc @@ -1,5 +1,20 @@ -class NiceDamTypeDBShotgun extends NiceDamageTypeVetEnforcer - abstract; -defaultproperties -{ MaxPenetrations=4 MediumZedPenDmgReduction=1.000000 PenDmgReduction=0.800000 bIsPowerWeapon=True WeaponClass=Class'NicePack.NiceBoomStick' DeathString="%k killed %o (Hunting shotgun)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 -} +class NiceDamTypeDBShotgun extends NiceDamageTypeVetEnforcer + abstract; +defaultproperties +{ + MaxPenetrations=4 + MediumZedPenDmgReduction=1.000000 + PenDmgReduction=0.800000 + bIsPowerWeapon=True + WeaponClass=Class'NicePack.NiceBoomStick' + DeathString="%k killed %o (Hunting shotgun)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + FlashFog=(X=600.000000) + KDamageImpulse=10000.000000 + KDeathVel=300.000000 + KDeathUpKick=100.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Shotguns/KSG/NiceDamTypeKSGShotgun.uc b/sources/Weapons/Playable/Shotguns/KSG/NiceDamTypeKSGShotgun.uc index ea0ba41..110361d 100644 --- a/sources/Weapons/Playable/Shotguns/KSG/NiceDamTypeKSGShotgun.uc +++ b/sources/Weapons/Playable/Shotguns/KSG/NiceDamTypeKSGShotgun.uc @@ -1,5 +1,21 @@ -class NiceDamTypeKSGShotgun extends NiceDamageTypeVetEnforcer - abstract; -defaultproperties -{ MaxPenetrations=3 BigZedPenDmgReduction=0.000000 MediumZedPenDmgReduction=0.250000 PenDmgReduction=0.900000 bIsPowerWeapon=True WeaponClass=Class'NicePack.NiceKSGShotgun' DeathString="%k killed %o (HSG Shotgun)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 -} +class NiceDamTypeKSGShotgun extends NiceDamageTypeVetEnforcer + abstract; +defaultproperties +{ + MaxPenetrations=3 + BigZedPenDmgReduction=0.000000 + MediumZedPenDmgReduction=0.250000 + PenDmgReduction=0.900000 + bIsPowerWeapon=True + WeaponClass=Class'NicePack.NiceKSGShotgun' + DeathString="%k killed %o (HSG Shotgun)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + FlashFog=(X=600.000000) + KDamageImpulse=10000.000000 + KDeathVel=300.000000 + KDeathUpKick=100.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAltFire.uc b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAltFire.uc index 860f9c9..5399931 100644 --- a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAltFire.uc +++ b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAltFire.uc @@ -1,4 +1,10 @@ -class NiceKSGAltFire extends NiceKSGFire; -defaultproperties -{ ProjPerFire=18 DamageMax=19 bWaitForRelease=False FireAnimRate=1.000000 FireRate=0.820000 Spread=1500.000000 -} +class NiceKSGAltFire extends NiceKSGFire; +defaultproperties +{ + ProjPerFire=18 + DamageMax=19 + bWaitForRelease=False + FireAnimRate=1.000000 + FireRate=0.820000 + Spread=1500.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAmmo.uc b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAmmo.uc index a1b794f..b1bce23 100644 --- a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAmmo.uc +++ b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAmmo.uc @@ -1,5 +1,12 @@ -class NiceKSGAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceKSGPickup' AmmoPickupAmount=12 MaxAmmo=84 InitialAmount=15 PickupClass=Class'NicePack.NiceKSGAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) -} +class NiceKSGAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceKSGPickup' + AmmoPickupAmount=12 + MaxAmmo=84 + InitialAmount=15 + PickupClass=Class'NicePack.NiceKSGAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAmmoPickup.uc b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAmmoPickup.uc index c045f22..2b52998 100644 --- a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAmmoPickup.uc +++ b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceKSGAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=12 InventoryType=Class'KFMod.ShotgunAmmo' PickupMessage="12-Gauge Drum" StaticMesh=None -} +class NiceKSGAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=12 + InventoryType=Class'KFMod.ShotgunAmmo' + PickupMessage="12-Gauge Drum" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAttachment.uc b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAttachment.uc index 147d484..1a09b7d 100644 --- a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAttachment.uc +++ b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGAttachment.uc @@ -1,4 +1,51 @@ -class NiceKSGAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' MovementAnims(0)="JogF_MP5" MovementAnims(1)="JogB_MP5" MovementAnims(2)="JogL_MP5" MovementAnims(3)="JogR_MP5" TurnLeftAnim="TurnL_MP5" TurnRightAnim="TurnR_MP5" CrouchAnims(0)="CHWalkF_MP5" CrouchAnims(1)="CHWalkB_MP5" CrouchAnims(2)="CHWalkL_MP5" CrouchAnims(3)="CHWalkR_MP5" WalkAnims(0)="WalkF_MP5" WalkAnims(1)="WalkB_MP5" WalkAnims(2)="WalkL_MP5" WalkAnims(3)="WalkR_MP5" CrouchTurnRightAnim="CH_TurnR_MP5" CrouchTurnLeftAnim="CH_TurnL_MP5" IdleCrouchAnim="CHIdle_MP5" IdleWeaponAnim="Idle_MP5" IdleRestAnim="Idle_MP5" IdleChatAnim="Idle_MP5" IdleHeavyAnim="Idle_MP5" IdleRifleAnim="Idle_MP5" FireAnims(0)="Fire_KSG" FireAnims(1)="Fire_KSG" FireAnims(2)="Fire_KSG" FireAnims(3)="Fire_KSG" FireAltAnims(0)="Fire_KSG" FireAltAnims(1)="Fire_KSG" FireAltAnims(2)="Fire_KSG" FireAltAnims(3)="Fire_KSG" FireCrouchAnims(0)="CHFire_KSG" FireCrouchAnims(1)="CHFire_KSG" FireCrouchAnims(2)="CHFire_KSG" FireCrouchAnims(3)="CHFire_KSG" FireCrouchAltAnims(0)="CHFire_KSG" FireCrouchAltAnims(1)="CHFire_KSG" FireCrouchAltAnims(2)="CHFire_KSG" FireCrouchAltAnims(3)="CHFire_KSG" HitAnims(0)="HitF_MP5" HitAnims(1)="HitB_MP5" HitAnims(2)="HitL_MP5" HitAnims(3)="HitR_MP5" PostFireBlendStandAnim="Blend_MP5" PostFireBlendCrouchAnim="CHBlend_MP5" MeshRef="KF_Weapons3rd4_Trip.KSG_3rd" -} +class NiceKSGAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' + mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' + MovementAnims(0)="JogF_MP5" + MovementAnims(1)="JogB_MP5" + MovementAnims(2)="JogL_MP5" + MovementAnims(3)="JogR_MP5" + TurnLeftAnim="TurnL_MP5" + TurnRightAnim="TurnR_MP5" + CrouchAnims(0)="CHWalkF_MP5" + CrouchAnims(1)="CHWalkB_MP5" + CrouchAnims(2)="CHWalkL_MP5" + CrouchAnims(3)="CHWalkR_MP5" + WalkAnims(0)="WalkF_MP5" + WalkAnims(1)="WalkB_MP5" + WalkAnims(2)="WalkL_MP5" + WalkAnims(3)="WalkR_MP5" + CrouchTurnRightAnim="CH_TurnR_MP5" + CrouchTurnLeftAnim="CH_TurnL_MP5" + IdleCrouchAnim="CHIdle_MP5" + IdleWeaponAnim="Idle_MP5" + IdleRestAnim="Idle_MP5" + IdleChatAnim="Idle_MP5" + IdleHeavyAnim="Idle_MP5" + IdleRifleAnim="Idle_MP5" + FireAnims(0)="Fire_KSG" + FireAnims(1)="Fire_KSG" + FireAnims(2)="Fire_KSG" + FireAnims(3)="Fire_KSG" + FireAltAnims(0)="Fire_KSG" + FireAltAnims(1)="Fire_KSG" + FireAltAnims(2)="Fire_KSG" + FireAltAnims(3)="Fire_KSG" + FireCrouchAnims(0)="CHFire_KSG" + FireCrouchAnims(1)="CHFire_KSG" + FireCrouchAnims(2)="CHFire_KSG" + FireCrouchAnims(3)="CHFire_KSG" + FireCrouchAltAnims(0)="CHFire_KSG" + FireCrouchAltAnims(1)="CHFire_KSG" + FireCrouchAltAnims(2)="CHFire_KSG" + FireCrouchAltAnims(3)="CHFire_KSG" + HitAnims(0)="HitF_MP5" + HitAnims(1)="HitB_MP5" + HitAnims(2)="HitL_MP5" + HitAnims(3)="HitR_MP5" + PostFireBlendStandAnim="Blend_MP5" + PostFireBlendCrouchAnim="CHBlend_MP5" + MeshRef="KF_Weapons3rd4_Trip.KSG_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGFire.uc b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGFire.uc index b10eb89..b58a9a3 100644 --- a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGFire.uc +++ b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGFire.uc @@ -1,4 +1,19 @@ -class NiceKSGFire extends NiceShotgunFire; -defaultproperties -{ ProjPerFire=12 maxVerticalRecoilAngle=1000 maxHorizontalRecoilAngle=500 ShellEjectClass=Class'KFMod.KSGShellEject' ShellEjectBoneName="Shell_eject" FireSoundRef="KF_KSGSnd.KSG_Fire_M" StereoFireSoundRef="KF_KSGSnd.KSG_Fire_S" NoAmmoSoundRef="KF_AA12Snd.AA12_DryFire" DamageType=Class'NicePack.NiceDamTypeKSGShotgun' DamageMax=25 FireAnimRate=0.869565 FireRate=0.943000 AmmoClass=Class'NicePack.NiceKSGAmmo' BotRefireRate=0.250000 Spread=1000.000000 -} +class NiceKSGFire extends NiceShotgunFire; +defaultproperties +{ + ProjPerFire=12 + maxVerticalRecoilAngle=1000 + maxHorizontalRecoilAngle=500 + ShellEjectClass=Class'KFMod.KSGShellEject' + ShellEjectBoneName="Shell_eject" + FireSoundRef="KF_KSGSnd.KSG_Fire_M" + StereoFireSoundRef="KF_KSGSnd.KSG_Fire_S" + NoAmmoSoundRef="KF_AA12Snd.AA12_DryFire" + DamageType=Class'NicePack.NiceDamTypeKSGShotgun' + DamageMax=25 + FireAnimRate=0.869565 + FireRate=0.943000 + AmmoClass=Class'NicePack.NiceKSGAmmo' + BotRefireRate=0.250000 + Spread=1000.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGPickup.uc b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGPickup.uc index db275b7..6958543 100644 --- a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGPickup.uc +++ b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGPickup.uc @@ -1,4 +1,25 @@ -class NiceKSGPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=7.000000 cost=500 AmmoCost=15 BuyClipSize=12 PowerValue=70 SpeedValue=50 RangeValue=30 Description="An advanced Horzine prototype tactical shotgun. Features a large capacity ammo magazine and selectable tight/wide spread fire modes." ItemName="HSG-1 Shotgun" ItemShortName="HSG-1 Shotgun" AmmoItemName="12-gauge mag" CorrespondingPerkIndex=1 EquipmentCategoryID=3 VariantClasses(0)=Class'KFMod.NeonKSGPickup' InventoryType=Class'NicePack.NiceKSGShotgun' PickupMessage="You got the Horzine HSG-1 shotgun" PickupSound=Sound'KF_KSGSnd.KSG_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups4_Trip.Shotguns.KSG_Pickup' CollisionRadius=35.000000 CollisionHeight=5.000000 -} +class NiceKSGPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=7.000000 + cost=500 + AmmoCost=15 + BuyClipSize=12 + PowerValue=70 + SpeedValue=50 + RangeValue=30 + Description="An advanced Horzine prototype tactical shotgun. Features a large capacity ammo magazine and selectable tight/wide spread fire modes." + ItemName="HSG-1 Shotgun" + ItemShortName="HSG-1 Shotgun" + AmmoItemName="12-gauge mag" + CorrespondingPerkIndex=1 + EquipmentCategoryID=3 + VariantClasses(0)=Class'KFMod.NeonKSGPickup' + InventoryType=Class'NicePack.NiceKSGShotgun' + PickupMessage="You got the Horzine HSG-1 shotgun" + PickupSound=Sound'KF_KSGSnd.KSG_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups4_Trip.Shotguns.KSG_Pickup' + CollisionRadius=35.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGShotgun.uc b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGShotgun.uc index 1e272a1..cde3aed 100644 --- a/sources/Weapons/Playable/Shotguns/KSG/NiceKSGShotgun.uc +++ b/sources/Weapons/Playable/Shotguns/KSG/NiceKSGShotgun.uc @@ -1,4 +1,50 @@ -class NiceKSGShotgun extends NiceWeapon; -defaultproperties -{ reloadPreEndFrame=0.126000 reloadEndFrame=0.650000 reloadChargeEndFrame=0.850000 reloadMagStartFrame=0.316000 reloadChargeStartFrame=0.820000 activeSlowdown=0.800000 activeSpeedup=1.300000 ForceZoomOutOnFireTime=0.010000 MagCapacity=12 ReloadRate=3.160000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_KSG" Weight=7.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_KSG' bIsTier2Weapon=True MeshRef="KF_Wep_KSG_Shotgun.KSG_Shotgun" SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.KSG_SHDR" SelectSoundRef="KF_KSGSnd.KSG_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.KSG_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.KSG" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceKSGFire' FireModeClass(1)=Class'NicePack.NiceKSGAltFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="An advanced Horzine prototype tactical shotgun. Features a large capacity ammo magazine and selectable tight/wide spread fire modes." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=100 InventoryGroup=3 GroupOffset=12 PickupClass=Class'NicePack.NiceKSGPickup' PlayerViewOffset=(X=15.000000,Y=20.000000,Z=-7.000000) BobDamping=4.500000 AttachmentClass=Class'NicePack.NiceKSGAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="HSG-1 Shotgun" TransientSoundVolume=1.250000 -} +class NiceKSGShotgun extends NiceWeapon; +defaultproperties +{ + reloadPreEndFrame=0.126000 + reloadEndFrame=0.650000 + reloadChargeEndFrame=0.850000 + reloadMagStartFrame=0.316000 + reloadChargeStartFrame=0.820000 + activeSlowdown=0.800000 + activeSpeedup=1.300000 + ForceZoomOutOnFireTime=0.010000 + MagCapacity=12 + ReloadRate=3.160000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_KSG" + Weight=7.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=65.000000 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_KSG' + bIsTier2Weapon=True + MeshRef="KF_Wep_KSG_Shotgun.KSG_Shotgun" + SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.KSG_SHDR" + SelectSoundRef="KF_KSGSnd.KSG_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.KSG_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.KSG" + PlayerIronSightFOV=70.000000 + ZoomedDisplayFOV=40.000000 + FireModeClass(0)=Class'NicePack.NiceKSGFire' + FireModeClass(1)=Class'NicePack.NiceKSGAltFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="An advanced Horzine prototype tactical shotgun. Features a large capacity ammo magazine and selectable tight/wide spread fire modes." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=65.000000 + Priority=100 + InventoryGroup=3 + GroupOffset=12 + PickupClass=Class'NicePack.NiceKSGPickup' + PlayerViewOffset=(X=15.000000,Y=20.000000,Z=-7.000000) + BobDamping=4.500000 + AttachmentClass=Class'NicePack.NiceKSGAttachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="HSG-1 Shotgun" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/Shotguns/Moss12/NiceDamTypeMoss12Z.uc b/sources/Weapons/Playable/Shotguns/Moss12/NiceDamTypeMoss12Z.uc index 0020c5b..93b8130 100644 --- a/sources/Weapons/Playable/Shotguns/Moss12/NiceDamTypeMoss12Z.uc +++ b/sources/Weapons/Playable/Shotguns/Moss12/NiceDamTypeMoss12Z.uc @@ -1,5 +1,18 @@ -class NiceDamTypeMoss12Z extends NiceDamageTypeVetEnforcer - abstract; -defaultproperties -{ MaxPenetrations=3 bIsPowerWeapon=True WeaponClass=Class'NicePack.NiceMoss12Z' DeathString="%k killed %o (Moss 12)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 -} +class NiceDamTypeMoss12Z extends NiceDamageTypeVetEnforcer + abstract; +defaultproperties +{ + MaxPenetrations=3 + bIsPowerWeapon=True + WeaponClass=Class'NicePack.NiceMoss12Z' + DeathString="%k killed %o (Moss 12)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + FlashFog=(X=600.000000) + KDamageImpulse=10000.000000 + KDeathVel=300.000000 + KDeathUpKick=100.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Ammo.uc b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Ammo.uc index c627403..0964eda 100644 --- a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Ammo.uc +++ b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Ammo.uc @@ -1,5 +1,12 @@ -class NiceMoss12Ammo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceMoss12Pickup' AmmoPickupAmount=6 MaxAmmo=60 InitialAmount=16 PickupClass=Class'NicePack.NiceMoss12AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) -} +class NiceMoss12Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceMoss12Pickup' + AmmoPickupAmount=6 + MaxAmmo=60 + InitialAmount=16 + PickupClass=Class'NicePack.NiceMoss12AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12AmmoPickup.uc b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12AmmoPickup.uc index ad86e08..42d636e 100644 --- a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12AmmoPickup.uc +++ b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12AmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceMoss12AmmoPickup extends KFAmmoPickup; -defaultproperties -{ AmmoAmount=6 InventoryType=Class'NicePack.NiceMoss12Ammo' PickupMessage="12-Gauge Shells" StaticMesh=None -} +class NiceMoss12AmmoPickup extends KFAmmoPickup; +defaultproperties +{ + AmmoAmount=6 + InventoryType=Class'NicePack.NiceMoss12Ammo' + PickupMessage="12-Gauge Shells" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Attachment.uc b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Attachment.uc index 828edcd..59cf0b0 100644 --- a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Attachment.uc +++ b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Attachment.uc @@ -1,9 +1,59 @@ -class NiceMoss12Attachment extends NiceAttachment; -simulated function DoFlashEmitter(){ - if (mMuzFlash3rd == none){ mMuzFlash3rd = Spawn(mMuzFlashClass); AttachToBone(mMuzFlash3rd, 'tip'); - } - if(mMuzFlash3rd != none) mMuzFlash3rd.SpawnParticle(1); -} -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' MovementAnims(0)="JogF_Shotgun" MovementAnims(1)="JogB_Shotgun" MovementAnims(2)="JogL_Shotgun" MovementAnims(3)="JogR_Shotgun" TurnLeftAnim="TurnL_Shotgun" TurnRightAnim="TurnR_Shotgun" CrouchAnims(0)="CHwalkF_Shotgun" CrouchAnims(1)="CHwalkB_Shotgun" CrouchAnims(2)="CHwalkL_Shotgun" CrouchAnims(3)="CHwalkR_Shotgun" WalkAnims(0)="WalkF_Shotgun" WalkAnims(1)="WalkB_Shotgun" WalkAnims(2)="WalkL_Shotgun" WalkAnims(3)="WalkR_Shotgun" CrouchTurnRightAnim="CH_TurnR_Shotgun" CrouchTurnLeftAnim="CH_TurnL_Shotgun" IdleCrouchAnim="CHIdle_Shotgun" IdleWeaponAnim="Idle_Shotgun" IdleRestAnim="Idle_Shotgun" IdleChatAnim="Idle_Shotgun" IdleHeavyAnim="Idle_Shotgun" IdleRifleAnim="Idle_Shotgun" FireAnims(0)="Fire_Shotgun" FireAnims(1)="Fire_Shotgun" FireAnims(2)="Fire_Shotgun" FireAnims(3)="Fire_Shotgun" FireAltAnims(0)="Fire_Shotgun" FireAltAnims(1)="Fire_Shotgun" FireAltAnims(2)="Fire_Shotgun" FireAltAnims(3)="Fire_Shotgun" FireCrouchAnims(0)="CHFire_Shotgun" FireCrouchAnims(1)="CHFire_Shotgun" FireCrouchAnims(2)="CHFire_Shotgun" FireCrouchAnims(3)="CHFire_Shotgun" FireCrouchAltAnims(0)="CHFire_Shotgun" FireCrouchAltAnims(1)="CHFire_Shotgun" FireCrouchAltAnims(2)="CHFire_Shotgun" FireCrouchAltAnims(3)="CHFire_Shotgun" HitAnims(0)="HitF_Shotgun" HitAnims(1)="HitB_Shotgun" HitAnims(2)="HitL_Shotgun" HitAnims(3)="HitR_Shotgun" PostFireBlendStandAnim="Blend_Shotgun" PostFireBlendCrouchAnim="CHBlend_Shotgun" MeshRef="NicePackA.Moss12_3rd" -} +class NiceMoss12Attachment extends NiceAttachment; +simulated function DoFlashEmitter(){ + if (mMuzFlash3rd == none){ + mMuzFlash3rd = Spawn(mMuzFlashClass); + AttachToBone(mMuzFlash3rd, 'tip'); + } + if(mMuzFlash3rd != none) + mMuzFlash3rd.SpawnParticle(1); +} +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' + mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' + MovementAnims(0)="JogF_Shotgun" + MovementAnims(1)="JogB_Shotgun" + MovementAnims(2)="JogL_Shotgun" + MovementAnims(3)="JogR_Shotgun" + TurnLeftAnim="TurnL_Shotgun" + TurnRightAnim="TurnR_Shotgun" + CrouchAnims(0)="CHwalkF_Shotgun" + CrouchAnims(1)="CHwalkB_Shotgun" + CrouchAnims(2)="CHwalkL_Shotgun" + CrouchAnims(3)="CHwalkR_Shotgun" + WalkAnims(0)="WalkF_Shotgun" + WalkAnims(1)="WalkB_Shotgun" + WalkAnims(2)="WalkL_Shotgun" + WalkAnims(3)="WalkR_Shotgun" + CrouchTurnRightAnim="CH_TurnR_Shotgun" + CrouchTurnLeftAnim="CH_TurnL_Shotgun" + IdleCrouchAnim="CHIdle_Shotgun" + IdleWeaponAnim="Idle_Shotgun" + IdleRestAnim="Idle_Shotgun" + IdleChatAnim="Idle_Shotgun" + IdleHeavyAnim="Idle_Shotgun" + IdleRifleAnim="Idle_Shotgun" + FireAnims(0)="Fire_Shotgun" + FireAnims(1)="Fire_Shotgun" + FireAnims(2)="Fire_Shotgun" + FireAnims(3)="Fire_Shotgun" + FireAltAnims(0)="Fire_Shotgun" + FireAltAnims(1)="Fire_Shotgun" + FireAltAnims(2)="Fire_Shotgun" + FireAltAnims(3)="Fire_Shotgun" + FireCrouchAnims(0)="CHFire_Shotgun" + FireCrouchAnims(1)="CHFire_Shotgun" + FireCrouchAnims(2)="CHFire_Shotgun" + FireCrouchAnims(3)="CHFire_Shotgun" + FireCrouchAltAnims(0)="CHFire_Shotgun" + FireCrouchAltAnims(1)="CHFire_Shotgun" + FireCrouchAltAnims(2)="CHFire_Shotgun" + FireCrouchAltAnims(3)="CHFire_Shotgun" + HitAnims(0)="HitF_Shotgun" + HitAnims(1)="HitB_Shotgun" + HitAnims(2)="HitL_Shotgun" + HitAnims(3)="HitR_Shotgun" + PostFireBlendStandAnim="Blend_Shotgun" + PostFireBlendCrouchAnim="CHBlend_Shotgun" + MeshRef="NicePackA.Moss12_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Fire.uc b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Fire.uc index 57f61dc..abf7ca0 100644 --- a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Fire.uc +++ b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Fire.uc @@ -1,4 +1,11 @@ -class NiceMoss12Fire extends NiceShotgunFire; -defaultproperties -{ ProjectileSpeed=3500.000000 FireSoundRef="NicePackSnd.SG_Fire" StereoFireSoundRef="NicePackSnd.SG_FireST" NoAmmoSoundRef="NicePackSnd.SG_DryFire" DamageType=Class'NicePack.NiceDamTypeMoss12Z' DamageMax=25 AmmoClass=Class'NicePack.NiceMoss12Ammo' -} +class NiceMoss12Fire extends NiceShotgunFire; +defaultproperties +{ + ProjectileSpeed=3500.000000 + FireSoundRef="NicePackSnd.SG_Fire" + StereoFireSoundRef="NicePackSnd.SG_FireST" + NoAmmoSoundRef="NicePackSnd.SG_DryFire" + DamageType=Class'NicePack.NiceDamTypeMoss12Z' + DamageMax=25 + AmmoClass=Class'NicePack.NiceMoss12Ammo' +} diff --git a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Pickup.uc b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Pickup.uc index a37442b..a36fe5f 100644 --- a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Pickup.uc +++ b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Pickup.uc @@ -1,4 +1,25 @@ -class NiceMoss12Pickup extends NiceWeaponPickup; -defaultproperties -{ bBackupWeapon=True Weight=6.000000 cost=200 AmmoCost=15 BuyClipSize=6 PowerValue=70 SpeedValue=40 RangeValue=15 Description="Lightened pump shotgun model. Shoots weaker rounds, but is easy to reload." ItemName="Moss 12" ItemShortName="Moss 12" AmmoItemName="12-gauge shells" CorrespondingPerkIndex=1 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceMoss12Z' PickupMessage="You got the Moss 12" PickupSound=Sound'NicePackSnd.Moss12.SG_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'NicePackSM.Moss12.KF_Moss12' CollisionRadius=35.000000 CollisionHeight=5.000000 -} +class NiceMoss12Pickup extends NiceWeaponPickup; +defaultproperties +{ + bBackupWeapon=True + Weight=6.000000 + cost=200 + AmmoCost=15 + BuyClipSize=6 + PowerValue=70 + SpeedValue=40 + RangeValue=15 + Description="Lightened pump shotgun model. Shoots weaker rounds, but is easy to reload." + ItemName="Moss 12" + ItemShortName="Moss 12" + AmmoItemName="12-gauge shells" + CorrespondingPerkIndex=1 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceMoss12Z' + PickupMessage="You got the Moss 12" + PickupSound=Sound'NicePackSnd.Moss12.SG_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'NicePackSM.Moss12.KF_Moss12' + CollisionRadius=35.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Z.uc b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Z.uc index 5e7e835..4e26536 100644 --- a/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Z.uc +++ b/sources/Weapons/Playable/Shotguns/Moss12/NiceMoss12Z.uc @@ -1,15 +1,53 @@ -class NiceMoss12Z extends NiceWeapon; -var() float ThrowGrenadeAnimRate; -var() name ThrowGrenadeAnim; -simulated function fillSubReloadStages(){ - // Loading 8 shells during 175 frames tops, with first shell loaded at frame 16, with 17 frames between load moments - generateReloadStages(8, 175, 16, 17); - reloadStages[3] = 69.0 / 175.0; - reloadStages[4] = 87.0 / 175.0; - reloadStages[5] = 105.0 / 175.0; - reloadStages[6] = 123.0 / 175.0; - reloadStages[7] = 140.0 / 175.0; -} -defaultproperties -{ reloadType=RTYPE_SINGLE FirstPersonFlashlightOffset=(X=-25.000000,Y=-18.000000,Z=8.000000) MagCapacity=6 ReloadRate=0.444444 ReloadAnim="Reload" ReloadAnimRate=1.200000 bHoldToReload=True WeaponReloadAnim="Reload_Shotgun" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 SleeveNum=0 TraderInfoTexture=Texture'NicePackT.Moss12.Trader_Moss12' MeshRef="NicePackA.Moss12Weapon" SkinRefs(0)="NicePackT.Moss12.Moss12_2048x2048" SelectSoundRef="NicePackSnd.SG_Select" HudImageRef="NicePackT.Moss12.Trader_Moss12_unselected" SelectedHudImageRef="NicePackT.Moss12.Trader_Moss12_selected" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceMoss12Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" AIRating=0.600000 CurrentRating=0.600000 Description="Lightened pump shotgun model. Shoots weaker rounds, but is easy to reload." DisplayFOV=65.000000 Priority=15 InventoryGroup=3 GroupOffset=1 PickupClass=Class'NicePack.NiceMoss12Pickup' PlayerViewOffset=(X=20.000000,Y=18.750000,Z=-7.500000) BobDamping=7.000000 AttachmentClass=Class'NicePack.NiceMoss12Attachment' IconCoords=(X1=169,Y1=172,X2=245,Y2=208) ItemName="Moss 12" TransientSoundVolume=1.000000 -} +class NiceMoss12Z extends NiceWeapon; +var() float ThrowGrenadeAnimRate; +var() name ThrowGrenadeAnim; +simulated function fillSubReloadStages(){ + // Loading 8 shells during 175 frames tops, with first shell loaded at frame 16, with 17 frames between load moments + generateReloadStages(8, 175, 16, 17); + reloadStages[3] = 69.0 / 175.0; + reloadStages[4] = 87.0 / 175.0; + reloadStages[5] = 105.0 / 175.0; + reloadStages[6] = 123.0 / 175.0; + reloadStages[7] = 140.0 / 175.0; +} +defaultproperties +{ + reloadType=RTYPE_SINGLE + FirstPersonFlashlightOffset=(X=-25.000000,Y=-18.000000,Z=8.000000) + MagCapacity=6 + ReloadRate=0.444444 + ReloadAnim="Reload" + ReloadAnimRate=1.200000 + bHoldToReload=True + WeaponReloadAnim="Reload_Shotgun" + Weight=6.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=65.000000 + SleeveNum=0 + TraderInfoTexture=Texture'NicePackT.Moss12.Trader_Moss12' + MeshRef="NicePackA.Moss12Weapon" + SkinRefs(0)="NicePackT.Moss12.Moss12_2048x2048" + SelectSoundRef="NicePackSnd.SG_Select" + HudImageRef="NicePackT.Moss12.Trader_Moss12_unselected" + SelectedHudImageRef="NicePackT.Moss12.Trader_Moss12_selected" + PlayerIronSightFOV=70.000000 + ZoomedDisplayFOV=40.000000 + FireModeClass(0)=Class'NicePack.NiceMoss12Fire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + AIRating=0.600000 + CurrentRating=0.600000 + Description="Lightened pump shotgun model. Shoots weaker rounds, but is easy to reload." + DisplayFOV=65.000000 + Priority=15 + InventoryGroup=3 + GroupOffset=1 + PickupClass=Class'NicePack.NiceMoss12Pickup' + PlayerViewOffset=(X=20.000000,Y=18.750000,Z=-7.500000) + BobDamping=7.000000 + AttachmentClass=Class'NicePack.NiceMoss12Attachment' + IconCoords=(X1=169,Y1=172,X2=245,Y2=208) + ItemName="Moss 12" + TransientSoundVolume=1.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/Nailgun/NiceDamTypeNailGun.uc b/sources/Weapons/Playable/Shotguns/Nailgun/NiceDamTypeNailGun.uc index 07f90d9..aa5012a 100644 --- a/sources/Weapons/Playable/Shotguns/Nailgun/NiceDamTypeNailGun.uc +++ b/sources/Weapons/Playable/Shotguns/Nailgun/NiceDamTypeNailGun.uc @@ -1,5 +1,18 @@ -class NiceDamTypeNailGun extends NiceDamageTypeVetEnforcer - abstract; -defaultproperties -{ MaxPenetrations=3 bIsPowerWeapon=True WeaponClass=Class'NicePack.NiceNailGun' DeathString="%k killed %o (Nail)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 -} +class NiceDamTypeNailGun extends NiceDamageTypeVetEnforcer + abstract; +defaultproperties +{ + MaxPenetrations=3 + bIsPowerWeapon=True + WeaponClass=Class'NicePack.NiceNailGun' + DeathString="%k killed %o (Nail)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + FlashFog=(X=600.000000) + KDamageImpulse=10000.000000 + KDeathVel=300.000000 + KDeathUpKick=100.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNail.uc b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNail.uc index a236e6d..cf06675 100644 --- a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNail.uc +++ b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNail.uc @@ -1,4 +1,10 @@ -class NiceNail extends NiceShotgunPellet; -defaultproperties -{ bDisableComplexMovement=False movementAcceleration=(Z=-300.000000) bShouldBounce=True trailXClass=Class'KFMod.NailGunTracer' regularImpact=(bPlayROEffect=False,decalClass=Class'KFMod.NailGunDecal',EmitterClass=Class'ROEffects.ROBulletHitMetalEffect',emitterShiftWall=20.000000,emitterShiftPawn=20.000000,noiseRef="ProjectileSounds.Bullets.Impact_Metal",noiseVolume=1.000000) StaticMeshRef="EffectsSM.Weapons.Vlad_9000_Nail" -} +class NiceNail extends NiceShotgunPellet; +defaultproperties +{ + bDisableComplexMovement=False + movementAcceleration=(Z=-300.000000) + bShouldBounce=True + trailXClass=Class'KFMod.NailGunTracer' + regularImpact=(bPlayROEffect=False,decalClass=Class'KFMod.NailGunDecal',EmitterClass=Class'ROEffects.ROBulletHitMetalEffect',emitterShiftWall=20.000000,emitterShiftPawn=20.000000,noiseRef="ProjectileSounds.Bullets.Impact_Metal",noiseVolume=1.000000) + StaticMeshRef="EffectsSM.Weapons.Vlad_9000_Nail" +} diff --git a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGun.uc b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGun.uc index ba4f18c..678d5a3 100644 --- a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGun.uc +++ b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGun.uc @@ -1,7 +1,51 @@ -class NiceNailGun extends NiceWeapon; -simulated function bool AltFireCanForceInterruptReload(){ - return GetMagazineAmmo() > 0; -} -defaultproperties -{ reloadPreEndFrame=0.178000 reloadEndFrame=0.700000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.278000 reloadChargeStartFrame=-1.000000 FirstPersonFlashlightOffset=(X=-20.000000,Y=-22.000000,Z=8.000000) MagCapacity=42 ReloadRate=2.600000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_Vlad9000" Weight=5.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Vlad9000' bIsTier2Weapon=True MeshRef="KF_Wep_Vlad9000.Vlad9000" SkinRefs(0)="KF_Weapons8_Trip_T.Weapons.Vlad_9000_cmb" SelectSoundRef="KF_NailShotgun.KF_NailShotgun_Pickup" HudImageRef="KillingFloor2HUD.WeaponSelect.Vlad9000_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Vlad9000" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceNailGunFire' FireModeClass(1)=Class'NicePack.NiceNailGunAltFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="The Black and Wrecker Vlad 9000 nail gun. Designed for putting barns together. Or nailing Zeds to them." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=150 InventoryGroup=3 GroupOffset=15 PickupClass=Class'NicePack.NiceNailGunPickup' PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-10.000000) BobDamping=4.500000 AttachmentClass=Class'NicePack.NiceNailGunAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="Vlad the Impaler" TransientSoundVolume=1.250000 -} +class NiceNailGun extends NiceWeapon; +simulated function bool AltFireCanForceInterruptReload(){ + return GetMagazineAmmo() > 0; +} +defaultproperties +{ + reloadPreEndFrame=0.178000 + reloadEndFrame=0.700000 + reloadChargeEndFrame=-1.000000 + reloadMagStartFrame=0.278000 + reloadChargeStartFrame=-1.000000 + FirstPersonFlashlightOffset=(X=-20.000000,Y=-22.000000,Z=8.000000) + MagCapacity=42 + ReloadRate=2.600000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_Vlad9000" + Weight=5.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=65.000000 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_Vlad9000' + bIsTier2Weapon=True + MeshRef="KF_Wep_Vlad9000.Vlad9000" + SkinRefs(0)="KF_Weapons8_Trip_T.Weapons.Vlad_9000_cmb" + SelectSoundRef="KF_NailShotgun.KF_NailShotgun_Pickup" + HudImageRef="KillingFloor2HUD.WeaponSelect.Vlad9000_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.Vlad9000" + PlayerIronSightFOV=70.000000 + ZoomedDisplayFOV=40.000000 + FireModeClass(0)=Class'NicePack.NiceNailGunFire' + FireModeClass(1)=Class'NicePack.NiceNailGunAltFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="The Black and Wrecker Vlad 9000 nail gun. Designed for putting barns together. Or nailing Zeds to them." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=65.000000 + Priority=150 + InventoryGroup=3 + GroupOffset=15 + PickupClass=Class'NicePack.NiceNailGunPickup' + PlayerViewOffset=(X=25.000000,Y=20.000000,Z=-10.000000) + BobDamping=4.500000 + AttachmentClass=Class'NicePack.NiceNailGunAttachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="Vlad the Impaler" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAltFire.uc b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAltFire.uc index a0f7898..322fc19 100644 --- a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAltFire.uc +++ b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAltFire.uc @@ -1,4 +1,8 @@ -class NiceNailGunAltFire extends NiceNailGunFire; -defaultproperties -{ bCanFireIncomplete=True ProjectileSpeed=3500.000000 AmmoPerFire=7 SpreadStyle=SS_Random -} +class NiceNailGunAltFire extends NiceNailGunFire; +defaultproperties +{ + bCanFireIncomplete=True + ProjectileSpeed=3500.000000 + AmmoPerFire=7 + SpreadStyle=SS_Random +} diff --git a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAmmo.uc b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAmmo.uc index c715d55..915c598 100644 --- a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAmmo.uc +++ b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAmmo.uc @@ -1,5 +1,11 @@ -class NiceNailGunAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceNailGunPickup' AmmoPickupAmount=42 MaxAmmo=210 InitialAmount=105 IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) -} +class NiceNailGunAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceNailGunPickup' + AmmoPickupAmount=42 + MaxAmmo=210 + InitialAmount=105 + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAttachment.uc b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAttachment.uc index 3003a5d..dfc292b 100644 --- a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAttachment.uc +++ b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunAttachment.uc @@ -1,4 +1,14 @@ -class NiceNailGunAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdNailGun' TurnLeftAnim="TurnL_Bullpup" TurnRightAnim="TurnR_Bullpup" WalkAnims(0)="WalkF_Bullpup" WalkAnims(1)="WalkB_Bullpup" WalkAnims(2)="WalkL_Bullpup" WalkAnims(3)="WalkR_Bullpup" CrouchTurnRightAnim="CH_TurnR_Bullpup" CrouchTurnLeftAnim="CH_TurnL_Bullpup" MeshRef="KF_Weapons3rd5_Trip.Vlad9000_3rd" -} +class NiceNailGunAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdNailGun' + TurnLeftAnim="TurnL_Bullpup" + TurnRightAnim="TurnR_Bullpup" + WalkAnims(0)="WalkF_Bullpup" + WalkAnims(1)="WalkB_Bullpup" + WalkAnims(2)="WalkL_Bullpup" + WalkAnims(3)="WalkR_Bullpup" + CrouchTurnRightAnim="CH_TurnR_Bullpup" + CrouchTurnLeftAnim="CH_TurnL_Bullpup" + MeshRef="KF_Weapons3rd5_Trip.Vlad9000_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunFire.uc b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunFire.uc index 1186223..687474b 100644 --- a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunFire.uc +++ b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunFire.uc @@ -1,7 +1,29 @@ -class NiceNailGunFire extends NiceShotgunFire; -simulated function bool ShouldBounce(){ - return true; -} -defaultproperties -{ ProjPerFire=1 KickMomentum=(X=-25.000000,Z=0.000000) ProjectileSpeed=9260.0 bShouldBounce=True bCausePain=True bulletClass=Class'NicePack.NiceNail' maxVerticalRecoilAngle=1250 maxHorizontalRecoilAngle=750 bRandomPitchFireSound=True FireSoundRef="KF_NailShotgun.NailShotgun_Fire_Single_M" StereoFireSoundRef="KF_NailShotgun.NailShotgun_Fire_Single_S" NoAmmoSoundRef="KF_NailShotgun.KF_NailShotgun_Dryfire" DamageType=Class'NicePack.NiceDamTypeNailGun' DamageMax=66 FireAnimRate=1.250000 FireRate=0.400000 AmmoClass=Class'NicePack.NiceNailGunAmmo' ShakeRotTime=3.000000 ShakeOffsetTime=2.000000 BotRefireRate=0.500000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stNailGun' SpreadStyle=SS_None +class NiceNailGunFire extends NiceShotgunFire; +simulated function bool ShouldBounce(){ + return true; +} +defaultproperties +{ + ProjPerFire=1 + KickMomentum=(X=-25.000000,Z=0.000000) + ProjectileSpeed=9260.0 + bShouldBounce=True + bCausePain=True + bulletClass=Class'NicePack.NiceNail' + maxVerticalRecoilAngle=1250 + maxHorizontalRecoilAngle=750 + bRandomPitchFireSound=True + FireSoundRef="KF_NailShotgun.NailShotgun_Fire_Single_M" + StereoFireSoundRef="KF_NailShotgun.NailShotgun_Fire_Single_S" + NoAmmoSoundRef="KF_NailShotgun.KF_NailShotgun_Dryfire" + DamageType=Class'NicePack.NiceDamTypeNailGun' + DamageMax=66 + FireAnimRate=1.250000 + FireRate=0.400000 + AmmoClass=Class'NicePack.NiceNailGunAmmo' + ShakeRotTime=3.000000 + ShakeOffsetTime=2.000000 + BotRefireRate=0.500000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stNailGun' + SpreadStyle=SS_None } \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunPickup.uc b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunPickup.uc index 19d602c..3aca779 100644 --- a/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunPickup.uc +++ b/sources/Weapons/Playable/Shotguns/Nailgun/NiceNailGunPickup.uc @@ -1,4 +1,24 @@ -class NiceNailGunPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=8.000000 cost=250 AmmoCost=30 BuyClipSize=42 PowerValue=70 SpeedValue=55 RangeValue=25 Description="The Black and Wrecker Vlad 9000 nail gun. Designed for putting barns together. Or nailing Zeds to them." ItemName="Vlad the Impaler" ItemShortName="Vlad 9000" AmmoItemName="Nails" CorrespondingPerkIndex=1 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceNailGun' PickupMessage="You got the Vlad 9000." PickupSound=Sound'KF_NailShotgun.Handling.KF_NailShotgun_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups5_Trip.Rifles.Vlad9000_Pickup' CollisionRadius=35.000000 CollisionHeight=5.000000 +class NiceNailGunPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=8.000000 + cost=250 + AmmoCost=30 + BuyClipSize=42 + PowerValue=70 + SpeedValue=55 + RangeValue=25 + Description="The Black and Wrecker Vlad 9000 nail gun. Designed for putting barns together. Or nailing Zeds to them." + ItemName="Vlad the Impaler" + ItemShortName="Vlad 9000" + AmmoItemName="Nails" + CorrespondingPerkIndex=1 + EquipmentCategoryID=3 + InventoryType=Class'NicePack.NiceNailGun' + PickupMessage="You got the Vlad 9000." + PickupSound=Sound'KF_NailShotgun.Handling.KF_NailShotgun_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups5_Trip.Rifles.Vlad9000_Pickup' + CollisionRadius=35.000000 + CollisionHeight=5.000000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceDamTypeShotgun.uc b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceDamTypeShotgun.uc index d0adf03..e99b4ed 100644 --- a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceDamTypeShotgun.uc +++ b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceDamTypeShotgun.uc @@ -1,9 +1,22 @@ -class NiceDamTypeShotgun extends NiceDamageTypeVetEnforcer - abstract; -defaultproperties -{ /*MaxPenetrations=3 bIsPowerWeapon=True*/ - MaxPenetrations=4 - MediumZedPenDmgReduction=1.000000 - PenDmgReduction=0.800000 - bIsPowerWeapon=True WeaponClass=Class'NicePack.NiceShotgun' DeathString="%k killed %o (Shotgun)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 -} +class NiceDamTypeShotgun extends NiceDamageTypeVetEnforcer + abstract; +defaultproperties +{ + /*MaxPenetrations=3 + bIsPowerWeapon=True*/ + MaxPenetrations=4 + MediumZedPenDmgReduction=1.000000 + PenDmgReduction=0.800000 + bIsPowerWeapon=True + WeaponClass=Class'NicePack.NiceShotgun' + DeathString="%k killed %o (Shotgun)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + FlashFog=(X=600.000000) + KDamageImpulse=10000.000000 + KDeathVel=300.000000 + KDeathUpKick=100.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgun.uc b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgun.uc index 38c0edd..3908da6 100644 --- a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgun.uc +++ b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgun.uc @@ -1,14 +1,56 @@ -class NiceShotgun extends NiceWeapon; - -simulated function fillSubReloadStages(){ - // Loading 8 shells during 173 frames tops, with first shell loaded at frame 15, with 18 frames between load moments - generateReloadStages(8, 173, 15, 18); - // Make corrections, based on notify sound positioning - /*reloadStages[0] = 16.0 / 173.0; - reloadStages[2] = 50.0 / 173.0; - reloadStages[7] = 140.0 / 173.0;*/ -} - -defaultproperties -{ bChangeClipIcon=True hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' reloadType=RTYPE_SINGLE FirstPersonFlashlightOffset=(X=-25.000000,Y=-18.000000,Z=8.000000) ForceZoomOutOnFireTime=0.010000 MagCapacity=8 ReloadRate=0.666667 ReloadAnim="Reload" ReloadAnimRate=1.000000 bHoldToReload=True WeaponReloadAnim="Reload_Shotgun" Weight=4.000000 bTorchEnabled=True bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Combat_Shotgun' MeshRef="KF_Weapons_Trip.Shotgun_Trip" SkinRefs(0)="KF_Weapons_Trip_T.Shotguns.shotgun_cmb" SelectSoundRef="KF_PumpSGSnd.SG_Select" HudImageRef="KillingFloorHUD.WeaponSelect.combat_shotgun_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.combat_shotgun" PlayerIronSightFOV=70.000000 ZoomedDisplayFOV=40.000000 FireModeClass(0)=Class'NicePack.NiceShotgunFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" AIRating=0.600000 CurrentRating=0.600000 bShowChargingBar=True Description="A rugged tactical pump action shotgun common to police divisions the world over. It accepts a maximum of 8 shells and can fire in rapid succession." DisplayFOV=65.000000 Priority=135 InventoryGroup=3 GroupOffset=2 PickupClass=Class'NicePack.NiceShotgunPickup' PlayerViewOffset=(X=20.000000,Y=18.750000,Z=-7.500000) BobDamping=7.000000 AttachmentClass=Class'NicePack.NiceShotgunAttachment' IconCoords=(X1=169,Y1=172,X2=245,Y2=208) ItemName="Shotgun" TransientSoundVolume=1.000000 +class NiceShotgun extends NiceWeapon; + +simulated function fillSubReloadStages(){ + // Loading 8 shells during 173 frames tops, with first shell loaded at frame 15, with 18 frames between load moments + generateReloadStages(8, 173, 15, 18); + // Make corrections, based on notify sound positioning + /*reloadStages[0] = 16.0 / 173.0; + reloadStages[2] = 50.0 / 173.0; + reloadStages[7] = 140.0 / 173.0;*/ +} + +defaultproperties +{ + bChangeClipIcon=True + hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' + reloadType=RTYPE_SINGLE + FirstPersonFlashlightOffset=(X=-25.000000,Y=-18.000000,Z=8.000000) + ForceZoomOutOnFireTime=0.010000 + MagCapacity=8 + ReloadRate=0.666667 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + bHoldToReload=True + WeaponReloadAnim="Reload_Shotgun" + Weight=4.000000 + bTorchEnabled=True + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=65.000000 + TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_Combat_Shotgun' + MeshRef="KF_Weapons_Trip.Shotgun_Trip" + SkinRefs(0)="KF_Weapons_Trip_T.Shotguns.shotgun_cmb" + SelectSoundRef="KF_PumpSGSnd.SG_Select" + HudImageRef="KillingFloorHUD.WeaponSelect.combat_shotgun_unselected" + SelectedHudImageRef="KillingFloorHUD.WeaponSelect.combat_shotgun" + PlayerIronSightFOV=70.000000 + ZoomedDisplayFOV=40.000000 + FireModeClass(0)=Class'NicePack.NiceShotgunFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + AIRating=0.600000 + CurrentRating=0.600000 + bShowChargingBar=True + Description="A rugged tactical pump action shotgun common to police divisions the world over. It accepts a maximum of 8 shells and can fire in rapid succession." + DisplayFOV=65.000000 + Priority=135 + InventoryGroup=3 + GroupOffset=2 + PickupClass=Class'NicePack.NiceShotgunPickup' + PlayerViewOffset=(X=20.000000,Y=18.750000,Z=-7.500000) + BobDamping=7.000000 + AttachmentClass=Class'NicePack.NiceShotgunAttachment' + IconCoords=(X1=169,Y1=172,X2=245,Y2=208) + ItemName="Shotgun" + TransientSoundVolume=1.000000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAmmo.uc b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAmmo.uc index ea2dd40..7eb276c 100644 --- a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAmmo.uc +++ b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAmmo.uc @@ -1,5 +1,12 @@ -class NiceShotgunAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceShotgunPickup' AmmoPickupAmount=4 MaxAmmo=32 InitialAmount=8 PickupClass=Class'NicePack.NiceShotgunAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +class NiceShotgunAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceShotgunPickup' + AmmoPickupAmount=4 + MaxAmmo=32 + InitialAmount=8 + PickupClass=Class'NicePack.NiceShotgunAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=451,Y1=445,X2=510,Y2=500) } \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAmmoPickup.uc b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAmmoPickup.uc index 4aeb106..8d59277 100644 --- a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAmmoPickup.uc +++ b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceShotgunAmmoPickup extends KFAmmoPickup; -defaultproperties -{ AmmoAmount=4 InventoryType=Class'NicePack.NiceShotgunAmmo' PickupMessage="12-Gauge Shells" StaticMesh=None +class NiceShotgunAmmoPickup extends KFAmmoPickup; +defaultproperties +{ + AmmoAmount=4 + InventoryType=Class'NicePack.NiceShotgunAmmo' + PickupMessage="12-Gauge Shells" + StaticMesh=None } \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAttachment.uc b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAttachment.uc index 2393380..1ad20d2 100644 --- a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAttachment.uc +++ b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunAttachment.uc @@ -1,29 +1,99 @@ -class NiceShotgunAttachment extends NiceAttachment; -var Actor TacShine; -var Effects TacShineCorona; -var bool bBeamEnabled; -simulated event ThirdPersonEffects(){ - if(FiringMode == 1) return; - super.ThirdPersonEffects(); -} -simulated function Destroyed() -{ - if(TacShineCorona != none) TacShineCorona.Destroy(); - if (TacShine != none) TacShine.Destroy(); - super.Destroyed(); -} -simulated function UpdateTacBeam( float Dist ){ - local vector Sc; - if(!bBeamEnabled){ if(TacShine == none){ TacShine = Spawn(Class'Single'.Default.TacShineClass,Owner,,,); AttachToBone(TacShine,'FlashLight'); TacShine.RemoteRole = ROLE_none; } else TacShine.bHidden = False; if(TacShineCorona == none){ TacShineCorona = Spawn(class 'KFTacLightCorona',Owner,,,); AttachToBone(TacShineCorona,'FlashLight'); TacShineCorona.RemoteRole = ROLE_none; } TacShineCorona.bHidden = False; bBeamEnabled = True; - } - Sc = TacShine.DrawScale3D; - Sc.Y = FClamp(Dist/90.f,0.02,1.f); - if(TacShine.DrawScale3D != Sc) TacShine.SetDrawScale3D(Sc); -} -simulated function TacBeamGone(){ - if(bBeamEnabled){ if(TacShine != none) TacShine.bHidden = True; if(TacShineCorona != none) TacShineCorona.bHidden = True; bBeamEnabled = False; - } -} -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' MovementAnims(0)="JogF_Shotgun" MovementAnims(1)="JogB_Shotgun" MovementAnims(2)="JogL_Shotgun" MovementAnims(3)="JogR_Shotgun" TurnLeftAnim="TurnL_Shotgun" TurnRightAnim="TurnR_Shotgun" CrouchAnims(0)="CHwalkF_Shotgun" CrouchAnims(1)="CHwalkB_Shotgun" CrouchAnims(2)="CHwalkL_Shotgun" CrouchAnims(3)="CHwalkR_Shotgun" WalkAnims(0)="WalkF_Shotgun" WalkAnims(1)="WalkB_Shotgun" WalkAnims(2)="WalkL_Shotgun" WalkAnims(3)="WalkR_Shotgun" CrouchTurnRightAnim="CH_TurnR_Shotgun" CrouchTurnLeftAnim="CH_TurnL_Shotgun" IdleCrouchAnim="CHIdle_Shotgun" IdleWeaponAnim="Idle_Shotgun" IdleRestAnim="Idle_Shotgun" IdleChatAnim="Idle_Shotgun" IdleHeavyAnim="Idle_Shotgun" IdleRifleAnim="Idle_Shotgun" FireAnims(0)="Fire_Shotgun" FireAnims(1)="Fire_Shotgun" FireAnims(2)="Fire_Shotgun" FireAnims(3)="Fire_Shotgun" FireAltAnims(0)="Fire_Shotgun" FireAltAnims(1)="Fire_Shotgun" FireAltAnims(2)="Fire_Shotgun" FireAltAnims(3)="Fire_Shotgun" FireCrouchAnims(0)="CHFire_Shotgun" FireCrouchAnims(1)="CHFire_Shotgun" FireCrouchAnims(2)="CHFire_Shotgun" FireCrouchAnims(3)="CHFire_Shotgun" FireCrouchAltAnims(0)="CHFire_Shotgun" FireCrouchAltAnims(1)="CHFire_Shotgun" FireCrouchAltAnims(2)="CHFire_Shotgun" FireCrouchAltAnims(3)="CHFire_Shotgun" HitAnims(0)="HitF_Shotgun" HitAnims(1)="HitB_Shotgun" HitAnims(2)="HitL_Shotgun" HitAnims(3)="HitR_Shotgun" PostFireBlendStandAnim="Blend_Shotgun" PostFireBlendCrouchAnim="CHBlend_Shotgun" MeshRef="KF_Weapons3rd_Trip.Shotgun_3rd" -} +class NiceShotgunAttachment extends NiceAttachment; +var Actor TacShine; +var Effects TacShineCorona; +var bool bBeamEnabled; +simulated event ThirdPersonEffects(){ + if(FiringMode == 1) + return; + super.ThirdPersonEffects(); +} +simulated function Destroyed() +{ + if(TacShineCorona != none) + TacShineCorona.Destroy(); + if (TacShine != none) + TacShine.Destroy(); + super.Destroyed(); +} +simulated function UpdateTacBeam( float Dist ){ + local vector Sc; + if(!bBeamEnabled){ + if(TacShine == none){ + TacShine = Spawn(Class'Single'.Default.TacShineClass,Owner,,,); + AttachToBone(TacShine,'FlashLight'); + TacShine.RemoteRole = ROLE_none; + } + else + TacShine.bHidden = False; + if(TacShineCorona == none){ + TacShineCorona = Spawn(class 'KFTacLightCorona',Owner,,,); + AttachToBone(TacShineCorona,'FlashLight'); + TacShineCorona.RemoteRole = ROLE_none; + } + TacShineCorona.bHidden = False; + bBeamEnabled = True; + } + Sc = TacShine.DrawScale3D; + Sc.Y = FClamp(Dist/90.f,0.02,1.f); + if(TacShine.DrawScale3D != Sc) + TacShine.SetDrawScale3D(Sc); +} +simulated function TacBeamGone(){ + if(bBeamEnabled){ + if(TacShine != none) + TacShine.bHidden = True; + if(TacShineCorona != none) + TacShineCorona.bHidden = True; + bBeamEnabled = False; + } +} +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' + mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' + MovementAnims(0)="JogF_Shotgun" + MovementAnims(1)="JogB_Shotgun" + MovementAnims(2)="JogL_Shotgun" + MovementAnims(3)="JogR_Shotgun" + TurnLeftAnim="TurnL_Shotgun" + TurnRightAnim="TurnR_Shotgun" + CrouchAnims(0)="CHwalkF_Shotgun" + CrouchAnims(1)="CHwalkB_Shotgun" + CrouchAnims(2)="CHwalkL_Shotgun" + CrouchAnims(3)="CHwalkR_Shotgun" + WalkAnims(0)="WalkF_Shotgun" + WalkAnims(1)="WalkB_Shotgun" + WalkAnims(2)="WalkL_Shotgun" + WalkAnims(3)="WalkR_Shotgun" + CrouchTurnRightAnim="CH_TurnR_Shotgun" + CrouchTurnLeftAnim="CH_TurnL_Shotgun" + IdleCrouchAnim="CHIdle_Shotgun" + IdleWeaponAnim="Idle_Shotgun" + IdleRestAnim="Idle_Shotgun" + IdleChatAnim="Idle_Shotgun" + IdleHeavyAnim="Idle_Shotgun" + IdleRifleAnim="Idle_Shotgun" + FireAnims(0)="Fire_Shotgun" + FireAnims(1)="Fire_Shotgun" + FireAnims(2)="Fire_Shotgun" + FireAnims(3)="Fire_Shotgun" + FireAltAnims(0)="Fire_Shotgun" + FireAltAnims(1)="Fire_Shotgun" + FireAltAnims(2)="Fire_Shotgun" + FireAltAnims(3)="Fire_Shotgun" + FireCrouchAnims(0)="CHFire_Shotgun" + FireCrouchAnims(1)="CHFire_Shotgun" + FireCrouchAnims(2)="CHFire_Shotgun" + FireCrouchAnims(3)="CHFire_Shotgun" + FireCrouchAltAnims(0)="CHFire_Shotgun" + FireCrouchAltAnims(1)="CHFire_Shotgun" + FireCrouchAltAnims(2)="CHFire_Shotgun" + FireCrouchAltAnims(3)="CHFire_Shotgun" + HitAnims(0)="HitF_Shotgun" + HitAnims(1)="HitB_Shotgun" + HitAnims(2)="HitL_Shotgun" + HitAnims(3)="HitR_Shotgun" + PostFireBlendStandAnim="Blend_Shotgun" + PostFireBlendCrouchAnim="CHBlend_Shotgun" + MeshRef="KF_Weapons3rd_Trip.Shotgun_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunFire.uc b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunFire.uc index 873c745..94a60b8 100644 --- a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunFire.uc +++ b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunFire.uc @@ -1,4 +1,43 @@ -class NiceShotgunFire extends NiceFire; -defaultproperties -{ bProjectileFire=True ProjPerFire=10//7 ProjSpawnOffset=(X=25.000000,Y=5.000000,Z=-6.000000) EffectiveRange=700.000000 KickMomentum=(X=-85.000000,Z=15.000000) LowGravKickMomentumScale=10.000000 ProjectileSpeed=18200.000000 bulletClass=Class'NicePack.NiceShotgunPellet' FireAimedAnim="Fire_Iron" RecoilRate=0.050000 maxVerticalRecoilAngle=1500 maxHorizontalRecoilAngle=900 bRandomPitchFireSound=False FireSoundRef="KF_PumpSGSnd.SG_Fire" StereoFireSoundRef="KF_PumpSGSnd.SG_FireST" NoAmmoSoundRef="KF_PumpSGSnd.SG_DryFire" DamageType=Class'NicePack.NiceDamTypeShotgun' DamageMax=63//56 Momentum=50000.000000 bWaitForRelease=True bAttachSmokeEmitter=True TransientSoundVolume=2.000000 TransientSoundRadius=500.000000 FireEndAnim= FireAnimRate=0.950000 FireForce="FlakCannonFire" FireRate=0.965000 AmmoClass=Class'NicePack.NiceShotgunAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=400.000000) ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=12500.000000) ShakeRotTime=5.000000 ShakeOffsetMag=(X=6.000000,Y=2.000000,Z=10.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=3.000000 BotRefireRate=1.500000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' aimerror=1.000000 Spread=3000.0//1125.000000 SpreadStyle=SS_Random +class NiceShotgunFire extends NiceFire; +defaultproperties +{ + bProjectileFire=True + ProjPerFire=10//7 + ProjSpawnOffset=(X=25.000000,Y=5.000000,Z=-6.000000) + EffectiveRange=700.000000 + KickMomentum=(X=-85.000000,Z=15.000000) + LowGravKickMomentumScale=10.000000 + ProjectileSpeed=18200.000000 + bulletClass=Class'NicePack.NiceShotgunPellet' + FireAimedAnim="Fire_Iron" + RecoilRate=0.050000 + maxVerticalRecoilAngle=1500 + maxHorizontalRecoilAngle=900 + bRandomPitchFireSound=False + FireSoundRef="KF_PumpSGSnd.SG_Fire" + StereoFireSoundRef="KF_PumpSGSnd.SG_FireST" + NoAmmoSoundRef="KF_PumpSGSnd.SG_DryFire" + DamageType=Class'NicePack.NiceDamTypeShotgun' + DamageMax=63//56 + Momentum=50000.000000 + bWaitForRelease=True + bAttachSmokeEmitter=True + TransientSoundVolume=2.000000 + TransientSoundRadius=500.000000 + FireEndAnim= + FireAnimRate=0.950000 + FireForce="FlakCannonFire" + FireRate=0.965000 + AmmoClass=Class'NicePack.NiceShotgunAmmo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=400.000000) + ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=12500.000000) + ShakeRotTime=5.000000 + ShakeOffsetMag=(X=6.000000,Y=2.000000,Z=10.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=3.000000 + BotRefireRate=1.500000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' + aimerror=1.000000 + Spread=3000.0//1125.000000 + SpreadStyle=SS_Random } \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunPellet.uc b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunPellet.uc index bc95c82..1a4f375 100644 --- a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunPellet.uc +++ b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunPellet.uc @@ -1,4 +1,6 @@ -class NiceShotgunPellet extends NiceBullet; -defaultproperties -{ movementAcceleration=(Z=-1200.000000) regularImpact=(decalClass=Class'KFMod.ShotgunDecal') -} +class NiceShotgunPellet extends NiceBullet; +defaultproperties +{ + movementAcceleration=(Z=-1200.000000) + regularImpact=(decalClass=Class'KFMod.ShotgunDecal') +} diff --git a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunPickup.uc b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunPickup.uc index cc2c2f9..789f69a 100644 --- a/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunPickup.uc +++ b/sources/Weapons/Playable/Shotguns/PumpShotgun/NiceShotgunPickup.uc @@ -1,5 +1,27 @@ -class NiceShotgunPickup extends NiceWeaponPickup; - -defaultproperties -{ bBackupWeapon=True Weight=6.000000 cost=200 AmmoCost=15 BuyClipSize=8 PowerValue=70 SpeedValue=40 RangeValue=15 Description="A rugged tactical pump action shotgun common to police divisions the world over. It accepts a maximum of 8 shells and can fire in rapid succession." ItemName="Shotgun" ItemShortName="Shotgun" AmmoItemName="12-gauge shells" CorrespondingPerkIndex=1 EquipmentCategoryID=2 VariantClasses(0)=Class'KFMod.CamoShotgunPickup' InventoryType=Class'NicePack.NiceShotgun' PickupMessage="You got the Shotgun" PickupSound=Sound'KF_PumpSGSnd.SG_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.Shotgun.shotgun_pickup' CollisionRadius=35.000000 CollisionHeight=5.000000 +class NiceShotgunPickup extends NiceWeaponPickup; + +defaultproperties +{ + bBackupWeapon=True + Weight=6.000000 + cost=200 + AmmoCost=15 + BuyClipSize=8 + PowerValue=70 + SpeedValue=40 + RangeValue=15 + Description="A rugged tactical pump action shotgun common to police divisions the world over. It accepts a maximum of 8 shells and can fire in rapid succession." + ItemName="Shotgun" + ItemShortName="Shotgun" + AmmoItemName="12-gauge shells" + CorrespondingPerkIndex=1 + EquipmentCategoryID=2 + VariantClasses(0)=Class'KFMod.CamoShotgunPickup' + InventoryType=Class'NicePack.NiceShotgun' + PickupMessage="You got the Shotgun" + PickupSound=Sound'KF_PumpSGSnd.SG_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups_Trip.Shotgun.shotgun_pickup' + CollisionRadius=35.000000 + CollisionHeight=5.000000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/Saiga/NiceDamTypeSaiga12c.uc b/sources/Weapons/Playable/Shotguns/Saiga/NiceDamTypeSaiga12c.uc index 5a1c55b..e6294d1 100644 Binary files a/sources/Weapons/Playable/Shotguns/Saiga/NiceDamTypeSaiga12c.uc and b/sources/Weapons/Playable/Shotguns/Saiga/NiceDamTypeSaiga12c.uc differ diff --git a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12c.uc b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12c.uc index 79fac5a..38e4603 100644 --- a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12c.uc +++ b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12c.uc @@ -1,4 +1,51 @@ -class NiceSaiga12c extends NiceWeapon; -defaultproperties -{ reloadPreEndFrame=0.250000 reloadEndFrame=0.525000 reloadChargeEndFrame=0.788000 reloadMagStartFrame=0.444000 reloadChargeStartFrame=0.596000 MagazineBone="wpn_mag" MagCapacity=8 ReloadRate=3.133000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_AK47" bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 SleeveNum=2 TraderInfoTexture=Texture'ScrnWeaponPack_T.saiga.Saiga_Trader' bIsTier3Weapon=True MeshRef="ScrnWeaponPack_A.saigacmesh" SkinRefs(0)="ScrnWeaponPack_T.saiga.saiga" SkinRefs(1)="ScrnWeaponPack_T.saiga.saigaparts" SkinRefs(2)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" SkinRefs(3)="ScrnWeaponPack_T.saiga.wpn_gilza1" SelectSoundRef="KF_PumpSGSnd.SG_Select" HudImageRef="ScrnWeaponPack_T.saiga.Saiga_Unselected" SelectedHudImageRef="ScrnWeaponPack_T.saiga.Saiga_selected" PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceSaiga12cFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 Description="12-gauge combat shotgun, visually patterned after the Kalashnikov series of assault rifles. Shoots small amount of high-damage projectiles." EffectOffset=(X=100.000000,Y=25.000000,Z=-100.000000) DisplayFOV=65.000000 Priority=160 InventoryGroup=4 GroupOffset=10 PickupClass=Class'NicePack.NiceSaiga12cPickup' PlayerViewOffset=(X=10.000000,Y=8.000000,Z=-4.000000) BobDamping=4.000000 AttachmentClass=Class'NicePack.NiceSaiga12cAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="Saiga-12s" DrawScale=0.850000 TransientSoundVolume=1.250000 -} +class NiceSaiga12c extends NiceWeapon; +defaultproperties +{ + reloadPreEndFrame=0.250000 + reloadEndFrame=0.525000 + reloadChargeEndFrame=0.788000 + reloadMagStartFrame=0.444000 + reloadChargeStartFrame=0.596000 + MagazineBone="wpn_mag" + MagCapacity=8 + ReloadRate=3.133000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_AK47" + bHasAimingMode=True + IdleAimAnim="Iron_Idle" + StandardDisplayFOV=65.000000 + SleeveNum=2 + TraderInfoTexture=Texture'ScrnWeaponPack_T.saiga.Saiga_Trader' + bIsTier3Weapon=True + MeshRef="ScrnWeaponPack_A.saigacmesh" + SkinRefs(0)="ScrnWeaponPack_T.saiga.saiga" + SkinRefs(1)="ScrnWeaponPack_T.saiga.saigaparts" + SkinRefs(2)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" + SkinRefs(3)="ScrnWeaponPack_T.saiga.wpn_gilza1" + SelectSoundRef="KF_PumpSGSnd.SG_Select" + HudImageRef="ScrnWeaponPack_T.saiga.Saiga_Unselected" + SelectedHudImageRef="ScrnWeaponPack_T.saiga.Saiga_selected" + PlayerIronSightFOV=65.000000 + ZoomedDisplayFOV=32.000000 + FireModeClass(0)=Class'NicePack.NiceSaiga12cFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + Description="12-gauge combat shotgun, visually patterned after the Kalashnikov series of assault rifles. Shoots small amount of high-damage projectiles." + EffectOffset=(X=100.000000,Y=25.000000,Z=-100.000000) + DisplayFOV=65.000000 + Priority=160 + InventoryGroup=4 + GroupOffset=10 + PickupClass=Class'NicePack.NiceSaiga12cPickup' + PlayerViewOffset=(X=10.000000,Y=8.000000,Z=-4.000000) + BobDamping=4.000000 + AttachmentClass=Class'NicePack.NiceSaiga12cAttachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="Saiga-12s" + DrawScale=0.850000 + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAmmo.uc b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAmmo.uc index 91587ee..85ff474 100644 --- a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAmmo.uc +++ b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAmmo.uc @@ -1,5 +1,12 @@ -class NiceSaiga12cAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceSaiga12cPickup' AmmoPickupAmount=8 MaxAmmo=72 InitialAmount=18 PickupClass=Class'NicePack.NiceSaiga12cAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) -} +class NiceSaiga12cAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceSaiga12cPickup' + AmmoPickupAmount=8 + MaxAmmo=72 + InitialAmount=18 + PickupClass=Class'NicePack.NiceSaiga12cAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAmmoPickup.uc b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAmmoPickup.uc index 82b1e16..a602a6b 100644 --- a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAmmoPickup.uc +++ b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceSaiga12cAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=8 InventoryType=Class'NicePack.NiceSaiga12cAmmo' PickupMessage="12-gauge" StaticMesh=None -} +class NiceSaiga12cAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=8 + InventoryType=Class'NicePack.NiceSaiga12cAmmo' + PickupMessage="12-gauge" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAttachment.uc b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAttachment.uc index fd78980..cfcf491 100644 --- a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAttachment.uc +++ b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cAttachment.uc @@ -1,4 +1,57 @@ -class NiceSaiga12cAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' ShellEjectBoneName="wpn_scope" MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="Fire_AK47" FireAltAnims(1)="Fire_AK47" FireAltAnims(2)="Fire_AK47" FireAltAnims(3)="Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="ScrnWeaponPack_A.saigac3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 DrawScale=0.650000 -} +class NiceSaiga12cAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' + ShellEjectBoneName="wpn_scope" + MovementAnims(0)="JogF_AK47" + MovementAnims(1)="JogB_AK47" + MovementAnims(2)="JogL_AK47" + MovementAnims(3)="JogR_AK47" + TurnLeftAnim="TurnL_AK47" + TurnRightAnim="TurnR_AK47" + CrouchAnims(0)="CHWalkF_AK47" + CrouchAnims(1)="CHWalkB_AK47" + CrouchAnims(2)="CHWalkL_AK47" + CrouchAnims(3)="CHWalkR_AK47" + WalkAnims(0)="WalkF_AK47" + WalkAnims(1)="WalkB_AK47" + WalkAnims(2)="WalkL_AK47" + WalkAnims(3)="WalkR_AK47" + CrouchTurnRightAnim="CH_TurnR_AK47" + CrouchTurnLeftAnim="CH_TurnL_AK47" + IdleCrouchAnim="CHIdle_AK47" + IdleWeaponAnim="Idle_AK47" + IdleRestAnim="Idle_AK47" + IdleChatAnim="Idle_AK47" + IdleHeavyAnim="Idle_AK47" + IdleRifleAnim="Idle_AK47" + FireAnims(0)="Fire_AK47" + FireAnims(1)="Fire_AK47" + FireAnims(2)="Fire_AK47" + FireAnims(3)="Fire_AK47" + FireAltAnims(0)="Fire_AK47" + FireAltAnims(1)="Fire_AK47" + FireAltAnims(2)="Fire_AK47" + FireAltAnims(3)="Fire_AK47" + FireCrouchAnims(0)="CHFire_AK47" + FireCrouchAnims(1)="CHFire_AK47" + FireCrouchAnims(2)="CHFire_AK47" + FireCrouchAnims(3)="CHFire_AK47" + FireCrouchAltAnims(0)="CHFire_AK47" + FireCrouchAltAnims(1)="CHFire_AK47" + FireCrouchAltAnims(2)="CHFire_AK47" + FireCrouchAltAnims(3)="CHFire_AK47" + HitAnims(0)="HitF_AK47" + HitAnims(1)="HitB_AK47" + HitAnims(2)="HitL_AK47" + HitAnims(3)="HitR_AK47" + PostFireBlendStandAnim="Blend_AK47" + PostFireBlendCrouchAnim="CHBlend_AK47" + MeshRef="ScrnWeaponPack_A.saigac3rd" + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 + DrawScale=0.650000 +} diff --git a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cFire.uc b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cFire.uc index 4da58bd..1aa7253 100644 --- a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cFire.uc +++ b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cFire.uc @@ -1,9 +1,27 @@ -class NiceSaiga12cFire extends NiceShotgunFire; -function InitEffects() -{ - Super.InitEffects(); - if(FlashEmitter != none) Weapon.AttachToBone(FlashEmitter, 'tip'); -} -defaultproperties -{ ProjPerFire=4 KickMomentum=(X=-95.000000,Z=25.000000) ProjectileSpeed=3500.000000 FireAimedAnim="Fire" maxVerticalRecoilAngle=1300 maxHorizontalRecoilAngle=700 FireSoundRef="ScrnWeaponPack_SND.saiga.shot_mono" StereoFireSoundRef="ScrnWeaponPack_SND.saiga.shot_stereo" NoAmmoSoundRef="ScrnWeaponPack_SND.saiga.Saiga_empty" DamageType=Class'NicePack.NiceDamTypeSaiga12c' DamageMax=66 Momentum=60000.000000 bModeExclusive=False FireRate=0.600000 AmmoClass=Class'NicePack.NiceSaiga12cAmmo' BotRefireRate=0.250000 Spread=825.000000 -} +class NiceSaiga12cFire extends NiceShotgunFire; +function InitEffects() +{ + Super.InitEffects(); + if(FlashEmitter != none) + Weapon.AttachToBone(FlashEmitter, 'tip'); +} +defaultproperties +{ + ProjPerFire=4 + KickMomentum=(X=-95.000000,Z=25.000000) + ProjectileSpeed=3500.000000 + FireAimedAnim="Fire" + maxVerticalRecoilAngle=1300 + maxHorizontalRecoilAngle=700 + FireSoundRef="ScrnWeaponPack_SND.saiga.shot_mono" + StereoFireSoundRef="ScrnWeaponPack_SND.saiga.shot_stereo" + NoAmmoSoundRef="ScrnWeaponPack_SND.saiga.Saiga_empty" + DamageType=Class'NicePack.NiceDamTypeSaiga12c' + DamageMax=66 + Momentum=60000.000000 + bModeExclusive=False + FireRate=0.600000 + AmmoClass=Class'NicePack.NiceSaiga12cAmmo' + BotRefireRate=0.250000 + Spread=825.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cPickup.uc b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cPickup.uc index cb2413d..69598d3 100644 --- a/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cPickup.uc +++ b/sources/Weapons/Playable/Shotguns/Saiga/NiceSaiga12cPickup.uc @@ -1,4 +1,22 @@ -class NiceSaiga12cPickup extends NiceWeaponPickup; -defaultproperties -{ AmmoCost=50 BuyClipSize=8 PowerValue=87 SpeedValue=45 RangeValue=20 Description="12-gauge combat shotgun, visually patterned after the Kalashnikov series of assault rifles. Shoots small amount of high-damage projectiles." ItemName="Saiga-12s" ItemShortName="Saiga-12s" AmmoItemName="12-gauge" CorrespondingPerkIndex=1 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceSaiga12c' PickupMessage="You've got Saiga-12s" PickupSound=Sound'KF_AA12Snd.AA12_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.saiga_sm' CollisionRadius=35.000000 CollisionHeight=5.000000 -} +class NiceSaiga12cPickup extends NiceWeaponPickup; +defaultproperties +{ + AmmoCost=50 + BuyClipSize=8 + PowerValue=87 + SpeedValue=45 + RangeValue=20 + Description="12-gauge combat shotgun, visually patterned after the Kalashnikov series of assault rifles. Shoots small amount of high-damage projectiles." + ItemName="Saiga-12s" + ItemShortName="Saiga-12s" + AmmoItemName="12-gauge" + CorrespondingPerkIndex=1 + EquipmentCategoryID=3 + InventoryType=Class'NicePack.NiceSaiga12c' + PickupMessage="You've got Saiga-12s" + PickupSound=Sound'KF_AA12Snd.AA12_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'ScrnWeaponPack_SM.saiga_sm' + CollisionRadius=35.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/Spas/NiceDamTypeSpas.uc b/sources/Weapons/Playable/Shotguns/Spas/NiceDamTypeSpas.uc index c86b37d..71bf883 100644 --- a/sources/Weapons/Playable/Shotguns/Spas/NiceDamTypeSpas.uc +++ b/sources/Weapons/Playable/Shotguns/Spas/NiceDamTypeSpas.uc @@ -1,5 +1,7 @@ -class NiceDamTypeSpas extends NiceDamTypeShotgun - abstract; -defaultproperties -{ WeaponClass=Class'NicePack.NiceSpas' DeathString="%k killed %o (SPAS-12)." -} +class NiceDamTypeSpas extends NiceDamTypeShotgun + abstract; +defaultproperties +{ + WeaponClass=Class'NicePack.NiceSpas' + DeathString="%k killed %o (SPAS-12)." +} diff --git a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAltFire.uc b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAltFire.uc index 57664cb..8b97ecb 100644 --- a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAltFire.uc +++ b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAltFire.uc @@ -1,4 +1,9 @@ -class NiceSpasAltFire extends NiceSpasFire; -defaultproperties -{ maxVerticalRecoilAngle=300 maxHorizontalRecoilAngle=180 FireAnimRate=0.650000 FireRate=1.400000 Spread=0.000000 -} +class NiceSpasAltFire extends NiceSpasFire; +defaultproperties +{ + maxVerticalRecoilAngle=300 + maxHorizontalRecoilAngle=180 + FireAnimRate=0.650000 + FireRate=1.400000 + Spread=0.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAmmo.uc b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAmmo.uc index d07c8cc..20c1fc7 100644 --- a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAmmo.uc +++ b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAmmo.uc @@ -1,5 +1,12 @@ -class NiceSpasAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceSpasPickup' AmmoPickupAmount=8 MaxAmmo=64 InitialAmount=16 PickupClass=Class'NicePack.NiceSpasAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) -} +class NiceSpasAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceSpasPickup' + AmmoPickupAmount=8 + MaxAmmo=64 + InitialAmount=16 + PickupClass=Class'NicePack.NiceSpasAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAmmoPickup.uc b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAmmoPickup.uc index 14d2b3a..614f873 100644 --- a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAmmoPickup.uc +++ b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceSpasAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=8 InventoryType=Class'NicePack.NiceSpasAmmo' PickupMessage="12-Gauge Shells" StaticMesh=None -} +class NiceSpasAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=8 + InventoryType=Class'NicePack.NiceSpasAmmo' + PickupMessage="12-Gauge Shells" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAttachment.uc b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAttachment.uc index d60f1c5..9179277 100644 --- a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAttachment.uc +++ b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasAttachment.uc @@ -1,4 +1,51 @@ -class NiceSpasAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' MovementAnims(0)="JogF_Shotgun" MovementAnims(1)="JogB_Shotgun" MovementAnims(2)="JogL_Shotgun" MovementAnims(3)="JogR_Shotgun" TurnLeftAnim="TurnL_Shotgun" TurnRightAnim="TurnR_Shotgun" CrouchAnims(0)="CHwalkF_Shotgun" CrouchAnims(1)="CHwalkB_Shotgun" CrouchAnims(2)="CHwalkL_Shotgun" CrouchAnims(3)="CHwalkR_Shotgun" WalkAnims(0)="WalkF_Shotgun" WalkAnims(1)="WalkB_Shotgun" WalkAnims(2)="WalkL_Shotgun" WalkAnims(3)="WalkR_Shotgun" CrouchTurnRightAnim="CH_TurnR_Shotgun" CrouchTurnLeftAnim="CH_TurnL_Shotgun" IdleCrouchAnim="CHIdle_Shotgun" IdleWeaponAnim="Idle_Shotgun" IdleRestAnim="Idle_Shotgun" IdleChatAnim="Idle_Shotgun" IdleHeavyAnim="Idle_Shotgun" IdleRifleAnim="Idle_Shotgun" FireAnims(0)="Fire_Shotgun" FireAnims(1)="Fire_Shotgun" FireAnims(2)="Fire_Shotgun" FireAnims(3)="Fire_Shotgun" FireAltAnims(0)="Fire_Shotgun" FireAltAnims(1)="Fire_Shotgun" FireAltAnims(2)="Fire_Shotgun" FireAltAnims(3)="Fire_Shotgun" FireCrouchAnims(0)="CHFire_Shotgun" FireCrouchAnims(1)="CHFire_Shotgun" FireCrouchAnims(2)="CHFire_Shotgun" FireCrouchAnims(3)="CHFire_Shotgun" FireCrouchAltAnims(0)="CHFire_Shotgun" FireCrouchAltAnims(1)="CHFire_Shotgun" FireCrouchAltAnims(2)="CHFire_Shotgun" FireCrouchAltAnims(3)="CHFire_Shotgun" HitAnims(0)="HitF_Shotgun" HitAnims(1)="HitB_Shotgun" HitAnims(2)="HitL_Shotgun" HitAnims(3)="HitR_Shotgun" PostFireBlendStandAnim="Blend_Shotgun" PostFireBlendCrouchAnim="CHBlend_Shotgun" MeshRef="ScrnWeaponPack_A.Spas12_3rd" -} +class NiceSpasAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdKar' + mShellCaseEmitterClass=Class'KFMod.KFShotgunShellSpewer' + MovementAnims(0)="JogF_Shotgun" + MovementAnims(1)="JogB_Shotgun" + MovementAnims(2)="JogL_Shotgun" + MovementAnims(3)="JogR_Shotgun" + TurnLeftAnim="TurnL_Shotgun" + TurnRightAnim="TurnR_Shotgun" + CrouchAnims(0)="CHwalkF_Shotgun" + CrouchAnims(1)="CHwalkB_Shotgun" + CrouchAnims(2)="CHwalkL_Shotgun" + CrouchAnims(3)="CHwalkR_Shotgun" + WalkAnims(0)="WalkF_Shotgun" + WalkAnims(1)="WalkB_Shotgun" + WalkAnims(2)="WalkL_Shotgun" + WalkAnims(3)="WalkR_Shotgun" + CrouchTurnRightAnim="CH_TurnR_Shotgun" + CrouchTurnLeftAnim="CH_TurnL_Shotgun" + IdleCrouchAnim="CHIdle_Shotgun" + IdleWeaponAnim="Idle_Shotgun" + IdleRestAnim="Idle_Shotgun" + IdleChatAnim="Idle_Shotgun" + IdleHeavyAnim="Idle_Shotgun" + IdleRifleAnim="Idle_Shotgun" + FireAnims(0)="Fire_Shotgun" + FireAnims(1)="Fire_Shotgun" + FireAnims(2)="Fire_Shotgun" + FireAnims(3)="Fire_Shotgun" + FireAltAnims(0)="Fire_Shotgun" + FireAltAnims(1)="Fire_Shotgun" + FireAltAnims(2)="Fire_Shotgun" + FireAltAnims(3)="Fire_Shotgun" + FireCrouchAnims(0)="CHFire_Shotgun" + FireCrouchAnims(1)="CHFire_Shotgun" + FireCrouchAnims(2)="CHFire_Shotgun" + FireCrouchAnims(3)="CHFire_Shotgun" + FireCrouchAltAnims(0)="CHFire_Shotgun" + FireCrouchAltAnims(1)="CHFire_Shotgun" + FireCrouchAltAnims(2)="CHFire_Shotgun" + FireCrouchAltAnims(3)="CHFire_Shotgun" + HitAnims(0)="HitF_Shotgun" + HitAnims(1)="HitB_Shotgun" + HitAnims(2)="HitL_Shotgun" + HitAnims(3)="HitR_Shotgun" + PostFireBlendStandAnim="Blend_Shotgun" + PostFireBlendCrouchAnim="CHBlend_Shotgun" + MeshRef="ScrnWeaponPack_A.Spas12_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasFire.uc b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasFire.uc index 06955e4..5d5c8d1 100644 --- a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasFire.uc +++ b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasFire.uc @@ -1,4 +1,6 @@ -class NiceSpasFire extends NiceShotgunFire; -defaultproperties -{ DamageType=Class'NicePack.NiceDamTypeSpas' AmmoClass=Class'NicePack.NiceSpasAmmo' -} +class NiceSpasFire extends NiceShotgunFire; +defaultproperties +{ + DamageType=Class'NicePack.NiceDamTypeSpas' + AmmoClass=Class'NicePack.NiceSpasAmmo' +} diff --git a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasPickup.uc b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasPickup.uc index 3816e49..8e4f17e 100644 --- a/sources/Weapons/Playable/Shotguns/Spas/NiceSpasPickup.uc +++ b/sources/Weapons/Playable/Shotguns/Spas/NiceSpasPickup.uc @@ -1,6 +1,24 @@ -class NiceSpasPickup extends NiceWeaponPickup; - -defaultproperties -{ - cost=750 Weight=8.000000 BuyClipSize=10 PowerValue=55 SpeedValue=40 RangeValue=17 Description="The SPAS12 is a dual-mode shotgun, that can also be used for firing slugs." ItemName="SPAS-12" ItemShortName="SPAS-12" AmmoItemName="12-gauge shells" CorrespondingPerkIndex=1 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceSpas' PickupMessage="You got the SPAS-12" PickupSound=Sound'KF_PumpSGSnd.SG_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.spas12_pickup' CollisionRadius=35.000000 CollisionHeight=5.000000 +class NiceSpasPickup extends NiceWeaponPickup; + +defaultproperties +{ + cost=750 + Weight=8.000000 + BuyClipSize=10 + PowerValue=55 + SpeedValue=40 + RangeValue=17 + Description="The SPAS12 is a dual-mode shotgun, that can also be used for firing slugs." + ItemName="SPAS-12" + ItemShortName="SPAS-12" + AmmoItemName="12-gauge shells" + CorrespondingPerkIndex=1 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceSpas' + PickupMessage="You got the SPAS-12" + PickupSound=Sound'KF_PumpSGSnd.SG_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'ScrnWeaponPack_SM.spas12_pickup' + CollisionRadius=35.000000 + CollisionHeight=5.000000 } \ No newline at end of file diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceDamTypeSPShotgun.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceDamTypeSPShotgun.uc index d376a42..73cf9f3 100644 --- a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceDamTypeSPShotgun.uc +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceDamTypeSPShotgun.uc @@ -1,5 +1,19 @@ -class NiceDamTypeSPShotgun extends NiceDamageTypeVetEnforcer - abstract; -defaultproperties -{ MaxPenetrations=5 PenDmgReduction=0.900000 bIsPowerWeapon=True WeaponClass=Class'NicePack.NiceSPAutoShotgun' DeathString="%k killed %o (M.C.Z. Thrower)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True FlashFog=(X=600.000000) KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.700000 -} +class NiceDamTypeSPShotgun extends NiceDamageTypeVetEnforcer + abstract; +defaultproperties +{ + MaxPenetrations=5 + PenDmgReduction=0.900000 + bIsPowerWeapon=True + WeaponClass=Class'NicePack.NiceSPAutoShotgun' + DeathString="%k killed %o (M.C.Z. Thrower)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + FlashFog=(X=600.000000) + KDamageImpulse=10000.000000 + KDeathVel=300.000000 + KDeathUpKick=100.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPAutoShotgun.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPAutoShotgun.uc index e663d1b..10fbd9b 100644 --- a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPAutoShotgun.uc +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPAutoShotgun.uc @@ -1,19 +1,72 @@ -class NiceSPAutoShotgun extends NiceWeapon; -// Toggle semi/auto fire -simulated function DoToggle (){} -// Set the new fire mode on the server -function ServerChangeFireMode(bool bNewWaitForRelease){} -exec function SwitchModes(){} -simulated function WeaponTick(float dt) -{ - local float SteamCharge; - local rotator DialRot; - super.WeaponTick(dt); - if(Level.NetMode!=NM_DedicatedServer){ if(FireMode[1].NextFireTime >= Level.TimeSeconds) SteamCharge = 1.0 - ((FireMode[1].NextFireTime - Level.TimeSeconds)/FireMode[1].FireRate); else SteamCharge = 1.0; - if(SteamCharge > 0.1 && FireMode[0].NextFireTime >= Level.TimeSeconds) SteamCharge -= 0.1 * ((FireMode[0].NextFireTime - Level.TimeSeconds)/FireMode[0].FireRate); - DialRot.roll = 26500 - ( 53000 * SteamCharge ); SetBoneRotation('Dail2',DialRot,1.0); - } -} -defaultproperties -{ reloadPreEndFrame=0.143000 reloadEndFrame=0.633000 reloadChargeEndFrame=-1.000000 reloadMagStartFrame=0.276000 reloadChargeStartFrame=-1.000000 MagCapacity=10 ReloadRate=2.640000 ReloadAnim="Reload" ReloadAnimRate=1.250000 WeaponReloadAnim="Reload_IJC_spJackHammer" Weight=7.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 SleeveNum=0 TraderInfoTexture=Texture'KF_IJC_HUD.Trader_Weapon_Icons.Trader_Jackhammer' MeshRef="KF_IJC_Summer_Weps1.Jackhammer" SkinRefs(0)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" SkinRefs(1)="KF_IJC_Summer_Weapons.Jackhammer.jackhammer_cmb" SkinRefs(2)="KF_Weapons_Trip_T.Rifles.crossbow_cmb" SelectSoundRef="KF_SP_ZEDThrowerSnd.KFO_Shotgun_Select" HudImageRef="KF_IJC_HUD.WeaponSelect.Jackhammer_unselected" SelectedHudImageRef="KF_IJC_HUD.WeaponSelect.Jackhammer" PlayerIronSightFOV=80.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceSPShotgunFire' FireModeClass(1)=Class'NicePack.NiceSPShotgunAltFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="A device for throwing lead and getting sodding enemies out of your face." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=65.000000 Priority=167 InventoryGroup=4 GroupOffset=15 PickupClass=Class'NicePack.NiceSPShotgunPickup' PlayerViewOffset=(X=20.000000,Y=23.000000,Z=-2.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceSPShotgunAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="Multichamber ZED Thrower" TransientSoundVolume=1.250000 -} +class NiceSPAutoShotgun extends NiceWeapon; +// Toggle semi/auto fire +simulated function DoToggle (){} +// Set the new fire mode on the server +function ServerChangeFireMode(bool bNewWaitForRelease){} +exec function SwitchModes(){} +simulated function WeaponTick(float dt) +{ + local float SteamCharge; + local rotator DialRot; + super.WeaponTick(dt); + if(Level.NetMode!=NM_DedicatedServer){ + if(FireMode[1].NextFireTime >= Level.TimeSeconds) + SteamCharge = 1.0 - ((FireMode[1].NextFireTime - Level.TimeSeconds)/FireMode[1].FireRate); + else + SteamCharge = 1.0; + + if(SteamCharge > 0.1 && FireMode[0].NextFireTime >= Level.TimeSeconds) + SteamCharge -= 0.1 * ((FireMode[0].NextFireTime - Level.TimeSeconds)/FireMode[0].FireRate); + + DialRot.roll = 26500 - ( 53000 * SteamCharge ); + SetBoneRotation('Dail2',DialRot,1.0); + } +} +defaultproperties +{ + reloadPreEndFrame=0.143000 + reloadEndFrame=0.633000 + reloadChargeEndFrame=-1.000000 + reloadMagStartFrame=0.276000 + reloadChargeStartFrame=-1.000000 + MagCapacity=10 + ReloadRate=2.640000 + ReloadAnim="Reload" + ReloadAnimRate=1.250000 + WeaponReloadAnim="Reload_IJC_spJackHammer" + Weight=7.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=65.000000 + SleeveNum=0 + TraderInfoTexture=Texture'KF_IJC_HUD.Trader_Weapon_Icons.Trader_Jackhammer' + MeshRef="KF_IJC_Summer_Weps1.Jackhammer" + SkinRefs(0)="KF_Weapons_Trip_T.hands.hands_1stP_military_cmb" + SkinRefs(1)="KF_IJC_Summer_Weapons.Jackhammer.jackhammer_cmb" + SkinRefs(2)="KF_Weapons_Trip_T.Rifles.crossbow_cmb" + SelectSoundRef="KF_SP_ZEDThrowerSnd.KFO_Shotgun_Select" + HudImageRef="KF_IJC_HUD.WeaponSelect.Jackhammer_unselected" + SelectedHudImageRef="KF_IJC_HUD.WeaponSelect.Jackhammer" + PlayerIronSightFOV=80.000000 + ZoomedDisplayFOV=45.000000 + FireModeClass(0)=Class'NicePack.NiceSPShotgunFire' + FireModeClass(1)=Class'NicePack.NiceSPShotgunAltFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="A device for throwing lead and getting sodding enemies out of your face." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=65.000000 + Priority=167 + InventoryGroup=4 + GroupOffset=15 + PickupClass=Class'NicePack.NiceSPShotgunPickup' + PlayerViewOffset=(X=20.000000,Y=23.000000,Z=-2.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceSPShotgunAttachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="Multichamber ZED Thrower" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeAmmo.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeAmmo.uc index 910ba81..24b11fd 100644 --- a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeAmmo.uc +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeAmmo.uc @@ -1,4 +1,8 @@ -class NiceSPGrenadeAmmo extends SPGrenadeAmmo; -defaultproperties -{ AmmoPickupAmount=2 MaxAmmo=16 InitialAmount=8 PickupClass=Class'NicePack.NiceSPGrenadeAmmoPickup' -} +class NiceSPGrenadeAmmo extends SPGrenadeAmmo; +defaultproperties +{ + AmmoPickupAmount=2 + MaxAmmo=16 + InitialAmount=8 + PickupClass=Class'NicePack.NiceSPGrenadeAmmoPickup' +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeAmmoPickup.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeAmmoPickup.uc index 49f94ff..4fa7441 100644 --- a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeAmmoPickup.uc +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeAmmoPickup.uc @@ -1,4 +1,6 @@ -class NiceSPGrenadeAmmoPickup extends SPGrenadeAmmoPickup; -defaultproperties -{ AmmoAmount=2 InventoryType=Class'NicePack.NiceSPGrenadeAmmo' -} +class NiceSPGrenadeAmmoPickup extends SPGrenadeAmmoPickup; +defaultproperties +{ + AmmoAmount=2 + InventoryType=Class'NicePack.NiceSPGrenadeAmmo' +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeFire.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeFire.uc index a4aea87..e781ef9 100644 --- a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeFire.uc +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeFire.uc @@ -1,4 +1,6 @@ -class NiceSPGrenadeFire extends SPGrenadeFire; -defaultproperties -{ AmmoClass=Class'NicePack.NiceSPGrenadeAmmo' ProjectileClass=Class'NicePack.NiceSPGrenadeProjectile' -} +class NiceSPGrenadeFire extends SPGrenadeFire; +defaultproperties +{ + AmmoClass=Class'NicePack.NiceSPGrenadeAmmo' + ProjectileClass=Class'NicePack.NiceSPGrenadeProjectile' +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeLauncher.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeLauncher.uc index 594da3c..0d2500f 100644 --- a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeLauncher.uc +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeLauncher.uc @@ -1,4 +1,8 @@ -class NiceSPGrenadeLauncher extends SPGrenadeLauncher; -defaultproperties -{ AppID=0 FireModeClass(0)=Class'NicePack.NiceSPGrenadeFire' PickupClass=Class'NicePack.NiceSPGrenadePickup' ItemName="The Orca Bomb Propeller NW" -} +class NiceSPGrenadeLauncher extends SPGrenadeLauncher; +defaultproperties +{ + AppID=0 + FireModeClass(0)=Class'NicePack.NiceSPGrenadeFire' + PickupClass=Class'NicePack.NiceSPGrenadePickup' + ItemName="The Orca Bomb Propeller NW" +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadePickup.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadePickup.uc index 03026a7..b299031 100644 --- a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadePickup.uc +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadePickup.uc @@ -1,4 +1,8 @@ -class NiceSPGrenadePickup extends SPGrenadePickup; -defaultproperties -{ AmmoCost=12 ItemName="The Orca Bomb Propeller NW" ItemShortName="The Orca NW" InventoryType=Class'NicePack.NiceSPGrenadeLauncher' -} +class NiceSPGrenadePickup extends SPGrenadePickup; +defaultproperties +{ + AmmoCost=12 + ItemName="The Orca Bomb Propeller NW" + ItemShortName="The Orca NW" + InventoryType=Class'NicePack.NiceSPGrenadeLauncher' +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeProjectile.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeProjectile.uc index ecdc7b7..54b6037 100644 --- a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeProjectile.uc +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPGrenadeProjectile.uc @@ -1,5 +1,6 @@ -class NiceSPGrenadeProjectile extends SPGrenadeProjectile; -#exec OBJ LOAD FILE=ProjectileSounds.uax -defaultproperties -{ Damage=450.000000 -} +class NiceSPGrenadeProjectile extends SPGrenadeProjectile; +#exec OBJ LOAD FILE=ProjectileSounds.uax +defaultproperties +{ + Damage=450.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAltFire.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAltFire.uc index d10caf3..7498b72 100644 --- a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAltFire.uc +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAltFire.uc @@ -1,54 +1,112 @@ -class NiceSPShotgunAltFire extends NiceShotgunFire; -var InterpCurve AppliedMomentumCurve; // How much momentum to apply to a zed based on how much mass it has -var float WideDamageMinHitAngle; // The angle to do sweeping strikes in front of the player. If zero do no strikes -var float PushRange; // The range to push zeds away when firing -simulated function bool AllowFire(){ - if(currentContext.sourceWeapon == none || KFPawn(Instigator) == none) return false; - if(currentContext.sourceWeapon.bIsReloading) return false; - if(KFPawn(Instigator).SecondaryItem!=none) return false; - if(KFPawn(Instigator).bThrowingNade) return false; - // No ammo so just always fire - return true; -} -// No need to client-side this one -function bool IsClientSide(){ - return false; -} -// And there's nothing to force -function bool shouldFireProjectile(){ - return false; -} -function DoFireEffect(){ - local Vector StartProj, StartTrace, X,Y,Z; - local Rotator Aim; - local Vector HitLocation, HitNormal; - local Actor Other; - local Pawn Victims; - local vector dir, lookdir; - local float DiffAngle, VictimDist; - local float AppliedMomentum; - local vector vMomentum; - Instigator.MakeNoise(1.0); - Weapon.GetViewAxes(X,Y,Z); - StartTrace = Instigator.Location + Instigator.EyePosition(); - StartProj = StartTrace + X*ProjSpawnOffset.X; - if (!Weapon.WeaponCentered() && !KFWeap.bAimingRifle) StartProj = StartProj + Weapon.Hand * Y*ProjSpawnOffset.Y + Z*ProjSpawnOffset.Z; - // check if projectile would spawn through a wall and adjust start location accordingly - Other = Weapon.Trace(HitLocation, HitNormal, StartProj, StartTrace, false); - if(Other != none) StartProj = HitLocation; - Aim = AdjustAim(StartProj, AimError); - if(WideDamageMinHitAngle > 0){ foreach Weapon.VisibleCollidingActors(class'Pawn', Victims, (PushRange * 2), StartTrace){ if(Victims.Health <= 0) continue; if(Victims != Instigator){ // Don't push team mates if(Victims.GetTeamNum() == Instigator.GetTeamNum()) continue; VictimDist = VSizeSquared(Instigator.Location - Victims.Location); if(VictimDist > (((PushRange * 1.1) * (PushRange * 1.1)) + (Victims.CollisionRadius * Victims.CollisionRadius))) continue; - lookdir = Normal(Vector(Instigator.GetViewRotation())); dir = Normal(Victims.Location - Instigator.Location); DiffAngle = lookdir dot dir; dir = Normal((Victims.Location + Victims.EyePosition()) - Instigator.Location); - if(DiffAngle > WideDamageMinHitAngle){ AppliedMomentum = InterpCurveEval(AppliedMomentumCurve,Victims.Mass); HandleAchievement( Victims ); - vMomentum = (dir * AppliedMomentum)/Victims.Mass; Victims.AddVelocity(vMomentum); if(KFMonster(Victims) != none) KFMonster(Victims).BreakGrapple(); } } } - } - if(Instigator != none && Instigator.Physics == PHYS_Falling && Instigator.PhysicsVolume.Gravity.Z > class'PhysicsVolume'.default.Gravity.Z) Instigator.AddVelocity((KickMomentum * 10.0) >> Instigator.GetViewRotation()); -} -function HandleAchievement(Pawn Victim){ - local KFSteamStatsAndAchievements KFSteamStats; - if(Victim.IsA('NiceZombieScrake')){ if(PlayerController(Instigator.Controller) != none){ KFSteamStats = KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements); if(KFSteamStats != none) KFSteamStats.CheckAndSetAchievementComplete(KFSteamStats.KFACHIEVEMENT_PushScrakeSPJ); } - } -} -defaultproperties -{ AppliedMomentumCurve=(Points=((OutVal=10000.000000),(InVal=350.000000,OutVal=175000.000000),(InVal=600.000000,OutVal=250000.000000))) WideDamageMinHitAngle=0.600000 PushRange=150.000000 ProjPerFire=0 KickMomentum=(X=-35.000000,Z=5.000000) maxVerticalRecoilAngle=3200 FireSoundRef="KF_SP_ZEDThrowerSnd.KFO_Shotgun_Secondary_Fire_M" StereoFireSoundRef="KF_SP_ZEDThrowerSnd.KFO_Shotgun_Secondary_Fire_S" NoAmmoSoundRef="KF_AA12Snd.AA12_DryFire" bWaitForRelease=False bModeExclusive=False FireAnimRate=1.000000 FireRate=1.200000 AmmoClass=None AmmoPerFire=0 ShakeRotMag=(Z=250.000000) ShakeRotTime=3.000000 ShakeOffsetMag=(Z=6.000000) ShakeOffsetTime=1.250000 BotRefireRate=1.750000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSPShotgunAlt' Spread=0.000000 -} +class NiceSPShotgunAltFire extends NiceShotgunFire; +var InterpCurve AppliedMomentumCurve; // How much momentum to apply to a zed based on how much mass it has +var float WideDamageMinHitAngle; // The angle to do sweeping strikes in front of the player. If zero do no strikes +var float PushRange; // The range to push zeds away when firing +simulated function bool AllowFire(){ + if(currentContext.sourceWeapon == none || KFPawn(Instigator) == none) + return false; + if(currentContext.sourceWeapon.bIsReloading) + return false; + if(KFPawn(Instigator).SecondaryItem!=none) + return false; + if(KFPawn(Instigator).bThrowingNade) + return false; + // No ammo so just always fire + return true; +} +// No need to client-side this one +function bool IsClientSide(){ + return false; +} +// And there's nothing to force +function bool shouldFireProjectile(){ + return false; +} +function DoFireEffect(){ + local Vector StartProj, StartTrace, X,Y,Z; + local Rotator Aim; + local Vector HitLocation, HitNormal; + local Actor Other; + local Pawn Victims; + local vector dir, lookdir; + local float DiffAngle, VictimDist; + local float AppliedMomentum; + local vector vMomentum; + Instigator.MakeNoise(1.0); + Weapon.GetViewAxes(X,Y,Z); + StartTrace = Instigator.Location + Instigator.EyePosition(); + StartProj = StartTrace + X*ProjSpawnOffset.X; + if (!Weapon.WeaponCentered() && !KFWeap.bAimingRifle) + StartProj = StartProj + Weapon.Hand * Y*ProjSpawnOffset.Y + Z*ProjSpawnOffset.Z; + // check if projectile would spawn through a wall and adjust start location accordingly + Other = Weapon.Trace(HitLocation, HitNormal, StartProj, StartTrace, false); + if(Other != none) + StartProj = HitLocation; + Aim = AdjustAim(StartProj, AimError); + if(WideDamageMinHitAngle > 0){ + foreach Weapon.VisibleCollidingActors(class'Pawn', Victims, (PushRange * 2), StartTrace){ + if(Victims.Health <= 0) + continue; + if(Victims != Instigator){ + // Don't push team mates + if(Victims.GetTeamNum() == Instigator.GetTeamNum()) + continue; + VictimDist = VSizeSquared(Instigator.Location - Victims.Location); + if(VictimDist > (((PushRange * 1.1) * (PushRange * 1.1)) + (Victims.CollisionRadius * Victims.CollisionRadius))) + continue; + + lookdir = Normal(Vector(Instigator.GetViewRotation())); + dir = Normal(Victims.Location - Instigator.Location); + DiffAngle = lookdir dot dir; + dir = Normal((Victims.Location + Victims.EyePosition()) - Instigator.Location); + + if(DiffAngle > WideDamageMinHitAngle){ + AppliedMomentum = InterpCurveEval(AppliedMomentumCurve,Victims.Mass); + HandleAchievement( Victims ); + + vMomentum = (dir * AppliedMomentum)/Victims.Mass; + Victims.AddVelocity(vMomentum); + if(KFMonster(Victims) != none) + KFMonster(Victims).BreakGrapple(); + } + } + } + } + if(Instigator != none && Instigator.Physics == PHYS_Falling && Instigator.PhysicsVolume.Gravity.Z > class'PhysicsVolume'.default.Gravity.Z) + Instigator.AddVelocity((KickMomentum * 10.0) >> Instigator.GetViewRotation()); +} +function HandleAchievement(Pawn Victim){ + local KFSteamStatsAndAchievements KFSteamStats; + if(Victim.IsA('NiceZombieScrake')){ + if(PlayerController(Instigator.Controller) != none){ + KFSteamStats = KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements); + if(KFSteamStats != none) + KFSteamStats.CheckAndSetAchievementComplete(KFSteamStats.KFACHIEVEMENT_PushScrakeSPJ); + } + } +} +defaultproperties +{ + AppliedMomentumCurve=(Points=((OutVal=10000.000000),(InVal=350.000000,OutVal=175000.000000),(InVal=600.000000,OutVal=250000.000000))) + WideDamageMinHitAngle=0.600000 + PushRange=150.000000 + ProjPerFire=0 + KickMomentum=(X=-35.000000,Z=5.000000) + maxVerticalRecoilAngle=3200 + FireSoundRef="KF_SP_ZEDThrowerSnd.KFO_Shotgun_Secondary_Fire_M" + StereoFireSoundRef="KF_SP_ZEDThrowerSnd.KFO_Shotgun_Secondary_Fire_S" + NoAmmoSoundRef="KF_AA12Snd.AA12_DryFire" + bWaitForRelease=False + bModeExclusive=False + FireAnimRate=1.000000 + FireRate=1.200000 + AmmoClass=None + AmmoPerFire=0 + ShakeRotMag=(Z=250.000000) + ShakeRotTime=3.000000 + ShakeOffsetMag=(Z=6.000000) + ShakeOffsetTime=1.250000 + BotRefireRate=1.750000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSPShotgunAlt' + Spread=0.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAmmo.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAmmo.uc index c5501b2..2f4cb75 100644 --- a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAmmo.uc +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAmmo.uc @@ -1,5 +1,12 @@ -class NiceSPShotgunAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceSPShotgunPickup' AmmoPickupAmount=10 MaxAmmo=80 InitialAmount=20 PickupClass=Class'NicePack.NiceSPShotgunAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=451,Y1=445,X2=510,Y2=500) -} +class NiceSPShotgunAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceSPShotgunPickup' + AmmoPickupAmount=10 + MaxAmmo=80 + InitialAmount=20 + PickupClass=Class'NicePack.NiceSPShotgunAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=451,Y1=445,X2=510,Y2=500) +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAmmoPickup.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAmmoPickup.uc index 8934fcc..51ad6c9 100644 --- a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAmmoPickup.uc +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceSPShotgunAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=10 InventoryType=Class'NicePack.NiceSPShotgunAmmo' PickupMessage="12-Gauge Drum" StaticMesh=None -} +class NiceSPShotgunAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=10 + InventoryType=Class'NicePack.NiceSPShotgunAmmo' + PickupMessage="12-Gauge Drum" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAttachment.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAttachment.uc index bfc1602..a53e865 100644 --- a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAttachment.uc +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunAttachment.uc @@ -1,4 +1,50 @@ -class NiceSPShotgunAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdSPShotgun' MovementAnims(0)="JogF_AA12" MovementAnims(1)="JogB_AA12" MovementAnims(2)="JogL_AA12" MovementAnims(3)="JogR_AA12" TurnLeftAnim="TurnL_AA12" TurnRightAnim="TurnR_AA12" CrouchAnims(0)="CHWalkF_AA12" CrouchAnims(1)="CHWalkB_AA12" CrouchAnims(2)="CHWalkL_AA12" CrouchAnims(3)="CHWalkR_AA12" WalkAnims(0)="WalkF_AA12" WalkAnims(1)="WalkB_AA12" WalkAnims(2)="WalkL_AA12" WalkAnims(3)="WalkR_AA12" CrouchTurnRightAnim="CH_TurnR_AA12" CrouchTurnLeftAnim="CH_TurnL_AA12" IdleCrouchAnim="CHIdle_AA12" IdleWeaponAnim="Idle_AA12" IdleRestAnim="Idle_AA12" IdleChatAnim="Idle_AA12" IdleHeavyAnim="Idle_AA12" IdleRifleAnim="Idle_AA12" FireAnims(0)="Fire_AA12" FireAnims(1)="Fire_AA12" FireAnims(2)="Fire_AA12" FireAnims(3)="Fire_AA12" FireAltAnims(0)="Fire_AA12" FireAltAnims(1)="Fire_AA12" FireAltAnims(2)="Fire_AA12" FireAltAnims(3)="Fire_AA12" FireCrouchAnims(0)="CHFire_AA12" FireCrouchAnims(1)="CHFire_AA12" FireCrouchAnims(2)="CHFire_AA12" FireCrouchAnims(3)="CHFire_AA12" FireCrouchAltAnims(0)="CHFire_AA12" FireCrouchAltAnims(1)="CHFire_AA12" FireCrouchAltAnims(2)="CHFire_AA12" FireCrouchAltAnims(3)="CHFire_AA12" HitAnims(0)="HitF_AA12" HitAnims(1)="HitB_AA12" HitAnims(2)="HitL_AA12" HitAnims(3)="HitR_AA12" PostFireBlendStandAnim="Blend_AA12" PostFireBlendCrouchAnim="CHBlend_AA12" MeshRef="KF_Weapons3rd2_IJC.spJackHammer_3rd" -} +class NiceSPShotgunAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdSPShotgun' + MovementAnims(0)="JogF_AA12" + MovementAnims(1)="JogB_AA12" + MovementAnims(2)="JogL_AA12" + MovementAnims(3)="JogR_AA12" + TurnLeftAnim="TurnL_AA12" + TurnRightAnim="TurnR_AA12" + CrouchAnims(0)="CHWalkF_AA12" + CrouchAnims(1)="CHWalkB_AA12" + CrouchAnims(2)="CHWalkL_AA12" + CrouchAnims(3)="CHWalkR_AA12" + WalkAnims(0)="WalkF_AA12" + WalkAnims(1)="WalkB_AA12" + WalkAnims(2)="WalkL_AA12" + WalkAnims(3)="WalkR_AA12" + CrouchTurnRightAnim="CH_TurnR_AA12" + CrouchTurnLeftAnim="CH_TurnL_AA12" + IdleCrouchAnim="CHIdle_AA12" + IdleWeaponAnim="Idle_AA12" + IdleRestAnim="Idle_AA12" + IdleChatAnim="Idle_AA12" + IdleHeavyAnim="Idle_AA12" + IdleRifleAnim="Idle_AA12" + FireAnims(0)="Fire_AA12" + FireAnims(1)="Fire_AA12" + FireAnims(2)="Fire_AA12" + FireAnims(3)="Fire_AA12" + FireAltAnims(0)="Fire_AA12" + FireAltAnims(1)="Fire_AA12" + FireAltAnims(2)="Fire_AA12" + FireAltAnims(3)="Fire_AA12" + FireCrouchAnims(0)="CHFire_AA12" + FireCrouchAnims(1)="CHFire_AA12" + FireCrouchAnims(2)="CHFire_AA12" + FireCrouchAnims(3)="CHFire_AA12" + FireCrouchAltAnims(0)="CHFire_AA12" + FireCrouchAltAnims(1)="CHFire_AA12" + FireCrouchAltAnims(2)="CHFire_AA12" + FireCrouchAltAnims(3)="CHFire_AA12" + HitAnims(0)="HitF_AA12" + HitAnims(1)="HitB_AA12" + HitAnims(2)="HitL_AA12" + HitAnims(3)="HitR_AA12" + PostFireBlendStandAnim="Blend_AA12" + PostFireBlendCrouchAnim="CHBlend_AA12" + MeshRef="KF_Weapons3rd2_IJC.spJackHammer_3rd" +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunFire.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunFire.uc index 8e908cf..bea2e48 100644 --- a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunFire.uc +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunFire.uc @@ -1,4 +1,26 @@ -class NiceSPShotgunFire extends NiceShotgunFire; -defaultproperties -{ KickMomentum=(X=-35.000000,Z=5.000000) ProjectileSpeed=3500.000000 maxVerticalRecoilAngle=1000 maxHorizontalRecoilAngle=500 ShellEjectClass=Class'ROEffects.KFShellEjectShotty' ShellEjectBoneName="Shell_eject" FireSoundRef="KF_SP_ZEDThrowerSnd.KFO_Shotgun_Primary_Fire_M" StereoFireSoundRef="KF_SP_ZEDThrowerSnd.KFO_Shotgun_Primary_Fire_S" NoAmmoSoundRef="KF_AA12Snd.AA12_DryFire" DamageType=Class'NicePack.NiceDamTypeSPShotgun' DamageMax=30 Momentum=60000.000000 bWaitForRelease=False FireAnimRate=1.200000 FireRate=0.292000 AmmoClass=Class'NicePack.NiceSPShotgunAmmo' ShakeRotMag=(Z=250.000000) ShakeRotTime=3.000000 ShakeOffsetMag=(Z=6.000000) ShakeOffsetTime=1.250000 BotRefireRate=0.250000 Spread=1500.000000 -} +class NiceSPShotgunFire extends NiceShotgunFire; +defaultproperties +{ + KickMomentum=(X=-35.000000,Z=5.000000) + ProjectileSpeed=3500.000000 + maxVerticalRecoilAngle=1000 + maxHorizontalRecoilAngle=500 + ShellEjectClass=Class'ROEffects.KFShellEjectShotty' + ShellEjectBoneName="Shell_eject" + FireSoundRef="KF_SP_ZEDThrowerSnd.KFO_Shotgun_Primary_Fire_M" + StereoFireSoundRef="KF_SP_ZEDThrowerSnd.KFO_Shotgun_Primary_Fire_S" + NoAmmoSoundRef="KF_AA12Snd.AA12_DryFire" + DamageType=Class'NicePack.NiceDamTypeSPShotgun' + DamageMax=30 + Momentum=60000.000000 + bWaitForRelease=False + FireAnimRate=1.200000 + FireRate=0.292000 + AmmoClass=Class'NicePack.NiceSPShotgunAmmo' + ShakeRotMag=(Z=250.000000) + ShakeRotTime=3.000000 + ShakeOffsetMag=(Z=6.000000) + ShakeOffsetTime=1.250000 + BotRefireRate=0.250000 + Spread=1500.000000 +} diff --git a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunPickup.uc b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunPickup.uc index 5b99e33..26748d4 100644 --- a/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunPickup.uc +++ b/sources/Weapons/Playable/Shotguns/ZEDThrower/NiceSPShotgunPickup.uc @@ -1,4 +1,23 @@ -class NiceSPShotgunPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=7.000000 AmmoCost=30 BuyClipSize=8 PowerValue=60 SpeedValue=50 RangeValue=20 Description="A device for throwing lead and getting sodding enemies out of your face." ItemName="Multichamber ZED Thrower" ItemShortName="M.C.Z. Thrower" AmmoItemName="M.C.Z. Drum" CorrespondingPerkIndex=1 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceSPAutoShotgun' PickupMessage="You got the Multichamber Lead Thrower." PickupSound=Sound'KF_SP_ZEDThrowerSnd.KFO_Shotgun_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_IJC_Summer_Weps.Jackhammer' CollisionRadius=35.000000 CollisionHeight=5.000000 -} +class NiceSPShotgunPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=7.000000 + AmmoCost=30 + BuyClipSize=8 + PowerValue=60 + SpeedValue=50 + RangeValue=20 + Description="A device for throwing lead and getting sodding enemies out of your face." + ItemName="Multichamber ZED Thrower" + ItemShortName="M.C.Z. Thrower" + AmmoItemName="M.C.Z. Drum" + CorrespondingPerkIndex=1 + EquipmentCategoryID=3 + InventoryType=Class'NicePack.NiceSPAutoShotgun' + PickupMessage="You got the Multichamber Lead Thrower." + PickupSound=Sound'KF_SP_ZEDThrowerSnd.KFO_Shotgun_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_IJC_Summer_Weps.Jackhammer' + CollisionRadius=35.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbow.uc b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbow.uc index 0c06851..25c9e46 100644 --- a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbow.uc +++ b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbow.uc @@ -1,34 +1,86 @@ -class NiceCrossbow extends NiceScopedWeapon; -simulated function PostBeginPlay(){ - local AutoReloadAnimDesc reloadDesc; - autoReloadsDescriptions.Length = 0; - reloadDesc.canInterruptFrame = 0.349; - reloadDesc.trashStartFrame = 0.857; - reloadDesc.resumeFrame = 0.349; - reloadDesc.speedFrame = 0.143; - reloadDesc.animName = 'Fire'; - autoReloadsDescriptions[0] = reloadDesc; - reloadDesc.animName = 'Fire_Iron'; - autoReloadsDescriptions[1] = reloadDesc; - super.PostBeginPlay(); -} -// Adjust a single FOV based on the current aspect ratio. Adjust FOV is the default NON-aspect ratio adjusted FOV to adjust -simulated function float CalcAspectRatioAdjustedFOV(float AdjustFOV){ - local KFPlayerController KFPC; - local float ResX, ResY; - local float AspectRatio; - KFPC = KFPlayerController(Level.GetLocalPlayerController()); - if(KFPC == none) return AdjustFOV; - ResX = float(GUIController(KFPC.Player.GUIController).ResX); - ResY = float(GUIController(KFPC.Player.GUIController).ResY); - AspectRatio = ResX / ResY; - if(KFPC.bUseTrueWideScreenFOV && AspectRatio >= 1.60) return CalcFOVForAspectRatio(AdjustFOV); - else return AdjustFOV; -} -simulated event Destroyed(){ - PreTravelCleanUp(); - Super.Destroyed(); -} -defaultproperties -{ lenseMaterialID=2 scopePortalFOVHigh=22.000000 scopePortalFOV=12.000000 ZoomMatRef="KillingFloorWeapons.Xbow.CommandoCrossFinalBlend" ScriptedTextureFallbackRef="KF_Weapons_Trip_T.CBLens_cmb" CrosshairTexRef="KillingFloorWeapons.CommandoCross" reloadType=RTYPE_AUTO bHasScope=True ZoomedDisplayFOVHigh=35.000000 ForceZoomOutOnFireTime=0.400000 MagCapacity=1 ReloadRate=0.010000 ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_Crossbow" Weight=9.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_CrossBow' bIsTier2Weapon=True MeshRef="KF_Weapons_Trip.Crossbow_Trip" SkinRefs(0)="KF_Weapons_Trip_T.Rifles.crossbow_cmb" SelectSoundRef="KF_XbowSnd.Xbow_Select" HudImageRef="KillingFloorHUD.WeaponSelect.Crossbow_unselected" SelectedHudImageRef="KillingFloorHUD.WeaponSelect.Crossbow" PlayerIronSightFOV=32.000000 ZoomedDisplayFOV=60.000000 FireModeClass(0)=Class'NicePack.NiceCrossbowFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="Recreational hunting weapon, equipped with powerful scope and firing trigger. Comes with special ammunition, designed to tear through low-resistance materials." DisplayFOV=65.000000 Priority=140 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=1 PickupClass=Class'NicePack.NiceCrossbowPickup' PlayerViewOffset=(X=15.000000,Y=16.000000,Z=-12.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceCrossbowAttachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="Compound Crossbow" LightType=LT_None LightBrightness=0.000000 LightRadius=0.000000 -} +class NiceCrossbow extends NiceScopedWeapon; +simulated function PostBeginPlay(){ + local AutoReloadAnimDesc reloadDesc; + autoReloadsDescriptions.Length = 0; + reloadDesc.canInterruptFrame = 0.349; + reloadDesc.trashStartFrame = 0.857; + reloadDesc.resumeFrame = 0.349; + reloadDesc.speedFrame = 0.143; + reloadDesc.animName = 'Fire'; + autoReloadsDescriptions[0] = reloadDesc; + reloadDesc.animName = 'Fire_Iron'; + autoReloadsDescriptions[1] = reloadDesc; + super.PostBeginPlay(); +} +// Adjust a single FOV based on the current aspect ratio. Adjust FOV is the default NON-aspect ratio adjusted FOV to adjust +simulated function float CalcAspectRatioAdjustedFOV(float AdjustFOV){ + local KFPlayerController KFPC; + local float ResX, ResY; + local float AspectRatio; + KFPC = KFPlayerController(Level.GetLocalPlayerController()); + if(KFPC == none) + return AdjustFOV; + ResX = float(GUIController(KFPC.Player.GUIController).ResX); + ResY = float(GUIController(KFPC.Player.GUIController).ResY); + AspectRatio = ResX / ResY; + if(KFPC.bUseTrueWideScreenFOV && AspectRatio >= 1.60) + return CalcFOVForAspectRatio(AdjustFOV); + else + return AdjustFOV; +} +simulated event Destroyed(){ + PreTravelCleanUp(); + Super.Destroyed(); +} +defaultproperties +{ + lenseMaterialID=2 + scopePortalFOVHigh=22.000000 + scopePortalFOV=12.000000 + ZoomMatRef="KillingFloorWeapons.Xbow.CommandoCrossFinalBlend" + ScriptedTextureFallbackRef="KF_Weapons_Trip_T.CBLens_cmb" + CrosshairTexRef="KillingFloorWeapons.CommandoCross" + reloadType=RTYPE_AUTO + bHasScope=True + ZoomedDisplayFOVHigh=35.000000 + ForceZoomOutOnFireTime=0.400000 + MagCapacity=1 + ReloadRate=0.010000 + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_Crossbow" + Weight=9.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=65.000000 + TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_CrossBow' + bIsTier2Weapon=True + MeshRef="KF_Weapons_Trip.Crossbow_Trip" + SkinRefs(0)="KF_Weapons_Trip_T.Rifles.crossbow_cmb" + SelectSoundRef="KF_XbowSnd.Xbow_Select" + HudImageRef="KillingFloorHUD.WeaponSelect.Crossbow_unselected" + SelectedHudImageRef="KillingFloorHUD.WeaponSelect.Crossbow" + PlayerIronSightFOV=32.000000 + ZoomedDisplayFOV=60.000000 + FireModeClass(0)=Class'NicePack.NiceCrossbowFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.650000 + CurrentRating=0.650000 + Description="Recreational hunting weapon, equipped with powerful scope and firing trigger. Comes with special ammunition, designed to tear through low-resistance materials." + DisplayFOV=65.000000 + Priority=140 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=4 + GroupOffset=1 + PickupClass=Class'NicePack.NiceCrossbowPickup' + PlayerViewOffset=(X=15.000000,Y=16.000000,Z=-12.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceCrossbowAttachment' + IconCoords=(X1=253,Y1=146,X2=333,Y2=181) + ItemName="Compound Crossbow" + LightType=LT_None + LightBrightness=0.000000 + LightRadius=0.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAmmo.uc b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAmmo.uc index 3a66364..e219e31 100644 --- a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAmmo.uc +++ b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAmmo.uc @@ -1,5 +1,12 @@ -class NiceCrossbowAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceCrossbowPickup' AmmoPickupAmount=4 MaxAmmo=40 PickupClass=Class'NicePack.NiceCrossbowAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=4,Y1=350,X2=110,Y2=395) ItemName="An arrow" -} +class NiceCrossbowAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceCrossbowPickup' + AmmoPickupAmount=4 + MaxAmmo=40 + PickupClass=Class'NicePack.NiceCrossbowAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=4,Y1=350,X2=110,Y2=395) + ItemName="An arrow" +} diff --git a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAmmoPickup.uc b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAmmoPickup.uc index 416f013..80ebd6e 100644 --- a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAmmoPickup.uc +++ b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAmmoPickup.uc @@ -1,4 +1,9 @@ -class NiceCrossbowAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=4 InventoryType=Class'NicePack.NiceCrossbowAmmo' PickupMessage="Bolts" StaticMesh=StaticMesh'KillingFloorStatics.XbowAmmo' CollisionRadius=25.000000 -} +class NiceCrossbowAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=4 + InventoryType=Class'NicePack.NiceCrossbowAmmo' + PickupMessage="Bolts" + StaticMesh=StaticMesh'KillingFloorStatics.XbowAmmo' + CollisionRadius=25.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAttachment.uc b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAttachment.uc index 942269c..d789828 100644 --- a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAttachment.uc +++ b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowAttachment.uc @@ -1,4 +1,50 @@ -class NiceCrossbowAttachment extends NiceAttachment; -defaultproperties -{ bDoFiringEffects=False MovementAnims(0)="JogF_Crossbow" MovementAnims(1)="JogB_Crossbow" MovementAnims(2)="JogL_Crossbow" MovementAnims(3)="JogR_Crossbow" TurnLeftAnim="TurnL_Crossbow" TurnRightAnim="TurnR_Crossbow" CrouchAnims(0)="CHwalkF_Crossbow" CrouchAnims(1)="CHwalkB_Crossbow" CrouchAnims(2)="CHwalkL_Crossbow" CrouchAnims(3)="CHwalkR_Crossbow" WalkAnims(0)="WalkF_Crossbow" WalkAnims(1)="WalkB_Crossbow" WalkAnims(2)="WalkL_Crossbow" WalkAnims(3)="WalkR_Crossbow" CrouchTurnRightAnim="CH_TurnR_Crossbow" CrouchTurnLeftAnim="CH_TurnL_Crossbow" IdleCrouchAnim="CHIdle_Crossbow" IdleWeaponAnim="Idle_Crossbow" IdleRestAnim="Idle_Crossbow" IdleChatAnim="Idle_Crossbow" IdleHeavyAnim="Idle_Crossbow" IdleRifleAnim="Idle_Crossbow" FireAnims(0)="Fire_Crossbow" FireAnims(1)="Fire_Crossbow" FireAnims(2)="Fire_Crossbow" FireAnims(3)="Fire_Crossbow" FireAltAnims(0)="Fire_Crossbow" FireAltAnims(1)="Fire_Crossbow" FireAltAnims(2)="Fire_Crossbow" FireAltAnims(3)="Fire_Crossbow" FireCrouchAnims(0)="CHFire_Crossbow" FireCrouchAnims(1)="CHFire_Crossbow" FireCrouchAnims(2)="CHFire_Crossbow" FireCrouchAnims(3)="CHFire_Crossbow" FireCrouchAltAnims(0)="CHFire_Crossbow" FireCrouchAltAnims(1)="CHFire_Crossbow" FireCrouchAltAnims(2)="CHFire_Crossbow" FireCrouchAltAnims(3)="CHFire_Crossbow" HitAnims(0)="HitF_Crossbow" HitAnims(1)="HitB_Crossbow" HitAnims(2)="HitL_Crossbow" HitAnims(3)="HitR_Crossbow" PostFireBlendStandAnim="Blend_Crossbow" PostFireBlendCrouchAnim="CHBlend_Crossbow" MeshRef="KF_Weapons3rd_Trip.Crossbow_3rd" -} +class NiceCrossbowAttachment extends NiceAttachment; +defaultproperties +{ + bDoFiringEffects=False + MovementAnims(0)="JogF_Crossbow" + MovementAnims(1)="JogB_Crossbow" + MovementAnims(2)="JogL_Crossbow" + MovementAnims(3)="JogR_Crossbow" + TurnLeftAnim="TurnL_Crossbow" + TurnRightAnim="TurnR_Crossbow" + CrouchAnims(0)="CHwalkF_Crossbow" + CrouchAnims(1)="CHwalkB_Crossbow" + CrouchAnims(2)="CHwalkL_Crossbow" + CrouchAnims(3)="CHwalkR_Crossbow" + WalkAnims(0)="WalkF_Crossbow" + WalkAnims(1)="WalkB_Crossbow" + WalkAnims(2)="WalkL_Crossbow" + WalkAnims(3)="WalkR_Crossbow" + CrouchTurnRightAnim="CH_TurnR_Crossbow" + CrouchTurnLeftAnim="CH_TurnL_Crossbow" + IdleCrouchAnim="CHIdle_Crossbow" + IdleWeaponAnim="Idle_Crossbow" + IdleRestAnim="Idle_Crossbow" + IdleChatAnim="Idle_Crossbow" + IdleHeavyAnim="Idle_Crossbow" + IdleRifleAnim="Idle_Crossbow" + FireAnims(0)="Fire_Crossbow" + FireAnims(1)="Fire_Crossbow" + FireAnims(2)="Fire_Crossbow" + FireAnims(3)="Fire_Crossbow" + FireAltAnims(0)="Fire_Crossbow" + FireAltAnims(1)="Fire_Crossbow" + FireAltAnims(2)="Fire_Crossbow" + FireAltAnims(3)="Fire_Crossbow" + FireCrouchAnims(0)="CHFire_Crossbow" + FireCrouchAnims(1)="CHFire_Crossbow" + FireCrouchAnims(2)="CHFire_Crossbow" + FireCrouchAnims(3)="CHFire_Crossbow" + FireCrouchAltAnims(0)="CHFire_Crossbow" + FireCrouchAltAnims(1)="CHFire_Crossbow" + FireCrouchAltAnims(2)="CHFire_Crossbow" + FireCrouchAltAnims(3)="CHFire_Crossbow" + HitAnims(0)="HitF_Crossbow" + HitAnims(1)="HitB_Crossbow" + HitAnims(2)="HitL_Crossbow" + HitAnims(3)="HitR_Crossbow" + PostFireBlendStandAnim="Blend_Crossbow" + PostFireBlendCrouchAnim="CHBlend_Crossbow" + MeshRef="KF_Weapons3rd_Trip.Crossbow_3rd" +} diff --git a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowFire.uc b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowFire.uc index 979cf41..572a204 100644 --- a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowFire.uc +++ b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowFire.uc @@ -1,4 +1,27 @@ -class NiceCrossbowFire extends NiceFire; -defaultproperties -{ bProjectileFire=True ProjSpawnOffset=(X=25.000000) EffectiveRange=2500.000000 ProjectileSpeed=20000.000000 FireAimedAnim="Fire_Iron" maxVerticalRecoilAngle=100 maxHorizontalRecoilAngle=25 bRandomPitchFireSound=False FireSoundRef="KF_XbowSnd.Xbow_Fire" NoAmmoSoundRef="KF_XbowSnd.Xbow_DryFire" DamageType=Class'NicePack.NiceDamTypeCrossbow' DamageMax=300 Momentum=150000.000000 bWaitForRelease=True TransientSoundVolume=1.800000 FireForce="AssaultRifleFire" FireRate=0.000000 AmmoClass=Class'NicePack.NiceCrossbowAmmo' ShakeRotMag=(X=3.000000,Y=4.000000,Z=2.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeOffsetMag=(X=3.000000,Y=3.000000,Z=3.000000) BotRefireRate=1.800000 aimerror=1.000000 -} +class NiceCrossbowFire extends NiceFire; +defaultproperties +{ + bProjectileFire=True + ProjSpawnOffset=(X=25.000000) + EffectiveRange=2500.000000 + ProjectileSpeed=20000.000000 + FireAimedAnim="Fire_Iron" + maxVerticalRecoilAngle=100 + maxHorizontalRecoilAngle=25 + bRandomPitchFireSound=False + FireSoundRef="KF_XbowSnd.Xbow_Fire" + NoAmmoSoundRef="KF_XbowSnd.Xbow_DryFire" + DamageType=Class'NicePack.NiceDamTypeCrossbow' + DamageMax=300 + Momentum=150000.000000 + bWaitForRelease=True + TransientSoundVolume=1.800000 + FireForce="AssaultRifleFire" + FireRate=0.000000 + AmmoClass=Class'NicePack.NiceCrossbowAmmo' + ShakeRotMag=(X=3.000000,Y=4.000000,Z=2.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeOffsetMag=(X=3.000000,Y=3.000000,Z=3.000000) + BotRefireRate=1.800000 + aimerror=1.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowPickup.uc b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowPickup.uc index cb7810e..0225dc3 100644 --- a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowPickup.uc +++ b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceCrossbowPickup.uc @@ -1,5 +1,26 @@ -class NiceCrossbowPickup extends NiceWeaponPickup; -#exec OBJ LOAD FILE=KillingFloorWeapons.utx -defaultproperties -{ Weight=9.000000 AmmoCost=10 BuyClipSize=1 PowerValue=64 SpeedValue=50 RangeValue=100 Description="Recreational hunting weapon, equipped with powerful scope and firing trigger. Comes with special ammunition, designed to tear through low-resistance materials." ItemName="Crossbow" ItemShortName="Crossbow" AmmoItemName="Crossbow Bolts" AmmoMesh=StaticMesh'KillingFloorStatics.XbowAmmo' CorrespondingPerkIndex=2 EquipmentCategoryID=3 MaxDesireability=0.790000 InventoryType=Class'NicePack.NiceCrossbow' PickupMessage="You got the Crossbow" PickupSound=Sound'KF_XbowSnd.Xbow_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups_Trip.Rifle.crossbow_pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceCrossbowPickup extends NiceWeaponPickup; +#exec OBJ LOAD FILE=KillingFloorWeapons.utx +defaultproperties +{ + Weight=9.000000 + AmmoCost=10 + BuyClipSize=1 + PowerValue=64 + SpeedValue=50 + RangeValue=100 + Description="Recreational hunting weapon, equipped with powerful scope and firing trigger. Comes with special ammunition, designed to tear through low-resistance materials." + ItemName="Crossbow" + ItemShortName="Crossbow" + AmmoItemName="Crossbow Bolts" + AmmoMesh=StaticMesh'KillingFloorStatics.XbowAmmo' + CorrespondingPerkIndex=2 + EquipmentCategoryID=3 + MaxDesireability=0.790000 + InventoryType=Class'NicePack.NiceCrossbow' + PickupMessage="You got the Crossbow" + PickupSound=Sound'KF_XbowSnd.Xbow_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups_Trip.Rifle.crossbow_pickup' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceDamTypeCrossbow.uc b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceDamTypeCrossbow.uc index 1eeaa22..5984f78 100644 --- a/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceDamTypeCrossbow.uc +++ b/sources/Weapons/Playable/SniperWeapons/Crossbow/NiceDamTypeCrossbow.uc @@ -1,10 +1,27 @@ -class NiceDamTypeCrossbow extends NiceDamageTypeVetSharpshooter; -static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed ) -{ - local NiceMonster niceKilled; - niceKilled = NiceMonster(Killed); - if(KFStatsAndAchievements!=none && (Killed.BurnDown > 0 || (niceKilled != none && niceKilled.bOnFire == true) )) KFStatsAndAchievements.AddBurningCrossbowKill(); -} -defaultproperties -{ MaxPenetrations=-1 BigZedPenDmgReduction=0.000000 MediumZedPenDmgReduction=1.000000 PenDmgReduction=1.000000 HeadShotDamageMult=4.000000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceCrossbow' bThrowRagdoll=True bRagdollBullet=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' DamageThreshold=1 KDamageImpulse=2000.000000 KDeathVel=110.000000 KDeathUpKick=10.000000 -} +class NiceDamTypeCrossbow extends NiceDamageTypeVetSharpshooter; +static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed ) +{ + local NiceMonster niceKilled; + niceKilled = NiceMonster(Killed); + if(KFStatsAndAchievements!=none && (Killed.BurnDown > 0 || (niceKilled != none && niceKilled.bOnFire == true) )) + KFStatsAndAchievements.AddBurningCrossbowKill(); +} +defaultproperties +{ + MaxPenetrations=-1 + BigZedPenDmgReduction=0.000000 + MediumZedPenDmgReduction=1.000000 + PenDmgReduction=1.000000 + HeadShotDamageMult=4.000000 + bSniperWeapon=True + WeaponClass=Class'NicePack.NiceCrossbow' + bThrowRagdoll=True + bRagdollBullet=True + PawnDamageEmitter=Class'ROEffects.ROBloodPuff' + LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' + LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' + DamageThreshold=1 + KDamageImpulse=2000.000000 + KDeathVel=110.000000 + KDeathUpKick=10.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceDamTypeHuntingRifle.uc b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceDamTypeHuntingRifle.uc index 347691d..0586c8c 100644 --- a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceDamTypeHuntingRifle.uc +++ b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceDamTypeHuntingRifle.uc @@ -1,5 +1,25 @@ -class NiceDamTypeHuntingRifle extends NiceDamageTypeVetSharpshooter - abstract; -defaultproperties -{ stunMultiplier=1.500000 MaxPenetrations=5 BigZedPenDmgReduction=0.750000 MediumZedPenDmgReduction=1.000000 HeadShotDamageMult=1.900000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceHuntingRifle' DeathString="%k killed %o (Hunting Rifle)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True bBulletHit=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' FlashFog=(X=600.000000) KDamageImpulse=2250.000000 KDeathVel=115.000000 KDeathUpKick=5.000000 VehicleDamageScaling=0.700000 -} +class NiceDamTypeHuntingRifle extends NiceDamageTypeVetSharpshooter + abstract; +defaultproperties +{ + stunMultiplier=1.500000 + MaxPenetrations=5 + BigZedPenDmgReduction=0.750000 + MediumZedPenDmgReduction=1.000000 + HeadShotDamageMult=1.900000 + bSniperWeapon=True + WeaponClass=Class'NicePack.NiceHuntingRifle' + DeathString="%k killed %o (Hunting Rifle)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + bBulletHit=True + PawnDamageEmitter=Class'ROEffects.ROBloodPuff' + LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' + LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' + FlashFog=(X=600.000000) + KDamageImpulse=2250.000000 + KDeathVel=115.000000 + KDeathUpKick=5.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifle.uc b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifle.uc index 3595c76..75b416e 100644 --- a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifle.uc +++ b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifle.uc @@ -1,4 +1,54 @@ -class NiceHuntingRifle extends NiceScopedWeapon; -defaultproperties -{ lenseMaterialID=2 scopePortalFOVHigh=22.000000 scopePortalFOV=12.000000 ZoomMatRef="ScrnWeaponPack_T.BDHR.RifleCrossFinal" ScriptedTextureFallbackRef="KF_Weapons_Trip_T.Rifles.CBLens_cmb" CrosshairTexRef="ScrnWeaponPack_T.BDHR.BDHR.HRCross" reloadPreEndFrame=0.180000 reloadEndFrame=0.590000 reloadChargeEndFrame=0.930000 reloadChargeStartFrame=0.610000 bHasScope=True ZoomedDisplayFOVHigh=45.000000 MagCapacity=5 ReloadRate=3.200000 ReloadAnim="Reload" ReloadAnimRate=1.400000 WeaponReloadAnim="Reload_M14" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'ScrnWeaponPack_T.BDHR.huntingrifle_Trader' MeshRef="ScrnWeaponPack_A.hunt_rifle" SkinRefs(0)="ScrnWeaponPack_T.BDHR.HR_Final" SkinRefs(1)="KF_Weapons2_Trip_T.hands.BritishPara_Hands_1st_P" SkinRefs(2)="KF_Weapons_Trip_T.Rifles.CBLens_cmb" SelectSoundRef="KF_PumpSGSnd.SG_Select" HudImageRef="ScrnWeaponPack_T.BDHR.HR_Unselected" SelectedHudImageRef="ScrnWeaponPack_T.BDHR.HR_selected" PlayerIronSightFOV=32.000000 ZoomedDisplayFOV=60.000000 FireModeClass(0)=Class'NicePack.NiceHuntingRifleFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="A rugged and reliable scoped rifle with great penetrative power." DisplayFOV=65.000000 Priority=10 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=3 PickupClass=Class'NicePack.NiceHuntingRiflePickup' PlayerViewOffset=(X=15.000000,Y=16.000000,Z=-4.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceHuntingRifleAttachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="Hunting Rifle" -} +class NiceHuntingRifle extends NiceScopedWeapon; +defaultproperties +{ + lenseMaterialID=2 + scopePortalFOVHigh=22.000000 + scopePortalFOV=12.000000 + ZoomMatRef="ScrnWeaponPack_T.BDHR.RifleCrossFinal" + ScriptedTextureFallbackRef="KF_Weapons_Trip_T.Rifles.CBLens_cmb" + CrosshairTexRef="ScrnWeaponPack_T.BDHR.BDHR.HRCross" + reloadPreEndFrame=0.180000 + reloadEndFrame=0.590000 + reloadChargeEndFrame=0.930000 + reloadChargeStartFrame=0.610000 + bHasScope=True + ZoomedDisplayFOVHigh=45.000000 + MagCapacity=5 + ReloadRate=3.200000 + ReloadAnim="Reload" + ReloadAnimRate=1.400000 + WeaponReloadAnim="Reload_M14" + Weight=6.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=65.000000 + TraderInfoTexture=Texture'ScrnWeaponPack_T.BDHR.huntingrifle_Trader' + MeshRef="ScrnWeaponPack_A.hunt_rifle" + SkinRefs(0)="ScrnWeaponPack_T.BDHR.HR_Final" + SkinRefs(1)="KF_Weapons2_Trip_T.hands.BritishPara_Hands_1st_P" + SkinRefs(2)="KF_Weapons_Trip_T.Rifles.CBLens_cmb" + SelectSoundRef="KF_PumpSGSnd.SG_Select" + HudImageRef="ScrnWeaponPack_T.BDHR.HR_Unselected" + SelectedHudImageRef="ScrnWeaponPack_T.BDHR.HR_selected" + PlayerIronSightFOV=32.000000 + ZoomedDisplayFOV=60.000000 + FireModeClass(0)=Class'NicePack.NiceHuntingRifleFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.650000 + CurrentRating=0.650000 + Description="A rugged and reliable scoped rifle with great penetrative power." + DisplayFOV=65.000000 + Priority=10 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=4 + GroupOffset=3 + PickupClass=Class'NicePack.NiceHuntingRiflePickup' + PlayerViewOffset=(X=15.000000,Y=16.000000,Z=-4.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceHuntingRifleAttachment' + IconCoords=(X1=253,Y1=146,X2=333,Y2=181) + ItemName="Hunting Rifle" +} diff --git a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAmmo.uc b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAmmo.uc index af7edbd..cc070f5 100644 --- a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAmmo.uc +++ b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAmmo.uc @@ -1,5 +1,12 @@ -class NiceHuntingRifleAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=InterfaceContent.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceHuntingRiflePickup' AmmoPickupAmount=5 MaxAmmo=40 PickupClass=Class'NicePack.NiceHuntingRifleAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="Rifle bullets" -} +class NiceHuntingRifleAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceHuntingRiflePickup' + AmmoPickupAmount=5 + MaxAmmo=40 + PickupClass=Class'NicePack.NiceHuntingRifleAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=338,Y1=40,X2=393,Y2=79) + ItemName="Rifle bullets" +} diff --git a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAmmoPickup.uc b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAmmoPickup.uc index 453fdfc..6119b66 100644 --- a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAmmoPickup.uc +++ b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceHuntingRifleAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=5 InventoryType=Class'NicePack.NiceHuntingRifleAmmo' PickupMessage=".308 rounds" StaticMesh=None -} +class NiceHuntingRifleAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=5 + InventoryType=Class'NicePack.NiceHuntingRifleAmmo' + PickupMessage=".308 rounds" + StaticMesh=None +} diff --git a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAttachment.uc b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAttachment.uc index 09b6c45..12d6683 100644 --- a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAttachment.uc +++ b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleAttachment.uc @@ -1,4 +1,54 @@ -class NiceHuntingRifleAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdSTG' mTracerClass=Class'KFMod.KFNewTracer' MovementAnims(0)="WalkF_Winchester" MovementAnims(1)="WalkB_Winchester" MovementAnims(2)="WalkL_Winchester" MovementAnims(3)="WalkL_Winchester" TurnLeftAnim="TurnL_Winchester" TurnRightAnim="TurnR_Winchester" CrouchAnims(0)="CHwalkF_Winchester" CrouchAnims(1)="CHwalkB_Winchester" CrouchAnims(2)="CHwalkL_Winchester" CrouchAnims(3)="CHwalkR_Winchester" WalkAnims(0)="WalkF_Winchester" WalkAnims(1)="WalkB_Winchester" WalkAnims(2)="WalkL_Winchester" WalkAnims(3)="WalkL_Winchester" CrouchTurnRightAnim="CH_TurnR_Winchester" CrouchTurnLeftAnim="CH_TurnL_Winchester" IdleCrouchAnim="CHIdle_Winchester" IdleWeaponAnim="IS_Idle_Winchester" IdleRestAnim="IS_Idle_Winchester" IdleChatAnim="IS_Idle_Winchester" IdleHeavyAnim="IS_Idle_Winchester" IdleRifleAnim="IS_Idle_Winchester" FireAnims(0)="Claw" FireAnims(1)="Claw" FireAnims(2)="Claw" FireAnims(3)="Claw" FireAltAnims(0)="IS_Fire_Winchester" FireAltAnims(1)="IS_Fire_Winchester" FireAltAnims(2)="IS_Fire_Winchester" FireAltAnims(3)="IS_Fire_Winchester" FireCrouchAnims(0)="CHFire_Winchester" FireCrouchAnims(1)="CHFire_Winchester" FireCrouchAnims(2)="CHFire_Winchester" FireCrouchAnims(3)="CHFire_Winchester" FireCrouchAltAnims(0)="CHFire_Winchester" FireCrouchAltAnims(1)="CHFire_Winchester" FireCrouchAltAnims(2)="CHFire_Winchester" FireCrouchAltAnims(3)="CHFire_Winchester" HitAnims(0)="HitF_Winchester" HitAnims(1)="HitB_Winchester" HitAnims(2)="HitL_Winchester" HitAnims(3)="HitR_Winchester" PostFireBlendStandAnim="Blend_Winchester" PostFireBlendCrouchAnim="CHBlend_Winchester" MeshRef="ScrnWeaponPack_A.HuntingRifle3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceHuntingRifleAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdSTG' + mTracerClass=Class'KFMod.KFNewTracer' + MovementAnims(0)="WalkF_Winchester" + MovementAnims(1)="WalkB_Winchester" + MovementAnims(2)="WalkL_Winchester" + MovementAnims(3)="WalkL_Winchester" + TurnLeftAnim="TurnL_Winchester" + TurnRightAnim="TurnR_Winchester" + CrouchAnims(0)="CHwalkF_Winchester" + CrouchAnims(1)="CHwalkB_Winchester" + CrouchAnims(2)="CHwalkL_Winchester" + CrouchAnims(3)="CHwalkR_Winchester" + WalkAnims(0)="WalkF_Winchester" + WalkAnims(1)="WalkB_Winchester" + WalkAnims(2)="WalkL_Winchester" + WalkAnims(3)="WalkL_Winchester" + CrouchTurnRightAnim="CH_TurnR_Winchester" + CrouchTurnLeftAnim="CH_TurnL_Winchester" + IdleCrouchAnim="CHIdle_Winchester" + IdleWeaponAnim="IS_Idle_Winchester" + IdleRestAnim="IS_Idle_Winchester" + IdleChatAnim="IS_Idle_Winchester" + IdleHeavyAnim="IS_Idle_Winchester" + IdleRifleAnim="IS_Idle_Winchester" + FireAnims(0)="Claw" + FireAnims(1)="Claw" + FireAnims(2)="Claw" + FireAnims(3)="Claw" + FireAltAnims(0)="IS_Fire_Winchester" + FireAltAnims(1)="IS_Fire_Winchester" + FireAltAnims(2)="IS_Fire_Winchester" + FireAltAnims(3)="IS_Fire_Winchester" + FireCrouchAnims(0)="CHFire_Winchester" + FireCrouchAnims(1)="CHFire_Winchester" + FireCrouchAnims(2)="CHFire_Winchester" + FireCrouchAnims(3)="CHFire_Winchester" + FireCrouchAltAnims(0)="CHFire_Winchester" + FireCrouchAltAnims(1)="CHFire_Winchester" + FireCrouchAltAnims(2)="CHFire_Winchester" + FireCrouchAltAnims(3)="CHFire_Winchester" + HitAnims(0)="HitF_Winchester" + HitAnims(1)="HitB_Winchester" + HitAnims(2)="HitL_Winchester" + HitAnims(3)="HitR_Winchester" + PostFireBlendStandAnim="Blend_Winchester" + PostFireBlendCrouchAnim="CHBlend_Winchester" + MeshRef="ScrnWeaponPack_A.HuntingRifle3rd" + bHeavy=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleFire.uc b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleFire.uc index 978e712..3abf5ef 100644 --- a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleFire.uc +++ b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRifleFire.uc @@ -1,4 +1,36 @@ -class NiceHuntingRifleFire extends NiceFire; -defaultproperties -{ ProjectileSpeed=35000.000000 zoomOutOnShot=True FireAimedAnim="Fire_Iron" RecoilRate=0.100000 maxVerticalRecoilAngle=200 maxHorizontalRecoilAngle=62 FireSoundRef="ScrnWeaponPack_SND.BDHR.awp1_mono" StereoFireSoundRef="ScrnWeaponPack_SND.BDHR.awp1_stereo" NoAmmoSoundRef="KF_RifleSnd.Rifle_DryFire" DamageType=Class'NicePack.NiceDamTypeHuntingRifle' DamageMin=300 DamageMax=300 Momentum=18000.000000 bWaitForRelease=True bModeExclusive=False bAttachSmokeEmitter=True TransientSoundVolume=1.800000 FireLoopAnim= FireEndAnim= FireAnimRate=2.714000 FireForce="ShockRifleFire" FireRate=0.700000 AmmoClass=Class'NicePack.NiceHuntingRifleAmmo' ShakeRotMag=(X=100.000000,Y=100.000000,Z=500.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=2.000000 ShakeOffsetMag=(X=10.000000,Y=3.000000,Z=12.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=2.000000 BotRefireRate=0.650000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' aimerror=0.000000 -} +class NiceHuntingRifleFire extends NiceFire; +defaultproperties +{ + ProjectileSpeed=35000.000000 + zoomOutOnShot=True + FireAimedAnim="Fire_Iron" + RecoilRate=0.100000 + maxVerticalRecoilAngle=200 + maxHorizontalRecoilAngle=62 + FireSoundRef="ScrnWeaponPack_SND.BDHR.awp1_mono" + StereoFireSoundRef="ScrnWeaponPack_SND.BDHR.awp1_stereo" + NoAmmoSoundRef="KF_RifleSnd.Rifle_DryFire" + DamageType=Class'NicePack.NiceDamTypeHuntingRifle' + DamageMin=300 + DamageMax=300 + Momentum=18000.000000 + bWaitForRelease=True + bModeExclusive=False + bAttachSmokeEmitter=True + TransientSoundVolume=1.800000 + FireLoopAnim= + FireEndAnim= + FireAnimRate=2.714000 + FireForce="ShockRifleFire" + FireRate=0.700000 + AmmoClass=Class'NicePack.NiceHuntingRifleAmmo' + ShakeRotMag=(X=100.000000,Y=100.000000,Z=500.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeRotTime=2.000000 + ShakeOffsetMag=(X=10.000000,Y=3.000000,Z=12.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=2.000000 + BotRefireRate=0.650000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stKar' + aimerror=0.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRiflePickup.uc b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRiflePickup.uc index b4c0a35..fcea1b1 100644 --- a/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRiflePickup.uc +++ b/sources/Weapons/Playable/SniperWeapons/HuntingRifle/NiceHuntingRiflePickup.uc @@ -1,7 +1,27 @@ -//============================================================================= -// HuntingRifle Pickup. -//============================================================================= -class NiceHuntingRiflePickup extends NiceWeaponPickup; -defaultproperties -{ Weight=6.000000 cost=750 AmmoCost=35 BuyClipSize=5 PowerValue=55 SpeedValue=42 RangeValue=95 Description="A rugged and reliable scoped rifle with great penetrative power." ItemName="Hunting Rifle" ItemShortName="Hunter R." AmmoItemName="Rifle bullets" CorrespondingPerkIndex=2 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceHuntingRifle' PickupMessage="You got the Hunting Rifle" PickupSound=Sound'KF_RifleSnd.RifleBase.Rifle_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.HR_Pickup' CollisionRadius=30.000000 CollisionHeight=5.000000 -} +//============================================================================= +// HuntingRifle Pickup. +//============================================================================= +class NiceHuntingRiflePickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=6.000000 + cost=750 + AmmoCost=35 + BuyClipSize=5 + PowerValue=55 + SpeedValue=42 + RangeValue=95 + Description="A rugged and reliable scoped rifle with great penetrative power." + ItemName="Hunting Rifle" + ItemShortName="Hunter R." + AmmoItemName="Rifle bullets" + CorrespondingPerkIndex=2 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceHuntingRifle' + PickupMessage="You got the Hunting Rifle" + PickupSound=Sound'KF_RifleSnd.RifleBase.Rifle_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'ScrnWeaponPack_SM.HR_Pickup' + CollisionRadius=30.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceDamTypeM14EBR.uc b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceDamTypeM14EBR.uc index 18617a4..ec98b74 100644 --- a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceDamTypeM14EBR.uc +++ b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceDamTypeM14EBR.uc @@ -1,13 +1,28 @@ -class NiceDamTypeM14EBR extends NiceDamageTypeVetCommando - abstract; -static function ScoredHeadshot(KFSteamStatsAndAchievements KFStatsAndAchievements, class MonsterClass, bool bLaserSightedM14EBRKill) -{ - super.ScoredHeadshot( KFStatsAndAchievements, MonsterClass, bLaserSightedM14EBRKill ); - if ( KFStatsAndAchievements != none ) - { KFStatsAndAchievements.AddHeadshotsWithSPSOrM14( MonsterClass ); - } -} -defaultproperties -{ - badDecapMod=0.6000 bIsProjectile=True HeadShotDamageMult=2.250000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceM14EBRBattleRifle' DeathString="%k killed %o (M14 EBR)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' KDamageImpulse=7500.000000 KDeathVel=175.000000 KDeathUpKick=25.000000 -} +class NiceDamTypeM14EBR extends NiceDamageTypeVetCommando + abstract; +static function ScoredHeadshot(KFSteamStatsAndAchievements KFStatsAndAchievements, class MonsterClass, bool bLaserSightedM14EBRKill) +{ + super.ScoredHeadshot( KFStatsAndAchievements, MonsterClass, bLaserSightedM14EBRKill ); + if ( KFStatsAndAchievements != none ) + { + KFStatsAndAchievements.AddHeadshotsWithSPSOrM14( MonsterClass ); + } +} +defaultproperties +{ + badDecapMod=0.6000 + bIsProjectile=True + HeadShotDamageMult=2.250000 + bSniperWeapon=True + WeaponClass=Class'NicePack.NiceM14EBRBattleRifle' + DeathString="%k killed %o (M14 EBR)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + PawnDamageEmitter=Class'ROEffects.ROBloodPuff' + LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' + LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' + KDamageImpulse=7500.000000 + KDeathVel=175.000000 + KDeathUpKick=25.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAmmo.uc b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAmmo.uc index e26bc1d..3b6595e 100644 --- a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAmmo.uc +++ b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAmmo.uc @@ -1,5 +1,13 @@ -class NiceM14EBRAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceM14EBRPickup' AmmoPickupAmount=20 MaxAmmo=160 InitialAmount=40 PickupClass=Class'NicePack.NiceM14EBRAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="M14EBR bullets" -} +class NiceM14EBRAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceM14EBRPickup' + AmmoPickupAmount=20 + MaxAmmo=160 + InitialAmount=40 + PickupClass=Class'NicePack.NiceM14EBRAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="M14EBR bullets" +} diff --git a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAmmoPickup.uc b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAmmoPickup.uc index 4298c4f..507edf7 100644 --- a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAmmoPickup.uc +++ b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceM14EBRAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=20 InventoryType=Class'NicePack.NiceM14EBRAmmo' PickupMessage="Rounds 7.62x51mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceM14EBRAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=20 + InventoryType=Class'NicePack.NiceM14EBRAmmo' + PickupMessage="Rounds 7.62x51mm" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAttachment.uc b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAttachment.uc index 6c256f9..6320825 100644 --- a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAttachment.uc +++ b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRAttachment.uc @@ -1,4 +1,56 @@ -class NiceM14EBRAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_M14" MovementAnims(1)="JogB_M14" MovementAnims(2)="JogL_M14" MovementAnims(3)="JogR_M14" TurnLeftAnim="TurnL_M14" TurnRightAnim="TurnR_M14" CrouchAnims(0)="CHWalkF_M14" CrouchAnims(1)="CHWalkB_M14" CrouchAnims(2)="CHWalkL_M14" CrouchAnims(3)="CHWalkR_M14" WalkAnims(0)="WalkF_M14" WalkAnims(1)="WalkB_M14" WalkAnims(2)="WalkL_M14" WalkAnims(3)="WalkR_M14" CrouchTurnRightAnim="CH_TurnR_M14" CrouchTurnLeftAnim="CH_TurnL_M14" IdleCrouchAnim="CHIdle_M14" IdleWeaponAnim="Idle_M14" IdleRestAnim="Idle_M14" IdleChatAnim="Idle_M14" IdleHeavyAnim="Idle_M14" IdleRifleAnim="Idle_M14" FireAnims(0)="Fire_M14" FireAnims(1)="Fire_M14" FireAnims(2)="Fire_M14" FireAnims(3)="Fire_M14" FireAltAnims(0)="Fire_M14" FireAltAnims(1)="Fire_M14" FireAltAnims(2)="Fire_M14" FireAltAnims(3)="Fire_M14" FireCrouchAnims(0)="CHFire_M14" FireCrouchAnims(1)="CHFire_M14" FireCrouchAnims(2)="CHFire_M14" FireCrouchAnims(3)="CHFire_M14" FireCrouchAltAnims(0)="CHFire_M14" FireCrouchAltAnims(1)="CHFire_M14" FireCrouchAltAnims(2)="CHFire_M14" FireCrouchAltAnims(3)="CHFire_M14" HitAnims(0)="HitF_M14" HitAnims(1)="HitB_M14" HitAnims(2)="HitL_M14" HitAnims(3)="HitR_M14" PostFireBlendStandAnim="Blend_M14" PostFireBlendCrouchAnim="CHBlend_M14" MeshRef="KF_Weapons3rd2_Trip.M14_EBR_3rd" bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceM14EBRAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + MovementAnims(0)="JogF_M14" + MovementAnims(1)="JogB_M14" + MovementAnims(2)="JogL_M14" + MovementAnims(3)="JogR_M14" + TurnLeftAnim="TurnL_M14" + TurnRightAnim="TurnR_M14" + CrouchAnims(0)="CHWalkF_M14" + CrouchAnims(1)="CHWalkB_M14" + CrouchAnims(2)="CHWalkL_M14" + CrouchAnims(3)="CHWalkR_M14" + WalkAnims(0)="WalkF_M14" + WalkAnims(1)="WalkB_M14" + WalkAnims(2)="WalkL_M14" + WalkAnims(3)="WalkR_M14" + CrouchTurnRightAnim="CH_TurnR_M14" + CrouchTurnLeftAnim="CH_TurnL_M14" + IdleCrouchAnim="CHIdle_M14" + IdleWeaponAnim="Idle_M14" + IdleRestAnim="Idle_M14" + IdleChatAnim="Idle_M14" + IdleHeavyAnim="Idle_M14" + IdleRifleAnim="Idle_M14" + FireAnims(0)="Fire_M14" + FireAnims(1)="Fire_M14" + FireAnims(2)="Fire_M14" + FireAnims(3)="Fire_M14" + FireAltAnims(0)="Fire_M14" + FireAltAnims(1)="Fire_M14" + FireAltAnims(2)="Fire_M14" + FireAltAnims(3)="Fire_M14" + FireCrouchAnims(0)="CHFire_M14" + FireCrouchAnims(1)="CHFire_M14" + FireCrouchAnims(2)="CHFire_M14" + FireCrouchAnims(3)="CHFire_M14" + FireCrouchAltAnims(0)="CHFire_M14" + FireCrouchAltAnims(1)="CHFire_M14" + FireCrouchAltAnims(2)="CHFire_M14" + FireCrouchAltAnims(3)="CHFire_M14" + HitAnims(0)="HitF_M14" + HitAnims(1)="HitB_M14" + HitAnims(2)="HitL_M14" + HitAnims(3)="HitR_M14" + PostFireBlendStandAnim="Blend_M14" + PostFireBlendCrouchAnim="CHBlend_M14" + MeshRef="KF_Weapons3rd2_Trip.M14_EBR_3rd" + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRBattleRifle.uc b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRBattleRifle.uc index 33cae6a..c78fcf4 100644 --- a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRBattleRifle.uc +++ b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRBattleRifle.uc @@ -1,7 +1,52 @@ -class NiceM14EBRBattleRifle extends NiceWeapon; -simulated function AltFire(float F){ - ToggleLaser(); -} -defaultproperties -{ reloadPreEndFrame=0.120000 reloadEndFrame=0.590000 reloadChargeEndFrame=0.810000 reloadMagStartFrame=0.200000 reloadChargeStartFrame=0.710000 MagCapacity=20 ReloadRate=3.366000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_M14" Weight=8.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M14' bIsTier3Weapon=True MeshRef="KF_Weapons2_Trip.M14_EBR_Trip" SkinRefs(0)="KF_Weapons2_Trip_T.Rifle.M14_cmb" SelectSoundRef="KF_M14EBRSnd.M14EBR_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.M14_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M14" PlayerIronSightFOV=60.000000 ZoomedDisplayFOV=45.000000 FireModeClass(0)=Class'NicePack.NiceM14EBRFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="Updated M14 Enhanced Battle Rifle - Semi Auto variant. Equipped with a laser sight. A special lens allows to change laser's color on the fly." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=165 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=5 PickupClass=Class'NicePack.NiceM14EBRPickup' PlayerViewOffset=(X=25.000000,Y=17.000000,Z=-8.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceM14EBRAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="M14 EBR" TransientSoundVolume=1.250000 -} +class NiceM14EBRBattleRifle extends NiceWeapon; +simulated function AltFire(float F){ + ToggleLaser(); +} +defaultproperties +{ + reloadPreEndFrame=0.120000 + reloadEndFrame=0.590000 + reloadChargeEndFrame=0.810000 + reloadMagStartFrame=0.200000 + reloadChargeStartFrame=0.710000 + MagCapacity=20 + ReloadRate=3.366000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_M14" + Weight=8.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=55.000000 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M14' + bIsTier3Weapon=True + MeshRef="KF_Weapons2_Trip.M14_EBR_Trip" + SkinRefs(0)="KF_Weapons2_Trip_T.Rifle.M14_cmb" + SelectSoundRef="KF_M14EBRSnd.M14EBR_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.M14_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M14" + PlayerIronSightFOV=60.000000 + ZoomedDisplayFOV=45.000000 + FireModeClass(0)=Class'NicePack.NiceM14EBRFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="Updated M14 Enhanced Battle Rifle - Semi Auto variant. Equipped with a laser sight. A special lens allows to change laser's color on the fly." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=55.000000 + Priority=165 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=4 + GroupOffset=5 + PickupClass=Class'NicePack.NiceM14EBRPickup' + PlayerViewOffset=(X=25.000000,Y=17.000000,Z=-8.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceM14EBRAttachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="M14 EBR" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRFire.uc b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRFire.uc index ca57c23..195aa78 100644 --- a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRFire.uc +++ b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRFire.uc @@ -1,4 +1,36 @@ -class NiceM14EBRFire extends NiceFire; -defaultproperties -{ zedTimeFireSpeedUp=2.500000 ProjectileSpeed=42650.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.085000 maxVerticalRecoilAngle=500 maxHorizontalRecoilAngle=125 ShellEjectClass=Class'ROEffects.KFShellEjectEBR' ShellEjectBoneName="Shell_eject" FireSoundRef="KF_M14EBRSnd.M14EBR_Fire" StereoFireSoundRef="KF_M14EBRSnd.M14EBR_FireST" NoAmmoSoundRef="KF_M14EBRSnd.M14EBR_DryFire" DamageType=Class'NicePack.NiceDamTypeM14EBR' DamageMin=120 DamageMax=120 Momentum=9500.000000 bPawnRapidFireAnim=True bWaitForRelease=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.250000 AmmoClass=Class'NicePack.NiceM14EBRAmmo' ShakeRotMag=(X=50.000000,Y=50.000000,Z=300.000000) ShakeRotRate=(X=7500.000000,Y=7500.000000,Z=7500.000000) ShakeRotTime=0.650000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=1.150000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' aimerror=42.000000 -} +class NiceM14EBRFire extends NiceFire; +defaultproperties +{ + zedTimeFireSpeedUp=2.500000 + ProjectileSpeed=42650.000000 + FireAimedAnim="Fire_Iron" + RecoilRate=0.085000 + maxVerticalRecoilAngle=500 + maxHorizontalRecoilAngle=125 + ShellEjectClass=Class'ROEffects.KFShellEjectEBR' + ShellEjectBoneName="Shell_eject" + FireSoundRef="KF_M14EBRSnd.M14EBR_Fire" + StereoFireSoundRef="KF_M14EBRSnd.M14EBR_FireST" + NoAmmoSoundRef="KF_M14EBRSnd.M14EBR_DryFire" + DamageType=Class'NicePack.NiceDamTypeM14EBR' + DamageMin=120 + DamageMax=120 + Momentum=9500.000000 + bPawnRapidFireAnim=True + bWaitForRelease=True + TransientSoundVolume=1.800000 + FireLoopAnim="Fire" + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.250000 + AmmoClass=Class'NicePack.NiceM14EBRAmmo' + ShakeRotMag=(X=50.000000,Y=50.000000,Z=300.000000) + ShakeRotRate=(X=7500.000000,Y=7500.000000,Z=7500.000000) + ShakeRotTime=0.650000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=1.150000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSTG' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRPickup.uc b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRPickup.uc index 2dfd5bb..69b5c26 100644 --- a/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRPickup.uc +++ b/sources/Weapons/Playable/SniperWeapons/M14EBR/NiceM14EBRPickup.uc @@ -1,5 +1,25 @@ -class NiceM14EBRPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=8.000000 - cost=1000 AmmoCost=15 BuyClipSize=20 PowerValue=55 SpeedValue=20 RangeValue=95 Description="Updated M14 Enhanced Battle Rifle - Semi Auto variant. Equipped with a laser sight. A special lens allows to change laser's color on the fly." ItemName="M14 EBR" ItemShortName="M14 EBR" AmmoItemName="7.62x51mm Ammo" AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' CorrespondingPerkIndex=3 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceM14EBRBattleRifle' PickupMessage="You got the M14 EBR" PickupSound=Sound'KF_M14EBRSnd.M14EBR_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups2_Trip.Rifles.M14_EBR_Pickup' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceM14EBRPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=8.000000 + cost=1000 + AmmoCost=15 + BuyClipSize=20 + PowerValue=55 + SpeedValue=20 + RangeValue=95 + Description="Updated M14 Enhanced Battle Rifle - Semi Auto variant. Equipped with a laser sight. A special lens allows to change laser's color on the fly." + ItemName="M14 EBR" + ItemShortName="M14 EBR" + AmmoItemName="7.62x51mm Ammo" + AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo' + CorrespondingPerkIndex=3 + EquipmentCategoryID=3 + InventoryType=Class'NicePack.NiceM14EBRBattleRifle' + PickupMessage="You got the M14 EBR" + PickupSound=Sound'KF_M14EBRSnd.M14EBR_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups2_Trip.Rifles.M14_EBR_Pickup' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M99/NiceDamTypeM99SniperRifle.uc b/sources/Weapons/Playable/SniperWeapons/M99/NiceDamTypeM99SniperRifle.uc index 96b6835..ca194c3 100644 --- a/sources/Weapons/Playable/SniperWeapons/M99/NiceDamTypeM99SniperRifle.uc +++ b/sources/Weapons/Playable/SniperWeapons/M99/NiceDamTypeM99SniperRifle.uc @@ -1,9 +1,39 @@ -class NiceDamTypeM99SniperRifle extends NiceDamageTypeVetSharpshooter - abstract; -static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed ){ - if(KFStatsAndAchievements != none){ if(Killed.IsA('NiceZombieScrake') || Killed.IsA('MeanZombieScrake')) KFStatsAndAchievements.AddM99Kill(); if(Killed.IsA('NiceZombieHusk') || Killed.IsA('MeanZombieHusk')) KFStatsAndAchievements.AddHuskAndZedOneShotKill(true, false); else KFStatsAndAchievements.AddHuskAndZedOneShotKill(false, true); - } -} -defaultproperties -{ prReqMultiplier=0.600000 prReqPrecise=0.600000 MaxPenetrations=-1 BigZedPenDmgReduction=0.750000 MediumZedPenDmgReduction=1.000000 PenDmgReduction=1.000000 HeadShotDamageMult=2.100000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceM99SniperRifle' DeathString="%k put a bullet in %o's head." FemaleSuicide="%o shot herself in the head." MaleSuicide="%o shot himself in the head." bThrowRagdoll=True bRagdollBullet=True bBulletHit=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' FlashFog=(X=600.000000) DamageThreshold=1 KDamageImpulse=10000.000000 KDeathVel=300.000000 KDeathUpKick=100.000000 VehicleDamageScaling=0.650000 -} +class NiceDamTypeM99SniperRifle extends NiceDamageTypeVetSharpshooter + abstract; +static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed ){ + if(KFStatsAndAchievements != none){ + if(Killed.IsA('NiceZombieScrake') || Killed.IsA('MeanZombieScrake')) + KFStatsAndAchievements.AddM99Kill(); + if(Killed.IsA('NiceZombieHusk') || Killed.IsA('MeanZombieHusk')) + KFStatsAndAchievements.AddHuskAndZedOneShotKill(true, false); + else + KFStatsAndAchievements.AddHuskAndZedOneShotKill(false, true); + } +} +defaultproperties +{ + prReqMultiplier=0.600000 + prReqPrecise=0.600000 + MaxPenetrations=-1 + BigZedPenDmgReduction=0.750000 + MediumZedPenDmgReduction=1.000000 + PenDmgReduction=1.000000 + HeadShotDamageMult=2.100000 + bSniperWeapon=True + WeaponClass=Class'NicePack.NiceM99SniperRifle' + DeathString="%k put a bullet in %o's head." + FemaleSuicide="%o shot herself in the head." + MaleSuicide="%o shot himself in the head." + bThrowRagdoll=True + bRagdollBullet=True + bBulletHit=True + PawnDamageEmitter=Class'ROEffects.ROBloodPuff' + LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' + LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' + FlashFog=(X=600.000000) + DamageThreshold=1 + KDamageImpulse=10000.000000 + KDeathVel=300.000000 + KDeathUpKick=100.000000 + VehicleDamageScaling=0.650000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Ammo.uc b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Ammo.uc index 1c0cedd..4a4ff5e 100644 --- a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Ammo.uc +++ b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Ammo.uc @@ -1,5 +1,13 @@ -class NiceM99Ammo extends NiceAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceM99Pickup' AmmoPickupAmount=2 MaxAmmo=20 InitialAmount=5 PickupClass=Class'NicePack.NiceM99AmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=4,Y1=350,X2=110,Y2=395) ItemName="50 Cal Bullets" -} +class NiceM99Ammo extends NiceAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceM99Pickup' + AmmoPickupAmount=2 + MaxAmmo=20 + InitialAmount=5 + PickupClass=Class'NicePack.NiceM99AmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=4,Y1=350,X2=110,Y2=395) + ItemName="50 Cal Bullets" +} diff --git a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99AmmoPickup.uc b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99AmmoPickup.uc index 66655aa..230c980 100644 --- a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99AmmoPickup.uc +++ b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99AmmoPickup.uc @@ -1,4 +1,9 @@ -class NiceM99AmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=2 InventoryType=Class'NicePack.NiceM99Ammo' PickupMessage="50 Cal Bullets" StaticMesh=StaticMesh'KillingFloorStatics.XbowAmmo' CollisionRadius=25.000000 -} +class NiceM99AmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=2 + InventoryType=Class'NicePack.NiceM99Ammo' + PickupMessage="50 Cal Bullets" + StaticMesh=StaticMesh'KillingFloorStatics.XbowAmmo' + CollisionRadius=25.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Attachment.uc b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Attachment.uc index a7bf41c..f885a5f 100644 --- a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Attachment.uc +++ b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Attachment.uc @@ -1,4 +1,50 @@ -class NiceM99Attachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdPTRD' MovementAnims(0)="JogF_M4203" MovementAnims(1)="JogB_M4203" MovementAnims(2)="JogL_M4203" MovementAnims(3)="JogR_M4203" TurnLeftAnim="TurnL_M4203" TurnRightAnim="TurnR_M4203" CrouchAnims(0)="CHWalkF_M4203" CrouchAnims(1)="CHWalkB_M4203" CrouchAnims(2)="CHWalkL_M4203" CrouchAnims(3)="CHWalkR_M4203" WalkAnims(0)="WalkF_M4203" WalkAnims(1)="WalkB_M4203" WalkAnims(2)="WalkL_M4203" WalkAnims(3)="WalkR_M4203" CrouchTurnRightAnim="CH_TurnR_M4203" CrouchTurnLeftAnim="CH_TurnL_M4203" IdleCrouchAnim="CHIdle_M4203" IdleWeaponAnim="Idle_M4203" IdleRestAnim="Idle_M4203" IdleChatAnim="Idle_M4203" IdleHeavyAnim="Idle_M4203" IdleRifleAnim="Idle_M4203" FireAnims(0)="Fire_M99" FireAnims(1)="Fire_M99" FireAnims(2)="Fire_M99" FireAnims(3)="Fire_M99" FireAltAnims(0)="Fire_M99" FireAltAnims(1)="Fire_M99" FireAltAnims(2)="Fire_M99" FireAltAnims(3)="Fire_M99" FireCrouchAnims(0)="CHFire_M99" FireCrouchAnims(1)="CHFire_M99" FireCrouchAnims(2)="CHFire_M99" FireCrouchAnims(3)="CHFire_M99" FireCrouchAltAnims(0)="CHFire_M99" FireCrouchAltAnims(1)="CHFire_M99" FireCrouchAltAnims(2)="CHFire_M99" FireCrouchAltAnims(3)="CHFire_M99" HitAnims(0)="HitF_M4203" HitAnims(1)="HitB_M4203" HitAnims(2)="HitL_M4203" HitAnims(3)="HitR_M4203" PostFireBlendStandAnim="Blend_M4203" PostFireBlendCrouchAnim="CHBlend_M4203" MeshRef="KF_Weapons3rd4_Trip.M99_Sniper_3rd" -} +class NiceM99Attachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdPTRD' + MovementAnims(0)="JogF_M4203" + MovementAnims(1)="JogB_M4203" + MovementAnims(2)="JogL_M4203" + MovementAnims(3)="JogR_M4203" + TurnLeftAnim="TurnL_M4203" + TurnRightAnim="TurnR_M4203" + CrouchAnims(0)="CHWalkF_M4203" + CrouchAnims(1)="CHWalkB_M4203" + CrouchAnims(2)="CHWalkL_M4203" + CrouchAnims(3)="CHWalkR_M4203" + WalkAnims(0)="WalkF_M4203" + WalkAnims(1)="WalkB_M4203" + WalkAnims(2)="WalkL_M4203" + WalkAnims(3)="WalkR_M4203" + CrouchTurnRightAnim="CH_TurnR_M4203" + CrouchTurnLeftAnim="CH_TurnL_M4203" + IdleCrouchAnim="CHIdle_M4203" + IdleWeaponAnim="Idle_M4203" + IdleRestAnim="Idle_M4203" + IdleChatAnim="Idle_M4203" + IdleHeavyAnim="Idle_M4203" + IdleRifleAnim="Idle_M4203" + FireAnims(0)="Fire_M99" + FireAnims(1)="Fire_M99" + FireAnims(2)="Fire_M99" + FireAnims(3)="Fire_M99" + FireAltAnims(0)="Fire_M99" + FireAltAnims(1)="Fire_M99" + FireAltAnims(2)="Fire_M99" + FireAltAnims(3)="Fire_M99" + FireCrouchAnims(0)="CHFire_M99" + FireCrouchAnims(1)="CHFire_M99" + FireCrouchAnims(2)="CHFire_M99" + FireCrouchAnims(3)="CHFire_M99" + FireCrouchAltAnims(0)="CHFire_M99" + FireCrouchAltAnims(1)="CHFire_M99" + FireCrouchAltAnims(2)="CHFire_M99" + FireCrouchAltAnims(3)="CHFire_M99" + HitAnims(0)="HitF_M4203" + HitAnims(1)="HitB_M4203" + HitAnims(2)="HitL_M4203" + HitAnims(3)="HitR_M4203" + PostFireBlendStandAnim="Blend_M4203" + PostFireBlendCrouchAnim="CHBlend_M4203" + MeshRef="KF_Weapons3rd4_Trip.M99_Sniper_3rd" +} diff --git a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Fire.uc b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Fire.uc index 22ae6de..62d5810 100644 --- a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Fire.uc +++ b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Fire.uc @@ -1,4 +1,29 @@ -class NiceM99Fire extends NiceFire; -defaultproperties -{ ProjectileSpeed=40000.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.100000 maxVerticalRecoilAngle=2000 maxHorizontalRecoilAngle=1000 bRandomPitchFireSound=False FireSoundRef="KF_M99Snd.M99_Fire_M" StereoFireSoundRef="KF_M99Snd.M99_Fire_S" NoAmmoSoundRef="KF_SCARSnd.SCAR_DryFire" DamageType=Class'NicePack.NiceDamTypeM99SniperRifle' DamageMin=750 DamageMax=750 Momentum=150000.000000 bWaitForRelease=True TransientSoundVolume=1.800000 FireAnimRate=0.850000 FireForce="AssaultRifleFire" FireRate=0.000000 AmmoClass=Class'NicePack.NiceM99Ammo' ShakeRotMag=(X=5.000000,Y=7.000000,Z=3.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeOffsetMag=(X=5.000000,Y=5.000000,Z=5.000000) BotRefireRate=3.570000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stPTRD' aimerror=0.000000 -} +class NiceM99Fire extends NiceFire; +defaultproperties +{ + ProjectileSpeed=40000.000000 + FireAimedAnim="Fire_Iron" + RecoilRate=0.100000 + maxVerticalRecoilAngle=2000 + maxHorizontalRecoilAngle=1000 + bRandomPitchFireSound=False + FireSoundRef="KF_M99Snd.M99_Fire_M" + StereoFireSoundRef="KF_M99Snd.M99_Fire_S" + NoAmmoSoundRef="KF_SCARSnd.SCAR_DryFire" + DamageType=Class'NicePack.NiceDamTypeM99SniperRifle' + DamageMin=750 + DamageMax=750 + Momentum=150000.000000 + bWaitForRelease=True + TransientSoundVolume=1.800000 + FireAnimRate=0.850000 + FireForce="AssaultRifleFire" + FireRate=0.000000 + AmmoClass=Class'NicePack.NiceM99Ammo' + ShakeRotMag=(X=5.000000,Y=7.000000,Z=3.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeOffsetMag=(X=5.000000,Y=5.000000,Z=5.000000) + BotRefireRate=3.570000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stPTRD' + aimerror=0.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Pickup.uc b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Pickup.uc index b2e0e5b..799297e 100644 --- a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Pickup.uc +++ b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99Pickup.uc @@ -1,4 +1,24 @@ -class NiceM99Pickup extends NiceWeaponPickup; -defaultproperties -{ cost=1250 AmmoCost=60 BuyClipSize=1 PowerValue=95 SpeedValue=30 RangeValue=100 Description="M99 50 Caliber Single Shot Sniper Rifle - The ultimate in long range accuracy and knock down power. But to land a proper shot with it one needs to be extra precise and aim at his target for at least a solid second." ItemName="M99 AMR" ItemShortName="M99 AMR" AmmoItemName="50 Cal Bullets" CorrespondingPerkIndex=2 EquipmentCategoryID=3 MaxDesireability=0.790000 InventoryType=Class'NicePack.NiceM99SniperRifle' PickupMessage="You got the M99 Sniper Rifle" PickupSound=Sound'KF_M99Snd.M99_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'KF_pickups4_Trip.Rifles.M99_Sniper_Pickup' CollisionRadius=25.000000 CollisionHeight=10.000000 -} +class NiceM99Pickup extends NiceWeaponPickup; +defaultproperties +{ + cost=1250 + AmmoCost=60 + BuyClipSize=1 + PowerValue=95 + SpeedValue=30 + RangeValue=100 + Description="M99 50 Caliber Single Shot Sniper Rifle - The ultimate in long range accuracy and knock down power. But to land a proper shot with it one needs to be extra precise and aim at his target for at least a solid second." + ItemName="M99 AMR" + ItemShortName="M99 AMR" + AmmoItemName="50 Cal Bullets" + CorrespondingPerkIndex=2 + EquipmentCategoryID=3 + MaxDesireability=0.790000 + InventoryType=Class'NicePack.NiceM99SniperRifle' + PickupMessage="You got the M99 Sniper Rifle" + PickupSound=Sound'KF_M99Snd.M99_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'KF_pickups4_Trip.Rifles.M99_Sniper_Pickup' + CollisionRadius=25.000000 + CollisionHeight=10.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99SniperRifle.uc b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99SniperRifle.uc index 83f713b..70d2fb9 100644 --- a/sources/Weapons/Playable/SniperWeapons/M99/NiceM99SniperRifle.uc +++ b/sources/Weapons/Playable/SniperWeapons/M99/NiceM99SniperRifle.uc @@ -1,23 +1,84 @@ -class NiceM99SniperRifle extends NiceScopedWeapon; -#exec OBJ LOAD FILE=..\Textures\KF_Weapons5_Scopes_Trip_T.utx -simulated function PostBeginPlay(){ - local AutoReloadAnimDesc reloadDesc; - autoReloadsDescriptions.Length = 0; - reloadDesc.canInterruptFrame = 0.43; - reloadDesc.trashStartFrame = 0.882; - reloadDesc.resumeFrame = 0.473; - reloadDesc.speedFrame = 0.129; - reloadDesc.animName = 'Fire'; - autoReloadsDescriptions[0] = reloadDesc; - reloadDesc.animName = 'Fire_Iron'; - autoReloadsDescriptions[1] = reloadDesc; - super.PostBeginPlay(); -} -simulated function bool StartFire(int Mode){ - if(super.StartFire(Mode)){ if(Instigator != none && PlayerController(Instigator.Controller) != none && KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements) != none){ KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements).OnShotM99(); } return true; - } - return false; -} -defaultproperties -{ lenseMaterialID=2 scopePortalFOVHigh=20.000000 scopePortalFOV=13.330000 ZoomMatRef="KF_Weapons5_Scopes_Trip_T.M99.MilDotFinalBlend" ScriptedTextureFallbackRef="KF_Weapons_Trip_T.CBLens_cmb" CrosshairTexRef="KF_Weapons5_Scopes_Trip_T.Scope.MilDot" bChangeClipIcon=True hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' reloadType=RTYPE_AUTO bHasScope=True ZoomedDisplayFOVHigh=18.000000 ForceZoomOutOnFireTime=0.400000 MagCapacity=1 ReloadRate=0.010000 ReloadAnim="Reload" ReloadAnimRate=1.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M99' bIsTier3Weapon=True MeshRef="KF_Wep_M99_Sniper.M99_Sniper" SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.M99_cmb" SelectSoundRef="KF_M99Snd.M99_Select" HudImageRef="KillingFloor2HUD.WeaponSelect.M99_unselected" SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M99" PlayerIronSightFOV=30.000000 ZoomTime=0.285000 ZoomedDisplayFOV=30.000000 FireModeClass(0)=Class'NicePack.NiceM99Fire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" PutDownAnimRate=2.000000 SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="M99 50 Caliber Single Shot Sniper Rifle - The ultimate in long range accuracy and knock down power. But to land a proper shot with it one needs to be extra precise and aim at his target for at least a solid second." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=190 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" MinReloadPct=0.800000 InventoryGroup=4 GroupOffset=14 PickupClass=Class'NicePack.NiceM99Pickup' PlayerViewOffset=(X=15.000000,Y=15.000000,Z=-2.500000) BobDamping=4.500000 AttachmentClass=Class'NicePack.NiceM99Attachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="M99AMR" LightType=LT_None LightBrightness=0.000000 LightRadius=0.000000 TransientSoundVolume=1.250000 -} +class NiceM99SniperRifle extends NiceScopedWeapon; +#exec OBJ LOAD FILE=..\Textures\KF_Weapons5_Scopes_Trip_T.utx +simulated function PostBeginPlay(){ + local AutoReloadAnimDesc reloadDesc; + autoReloadsDescriptions.Length = 0; + reloadDesc.canInterruptFrame = 0.43; + reloadDesc.trashStartFrame = 0.882; + reloadDesc.resumeFrame = 0.473; + reloadDesc.speedFrame = 0.129; + reloadDesc.animName = 'Fire'; + autoReloadsDescriptions[0] = reloadDesc; + reloadDesc.animName = 'Fire_Iron'; + autoReloadsDescriptions[1] = reloadDesc; + super.PostBeginPlay(); +} +simulated function bool StartFire(int Mode){ + if(super.StartFire(Mode)){ + if(Instigator != none && PlayerController(Instigator.Controller) != none && + KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements) != none){ + KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements).OnShotM99(); + } + return true; + } + return false; +} +defaultproperties +{ + lenseMaterialID=2 + scopePortalFOVHigh=20.000000 + scopePortalFOV=13.330000 + ZoomMatRef="KF_Weapons5_Scopes_Trip_T.M99.MilDotFinalBlend" + ScriptedTextureFallbackRef="KF_Weapons_Trip_T.CBLens_cmb" + CrosshairTexRef="KF_Weapons5_Scopes_Trip_T.Scope.MilDot" + bChangeClipIcon=True + hudClipTexture=Texture'KillingFloorHUD.HUD.Hud_Single_Bullet' + reloadType=RTYPE_AUTO + bHasScope=True + ZoomedDisplayFOVHigh=18.000000 + ForceZoomOutOnFireTime=0.400000 + MagCapacity=1 + ReloadRate=0.010000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=55.000000 + TraderInfoTexture=Texture'KillingFloor2HUD.Trader_Weapon_Icons.Trader_M99' + bIsTier3Weapon=True + MeshRef="KF_Wep_M99_Sniper.M99_Sniper" + SkinRefs(0)="KF_Weapons5_Trip_T.Weapons.M99_cmb" + SelectSoundRef="KF_M99Snd.M99_Select" + HudImageRef="KillingFloor2HUD.WeaponSelect.M99_unselected" + SelectedHudImageRef="KillingFloor2HUD.WeaponSelect.M99" + PlayerIronSightFOV=30.000000 + ZoomTime=0.285000 + ZoomedDisplayFOV=30.000000 + FireModeClass(0)=Class'NicePack.NiceM99Fire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + PutDownAnimRate=2.000000 + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="M99 50 Caliber Single Shot Sniper Rifle - The ultimate in long range accuracy and knock down power. But to land a proper shot with it one needs to be extra precise and aim at his target for at least a solid second." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=55.000000 + Priority=190 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + MinReloadPct=0.800000 + InventoryGroup=4 + GroupOffset=14 + PickupClass=Class'NicePack.NiceM99Pickup' + PlayerViewOffset=(X=15.000000,Y=15.000000,Z=-2.500000) + BobDamping=4.500000 + AttachmentClass=Class'NicePack.NiceM99Attachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="M99AMR" + LightType=LT_None + LightBrightness=0.000000 + LightRadius=0.000000 + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceDamTypeMauler.uc b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceDamTypeMauler.uc index d62e385..bb878f8 100644 --- a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceDamTypeMauler.uc +++ b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceDamTypeMauler.uc @@ -1,9 +1,24 @@ -class NiceDamTypeMauler extends NiceDamageTypeVetSharpshooter - abstract; -static function ScoredNiceHeadshot(KFSteamStatsAndAchievements KFStatsAndAchievements, class MonsterClass, int HL){ - super.ScoredNiceHeadshot(KFStatsAndAchievements, MonsterClass, HL); - if(KFStatsAndAchievements != none) KFStatsAndAchievements.AddHeadshotsWithSPSOrM14(MonsterClass); -} -defaultproperties -{ stunMultiplier=1.250000 HeadShotDamageMult=4.000000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceMaulerRifle' DeathString="%k killed %o (S.P. Mauler)." FemaleSuicide="%o shot herself in the foot." MaleSuicide="%o shot himself in the foot." bRagdollBullet=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' KDamageImpulse=7500.000000 KDeathVel=175.000000 KDeathUpKick=25.000000 -} +class NiceDamTypeMauler extends NiceDamageTypeVetSharpshooter + abstract; +static function ScoredNiceHeadshot(KFSteamStatsAndAchievements KFStatsAndAchievements, class MonsterClass, int HL){ + super.ScoredNiceHeadshot(KFStatsAndAchievements, MonsterClass, HL); + if(KFStatsAndAchievements != none) + KFStatsAndAchievements.AddHeadshotsWithSPSOrM14(MonsterClass); +} +defaultproperties +{ + stunMultiplier=1.250000 + HeadShotDamageMult=4.000000 + bSniperWeapon=True + WeaponClass=Class'NicePack.NiceMaulerRifle' + DeathString="%k killed %o (S.P. Mauler)." + FemaleSuicide="%o shot herself in the foot." + MaleSuicide="%o shot himself in the foot." + bRagdollBullet=True + PawnDamageEmitter=Class'ROEffects.ROBloodPuff' + LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' + LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' + KDamageImpulse=7500.000000 + KDeathVel=175.000000 + KDeathUpKick=25.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAmmo.uc b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAmmo.uc index bc10985..ca8955c 100644 --- a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAmmo.uc +++ b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAmmo.uc @@ -1,4 +1,12 @@ -class NiceMaulerAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceMaulerPickup' AmmoPickupAmount=10 MaxAmmo=80 InitialAmount=20 PickupClass=Class'NicePack.NiceMaulerAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="S.P. Mauler bullets" -} +class NiceMaulerAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceMaulerPickup' + AmmoPickupAmount=10 + MaxAmmo=80 + InitialAmount=20 + PickupClass=Class'NicePack.NiceMaulerAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="S.P. Mauler bullets" +} diff --git a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAmmoPickup.uc b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAmmoPickup.uc index 6f65f65..f253469 100644 --- a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAmmoPickup.uc +++ b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceMaulerAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=10 InventoryType=Class'NicePack.NiceMaulerAmmo' PickupMessage="S.P. Mauler bullets" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceMaulerAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=10 + InventoryType=Class'NicePack.NiceMaulerAmmo' + PickupMessage="S.P. Mauler bullets" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAttachment.uc b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAttachment.uc index 182782b..8f1a437 100644 --- a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAttachment.uc +++ b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerAttachment.uc @@ -1,4 +1,54 @@ -class NiceMaulerAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdSPSniper' mTracerClass=Class'NicePack.NiceMaulerTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' MovementAnims(0)="JogF_M14" MovementAnims(1)="JogB_M14" MovementAnims(2)="JogL_M14" MovementAnims(3)="JogR_M14" TurnLeftAnim="TurnL_M14" TurnRightAnim="TurnR_M14" CrouchAnims(0)="CHWalkF_M14" CrouchAnims(1)="CHWalkB_M14" CrouchAnims(2)="CHWalkL_M14" CrouchAnims(3)="CHWalkR_M14" WalkAnims(0)="WalkF_M14" WalkAnims(1)="WalkB_M14" WalkAnims(2)="WalkL_M14" WalkAnims(3)="WalkR_M14" CrouchTurnRightAnim="CH_TurnR_M14" CrouchTurnLeftAnim="CH_TurnL_M14" IdleCrouchAnim="CHIdle_M14" IdleWeaponAnim="Idle_M14" IdleRestAnim="Idle_M14" IdleChatAnim="Fire_spSinper" IdleHeavyAnim="Idle_M14" IdleRifleAnim="Idle_M14" FireAnims(0)="Fire_spSinper" FireAnims(1)="Fire_spSinper" FireAnims(2)="Fire_spSinper" FireAnims(3)="Fire_spSinper" FireAltAnims(0)="Fire_spSinper" FireAltAnims(1)="Fire_spSinper" FireAltAnims(2)="Fire_spSinper" FireAltAnims(3)="Fire_spSinper" FireCrouchAnims(0)="CHFire_spSinper" FireCrouchAnims(1)="CHFire_spSinper" FireCrouchAnims(2)="CHFire_spSinper" FireCrouchAnims(3)="CHFire_spSinper" FireCrouchAltAnims(0)="CHFire_spSinper" FireCrouchAltAnims(1)="CHFire_spSinper" FireCrouchAltAnims(2)="CHFire_spSinper" FireCrouchAltAnims(3)="CHFire_spSinper" HitAnims(0)="HitF_M14" HitAnims(1)="HitB_M14" HitAnims(2)="HitL_M14" HitAnims(3)="HitR_M14" PostFireBlendStandAnim="Blend_M14" PostFireBlendCrouchAnim="CHBlend_M14" MeshRef="NicePackA.spSniper_3rd" SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceMaulerAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdSPSniper' + mTracerClass=Class'NicePack.NiceMaulerTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + MovementAnims(0)="JogF_M14" + MovementAnims(1)="JogB_M14" + MovementAnims(2)="JogL_M14" + MovementAnims(3)="JogR_M14" + TurnLeftAnim="TurnL_M14" + TurnRightAnim="TurnR_M14" + CrouchAnims(0)="CHWalkF_M14" + CrouchAnims(1)="CHWalkB_M14" + CrouchAnims(2)="CHWalkL_M14" + CrouchAnims(3)="CHWalkR_M14" + WalkAnims(0)="WalkF_M14" + WalkAnims(1)="WalkB_M14" + WalkAnims(2)="WalkL_M14" + WalkAnims(3)="WalkR_M14" + CrouchTurnRightAnim="CH_TurnR_M14" + CrouchTurnLeftAnim="CH_TurnL_M14" + IdleCrouchAnim="CHIdle_M14" + IdleWeaponAnim="Idle_M14" + IdleRestAnim="Idle_M14" + IdleChatAnim="Fire_spSinper" + IdleHeavyAnim="Idle_M14" + IdleRifleAnim="Idle_M14" + FireAnims(0)="Fire_spSinper" + FireAnims(1)="Fire_spSinper" + FireAnims(2)="Fire_spSinper" + FireAnims(3)="Fire_spSinper" + FireAltAnims(0)="Fire_spSinper" + FireAltAnims(1)="Fire_spSinper" + FireAltAnims(2)="Fire_spSinper" + FireAltAnims(3)="Fire_spSinper" + FireCrouchAnims(0)="CHFire_spSinper" + FireCrouchAnims(1)="CHFire_spSinper" + FireCrouchAnims(2)="CHFire_spSinper" + FireCrouchAnims(3)="CHFire_spSinper" + FireCrouchAltAnims(0)="CHFire_spSinper" + FireCrouchAltAnims(1)="CHFire_spSinper" + FireCrouchAltAnims(2)="CHFire_spSinper" + FireCrouchAltAnims(3)="CHFire_spSinper" + HitAnims(0)="HitF_M14" + HitAnims(1)="HitB_M14" + HitAnims(2)="HitL_M14" + HitAnims(3)="HitR_M14" + PostFireBlendStandAnim="Blend_M14" + PostFireBlendCrouchAnim="CHBlend_M14" + MeshRef="NicePackA.spSniper_3rd" + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerFire.uc b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerFire.uc index 2d44435..7cc73a0 100644 --- a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerFire.uc +++ b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerFire.uc @@ -1,4 +1,35 @@ -class NiceMaulerFire extends NiceFire; -defaultproperties -{ ProjectileSpeed=37950.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.120000 maxVerticalRecoilAngle=125 maxHorizontalRecoilAngle=87 ShellEjectClass=Class'ROEffects.KFShellEjectEBR' ShellEjectBoneName="Shell_eject" FireSoundRef="KF_SP_LongmusketSnd.KFO_Sniper_Fire_M" StereoFireSoundRef="KF_SP_LongmusketSnd.KFO_Sniper_Fire_S" NoAmmoSoundRef="KF_M14EBRSnd.M14EBR_DryFire" DamageType=Class'NicePack.NiceDamTypeMauler' DamageMin=121 DamageMax=121 Momentum=13000.000000 bWaitForRelease=True TransientSoundVolume=1.800000 FireLoopAnim="Fire" FireAnimRate=1.600000 TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.587500 AmmoClass=Class'NicePack.NiceMaulerAmmo' ShakeRotMag=(X=100.000000,Y=100.000000,Z=500.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=2.000000 ShakeOffsetMag=(X=10.000000,Y=3.000000,Z=12.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=2.000000 BotRefireRate=0.990000 FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSPSniper' aimerror=42.000000 -} +class NiceMaulerFire extends NiceFire; +defaultproperties +{ + ProjectileSpeed=37950.000000 + FireAimedAnim="Fire_Iron" + RecoilRate=0.120000 + maxVerticalRecoilAngle=125 + maxHorizontalRecoilAngle=87 + ShellEjectClass=Class'ROEffects.KFShellEjectEBR' + ShellEjectBoneName="Shell_eject" + FireSoundRef="KF_SP_LongmusketSnd.KFO_Sniper_Fire_M" + StereoFireSoundRef="KF_SP_LongmusketSnd.KFO_Sniper_Fire_S" + NoAmmoSoundRef="KF_M14EBRSnd.M14EBR_DryFire" + DamageType=Class'NicePack.NiceDamTypeMauler' + DamageMin=121 + DamageMax=121 + Momentum=13000.000000 + bWaitForRelease=True + TransientSoundVolume=1.800000 + FireLoopAnim="Fire" + FireAnimRate=1.600000 + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.587500 + AmmoClass=Class'NicePack.NiceMaulerAmmo' + ShakeRotMag=(X=100.000000,Y=100.000000,Z=500.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeRotTime=2.000000 + ShakeOffsetMag=(X=10.000000,Y=3.000000,Z=12.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=2.000000 + BotRefireRate=0.990000 + FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSPSniper' + aimerror=42.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerPickup.uc b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerPickup.uc index dfd6ddf..a870828 100644 --- a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerPickup.uc +++ b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerPickup.uc @@ -1,4 +1,24 @@ -class NiceMaulerPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=6.000000 cost=750 AmmoCost=50 BuyClipSize=10 PowerValue=60 SpeedValue=10 RangeValue=95 Description="A finely crafted rifle with relatively low impact damage, but able to deal devastating blows with precise aiming." ItemName="Silver-Plated Mauler" ItemShortName="S.P. Mauler" AmmoItemName="S.P. Mauler bullets" CorrespondingPerkIndex=2 EquipmentCategoryID=3 InventoryType=Class'NicePack.NiceMaulerRifle' PickupMessage="You got the Silver-Plated Mauler" PickupSound=Sound'NicePackSnd.Silver.KFO_Sniper_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'NicePackSM.Silver.SniperRifle' CollisionRadius=25.000000 CollisionHeight=5.000000 -} +class NiceMaulerPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=6.000000 + cost=750 + AmmoCost=50 + BuyClipSize=10 + PowerValue=60 + SpeedValue=10 + RangeValue=95 + Description="A finely crafted rifle with relatively low impact damage, but able to deal devastating blows with precise aiming." + ItemName="Silver-Plated Mauler" + ItemShortName="S.P. Mauler" + AmmoItemName="S.P. Mauler bullets" + CorrespondingPerkIndex=2 + EquipmentCategoryID=3 + InventoryType=Class'NicePack.NiceMaulerRifle' + PickupMessage="You got the Silver-Plated Mauler" + PickupSound=Sound'NicePackSnd.Silver.KFO_Sniper_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'NicePackSM.Silver.SniperRifle' + CollisionRadius=25.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerRifle.uc b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerRifle.uc index f661342..3677150 100644 --- a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerRifle.uc +++ b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerRifle.uc @@ -1,6 +1,53 @@ -class NiceMaulerRifle extends NiceWeapon - config(user); -#exec OBJ LOAD FILE=NicePackSM.usx -defaultproperties -{ reloadPreEndFrame=0.200000 reloadEndFrame=0.550000 reloadChargeEndFrame=0.894000 reloadMagStartFrame=0.280000 reloadChargeStartFrame=0.647000 MagCapacity=10 ReloadRate=2.866000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_spSinper" Weight=6.000000 bHasAimingMode=True IdleAimAnim="Idle_Iron" StandardDisplayFOV=55.000000 SleeveNum=0 TraderInfoTexture=Texture'NicePackT.Silver.Trader_Sniper' bIsTier2Weapon=True MeshRef="NicePackA.SniperRifle" SkinRefs(1)="NicePackT.Silver.Sniper_cmb" SkinRefs(2)="NicePackT.Silver.sniperrifle_scope_shader" SelectSoundRef="NicePackSnd.Silver.KFO_Sniper_Select" HudImageRef="KF_IJC_HUD.WeaponSelect.Sniper_unselected" SelectedHudImageRef="KF_IJC_HUD.WeaponSelect.Sniper" PlayerIronSightFOV=60.000000 ZoomedDisplayFOV=25.000000 FireModeClass(0)=Class'NicePack.NiceMaulerFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.550000 CurrentRating=0.550000 bShowChargingBar=True Description="A finely crafted rifle with relatively low impact damage, but able to deal devastating blows with precise aiming." EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) DisplayFOV=55.000000 Priority=155 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=18 PickupClass=Class'NicePack.NiceMaulerPickup' PlayerViewOffset=(X=25.000000,Y=17.000000,Z=-8.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceMaulerAttachment' IconCoords=(X1=245,Y1=39,X2=329,Y2=79) ItemName="S.P. Mauler" TransientSoundVolume=1.250000 -} +class NiceMaulerRifle extends NiceWeapon + config(user); +#exec OBJ LOAD FILE=NicePackSM.usx +defaultproperties +{ + reloadPreEndFrame=0.200000 + reloadEndFrame=0.550000 + reloadChargeEndFrame=0.894000 + reloadMagStartFrame=0.280000 + reloadChargeStartFrame=0.647000 + MagCapacity=10 + ReloadRate=2.866000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_spSinper" + Weight=6.000000 + bHasAimingMode=True + IdleAimAnim="Idle_Iron" + StandardDisplayFOV=55.000000 + SleeveNum=0 + TraderInfoTexture=Texture'NicePackT.Silver.Trader_Sniper' + bIsTier2Weapon=True + MeshRef="NicePackA.SniperRifle" + SkinRefs(1)="NicePackT.Silver.Sniper_cmb" + SkinRefs(2)="NicePackT.Silver.sniperrifle_scope_shader" + SelectSoundRef="NicePackSnd.Silver.KFO_Sniper_Select" + HudImageRef="KF_IJC_HUD.WeaponSelect.Sniper_unselected" + SelectedHudImageRef="KF_IJC_HUD.WeaponSelect.Sniper" + PlayerIronSightFOV=60.000000 + ZoomedDisplayFOV=25.000000 + FireModeClass(0)=Class'NicePack.NiceMaulerFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.550000 + CurrentRating=0.550000 + bShowChargingBar=True + Description="A finely crafted rifle with relatively low impact damage, but able to deal devastating blows with precise aiming." + EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000) + DisplayFOV=55.000000 + Priority=155 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=3 + GroupOffset=18 + PickupClass=Class'NicePack.NiceMaulerPickup' + PlayerViewOffset=(X=25.000000,Y=17.000000,Z=-8.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceMaulerAttachment' + IconCoords=(X1=245,Y1=39,X2=329,Y2=79) + ItemName="S.P. Mauler" + TransientSoundVolume=1.250000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerTracer.uc b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerTracer.uc index 28ab907..acd8ea4 100644 --- a/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerTracer.uc +++ b/sources/Weapons/Playable/SniperWeapons/Mauler/NiceMaulerTracer.uc @@ -1,4 +1,22 @@ -class NiceMaulerTracer extends KFNewTracer; -defaultproperties -{ Begin Object Class=SpriteEmitter Name=SpriteEmitter13 UseDirectionAs=PTDU_Right RespawnDeadParticles=False UseAbsoluteTimeForSizeScale=True UseRegularSizeScale=False ScaleSizeXByVelocity=True AutomaticInitialSpawning=False ExtentMultiplier=(X=0.200000) ColorMultiplierRange=(X=(Min=0.000000,Max=0.000000)) MaxParticles=100 StartSizeRange=(X=(Min=30.000000,Max=30.000000),Y=(Min=3.000000,Max=3.000000)) ScaleSizeByVelocityMultiplier=(X=0.001000) DrawStyle=PTDS_Brighten Texture=Texture'Effects_Tex_Steampunk.Steampunk_Tracer' LifetimeRange=(Min=0.100000,Max=0.100000) StartVelocityRange=(Z=(Min=10000.000000,Max=10000.000000)) End Object Emitters(0)=SpriteEmitter'NicePack.NiceMaulerTracer.SpriteEmitter13' -} +class NiceMaulerTracer extends KFNewTracer; +defaultproperties +{ + Begin Object Class=SpriteEmitter Name=SpriteEmitter13 + UseDirectionAs=PTDU_Right + RespawnDeadParticles=False + UseAbsoluteTimeForSizeScale=True + UseRegularSizeScale=False + ScaleSizeXByVelocity=True + AutomaticInitialSpawning=False + ExtentMultiplier=(X=0.200000) + ColorMultiplierRange=(X=(Min=0.000000,Max=0.000000)) + MaxParticles=100 + StartSizeRange=(X=(Min=30.000000,Max=30.000000),Y=(Min=3.000000,Max=3.000000)) + ScaleSizeByVelocityMultiplier=(X=0.001000) + DrawStyle=PTDS_Brighten + Texture=Texture'Effects_Tex_Steampunk.Steampunk_Tracer' + LifetimeRange=(Min=0.100000,Max=0.100000) + StartVelocityRange=(Z=(Min=10000.000000,Max=10000.000000)) + End Object + Emitters(0)=SpriteEmitter'NicePack.NiceMaulerTracer.SpriteEmitter13' +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVD.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVD.uc index 7f647ae..2ca7eeb 100644 --- a/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVD.uc +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVD.uc @@ -1,4 +1,24 @@ -class NiceDamTypeSVD extends NiceDamageTypeVetSharpshooter; -defaultproperties -{ prReqMultiplier=0.400000 prReqPrecise=0.400000 MaxPenetrations=3 BigZedPenDmgReduction=0.750000 MediumZedPenDmgReduction=0.900000 PenDmgReduction=0.950000 HeadShotDamageMult=4.200000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceSVD' DeathString="%k killed %o (SVD)." bRagdollBullet=True bBulletHit=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' FlashFog=(X=600.000000) KDamageImpulse=4000.000000 KDeathVel=170.000000 KDeathUpKick=10.000000 VehicleDamageScaling=0.700000 -} +class NiceDamTypeSVD extends NiceDamageTypeVetSharpshooter; +defaultproperties +{ + prReqMultiplier=0.400000 + prReqPrecise=0.400000 + MaxPenetrations=3 + BigZedPenDmgReduction=0.750000 + MediumZedPenDmgReduction=0.900000 + PenDmgReduction=0.950000 + HeadShotDamageMult=4.200000 + bSniperWeapon=True + WeaponClass=Class'NicePack.NiceSVD' + DeathString="%k killed %o (SVD)." + bRagdollBullet=True + bBulletHit=True + PawnDamageEmitter=Class'ROEffects.ROBloodPuff' + LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' + LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' + FlashFog=(X=600.000000) + KDamageImpulse=4000.000000 + KDeathVel=170.000000 + KDeathUpKick=10.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVDS.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVDS.uc index d5d1728..28a920b 100644 --- a/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVDS.uc +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVDS.uc @@ -1,4 +1,22 @@ -class NiceDamTypeSVDS extends NiceDamageTypeVetSharpshooter; -defaultproperties -{ MaxPenetrations=1 BigZedPenDmgReduction=0.750000 MediumZedPenDmgReduction=0.900000 PenDmgReduction=0.950000 HeadShotDamageMult=4.200000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceSVDS' DeathString="%k killed %o (SVD)." bRagdollBullet=True bBulletHit=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' FlashFog=(X=600.000000) KDamageImpulse=4000.000000 KDeathVel=170.000000 KDeathUpKick=10.000000 VehicleDamageScaling=0.700000 -} +class NiceDamTypeSVDS extends NiceDamageTypeVetSharpshooter; +defaultproperties +{ + MaxPenetrations=1 + BigZedPenDmgReduction=0.750000 + MediumZedPenDmgReduction=0.900000 + PenDmgReduction=0.950000 + HeadShotDamageMult=4.200000 + bSniperWeapon=True + WeaponClass=Class'NicePack.NiceSVDS' + DeathString="%k killed %o (SVD)." + bRagdollBullet=True + bBulletHit=True + PawnDamageEmitter=Class'ROEffects.ROBloodPuff' + LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' + LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' + FlashFog=(X=600.000000) + KDamageImpulse=4000.000000 + KDeathVel=170.000000 + KDeathUpKick=10.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVDm.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVDm.uc index 7dd5d34..f0fb51c 100644 --- a/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVDm.uc +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceDamTypeSVDm.uc @@ -1,5 +1,13 @@ -class NiceDamTypeSVDm extends KFWeaponDamageType - abstract; -defaultproperties -{ HeadShotDamageMult=1.000000 bIsMeleeDamage=True WeaponClass=Class'NicePack.NiceSVD' DeathString="%k killed %o (SVD)." PawnDamageSounds(0)=Sound'KFPawnDamageSound.MeleeDamageSounds.axehitflesh' KDamageImpulse=1500.000000 KDeathVel=110.000000 KDeathUpKick=1.000000 -} +class NiceDamTypeSVDm extends KFWeaponDamageType + abstract; +defaultproperties +{ + HeadShotDamageMult=1.000000 + bIsMeleeDamage=True + WeaponClass=Class'NicePack.NiceSVD' + DeathString="%k killed %o (SVD)." + PawnDamageSounds(0)=Sound'KFPawnDamageSound.MeleeDamageSounds.axehitflesh' + KDamageImpulse=1500.000000 + KDeathVel=110.000000 + KDeathUpKick=1.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVD.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVD.uc index 46efab1..782e7b3 100644 --- a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVD.uc +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVD.uc @@ -1,4 +1,41 @@ -class NiceSVD extends NiceSVDS; -defaultproperties -{ lenseMaterialID=4 scopePortalFOVHigh=12.000000 scopePortalFOV=12.000000 reloadPreEndFrame=0.115000 reloadEndFrame=0.607000 reloadChargeEndFrame=0.870000 reloadMagStartFrame=0.251000 reloadChargeStartFrame=0.730000 MagazineBone="Bone_Magazine" ZoomedDisplayFOVHigh=32.000000 MagCapacity=10 ReloadRate=3.600000 ReloadAnimRate=1.250000 WeaponReloadAnim="Reload_AK47" Weight=8.000000 IdleAimAnim="Idle_Iron" TraderInfoTexture=Texture'ScrnWeaponPack_T.SVD.SVD_Trader' MeshRef="ScrnWeaponPack_A.SVD_mesh" SkinRefs(0)="ScrnWeaponPack_T.SVD.SVD_tex_1_cmb" SkinRefs(1)="KF_Weapons5_Trip_T.First_Sleeves.Steampunk_DJ_Scully_First_Person_Sleeves" SkinRefs(2)="ScrnWeaponPack_T.SVD.SVD_tex_2_cmb" SkinRefs(3)="ScrnWeaponPack_T.SVD.SVD_tex_3_cmb" SkinRefs(4)="ScrnWeaponPack_T.SVD.AlphaLens" SkinRefs(5)="ScrnWeaponPack_T.SVD.SVD_tex_4_cmb" HudImageRef="ScrnWeaponPack_T.SVD.SVD_Unselected" SelectedHudImageRef="ScrnWeaponPack_T.SVD.SVD_selected" PlayerIronSightFOV=22.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=Class'NicePack.NiceSVDFire' FireModeClass(1)=Class'NicePack.NiceSVDFireB' Description="The Dragunov sniper rifle is a semi-automatic sniper rifle/designated marksman rifle. It's shots are extra powerful, but require more precision." Priority=190 PickupClass=Class'NicePack.NiceSVDPickup' PlayerViewOffset=(X=6.000000,Y=22.000000,Z=-12.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceSVDAttachment' ItemName="SVD (Dragunov)" -} +class NiceSVD extends NiceSVDS; +defaultproperties +{ + lenseMaterialID=4 + scopePortalFOVHigh=12.000000 + scopePortalFOV=12.000000 + reloadPreEndFrame=0.115000 + reloadEndFrame=0.607000 + reloadChargeEndFrame=0.870000 + reloadMagStartFrame=0.251000 + reloadChargeStartFrame=0.730000 + MagazineBone="Bone_Magazine" + ZoomedDisplayFOVHigh=32.000000 + MagCapacity=10 + ReloadRate=3.600000 + ReloadAnimRate=1.250000 + WeaponReloadAnim="Reload_AK47" + Weight=8.000000 + IdleAimAnim="Idle_Iron" + TraderInfoTexture=Texture'ScrnWeaponPack_T.SVD.SVD_Trader' + MeshRef="ScrnWeaponPack_A.SVD_mesh" + SkinRefs(0)="ScrnWeaponPack_T.SVD.SVD_tex_1_cmb" + SkinRefs(1)="KF_Weapons5_Trip_T.First_Sleeves.Steampunk_DJ_Scully_First_Person_Sleeves" + SkinRefs(2)="ScrnWeaponPack_T.SVD.SVD_tex_2_cmb" + SkinRefs(3)="ScrnWeaponPack_T.SVD.SVD_tex_3_cmb" + SkinRefs(4)="ScrnWeaponPack_T.SVD.AlphaLens" + SkinRefs(5)="ScrnWeaponPack_T.SVD.SVD_tex_4_cmb" + HudImageRef="ScrnWeaponPack_T.SVD.SVD_Unselected" + SelectedHudImageRef="ScrnWeaponPack_T.SVD.SVD_selected" + PlayerIronSightFOV=22.000000 + ZoomedDisplayFOV=32.000000 + FireModeClass(0)=Class'NicePack.NiceSVDFire' + FireModeClass(1)=Class'NicePack.NiceSVDFireB' + Description="The Dragunov sniper rifle is a semi-automatic sniper rifle/designated marksman rifle. It's shots are extra powerful, but require more precision." + Priority=190 + PickupClass=Class'NicePack.NiceSVDPickup' + PlayerViewOffset=(X=6.000000,Y=22.000000,Z=-12.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceSVDAttachment' + ItemName="SVD (Dragunov)" +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDAmmo.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDAmmo.uc index 6cd402e..802d442 100644 --- a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDAmmo.uc +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDAmmo.uc @@ -1,4 +1,11 @@ -class NiceSVDAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceSVDPickup' AmmoPickupAmount=10 MaxAmmo=60 InitialAmount=15 IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="7.62x54mm" -} +class NiceSVDAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceSVDPickup' + AmmoPickupAmount=10 + MaxAmmo=60 + InitialAmount=15 + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=338,Y1=40,X2=393,Y2=79) + ItemName="7.62x54mm" +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDAttachment.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDAttachment.uc index 14b73b0..fe96e19 100644 --- a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDAttachment.uc +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDAttachment.uc @@ -1,4 +1,58 @@ -class NiceSVDAttachment extends NiceAttachment; -defaultproperties -{ bSecondaryModeNoEffects=True mMuzFlashClass=Class'ScrnWeaponPack.MuzzleFlash3rdSVD' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'ScrnWeaponPack.KFShellSpewerSVD' MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="FastAttack2_Knife" FireAltAnims(1)="FastAttack2_Knife" FireAltAnims(2)="FastAttack2_Knife" FireAltAnims(3)="FastAttack2_Knife" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFastAttack2_Knife" FireCrouchAltAnims(1)="CHFastAttack2_Knife" FireCrouchAltAnims(2)="CHFastAttack2_Knife" FireCrouchAltAnims(3)="CHFastAttack2_Knife" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="ScrnWeaponPack_A.SVD_3rd" WeaponAmbientScale=2.000000 bRapidFire=True bAltRapidFire=True SplashEffect=Class'ROEffects.BulletSplashEmitter' LightBrightness=0.000000 -} +class NiceSVDAttachment extends NiceAttachment; +defaultproperties +{ + bSecondaryModeNoEffects=True + mMuzFlashClass=Class'ScrnWeaponPack.MuzzleFlash3rdSVD' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'ScrnWeaponPack.KFShellSpewerSVD' + MovementAnims(0)="JogF_AK47" + MovementAnims(1)="JogB_AK47" + MovementAnims(2)="JogL_AK47" + MovementAnims(3)="JogR_AK47" + TurnLeftAnim="TurnL_AK47" + TurnRightAnim="TurnR_AK47" + CrouchAnims(0)="CHWalkF_AK47" + CrouchAnims(1)="CHWalkB_AK47" + CrouchAnims(2)="CHWalkL_AK47" + CrouchAnims(3)="CHWalkR_AK47" + WalkAnims(0)="WalkF_AK47" + WalkAnims(1)="WalkB_AK47" + WalkAnims(2)="WalkL_AK47" + WalkAnims(3)="WalkR_AK47" + CrouchTurnRightAnim="CH_TurnR_AK47" + CrouchTurnLeftAnim="CH_TurnL_AK47" + IdleCrouchAnim="CHIdle_AK47" + IdleWeaponAnim="Idle_AK47" + IdleRestAnim="Idle_AK47" + IdleChatAnim="Idle_AK47" + IdleHeavyAnim="Idle_AK47" + IdleRifleAnim="Idle_AK47" + FireAnims(0)="Fire_AK47" + FireAnims(1)="Fire_AK47" + FireAnims(2)="Fire_AK47" + FireAnims(3)="Fire_AK47" + FireAltAnims(0)="FastAttack2_Knife" + FireAltAnims(1)="FastAttack2_Knife" + FireAltAnims(2)="FastAttack2_Knife" + FireAltAnims(3)="FastAttack2_Knife" + FireCrouchAnims(0)="CHFire_AK47" + FireCrouchAnims(1)="CHFire_AK47" + FireCrouchAnims(2)="CHFire_AK47" + FireCrouchAnims(3)="CHFire_AK47" + FireCrouchAltAnims(0)="CHFastAttack2_Knife" + FireCrouchAltAnims(1)="CHFastAttack2_Knife" + FireCrouchAltAnims(2)="CHFastAttack2_Knife" + FireCrouchAltAnims(3)="CHFastAttack2_Knife" + HitAnims(0)="HitF_AK47" + HitAnims(1)="HitB_AK47" + HitAnims(2)="HitL_AK47" + HitAnims(3)="HitR_AK47" + PostFireBlendStandAnim="Blend_AK47" + PostFireBlendCrouchAnim="CHBlend_AK47" + MeshRef="ScrnWeaponPack_A.SVD_3rd" + WeaponAmbientScale=2.000000 + bRapidFire=True + bAltRapidFire=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + LightBrightness=0.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDFire.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDFire.uc index 730c060..8dc135f 100644 --- a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDFire.uc +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDFire.uc @@ -1,4 +1,18 @@ -class NiceSVDFire extends NiceSVDSFire; -defaultproperties -{ ProjectileSpeed=41500.000000 FireAimedAnim="Fire_Iron" RecoilRate=0.150000 maxVerticalRecoilAngle=375 maxHorizontalRecoilAngle=150 DamageType=Class'NicePack.NiceDamTypeSVD' DamageMin=180 DamageMax=180 FireAnimRate=0.500000 TweenTime=0.025000 FireForce="AssaultRifleFire" FireRate=0.700000 AmmoClass=Class'NicePack.NiceSVDAmmo' BotRefireRate=1.200000 -} +class NiceSVDFire extends NiceSVDSFire; +defaultproperties +{ + ProjectileSpeed=41500.000000 + FireAimedAnim="Fire_Iron" + RecoilRate=0.150000 + maxVerticalRecoilAngle=375 + maxHorizontalRecoilAngle=150 + DamageType=Class'NicePack.NiceDamTypeSVD' + DamageMin=180 + DamageMax=180 + FireAnimRate=0.500000 + TweenTime=0.025000 + FireForce="AssaultRifleFire" + FireRate=0.700000 + AmmoClass=Class'NicePack.NiceSVDAmmo' + BotRefireRate=1.200000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDFireB.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDFireB.uc index a32f7b3..3f23902 100644 --- a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDFireB.uc +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDFireB.uc @@ -1,13 +1,29 @@ -class NiceSVDFireB extends KFMeleeFire; - -simulated function bool AllowFire() -{ - if(KFWeapon(Weapon).bIsReloading) return false; - if(KFPawn(Instigator).SecondaryItem!=none) return false; - if(KFPawn(Instigator).bThrowingNade) return false; - if ( KFWeapon(Weapon).bAimingRifle ) return false; - return Super.AllowFire(); -} -defaultproperties -{ MeleeDamage=65 ProxySize=0.150000 weaponRange=90.000000 DamagedelayMin=0.160000 DamagedelayMax=0.160000 hitDamageClass=Class'NicePack.NiceDamTypeSVDm' MeleeHitSounds(0)=Sound'KF_AxeSnd.AxeImpactBase.Axe_HitFlesh4' HitEffectClass=Class'ScrnWeaponPack.SVDHitEffect' bWaitForRelease=True FireAnim="MeleeAttack" FireRate=1.100000 BotRefireRate=1.100000 -} +class NiceSVDFireB extends KFMeleeFire; + +simulated function bool AllowFire() +{ + if(KFWeapon(Weapon).bIsReloading) + return false; + if(KFPawn(Instigator).SecondaryItem!=none) + return false; + if(KFPawn(Instigator).bThrowingNade) + return false; + if ( KFWeapon(Weapon).bAimingRifle ) + return false; + return Super.AllowFire(); +} +defaultproperties +{ + MeleeDamage=65 + ProxySize=0.150000 + weaponRange=90.000000 + DamagedelayMin=0.160000 + DamagedelayMax=0.160000 + hitDamageClass=Class'NicePack.NiceDamTypeSVDm' + MeleeHitSounds(0)=Sound'KF_AxeSnd.AxeImpactBase.Axe_HitFlesh4' + HitEffectClass=Class'ScrnWeaponPack.SVDHitEffect' + bWaitForRelease=True + FireAnim="MeleeAttack" + FireRate=1.100000 + BotRefireRate=1.100000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDPickup.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDPickup.uc index d311ef6..2d3f119 100644 --- a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDPickup.uc +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDPickup.uc @@ -1,7 +1,26 @@ -class NiceSVDPickup extends NiceWeaponPickup; -#exec OBJ LOAD FILE=ScrnWeaponPack_T.utx -#exec OBJ LOAD FILE=ScrnWeaponPack_A.ukx -defaultproperties -{ Weight=8.000000 - cost=1250 AmmoCost=50 BuyClipSize=10 PowerValue=90 SpeedValue=40 RangeValue=100 Description="The Dragunov sniper rifle is a semi-automatic sniper rifle/designated marksman rifle. It's shots are extra powerful, but require more precision." ItemName="SVD (Dragunov) " ItemShortName="SVD" AmmoItemName="7.64x54mm" CorrespondingPerkIndex=2 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceSVD' PickupMessage="You've got the Dragunov Sniper Rifle (SVD)" PickupSound=Sound'ScrnWeaponPack_SND.SVD.SVD_pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.SVD_st' CollisionRadius=30.000000 CollisionHeight=5.000000 -} +class NiceSVDPickup extends NiceWeaponPickup; +#exec OBJ LOAD FILE=ScrnWeaponPack_T.utx +#exec OBJ LOAD FILE=ScrnWeaponPack_A.ukx +defaultproperties +{ + Weight=8.000000 + cost=1250 + AmmoCost=50 + BuyClipSize=10 + PowerValue=90 + SpeedValue=40 + RangeValue=100 + Description="The Dragunov sniper rifle is a semi-automatic sniper rifle/designated marksman rifle. It's shots are extra powerful, but require more precision." + ItemName="SVD (Dragunov) " + ItemShortName="SVD" + AmmoItemName="7.64x54mm" + CorrespondingPerkIndex=2 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceSVD' + PickupMessage="You've got the Dragunov Sniper Rifle (SVD)" + PickupSound=Sound'ScrnWeaponPack_SND.SVD.SVD_pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'ScrnWeaponPack_SM.SVD_st' + CollisionRadius=30.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDS.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDS.uc index 2e2fb6d..197cf7e 100644 --- a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDS.uc +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDS.uc @@ -1,4 +1,57 @@ -class NiceSVDS extends NiceScopedWeapon; -defaultproperties -{ lenseMaterialID=3 scopePortalFOVHigh=10.000000 scopePortalFOV=10.000000 ZoomMatRef="ScrnWeaponPack_T.SVD.PSO1ScopeFinalBlend" ScriptedTextureFallbackRef="ScrnWeaponPack_T.SVD.AlphaLens" CrosshairTexRef="ScrnWeaponPack_T.SVD.PSO1Scope" reloadPreEndFrame=0.140000 reloadEndFrame=0.610000 reloadChargeEndFrame=0.920000 reloadMagStartFrame=0.354000 reloadChargeStartFrame=0.610000 MagazineBone="clip" bHasScope=True ZoomedDisplayFOVHigh=55.000000 MagCapacity=5 ReloadRate=3.500000 ReloadAnim="Reload" ReloadAnimRate=0.800000 WeaponReloadAnim="Reload_M14" Weight=7.000000 bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 TraderInfoTexture=Texture'ScrnWeaponPack_T.SVDS.SVD-cTrader' MeshRef="ScrnWeaponPack_A.SVDS_mesh" SkinRefs(0)="ScrnWeaponPack_T.SVDS.Svd_D_Sh" SkinRefs(1)="KF_Weapons2_Trip_T.hands.BritishPara_Hands_1st_P" SkinRefs(2)="KF_Weapons_Trip_T.Rifles.CBLens_cmb" SkinRefs(3)="ScrnWeaponPack_T.SVD.AlphaLens" SelectSoundRef="ScrnWeaponPack_SND.SVD.SVD_select" HudImageRef="ScrnWeaponPack_T.SVDS.SVD-cUnselected" SelectedHudImageRef="ScrnWeaponPack_T.SVDS.SVD-cSelected" PlayerIronSightFOV=32.000000 ZoomedDisplayFOV=50.000000 FireModeClass(0)=Class'NicePack.NiceSVDSFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="The Dragunov sniper rifle with folding stock (formally Russian: Snayperskaya Vintovka Dragunova Skladnaya, SVDS) is a compact variant of the SVD, which was developed in the early 1990s. It features a tubular metal stock that folds to the right side of the receiver and a synthetic pistol grip." DisplayFOV=65.000000 Priority=150 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=4 GroupOffset=3 PickupClass=Class'NicePack.NiceSVDSPickup' PlayerViewOffset=(X=7.000000,Y=9.000000,Z=-4.000000) BobDamping=5.000000 AttachmentClass=Class'NicePack.NiceSVDSAttachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="SVDS" -} +class NiceSVDS extends NiceScopedWeapon; +defaultproperties +{ + lenseMaterialID=3 + scopePortalFOVHigh=10.000000 + scopePortalFOV=10.000000 + ZoomMatRef="ScrnWeaponPack_T.SVD.PSO1ScopeFinalBlend" + ScriptedTextureFallbackRef="ScrnWeaponPack_T.SVD.AlphaLens" + CrosshairTexRef="ScrnWeaponPack_T.SVD.PSO1Scope" + reloadPreEndFrame=0.140000 + reloadEndFrame=0.610000 + reloadChargeEndFrame=0.920000 + reloadMagStartFrame=0.354000 + reloadChargeStartFrame=0.610000 + MagazineBone="clip" + bHasScope=True + ZoomedDisplayFOVHigh=55.000000 + MagCapacity=5 + ReloadRate=3.500000 + ReloadAnim="Reload" + ReloadAnimRate=0.800000 + WeaponReloadAnim="Reload_M14" + Weight=7.000000 + bHasAimingMode=True + IdleAimAnim="Iron_Idle" + StandardDisplayFOV=65.000000 + TraderInfoTexture=Texture'ScrnWeaponPack_T.SVDS.SVD-cTrader' + MeshRef="ScrnWeaponPack_A.SVDS_mesh" + SkinRefs(0)="ScrnWeaponPack_T.SVDS.Svd_D_Sh" + SkinRefs(1)="KF_Weapons2_Trip_T.hands.BritishPara_Hands_1st_P" + SkinRefs(2)="KF_Weapons_Trip_T.Rifles.CBLens_cmb" + SkinRefs(3)="ScrnWeaponPack_T.SVD.AlphaLens" + SelectSoundRef="ScrnWeaponPack_SND.SVD.SVD_select" + HudImageRef="ScrnWeaponPack_T.SVDS.SVD-cUnselected" + SelectedHudImageRef="ScrnWeaponPack_T.SVDS.SVD-cSelected" + PlayerIronSightFOV=32.000000 + ZoomedDisplayFOV=50.000000 + FireModeClass(0)=Class'NicePack.NiceSVDSFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.650000 + CurrentRating=0.650000 + Description="The Dragunov sniper rifle with folding stock (formally Russian: Snayperskaya Vintovka Dragunova Skladnaya, SVDS) is a compact variant of the SVD, which was developed in the early 1990s. It features a tubular metal stock that folds to the right side of the receiver and a synthetic pistol grip." + DisplayFOV=65.000000 + Priority=150 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=4 + GroupOffset=3 + PickupClass=Class'NicePack.NiceSVDSPickup' + PlayerViewOffset=(X=7.000000,Y=9.000000,Z=-4.000000) + BobDamping=5.000000 + AttachmentClass=Class'NicePack.NiceSVDSAttachment' + IconCoords=(X1=253,Y1=146,X2=333,Y2=181) + ItemName="SVDS" +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAmmo.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAmmo.uc index ce13c9b..e7d6239 100644 --- a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAmmo.uc +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAmmo.uc @@ -1,4 +1,12 @@ -class NiceSVDSAmmo extends NiceAmmo; -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceSVDSPickup' AmmoPickupAmount=5 MaxAmmo=60 InitialAmount=15 PickupClass=Class'NicePack.NiceSVDSAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) ItemName="7.62x54mm" -} +class NiceSVDSAmmo extends NiceAmmo; +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceSVDSPickup' + AmmoPickupAmount=5 + MaxAmmo=60 + InitialAmount=15 + PickupClass=Class'NicePack.NiceSVDSAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=336,Y1=82,X2=382,Y2=125) + ItemName="7.62x54mm" +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAmmoPickup.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAmmoPickup.uc index 3895489..42a7780 100644 --- a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAmmoPickup.uc +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAmmoPickup.uc @@ -1,4 +1,8 @@ -class NiceSVDSAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=5 InventoryType=Class'NicePack.NiceSVDSAmmo' PickupMessage="7x62mm" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' -} +class NiceSVDSAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=5 + InventoryType=Class'NicePack.NiceSVDSAmmo' + PickupMessage="7x62mm" + StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAttachment.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAttachment.uc index a5e4364..1e9fef3 100644 --- a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAttachment.uc +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSAttachment.uc @@ -1,4 +1,56 @@ -class NiceSVDSAttachment extends NiceAttachment; -defaultproperties -{ mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="wpn_scope" MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="IS_Fire_AK47" FireAltAnims(1)="IS_Fire_AK47" FireAltAnims(2)="IS_Fire_AK47" FireAltAnims(3)="IS_Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="ScrnWeaponPack_A.SVDS_3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 -} +class NiceSVDSAttachment extends NiceAttachment; +defaultproperties +{ + mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdMP' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + ShellEjectBoneName="wpn_scope" + MovementAnims(0)="JogF_AK47" + MovementAnims(1)="JogB_AK47" + MovementAnims(2)="JogL_AK47" + MovementAnims(3)="JogR_AK47" + TurnLeftAnim="TurnL_AK47" + TurnRightAnim="TurnR_AK47" + CrouchAnims(0)="CHWalkF_AK47" + CrouchAnims(1)="CHWalkB_AK47" + CrouchAnims(2)="CHWalkL_AK47" + CrouchAnims(3)="CHWalkR_AK47" + WalkAnims(0)="WalkF_AK47" + WalkAnims(1)="WalkB_AK47" + WalkAnims(2)="WalkL_AK47" + WalkAnims(3)="WalkR_AK47" + CrouchTurnRightAnim="CH_TurnR_AK47" + CrouchTurnLeftAnim="CH_TurnL_AK47" + IdleCrouchAnim="CHIdle_AK47" + IdleWeaponAnim="Idle_AK47" + IdleRestAnim="Idle_AK47" + IdleChatAnim="Idle_AK47" + IdleHeavyAnim="Idle_AK47" + IdleRifleAnim="Idle_AK47" + FireAnims(0)="Fire_AK47" + FireAnims(1)="Fire_AK47" + FireAnims(2)="Fire_AK47" + FireAnims(3)="Fire_AK47" + FireAltAnims(0)="IS_Fire_AK47" + FireAltAnims(1)="IS_Fire_AK47" + FireAltAnims(2)="IS_Fire_AK47" + FireAltAnims(3)="IS_Fire_AK47" + FireCrouchAnims(0)="CHFire_AK47" + FireCrouchAnims(1)="CHFire_AK47" + FireCrouchAnims(2)="CHFire_AK47" + FireCrouchAnims(3)="CHFire_AK47" + FireCrouchAltAnims(0)="CHFire_AK47" + FireCrouchAltAnims(1)="CHFire_AK47" + FireCrouchAltAnims(2)="CHFire_AK47" + FireCrouchAltAnims(3)="CHFire_AK47" + HitAnims(0)="HitF_AK47" + HitAnims(1)="HitB_AK47" + HitAnims(2)="HitL_AK47" + HitAnims(3)="HitR_AK47" + PostFireBlendStandAnim="Blend_AK47" + PostFireBlendCrouchAnim="CHBlend_AK47" + MeshRef="ScrnWeaponPack_A.SVDS_3rd" + bHeavy=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSFire.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSFire.uc index 4935121..cfaf80e 100644 --- a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSFire.uc +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSFire.uc @@ -1,4 +1,32 @@ -class NiceSVDSFire extends NiceFire; -defaultproperties -{ FireAimedAnim="Fire" RecoilRate=0.200000 maxVerticalRecoilAngle=500 maxHorizontalRecoilAngle=15 ShellEjectClass=Class'ScrnWeaponPack.KFShellEjectSVD' ShellEjectBoneName="Shell_eject" FireSoundRef="ScrnWeaponPack_SND.SVD.SVD_shot" StereoFireSoundRef="ScrnWeaponPack_SND.SVD.SVD_shot" NoAmmoSoundRef="ScrnWeaponPack_SND.SVD.SVD_empty" DamageType=Class'NicePack.NiceDamTypeSVDS' DamageMin=125 DamageMax=125 bWaitForRelease=True bModeExclusive=False TransientSoundVolume=3.800000 FireLoopAnim="Fire" FireForce="ShockRifleFire" FireRate=0.750000 AmmoClass=Class'NicePack.NiceSVDSAmmo' ShakeRotMag=(X=100.000000,Y=100.000000,Z=500.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=2.000000 ShakeOffsetMag=(X=10.000000,Y=3.000000,Z=12.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=2.000000 BotRefireRate=0.550000 FlashEmitterClass=Class'ScrnWeaponPack.MuzzleFlash1rdSVD' aimerror=0.000000 -} +class NiceSVDSFire extends NiceFire; +defaultproperties +{ + FireAimedAnim="Fire" + RecoilRate=0.200000 + maxVerticalRecoilAngle=500 + maxHorizontalRecoilAngle=15 + ShellEjectClass=Class'ScrnWeaponPack.KFShellEjectSVD' + ShellEjectBoneName="Shell_eject" + FireSoundRef="ScrnWeaponPack_SND.SVD.SVD_shot" + StereoFireSoundRef="ScrnWeaponPack_SND.SVD.SVD_shot" + NoAmmoSoundRef="ScrnWeaponPack_SND.SVD.SVD_empty" + DamageType=Class'NicePack.NiceDamTypeSVDS' + DamageMin=125 + DamageMax=125 + bWaitForRelease=True + bModeExclusive=False + TransientSoundVolume=3.800000 + FireLoopAnim="Fire" + FireForce="ShockRifleFire" + FireRate=0.750000 + AmmoClass=Class'NicePack.NiceSVDSAmmo' + ShakeRotMag=(X=100.000000,Y=100.000000,Z=500.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeRotTime=2.000000 + ShakeOffsetMag=(X=10.000000,Y=3.000000,Z=12.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=2.000000 + BotRefireRate=0.550000 + FlashEmitterClass=Class'ScrnWeaponPack.MuzzleFlash1rdSVD' + aimerror=0.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSPickup.uc b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSPickup.uc index 047faab..225dd04 100644 --- a/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSPickup.uc +++ b/sources/Weapons/Playable/SniperWeapons/SVD/NiceSVDSPickup.uc @@ -1,6 +1,25 @@ -class NiceSVDSPickup extends NiceWeaponPickup; -#exec OBJ LOAD FILE=ScrnWeaponPack_T.utx -#exec OBJ LOAD FILE=ScrnWeaponPack_A.ukx -defaultproperties -{ Weight=7.000000 cost=1500 AmmoCost=10 BuyClipSize=5 PowerValue=80 SpeedValue=40 RangeValue=100 Description="The Dragunov sniper rifle with folding stock (formally Russian: Snayperskaya Vintovka Dragunova Skladnaya, SVDS) is a compact variant of the SVD, which was developed in the early 1990s. It features a tubular metal stock that folds to the right side of the receiver and a synthetic pistol grip." ItemName="SVDS" ItemShortName="SVDS" AmmoItemName="7.64x54mm" CorrespondingPerkIndex=2 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceSVDS' PickupMessage="You've got the Dragunov Sniper Rifle (SVDS)" PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.svd_c' CollisionRadius=30.000000 CollisionHeight=5.000000 -} +class NiceSVDSPickup extends NiceWeaponPickup; +#exec OBJ LOAD FILE=ScrnWeaponPack_T.utx +#exec OBJ LOAD FILE=ScrnWeaponPack_A.ukx +defaultproperties +{ + Weight=7.000000 + cost=1500 + AmmoCost=10 + BuyClipSize=5 + PowerValue=80 + SpeedValue=40 + RangeValue=100 + Description="The Dragunov sniper rifle with folding stock (formally Russian: Snayperskaya Vintovka Dragunova Skladnaya, SVDS) is a compact variant of the SVD, which was developed in the early 1990s. It features a tubular metal stock that folds to the right side of the receiver and a synthetic pistol grip." + ItemName="SVDS" + ItemShortName="SVDS" + AmmoItemName="7.64x54mm" + CorrespondingPerkIndex=2 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceSVDS' + PickupMessage="You've got the Dragunov Sniper Rifle (SVDS)" + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'ScrnWeaponPack_SM.svd_c' + CollisionRadius=30.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceDamTypeVSSDT.uc b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceDamTypeVSSDT.uc index feb4e0f..b9481e3 100644 --- a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceDamTypeVSSDT.uc +++ b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceDamTypeVSSDT.uc @@ -1,4 +1,19 @@ -class NiceDamTypeVSSDT extends NiceDamageTypeVetSharpshooter; -defaultproperties -{ stunMultiplier=0.500000 HeadShotDamageMult=1.490000 bSniperWeapon=True WeaponClass=Class'NicePack.NiceVSSDT' DeathString="%k killed %o (Vintorez)." bRagdollBullet=True bBulletHit=True PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' FlashFog=(X=600.000000) KDamageImpulse=3000.000000 KDeathVel=110.000000 KDeathUpKick=10.000000 VehicleDamageScaling=0.700000 -} +class NiceDamTypeVSSDT extends NiceDamageTypeVetSharpshooter; +defaultproperties +{ + stunMultiplier=0.500000 + HeadShotDamageMult=1.490000 + bSniperWeapon=True + WeaponClass=Class'NicePack.NiceVSSDT' + DeathString="%k killed %o (Vintorez)." + bRagdollBullet=True + bBulletHit=True + PawnDamageEmitter=Class'ROEffects.ROBloodPuff' + LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' + LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' + FlashFog=(X=600.000000) + KDamageImpulse=3000.000000 + KDeathVel=110.000000 + KDeathUpKick=10.000000 + VehicleDamageScaling=0.700000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDT.uc b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDT.uc index 80c8b75..6081edc 100644 --- a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDT.uc +++ b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDT.uc @@ -1,6 +1,62 @@ -class NiceVSSDT extends NiceScopedWeapon; -simulated function AltFire(float F){} -exec function SwitchModes(){} -defaultproperties -{ lenseMaterialID=2 scopePortalFOVHigh=30.000000 scopePortalFOV=30.000000 ZoomMatRef="ScrnWeaponPack_T.VSS.PSO1ScopeFinalBlend" ScriptedTextureFallbackRef="ScrnWeaponPack_T.SVD.AlphaLens" CrosshairTexRef="ScrnWeaponPack_T.VSS.PSO1Sope" reloadPreEndFrame=0.120000 reloadEndFrame=0.490000 reloadChargeEndFrame=0.764000 reloadMagStartFrame=0.302000 reloadChargeStartFrame=0.613000 MagazineBone="clip" bHasScope=True ZoomedDisplayFOVHigh=55.000000 MagCapacity=10 ReloadRate=3.000000 ReloadAnim="Reload" ReloadAnimRate=1.000000 WeaponReloadAnim="Reload_AK47" Weight=7.000000 bHasAimingMode=True IdleAimAnim="Iron_Idle" StandardDisplayFOV=65.000000 SleeveNum=0 TraderInfoTexture=Texture'ScrnWeaponPack_T.VSS.VSSDT_Trader' MeshRef="ScrnWeaponPack_A.vintorezDTmesh" SkinRefs(0)="KF_Weapons2_Trip_T.hands.BritishPara_Hands_1st_P" SkinRefs(1)="KF_Weapons_Trip_T.Rifles.CBLens_cmb" SkinRefs(2)="ScrnWeaponPack_T.SVD.AlphaLens" SkinRefs(3)="ScrnWeaponPack_T.VSS.newvss" SkinRefs(4)="ScrnWeaponPack_T.VSS.mag_9x39_cmb" SkinRefs(5)="ScrnWeaponPack_T.VSS.Scope" SelectSoundRef="ScrnWeaponPack_SND.VSS.VSS_Draw" HudImageRef="ScrnWeaponPack_T.VSS.vssDT_Unselected" SelectedHudImageRef="ScrnWeaponPack_T.VSS.vssDT_selected" PlayerIronSightFOV=32.000000 ZoomedDisplayFOV=55.000000 FireModeClass(0)=Class'NicePack.NiceVSSDTFire' FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" SelectForce="SwitchToAssaultRifle" AIRating=0.650000 CurrentRating=0.650000 Description="The VSS (Special Sniper Rifle), also called the Vintorez (thread cutter), is a suppressed sniper rifle that is extremely suitable for quick dispatching of an enemy." DisplayFOV=65.000000 Priority=160 CustomCrosshair=11 CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" InventoryGroup=3 GroupOffset=3 PickupClass=Class'NicePack.NiceVSSDTPickup' PlayerViewOffset=(X=12.000000,Y=12.000000,Z=-3.000000) BobDamping=6.000000 AttachmentClass=Class'NicePack.NiceVSSDTAttachment' IconCoords=(X1=253,Y1=146,X2=333,Y2=181) ItemName="VSS (Vintorez)" -} +class NiceVSSDT extends NiceScopedWeapon; +simulated function AltFire(float F){} +exec function SwitchModes(){} +defaultproperties +{ + lenseMaterialID=2 + scopePortalFOVHigh=30.000000 + scopePortalFOV=30.000000 + ZoomMatRef="ScrnWeaponPack_T.VSS.PSO1ScopeFinalBlend" + ScriptedTextureFallbackRef="ScrnWeaponPack_T.SVD.AlphaLens" + CrosshairTexRef="ScrnWeaponPack_T.VSS.PSO1Sope" + reloadPreEndFrame=0.120000 + reloadEndFrame=0.490000 + reloadChargeEndFrame=0.764000 + reloadMagStartFrame=0.302000 + reloadChargeStartFrame=0.613000 + MagazineBone="clip" + bHasScope=True + ZoomedDisplayFOVHigh=55.000000 + MagCapacity=10 + ReloadRate=3.000000 + ReloadAnim="Reload" + ReloadAnimRate=1.000000 + WeaponReloadAnim="Reload_AK47" + Weight=7.000000 + bHasAimingMode=True + IdleAimAnim="Iron_Idle" + StandardDisplayFOV=65.000000 + SleeveNum=0 + TraderInfoTexture=Texture'ScrnWeaponPack_T.VSS.VSSDT_Trader' + MeshRef="ScrnWeaponPack_A.vintorezDTmesh" + SkinRefs(0)="KF_Weapons2_Trip_T.hands.BritishPara_Hands_1st_P" + SkinRefs(1)="KF_Weapons_Trip_T.Rifles.CBLens_cmb" + SkinRefs(2)="ScrnWeaponPack_T.SVD.AlphaLens" + SkinRefs(3)="ScrnWeaponPack_T.VSS.newvss" + SkinRefs(4)="ScrnWeaponPack_T.VSS.mag_9x39_cmb" + SkinRefs(5)="ScrnWeaponPack_T.VSS.Scope" + SelectSoundRef="ScrnWeaponPack_SND.VSS.VSS_Draw" + HudImageRef="ScrnWeaponPack_T.VSS.vssDT_Unselected" + SelectedHudImageRef="ScrnWeaponPack_T.VSS.vssDT_selected" + PlayerIronSightFOV=32.000000 + ZoomedDisplayFOV=55.000000 + FireModeClass(0)=Class'NicePack.NiceVSSDTFire' + FireModeClass(1)=Class'KFMod.NoFire' + PutDownAnim="PutDown" + SelectForce="SwitchToAssaultRifle" + AIRating=0.650000 + CurrentRating=0.650000 + Description="The VSS (Special Sniper Rifle), also called the Vintorez (thread cutter), is a suppressed sniper rifle that is extremely suitable for quick dispatching of an enemy." + DisplayFOV=65.000000 + Priority=160 + CustomCrosshair=11 + CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5" + InventoryGroup=3 + GroupOffset=3 + PickupClass=Class'NicePack.NiceVSSDTPickup' + PlayerViewOffset=(X=12.000000,Y=12.000000,Z=-3.000000) + BobDamping=6.000000 + AttachmentClass=Class'NicePack.NiceVSSDTAttachment' + IconCoords=(X1=253,Y1=146,X2=333,Y2=181) + ItemName="VSS (Vintorez)" +} diff --git a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAmmo.uc b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAmmo.uc index 4bb705b..c37f598 100644 --- a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAmmo.uc +++ b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAmmo.uc @@ -1,5 +1,13 @@ -class NiceVSSDTAmmo extends NiceAmmo; -#EXEC OBJ LOAD FILE=InterfaceContent.utx -defaultproperties -{ WeaponPickupClass=Class'NicePack.NiceVSSDTPickup' AmmoPickupAmount=10 MaxAmmo=80 InitialAmount=20 PickupClass=Class'NicePack.NiceVSSDTAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=338,Y1=40,X2=393,Y2=79) ItemName="9x39mm round SP-5" -} +class NiceVSSDTAmmo extends NiceAmmo; +#EXEC OBJ LOAD FILE=InterfaceContent.utx +defaultproperties +{ + WeaponPickupClass=Class'NicePack.NiceVSSDTPickup' + AmmoPickupAmount=10 + MaxAmmo=80 + InitialAmount=20 + PickupClass=Class'NicePack.NiceVSSDTAmmoPickup' + IconMaterial=Texture'KillingFloorHUD.Generic.HUD' + IconCoords=(X1=338,Y1=40,X2=393,Y2=79) + ItemName="9x39mm round SP-5" +} diff --git a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAmmoPickup.uc b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAmmoPickup.uc index 13acf10..17869b6 100644 --- a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAmmoPickup.uc +++ b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAmmoPickup.uc @@ -1,4 +1,7 @@ -class NiceVSSDTAmmoPickup extends NiceAmmoPickup; -defaultproperties -{ AmmoAmount=10 InventoryType=Class'NicePack.NiceVSSDTAmmo' PickupMessage="9x39mm round SP-5" -} +class NiceVSSDTAmmoPickup extends NiceAmmoPickup; +defaultproperties +{ + AmmoAmount=10 + InventoryType=Class'NicePack.NiceVSSDTAmmo' + PickupMessage="9x39mm round SP-5" +} diff --git a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAttachment.uc b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAttachment.uc index 65175d3..bc2931c 100644 --- a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAttachment.uc +++ b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTAttachment.uc @@ -1,4 +1,58 @@ -class NiceVSSDTAttachment extends NiceAttachment; -defaultproperties -{ bSpawnLight=False mMuzFlashClass=Class'ScrnWeaponPack.MuzzleFlash3rdVSSDT' mTracerClass=Class'KFMod.KFNewTracer' mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' ShellEjectBoneName="Shell_eject" MovementAnims(0)="JogF_AK47" MovementAnims(1)="JogB_AK47" MovementAnims(2)="JogL_AK47" MovementAnims(3)="JogR_AK47" TurnLeftAnim="TurnL_AK47" TurnRightAnim="TurnR_AK47" CrouchAnims(0)="CHWalkF_AK47" CrouchAnims(1)="CHWalkB_AK47" CrouchAnims(2)="CHWalkL_AK47" CrouchAnims(3)="CHWalkR_AK47" WalkAnims(0)="WalkF_AK47" WalkAnims(1)="WalkB_AK47" WalkAnims(2)="WalkL_AK47" WalkAnims(3)="WalkR_AK47" CrouchTurnRightAnim="CH_TurnR_AK47" CrouchTurnLeftAnim="CH_TurnL_AK47" IdleCrouchAnim="CHIdle_AK47" IdleWeaponAnim="Idle_AK47" IdleRestAnim="Idle_AK47" IdleChatAnim="Idle_AK47" IdleHeavyAnim="Idle_AK47" IdleRifleAnim="Idle_AK47" FireAnims(0)="Fire_AK47" FireAnims(1)="Fire_AK47" FireAnims(2)="Fire_AK47" FireAnims(3)="Fire_AK47" FireAltAnims(0)="IS_Fire_AK47" FireAltAnims(1)="IS_Fire_AK47" FireAltAnims(2)="IS_Fire_AK47" FireAltAnims(3)="IS_Fire_AK47" FireCrouchAnims(0)="CHFire_AK47" FireCrouchAnims(1)="CHFire_AK47" FireCrouchAnims(2)="CHFire_AK47" FireCrouchAnims(3)="CHFire_AK47" FireCrouchAltAnims(0)="CHFire_AK47" FireCrouchAltAnims(1)="CHFire_AK47" FireCrouchAltAnims(2)="CHFire_AK47" FireCrouchAltAnims(3)="CHFire_AK47" HitAnims(0)="HitF_AK47" HitAnims(1)="HitB_AK47" HitAnims(2)="HitL_AK47" HitAnims(3)="HitR_AK47" PostFireBlendStandAnim="Blend_AK47" PostFireBlendCrouchAnim="CHBlend_AK47" MeshRef="ScrnWeaponPack_A.vintorezDT3rd" bHeavy=True SplashEffect=Class'ROEffects.BulletSplashEmitter' CullDistance=5000.000000 DrawScale=0.550000 -} +class NiceVSSDTAttachment extends NiceAttachment; +defaultproperties +{ + bSpawnLight=False + mMuzFlashClass=Class'ScrnWeaponPack.MuzzleFlash3rdVSSDT' + mTracerClass=Class'KFMod.KFNewTracer' + mShellCaseEmitterClass=Class'KFMod.KFShellSpewer' + ShellEjectBoneName="Shell_eject" + MovementAnims(0)="JogF_AK47" + MovementAnims(1)="JogB_AK47" + MovementAnims(2)="JogL_AK47" + MovementAnims(3)="JogR_AK47" + TurnLeftAnim="TurnL_AK47" + TurnRightAnim="TurnR_AK47" + CrouchAnims(0)="CHWalkF_AK47" + CrouchAnims(1)="CHWalkB_AK47" + CrouchAnims(2)="CHWalkL_AK47" + CrouchAnims(3)="CHWalkR_AK47" + WalkAnims(0)="WalkF_AK47" + WalkAnims(1)="WalkB_AK47" + WalkAnims(2)="WalkL_AK47" + WalkAnims(3)="WalkR_AK47" + CrouchTurnRightAnim="CH_TurnR_AK47" + CrouchTurnLeftAnim="CH_TurnL_AK47" + IdleCrouchAnim="CHIdle_AK47" + IdleWeaponAnim="Idle_AK47" + IdleRestAnim="Idle_AK47" + IdleChatAnim="Idle_AK47" + IdleHeavyAnim="Idle_AK47" + IdleRifleAnim="Idle_AK47" + FireAnims(0)="Fire_AK47" + FireAnims(1)="Fire_AK47" + FireAnims(2)="Fire_AK47" + FireAnims(3)="Fire_AK47" + FireAltAnims(0)="IS_Fire_AK47" + FireAltAnims(1)="IS_Fire_AK47" + FireAltAnims(2)="IS_Fire_AK47" + FireAltAnims(3)="IS_Fire_AK47" + FireCrouchAnims(0)="CHFire_AK47" + FireCrouchAnims(1)="CHFire_AK47" + FireCrouchAnims(2)="CHFire_AK47" + FireCrouchAnims(3)="CHFire_AK47" + FireCrouchAltAnims(0)="CHFire_AK47" + FireCrouchAltAnims(1)="CHFire_AK47" + FireCrouchAltAnims(2)="CHFire_AK47" + FireCrouchAltAnims(3)="CHFire_AK47" + HitAnims(0)="HitF_AK47" + HitAnims(1)="HitB_AK47" + HitAnims(2)="HitL_AK47" + HitAnims(3)="HitR_AK47" + PostFireBlendStandAnim="Blend_AK47" + PostFireBlendCrouchAnim="CHBlend_AK47" + MeshRef="ScrnWeaponPack_A.vintorezDT3rd" + bHeavy=True + SplashEffect=Class'ROEffects.BulletSplashEmitter' + CullDistance=5000.000000 + DrawScale=0.550000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTFire.uc b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTFire.uc index 344c47d..0ebdeef 100644 --- a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTFire.uc +++ b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTFire.uc @@ -1,4 +1,33 @@ -class NiceVSSDTFire extends NiceFire; -defaultproperties -{ ProjectileSpeed=46250.000000 FireAimedAnim="Iron_Idle" RecoilRate=0.100000 maxVerticalRecoilAngle=75 maxHorizontalRecoilAngle=25 ShellEjectClass=Class'ROEffects.KFShellEjectMac' ShellEjectBoneName="Shell_eject" FireSoundRef="ScrnWeaponPack_SND.VSS.VSS_Fire" StereoFireSoundRef="ScrnWeaponPack_SND.VSS.VSS_Fire" NoAmmoSoundRef="KF_RifleSnd.Rifle_DryFire" DamageType=Class'NicePack.NiceDamTypeVSSDT' DamageMin=255 DamageMax=255 bWaitForRelease=True bModeExclusive=False TransientSoundVolume=2.800000 FireLoopAnim= FireForce="ShockRifleFire" FireRate=0.150000 AmmoClass=Class'NicePack.NiceVSSDTAmmo' ShakeRotMag=(X=100.000000,Y=100.000000,Z=500.000000) ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) ShakeRotTime=2.000000 ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetTime=2.000000 BotRefireRate=0.650000 FlashEmitterClass=Class'ScrnWeaponPack.MuzzleFlash3rdVSSDT' aimerror=1.000000 -} +class NiceVSSDTFire extends NiceFire; +defaultproperties +{ + ProjectileSpeed=46250.000000 + FireAimedAnim="Iron_Idle" + RecoilRate=0.100000 + maxVerticalRecoilAngle=75 + maxHorizontalRecoilAngle=25 + ShellEjectClass=Class'ROEffects.KFShellEjectMac' + ShellEjectBoneName="Shell_eject" + FireSoundRef="ScrnWeaponPack_SND.VSS.VSS_Fire" + StereoFireSoundRef="ScrnWeaponPack_SND.VSS.VSS_Fire" + NoAmmoSoundRef="KF_RifleSnd.Rifle_DryFire" + DamageType=Class'NicePack.NiceDamTypeVSSDT' + DamageMin=255 + DamageMax=255 + bWaitForRelease=True + bModeExclusive=False + TransientSoundVolume=2.800000 + FireLoopAnim= + FireForce="ShockRifleFire" + FireRate=0.150000 + AmmoClass=Class'NicePack.NiceVSSDTAmmo' + ShakeRotMag=(X=100.000000,Y=100.000000,Z=500.000000) + ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000) + ShakeRotTime=2.000000 + ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.000000) + ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) + ShakeOffsetTime=2.000000 + BotRefireRate=0.650000 + FlashEmitterClass=Class'ScrnWeaponPack.MuzzleFlash3rdVSSDT' + aimerror=1.000000 +} diff --git a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTPickup.uc b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTPickup.uc index 11130aa..927a1b0 100644 --- a/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTPickup.uc +++ b/sources/Weapons/Playable/SniperWeapons/VSSD/NiceVSSDTPickup.uc @@ -1,4 +1,25 @@ -class NiceVSSDTPickup extends NiceWeaponPickup; -defaultproperties -{ Weight=7.000000 cost=1000 AmmoCost=15 BuyClipSize=10 PowerValue=80 SpeedValue=40 RangeValue=100 Description="The VSS (Special Sniper Rifle), also called the Vintorez (thread cutter), is a suppressed sniper rifle that is extremely suitable for quick dispatching of an enemy." ItemName="VSS (Vintorez)" ItemShortName="VSS" AmmoItemName="Rifle bullets" CorrespondingPerkIndex=2 EquipmentCategoryID=2 InventoryType=Class'NicePack.NiceVSSDT' PickupMessage="You've got Vintorez" PickupSound=Sound'KF_RifleSnd.RifleBase.Rifle_Pickup' PickupForce="AssaultRiflePickup" StaticMesh=StaticMesh'ScrnWeaponPack_SM.vintorezDT_sm' DrawScale=1.200000 CollisionRadius=30.000000 CollisionHeight=5.000000 -} +class NiceVSSDTPickup extends NiceWeaponPickup; +defaultproperties +{ + Weight=7.000000 + cost=1000 + AmmoCost=15 + BuyClipSize=10 + PowerValue=80 + SpeedValue=40 + RangeValue=100 + Description="The VSS (Special Sniper Rifle), also called the Vintorez (thread cutter), is a suppressed sniper rifle that is extremely suitable for quick dispatching of an enemy." + ItemName="VSS (Vintorez)" + ItemShortName="VSS" + AmmoItemName="Rifle bullets" + CorrespondingPerkIndex=2 + EquipmentCategoryID=2 + InventoryType=Class'NicePack.NiceVSSDT' + PickupMessage="You've got Vintorez" + PickupSound=Sound'KF_RifleSnd.RifleBase.Rifle_Pickup' + PickupForce="AssaultRiflePickup" + StaticMesh=StaticMesh'ScrnWeaponPack_SM.vintorezDT_sm' + DrawScale=1.200000 + CollisionRadius=30.000000 + CollisionHeight=5.000000 +} diff --git a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrower.uc b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrower.uc index 44f193b..5b8b954 100644 --- a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrower.uc +++ b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrower.uc @@ -1,4 +1,9 @@ -class NiceBlowerThrower extends BlowerThrower; -defaultproperties -{ AppID=0 FireModeClass(0)=Class'NicePack.NiceBlowerThrowerFire' FireModeClass(1)=Class'NicePack.NiceBlowerThrowerAltFire' PickupClass=Class'NicePack.NiceBlowerThrowerPickup' ItemName="BlowerThrower NW" -} +class NiceBlowerThrower extends BlowerThrower; +defaultproperties +{ + AppID=0 + FireModeClass(0)=Class'NicePack.NiceBlowerThrowerFire' + FireModeClass(1)=Class'NicePack.NiceBlowerThrowerAltFire' + PickupClass=Class'NicePack.NiceBlowerThrowerPickup' + ItemName="BlowerThrower NW" +} diff --git a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAltFire.uc b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAltFire.uc index ddf05eb..120dea9 100644 --- a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAltFire.uc +++ b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAltFire.uc @@ -1,4 +1,5 @@ -class NiceBlowerThrowerAltFire extends BlowerThrowerAltFire; -defaultproperties -{ AmmoClass=Class'NicePack.NiceBlowerThrowerAmmo' -} +class NiceBlowerThrowerAltFire extends BlowerThrowerAltFire; +defaultproperties +{ + AmmoClass=Class'NicePack.NiceBlowerThrowerAmmo' +} diff --git a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAmmo.uc b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAmmo.uc index 8195e7a..9d42c27 100644 --- a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAmmo.uc +++ b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAmmo.uc @@ -1,5 +1,7 @@ -class NiceBlowerThrowerAmmo extends BlowerThrowerAmmo; -#EXEC OBJ LOAD FILE=KillingFloorHUD.utx -defaultproperties -{ MaxAmmo=400 PickupClass=Class'NicePack.NiceBlowerThrowerAmmoPickup' -} +class NiceBlowerThrowerAmmo extends BlowerThrowerAmmo; +#EXEC OBJ LOAD FILE=KillingFloorHUD.utx +defaultproperties +{ + MaxAmmo=400 + PickupClass=Class'NicePack.NiceBlowerThrowerAmmoPickup' +} diff --git a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAmmoPickup.uc b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAmmoPickup.uc index 3d56059..e0b31a5 100644 --- a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAmmoPickup.uc +++ b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerAmmoPickup.uc @@ -1,4 +1,5 @@ -class NiceBlowerThrowerAmmoPickup extends BlowerThrowerAmmoPickup; -defaultproperties -{ InventoryType=Class'NicePack.NiceBlowerThrowerAmmo' -} +class NiceBlowerThrowerAmmoPickup extends BlowerThrowerAmmoPickup; +defaultproperties +{ + InventoryType=Class'NicePack.NiceBlowerThrowerAmmo' +} diff --git a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerFire.uc b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerFire.uc index 5d7c314..b9ca32e 100644 --- a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerFire.uc +++ b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerFire.uc @@ -1,4 +1,5 @@ -class NiceBlowerThrowerFire extends BlowerThrowerFire; -defaultproperties -{ AmmoClass=Class'NicePack.NiceBlowerThrowerAmmo' -} +class NiceBlowerThrowerFire extends BlowerThrowerFire; +defaultproperties +{ + AmmoClass=Class'NicePack.NiceBlowerThrowerAmmo' +} diff --git a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerPickup.uc b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerPickup.uc index fd7c21c..66e0296 100644 --- a/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerPickup.uc +++ b/sources/Weapons/Playable/Special/Blower/NiceBlowerThrowerPickup.uc @@ -1,4 +1,8 @@ -class NiceBlowerThrowerPickup extends BlowerThrowerPickup; -defaultproperties -{ ItemName="Blower Thrower Bile Launcher NW" ItemShortName="Blower Thrower NW" InventoryType=Class'NicePack.NiceBlowerThrower' PickupMessage="You got the BlowerThrower NW" -} +class NiceBlowerThrowerPickup extends BlowerThrowerPickup; +defaultproperties +{ + ItemName="Blower Thrower Bile Launcher NW" + ItemShortName="Blower Thrower NW" + InventoryType=Class'NicePack.NiceBlowerThrower' + PickupMessage="You got the BlowerThrower NW" +} diff --git a/sources/Weapons/Playable/TestWeapons/NiceFlame9mm.uc b/sources/Weapons/Playable/TestWeapons/NiceFlame9mm.uc index 9620338..5256278 100644 --- a/sources/Weapons/Playable/TestWeapons/NiceFlame9mm.uc +++ b/sources/Weapons/Playable/TestWeapons/NiceFlame9mm.uc @@ -1,4 +1,7 @@ -class NiceFlame9mm extends ScrnSingle; -defaultproperties -{ FireModeClass(0)=Class'NicePack.NiceFlame9mmFire' PickupClass=Class'NicePack.NiceFlame9mmPickup' ItemName="MOTHER OF FLAMES" -} +class NiceFlame9mm extends ScrnSingle; +defaultproperties +{ + FireModeClass(0)=Class'NicePack.NiceFlame9mmFire' + PickupClass=Class'NicePack.NiceFlame9mmPickup' + ItemName="MOTHER OF FLAMES" +} diff --git a/sources/Weapons/Playable/TestWeapons/NiceFlame9mmFire.uc b/sources/Weapons/Playable/TestWeapons/NiceFlame9mmFire.uc index 5744e1a..b8f4c89 100644 --- a/sources/Weapons/Playable/TestWeapons/NiceFlame9mmFire.uc +++ b/sources/Weapons/Playable/TestWeapons/NiceFlame9mmFire.uc @@ -1,4 +1,5 @@ -class NiceFlame9mmFire extends ScrnSingleFire; -defaultproperties -{ DamageType=Class'NicePack.NiceDamTypeFire' -} +class NiceFlame9mmFire extends ScrnSingleFire; +defaultproperties +{ + DamageType=Class'NicePack.NiceDamTypeFire' +} diff --git a/sources/Weapons/Playable/TestWeapons/NiceFlame9mmPickup.uc b/sources/Weapons/Playable/TestWeapons/NiceFlame9mmPickup.uc index 7f58874..4204ec1 100644 --- a/sources/Weapons/Playable/TestWeapons/NiceFlame9mmPickup.uc +++ b/sources/Weapons/Playable/TestWeapons/NiceFlame9mmPickup.uc @@ -1,4 +1,7 @@ -class NiceFlame9mmPickup extends ScrnSinglePickup; -defaultproperties -{ ItemName="MOTHER OF FLAME AND FIRE AND RAGE" ItemShortName="HAIL FIRE GODDES" InventoryType=Class'NicePack.NiceFlame9mm' -} +class NiceFlame9mmPickup extends ScrnSinglePickup; +defaultproperties +{ + ItemName="MOTHER OF FLAME AND FIRE AND RAGE" + ItemShortName="HAIL FIRE GODDES" + InventoryType=Class'NicePack.NiceFlame9mm' +} diff --git a/sources/Weapons/Skins/SkinCamoSCARMK17AssaultRifle.uc b/sources/Weapons/Skins/SkinCamoSCARMK17AssaultRifle.uc index 61d6d35..d3c574e 100644 --- a/sources/Weapons/Skins/SkinCamoSCARMK17AssaultRifle.uc +++ b/sources/Weapons/Skins/SkinCamoSCARMK17AssaultRifle.uc @@ -1,4 +1,7 @@ -class SkinCamoSCARMK17AssaultRifle extends NiceSCARMK17AssaultRifle; -defaultproperties -{ SkinRefs(0)="NicePackT.Skins1st.Scar_cmb" PickupClass=Class'NicePack.SkinCamoSCARMK17Pickup' AttachmentClass=Class'NicePack.SkinCamoSCARMK17Attachment' -} +class SkinCamoSCARMK17AssaultRifle extends NiceSCARMK17AssaultRifle; +defaultproperties +{ + SkinRefs(0)="NicePackT.Skins1st.Scar_cmb" + PickupClass=Class'NicePack.SkinCamoSCARMK17Pickup' + AttachmentClass=Class'NicePack.SkinCamoSCARMK17Attachment' +} diff --git a/sources/Weapons/Skins/SkinCamoSCARMK17Attachment.uc b/sources/Weapons/Skins/SkinCamoSCARMK17Attachment.uc index 718785e..006c740 100644 --- a/sources/Weapons/Skins/SkinCamoSCARMK17Attachment.uc +++ b/sources/Weapons/Skins/SkinCamoSCARMK17Attachment.uc @@ -1,4 +1,5 @@ -class SkinCamoSCARMK17Attachment extends NiceSCARMK17Attachment; -defaultproperties -{ SkinRefs(0)="NicePackT.Skins3rd.scar_3rd" -} +class SkinCamoSCARMK17Attachment extends NiceSCARMK17Attachment; +defaultproperties +{ + SkinRefs(0)="NicePackT.Skins3rd.scar_3rd" +} diff --git a/sources/Weapons/Skins/SkinCamoSCARMK17Pickup.uc b/sources/Weapons/Skins/SkinCamoSCARMK17Pickup.uc index 2def995..0e1349c 100644 --- a/sources/Weapons/Skins/SkinCamoSCARMK17Pickup.uc +++ b/sources/Weapons/Skins/SkinCamoSCARMK17Pickup.uc @@ -1,4 +1,5 @@ -class SkinCamoSCARMK17Pickup extends NiceSCARMK17Pickup; -defaultproperties -{ InventoryType=Class'NicePack.SkinCamoSCARMK17AssaultRifle' -} +class SkinCamoSCARMK17Pickup extends NiceSCARMK17Pickup; +defaultproperties +{ + InventoryType=Class'NicePack.SkinCamoSCARMK17AssaultRifle' +} diff --git a/sources/Weapons/Skins/SkinCowboyMagnum.uc b/sources/Weapons/Skins/SkinCowboyMagnum.uc index 30cbd99..63f0162 100644 --- a/sources/Weapons/Skins/SkinCowboyMagnum.uc +++ b/sources/Weapons/Skins/SkinCowboyMagnum.uc @@ -1,5 +1,8 @@ -class SkinCowboyMagnum extends NiceMagnumPistol; -#exec obj load file="NicePackT.utx" -defaultproperties -{ SkinRefs(0)="NicePackT.Skins1st.Revolver_cmb" PickupClass=Class'NicePack.SkinCowboyMagnumPickup' AttachmentClass=Class'NicePack.SkinCowboyMagnumAttachment' -} +class SkinCowboyMagnum extends NiceMagnumPistol; +#exec obj load file="NicePackT.utx" +defaultproperties +{ + SkinRefs(0)="NicePackT.Skins1st.Revolver_cmb" + PickupClass=Class'NicePack.SkinCowboyMagnumPickup' + AttachmentClass=Class'NicePack.SkinCowboyMagnumAttachment' +} diff --git a/sources/Weapons/Skins/SkinCowboyMagnumAttachment.uc b/sources/Weapons/Skins/SkinCowboyMagnumAttachment.uc index 37890a4..241caa2 100644 --- a/sources/Weapons/Skins/SkinCowboyMagnumAttachment.uc +++ b/sources/Weapons/Skins/SkinCowboyMagnumAttachment.uc @@ -1,4 +1,5 @@ -class SkinCowboyMagnumAttachment extends NiceMagnumAttachment; -defaultproperties -{ SkinRefs(0)="NicePackT.Skins3rd.revolver_3rd" -} +class SkinCowboyMagnumAttachment extends NiceMagnumAttachment; +defaultproperties +{ + SkinRefs(0)="NicePackT.Skins3rd.revolver_3rd" +} diff --git a/sources/Weapons/Skins/SkinCowboyMagnumPickup.uc b/sources/Weapons/Skins/SkinCowboyMagnumPickup.uc index 0c0a515..388b835 100644 --- a/sources/Weapons/Skins/SkinCowboyMagnumPickup.uc +++ b/sources/Weapons/Skins/SkinCowboyMagnumPickup.uc @@ -1,4 +1,5 @@ -class SkinCowboyMagnumPickup extends NiceMagnumPickup; -defaultproperties -{ InventoryType=Class'NicePack.SkinCowboyMagnum' -} +class SkinCowboyMagnumPickup extends NiceMagnumPickup; +defaultproperties +{ + InventoryType=Class'NicePack.SkinCowboyMagnum' +} diff --git a/sources/Weapons/Skins/SkinDualCowboyMagnum.uc b/sources/Weapons/Skins/SkinDualCowboyMagnum.uc index 415d49a..3b811b2 100644 --- a/sources/Weapons/Skins/SkinDualCowboyMagnum.uc +++ b/sources/Weapons/Skins/SkinDualCowboyMagnum.uc @@ -1,5 +1,8 @@ -class SkinDualCowboyMagnum extends NiceDualMagnum; -#exec obj load file="NicePackT.utx" -defaultproperties -{ SkinRefs(0)="NicePackT.Skins1st.Revolver_cmb" PickupClass=Class'NicePack.SkinDualCowboyMagnumPickup' AttachmentClass=Class'NicePack.SkinDualCowboyMagnumAttachment' -} +class SkinDualCowboyMagnum extends NiceDualMagnum; +#exec obj load file="NicePackT.utx" +defaultproperties +{ + SkinRefs(0)="NicePackT.Skins1st.Revolver_cmb" + PickupClass=Class'NicePack.SkinDualCowboyMagnumPickup' + AttachmentClass=Class'NicePack.SkinDualCowboyMagnumAttachment' +} diff --git a/sources/Weapons/Skins/SkinDualCowboyMagnumAttachment.uc b/sources/Weapons/Skins/SkinDualCowboyMagnumAttachment.uc index acd6c38..ff053a9 100644 --- a/sources/Weapons/Skins/SkinDualCowboyMagnumAttachment.uc +++ b/sources/Weapons/Skins/SkinDualCowboyMagnumAttachment.uc @@ -1,4 +1,5 @@ -class SkinDualCowboyMagnumAttachment extends NiceDualMagnumAttachment; -defaultproperties -{ SkinRefs(0)="NicePackT.Skins3rd.revolver_3rd" -} +class SkinDualCowboyMagnumAttachment extends NiceDualMagnumAttachment; +defaultproperties +{ + SkinRefs(0)="NicePackT.Skins3rd.revolver_3rd" +} diff --git a/sources/Weapons/Skins/SkinDualCowboyMagnumPickup.uc b/sources/Weapons/Skins/SkinDualCowboyMagnumPickup.uc index 8e274f1..ea6994e 100644 --- a/sources/Weapons/Skins/SkinDualCowboyMagnumPickup.uc +++ b/sources/Weapons/Skins/SkinDualCowboyMagnumPickup.uc @@ -1,4 +1,5 @@ -class SkinDualCowboyMagnumPickup extends NiceDualMagnumPickup; -defaultproperties -{ InventoryType=Class'NicePack.SkinDualCowboyMagnum' -} +class SkinDualCowboyMagnumPickup extends NiceDualMagnumPickup; +defaultproperties +{ + InventoryType=Class'NicePack.SkinDualCowboyMagnum' +} diff --git a/sources/Weapons/Skins/SkinDualExecutioner.uc b/sources/Weapons/Skins/SkinDualExecutioner.uc index 2dd858b..b8bedc8 100644 --- a/sources/Weapons/Skins/SkinDualExecutioner.uc +++ b/sources/Weapons/Skins/SkinDualExecutioner.uc @@ -1,5 +1,8 @@ -class SkinDualExecutioner extends NiceDualDeagle; -#exec obj load file="NicePackT.utx" -defaultproperties -{ SkinRefs(0)="NicePackT.Skins1st.deagle_cmb" PickupClass=Class'NicePack.SkinDualExecutionerPickup' AttachmentClass=Class'NicePack.SkinDualExecutionerAttachment' -} +class SkinDualExecutioner extends NiceDualDeagle; +#exec obj load file="NicePackT.utx" +defaultproperties +{ + SkinRefs(0)="NicePackT.Skins1st.deagle_cmb" + PickupClass=Class'NicePack.SkinDualExecutionerPickup' + AttachmentClass=Class'NicePack.SkinDualExecutionerAttachment' +} diff --git a/sources/Weapons/Skins/SkinDualExecutionerAttachment.uc b/sources/Weapons/Skins/SkinDualExecutionerAttachment.uc index 2bc6ce3..d01a4df 100644 --- a/sources/Weapons/Skins/SkinDualExecutionerAttachment.uc +++ b/sources/Weapons/Skins/SkinDualExecutionerAttachment.uc @@ -1,4 +1,5 @@ -class SkinDualExecutionerAttachment extends NiceDualDeagleAttachment; -defaultproperties -{ SkinRefs(0)="NicePackT.Skins3rd.Exectutioner_3rd" -} +class SkinDualExecutionerAttachment extends NiceDualDeagleAttachment; +defaultproperties +{ + SkinRefs(0)="NicePackT.Skins3rd.Exectutioner_3rd" +} diff --git a/sources/Weapons/Skins/SkinDualExecutionerPickup.uc b/sources/Weapons/Skins/SkinDualExecutionerPickup.uc index a5805f4..0f63ac1 100644 --- a/sources/Weapons/Skins/SkinDualExecutionerPickup.uc +++ b/sources/Weapons/Skins/SkinDualExecutionerPickup.uc @@ -1,4 +1,5 @@ -class SkinDualExecutionerPickup extends NiceDualDeaglePickup; -defaultproperties -{ InventoryType=Class'NicePack.SkinDualExecutioner' -} +class SkinDualExecutionerPickup extends NiceDualDeaglePickup; +defaultproperties +{ + InventoryType=Class'NicePack.SkinDualExecutioner' +} diff --git a/sources/Weapons/Skins/SkinExecutioner.uc b/sources/Weapons/Skins/SkinExecutioner.uc index bd4d1a9..446fddc 100644 --- a/sources/Weapons/Skins/SkinExecutioner.uc +++ b/sources/Weapons/Skins/SkinExecutioner.uc @@ -1,5 +1,8 @@ -class SkinExecutioner extends NiceDeagle; -#exec obj load file="NicePackT.utx" -defaultproperties -{ SkinRefs(0)="NicePackT.Skins1st.deagle_cmb" PickupClass=Class'NicePack.SkinExecutionerPickup' AttachmentClass=Class'NicePack.SkinExecutionerAttachment' -} +class SkinExecutioner extends NiceDeagle; +#exec obj load file="NicePackT.utx" +defaultproperties +{ + SkinRefs(0)="NicePackT.Skins1st.deagle_cmb" + PickupClass=Class'NicePack.SkinExecutionerPickup' + AttachmentClass=Class'NicePack.SkinExecutionerAttachment' +} diff --git a/sources/Weapons/Skins/SkinExecutionerAttachment.uc b/sources/Weapons/Skins/SkinExecutionerAttachment.uc index ee80011..6f5d9ac 100644 --- a/sources/Weapons/Skins/SkinExecutionerAttachment.uc +++ b/sources/Weapons/Skins/SkinExecutionerAttachment.uc @@ -1,4 +1,5 @@ -class SkinExecutionerAttachment extends NiceDeagleAttachment; -defaultproperties -{ SkinRefs(0)="NicePackT.Skins3rd.Exectutioner_3rd" -} +class SkinExecutionerAttachment extends NiceDeagleAttachment; +defaultproperties +{ + SkinRefs(0)="NicePackT.Skins3rd.Exectutioner_3rd" +} diff --git a/sources/Weapons/Skins/SkinExecutionerPickup.uc b/sources/Weapons/Skins/SkinExecutionerPickup.uc index 6277ec1..ecc202d 100644 --- a/sources/Weapons/Skins/SkinExecutionerPickup.uc +++ b/sources/Weapons/Skins/SkinExecutionerPickup.uc @@ -1,4 +1,5 @@ -class SkinExecutionerPickup extends NiceDeaglePickup; -defaultproperties -{ InventoryType=Class'NicePack.SkinExecutioner' -} +class SkinExecutionerPickup extends NiceDeaglePickup; +defaultproperties +{ + InventoryType=Class'NicePack.SkinExecutioner' +} diff --git a/sources/Weapons/Skins/SkinGoldenDeagle.uc b/sources/Weapons/Skins/SkinGoldenDeagle.uc index 6cb32a7..2e3a0d0 100644 --- a/sources/Weapons/Skins/SkinGoldenDeagle.uc +++ b/sources/Weapons/Skins/SkinGoldenDeagle.uc @@ -1,4 +1,7 @@ -class SkinGoldenDeagle extends NiceDeagle; -defaultproperties -{ SkinRefs(0)="KF_Weapons_Gold_T.Weapons.Gold_deagle_cmb" PickupClass=Class'NicePack.SkinGoldenDeaglePickup' AttachmentClass=Class'NicePack.SkinGoldenDeagleAttachment' -} +class SkinGoldenDeagle extends NiceDeagle; +defaultproperties +{ + SkinRefs(0)="KF_Weapons_Gold_T.Weapons.Gold_deagle_cmb" + PickupClass=Class'NicePack.SkinGoldenDeaglePickup' + AttachmentClass=Class'NicePack.SkinGoldenDeagleAttachment' +} diff --git a/sources/Weapons/Skins/SkinGoldenDeagleAttachment.uc b/sources/Weapons/Skins/SkinGoldenDeagleAttachment.uc index 1fadf28..200edb7 100644 --- a/sources/Weapons/Skins/SkinGoldenDeagleAttachment.uc +++ b/sources/Weapons/Skins/SkinGoldenDeagleAttachment.uc @@ -1,4 +1,6 @@ -class SkinGoldenDeagleAttachment extends NiceDeagleAttachment; -defaultproperties -{ SkinRefs(0)="KF_Weapons3rd_Gold_T.Weapons.Gold_3rdP_Handcannon_cmb" MeshRef="KF_Wp3rdGold_Trip.HandcannonGold_3rd" -} +class SkinGoldenDeagleAttachment extends NiceDeagleAttachment; +defaultproperties +{ + SkinRefs(0)="KF_Weapons3rd_Gold_T.Weapons.Gold_3rdP_Handcannon_cmb" + MeshRef="KF_Wp3rdGold_Trip.HandcannonGold_3rd" +} diff --git a/sources/Weapons/Skins/SkinGoldenDeaglePickup.uc b/sources/Weapons/Skins/SkinGoldenDeaglePickup.uc index 413dfba..22eb2c2 100644 --- a/sources/Weapons/Skins/SkinGoldenDeaglePickup.uc +++ b/sources/Weapons/Skins/SkinGoldenDeaglePickup.uc @@ -1,4 +1,6 @@ -class SkinGoldenDeaglePickup extends NiceDeaglePickup; -defaultproperties -{ InventoryType=Class'NicePack.SkinGoldenDeagle' Skins(0)=Texture'KF_Weapons3rd_Gold_T.Weapons.Gold_Handcannon_3rd' -} +class SkinGoldenDeaglePickup extends NiceDeaglePickup; +defaultproperties +{ + InventoryType=Class'NicePack.SkinGoldenDeagle' + Skins(0)=Texture'KF_Weapons3rd_Gold_T.Weapons.Gold_Handcannon_3rd' +} diff --git a/sources/Weapons/Skins/SkinGoldenDualDeagle.uc b/sources/Weapons/Skins/SkinGoldenDualDeagle.uc index 9a3cad3..508efe5 100644 --- a/sources/Weapons/Skins/SkinGoldenDualDeagle.uc +++ b/sources/Weapons/Skins/SkinGoldenDualDeagle.uc @@ -1,4 +1,7 @@ -class SkinGoldenDualDeagle extends NiceDualDeagle; -defaultproperties -{ SkinRefs(0)="KF_Weapons_Gold_T.Weapons.Gold_deagle_cmb" PickupClass=Class'NicePack.SkinGoldenDualDeaglePickup' AttachmentClass=Class'NicePack.SkinGoldenDualDeagleAttachment' -} +class SkinGoldenDualDeagle extends NiceDualDeagle; +defaultproperties +{ + SkinRefs(0)="KF_Weapons_Gold_T.Weapons.Gold_deagle_cmb" + PickupClass=Class'NicePack.SkinGoldenDualDeaglePickup' + AttachmentClass=Class'NicePack.SkinGoldenDualDeagleAttachment' +} diff --git a/sources/Weapons/Skins/SkinGoldenDualDeagleAttachment.uc b/sources/Weapons/Skins/SkinGoldenDualDeagleAttachment.uc index 36c4e8e..2f4ddbc 100644 --- a/sources/Weapons/Skins/SkinGoldenDualDeagleAttachment.uc +++ b/sources/Weapons/Skins/SkinGoldenDualDeagleAttachment.uc @@ -1,5 +1,7 @@ -class SkinGoldenDualDeagleAttachment extends NiceDualDeagleAttachment; -#exec OBJ LOAD FILE=KF_Weapons3rd_Gold_T.utx -defaultproperties -{ SkinRefs(0)="KF_Weapons3rd_Gold_T.Weapons.Gold_3rdP_Handcannon_cmb" MeshRef="KF_Wp3rdGold_Trip.HandcannonGold_3rd" -} +class SkinGoldenDualDeagleAttachment extends NiceDualDeagleAttachment; +#exec OBJ LOAD FILE=KF_Weapons3rd_Gold_T.utx +defaultproperties +{ + SkinRefs(0)="KF_Weapons3rd_Gold_T.Weapons.Gold_3rdP_Handcannon_cmb" + MeshRef="KF_Wp3rdGold_Trip.HandcannonGold_3rd" +} diff --git a/sources/Weapons/Skins/SkinGoldenDualDeaglePickup.uc b/sources/Weapons/Skins/SkinGoldenDualDeaglePickup.uc index 65dd603..a7d8470 100644 --- a/sources/Weapons/Skins/SkinGoldenDualDeaglePickup.uc +++ b/sources/Weapons/Skins/SkinGoldenDualDeaglePickup.uc @@ -1,4 +1,7 @@ -class SkinGoldenDualDeaglePickup extends NiceDualDeaglePickup; -defaultproperties -{ InventoryType=Class'NicePack.SkinGoldenDualDeagle' StaticMesh=StaticMesh'KF_pickupsGold_Trip.HandcannonGold_Pickup' Skins(0)=Texture'KF_Weapons3rd_Gold_T.Weapons.Gold_Handcannon_3rd' -} +class SkinGoldenDualDeaglePickup extends NiceDualDeaglePickup; +defaultproperties +{ + InventoryType=Class'NicePack.SkinGoldenDualDeagle' + StaticMesh=StaticMesh'KF_pickupsGold_Trip.HandcannonGold_Pickup' + Skins(0)=Texture'KF_Weapons3rd_Gold_T.Weapons.Gold_Handcannon_3rd' +} diff --git a/sources/Weapons/Skins/SkinGoldenDualJudgeAttachment.uc b/sources/Weapons/Skins/SkinGoldenDualJudgeAttachment.uc index c80101f..57f942d 100644 --- a/sources/Weapons/Skins/SkinGoldenDualJudgeAttachment.uc +++ b/sources/Weapons/Skins/SkinGoldenDualJudgeAttachment.uc @@ -1,4 +1,6 @@ -class SkinGoldenDualJudgeAttachment extends NiceDualJudgePistolAttachment; -defaultproperties -{ BrotherMesh=SkeletalMesh'NicePackA.judge.juj_3rd_gold' MeshRef="NicePackA.Judge.juj_3rd_gold" -} +class SkinGoldenDualJudgeAttachment extends NiceDualJudgePistolAttachment; +defaultproperties +{ + BrotherMesh=SkeletalMesh'NicePackA.judge.juj_3rd_gold' + MeshRef="NicePackA.Judge.juj_3rd_gold" +} diff --git a/sources/Weapons/Skins/SkinGoldenDualJudgePistol.uc b/sources/Weapons/Skins/SkinGoldenDualJudgePistol.uc index 9a2aba3..5bb0caf 100644 --- a/sources/Weapons/Skins/SkinGoldenDualJudgePistol.uc +++ b/sources/Weapons/Skins/SkinGoldenDualJudgePistol.uc @@ -1,4 +1,8 @@ -class SkinGoldenDualJudgePistol extends NiceDualJudgePistol; -defaultproperties -{ TraderInfoTexture=Texture'NicePackT.judge.dualjuj_p_gold_trader' SkinRefs(0)="NicePackT.Judge.kfjudge_gold_cmb" PickupClass=Class'NicePack.SkinGoldenDualJudgePistolPickup' AttachmentClass=Class'NicePack.SkinGoldenDualJudgeAttachment' -} +class SkinGoldenDualJudgePistol extends NiceDualJudgePistol; +defaultproperties +{ + TraderInfoTexture=Texture'NicePackT.judge.dualjuj_p_gold_trader' + SkinRefs(0)="NicePackT.Judge.kfjudge_gold_cmb" + PickupClass=Class'NicePack.SkinGoldenDualJudgePistolPickup' + AttachmentClass=Class'NicePack.SkinGoldenDualJudgeAttachment' +} diff --git a/sources/Weapons/Skins/SkinGoldenDualJudgePistolPickup.uc b/sources/Weapons/Skins/SkinGoldenDualJudgePistolPickup.uc index 10f9e6d..ddc0b5c 100644 --- a/sources/Weapons/Skins/SkinGoldenDualJudgePistolPickup.uc +++ b/sources/Weapons/Skins/SkinGoldenDualJudgePistolPickup.uc @@ -1,4 +1,6 @@ -class SkinGoldenDualJudgePistolPickup extends NiceDualJudgePistolPickup; -defaultproperties -{ InventoryType=Class'NicePack.SkinGoldenDualJudgePistol' PickupMessage="You got another golden Raging Judge." -} +class SkinGoldenDualJudgePistolPickup extends NiceDualJudgePistolPickup; +defaultproperties +{ + InventoryType=Class'NicePack.SkinGoldenDualJudgePistol' + PickupMessage="You got another golden Raging Judge." +} diff --git a/sources/Weapons/Skins/SkinGoldenJudgeAttachment.uc b/sources/Weapons/Skins/SkinGoldenJudgeAttachment.uc index 86488b4..ac00b0b 100644 --- a/sources/Weapons/Skins/SkinGoldenJudgeAttachment.uc +++ b/sources/Weapons/Skins/SkinGoldenJudgeAttachment.uc @@ -1,4 +1,5 @@ -class SkinGoldenJudgeAttachment extends NiceJudgePistolAttachment; -defaultproperties -{ MeshRef="NicePackA.Judge.juj_3rd_gold" -} +class SkinGoldenJudgeAttachment extends NiceJudgePistolAttachment; +defaultproperties +{ + MeshRef="NicePackA.Judge.juj_3rd_gold" +} diff --git a/sources/Weapons/Skins/SkinGoldenJudgePistol.uc b/sources/Weapons/Skins/SkinGoldenJudgePistol.uc index dad95c5..da0be59 100644 --- a/sources/Weapons/Skins/SkinGoldenJudgePistol.uc +++ b/sources/Weapons/Skins/SkinGoldenJudgePistol.uc @@ -1,4 +1,8 @@ -class SkinGoldenJudgePistol extends NiceJudgePistol; -defaultproperties -{ TraderInfoTexture=Texture'NicePackT.judge.juj_p_gold_trader' SkinRefs(0)="NicePackT.Judge.kfjudge_gold_cmb" PickupClass=Class'NicePack.SkinGoldenJudgePistolPickup' AttachmentClass=Class'NicePack.SkinGoldenJudgeAttachment' -} +class SkinGoldenJudgePistol extends NiceJudgePistol; +defaultproperties +{ + TraderInfoTexture=Texture'NicePackT.judge.juj_p_gold_trader' + SkinRefs(0)="NicePackT.Judge.kfjudge_gold_cmb" + PickupClass=Class'NicePack.SkinGoldenJudgePistolPickup' + AttachmentClass=Class'NicePack.SkinGoldenJudgeAttachment' +} diff --git a/sources/Weapons/Skins/SkinGoldenJudgePistolPickup.uc b/sources/Weapons/Skins/SkinGoldenJudgePistolPickup.uc index a2a4ee4..1bbe01e 100644 --- a/sources/Weapons/Skins/SkinGoldenJudgePistolPickup.uc +++ b/sources/Weapons/Skins/SkinGoldenJudgePistolPickup.uc @@ -1,4 +1,6 @@ -class SkinGoldenJudgePistolPickup extends NiceJudgePistolPickup; -defaultproperties -{ InventoryType=Class'NicePack.SkinGoldenJudgePistol' PickupMessage="You got the gold Raging Judge." -} +class SkinGoldenJudgePistolPickup extends NiceJudgePistolPickup; +defaultproperties +{ + InventoryType=Class'NicePack.SkinGoldenJudgePistol' + PickupMessage="You got the gold Raging Judge." +} diff --git a/sources/Weapons/Skins/SkinGoldenKriss.uc b/sources/Weapons/Skins/SkinGoldenKriss.uc index f10764c..703dcc8 100644 --- a/sources/Weapons/Skins/SkinGoldenKriss.uc +++ b/sources/Weapons/Skins/SkinGoldenKriss.uc @@ -1,5 +1,8 @@ -class SkinGoldenKriss extends ScrnKrissMMedicGun; -#exec obj load file="NicePackT.utx" -defaultproperties -{ SkinRefs(0)="NicePackT.Skins1st.Gold_Kriss_cmb" PickupClass=Class'NicePack.SkinGoldenKrissPickup' AttachmentClass=Class'NicePack.SkinGoldenKrissAttachment' -} +class SkinGoldenKriss extends ScrnKrissMMedicGun; +#exec obj load file="NicePackT.utx" +defaultproperties +{ + SkinRefs(0)="NicePackT.Skins1st.Gold_Kriss_cmb" + PickupClass=Class'NicePack.SkinGoldenKrissPickup' + AttachmentClass=Class'NicePack.SkinGoldenKrissAttachment' +} diff --git a/sources/Weapons/Skins/SkinGoldenKrissAttachment.uc b/sources/Weapons/Skins/SkinGoldenKrissAttachment.uc index 1b1ca2b..cfd8bb0 100644 --- a/sources/Weapons/Skins/SkinGoldenKrissAttachment.uc +++ b/sources/Weapons/Skins/SkinGoldenKrissAttachment.uc @@ -1,4 +1,5 @@ -class SkinGoldenKrissAttachment extends NeonKrissMAttachment; -defaultproperties -{ SkinRefs(0)="NicePackT.Skins3rd.Kriss_Gold_3rd" -} +class SkinGoldenKrissAttachment extends NeonKrissMAttachment; +defaultproperties +{ + SkinRefs(0)="NicePackT.Skins3rd.Kriss_Gold_3rd" +} diff --git a/sources/Weapons/Skins/SkinGoldenKrissPickup.uc b/sources/Weapons/Skins/SkinGoldenKrissPickup.uc index 2b75880..f110725 100644 --- a/sources/Weapons/Skins/SkinGoldenKrissPickup.uc +++ b/sources/Weapons/Skins/SkinGoldenKrissPickup.uc @@ -1,4 +1,5 @@ -class SkinGoldenKrissPickup extends ScrnKrissMPickup; -defaultproperties -{ InventoryType=Class'NicePack.SkinGoldenKriss' -} +class SkinGoldenKrissPickup extends ScrnKrissMPickup; +defaultproperties +{ + InventoryType=Class'NicePack.SkinGoldenKriss' +} diff --git a/sources/Weapons/Skins/SkinM14EBR2Pro.uc b/sources/Weapons/Skins/SkinM14EBR2Pro.uc index c7f8705..3709546 100644 --- a/sources/Weapons/Skins/SkinM14EBR2Pro.uc +++ b/sources/Weapons/Skins/SkinM14EBR2Pro.uc @@ -1,5 +1,8 @@ -class SkinM14EBR2Pro extends NiceM14EBRBattleRifle; -#exec obj load file="NicePackT.utx" -defaultproperties -{ SkinRefs(0)="NicePackT.Skins1st.M14_cmb" PickupClass=Class'NicePack.SkinM14EBR2ProPickup' AttachmentClass=Class'NicePack.SkinM14EBR2ProAttachment' -} +class SkinM14EBR2Pro extends NiceM14EBRBattleRifle; +#exec obj load file="NicePackT.utx" +defaultproperties +{ + SkinRefs(0)="NicePackT.Skins1st.M14_cmb" + PickupClass=Class'NicePack.SkinM14EBR2ProPickup' + AttachmentClass=Class'NicePack.SkinM14EBR2ProAttachment' +} diff --git a/sources/Weapons/Skins/SkinM14EBR2ProAttachment.uc b/sources/Weapons/Skins/SkinM14EBR2ProAttachment.uc index 4e0127e..17d0793 100644 --- a/sources/Weapons/Skins/SkinM14EBR2ProAttachment.uc +++ b/sources/Weapons/Skins/SkinM14EBR2ProAttachment.uc @@ -1,4 +1,5 @@ -class SkinM14EBR2ProAttachment extends NiceM14EBRAttachment; -defaultproperties -{ SkinRefs(0)="NicePackT.Skins3rd.M14_3rd" -} +class SkinM14EBR2ProAttachment extends NiceM14EBRAttachment; +defaultproperties +{ + SkinRefs(0)="NicePackT.Skins3rd.M14_3rd" +} diff --git a/sources/Weapons/Skins/SkinM14EBR2ProPickup.uc b/sources/Weapons/Skins/SkinM14EBR2ProPickup.uc index a53ea7f..4cbedf8 100644 --- a/sources/Weapons/Skins/SkinM14EBR2ProPickup.uc +++ b/sources/Weapons/Skins/SkinM14EBR2ProPickup.uc @@ -1,4 +1,5 @@ -class SkinM14EBR2ProPickup extends NiceM14EBRPickup; -defaultproperties -{ InventoryType=Class'NicePack.SkinM14EBR2Pro' -} +class SkinM14EBR2ProPickup extends NiceM14EBRPickup; +defaultproperties +{ + InventoryType=Class'NicePack.SkinM14EBR2Pro' +} diff --git a/sources/Weapons/Skins/SkinRetroLAR.uc b/sources/Weapons/Skins/SkinRetroLAR.uc index e246e4f..d7a7782 100644 --- a/sources/Weapons/Skins/SkinRetroLAR.uc +++ b/sources/Weapons/Skins/SkinRetroLAR.uc @@ -1,5 +1,7 @@ -class SkinRetroLAR extends NiceWinchester; -#exec obj load file="NicePackT.utx" -defaultproperties -{ SkinRefs(0)="NicePackT.Skins1st.OldLAR_cmb" PickupClass=Class'NicePack.SkinRetroLARPickup' -} +class SkinRetroLAR extends NiceWinchester; +#exec obj load file="NicePackT.utx" +defaultproperties +{ + SkinRefs(0)="NicePackT.Skins1st.OldLAR_cmb" + PickupClass=Class'NicePack.SkinRetroLARPickup' +} diff --git a/sources/Weapons/Skins/SkinRetroLARPickup.uc b/sources/Weapons/Skins/SkinRetroLARPickup.uc index 5fcee4f..7e73270 100644 --- a/sources/Weapons/Skins/SkinRetroLARPickup.uc +++ b/sources/Weapons/Skins/SkinRetroLARPickup.uc @@ -1,4 +1,5 @@ -class SkinRetroLARPickup extends NiceWinchesterPickup; -defaultproperties -{ InventoryType=Class'NicePack.SkinRetroLAR' -} +class SkinRetroLARPickup extends NiceWinchesterPickup; +defaultproperties +{ + InventoryType=Class'NicePack.SkinRetroLAR' +} diff --git a/sources/Zeds/Mean/MeanHuskFireProjectile.uc b/sources/Zeds/Mean/MeanHuskFireProjectile.uc index b4394c7..d6526ff 100644 --- a/sources/Zeds/Mean/MeanHuskFireProjectile.uc +++ b/sources/Zeds/Mean/MeanHuskFireProjectile.uc @@ -1,33 +1,60 @@ -class MeanHuskFireProjectile extends NiceHuskFireProjectile; -simulated singular function Touch(Actor Other){ - local vector HitLocation, HitNormal; - //Don't touch bulletwhip attachment. Taken from HuskFireProjectile - if ( Other == none || KFBulletWhipAttachment(Other) != none ) return; - if ( Other.bProjTarget || Other.bBlockActors ) { LastTouched = Other; if ( Velocity == vect(0,0,0) || Other.IsA('Mover') ) { ProcessTouch(Other,Location); LastTouched = none; return; } - if ( Other.TraceThisActor(HitLocation, HitNormal, Location, Location - 2*Velocity, GetCollisionExtent()) ) HitLocation = Location; - ProcessTouch(Other, HitLocation); LastTouched = none; if ( (Role < ROLE_Authority) && (Other.Role == ROLE_Authority) && (Pawn(Other) != none) ) ClientSideTouch(Other, HitLocation); - } -} -// Don't hit Zed extra collision cylinders -simulated function ProcessTouch(Actor Other, Vector HitLocation) { - // Don't let it hit this player, or blow up on another player - if (Other == none || Other == Instigator || Other.Base == Instigator) return; - // Don't collide with bullet whip attachments - if (KFBulletWhipAttachment(Other) != none) { return; - } - // Use the instigator's location if it exists. This fixes issues with - // the original location of the projectile being really far away from - // the real Origloc due to it taking a couple of milliseconds to - // replicate the location to the client and the first replicated location has - // already moved quite a bit. - if (Instigator != none) { OrigLoc = Instigator.Location; - } - if (!bDud && ((VSizeSquared(Location - OrigLoc) < ArmDistSquared) || OrigLoc == vect(0,0,0))) { if( Role == ROLE_Authority ) { AmbientSound=none; PlaySound(Sound'ProjectileSounds.PTRD_deflect04',,2.0); Other.TakeDamage( ImpactDamage, Instigator, HitLocation, Normal(Velocity), ImpactDamageType ); } - bDud = true; Velocity = vect(0,0,0); LifeSpan=1.0; SetPhysics(PHYS_Falling); - } - if (!bDud) { Explode(HitLocation,Normal(HitLocation-Other.Location)); - } -} -defaultproperties -{ additionalDamagePart=0.250000 -} +class MeanHuskFireProjectile extends NiceHuskFireProjectile; +simulated singular function Touch(Actor Other){ + local vector HitLocation, HitNormal; + //Don't touch bulletwhip attachment. Taken from HuskFireProjectile + if ( Other == none || KFBulletWhipAttachment(Other) != none ) + return; + if ( Other.bProjTarget || Other.bBlockActors ) { + LastTouched = Other; + if ( Velocity == vect(0,0,0) || Other.IsA('Mover') ) { + ProcessTouch(Other,Location); + LastTouched = none; + return; + } + + if ( Other.TraceThisActor(HitLocation, HitNormal, Location, Location - 2*Velocity, GetCollisionExtent()) ) + HitLocation = Location; + + ProcessTouch(Other, HitLocation); + LastTouched = none; + if ( (Role < ROLE_Authority) && (Other.Role == ROLE_Authority) && (Pawn(Other) != none) ) + ClientSideTouch(Other, HitLocation); + } +} +// Don't hit Zed extra collision cylinders +simulated function ProcessTouch(Actor Other, Vector HitLocation) { + // Don't let it hit this player, or blow up on another player + if (Other == none || Other == Instigator || Other.Base == Instigator) + return; + // Don't collide with bullet whip attachments + if (KFBulletWhipAttachment(Other) != none) { + return; + } + // Use the instigator's location if it exists. This fixes issues with + // the original location of the projectile being really far away from + // the real Origloc due to it taking a couple of milliseconds to + // replicate the location to the client and the first replicated location has + // already moved quite a bit. + if (Instigator != none) { + OrigLoc = Instigator.Location; + } + if (!bDud && ((VSizeSquared(Location - OrigLoc) < ArmDistSquared) || OrigLoc == vect(0,0,0))) { + if( Role == ROLE_Authority ) { + AmbientSound=none; + PlaySound(Sound'ProjectileSounds.PTRD_deflect04',,2.0); + Other.TakeDamage( ImpactDamage, Instigator, HitLocation, Normal(Velocity), ImpactDamageType ); + } + + bDud = true; + Velocity = vect(0,0,0); + LifeSpan=1.0; + SetPhysics(PHYS_Falling); + } + if (!bDud) { + Explode(HitLocation,Normal(HitLocation-Other.Location)); + } +} +defaultproperties +{ + additionalDamagePart=0.250000 +} diff --git a/sources/Zeds/Mean/MeanZombieBloat.uc b/sources/Zeds/Mean/MeanZombieBloat.uc index ae1c57d..660a1a7 100644 --- a/sources/Zeds/Mean/MeanZombieBloat.uc +++ b/sources/Zeds/Mean/MeanZombieBloat.uc @@ -1,52 +1,81 @@ -class MeanZombieBloat extends NiceZombieBloat; -#exec OBJ LOAD FILE=MeanZedSkins.utx -/** - * bAmIBarfing true if the bloat is in the barf animation - */ -var bool bAmIBarfing; -/** - * bileCoolDownTimer timer that counts to when the bloat will spawn another set of pile pellets - * bileCoolDownMax max time in between pellet spawns - */ -var float bileCoolDownTimer,bileCoolDownMax; -/** - * Spawn extra sets of bile pellets here once the bile cool down timer - * has reached the max limit - */ -simulated function Tick(float DeltaTime) { - Super.Tick(DeltaTime); - if(!bDecapitated && bAmIBarfing) { bileCoolDownTimer+= DeltaTime; if(bileCoolDownTimer >= bileCoolDownMax) { SpawnTwoShots(); bileCoolDownTimer= 0.0; } - } -} -function Touch(Actor Other) { - super.Touch(Other); - if (Other.IsA('ShotgunBullet')) { ShotgunBullet(Other).Damage = 0; - } -} -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 || VSize(A.Location-Location) <= 250) && !bDecapitated ) { bShotAnim = true; SetAnimAction('ZombieBarfMoving'); RunAttackTimeout = GetAnimDuration('ZombieBarf', 1.0); bMovingPukeAttack=true; - // Randomly send out a message about Bloat Vomit burning(3% chance) if ( FRand() < 0.03 && KFHumanPawn(A) != none && PlayerController(KFHumanPawn(A).Controller) != none ) { PlayerController(KFHumanPawn(A).Controller).Speech('AUTO', 7, ""); } - } -} -//ZombieBarf animation triggers this -function SpawnTwoShots() { - super.SpawnTwoShots(); - bAmIBarfing= true; -} -simulated function AnimEnd(int Channel) { - local name Sequence; - local float Frame, Rate; - - GetAnimParams( ExpectingChannel, Sequence, Frame, Rate ); - super.AnimEnd(Channel); - if(Sequence == 'ZombieBarf') bAmIBarfing= false; -} -defaultproperties -{ bileCoolDownMax=0.750000 HeadHealth=125.000000 MenuName="Mean Bloat" Skins(0)=Combiner'MeanZedSkins.bloat_cmb' -} +class MeanZombieBloat extends NiceZombieBloat; +#exec OBJ LOAD FILE=MeanZedSkins.utx +/** + * bAmIBarfing true if the bloat is in the barf animation + */ +var bool bAmIBarfing; +/** + * bileCoolDownTimer timer that counts to when the bloat will spawn another set of pile pellets + * bileCoolDownMax max time in between pellet spawns + */ +var float bileCoolDownTimer,bileCoolDownMax; +/** + * Spawn extra sets of bile pellets here once the bile cool down timer + * has reached the max limit + */ +simulated function Tick(float DeltaTime) { + Super.Tick(DeltaTime); + if(!bDecapitated && bAmIBarfing) { + bileCoolDownTimer+= DeltaTime; + if(bileCoolDownTimer >= bileCoolDownMax) { + SpawnTwoShots(); + bileCoolDownTimer= 0.0; + } + } +} +function Touch(Actor Other) { + super.Touch(Other); + if (Other.IsA('ShotgunBullet')) { + ShotgunBullet(Other).Damage = 0; + } +} +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 || VSize(A.Location-Location) <= 250) && !bDecapitated ) { + bShotAnim = true; + SetAnimAction('ZombieBarfMoving'); + RunAttackTimeout = GetAnimDuration('ZombieBarf', 1.0); + bMovingPukeAttack=true; + + // Randomly send out a message about Bloat Vomit burning(3% chance) + if ( FRand() < 0.03 && KFHumanPawn(A) != none && PlayerController(KFHumanPawn(A).Controller) != none ) { + PlayerController(KFHumanPawn(A).Controller).Speech('AUTO', 7, ""); + } + } +} +//ZombieBarf animation triggers this +function SpawnTwoShots() { + super.SpawnTwoShots(); + bAmIBarfing= true; +} +simulated function AnimEnd(int Channel) { + local name Sequence; + local float Frame, Rate; + + GetAnimParams( ExpectingChannel, Sequence, Frame, Rate ); + super.AnimEnd(Channel); + if(Sequence == 'ZombieBarf') + bAmIBarfing= false; +} +defaultproperties +{ + bileCoolDownMax=0.750000 + HeadHealth=125.000000 + MenuName="Mean Bloat" + Skins(0)=Combiner'MeanZedSkins.bloat_cmb' +} diff --git a/sources/Zeds/Mean/MeanZombieClot.uc b/sources/Zeds/Mean/MeanZombieClot.uc index 977fc56..74dca9a 100644 --- a/sources/Zeds/Mean/MeanZombieClot.uc +++ b/sources/Zeds/Mean/MeanZombieClot.uc @@ -1,14 +1,19 @@ -class MeanZombieClot extends NiceZombieClot; -#exec OBJ LOAD FILE=MeanZedSkins.utx -function int ModBodyDamage(out int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI, optional float lockonTime){ - local bool bDecreaseDamage; - // Decrease damage if needed - bDecreaseDamage = false; - if(damageType != none) bDecreaseDamage = (headshotLevel <= 0.0) && damageType.default.bCheckForHeadShots; - if(damageType != none && damageType.default.heatPart > 0) bDecreaseDamage = false; - if(bDecreaseDamage && HeadHealth > 0) Damage *= 0.5; - return super.ModBodyDamage(Damage, instigatedBy, hitlocation, momentum, damageType, headshotLevel, KFPRI, lockonTime); -} -defaultproperties -{ MenuName="Mean Clot" Skins(0)=Combiner'MeanZedSkins.clot_cmb' -} +class MeanZombieClot extends NiceZombieClot; +#exec OBJ LOAD FILE=MeanZedSkins.utx +function int ModBodyDamage(out int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI, optional float lockonTime){ + local bool bDecreaseDamage; + // Decrease damage if needed + bDecreaseDamage = false; + if(damageType != none) + bDecreaseDamage = (headshotLevel <= 0.0) && damageType.default.bCheckForHeadShots; + if(damageType != none && damageType.default.heatPart > 0) + bDecreaseDamage = false; + if(bDecreaseDamage && HeadHealth > 0) + Damage *= 0.5; + return super.ModBodyDamage(Damage, instigatedBy, hitlocation, momentum, damageType, headshotLevel, KFPRI, lockonTime); +} +defaultproperties +{ + MenuName="Mean Clot" + Skins(0)=Combiner'MeanZedSkins.clot_cmb' +} diff --git a/sources/Zeds/Mean/MeanZombieCrawler.uc b/sources/Zeds/Mean/MeanZombieCrawler.uc index 439da30..0505ca6 100644 --- a/sources/Zeds/Mean/MeanZombieCrawler.uc +++ b/sources/Zeds/Mean/MeanZombieCrawler.uc @@ -1,32 +1,46 @@ -class MeanZombieCrawler extends NiceZombieCrawler; -#exec OBJ LOAD FILE=MeanZedSkins.utx -simulated function PostBeginPlay() { - super.PostBeginPlay(); - PounceSpeed = Rand(221)+330; - MeleeRange = Rand(41)+50; -} -/** - * Copied from ZombieCrawler.Bump() but changed damage type - * to be the new poison damage type - */ -event Bump(actor Other) { - if(bPouncing && KFHumanPawn(Other) != none) Poison(KFHumanPawn(Other)); - super.Bump(Other); -} -function bool MeleeDamageTarget(int hitdamage, vector pushdir) { - local bool result; - result= super.MeleeDamageTarget(hitdamage, pushdir); - if(result && KFHumanPawn(Controller.Target) != none) Poison(KFHumanPawn(Controller.Target)); - return result; -} -function Poison(KFHumanPawn poisonedPawn){ - local Inventory I; - local bool bFoundPoison; - if(poisonedPawn.Inventory != none){ for(I = poisonedPawn.Inventory; I != none; I = I.Inventory) if(I != none && MeanPoisonInventory(I) != none){ bFoundPoison = true; MeanPoisonInventory(I).poisonStartTime = Level.TimeSeconds; } - } - if(!bFoundPoison){ I = Controller.Spawn(class(DynamicLoadObject("NicePack.MeanPoisonInventory", Class'Class'))); MeanPoisonInventory(I).poisonStartTime = Level.TimeSeconds; I.GiveTo(poisonedPawn); - } -} -defaultproperties -{ GroundSpeed=190.000000 WaterSpeed=175.000000 MenuName="Mean Crawler" Skins(0)=Combiner'MeanZedSkins.crawler_cmb' -} +class MeanZombieCrawler extends NiceZombieCrawler; +#exec OBJ LOAD FILE=MeanZedSkins.utx +simulated function PostBeginPlay() { + super.PostBeginPlay(); + PounceSpeed = Rand(221)+330; + MeleeRange = Rand(41)+50; +} +/** + * Copied from ZombieCrawler.Bump() but changed damage type + * to be the new poison damage type + */ +event Bump(actor Other) { + if(bPouncing && KFHumanPawn(Other) != none) + Poison(KFHumanPawn(Other)); + super.Bump(Other); +} +function bool MeleeDamageTarget(int hitdamage, vector pushdir) { + local bool result; + result= super.MeleeDamageTarget(hitdamage, pushdir); + if(result && KFHumanPawn(Controller.Target) != none) + Poison(KFHumanPawn(Controller.Target)); + return result; +} +function Poison(KFHumanPawn poisonedPawn){ + local Inventory I; + local bool bFoundPoison; + if(poisonedPawn.Inventory != none){ + for(I = poisonedPawn.Inventory; I != none; I = I.Inventory) + if(I != none && MeanPoisonInventory(I) != none){ + bFoundPoison = true; + MeanPoisonInventory(I).poisonStartTime = Level.TimeSeconds; + } + } + if(!bFoundPoison){ + I = Controller.Spawn(class(DynamicLoadObject("NicePack.MeanPoisonInventory", Class'Class'))); + MeanPoisonInventory(I).poisonStartTime = Level.TimeSeconds; + I.GiveTo(poisonedPawn); + } +} +defaultproperties +{ + GroundSpeed=190.000000 + WaterSpeed=175.000000 + MenuName="Mean Crawler" + Skins(0)=Combiner'MeanZedSkins.crawler_cmb' +} diff --git a/sources/Zeds/Mean/MeanZombieFleshPound.uc b/sources/Zeds/Mean/MeanZombieFleshPound.uc index 7aac437..3bb82a0 100644 --- a/sources/Zeds/Mean/MeanZombieFleshPound.uc +++ b/sources/Zeds/Mean/MeanZombieFleshPound.uc @@ -1,42 +1,104 @@ -class MeanZombieFleshPound extends NiceZombieFleshPound; -#exec OBJ LOAD FILE=MeanZedSkins.utx -state RageCharging -{ -Ignores StartChargingFP; - function bool CanGetOutOfWay() - { return false; - } - // Don't override speed in this state - function bool CanSpeedAdjust() - { return false; - } - function BeginState() - { bChargingPlayer = true; if( Level.NetMode!=NM_DedicatedServer ) ClientChargingAnims(); - RageEndTime = (Level.TimeSeconds + 15) + (FRand() * 18); NetUpdateTime = Level.TimeSeconds - 1; - } - function EndState() - { bChargingPlayer = false; bFrustrated = false; if(Controller != none) NiceZombieFleshPoundController(Controller).RageFrustrationTimer = 0; if( Health>0 && !bZapped ) { SetGroundSpeed(GetOriginalGroundSpeed()); } - if( Level.NetMode!=NM_DedicatedServer ) ClientChargingAnims(); - NetUpdateTime = Level.TimeSeconds - 1; - } - function Tick( float Delta ) - { if( !bShotAnim ) { SetGroundSpeed(OriginalGroundSpeed * 2.3);//2.0; } - // Keep the flesh pound moving toward its target when attacking if( Role == ROLE_Authority && bShotAnim) { if( LookTarget!=none ) { Acceleration = AccelRate * Normal(LookTarget.Location - Location); } } - global.Tick(Delta); - } - function Bump( Actor Other ) - { local float RageBumpDamage; local KFMonster KFMonst; - KFMonst = KFMonster(Other); - // Hurt/Kill enemies that we run into while raging if( !bShotAnim && KFMonst!=none && NiceZombieFleshPound(Other)==none && Pawn(Other).Health>0 ) { // Random chance of doing obliteration damage if( FRand() < 0.4 ) { RageBumpDamage = 501; } else { RageBumpDamage = 450; } - RageBumpDamage *= KFMonst.PoundRageBumpDamScale; - Other.TakeDamage(RageBumpDamage, self, Other.Location, Velocity * Other.Mass, class'NiceDamTypePoundCrushed'); } else Global.Bump(Other); - } - // If fleshie hits his target on a charge, then he should settle down for abit. - function bool MeleeDamageTarget(int hitdamage, vector pushdir) - { local bool RetVal,bWasEnemy; - bWasEnemy = (Controller.Target==Controller.Enemy); RetVal = Super(NiceMonster).MeleeDamageTarget(hitdamage*1.75, pushdir*3); // Only stop if you've successfully killed your target if(Pawn(Controller.Target) == none) return RetVal; if( KFPawn(Controller.Target) != none && Pawn(Controller.Target).Health <= 0 && RetVal && bWasEnemy ){ GoToState(''); } return RetVal; - } -} -defaultproperties -{ MenuName="Mean FleshPound" Skins(0)=Combiner'MeanZedSkins.fleshpound_cmb' -} +class MeanZombieFleshPound extends NiceZombieFleshPound; +#exec OBJ LOAD FILE=MeanZedSkins.utx +state RageCharging +{ +Ignores StartChargingFP; + function bool CanGetOutOfWay() + { + return false; + } + // Don't override speed in this state + function bool CanSpeedAdjust() + { + return false; + } + function BeginState() + { + bChargingPlayer = true; + if( Level.NetMode!=NM_DedicatedServer ) + ClientChargingAnims(); + + RageEndTime = (Level.TimeSeconds + 15) + (FRand() * 18); + NetUpdateTime = Level.TimeSeconds - 1; + } + function EndState() + { + bChargingPlayer = false; + bFrustrated = false; + if(Controller != none) + NiceZombieFleshPoundController(Controller).RageFrustrationTimer = 0; + if( Health>0 && !bZapped ) + { + SetGroundSpeed(GetOriginalGroundSpeed()); + } + + if( Level.NetMode!=NM_DedicatedServer ) + ClientChargingAnims(); + + NetUpdateTime = Level.TimeSeconds - 1; + } + function Tick( float Delta ) + { + if( !bShotAnim ) + { + SetGroundSpeed(OriginalGroundSpeed * 2.3);//2.0; + } + + // Keep the flesh pound moving toward its target when attacking + if( Role == ROLE_Authority && bShotAnim) + { + if( LookTarget!=none ) + { + Acceleration = AccelRate * Normal(LookTarget.Location - Location); + } + } + + global.Tick(Delta); + } + function Bump( Actor Other ) + { + local float RageBumpDamage; + local KFMonster KFMonst; + + KFMonst = KFMonster(Other); + + // Hurt/Kill enemies that we run into while raging + if( !bShotAnim && KFMonst!=none && NiceZombieFleshPound(Other)==none && Pawn(Other).Health>0 ) + { + // Random chance of doing obliteration damage + if( FRand() < 0.4 ) + { + RageBumpDamage = 501; + } + else + { + RageBumpDamage = 450; + } + + RageBumpDamage *= KFMonst.PoundRageBumpDamScale; + + Other.TakeDamage(RageBumpDamage, self, Other.Location, Velocity * Other.Mass, class'NiceDamTypePoundCrushed'); + } + else Global.Bump(Other); + } + // If fleshie hits his target on a charge, then he should settle down for abit. + function bool MeleeDamageTarget(int hitdamage, vector pushdir) + { + local bool RetVal,bWasEnemy; + + bWasEnemy = (Controller.Target==Controller.Enemy); + RetVal = Super(NiceMonster).MeleeDamageTarget(hitdamage*1.75, pushdir*3); + // Only stop if you've successfully killed your target + if(Pawn(Controller.Target) == none) + return RetVal; + if( KFPawn(Controller.Target) != none && Pawn(Controller.Target).Health <= 0 && RetVal && bWasEnemy ){ + GoToState(''); + } + return RetVal; + } +} +defaultproperties +{ + MenuName="Mean FleshPound" + Skins(0)=Combiner'MeanZedSkins.fleshpound_cmb' +} diff --git a/sources/Zeds/Mean/MeanZombieGorefast.uc b/sources/Zeds/Mean/MeanZombieGorefast.uc index a0149af..2af603e 100644 --- a/sources/Zeds/Mean/MeanZombieGorefast.uc +++ b/sources/Zeds/Mean/MeanZombieGorefast.uc @@ -1,24 +1,40 @@ -class MeanZombieGorefast extends NiceZombieGorefast; -#exec OBJ LOAD FILE=MeanZedSkins.utx -var float minRageDist; -function bool IsStunPossible(){ - return false; -} -function RangedAttack(Actor A) { - Super(NiceMonster).RangedAttack(A); - if(!bShotAnim && !bDecapitated && VSize(A.Location-Location) <= minRageDist) GoToState('RunningState'); -} -state RunningState { - function RangedAttack(Actor A){ if(bShotAnim || Physics == PHYS_Swimming) return; else if(CanAttack(A)){ bShotAnim = true; - //Always do the charging melee attack SetAnimAction('ClawAndMove'); RunAttackTimeout = GetAnimDuration('GoreAttack1', 1.0); return; } - } -Begin: - GoTo('CheckCharge'); -CheckCharge: - if(Controller != none && Controller.Target != none && VSize(Controller.Target.Location - Location) < minRageDist){ Sleep(0.5 + FRand() * 0.5); GoTo('CheckCharge'); - } - else GoToState(''); -} -defaultproperties -{ minRageDist=1400.000000 MenuName="Mean Gorefast" Skins(0)=Combiner'MeanZedSkins.gorefast_cmb' -} +class MeanZombieGorefast extends NiceZombieGorefast; +#exec OBJ LOAD FILE=MeanZedSkins.utx +var float minRageDist; +function bool IsStunPossible(){ + return false; +} +function RangedAttack(Actor A) { + Super(NiceMonster).RangedAttack(A); + if(!bShotAnim && !bDecapitated && VSize(A.Location-Location) <= minRageDist) + GoToState('RunningState'); +} +state RunningState { + function RangedAttack(Actor A){ + if(bShotAnim || Physics == PHYS_Swimming) + return; + else if(CanAttack(A)){ + bShotAnim = true; + + //Always do the charging melee attack + SetAnimAction('ClawAndMove'); + RunAttackTimeout = GetAnimDuration('GoreAttack1', 1.0); + return; + } + } +Begin: + GoTo('CheckCharge'); +CheckCharge: + if(Controller != none && Controller.Target != none && VSize(Controller.Target.Location - Location) < minRageDist){ + Sleep(0.5 + FRand() * 0.5); + GoTo('CheckCharge'); + } + else + GoToState(''); +} +defaultproperties +{ + minRageDist=1400.000000 + MenuName="Mean Gorefast" + Skins(0)=Combiner'MeanZedSkins.gorefast_cmb' +} diff --git a/sources/Zeds/Mean/MeanZombieHusk.uc b/sources/Zeds/Mean/MeanZombieHusk.uc index 0bd85ec..07dff21 100644 --- a/sources/Zeds/Mean/MeanZombieHusk.uc +++ b/sources/Zeds/Mean/MeanZombieHusk.uc @@ -1,41 +1,91 @@ -class MeanZombieHusk extends NiceZombieHusk; -#exec OBJ LOAD FILE=NicePackT.utx -var int consecutiveShots, totalShots, maxNormalShots; -function DoStun(optional Pawn instigatedBy, optional Vector hitLocation, optional Vector momentum, optional class damageType, optional float headshotLevel, optional KFPlayerReplicationInfo KFPRI){ - super.DoStun(instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); - totalShots = maxNormalShots; -} -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 = HuskFireProjClass; 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); - if(Controller != none) 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(HuskFireProjClass, Self,, FireStart, FireRotation); - // Turn extra collision back on - ToggleAuxCollision(true); -} -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); - //Increment the number of consecutive shtos taken and apply the cool down if needed totalShots ++; consecutiveShots ++; if(consecutiveShots < 3 && totalShots > maxNormalShots) NextFireProjectileTime = Level.TimeSeconds; else{ NextFireProjectileTime = Level.TimeSeconds + ProjectileFireInterval + (FRand() * 2.0); consecutiveShots = 0; } - } -} -defaultproperties -{ maxNormalShots=3 HuskFireProjClass=Class'NicePack.MeanHuskFireProjectile' remainingStuns=1 MenuName="Mean Husk" ControllerClass=Class'NicePack.MeanZombieHuskController' Skins(0)=Texture'NicePackT.MonsterMeanHusk.burns_tatters' Skins(1)=Shader'NicePackT.MonsterMeanHusk.burns_shdr' -} +class MeanZombieHusk extends NiceZombieHusk; +#exec OBJ LOAD FILE=NicePackT.utx +var int consecutiveShots, totalShots, maxNormalShots; +function DoStun(optional Pawn instigatedBy, optional Vector hitLocation, optional Vector momentum, optional class damageType, optional float headshotLevel, optional KFPlayerReplicationInfo KFPRI){ + super.DoStun(instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); + totalShots = maxNormalShots; +} +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 = HuskFireProjClass; + 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); + if(Controller != none) + 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(HuskFireProjClass, Self,, FireStart, FireRotation); + // Turn extra collision back on + ToggleAuxCollision(true); +} +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); + + //Increment the number of consecutive shtos taken and apply the cool down if needed + totalShots ++; + consecutiveShots ++; + if(consecutiveShots < 3 && totalShots > maxNormalShots) + NextFireProjectileTime = Level.TimeSeconds; + else{ + NextFireProjectileTime = Level.TimeSeconds + ProjectileFireInterval + (FRand() * 2.0); + consecutiveShots = 0; + } + } +} +defaultproperties +{ + maxNormalShots=3 + HuskFireProjClass=Class'NicePack.MeanHuskFireProjectile' + remainingStuns=1 + MenuName="Mean Husk" + ControllerClass=Class'NicePack.MeanZombieHuskController' + Skins(0)=Texture'NicePackT.MonsterMeanHusk.burns_tatters' + Skins(1)=Shader'NicePackT.MonsterMeanHusk.burns_shdr' +} diff --git a/sources/Zeds/Mean/MeanZombieHuskController.uc b/sources/Zeds/Mean/MeanZombieHuskController.uc index 0d3e2a1..46dc5aa 100644 --- a/sources/Zeds/Mean/MeanZombieHuskController.uc +++ b/sources/Zeds/Mean/MeanZombieHuskController.uc @@ -1,67 +1,193 @@ -class MeanZombieHuskController extends NiceZombieHuskController; -var float aimAtFeetZDelta; -function bool DefendMelee(float Dist) { - return (Dist < 1000); -} -function rotator AdjustAim(FireProperties FiredAmmunition, vector projStart, int aimerror) { - local rotator FireRotation, TargetLook; - local float FireDist, TargetDist, ProjSpeed; - local actor HitActor; - local vector FireSpot, FireDir, TargetVel, HitLocation, HitNormal; - local int realYaw; - local bool bDefendCloseRange, bClean, bLeadTargetNow; - local bool bWantsToAimAtFeet; - if ( FiredAmmunition.ProjectileClass != none ) projspeed = FiredAmmunition.ProjectileClass.default.speed; - // make sure bot has a valid target - if ( Target == none ) { Target = Enemy; if ( Target == none ) return Rotation; - } - FireSpot = Target.Location; - TargetDist = VSize(Target.Location - Pawn.Location); - // perfect aim at stationary objects - if ( Pawn(Target) == none ) { if ( !FiredAmmunition.bTossed ) return rotator(Target.Location - projstart); else { FireDir = AdjustToss(projspeed,ProjStart,Target.Location,true); SetRotation(Rotator(FireDir)); return Rotation; } - } - bLeadTargetNow = FiredAmmunition.bLeadTarget && bLeadTarget; - bDefendCloseRange = ( (Target == Enemy) && DefendMelee(TargetDist) ); - aimerror = AdjustAimError(aimerror,TargetDist,bDefendCloseRange,FiredAmmunition.bInstantHit, bLeadTargetNow); - // lead target with non instant hit projectiles - if ( bLeadTargetNow ) { TargetVel = Target.Velocity; // hack guess at projecting falling velocity of target if ( Target.Physics == PHYS_Falling) { if ( Target.PhysicsVolume.Gravity.Z <= Target.PhysicsVolume.Default.Gravity.Z ) { TargetVel.Z = FMin(TargetVel.Z + FMax(-400, Target.PhysicsVolume.Gravity.Z * FMin(1,TargetDist/projSpeed)),0); } else { TargetVel.Z = FMin(0, TargetVel.Z); } } // more or less lead target (with some random variation) FireSpot += FMin(1, 0.7 + 0.6 * FRand()) * TargetVel * TargetDist/projSpeed; FireSpot.Z = FMin(Target.Location.Z, FireSpot.Z); /** * If the target is within 1000uu, offset the Z coordinate of the * FireSpot vector with aimAtFeetZDelta. Otherwise, the husk will * aim at behind the target, not at his feet. */ if (aimAtFeetZDelta != 0.0 && Target.Physics == PHYS_Falling && bDefendCloseRange) { FireSpot.Z= Pawn.Location.Z + aimAtFeetZDelta; } - if ( (Target.Physics != PHYS_Falling) && (FRand() < 0.55) && (VSize(FireSpot - ProjStart) > 1000) ) { // don't always lead far away targets, especially if they are moving sideways with respect to the bot TargetLook = Target.Rotation; if ( Target.Physics == PHYS_Walking ) TargetLook.Pitch = 0; bClean = ( ((Vector(TargetLook) Dot Normal(Target.Velocity)) >= 0.71) && FastTrace(FireSpot, ProjStart) ); } else // make sure that bot isn't leading into a wall bClean = FastTrace(FireSpot, ProjStart); if ( !bClean) { // reduce amount of leading if ( FRand() < 0.3 ) FireSpot = Target.Location; else FireSpot = 0.5 * (FireSpot + Target.Location); } - } - bClean = false; //so will fail first check unless shooting at feet - // Randomly determine if we should try and splash damage with the fire projectile - if( FiredAmmunition.bTrySplash ) { if( Skill < 2.0 ) { if(FRand() > 0.85) { bWantsToAimAtFeet = true; } } else if( Skill < 3.0 ) { if(FRand() > 0.5) { bWantsToAimAtFeet = true; } } else if( Skill >= 3.0 ) { if(FRand() > 0.25) { bWantsToAimAtFeet = true; } } - } - if ( FiredAmmunition.bTrySplash && (Pawn(Target) != none) && (((Target.Physics == PHYS_Falling) && (Pawn.Location.Z + 80 >= Target.Location.Z)) || ((Pawn.Location.Z + 19 >= Target.Location.Z) && (bDefendCloseRange || bWantsToAimAtFeet))) ) { HitActor = Trace(HitLocation, HitNormal, FireSpot - vect(0,0,1) * (Target.CollisionHeight + 10), FireSpot, false); - bClean = (HitActor == none); //So if we're too close, and not jumping, bClean is false //same distance but jumping, bClean is true if ( !bClean ) { FireSpot = HitLocation + vect(0,0,3); bClean = FastTrace(FireSpot, ProjStart); } else bClean = ( (Target.Physics == PHYS_Falling) && FastTrace(FireSpot, ProjStart) ); /** * Update the aimAtFeetZDelta variable with the appropriate offset * once the Husk decides to aim at the target's feet. Update the * default property so all Super Husks can access it */ if (bClean && TargetDist > 625.0) { aimAtFeetZDelta= FireSpot.Z - Pawn.Location.Z; } - } - if ( !bClean ) { //try middle FireSpot.Z = Target.Location.Z; bClean = FastTrace(FireSpot, ProjStart); - } - if ( FiredAmmunition.bTossed && !bClean && bEnemyInfoValid ) { FireSpot = LastSeenPos; HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); if ( HitActor != none ) { bCanFire = false; FireSpot += 2 * Target.CollisionHeight * HitNormal; } bClean = true; - } - if( !bClean ) { // try head FireSpot.Z = Target.Location.Z + 0.9 * Target.CollisionHeight; bClean = FastTrace(FireSpot, ProjStart); - } - if ( !bClean && (Target == Enemy) && bEnemyInfoValid ) { FireSpot = LastSeenPos; if ( Pawn.Location.Z >= LastSeenPos.Z ) FireSpot.Z -= 0.4 * Enemy.CollisionHeight; HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); if ( HitActor != none ) { FireSpot = LastSeenPos + 2 * Enemy.CollisionHeight * HitNormal; if ( Monster(Pawn).SplashDamage() && (Skill >= 4) ) { HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); if ( HitActor != none ) FireSpot += 2 * Enemy.CollisionHeight * HitNormal; } bCanFire = false; } - } - // adjust for toss distance - if ( FiredAmmunition.bTossed ) { FireDir = AdjustToss(projspeed,ProjStart,FireSpot,true); - } - else { FireDir = FireSpot - ProjStart; - } - FireRotation = Rotator(FireDir); - realYaw = FireRotation.Yaw; - InstantWarnTarget(Target,FiredAmmunition,vector(FireRotation)); - FireRotation.Yaw = SetFireYaw(FireRotation.Yaw + aimerror); - FireDir = vector(FireRotation); - // avoid shooting into wall - FireDist = FMin(VSize(FireSpot-ProjStart), 400); - FireSpot = ProjStart + FireDist * FireDir; - HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); - if ( HitActor != none ) { if ( HitNormal.Z < 0.7 ) { FireRotation.Yaw = SetFireYaw(realYaw - aimerror); FireDir = vector(FireRotation); FireSpot = ProjStart + FireDist * FireDir; HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); } if ( HitActor != none ) { FireSpot += HitNormal * 2 * Target.CollisionHeight; if ( Skill >= 4 ) { HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); if ( HitActor != none ) FireSpot += Target.CollisionHeight * HitNormal; } FireDir = Normal(FireSpot - ProjStart); FireRotation = rotator(FireDir); } - } - //Make it so the Husk always shoots the ground it the target is close - SetRotation(FireRotation); - return FireRotation; -} -defaultproperties -{ -} +class MeanZombieHuskController extends NiceZombieHuskController; +var float aimAtFeetZDelta; +function bool DefendMelee(float Dist) { + return (Dist < 1000); +} +function rotator AdjustAim(FireProperties FiredAmmunition, vector projStart, int aimerror) { + local rotator FireRotation, TargetLook; + local float FireDist, TargetDist, ProjSpeed; + local actor HitActor; + local vector FireSpot, FireDir, TargetVel, HitLocation, HitNormal; + local int realYaw; + local bool bDefendCloseRange, bClean, bLeadTargetNow; + local bool bWantsToAimAtFeet; + if ( FiredAmmunition.ProjectileClass != none ) + projspeed = FiredAmmunition.ProjectileClass.default.speed; + // make sure bot has a valid target + if ( Target == none ) { + Target = Enemy; + if ( Target == none ) + return Rotation; + } + FireSpot = Target.Location; + TargetDist = VSize(Target.Location - Pawn.Location); + // perfect aim at stationary objects + if ( Pawn(Target) == none ) { + if ( !FiredAmmunition.bTossed ) + return rotator(Target.Location - projstart); + else { + FireDir = AdjustToss(projspeed,ProjStart,Target.Location,true); + SetRotation(Rotator(FireDir)); + return Rotation; + } + } + bLeadTargetNow = FiredAmmunition.bLeadTarget && bLeadTarget; + bDefendCloseRange = ( (Target == Enemy) && DefendMelee(TargetDist) ); + aimerror = AdjustAimError(aimerror,TargetDist,bDefendCloseRange,FiredAmmunition.bInstantHit, bLeadTargetNow); + // lead target with non instant hit projectiles + if ( bLeadTargetNow ) { + TargetVel = Target.Velocity; + // hack guess at projecting falling velocity of target + if ( Target.Physics == PHYS_Falling) { + if ( Target.PhysicsVolume.Gravity.Z <= Target.PhysicsVolume.Default.Gravity.Z ) { + TargetVel.Z = FMin(TargetVel.Z + FMax(-400, Target.PhysicsVolume.Gravity.Z * FMin(1,TargetDist/projSpeed)),0); + } else { + TargetVel.Z = FMin(0, TargetVel.Z); + } + } + // more or less lead target (with some random variation) + FireSpot += FMin(1, 0.7 + 0.6 * FRand()) * TargetVel * TargetDist/projSpeed; + FireSpot.Z = FMin(Target.Location.Z, FireSpot.Z); + /** + * If the target is within 1000uu, offset the Z coordinate of the + * FireSpot vector with aimAtFeetZDelta. Otherwise, the husk will + * aim at behind the target, not at his feet. + */ + if (aimAtFeetZDelta != 0.0 && Target.Physics == PHYS_Falling && bDefendCloseRange) { + FireSpot.Z= Pawn.Location.Z + aimAtFeetZDelta; + } + + if ( (Target.Physics != PHYS_Falling) && (FRand() < 0.55) && (VSize(FireSpot - ProjStart) > 1000) ) { + // don't always lead far away targets, especially if they are moving sideways with respect to the bot + TargetLook = Target.Rotation; + if ( Target.Physics == PHYS_Walking ) + TargetLook.Pitch = 0; + bClean = ( ((Vector(TargetLook) Dot Normal(Target.Velocity)) >= 0.71) && FastTrace(FireSpot, ProjStart) ); + } + else // make sure that bot isn't leading into a wall + bClean = FastTrace(FireSpot, ProjStart); + if ( !bClean) { + // reduce amount of leading + if ( FRand() < 0.3 ) + FireSpot = Target.Location; + else + FireSpot = 0.5 * (FireSpot + Target.Location); + } + } + bClean = false; //so will fail first check unless shooting at feet + // Randomly determine if we should try and splash damage with the fire projectile + if( FiredAmmunition.bTrySplash ) { + if( Skill < 2.0 ) { + if(FRand() > 0.85) { + bWantsToAimAtFeet = true; + } + } + else if( Skill < 3.0 ) { + if(FRand() > 0.5) { + bWantsToAimAtFeet = true; + } + } + else if( Skill >= 3.0 ) { + if(FRand() > 0.25) { + bWantsToAimAtFeet = true; + } + } + } + if ( FiredAmmunition.bTrySplash && (Pawn(Target) != none) && (((Target.Physics == PHYS_Falling) + && (Pawn.Location.Z + 80 >= Target.Location.Z)) || ((Pawn.Location.Z + 19 >= Target.Location.Z) + && (bDefendCloseRange || bWantsToAimAtFeet))) ) { + HitActor = Trace(HitLocation, HitNormal, FireSpot - vect(0,0,1) * (Target.CollisionHeight + 10), FireSpot, false); + + bClean = (HitActor == none); + //So if we're too close, and not jumping, bClean is false + //same distance but jumping, bClean is true + if ( !bClean ) { + FireSpot = HitLocation + vect(0,0,3); + bClean = FastTrace(FireSpot, ProjStart); + } + else + bClean = ( (Target.Physics == PHYS_Falling) && FastTrace(FireSpot, ProjStart) ); + /** + * Update the aimAtFeetZDelta variable with the appropriate offset + * once the Husk decides to aim at the target's feet. Update the + * default property so all Super Husks can access it + */ + if (bClean && TargetDist > 625.0) { + aimAtFeetZDelta= FireSpot.Z - Pawn.Location.Z; + } + } + if ( !bClean ) { + //try middle + FireSpot.Z = Target.Location.Z; + bClean = FastTrace(FireSpot, ProjStart); + } + if ( FiredAmmunition.bTossed && !bClean && bEnemyInfoValid ) { + FireSpot = LastSeenPos; + HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); + if ( HitActor != none ) { + bCanFire = false; + FireSpot += 2 * Target.CollisionHeight * HitNormal; + } + bClean = true; + } + if( !bClean ) { + // try head + FireSpot.Z = Target.Location.Z + 0.9 * Target.CollisionHeight; + bClean = FastTrace(FireSpot, ProjStart); + } + if ( !bClean && (Target == Enemy) && bEnemyInfoValid ) { + FireSpot = LastSeenPos; + if ( Pawn.Location.Z >= LastSeenPos.Z ) + FireSpot.Z -= 0.4 * Enemy.CollisionHeight; + HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); + if ( HitActor != none ) { + FireSpot = LastSeenPos + 2 * Enemy.CollisionHeight * HitNormal; + if ( Monster(Pawn).SplashDamage() && (Skill >= 4) ) { + HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); + if ( HitActor != none ) + FireSpot += 2 * Enemy.CollisionHeight * HitNormal; + } + bCanFire = false; + } + } + // adjust for toss distance + if ( FiredAmmunition.bTossed ) { + FireDir = AdjustToss(projspeed,ProjStart,FireSpot,true); + } + else { + FireDir = FireSpot - ProjStart; + } + FireRotation = Rotator(FireDir); + realYaw = FireRotation.Yaw; + InstantWarnTarget(Target,FiredAmmunition,vector(FireRotation)); + FireRotation.Yaw = SetFireYaw(FireRotation.Yaw + aimerror); + FireDir = vector(FireRotation); + // avoid shooting into wall + FireDist = FMin(VSize(FireSpot-ProjStart), 400); + FireSpot = ProjStart + FireDist * FireDir; + HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); + if ( HitActor != none ) { + if ( HitNormal.Z < 0.7 ) { + FireRotation.Yaw = SetFireYaw(realYaw - aimerror); + FireDir = vector(FireRotation); + FireSpot = ProjStart + FireDist * FireDir; + HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); + } + if ( HitActor != none ) { + FireSpot += HitNormal * 2 * Target.CollisionHeight; + if ( Skill >= 4 ) { + HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); + if ( HitActor != none ) + FireSpot += Target.CollisionHeight * HitNormal; + } + FireDir = Normal(FireSpot - ProjStart); + FireRotation = rotator(FireDir); + } + } + //Make it so the Husk always shoots the ground it the target is close + SetRotation(FireRotation); + return FireRotation; +} +defaultproperties +{ +} diff --git a/sources/Zeds/Mean/MeanZombieScrake.uc b/sources/Zeds/Mean/MeanZombieScrake.uc index 61b7bbb..c29c802 100644 --- a/sources/Zeds/Mean/MeanZombieScrake.uc +++ b/sources/Zeds/Mean/MeanZombieScrake.uc @@ -1,31 +1,46 @@ -class MeanZombieScrake extends NiceZombieScrake; -#exec OBJ LOAD FILE=MeanZedSkins.utx -function RangedAttack(Actor A){ - Super.RangedAttack(A); - if(!bShotAnim){ if(bConfusedState) return; if(float(Health) / HealthMax < 0.75 || lastStunTime >= 0.0){ MovementAnims[0] = 'ChargeF'; GoToState('RunningState'); } - } -} -simulated event SetAnimAction(name NewAction){ - if(Role < Role_AUTHORITY && NewAction == 'ChargeF') PlayAnim('ChargeF', GetOriginalGroundSpeed() * 3.5); - else super.SetAnimAction(NewAction); -} -simulated function Unstun(){ - bCharging = true; - MovementAnims[0] = 'ChargeF'; - super.Unstun(); -} -function TakeDamageClient(int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, float headshotLevel, float lockonTime){ - Super.TakeDamageClient(Damage, instigatedBy, hitLocation, momentum, damageType, headshotLevel, lockonTime); - if(bIsStunned && Health > 0 && (headshotLevel <= 0.0) && Level.TimeSeconds > LastStunTime + 0.1) Unstun(); -} -function TakeFireDamage(int Damage, Pawn Instigator){ - Super.TakeFireDamage(Damage, Instigator); - if(bIsStunned && Health > 0 && Damage > 150 && Level.TimeSeconds > LastStunTime + 0.1) Unstun(); -} -function bool CheckMiniFlinch(int flinchScore, Pawn instigatedBy, Vector hitLocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI){ - if((ClassIsChildOf(damageType, class 'DamTypeMelee') || ClassIsChildOf(damageType, class 'NiceDamageTypeVetBerserker')) && !KFPRI.ClientVeteranSkill.Static.CanMeleeStun() && (headshotLevel <= 0.0) && flinchScore < 250) return false; - return super.CheckMiniFlinch(flinchScore, instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); -} -defaultproperties -{ MenuName="Mean Scrake" Skins(0)=Shader'MeanZedSkins.scrake_FB' Skins(1)=TexPanner'MeanZedSkins.scrake_saw_panner' -} +class MeanZombieScrake extends NiceZombieScrake; +#exec OBJ LOAD FILE=MeanZedSkins.utx +function RangedAttack(Actor A){ + Super.RangedAttack(A); + if(!bShotAnim){ + if(bConfusedState) + return; + if(float(Health) / HealthMax < 0.75 || lastStunTime >= 0.0){ + MovementAnims[0] = 'ChargeF'; + GoToState('RunningState'); + } + } +} +simulated event SetAnimAction(name NewAction){ + if(Role < Role_AUTHORITY && NewAction == 'ChargeF') + PlayAnim('ChargeF', GetOriginalGroundSpeed() * 3.5); + else + super.SetAnimAction(NewAction); +} +simulated function Unstun(){ + bCharging = true; + MovementAnims[0] = 'ChargeF'; + super.Unstun(); +} +function TakeDamageClient(int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, float headshotLevel, float lockonTime){ + Super.TakeDamageClient(Damage, instigatedBy, hitLocation, momentum, damageType, headshotLevel, lockonTime); + if(bIsStunned && Health > 0 && (headshotLevel <= 0.0) && Level.TimeSeconds > LastStunTime + 0.1) + Unstun(); +} +function TakeFireDamage(int Damage, Pawn Instigator){ + Super.TakeFireDamage(Damage, Instigator); + if(bIsStunned && Health > 0 && Damage > 150 && Level.TimeSeconds > LastStunTime + 0.1) + Unstun(); +} +function bool CheckMiniFlinch(int flinchScore, Pawn instigatedBy, Vector hitLocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI){ + if((ClassIsChildOf(damageType, class 'DamTypeMelee') || ClassIsChildOf(damageType, class 'NiceDamageTypeVetBerserker')) + && !KFPRI.ClientVeteranSkill.Static.CanMeleeStun() && (headshotLevel <= 0.0) && flinchScore < 250) + return false; + return super.CheckMiniFlinch(flinchScore, instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); +} +defaultproperties +{ + MenuName="Mean Scrake" + Skins(0)=Shader'MeanZedSkins.scrake_FB' + Skins(1)=TexPanner'MeanZedSkins.scrake_saw_panner' +} diff --git a/sources/Zeds/Mean/MeanZombieSiren.uc b/sources/Zeds/Mean/MeanZombieSiren.uc index 1960b7e..e9ee3ba 100644 --- a/sources/Zeds/Mean/MeanZombieSiren.uc +++ b/sources/Zeds/Mean/MeanZombieSiren.uc @@ -1,5 +1,10 @@ -class MeanZombieSiren extends NiceZombieSiren; -#exec OBJ LOAD FILE=MeanZedSkins.utx -defaultproperties -{ ScreamRadius=800 ScreamForce=-250000 MenuName="Mean Siren" Skins(0)=FinalBlend'MeanZedSkins.siren_hair_fb' Skins(1)=Combiner'MeanZedSkins.siren_cmb' -} +class MeanZombieSiren extends NiceZombieSiren; +#exec OBJ LOAD FILE=MeanZedSkins.utx +defaultproperties +{ + ScreamRadius=800 + ScreamForce=-250000 + MenuName="Mean Siren" + Skins(0)=FinalBlend'MeanZedSkins.siren_hair_fb' + Skins(1)=Combiner'MeanZedSkins.siren_cmb' +} diff --git a/sources/Zeds/Mean/MeanZombieStalker.uc b/sources/Zeds/Mean/MeanZombieStalker.uc index a2862e5..d42bc0f 100644 --- a/sources/Zeds/Mean/MeanZombieStalker.uc +++ b/sources/Zeds/Mean/MeanZombieStalker.uc @@ -1,128 +1,236 @@ -class MeanZombieStalker extends NiceZombieStalker; -#exec OBJ LOAD FILE=MeanZedSkins.utx -simulated function Tick(float DeltaTime) -{ - Super(NiceMonster).Tick(DeltaTime); - if(Role == ROLE_Authority && bShotAnim && !bWaitForAnim){ if( LookTarget!=none ) { Acceleration = AccelRate * Normal(LookTarget.Location - Location); } - } - if(Level.NetMode == NM_DedicatedServer) return; // Servers aren't interested in this info. - if(bZapped){ // Make sure we check if we need to be cloaked as soon as the zap wears off NextCheckTime = Level.TimeSeconds; - } - else if( Level.TimeSeconds > NextCheckTime && Health > 0 ) - { NextCheckTime = Level.TimeSeconds + 0.5; - if(LocalKFHumanPawn != none && LocalKFHumanPawn.Health > 0 && LocalKFHumanPawn.ShowStalkers() && VSizeSquared(Location - LocalKFHumanPawn.Location) < LocalKFHumanPawn.GetStalkerViewDistanceMulti() * 640000.0) // 640000 = 800 Units bSpotted = True; else bSpotted = false; - if(!bSpotted && !bCloaked && Skins[0] != Combiner'MeanZedSkins.stalker_cmb') UncloakStalker(); else if (Level.TimeSeconds - LastUncloakTime > 1.2){ // if we're uberbrite, turn down the light if( bSpotted && Skins[0] != Finalblend'KFX.StalkerGlow' ){ bUnlit = false; CloakStalker(); } else if(Skins[0] != Shader'MeanZedSkins.stalker_invisible') CloakStalker(); } - } -} -simulated function CloakStalker() -{ - // No cloaking if zapped - if( bZapped ) - { return; - } - if ( bSpotted ) - { if( Level.NetMode == NM_DedicatedServer ) return; - Skins[0] = Finalblend'KFX.StalkerGlow'; Skins[1] = Finalblend'KFX.StalkerGlow'; bUnlit = true; return; - } - if ( !bDecapitated ) // No head, no cloak, honey. updated : Being charred means no cloak either :D Not. - { Visibility = 1; bCloaked = true; - if( Level.NetMode == NM_DedicatedServer ) Return; - Skins[0] = Shader'MeanZedSkins.stalker_invisible'; Skins[1] = Shader'MeanZedSkins.stalker_invisible'; - // Invisible - no shadow if(PlayerShadow != none) PlayerShadow.bShadowActive = false; if(RealTimeShadow != none) RealTimeShadow.Destroy(); - // Remove/disallow projectors on invisible people Projectors.Remove(0, Projectors.Length); bAcceptsProjectors = false; SetOverlayMaterial(Material'KFX.FBDecloakShader', 0.25, true); - } -} -simulated function UnCloakStalker() -{ - if( bZapped ) - { return; - } - if( !bCrispified ) - { LastUncloakTime = Level.TimeSeconds; - Visibility = default.Visibility; bCloaked = false; bUnlit = false; - // 25% chance of our Enemy saying something about us being invisible if( Level.NetMode!=NM_Client && !KFGameType(Level.Game).bDidStalkerInvisibleMessage && FRand()<0.25 && Controller.Enemy!=none && PlayerController(Controller.Enemy.Controller)!=none ) { PlayerController(Controller.Enemy.Controller).Speech('AUTO', 17, ""); KFGameType(Level.Game).bDidStalkerInvisibleMessage = true; } if( Level.NetMode == NM_DedicatedServer ) Return; - if ( Skins[0] != Combiner'MeanZedSkins.stalker_cmb' ) { Skins[1] = FinalBlend'MeanZedSkins.stalker_fb'; Skins[0] = Combiner'MeanZedSkins.stalker_cmb'; - if (PlayerShadow != none) PlayerShadow.bShadowActive = true; - bAcceptsProjectors = true; - SetOverlayMaterial(Material'KFX.FBDecloakShader', 0.25, true); } - } -} -simulated function SetZappedBehavior() -{ - super(NiceMonster).SetZappedBehavior(); - bUnlit = false; - // Handle setting the zed to uncloaked so the zapped overlay works properly - if( Level.Netmode != NM_DedicatedServer ) - { Skins[1] = FinalBlend'MeanZedSkins.stalker_fb'; Skins[0] = Combiner'MeanZedSkins.stalker_cmb'; - if (PlayerShadow != none) PlayerShadow.bShadowActive = true; - bAcceptsProjectors = true; SetOverlayMaterial(Material'KFZED_FX_T.Energy.ZED_overlay_Hit_Shdr', 999, true); - } -} - -function RangedAttack(Actor A) { - if ( bShotAnim || Physics == PHYS_Swimming) return; - else if ( CanAttack(A) ) { bShotAnim = true; SetAnimAction('ClawAndMove'); //PlaySound(sound'Claw2s', SLOT_none); KFTODO: Replace this return; - } -} -// Copied from the Gorefast code -// Overridden to handle playing upper body only attacks when moving -simulated event SetAnimAction(name NewAction) { - if( NewAction=='' ) Return; - ExpectingChannel = AttackAndMoveDoAnimAction(NewAction); - bWaitForAnim= false; - - if( Level.NetMode!=NM_Client ) { AnimAction = NewAction; bResetAnimAct = True; ResetAnimActTime = Level.TimeSeconds+0.3; - } -} -// Copied from the Gorefast code, updated with the stalker attacks -// Handle playing the anim action on the upper body only if we're attacking and moving -simulated function int AttackAndMoveDoAnimAction( name AnimName ) { - local int meleeAnimIndex; - if( AnimName == 'ClawAndMove' ) { meleeAnimIndex = Rand(3); AnimName = meleeAnims[meleeAnimIndex]; - } - if( AnimName=='StalkerSpinAttack' || AnimName=='StalkerAttack1' || AnimName=='JumpAttack') { AnimBlendParams(1, 1.0, 0.0,, FireRootBone); PlayAnim(AnimName,, 0.1, 1); - return 1; - } - return super.DoAnimAction( AnimName ); -} -function bool MeleeDamageTarget(int hitdamage, vector pushdir) { - local bool result; - local float effectStrenght; - local NiceHumanPawn targetPawn; - result = Super(NiceMonster).MeleeDamageTarget(hitdamage, pushdir); - targetPawn = NiceHumanPawn(Controller.Target); - if(result && targetPawn != none && (targetPawn.hmgShieldLevel <= 0 || !class'NiceVeterancyTypes'.static.HasSkill(NicePlayerController(targetPawn.Controller), class'NiceSkillEnforcerFullCounter')) ){ if(targetPawn.ShieldStrength > 100) return result; else if(targetPawn.ShieldStrength < 0) effectStrenght = 1.0; else effectStrenght = (100 - targetPawn.ShieldStrength) * 0.01; class'MeanReplicationInfo'.static .findSZri(targetPawn.PlayerReplicationInfo) .setBleeding(Self, effectStrenght); - } - return result; -} -function RemoveHead() -{ - Super(NiceMonster).RemoveHead(); - if (!bCrispified) - { Skins[1] = FinalBlend'MeanZedSkins.stalker_fb'; Skins[0] = Combiner'MeanZedSkins.stalker_cmb'; - } -} -simulated function PlayDying(class DamageType, vector HitLoc) -{ - Super(NiceMonster).PlayDying(DamageType,HitLoc); - if(bUnlit) bUnlit=!bUnlit; - LocalKFHumanPawn = none; - if (!bCrispified) - { Skins[1] = FinalBlend'MeanZedSkins.stalker_fb'; Skins[0] = Combiner'MeanZedSkins.stalker_cmb'; - } -} -static simulated function PreCacheMaterials(LevelInfo myLevel) -{//should be derived and used. - myLevel.AddPrecacheMaterial(Combiner'MeanZedSkins.stalker_cmb'); - myLevel.AddPrecacheMaterial(Combiner'MeanZedSkins.stalker_env_cmb'); - myLevel.AddPrecacheMaterial(Texture'MeanZedSkins.stalker_diff'); - myLevel.AddPrecacheMaterial(Texture'MeanZedSkins.stalker_spec'); - myLevel.AddPrecacheMaterial(Material'MeanZedSkins.stalker_invisible'); - myLevel.AddPrecacheMaterial(Combiner'MeanZedSkins.StalkerCloakOpacity_cmb'); - myLevel.AddPrecacheMaterial(Material'MeanZedSkins.StalkerCloakEnv_rot'); - myLevel.AddPrecacheMaterial(Material'MeanZedSkins.stalker_opacity_osc'); - myLevel.AddPrecacheMaterial(Material'KFCharacters.StalkerSkin'); -} -defaultproperties -{ MeleeDamage=6 MenuName="Mean Stalker" Skins(0)=Shader'MeanZedSkins.stalker_invisible' Skins(1)=Shader'MeanZedSkins.stalker_invisible' -} +class MeanZombieStalker extends NiceZombieStalker; +#exec OBJ LOAD FILE=MeanZedSkins.utx +simulated function Tick(float DeltaTime) +{ + Super(NiceMonster).Tick(DeltaTime); + if(Role == ROLE_Authority && bShotAnim && !bWaitForAnim){ + if( LookTarget!=none ) { + Acceleration = AccelRate * Normal(LookTarget.Location - Location); + } + } + if(Level.NetMode == NM_DedicatedServer) + return; // Servers aren't interested in this info. + if(bZapped){ + // Make sure we check if we need to be cloaked as soon as the zap wears off + NextCheckTime = Level.TimeSeconds; + } + else if( Level.TimeSeconds > NextCheckTime && Health > 0 ) + { + NextCheckTime = Level.TimeSeconds + 0.5; + + if(LocalKFHumanPawn != none && LocalKFHumanPawn.Health > 0 && LocalKFHumanPawn.ShowStalkers() && + VSizeSquared(Location - LocalKFHumanPawn.Location) < LocalKFHumanPawn.GetStalkerViewDistanceMulti() * 640000.0) // 640000 = 800 Units + bSpotted = True; + else + bSpotted = false; + + if(!bSpotted && !bCloaked && Skins[0] != Combiner'MeanZedSkins.stalker_cmb') + UncloakStalker(); + else if (Level.TimeSeconds - LastUncloakTime > 1.2){ + // if we're uberbrite, turn down the light + if( bSpotted && Skins[0] != Finalblend'KFX.StalkerGlow' ){ + bUnlit = false; + CloakStalker(); + } + else if(Skins[0] != Shader'MeanZedSkins.stalker_invisible') + CloakStalker(); + } + } +} +simulated function CloakStalker() +{ + // No cloaking if zapped + if( bZapped ) + { + return; + } + if ( bSpotted ) + { + if( Level.NetMode == NM_DedicatedServer ) + return; + + Skins[0] = Finalblend'KFX.StalkerGlow'; + Skins[1] = Finalblend'KFX.StalkerGlow'; + bUnlit = true; + return; + } + if ( !bDecapitated ) // No head, no cloak, honey. updated : Being charred means no cloak either :D Not. + { + Visibility = 1; + bCloaked = true; + + if( Level.NetMode == NM_DedicatedServer ) + Return; + + Skins[0] = Shader'MeanZedSkins.stalker_invisible'; + Skins[1] = Shader'MeanZedSkins.stalker_invisible'; + + // Invisible - no shadow + if(PlayerShadow != none) + PlayerShadow.bShadowActive = false; + if(RealTimeShadow != none) + RealTimeShadow.Destroy(); + + // Remove/disallow projectors on invisible people + Projectors.Remove(0, Projectors.Length); + bAcceptsProjectors = false; + SetOverlayMaterial(Material'KFX.FBDecloakShader', 0.25, true); + } +} +simulated function UnCloakStalker() +{ + if( bZapped ) + { + return; + } + if( !bCrispified ) + { + LastUncloakTime = Level.TimeSeconds; + + Visibility = default.Visibility; + bCloaked = false; + bUnlit = false; + + // 25% chance of our Enemy saying something about us being invisible + if( Level.NetMode!=NM_Client && !KFGameType(Level.Game).bDidStalkerInvisibleMessage && FRand()<0.25 && Controller.Enemy!=none && + PlayerController(Controller.Enemy.Controller)!=none ) + { + PlayerController(Controller.Enemy.Controller).Speech('AUTO', 17, ""); + KFGameType(Level.Game).bDidStalkerInvisibleMessage = true; + } + if( Level.NetMode == NM_DedicatedServer ) + Return; + + if ( Skins[0] != Combiner'MeanZedSkins.stalker_cmb' ) + { + Skins[1] = FinalBlend'MeanZedSkins.stalker_fb'; + Skins[0] = Combiner'MeanZedSkins.stalker_cmb'; + + if (PlayerShadow != none) + PlayerShadow.bShadowActive = true; + + bAcceptsProjectors = true; + + SetOverlayMaterial(Material'KFX.FBDecloakShader', 0.25, true); + } + } +} +simulated function SetZappedBehavior() +{ + super(NiceMonster).SetZappedBehavior(); + bUnlit = false; + // Handle setting the zed to uncloaked so the zapped overlay works properly + if( Level.Netmode != NM_DedicatedServer ) + { + Skins[1] = FinalBlend'MeanZedSkins.stalker_fb'; + Skins[0] = Combiner'MeanZedSkins.stalker_cmb'; + + if (PlayerShadow != none) + PlayerShadow.bShadowActive = true; + + bAcceptsProjectors = true; + SetOverlayMaterial(Material'KFZED_FX_T.Energy.ZED_overlay_Hit_Shdr', 999, true); + } +} + +function RangedAttack(Actor A) { + if ( bShotAnim || Physics == PHYS_Swimming) + return; + else if ( CanAttack(A) ) { + bShotAnim = true; + SetAnimAction('ClawAndMove'); + //PlaySound(sound'Claw2s', SLOT_none); KFTODO: Replace this + return; + } +} +// Copied from the Gorefast code +// Overridden to handle playing upper body only attacks when moving +simulated event SetAnimAction(name NewAction) { + if( NewAction=='' ) + Return; + ExpectingChannel = AttackAndMoveDoAnimAction(NewAction); + bWaitForAnim= false; + + if( Level.NetMode!=NM_Client ) { + AnimAction = NewAction; + bResetAnimAct = True; + ResetAnimActTime = Level.TimeSeconds+0.3; + } +} +// Copied from the Gorefast code, updated with the stalker attacks +// Handle playing the anim action on the upper body only if we're attacking and moving +simulated function int AttackAndMoveDoAnimAction( name AnimName ) { + local int meleeAnimIndex; + if( AnimName == 'ClawAndMove' ) { + meleeAnimIndex = Rand(3); + AnimName = meleeAnims[meleeAnimIndex]; + } + if( AnimName=='StalkerSpinAttack' || AnimName=='StalkerAttack1' || AnimName=='JumpAttack') { + AnimBlendParams(1, 1.0, 0.0,, FireRootBone); + PlayAnim(AnimName,, 0.1, 1); + + return 1; + } + return super.DoAnimAction( AnimName ); +} +function bool MeleeDamageTarget(int hitdamage, vector pushdir) { + local bool result; + local float effectStrenght; + local NiceHumanPawn targetPawn; + result = Super(NiceMonster).MeleeDamageTarget(hitdamage, pushdir); + targetPawn = NiceHumanPawn(Controller.Target); + if(result && targetPawn != none && (targetPawn.hmgShieldLevel <= 0 || + !class'NiceVeterancyTypes'.static.HasSkill(NicePlayerController(targetPawn.Controller), + class'NiceSkillEnforcerFullCounter')) ){ + if(targetPawn.ShieldStrength > 100) + return result; + else if(targetPawn.ShieldStrength < 0) + effectStrenght = 1.0; + else + effectStrenght = (100 - targetPawn.ShieldStrength) * 0.01; + class'MeanReplicationInfo'.static + .findSZri(targetPawn.PlayerReplicationInfo) + .setBleeding(Self, effectStrenght); + } + return result; +} +function RemoveHead() +{ + Super(NiceMonster).RemoveHead(); + if (!bCrispified) + { + Skins[1] = FinalBlend'MeanZedSkins.stalker_fb'; + Skins[0] = Combiner'MeanZedSkins.stalker_cmb'; + } +} +simulated function PlayDying(class DamageType, vector HitLoc) +{ + Super(NiceMonster).PlayDying(DamageType,HitLoc); + if(bUnlit) + bUnlit=!bUnlit; + LocalKFHumanPawn = none; + if (!bCrispified) + { + Skins[1] = FinalBlend'MeanZedSkins.stalker_fb'; + Skins[0] = Combiner'MeanZedSkins.stalker_cmb'; + } +} +static simulated function PreCacheMaterials(LevelInfo myLevel) +{//should be derived and used. + myLevel.AddPrecacheMaterial(Combiner'MeanZedSkins.stalker_cmb'); + myLevel.AddPrecacheMaterial(Combiner'MeanZedSkins.stalker_env_cmb'); + myLevel.AddPrecacheMaterial(Texture'MeanZedSkins.stalker_diff'); + myLevel.AddPrecacheMaterial(Texture'MeanZedSkins.stalker_spec'); + myLevel.AddPrecacheMaterial(Material'MeanZedSkins.stalker_invisible'); + myLevel.AddPrecacheMaterial(Combiner'MeanZedSkins.StalkerCloakOpacity_cmb'); + myLevel.AddPrecacheMaterial(Material'MeanZedSkins.StalkerCloakEnv_rot'); + myLevel.AddPrecacheMaterial(Material'MeanZedSkins.stalker_opacity_osc'); + myLevel.AddPrecacheMaterial(Material'KFCharacters.StalkerSkin'); +} +defaultproperties +{ + MeleeDamage=6 + MenuName="Mean Stalker" + Skins(0)=Shader'MeanZedSkins.stalker_invisible' + Skins(1)=Shader'MeanZedSkins.stalker_invisible' +} diff --git a/sources/Zeds/Mean/NiceDamTypeStalkerBleed.uc b/sources/Zeds/Mean/NiceDamTypeStalkerBleed.uc index ea67510..c8c22ff 100644 --- a/sources/Zeds/Mean/NiceDamTypeStalkerBleed.uc +++ b/sources/Zeds/Mean/NiceDamTypeStalkerBleed.uc @@ -1,4 +1,5 @@ -class NiceDamTypeStalkerBleed extends NiceZedSlashingDamageType; -defaultproperties -{ bArmorStops=False -} +class NiceDamTypeStalkerBleed extends NiceZedSlashingDamageType; +defaultproperties +{ + bArmorStops=False +} diff --git a/sources/Zeds/MeanReplicationInfo.uc b/sources/Zeds/MeanReplicationInfo.uc index dcf4cb8..a6684a5 100644 --- a/sources/Zeds/MeanReplicationInfo.uc +++ b/sources/Zeds/MeanReplicationInfo.uc @@ -1,55 +1,82 @@ -// Copy pasted from super zombies mutator with small alterations -class MeanReplicationInfo extends ReplicationInfo; -struct BleedingState { - var float nextBleedTime; - var Pawn instigator; - var int count; -}; -var PlayerReplicationInfo ownerPRI; -var bool isBleeding; -var int maxBleedCount; -var BleedingState bleedState; -var float bleedPeriod; -var float bleedLevel; -replication { - reliable if (bNetDirty && Role == ROLE_Authority) isBleeding, ownerPRI; -} -// Returns bleed damage, corresponding to given bleed level and damage scale. -// Rand(7) should be used as a scale. -// Separate function created to allow for lowest/highest damage value computing. -function int calcBleedDamage(float level, int scale){ - return level * (3 + scale); -} -function Tick(float DeltaTime) { - local PlayerController ownerCtrllr; - local bool amAlive; - local float bleedDamage; - ownerCtrllr = PlayerController(Owner); - amAlive = ownerCtrllr != none && ownerCtrllr.Pawn != none && ownerCtrllr.Pawn.Health > 0; - if(amAlive && bleedState.count > 0) { if(bleedState.nextBleedTime < Level.TimeSeconds) { bleedState.count--; bleedState.nextBleedTime+= bleedPeriod; // Fix bleeding when stalker dies bleedDamage = calcBleedDamage(bleedLevel, rand(7)); if(bleedDamage < 1.0) stopBleeding(); if(bleedState.instigator != none) ownerCtrllr.Pawn.TakeDamage(bleedDamage, bleedState.instigator, ownerCtrllr.Pawn.Location, vect(0, 0, 0), class'NiceDamTypeStalkerBleed'); else ownerCtrllr.Pawn.TakeDamage(bleedDamage, ownerCtrllr.Pawn, ownerCtrllr.Pawn.Location, vect(0, 0, 0), class'NiceDamTypeStalkerBleed'); if (ownerCtrllr.Pawn.isA('KFPawn')) { KFPawn(ownerCtrllr.Pawn).HealthToGive -= 2 * bleedLevel; } } - } else { isBleeding= false; - } -} -function stopBleeding(){ - isBleeding = false; - bleedState.count = 0; -} -function setBleeding(Pawn instigator, float effectStrenght) { - // Can max possible damage do anything? If no, then don't even bother. - if(calcBleedDamage(effectStrenght, 7) < 1.0) return; - bleedState.instigator = instigator; - bleedState.count = maxBleedCount; - bleedLevel = effectStrenght; - if(!isBleeding){ bleedState.nextBleedTime = Level.TimeSeconds; isBleeding = true; - } -} -static function MeanReplicationInfo findSZri(PlayerReplicationInfo pri) { - local MeanReplicationInfo repInfo; - if(pri == none) return none; - foreach pri.DynamicActors(Class'MeanReplicationInfo', repInfo) if(repInfo.ownerPRI == pri) return repInfo; - - return none; -} -defaultproperties -{ maxBleedCount=7 bleedPeriod=1.500000 -} +// Copy pasted from super zombies mutator with small alterations +class MeanReplicationInfo extends ReplicationInfo; +struct BleedingState { + var float nextBleedTime; + var Pawn instigator; + var int count; +}; +var PlayerReplicationInfo ownerPRI; +var bool isBleeding; +var int maxBleedCount; +var BleedingState bleedState; +var float bleedPeriod; +var float bleedLevel; +replication { + reliable if (bNetDirty && Role == ROLE_Authority) + isBleeding, ownerPRI; +} +// Returns bleed damage, corresponding to given bleed level and damage scale. +// Rand(7) should be used as a scale. +// Separate function created to allow for lowest/highest damage value computing. +function int calcBleedDamage(float level, int scale){ + return level * (3 + scale); +} +function Tick(float DeltaTime) { + local PlayerController ownerCtrllr; + local bool amAlive; + local float bleedDamage; + ownerCtrllr = PlayerController(Owner); + amAlive = ownerCtrllr != none && ownerCtrllr.Pawn != none && ownerCtrllr.Pawn.Health > 0; + if(amAlive && bleedState.count > 0) { + if(bleedState.nextBleedTime < Level.TimeSeconds) { + bleedState.count--; + bleedState.nextBleedTime+= bleedPeriod; + // Fix bleeding when stalker dies + bleedDamage = calcBleedDamage(bleedLevel, rand(7)); + if(bleedDamage < 1.0) + stopBleeding(); + if(bleedState.instigator != none) + ownerCtrllr.Pawn.TakeDamage(bleedDamage, bleedState.instigator, ownerCtrllr.Pawn.Location, + vect(0, 0, 0), class'NiceDamTypeStalkerBleed'); + else + ownerCtrllr.Pawn.TakeDamage(bleedDamage, ownerCtrllr.Pawn, ownerCtrllr.Pawn.Location, + vect(0, 0, 0), class'NiceDamTypeStalkerBleed'); + if (ownerCtrllr.Pawn.isA('KFPawn')) { + KFPawn(ownerCtrllr.Pawn).HealthToGive -= 2 * bleedLevel; + } + } + } else { + isBleeding= false; + } +} +function stopBleeding(){ + isBleeding = false; + bleedState.count = 0; +} +function setBleeding(Pawn instigator, float effectStrenght) { + // Can max possible damage do anything? If no, then don't even bother. + if(calcBleedDamage(effectStrenght, 7) < 1.0) + return; + bleedState.instigator = instigator; + bleedState.count = maxBleedCount; + bleedLevel = effectStrenght; + if(!isBleeding){ + bleedState.nextBleedTime = Level.TimeSeconds; + isBleeding = true; + } +} +static function MeanReplicationInfo findSZri(PlayerReplicationInfo pri) { + local MeanReplicationInfo repInfo; + if(pri == none) + return none; + foreach pri.DynamicActors(Class'MeanReplicationInfo', repInfo) + if(repInfo.ownerPRI == pri) + return repInfo; + + return none; +} +defaultproperties +{ + maxBleedCount=7 + bleedPeriod=1.500000 +} diff --git a/sources/Zeds/MeanVoting.uc b/sources/Zeds/MeanVoting.uc index 9dbb923..6cb39dd 100644 --- a/sources/Zeds/MeanVoting.uc +++ b/sources/Zeds/MeanVoting.uc @@ -1,58 +1,91 @@ -class MeanVoting extends ScrnVotingOptions; -var NicePack Mut; -function int GetGroupVoteIndex(PlayerController Sender, string Group, string Key, out string Value, out string VoteInfo) -{ - local int ZedNumber; - local int BoolValue; - local bool bEnable; - ZedNumber = Mut.ZedNumber(Key); - BoolValue = TryStrToBool(Value); - if(BoolValue == -1) return VOTE_ILLEGAL; - bEnable = (BoolValue == 1); - if(Key ~= "ALL") return 0; - if (ZedNumber == -1) return VOTE_UNKNOWN; - if(bEnable == Mut.ZedDatabase[ZedNumber].bNeedsReplacement) return VOTE_NOEFECT; - else return ZedNumber + 1; - return VOTE_UNKNOWN; -} -function ApplyVoteValue(int VoteIndex, string VoteValue) -{ - local int i; - local int BoolValue; - local bool bEnable; - local bool bAffectsAll; - bAffectsAll = false; - if(VoteIndex == 0) bAffectsAll = true; - else VoteIndex --; - BoolValue = TryStrToBool(VoteValue); - if ( BoolValue == -1 ) return; - bEnable = (BoolValue == 1); - if(!bAffectsAll) Mut.ZedDatabase[VoteIndex].bNeedsReplacement = bEnable; - else{ for(i = 0; i <= Mut.lastStandardZed;i ++) Mut.ZedDatabase[i].bNeedsReplacement = bEnable; - } - if(Mut.ZedDatabase[VoteIndex].ZedName ~= "CLOT" || bAffectsAll) Mut.bReplaceClot = bEnable; - if(Mut.ZedDatabase[VoteIndex].ZedName ~= "CRAWLER" || bAffectsAll) Mut.bReplaceCrawler = bEnable; - if(Mut.ZedDatabase[VoteIndex].ZedName ~= "STALKER" || bAffectsAll) Mut.bReplaceStalker = bEnable; - if(Mut.ZedDatabase[VoteIndex].ZedName ~= "GOREFAST" || bAffectsAll) Mut.bReplaceGorefast = bEnable; - if(Mut.ZedDatabase[VoteIndex].ZedName ~= "BLOAT" || bAffectsAll) Mut.bReplaceBloat = bEnable; - if(Mut.ZedDatabase[VoteIndex].ZedName ~= "SIREN" || bAffectsAll) Mut.bReplaceSiren = bEnable; - if(Mut.ZedDatabase[VoteIndex].ZedName ~= "HUSK" || bAffectsAll) Mut.bReplaceHusk = bEnable; - if(Mut.ZedDatabase[VoteIndex].ZedName ~= "SCRAKE" || bAffectsAll) Mut.bReplaceScrake = bEnable; - if(Mut.ZedDatabase[VoteIndex].ZedName ~= "FLESHPOUND" || bAffectsAll) Mut.bReplaceFleshpound = bEnable; - Mut.SaveConfig(); - VotingHandler.BroadcastMessage(strRestartRequired); -} -function SendGroupHelp(PlayerController Sender, string Group) -{ - local string s; - local int i; - local int ln; - ln = 1; - s $= "ALL"; - for ( i=0; i <= Mut.lastStandardZed; ++i ) { if ( Mut.ZedDatabase[i].bNeedsReplacement ) s @= "%g"; else s @= "%r"; s $= Caps(Mut.ZedDatabase[i].ZedName); if ( len(s) > 80 ) { // move to new line GroupInfo[ln++] = VotingHandler.ParseHelpLine(default.GroupInfo[1] @ s); s = ""; } } - GroupInfo[ln] = VotingHandler.ParseHelpLine(default.GroupInfo[1] @ s); - super.SendGroupHelp(Sender, Group); -} -defaultproperties -{ DefaultGroup="MEAN" HelpInfo(0)="%pMEAN %y %gON%w|%rOFF %w Add|Remove mean zeds from the game. Type %bMVOTE MEAN HELP %w for more info." GroupInfo(0)="%MEAN %y %gON%w|%rOFF %w Add or remove mean zeds from the game." GroupInfo(1)="%wAvaliable mean zeds:" -} +class MeanVoting extends ScrnVotingOptions; +var NicePack Mut; +function int GetGroupVoteIndex(PlayerController Sender, string Group, string Key, out string Value, out string VoteInfo) +{ + local int ZedNumber; + local int BoolValue; + local bool bEnable; + ZedNumber = Mut.ZedNumber(Key); + BoolValue = TryStrToBool(Value); + if(BoolValue == -1) + return VOTE_ILLEGAL; + bEnable = (BoolValue == 1); + if(Key ~= "ALL") + return 0; + if (ZedNumber == -1) + return VOTE_UNKNOWN; + if(bEnable == Mut.ZedDatabase[ZedNumber].bNeedsReplacement) + return VOTE_NOEFECT; + else + return ZedNumber + 1; + return VOTE_UNKNOWN; +} +function ApplyVoteValue(int VoteIndex, string VoteValue) +{ + local int i; + local int BoolValue; + local bool bEnable; + local bool bAffectsAll; + bAffectsAll = false; + if(VoteIndex == 0) + bAffectsAll = true; + else + VoteIndex --; + BoolValue = TryStrToBool(VoteValue); + if ( BoolValue == -1 ) + return; + bEnable = (BoolValue == 1); + if(!bAffectsAll) + Mut.ZedDatabase[VoteIndex].bNeedsReplacement = bEnable; + else{ + for(i = 0; i <= Mut.lastStandardZed;i ++) + Mut.ZedDatabase[i].bNeedsReplacement = bEnable; + } + if(Mut.ZedDatabase[VoteIndex].ZedName ~= "CLOT" || bAffectsAll) + Mut.bReplaceClot = bEnable; + if(Mut.ZedDatabase[VoteIndex].ZedName ~= "CRAWLER" || bAffectsAll) + Mut.bReplaceCrawler = bEnable; + if(Mut.ZedDatabase[VoteIndex].ZedName ~= "STALKER" || bAffectsAll) + Mut.bReplaceStalker = bEnable; + if(Mut.ZedDatabase[VoteIndex].ZedName ~= "GOREFAST" || bAffectsAll) + Mut.bReplaceGorefast = bEnable; + if(Mut.ZedDatabase[VoteIndex].ZedName ~= "BLOAT" || bAffectsAll) + Mut.bReplaceBloat = bEnable; + if(Mut.ZedDatabase[VoteIndex].ZedName ~= "SIREN" || bAffectsAll) + Mut.bReplaceSiren = bEnable; + if(Mut.ZedDatabase[VoteIndex].ZedName ~= "HUSK" || bAffectsAll) + Mut.bReplaceHusk = bEnable; + if(Mut.ZedDatabase[VoteIndex].ZedName ~= "SCRAKE" || bAffectsAll) + Mut.bReplaceScrake = bEnable; + if(Mut.ZedDatabase[VoteIndex].ZedName ~= "FLESHPOUND" || bAffectsAll) + Mut.bReplaceFleshpound = bEnable; + Mut.SaveConfig(); + VotingHandler.BroadcastMessage(strRestartRequired); +} +function SendGroupHelp(PlayerController Sender, string Group) +{ + local string s; + local int i; + local int ln; + ln = 1; + s $= "ALL"; + for ( i=0; i <= Mut.lastStandardZed; ++i ) { + if ( Mut.ZedDatabase[i].bNeedsReplacement ) + s @= "%g"; + else + s @= "%r"; + s $= Caps(Mut.ZedDatabase[i].ZedName); if ( len(s) > 80 ) { + // move to new line + GroupInfo[ln++] = VotingHandler.ParseHelpLine(default.GroupInfo[1] @ s); + s = ""; + } } + GroupInfo[ln] = VotingHandler.ParseHelpLine(default.GroupInfo[1] @ s); + super.SendGroupHelp(Sender, Group); +} +defaultproperties +{ + DefaultGroup="MEAN" + HelpInfo(0)="%pMEAN %y %gON%w|%rOFF %w Add|Remove mean zeds from the game. Type %bMVOTE MEAN HELP %w for more info." + GroupInfo(0)="%MEAN %y %gON%w|%rOFF %w Add or remove mean zeds from the game." + GroupInfo(1)="%wAvaliable mean zeds:" +} diff --git a/sources/Zeds/Nice/NiceBossHPNeedle.uc b/sources/Zeds/Nice/NiceBossHPNeedle.uc index 0ebd6b5..2614304 100644 --- a/sources/Zeds/Nice/NiceBossHPNeedle.uc +++ b/sources/Zeds/Nice/NiceBossHPNeedle.uc @@ -1,51 +1,90 @@ -class NiceBossHPNeedle extends Decoration - NotPlaceable; -#exec obj load file="NewPatchSM.usx" -simulated function DroppedNow() -{ - SetCollision(True); - SetPhysics(PHYS_Falling); - bFixedRotationDir = True; - RotationRate = RotRand(True); -} -simulated function HitWall( vector HitNormal, actor HitWall ) -{ - local rotator R; - if( VSize(Velocity)<40 ) - { SetPhysics(PHYS_none); R.Roll = Rand(65536); R.Yaw = Rand(65536); SetRotation(R); Return; - } - Velocity = MirrorVectorByNormal(Velocity,HitNormal)*0.75; - if( HitWall!=none && HitWall.Physics!=PHYS_none ) Velocity+=HitWall.Velocity; -} -simulated function Landed( vector HitNormal ) -{ - HitWall(HitNormal,none); -} -function TakeDamage( int NDamage, Pawn instigatedBy, Vector hitlocation, Vector momentum, class damageType, optional int HitIndex) -{ - if( Physics==PHYS_none ) - { SetPhysics(PHYS_Falling); bFixedRotationDir = True; RotationRate = RotRand(True); Velocity = vect(0,0,0); - } - Velocity+=momentum/10; -} -simulated function Destroyed(); -function Bump( actor Other ); -singular function PhysicsVolumeChange( PhysicsVolume NewVolume ); -// Overriden so it doesn't damage the patriarch when he drops a needle! -singular function BaseChange() -{ - if( Velocity.Z < -500 ) TakeDamage( (1-Velocity.Z/30),Instigator,Location,vect(0,0,0) , class'Crushed'); - if( base == none ) - { if ( !bInterpolating && bPushable && (Physics == PHYS_none) ) SetPhysics(PHYS_Falling); - } - else if( Pawn(Base) != none ) - { //Base.TakeDamage( (1-Velocity.Z/400)* mass/Base.Mass,Instigator,Location,0.5 * Velocity , class'Crushed'); Velocity.Z = 100; if (FRand() < 0.5) Velocity.X += 70; else Velocity.Y += 70; SetPhysics(PHYS_Falling); - } - else if( Decoration(Base)!=none && Velocity.Z<-500 ) - { Base.TakeDamage((1 - Mass/Base.Mass * Velocity.Z/30), Instigator, Location, 0.2 * Velocity, class'Crushed'); Velocity.Z = 100; if (FRand() < 0.5) Velocity.X += 70; else Velocity.Y += 70; SetPhysics(PHYS_Falling); - } - else instigator = none; -} -defaultproperties -{ DrawType=DT_StaticMesh StaticMesh=StaticMesh'NewPatchSM.BossSyringe' bStatic=False RemoteRole=ROLE_None LifeSpan=300.000000 CollisionRadius=4.000000 CollisionHeight=4.000000 bCollideWorld=True bProjTarget=True bBounce=True -} +class NiceBossHPNeedle extends Decoration + NotPlaceable; +#exec obj load file="NewPatchSM.usx" +simulated function DroppedNow() +{ + SetCollision(True); + SetPhysics(PHYS_Falling); + bFixedRotationDir = True; + RotationRate = RotRand(True); +} +simulated function HitWall( vector HitNormal, actor HitWall ) +{ + local rotator R; + if( VSize(Velocity)<40 ) + { + SetPhysics(PHYS_none); + R.Roll = Rand(65536); + R.Yaw = Rand(65536); + SetRotation(R); + Return; + } + Velocity = MirrorVectorByNormal(Velocity,HitNormal)*0.75; + if( HitWall!=none && HitWall.Physics!=PHYS_none ) + Velocity+=HitWall.Velocity; +} +simulated function Landed( vector HitNormal ) +{ + HitWall(HitNormal,none); +} +function TakeDamage( int NDamage, Pawn instigatedBy, Vector hitlocation, + Vector momentum, class damageType, optional int HitIndex) +{ + if( Physics==PHYS_none ) + { + SetPhysics(PHYS_Falling); + bFixedRotationDir = True; + RotationRate = RotRand(True); + Velocity = vect(0,0,0); + } + Velocity+=momentum/10; +} +simulated function Destroyed(); +function Bump( actor Other ); +singular function PhysicsVolumeChange( PhysicsVolume NewVolume ); +// Overriden so it doesn't damage the patriarch when he drops a needle! +singular function BaseChange() +{ + if( Velocity.Z < -500 ) + TakeDamage( (1-Velocity.Z/30),Instigator,Location,vect(0,0,0) , class'Crushed'); + if( base == none ) + { + if ( !bInterpolating && bPushable && (Physics == PHYS_none) ) + SetPhysics(PHYS_Falling); + } + else if( Pawn(Base) != none ) + { + //Base.TakeDamage( (1-Velocity.Z/400)* mass/Base.Mass,Instigator,Location,0.5 * Velocity , class'Crushed'); + Velocity.Z = 100; + if (FRand() < 0.5) + Velocity.X += 70; + else + Velocity.Y += 70; + SetPhysics(PHYS_Falling); + } + else if( Decoration(Base)!=none && Velocity.Z<-500 ) + { + Base.TakeDamage((1 - Mass/Base.Mass * Velocity.Z/30), Instigator, Location, 0.2 * Velocity, class'Crushed'); + Velocity.Z = 100; + if (FRand() < 0.5) + Velocity.X += 70; + else + Velocity.Y += 70; + SetPhysics(PHYS_Falling); + } + else + instigator = none; +} +defaultproperties +{ + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'NewPatchSM.BossSyringe' + bStatic=False + RemoteRole=ROLE_None + LifeSpan=300.000000 + CollisionRadius=4.000000 + CollisionHeight=4.000000 + bCollideWorld=True + bProjTarget=True + bBounce=True +} diff --git a/sources/Zeds/Nice/NiceBossLAWProj.uc b/sources/Zeds/Nice/NiceBossLAWProj.uc index 5c6c8bd..918e153 100644 --- a/sources/Zeds/Nice/NiceBossLAWProj.uc +++ b/sources/Zeds/Nice/NiceBossLAWProj.uc @@ -1,14 +1,21 @@ -class NiceBossLAWProj extends LAWProj; -//----------------------------------------------------------------------------- -// PostBeginPlay -//----------------------------------------------------------------------------- -simulated function PostBeginPlay() -{ - // Difficulty Scaling - if(Level.Game != none){ if(Level.Game.GameDifficulty >= 5.0) // Hell on Earth & Suicidal damage = default.damage * 1.3; else damage = default.damage * 1.0; - } - super.PostBeginPlay(); -} -defaultproperties -{ ArmDistSquared=0.000000 Damage=200.000000 MyDamageType=Class'KFMod.DamTypeFrag' -} +class NiceBossLAWProj extends LAWProj; +//----------------------------------------------------------------------------- +// PostBeginPlay +//----------------------------------------------------------------------------- +simulated function PostBeginPlay() +{ + // Difficulty Scaling + if(Level.Game != none){ + if(Level.Game.GameDifficulty >= 5.0) // Hell on Earth & Suicidal + damage = default.damage * 1.3; + else + damage = default.damage * 1.0; + } + super.PostBeginPlay(); +} +defaultproperties +{ + ArmDistSquared=0.000000 + Damage=200.000000 + MyDamageType=Class'KFMod.DamTypeFrag' +} diff --git a/sources/Zeds/Nice/NiceDamTypePoundCrushed.uc b/sources/Zeds/Nice/NiceDamTypePoundCrushed.uc index 09bce37..6e368bc 100644 --- a/sources/Zeds/Nice/NiceDamTypePoundCrushed.uc +++ b/sources/Zeds/Nice/NiceDamTypePoundCrushed.uc @@ -1,5 +1,17 @@ -class NiceDamTypePoundCrushed extends NiceZedMeleeDamageType - abstract; -defaultproperties -{ DeathString="%o was pounded by %k." FemaleSuicide="%o was pounded." MaleSuicide="%o was pounded." bArmorStops=False bLocationalHit=False bThrowRagdoll=True bExtraMomentumZ=True GibPerterbation=1.000000 KDamageImpulse=7000.000000 KDeathVel=350.000000 KDeathUpKick=100.000000 HumanObliterationThreshhold=500 -} +class NiceDamTypePoundCrushed extends NiceZedMeleeDamageType + abstract; +defaultproperties +{ + DeathString="%o was pounded by %k." + FemaleSuicide="%o was pounded." + MaleSuicide="%o was pounded." + bArmorStops=False + bLocationalHit=False + bThrowRagdoll=True + bExtraMomentumZ=True + GibPerterbation=1.000000 + KDamageImpulse=7000.000000 + KDeathVel=350.000000 + KDeathUpKick=100.000000 + HumanObliterationThreshhold=500 +} diff --git a/sources/Zeds/Nice/NiceHuskFireProjectile.uc b/sources/Zeds/Nice/NiceHuskFireProjectile.uc index 0246b13..1de5787 100644 --- a/sources/Zeds/Nice/NiceHuskFireProjectile.uc +++ b/sources/Zeds/Nice/NiceHuskFireProjectile.uc @@ -1,127 +1,292 @@ -class NiceHuskFireProjectile extends LAWProj; -var Emitter FlameTrail; -var xEmitter Trail; -var class MyAdditionalDamageType; -var float additionalDamagePart; -//----------------------------------------------------------------------------- -// PostBeginPlay -//----------------------------------------------------------------------------- -simulated function PostBeginPlay() -{ - if ( Level.NetMode != NM_DedicatedServer ) - { if ( !PhysicsVolume.bWaterVolume ) { FlameTrail = Spawn(class'FlameThrowerFlameB',self); Trail = Spawn(class'FlameThrowerFlame',self); } - } - // Difficulty Scaling - if (Level.Game != none) - { if(Level.Game.GameDifficulty >= 5.0) // Hell on Earth & Suicidal damage = default.damage * 1.3; else damage = default.damage * 1.0; - } - OrigLoc = Location; - if( !bDud ) - { Dir = vector(Rotation); Velocity = speed * Dir; - } - super(ROBallisticProjectile).PostBeginPlay(); -} -simulated function Explode(vector HitLocation, vector HitNormal) -{ - local Controller C; - local PlayerController LocalPlayer; - local float ShakeScale; - bHasExploded = True; - // Don't explode if this is a dud - if( bDud ) - { Velocity = vect(0,0,0); LifeSpan=1.0; SetPhysics(PHYS_Falling); - } - PlaySound(ExplosionSound,,2.0); - if ( EffectIsRelevant(Location,false) ) - { Spawn(class'KFMod.FlameImpact',,,HitLocation + HitNormal*20,rotator(HitNormal)); Spawn(ExplosionDecal,self,,HitLocation, rotator(-HitNormal)); - } - BlowUp(HitLocation); - Destroy(); - // Shake nearby players screens - LocalPlayer = Level.GetLocalPlayerController(); - if ( LocalPlayer != none ) - { ShakeScale = GetShakeScale(Location, LocalPlayer.ViewTarget.Location); if( ShakeScale > 0 ) { LocalPlayer.ShakeView(RotMag * ShakeScale, RotRate, RotTime, OffsetMag * ShakeScale, OffsetRate, OffsetTime); } - } - for ( C=Level.ControllerList; C!=none; C=C.NextController ) - { if ( PlayerController(C) != none && C != LocalPlayer ) { ShakeScale = GetShakeScale(Location, PlayerController(C).ViewTarget.Location); if( ShakeScale > 0 ) { C.ShakeView(RotMag * ShakeScale, RotRate, RotTime, OffsetMag * ShakeScale, OffsetRate, OffsetTime); } } - } -} -// Get the shake amount for when this projectile explodes -simulated function float GetShakeScale(vector ViewLocation, vector EventLocation) -{ - local float Dist; - local float scale; - Dist = VSize(ViewLocation - EventLocation); - if (Dist < DamageRadius * 2.0 ) - { scale = (DamageRadius*2.0 - Dist) / (DamageRadius*2.0); - } - return scale; -} -/* HurtRadius() - Hurt locally authoritative actors within the radius. - Overriden so it doesn't attemt to damage the bullet whiz cylinder - TODO: maybe implement the same thing in the superclass - Ramm -*/ -simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) -{ - local actor Victims; - local float damageScale, dist; - local vector dirs; - local int NumKilled; - local KFMonster KFMonsterVictim; - local Pawn P; - local KFPawn KFP; - local array CheckedPawns; - local int i; - local bool bAlreadyChecked; - if ( bHurtEntry ) return; - bHurtEntry = true; - foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) - { // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if( (Victims != self) && (Victims != Instigator) &&(Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') && ExtendedZCollision(Victims)==none && KFBulletWhipAttachment(Victims)==none ) { dirs = Victims.Location - HitLocation; dist = FMax(1,VSize(dirs)); dirs = dirs/dist; damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); if ( Instigator == none || Instigator.Controller == none ) Victims.SetDelayedDamageInstigatorController( InstigatorController ); if ( Victims == LastTouched ) LastTouched = none; - P = Pawn(Victims); - if( P != none ) { for (i = 0; i < CheckedPawns.Length; i++) { if (CheckedPawns[i] == P) { bAlreadyChecked = true; break; } } - if( bAlreadyChecked ) { bAlreadyChecked = false; P = none; continue; } - KFMonsterVictim = KFMonster(Victims); - if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { KFMonsterVictim = none; } - KFP = KFPawn(Victims); - if( KFMonsterVictim != none ) { damageScale *= KFMonsterVictim.GetExposureTo(HitLocation); } else if( KFP != none ) { damageScale *= KFP.GetExposureTo(HitLocation); } - CheckedPawns[CheckedPawns.Length] = P; - if ( damageScale <= 0) { P = none; continue; } else { P = none; } } - Victims.TakeDamage ( damageScale * DamageAmount * (1.0 - additionalDamagePart), Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, (damageScale * Momentum * dirs), DamageType ); Victims.TakeDamage ( damageScale * DamageAmount * additionalDamagePart, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, Vect(0,0,0), MyAdditionalDamageType ); if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); - if( Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { NumKilled++; } } - } - if ( (LastTouched != none) && (LastTouched != self) && (LastTouched != Instigator) && (LastTouched.Role == ROLE_Authority) && !LastTouched.IsA('FluidSurfaceInfo') ) - { Victims = LastTouched; LastTouched = none; dirs = Victims.Location - HitLocation; dist = FMax(1,VSize(dirs)); dirs = dirs/dist; damageScale = FMax(Victims.CollisionRadius/(Victims.CollisionRadius + Victims.CollisionHeight),1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius)); if ( Instigator == none || Instigator.Controller == none ) Victims.SetDelayedDamageInstigatorController(InstigatorController); - Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, (damageScale * Momentum * dirs), DamageType ); if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); - } - if( Role == ROLE_Authority ) - { if( NumKilled >= 4 ) { KFGameType(Level.Game).DramaticEvent(0.05); } else if( NumKilled >= 2 ) { KFGameType(Level.Game).DramaticEvent(0.03); } - } - bHurtEntry = false; -} -//============== -// Touching -// Overridden to not touch the bulletwhip attachment -simulated singular function Touch(Actor Other){ - if(Other == none || KFBulletWhipAttachment(Other) != none || Role < ROLE_Authority) return; - super.Touch(Other); -} -// Don't hit Zed extra collision cylinders -// Do hit :3 -simulated function ProcessTouch(Actor Other, Vector HitLocation) -{ - /*if(ExtendedZCollision(Other) != none){ return;*/ - super.ProcessTouch(Other, HitLocation); -} -simulated function Destroyed() -{ - if ( Trail != none ) - { Trail.mRegen=False; Trail.SetPhysics(PHYS_none); Trail.GotoState(''); - } - if ( FlameTrail != none ) - { FlameTrail.Kill(); FlameTrail.SetPhysics(PHYS_none); - } - Super.Destroyed(); -} -defaultproperties -{ MyAdditionalDamageType=Class'KFMod.DamTypeLAW' ExplosionSound=SoundGroup'KF_EnemiesFinalSnd.Husk.Husk_FireImpact' ArmDistSquared=0.000000 Speed=1800.000000 MaxSpeed=2200.000000 Damage=25.000000 DamageRadius=150.000000 MyDamageType=Class'NicePack.NiceDamTypeFire' ExplosionDecal=Class'KFMod.FlameThrowerBurnMark' LightType=LT_Steady LightHue=45 LightSaturation=169 LightBrightness=90.000000 LightRadius=16.000000 LightCone=16 StaticMesh=StaticMesh'EffectsSM.Weapons.Ger_Tracer' bDynamicLight=True bNetTemporary=False AmbientSound=Sound'KF_BaseHusk.Fire.husk_fireball_loop' DrawScale=2.000000 AmbientGlow=254 bUnlit=True -} +class NiceHuskFireProjectile extends LAWProj; +var Emitter FlameTrail; +var xEmitter Trail; +var class MyAdditionalDamageType; +var float additionalDamagePart; +//----------------------------------------------------------------------------- +// PostBeginPlay +//----------------------------------------------------------------------------- +simulated function PostBeginPlay() +{ + if ( Level.NetMode != NM_DedicatedServer ) + { + if ( !PhysicsVolume.bWaterVolume ) + { + FlameTrail = Spawn(class'FlameThrowerFlameB',self); + Trail = Spawn(class'FlameThrowerFlame',self); + } + } + // Difficulty Scaling + if (Level.Game != none) + { + if(Level.Game.GameDifficulty >= 5.0) // Hell on Earth & Suicidal + damage = default.damage * 1.3; + else + damage = default.damage * 1.0; + } + OrigLoc = Location; + if( !bDud ) + { + Dir = vector(Rotation); + Velocity = speed * Dir; + } + super(ROBallisticProjectile).PostBeginPlay(); +} +simulated function Explode(vector HitLocation, vector HitNormal) +{ + local Controller C; + local PlayerController LocalPlayer; + local float ShakeScale; + bHasExploded = True; + // Don't explode if this is a dud + if( bDud ) + { + Velocity = vect(0,0,0); + LifeSpan=1.0; + SetPhysics(PHYS_Falling); + } + PlaySound(ExplosionSound,,2.0); + if ( EffectIsRelevant(Location,false) ) + { + Spawn(class'KFMod.FlameImpact',,,HitLocation + HitNormal*20,rotator(HitNormal)); + Spawn(ExplosionDecal,self,,HitLocation, rotator(-HitNormal)); + } + BlowUp(HitLocation); + Destroy(); + // Shake nearby players screens + LocalPlayer = Level.GetLocalPlayerController(); + if ( LocalPlayer != none ) + { + ShakeScale = GetShakeScale(Location, LocalPlayer.ViewTarget.Location); + if( ShakeScale > 0 ) + { + LocalPlayer.ShakeView(RotMag * ShakeScale, RotRate, RotTime, OffsetMag * ShakeScale, OffsetRate, OffsetTime); + } + } + for ( C=Level.ControllerList; C!=none; C=C.NextController ) + { + if ( PlayerController(C) != none && C != LocalPlayer ) + { + ShakeScale = GetShakeScale(Location, PlayerController(C).ViewTarget.Location); + if( ShakeScale > 0 ) + { + C.ShakeView(RotMag * ShakeScale, RotRate, RotTime, OffsetMag * ShakeScale, OffsetRate, OffsetTime); + } + } + } +} +// Get the shake amount for when this projectile explodes +simulated function float GetShakeScale(vector ViewLocation, vector EventLocation) +{ + local float Dist; + local float scale; + Dist = VSize(ViewLocation - EventLocation); + if (Dist < DamageRadius * 2.0 ) + { + scale = (DamageRadius*2.0 - Dist) / (DamageRadius*2.0); + } + return scale; +} +/* HurtRadius() + Hurt locally authoritative actors within the radius. + Overriden so it doesn't attemt to damage the bullet whiz cylinder - TODO: maybe implement the same thing in the superclass - Ramm +*/ +simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) +{ + local actor Victims; + local float damageScale, dist; + local vector dirs; + local int NumKilled; + local KFMonster KFMonsterVictim; + local Pawn P; + local KFPawn KFP; + local array CheckedPawns; + local int i; + local bool bAlreadyChecked; + if ( bHurtEntry ) + return; + bHurtEntry = true; + foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) + { + // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag + if( (Victims != self) && (Victims != Instigator) &&(Hurtwall != Victims) + && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') + && ExtendedZCollision(Victims)==none && KFBulletWhipAttachment(Victims)==none ) + { + dirs = Victims.Location - HitLocation; + dist = FMax(1,VSize(dirs)); + dirs = dirs/dist; + damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); + if ( Instigator == none || Instigator.Controller == none ) + Victims.SetDelayedDamageInstigatorController( InstigatorController ); + if ( Victims == LastTouched ) + LastTouched = none; + + P = Pawn(Victims); + + if( P != none ) + { + for (i = 0; i < CheckedPawns.Length; i++) + { + if (CheckedPawns[i] == P) + { + bAlreadyChecked = true; + break; + } + } + + if( bAlreadyChecked ) + { + bAlreadyChecked = false; + P = none; + continue; + } + + KFMonsterVictim = KFMonster(Victims); + + if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) + { + KFMonsterVictim = none; + } + + KFP = KFPawn(Victims); + + if( KFMonsterVictim != none ) + { + damageScale *= KFMonsterVictim.GetExposureTo(HitLocation); + } + else if( KFP != none ) + { + damageScale *= KFP.GetExposureTo(HitLocation); + } + + CheckedPawns[CheckedPawns.Length] = P; + + if ( damageScale <= 0) + { + P = none; + continue; + } + else + { + P = none; + } + } + + Victims.TakeDamage + ( + damageScale * DamageAmount * (1.0 - additionalDamagePart), + Instigator, + Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, + (damageScale * Momentum * dirs), + DamageType + ); + Victims.TakeDamage + ( + damageScale * DamageAmount * additionalDamagePart, + Instigator, + Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, + Vect(0,0,0), + MyAdditionalDamageType + ); + if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) + Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); + + if( Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) + { + NumKilled++; + } + } + } + if ( (LastTouched != none) && (LastTouched != self) && (LastTouched != Instigator) && + (LastTouched.Role == ROLE_Authority) && !LastTouched.IsA('FluidSurfaceInfo') ) + { + Victims = LastTouched; + LastTouched = none; + dirs = Victims.Location - HitLocation; + dist = FMax(1,VSize(dirs)); + dirs = dirs/dist; + damageScale = FMax(Victims.CollisionRadius/(Victims.CollisionRadius + Victims.CollisionHeight),1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius)); + if ( Instigator == none || Instigator.Controller == none ) + Victims.SetDelayedDamageInstigatorController(InstigatorController); + + Victims.TakeDamage + ( + damageScale * DamageAmount, + Instigator, + Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs, + (damageScale * Momentum * dirs), + DamageType + ); + if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) + Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); + } + if( Role == ROLE_Authority ) + { + if( NumKilled >= 4 ) + { + KFGameType(Level.Game).DramaticEvent(0.05); + } + else if( NumKilled >= 2 ) + { + KFGameType(Level.Game).DramaticEvent(0.03); + } + } + bHurtEntry = false; +} +//============== +// Touching +// Overridden to not touch the bulletwhip attachment +simulated singular function Touch(Actor Other){ + if(Other == none || KFBulletWhipAttachment(Other) != none || Role < ROLE_Authority) + return; + super.Touch(Other); +} +// Don't hit Zed extra collision cylinders +// Do hit :3 +simulated function ProcessTouch(Actor Other, Vector HitLocation) +{ + /*if(ExtendedZCollision(Other) != none){ + return;*/ + super.ProcessTouch(Other, HitLocation); +} +simulated function Destroyed() +{ + if ( Trail != none ) + { + Trail.mRegen=False; + Trail.SetPhysics(PHYS_none); + Trail.GotoState(''); + } + if ( FlameTrail != none ) + { + FlameTrail.Kill(); + FlameTrail.SetPhysics(PHYS_none); + } + Super.Destroyed(); +} +defaultproperties +{ + MyAdditionalDamageType=Class'KFMod.DamTypeLAW' + ExplosionSound=SoundGroup'KF_EnemiesFinalSnd.Husk.Husk_FireImpact' + ArmDistSquared=0.000000 + Speed=1800.000000 + MaxSpeed=2200.000000 + Damage=25.000000 + DamageRadius=150.000000 + MyDamageType=Class'NicePack.NiceDamTypeFire' + ExplosionDecal=Class'KFMod.FlameThrowerBurnMark' + LightType=LT_Steady + LightHue=45 + LightSaturation=169 + LightBrightness=90.000000 + LightRadius=16.000000 + LightCone=16 + StaticMesh=StaticMesh'EffectsSM.Weapons.Ger_Tracer' + bDynamicLight=True + bNetTemporary=False + AmbientSound=Sound'KF_BaseHusk.Fire.husk_fireball_loop' + DrawScale=2.000000 + AmbientGlow=254 + bUnlit=True +} diff --git a/sources/Zeds/Nice/NiceSeveredArmSick.uc b/sources/Zeds/Nice/NiceSeveredArmSick.uc index 224f24c..c5c0246 100644 --- a/sources/Zeds/Nice/NiceSeveredArmSick.uc +++ b/sources/Zeds/Nice/NiceSeveredArmSick.uc @@ -1,4 +1,5 @@ -class NiceSeveredArmSick extends SeveredArm; -defaultproperties -{ StaticMesh=StaticMesh'NicePackSM.MonsterSick.Arm' -} +class NiceSeveredArmSick extends SeveredArm; +defaultproperties +{ + StaticMesh=StaticMesh'NicePackSM.MonsterSick.Arm' +} diff --git a/sources/Zeds/Nice/NiceSeveredHeadSick.uc b/sources/Zeds/Nice/NiceSeveredHeadSick.uc index e6358bb..8a92fb2 100644 --- a/sources/Zeds/Nice/NiceSeveredHeadSick.uc +++ b/sources/Zeds/Nice/NiceSeveredHeadSick.uc @@ -1,13 +1,14 @@ -//============================================================================= -// SeveredHeadClot -//============================================================================= -// Detached head gib class for the clot -//============================================================================= -// Killing Floor Source -// Copyright (C) 2009 Tripwire Interactive LLC -// - John "Ramm-Jaeger" Gibson -//============================================================================= -class NiceSeveredHeadSick extends SeveredHead; -defaultproperties -{ StaticMesh=StaticMesh'NicePackSM.MonsterSick.head' -} +//============================================================================= +// SeveredHeadClot +//============================================================================= +// Detached head gib class for the clot +//============================================================================= +// Killing Floor Source +// Copyright (C) 2009 Tripwire Interactive LLC +// - John "Ramm-Jaeger" Gibson +//============================================================================= +class NiceSeveredHeadSick extends SeveredHead; +defaultproperties +{ + StaticMesh=StaticMesh'NicePackSM.MonsterSick.head' +} diff --git a/sources/Zeds/Nice/NiceSeveredLegSick.uc b/sources/Zeds/Nice/NiceSeveredLegSick.uc index 0a16104..69dcd5f 100644 --- a/sources/Zeds/Nice/NiceSeveredLegSick.uc +++ b/sources/Zeds/Nice/NiceSeveredLegSick.uc @@ -1,4 +1,5 @@ -class NiceSeveredLegSick extends SeveredLeg; -defaultproperties -{ StaticMesh=StaticMesh'NicePackSM.MonsterSick.Leg' -} +class NiceSeveredLegSick extends SeveredLeg; +defaultproperties +{ + StaticMesh=StaticMesh'NicePackSM.MonsterSick.Leg' +} diff --git a/sources/Zeds/Nice/NiceSickVomit.uc b/sources/Zeds/Nice/NiceSickVomit.uc index 3f257cb..dfbd69d 100644 --- a/sources/Zeds/Nice/NiceSickVomit.uc +++ b/sources/Zeds/Nice/NiceSickVomit.uc @@ -1,86 +1,220 @@ -// The Nice, nasty barf we'll be using for the Bloat's ranged attack. -class NiceSickVomit extends BioGlob; -simulated function PostBeginPlay() -{ - SetOwner(none); - if (Role == ROLE_Authority) - { Velocity = Vector(Rotation) * Speed; Velocity.Z += TossZ; - } - if (Role == ROLE_Authority) Rand3 = Rand(3); - if ( (Level.NetMode != NM_DedicatedServer) && ((Level.DetailMode == DM_Low) || Level.bDropDetail) ) - { bDynamicLight = false; LightType = LT_none; - } - // Difficulty Scaling - if (Level.Game != none) - { BaseDamage = Max((DifficultyDamageModifer() * BaseDamage),1); Damage = Max((DifficultyDamageModifer() * Damage),1); - } -} -// Scales the damage this Zed deals by the difficulty level -function float DifficultyDamageModifer() -{ - local float AdjustedDamageModifier; - if(Level.Game.GameDifficulty >= 5.0) // Hell on Earth & Suicidal damage = default.damage * 2.5; - else damage = default.damage * 1.5; - return AdjustedDamageModifier; -} -state OnGround -{ - simulated function BeginState() - { SetTimer(RestTime, false); BlowUp(Location); - } - simulated function Timer() - { if (bDrip) { bDrip = false; SetCollisionSize(default.CollisionHeight, default.CollisionRadius); Velocity = PhysicsVolume.Gravity * 0.2; SetPhysics(PHYS_Falling); bCollideWorld = true; bCheckedsurface = false; bProjTarget = false; GotoState('Flying'); } else BlowUp(Location); - } - simulated function ProcessTouch(Actor Other, Vector HitLocation) - { if ( Other != none ) BlowUp(Location); - } - function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, optional int HitIndex) - { if (DamageType.default.bDetonatesGoop) { bDrip = false; SetTimer(0.1, false); } - } - simulated function AnimEnd(int Channel) - { local float DotProduct; - if (!bCheckedSurface) { DotProduct = SurfaceNormal dot Vect(0,0,-1); if (DotProduct > 0.7) { bDrip = true; SetTimer(DripTime, false); if (bOnMover) BlowUp(Location); } else if (DotProduct > -0.5) { if (bOnMover) BlowUp(Location); } bCheckedSurface = true; } - } - simulated function MergeWithGlob(int AdditionalGoopLevel) - { local int NewGoopLevel, ExtraSplash; NewGoopLevel = AdditionalGoopLevel + GoopLevel; if (NewGoopLevel > MaxGoopLevel) { Rand3 = (Rand3 + 1) % 3; ExtraSplash = Rand3; if (Role == ROLE_Authority) SplashGlobs(NewGoopLevel - MaxGoopLevel + ExtraSplash); NewGoopLevel = MaxGoopLevel - ExtraSplash; } SetGoopLevel(NewGoopLevel); SetCollisionSize(GoopVolume*10.0, GoopVolume*10.0); PlaySound(ImpactSound, SLOT_Misc); bCheckedSurface = false; SetTimer(RestTime, false); - } -} -singular function SplashGlobs(int NumGloblings) -{ - local int g; - local NiceSickVomit NewGlob; - local Vector VNorm; - for (g=0; g CoreGoopLevel) { if (Role == ROLE_Authority) SplashGlobs(GoopLevel - CoreGoopLevel); SetGoopLevel(CoreGoopLevel); } spawn(class'KFMod.VomitDecal',,,, rotator(-HitNormal)); - bCollideWorld = false; SetCollisionSize(GoopVolume*10.0, GoopVolume*10.0); bProjTarget = true; - NewRot = Rotator(HitNormal); NewRot.Roll += 32768; SetRotation(NewRot); SetPhysics(PHYS_none); bCheckedsurface = false; Fear = Spawn(class'AvoidMarker'); GotoState('OnGround'); - } - simulated function HitWall( Vector HitNormal, Actor Wall ) - { Landed(HitNormal); if ( !Wall.bStatic && !Wall.bWorldGeometry ) { bOnMover = true; SetBase(Wall); if (Base == none) BlowUp(Location); } - } - simulated function ProcessTouch(Actor Other, Vector HitLocation) - { if( ExtendedZCollision(Other)!=none ) Return; if (Other != Instigator && (Other.IsA('Pawn') || Other.IsA('DestroyableObjective') || Other.bProjTarget)) HurtRadius(Damage,DamageRadius, MyDamageType, MomentumTransfer, HitLocation ); else if ( Other != Instigator && Other.bBlockActors ) HitWall( Normal(HitLocation-Location), Other ); - } -} -defaultproperties -{ BaseDamage=4 TouchDetonationDelay=0.000000 Speed=600.000000 Damage=5.000000 MomentumTransfer=3500.000000 MyDamageType=Class'KFMod.DamTypeVomit' ImpactSound=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_AcidSplash' DrawType=DT_StaticMesh StaticMesh=StaticMesh'kf_gore_trip_sm.puke.puke_chunk' bDynamicLight=False LifeSpan=8.000000 Skins(0)=Combiner'kf_fx_trip_t.Gore.intestines_cmb' bUseCollisionStaticMesh=False bBlockHitPointTraces=False -} +// The Nice, nasty barf we'll be using for the Bloat's ranged attack. +class NiceSickVomit extends BioGlob; +simulated function PostBeginPlay() +{ + SetOwner(none); + if (Role == ROLE_Authority) + { + Velocity = Vector(Rotation) * Speed; + Velocity.Z += TossZ; + } + if (Role == ROLE_Authority) + Rand3 = Rand(3); + if ( (Level.NetMode != NM_DedicatedServer) && ((Level.DetailMode == DM_Low) || Level.bDropDetail) ) + { + bDynamicLight = false; + LightType = LT_none; + } + // Difficulty Scaling + if (Level.Game != none) + { + BaseDamage = Max((DifficultyDamageModifer() * BaseDamage),1); + Damage = Max((DifficultyDamageModifer() * Damage),1); + } +} +// Scales the damage this Zed deals by the difficulty level +function float DifficultyDamageModifer() +{ + local float AdjustedDamageModifier; + if(Level.Game.GameDifficulty >= 5.0) // Hell on Earth & Suicidal + damage = default.damage * 2.5; + else + damage = default.damage * 1.5; + return AdjustedDamageModifier; +} +state OnGround +{ + simulated function BeginState() + { + SetTimer(RestTime, false); + BlowUp(Location); + } + simulated function Timer() + { + if (bDrip) + { + bDrip = false; + SetCollisionSize(default.CollisionHeight, default.CollisionRadius); + Velocity = PhysicsVolume.Gravity * 0.2; + SetPhysics(PHYS_Falling); + bCollideWorld = true; + bCheckedsurface = false; + bProjTarget = false; + GotoState('Flying'); + } + else BlowUp(Location); + } + simulated function ProcessTouch(Actor Other, Vector HitLocation) + { + if ( Other != none ) + BlowUp(Location); + } + function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, optional int HitIndex) + { + if (DamageType.default.bDetonatesGoop) + { + bDrip = false; + SetTimer(0.1, false); + } + } + simulated function AnimEnd(int Channel) + { + local float DotProduct; + + if (!bCheckedSurface) + { + DotProduct = SurfaceNormal dot Vect(0,0,-1); + if (DotProduct > 0.7) + { + bDrip = true; + SetTimer(DripTime, false); + if (bOnMover) + BlowUp(Location); + } + else if (DotProduct > -0.5) + { + if (bOnMover) + BlowUp(Location); + } + bCheckedSurface = true; + } + } + simulated function MergeWithGlob(int AdditionalGoopLevel) + { + local int NewGoopLevel, ExtraSplash; + NewGoopLevel = AdditionalGoopLevel + GoopLevel; + if (NewGoopLevel > MaxGoopLevel) + { + Rand3 = (Rand3 + 1) % 3; + ExtraSplash = Rand3; + if (Role == ROLE_Authority) + SplashGlobs(NewGoopLevel - MaxGoopLevel + ExtraSplash); + NewGoopLevel = MaxGoopLevel - ExtraSplash; + } + SetGoopLevel(NewGoopLevel); + SetCollisionSize(GoopVolume*10.0, GoopVolume*10.0); + PlaySound(ImpactSound, SLOT_Misc); + bCheckedSurface = false; + SetTimer(RestTime, false); + } +} +singular function SplashGlobs(int NumGloblings) +{ + local int g; + local NiceSickVomit NewGlob; + local Vector VNorm; + for (g=0; g CoreGoopLevel) + { + if (Role == ROLE_Authority) + SplashGlobs(GoopLevel - CoreGoopLevel); + SetGoopLevel(CoreGoopLevel); + } + spawn(class'KFMod.VomitDecal',,,, rotator(-HitNormal)); + + bCollideWorld = false; + SetCollisionSize(GoopVolume*10.0, GoopVolume*10.0); + bProjTarget = true; + + NewRot = Rotator(HitNormal); + NewRot.Roll += 32768; + SetRotation(NewRot); + SetPhysics(PHYS_none); + bCheckedsurface = false; + Fear = Spawn(class'AvoidMarker'); + GotoState('OnGround'); + } + simulated function HitWall( Vector HitNormal, Actor Wall ) + { + Landed(HitNormal); + if ( !Wall.bStatic && !Wall.bWorldGeometry ) + { + bOnMover = true; + SetBase(Wall); + if (Base == none) + BlowUp(Location); + } + } + simulated function ProcessTouch(Actor Other, Vector HitLocation) + { + if( ExtendedZCollision(Other)!=none ) + Return; + if (Other != Instigator && (Other.IsA('Pawn') || Other.IsA('DestroyableObjective') || Other.bProjTarget)) + HurtRadius(Damage,DamageRadius, MyDamageType, MomentumTransfer, HitLocation ); + else if ( Other != Instigator && Other.bBlockActors ) + HitWall( Normal(HitLocation-Location), Other ); + } +} +defaultproperties +{ + BaseDamage=4 + TouchDetonationDelay=0.000000 + Speed=600.000000 + Damage=5.000000 + MomentumTransfer=3500.000000 + MyDamageType=Class'KFMod.DamTypeVomit' + ImpactSound=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_AcidSplash' + DrawType=DT_StaticMesh + StaticMesh=StaticMesh'kf_gore_trip_sm.puke.puke_chunk' + bDynamicLight=False + LifeSpan=8.000000 + Skins(0)=Combiner'kf_fx_trip_t.Gore.intestines_cmb' + bUseCollisionStaticMesh=False + bBlockHitPointTraces=False +} diff --git a/sources/Zeds/Nice/NiceTeslaEMPNade.uc b/sources/Zeds/Nice/NiceTeslaEMPNade.uc index 7833237..58ed2e0 100644 --- a/sources/Zeds/Nice/NiceTeslaEMPNade.uc +++ b/sources/Zeds/Nice/NiceTeslaEMPNade.uc @@ -1,58 +1,148 @@ -// used for Tesla Husk self-destruct explosion on decapitation -class NiceTeslaEMPNade extends NiceNade; -var() class ExplosionEffect; -function Timer(){ - if(bHidden) Destroy(); - else if(Instigator != none && Instigator.Health > 0) Explode(Location, vect(0,0,1)); - else Disintegrate(Location, vect(0,0,1)); -} -function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, optional int HitIndex){} -simulated function Explode(vector HitLocation, vector HitNormal) -{ - local PlayerController LocalPlayer; - bHasExploded = True; - BlowUp(HitLocation); - if(ExplodeSounds.length > 0) PlaySound(ExplodeSounds[rand(ExplodeSounds.length)],, 2.0); - if(EffectIsRelevant(Location, false)){ Spawn(ExplosionEffect,,, HitLocation, rotator(vect(0,0,1))); Spawn(ExplosionDecal,self,,HitLocation, rotator(-HitNormal)); - } - // Shake nearby players screens - LocalPlayer = Level.GetLocalPlayerController(); - if((LocalPlayer != none) && (VSize(Location - LocalPlayer.ViewTarget.Location) < (DamageRadius * 1.5))) LocalPlayer.ShakeView(RotMag, RotRate, RotTime, OffsetMag, OffsetRate, OffsetTime); - if(Instigator != none){ // blow up the instigator Instigator.TakeDamage(1000000, Instigator, Instigator.Location, vect(0,0,1), MyDamageType); - } - Destroy(); -} -simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) -{ - local actor Victims; - local float damageScale, dist; - local vector dir; - local KFMonster KFMonsterVictim; - local Pawn P; - local KFPawn KFP; - local array CheckedPawns; - local int i; - local bool bAlreadyChecked; - - if ( bHurtEntry ) return; - bHurtEntry = true; - foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) - { // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') && ExtendedZCollision(Victims)==none ) { if( (Instigator==none || Instigator.Health<=0) && KFPawn(Victims)!=none ) Continue; dir = Victims.Location - HitLocation; dist = FMax(1,VSize(dir)); dir = dir/dist; damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); - if ( Instigator == none || Instigator.Controller == none ) { Victims.SetDelayedDamageInstigatorController( InstigatorController ); } - P = Pawn(Victims); - if( P != none ) { for (i = 0; i < CheckedPawns.Length; i++) { if (CheckedPawns[i] == P) { bAlreadyChecked = true; break; } } - if( bAlreadyChecked ) { bAlreadyChecked = false; P = none; continue; } - KFMonsterVictim = KFMonster(Victims); - if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) { KFMonsterVictim = none; } - KFP = KFPawn(Victims); - if( KFMonsterVictim != none ) { // 10x more damage zeds damageScale *= 10.0 * KFMonsterVictim.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); if ( ZombieFleshpound(KFMonsterVictim) != none ) damageScale *= 2.0; // compensate 50% dmg.res. } else if( KFP != none ) { damageScale *= KFP.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); } - CheckedPawns[CheckedPawns.Length] = P; - if ( damageScale <= 0) { P = none; continue; } else { //Victims = P; P = none; } } - Victims.TakeDamage(damageScale * DamageAmount,Instigator,Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir,(damageScale * Momentum * dir),DamageType); - if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) { Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); } } - } - bHurtEntry = false; -} -defaultproperties -{ ExplosionEffect=Class'KFMod.ZEDMKIISecondaryProjectileExplosion' ShrapnelClass=None ExplodeSounds(0)=Sound'KF_FY_ZEDV2SND.Fire.WEP_ZEDV2_Secondary_Fire_S' ExplodeSounds(1)=Sound'KF_FY_ZEDV2SND.Fire.WEP_ZEDV2_Secondary_Fire_S' ExplodeSounds(2)=Sound'KF_FY_ZEDV2SND.Fire.WEP_ZEDV2_Secondary_Fire_S' Speed=0.000000 Damage=50.000000 DamageRadius=400.000000 MyDamageType=Class'ScrnZedPack.DamTypeEMP' DrawType=DT_None bCollideActors=False bBlockZeroExtentTraces=False bBlockNonZeroExtentTraces=False -} +// used for Tesla Husk self-destruct explosion on decapitation +class NiceTeslaEMPNade extends NiceNade; +var() class ExplosionEffect; +function Timer(){ + if(bHidden) + Destroy(); + else if(Instigator != none && Instigator.Health > 0) + Explode(Location, vect(0,0,1)); + else + Disintegrate(Location, vect(0,0,1)); +} +function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, optional int HitIndex){} +simulated function Explode(vector HitLocation, vector HitNormal) +{ + local PlayerController LocalPlayer; + bHasExploded = True; + BlowUp(HitLocation); + if(ExplodeSounds.length > 0) + PlaySound(ExplodeSounds[rand(ExplodeSounds.length)],, 2.0); + if(EffectIsRelevant(Location, false)){ + Spawn(ExplosionEffect,,, HitLocation, rotator(vect(0,0,1))); + Spawn(ExplosionDecal,self,,HitLocation, rotator(-HitNormal)); + } + // Shake nearby players screens + LocalPlayer = Level.GetLocalPlayerController(); + if((LocalPlayer != none) && (VSize(Location - LocalPlayer.ViewTarget.Location) < (DamageRadius * 1.5))) + LocalPlayer.ShakeView(RotMag, RotRate, RotTime, OffsetMag, OffsetRate, OffsetTime); + if(Instigator != none){ + // blow up the instigator + Instigator.TakeDamage(1000000, Instigator, Instigator.Location, vect(0,0,1), MyDamageType); + } + Destroy(); +} +simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) +{ + local actor Victims; + local float damageScale, dist; + local vector dir; + local KFMonster KFMonsterVictim; + local Pawn P; + local KFPawn KFP; + local array CheckedPawns; + local int i; + local bool bAlreadyChecked; + + if ( bHurtEntry ) + return; + bHurtEntry = true; + foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) + { + // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag + if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') + && ExtendedZCollision(Victims)==none ) + { + if( (Instigator==none || Instigator.Health<=0) && KFPawn(Victims)!=none ) + Continue; + dir = Victims.Location - HitLocation; + dist = FMax(1,VSize(dir)); + dir = dir/dist; + damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); + + if ( Instigator == none || Instigator.Controller == none ) + { + Victims.SetDelayedDamageInstigatorController( InstigatorController ); + } + + P = Pawn(Victims); + + if( P != none ) + { + for (i = 0; i < CheckedPawns.Length; i++) + { + if (CheckedPawns[i] == P) + { + bAlreadyChecked = true; + break; + } + } + + if( bAlreadyChecked ) + { + bAlreadyChecked = false; + P = none; + continue; + } + + KFMonsterVictim = KFMonster(Victims); + + if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) + { + KFMonsterVictim = none; + } + + KFP = KFPawn(Victims); + + if( KFMonsterVictim != none ) + { + // 10x more damage zeds + damageScale *= 10.0 * KFMonsterVictim.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); + if ( ZombieFleshpound(KFMonsterVictim) != none ) + damageScale *= 2.0; // compensate 50% dmg.res. + } + else if( KFP != none ) + { + damageScale *= KFP.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); + } + + CheckedPawns[CheckedPawns.Length] = P; + + if ( damageScale <= 0) + { + P = none; + continue; + } + else + { + //Victims = P; + P = none; + } + } + + Victims.TakeDamage(damageScale * DamageAmount,Instigator,Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) + * dir,(damageScale * Momentum * dir),DamageType); + + if (Vehicle(Victims) != none && Vehicle(Victims).Health > 0) + { + Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); + } + } + } + bHurtEntry = false; +} +defaultproperties +{ + ExplosionEffect=Class'KFMod.ZEDMKIISecondaryProjectileExplosion' + ShrapnelClass=None + ExplodeSounds(0)=Sound'KF_FY_ZEDV2SND.Fire.WEP_ZEDV2_Secondary_Fire_S' + ExplodeSounds(1)=Sound'KF_FY_ZEDV2SND.Fire.WEP_ZEDV2_Secondary_Fire_S' + ExplodeSounds(2)=Sound'KF_FY_ZEDV2SND.Fire.WEP_ZEDV2_Secondary_Fire_S' + Speed=0.000000 + Damage=50.000000 + DamageRadius=400.000000 + MyDamageType=Class'ScrnZedPack.DamTypeEMP' + DrawType=DT_None + bCollideActors=False + bBlockZeroExtentTraces=False + bBlockNonZeroExtentTraces=False +} diff --git a/sources/Zeds/Nice/NiceZedDamageType.uc b/sources/Zeds/Nice/NiceZedDamageType.uc index d5101fa..73978c5 100644 --- a/sources/Zeds/Nice/NiceZedDamageType.uc +++ b/sources/Zeds/Nice/NiceZedDamageType.uc @@ -1,8 +1,11 @@ -class NiceZedDamageType extends NiceWeaponDamageType - abstract; -var material HUDDamageTex; -var material HUDUberDamageTex; -var float HUDTime; -defaultproperties -{ HUDDamageTex=Texture'KillingFloorHUD.BluntSplashNormal' HUDUberDamageTex=Shader'KillingFloorHUD.BluntShaderuber' HUDTime=0.900000 -} +class NiceZedDamageType extends NiceWeaponDamageType + abstract; +var material HUDDamageTex; +var material HUDUberDamageTex; +var float HUDTime; +defaultproperties +{ + HUDDamageTex=Texture'KillingFloorHUD.BluntSplashNormal' + HUDUberDamageTex=Shader'KillingFloorHUD.BluntShaderuber' + HUDTime=0.900000 +} diff --git a/sources/Zeds/Nice/NiceZedMeleeDamageType.uc b/sources/Zeds/Nice/NiceZedMeleeDamageType.uc index 479dccc..0aee8ec 100644 --- a/sources/Zeds/Nice/NiceZedMeleeDamageType.uc +++ b/sources/Zeds/Nice/NiceZedMeleeDamageType.uc @@ -1,4 +1,10 @@ -class NiceZedMeleeDamageType extends NiceZedDamageType; -defaultproperties -{ DeathString="%o was eaten by %k." FemaleSuicide="%o ate herself." MaleSuicide="%o ate himself." PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' -} +class NiceZedMeleeDamageType extends NiceZedDamageType; +defaultproperties +{ + DeathString="%o was eaten by %k." + FemaleSuicide="%o ate herself." + MaleSuicide="%o ate himself." + PawnDamageEmitter=Class'ROEffects.ROBloodPuff' + LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' + LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' +} diff --git a/sources/Zeds/Nice/NiceZedSlashingDamageType.uc b/sources/Zeds/Nice/NiceZedSlashingDamageType.uc index ed1a6e7..86103a4 100644 --- a/sources/Zeds/Nice/NiceZedSlashingDamageType.uc +++ b/sources/Zeds/Nice/NiceZedSlashingDamageType.uc @@ -1,4 +1,12 @@ -class NiceZedSlashingDamageType extends NiceZedDamageType; -defaultproperties -{ HUDDamageTex=FinalBlend'KillingFloorHUD.SlashSplashNormalFB' HUDUberDamageTex=FinalBlend'KillingFloorHUD.SlashSplashUberFB' DeathString="%o was eaten by %k." FemaleSuicide="%o ate herself." MaleSuicide="%o ate himself." PawnDamageEmitter=Class'ROEffects.ROBloodPuff' LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' -} +class NiceZedSlashingDamageType extends NiceZedDamageType; +defaultproperties +{ + HUDDamageTex=FinalBlend'KillingFloorHUD.SlashSplashNormalFB' + HUDUberDamageTex=FinalBlend'KillingFloorHUD.SlashSplashUberFB' + DeathString="%o was eaten by %k." + FemaleSuicide="%o ate herself." + MaleSuicide="%o ate himself." + PawnDamageEmitter=Class'ROEffects.ROBloodPuff' + LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' + LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' +} diff --git a/sources/Zeds/Nice/NiceZombieBloat.uc b/sources/Zeds/Nice/NiceZombieBloat.uc index 98c3c3e..2e2a315 100644 --- a/sources/Zeds/Nice/NiceZombieBloat.uc +++ b/sources/Zeds/Nice/NiceZombieBloat.uc @@ -1,271 +1,622 @@ -// Zombie Monster for KF Invasion gametype -class NiceZombieBloat extends NiceZombieBloatBase; -#exec OBJ LOAD FILE=KF_EnemiesFinalSnd.uax -//---------------------------------------------------------------------------- -// NOTE: All Variables are declared in the base class to eliminate hitching -//---------------------------------------------------------------------------- -var class BileExplosion; -var class BileExplosionHeadless; -function bool FlipOver() -{ - return true; -} -// don't interrupt the bloat while he is puking -simulated function bool HitCanInterruptAction() -{ - if( bShotAnim ) - { return false; - } - return true; -} - -function DoorAttack(Actor A) -{ - if ( bShotAnim || Physics == PHYS_Swimming) return; - else if ( A!=none ) - { bShotAnim = true; if( !bDecapitated && bDistanceAttackingDoor ) { SetAnimAction('ZombieBarf'); } else { SetAnimAction('DoorBash'); GotoState('DoorBashing'); } - } -} -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 || VSize(A.Location-Location) <= 250) && !bDecapitated ) - { bShotAnim = true; - // Randomly do a moving attack so the player can't kite the zed if( FRand() < 0.8 ) { SetAnimAction('ZombieBarfMoving'); RunAttackTimeout = GetAnimDuration('ZombieBarf', 1.0); bMovingPukeAttack=true; } else { SetAnimAction('ZombieBarf'); Controller.bPreparingMove = true; Acceleration = vect(0,0,0); } - // Randomly send out a message about Bloat Vomit burning(3% chance) if ( FRand() < 0.03 && KFHumanPawn(A) != none && PlayerController(KFHumanPawn(A).Controller) != none ) { PlayerController(KFHumanPawn(A).Controller).Speech('AUTO', 7, ""); } - } -} -// Overridden to handle playing upper body only attacks when moving -simulated event SetAnimAction(name NewAction) -{ - local int meleeAnimIndex; - local bool bWantsToAttackAndMove; - if( NewAction=='' ) Return; - bWantsToAttackAndMove = NewAction == 'ZombieBarfMoving'; - if( NewAction == 'Claw' ) - { meleeAnimIndex = Rand(3); NewAction = meleeAnims[meleeAnimIndex]; - } - if( bWantsToAttackAndMove ) - { ExpectingChannel = AttackAndMoveDoAnimAction(NewAction); - } - else - { ExpectingChannel = DoAnimAction(NewAction); - } - if( !bWantsToAttackAndMove && AnimNeedsWait(NewAction) ) - { bWaitForAnim = true; - } - else - { bWaitForAnim = false; - } - if( Level.NetMode!=NM_Client ) - { AnimAction = NewAction; bResetAnimAct = True; ResetAnimActTime = Level.TimeSeconds+0.3; - } -} -// Handle playing the anim action on the upper body only if we're attacking and moving -simulated function int AttackAndMoveDoAnimAction( name AnimName ) -{ - if( AnimName=='ZombieBarfMoving' ) - { AnimBlendParams(1, 1.0, 0.0,, FireRootBone); PlayAnim('ZombieBarf',, 0.1, 1); - return 1; - } - return super.DoAnimAction( AnimName ); -} - -function PlayDyingSound() -{ - if( Level.NetMode!=NM_Client ) - { if ( bGibbed ) { PlaySound(sound'KF_EnemiesFinalSnd.Bloat_DeathPop', SLOT_Pain,2.0,true,525); return; } - if( bDecapitated ) { PlaySound(HeadlessDeathSound, SLOT_Pain,1.30,true,525); } else { PlaySound(sound'KF_EnemiesFinalSnd.Bloat_DeathPop', SLOT_Pain,2.0,true,525); } - } -} - -// Barf Time. -function SpawnTwoShots() -{ - local vector X,Y,Z, FireStart; - local rotator FireRotation; - 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 = Location+(vect(30,0,64) >> Rotation)*DrawScale; - if ( !SavedFireProperties.bInitialized ) - { SavedFireProperties.AmmoClass = Class'SkaarjAmmo'; SavedFireProperties.ProjectileClass = Class'KFBloatVomit'; SavedFireProperties.WarnTargetPct = 1; SavedFireProperties.MaxRange = 500; SavedFireProperties.bTossed = False; SavedFireProperties.bTrySplash = False; SavedFireProperties.bLeadTarget = True; SavedFireProperties.bInstantHit = True; SavedFireProperties.bInitialized = True; - } - // Turn off extra collision before spawning vomit, otherwise spawn fails - ToggleAuxCollision(false); - FireRotation = Controller.AdjustAim(SavedFireProperties,FireStart,600); - Spawn(Class'KFBloatVomit',,,FireStart,FireRotation); - FireStart-=(0.5*CollisionRadius*Y); - FireRotation.Yaw -= 1200; - spawn(Class'KFBloatVomit',,,FireStart, FireRotation); - FireStart+=(CollisionRadius*Y); - FireRotation.Yaw += 2400; - spawn(Class'KFBloatVomit',,,FireStart, FireRotation); - // Turn extra collision back on - ToggleAuxCollision(true); -} - -simulated function Tick(float deltatime) -{ - local vector BileExplosionLoc; - local FleshHitEmitter GibBileExplosion; - Super.tick(deltatime); - if( Role == ROLE_Authority && bMovingPukeAttack ) - { // Keep moving toward the target until the timer runs out (anim finishes) if( RunAttackTimeout > 0 ) { RunAttackTimeout -= DeltaTime; - if( RunAttackTimeout <= 0 ) { RunAttackTimeout = 0; bMovingPukeAttack=false; } } - // Keep the gorefast moving toward its target when attacking if( bShotAnim && !bWaitForAnim ) { if( LookTarget!=none ) { Acceleration = AccelRate * Normal(LookTarget.Location - Location); } } - } - // Hack to force animation updates on the server for the bloat if he is relevant to someone - // He has glitches when some of his animations don't play on the server. If we - // find some other fix for the glitches take this out - Ramm - if( Level.NetMode != NM_Client && Level.NetMode != NM_Standalone ) - { if( (Level.TimeSeconds-LastSeenOrRelevantTime) < 1.0 ) { bForceSkelUpdate=true; } else { bForceSkelUpdate=false; } - } - if ( Level.NetMode!=NM_DedicatedServer && /*Gored>0*/Health <= 0 && !bPlayBileSplash && HitDamageType != class'DamTypeBleedOut' ) - { if ( !class'GameInfo'.static.UseLowGore() ) { BileExplosionLoc = self.Location; BileExplosionLoc.z += (CollisionHeight - (CollisionHeight * 0.5)); - if (bDecapitated) { GibBileExplosion = Spawn(BileExplosionHeadless,self,, BileExplosionLoc ); } else { GibBileExplosion = Spawn(BileExplosion,self,, BileExplosionLoc ); } bPlayBileSplash = true; } else { BileExplosionLoc = self.Location; BileExplosionLoc.z += (CollisionHeight - (CollisionHeight * 0.5)); - GibBileExplosion = Spawn(class 'LowGoreBileExplosion',self,, BileExplosionLoc ); bPlayBileSplash = true; } - } -} -function BileBomb() -{ - BloatJet = spawn(class'BileJet', self,,Location,Rotator(-PhysicsVolume.Gravity)); -} -function PlayDyingAnimation(class DamageType, vector HitLoc) -{ -// local bool AttachSucess; - super.PlayDyingAnimation(DamageType, HitLoc); - // Don't blow up with bleed out - if( bDecapitated && DamageType == class'DamTypeBleedOut' ) - { return; - } - if ( !class'GameInfo'.static.UseLowGore() ) - { HideBone(SpineBone2); - } - if(Role == ROLE_Authority) - { BileBomb(); -// if(BloatJet!=none) -// { -// if(Gored < 5) -// AttachSucess=AttachToBone(BloatJet,FireRootBone); -// // else -// // AttachSucess=AttachToBone(BloatJet,SpineBone1); -// -// if(!AttachSucess) -// { -// log("DEAD Bloaty Bile didn't like the Boning :o"); -// BloatJet.SetBase(self); -// } -// BloatJet.SetRelativeRotation(rot(0,-4096,0)); -// } - } -} -simulated function ProcessHitFX() -{ - local Coords boneCoords; - local class HitEffects[4]; - local int i,j; - local float GibPerterbation; - if( (Level.NetMode == NM_DedicatedServer) || bSkeletized || (Mesh == SkeletonMesh)) - { SimHitFxTicker = HitFxTicker; return; - } - for ( SimHitFxTicker = SimHitFxTicker; SimHitFxTicker != HitFxTicker; SimHitFxTicker = (SimHitFxTicker + 1) % ArrayCount(HitFX) ) - { j++; if ( j > 30 ) { SimHitFxTicker = HitFxTicker; return; } - if( (HitFX[SimHitFxTicker].damtype == none) || (Level.bDropDetail && (Level.TimeSeconds - LastRenderTime > 3) && !IsHumanControlled()) ) continue; - //log("Processing effects for damtype "$HitFX[SimHitFxTicker].damtype); - if( HitFX[SimHitFxTicker].bone == 'obliterate' && !class'GameInfo'.static.UseLowGore()) { SpawnGibs( HitFX[SimHitFxTicker].rotDir, 1); bGibbed = true; // Wait a tick on a listen server so the obliteration can replicate before the pawn is destroyed if( Level.NetMode == NM_ListenServer ) { bDestroyNextTick = true; TimeSetDestroyNextTickTime = Level.TimeSeconds; } else { Destroy(); } return; } - boneCoords = GetBoneCoords( HitFX[SimHitFxTicker].bone ); - if ( !Level.bDropDetail && !class'GameInfo'.static.NoBlood() && !bSkeletized && !class'GameInfo'.static.UseLowGore() ) { //AttachEmitterEffect( BleedingEmitterClass, HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); - HitFX[SimHitFxTicker].damtype.static.GetHitEffects( HitEffects, Health ); - if( !PhysicsVolume.bWaterVolume ) // don't attach effects under water { for( i = 0; i < ArrayCount(HitEffects); i++ ) { if( HitEffects[i] == none ) continue; - AttachEffect( HitEffects[i], HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); } } } - if ( class'GameInfo'.static.UseLowGore() ) { HitFX[SimHitFxTicker].bSever = false; - switch( HitFX[SimHitFxTicker].bone ) { case 'head': if( !bHeadGibbed ) { if ( HitFX[SimHitFxTicker].damtype == class'DamTypeDecapitation' ) { DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false); } else if( HitFX[SimHitFxTicker].damtype == class'DamTypeProjectileDecap' ) { DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false, true); } else if( HitFX[SimHitFxTicker].damtype == class'DamTypeMeleeDecapitation' ) { DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, true); } - bHeadGibbed=true; } break; } - return; } - if( HitFX[SimHitFxTicker].bSever ) { GibPerterbation = HitFX[SimHitFxTicker].damtype.default.GibPerterbation; - switch( HitFX[SimHitFxTicker].bone ) { case 'obliterate': break; - case LeftThighBone: if( !bLeftLegGibbed ) { SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; bLeftLegGibbed=true; } break; - case RightThighBone: if( !bRightLegGibbed ) { SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; bRightLegGibbed=true; } break; - case LeftFArmBone: if( !bLeftArmGibbed ) { SpawnSeveredGiblet( DetachedArmClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ;; bLeftArmGibbed=true; } break; - case RightFArmBone: if( !bRightArmGibbed ) { SpawnSeveredGiblet( DetachedArmClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; bRightArmGibbed=true; } break; - case 'head': if( !bHeadGibbed ) { if ( HitFX[SimHitFxTicker].damtype == class'DamTypeDecapitation' ) { DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false); } else if( HitFX[SimHitFxTicker].damtype == class'DamTypeProjectileDecap' ) { DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false, true); } else if( HitFX[SimHitFxTicker].damtype == class'DamTypeMeleeDecapitation' ) { DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, true); } - bHeadGibbed=true; } break; } - // Don't do this right now until we get the effects sorted - Ramm if( HitFX[SimHitFXTicker].bone != 'Spine' && HitFX[SimHitFXTicker].bone != FireRootBone && HitFX[SimHitFXTicker].bone != LeftFArmBone && HitFX[SimHitFXTicker].bone != RightFArmBone && HitFX[SimHitFXTicker].bone != 'head' && Health <=0 ) HideBone(HitFX[SimHitFxTicker].bone); } - } -} -simulated function HideBone(name boneName) -{ - local int BoneScaleSlot; - local coords boneCoords; - local bool bValidBoneToHide; - if( boneName == LeftThighBone ) - { boneScaleSlot = 0; bValidBoneToHide = true; if( SeveredLeftLeg == none ) { SeveredLeftLeg = Spawn(SeveredLegAttachClass,self); SeveredLeftLeg.SetDrawScale(SeveredLegAttachScale); boneCoords = GetBoneCoords( 'lleg' ); AttachEmitterEffect( LimbSpurtEmitterClass, 'lleg', boneCoords.Origin, rot(0,0,0) ); AttachToBone(SeveredLeftLeg, 'lleg'); } - } - else if ( boneName == RightThighBone ) - { boneScaleSlot = 1; bValidBoneToHide = true; if( SeveredRightLeg == none ) { SeveredRightLeg = Spawn(SeveredLegAttachClass,self); SeveredRightLeg.SetDrawScale(SeveredLegAttachScale); boneCoords = GetBoneCoords( 'rleg' ); AttachEmitterEffect( LimbSpurtEmitterClass, 'rleg', boneCoords.Origin, rot(0,0,0) ); AttachToBone(SeveredRightLeg, 'rleg'); } - } - else if( boneName == RightFArmBone ) - { boneScaleSlot = 2; bValidBoneToHide = true; if( SeveredRightArm == none ) { SeveredRightArm = Spawn(SeveredArmAttachClass,self); SeveredRightArm.SetDrawScale(SeveredArmAttachScale); boneCoords = GetBoneCoords( 'rarm' ); AttachEmitterEffect( LimbSpurtEmitterClass, 'rarm', boneCoords.Origin, rot(0,0,0) ); AttachToBone(SeveredRightArm, 'rarm'); } - } - else if ( boneName == LeftFArmBone ) - { boneScaleSlot = 3; bValidBoneToHide = true; if( SeveredLeftArm == none ) { SeveredLeftArm = Spawn(SeveredArmAttachClass,self); SeveredLeftArm.SetDrawScale(SeveredArmAttachScale); boneCoords = GetBoneCoords( 'larm' ); AttachEmitterEffect( LimbSpurtEmitterClass, 'larm', boneCoords.Origin, rot(0,0,0) ); AttachToBone(SeveredLeftArm, 'larm'); } - } - else if ( boneName == HeadBone ) - { // Only scale the bone down once if( SeveredHead == none ) { bValidBoneToHide = true; boneScaleSlot = 4; SeveredHead = Spawn(SeveredHeadAttachClass,self); SeveredHead.SetDrawScale(SeveredHeadAttachScale); boneCoords = GetBoneCoords( 'neck' ); AttachEmitterEffect( NeckSpurtEmitterClass, 'neck', boneCoords.Origin, rot(0,0,0) ); AttachToBone(SeveredHead, 'neck'); } else { return; } - } - else if ( boneName == 'spine' ) - { bValidBoneToHide = true; boneScaleSlot = 5; - } - else if ( boneName == SpineBone2 ) - { bValidBoneToHide = true; boneScaleSlot = 6; - } - // Only hide the bone if it is one of the arms, legs, or head, don't hide other misc bones - if( bValidBoneToHide ) - { SetBoneScale(BoneScaleSlot, 0.0, BoneName); - } -} - -State Dying -{ - function tick(float deltaTime) - { - if (BloatJet != none) - { - BloatJet.SetLocation(location); - BloatJet.SetRotation(GetBoneRotation(FireRootBone)); - } - super.tick(deltaTime); - } -} -function RemoveHead() -{ - bCanDistanceAttackDoors = False; - Super.RemoveHead(); -} -function ModDamage(out int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI, optional float lockonTime){ - if(damageType == class 'DamTypeVomit' || damageType == class 'DamTypeBlowerThrower') Damage = 0; - else Super.ModDamage(Damage, instigatedBy, hitlocation, momentum, damageType, headshotLevel, KFPRI); -} -static simulated function PreCacheStaticMeshes(LevelInfo myLevel) -{//should be derived and used. - Super.PreCacheStaticMeshes(myLevel); - myLevel.AddPrecacheStaticMesh(StaticMesh'kf_gore_trip_sm.limbs.bloat_head'); -} -static simulated function PreCacheMaterials(LevelInfo myLevel) -{ - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.bloat_cmb'); - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.bloat_env_cmb'); - myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.bloat_diffuse'); -} -defaultproperties -{ BileExplosion=Class'KFMod.BileExplosion' BileExplosionHeadless=Class'KFMod.BileExplosionHeadless' stunLoopStart=0.100000 stunLoopEnd=0.600000 idleInsertFrame=0.950000 EventClasses(0)="NicePack.NiceZombieBloat" MoanVoice=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_Talk' MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_HitPlayer' JumpSound=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_Jump' DetachedArmClass=Class'KFChar.SeveredArmBloat' DetachedLegClass=Class'KFChar.SeveredLegBloat' DetachedHeadClass=Class'KFChar.SeveredHeadBloat' HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_Pain' DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_Death' ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_Challenge' ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_Challenge' ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_Challenge' ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_Challenge' AmbientSound=Sound'KF_BaseBloat.Bloat_Idle1Loop' Mesh=SkeletalMesh'KF_Freaks_Trip.Bloat_Freak' Skins(0)=Combiner'KF_Specimens_Trip_T.bloat_cmb' -} +// Zombie Monster for KF Invasion gametype +class NiceZombieBloat extends NiceZombieBloatBase; +#exec OBJ LOAD FILE=KF_EnemiesFinalSnd.uax +//---------------------------------------------------------------------------- +// NOTE: All Variables are declared in the base class to eliminate hitching +//---------------------------------------------------------------------------- +var class BileExplosion; +var class BileExplosionHeadless; +function bool FlipOver() +{ + return true; +} +// don't interrupt the bloat while he is puking +simulated function bool HitCanInterruptAction() +{ + if( bShotAnim ) + { + return false; + } + return true; +} + +function DoorAttack(Actor A) +{ + if ( bShotAnim || Physics == PHYS_Swimming) + return; + else if ( A!=none ) + { + bShotAnim = true; + if( !bDecapitated && bDistanceAttackingDoor ) + { + SetAnimAction('ZombieBarf'); + } + else + { + SetAnimAction('DoorBash'); + GotoState('DoorBashing'); + } + } +} +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 || VSize(A.Location-Location) <= 250) && !bDecapitated ) + { + bShotAnim = true; + + // Randomly do a moving attack so the player can't kite the zed + if( FRand() < 0.8 ) + { + SetAnimAction('ZombieBarfMoving'); + RunAttackTimeout = GetAnimDuration('ZombieBarf', 1.0); + bMovingPukeAttack=true; + } + else + { + SetAnimAction('ZombieBarf'); + Controller.bPreparingMove = true; + Acceleration = vect(0,0,0); + } + + // Randomly send out a message about Bloat Vomit burning(3% chance) + if ( FRand() < 0.03 && KFHumanPawn(A) != none && PlayerController(KFHumanPawn(A).Controller) != none ) + { + PlayerController(KFHumanPawn(A).Controller).Speech('AUTO', 7, ""); + } + } +} +// Overridden to handle playing upper body only attacks when moving +simulated event SetAnimAction(name NewAction) +{ + local int meleeAnimIndex; + local bool bWantsToAttackAndMove; + if( NewAction=='' ) + Return; + bWantsToAttackAndMove = NewAction == 'ZombieBarfMoving'; + if( NewAction == 'Claw' ) + { + meleeAnimIndex = Rand(3); + NewAction = meleeAnims[meleeAnimIndex]; + } + if( bWantsToAttackAndMove ) + { + ExpectingChannel = AttackAndMoveDoAnimAction(NewAction); + } + else + { + ExpectingChannel = DoAnimAction(NewAction); + } + if( !bWantsToAttackAndMove && AnimNeedsWait(NewAction) ) + { + bWaitForAnim = true; + } + else + { + bWaitForAnim = false; + } + if( Level.NetMode!=NM_Client ) + { + AnimAction = NewAction; + bResetAnimAct = True; + ResetAnimActTime = Level.TimeSeconds+0.3; + } +} +// Handle playing the anim action on the upper body only if we're attacking and moving +simulated function int AttackAndMoveDoAnimAction( name AnimName ) +{ + if( AnimName=='ZombieBarfMoving' ) + { + AnimBlendParams(1, 1.0, 0.0,, FireRootBone); + PlayAnim('ZombieBarf',, 0.1, 1); + + return 1; + } + return super.DoAnimAction( AnimName ); +} + +function PlayDyingSound() +{ + if( Level.NetMode!=NM_Client ) + { + if ( bGibbed ) + { + PlaySound(sound'KF_EnemiesFinalSnd.Bloat_DeathPop', SLOT_Pain,2.0,true,525); + return; + } + + if( bDecapitated ) + { + PlaySound(HeadlessDeathSound, SLOT_Pain,1.30,true,525); + } + else + { + PlaySound(sound'KF_EnemiesFinalSnd.Bloat_DeathPop', SLOT_Pain,2.0,true,525); + } + } +} + +// Barf Time. +function SpawnTwoShots() +{ + local vector X,Y,Z, FireStart; + local rotator FireRotation; + 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 = Location+(vect(30,0,64) >> Rotation)*DrawScale; + if ( !SavedFireProperties.bInitialized ) + { + SavedFireProperties.AmmoClass = Class'SkaarjAmmo'; + SavedFireProperties.ProjectileClass = Class'KFBloatVomit'; + SavedFireProperties.WarnTargetPct = 1; + SavedFireProperties.MaxRange = 500; + SavedFireProperties.bTossed = False; + SavedFireProperties.bTrySplash = False; + SavedFireProperties.bLeadTarget = True; + SavedFireProperties.bInstantHit = True; + SavedFireProperties.bInitialized = True; + } + // Turn off extra collision before spawning vomit, otherwise spawn fails + ToggleAuxCollision(false); + FireRotation = Controller.AdjustAim(SavedFireProperties,FireStart,600); + Spawn(Class'KFBloatVomit',,,FireStart,FireRotation); + FireStart-=(0.5*CollisionRadius*Y); + FireRotation.Yaw -= 1200; + spawn(Class'KFBloatVomit',,,FireStart, FireRotation); + FireStart+=(CollisionRadius*Y); + FireRotation.Yaw += 2400; + spawn(Class'KFBloatVomit',,,FireStart, FireRotation); + // Turn extra collision back on + ToggleAuxCollision(true); +} + +simulated function Tick(float deltatime) +{ + local vector BileExplosionLoc; + local FleshHitEmitter GibBileExplosion; + Super.tick(deltatime); + if( Role == ROLE_Authority && bMovingPukeAttack ) + { + // Keep moving toward the target until the timer runs out (anim finishes) + if( RunAttackTimeout > 0 ) + { + RunAttackTimeout -= DeltaTime; + + if( RunAttackTimeout <= 0 ) + { + RunAttackTimeout = 0; + bMovingPukeAttack=false; + } + } + + // Keep the gorefast moving toward its target when attacking + if( bShotAnim && !bWaitForAnim ) + { + if( LookTarget!=none ) + { + Acceleration = AccelRate * Normal(LookTarget.Location - Location); + } + } + } + // Hack to force animation updates on the server for the bloat if he is relevant to someone + // He has glitches when some of his animations don't play on the server. If we + // find some other fix for the glitches take this out - Ramm + if( Level.NetMode != NM_Client && Level.NetMode != NM_Standalone ) + { + if( (Level.TimeSeconds-LastSeenOrRelevantTime) < 1.0 ) + { + bForceSkelUpdate=true; + } + else + { + bForceSkelUpdate=false; + } + } + if ( Level.NetMode!=NM_DedicatedServer && /*Gored>0*/Health <= 0 && !bPlayBileSplash && + HitDamageType != class'DamTypeBleedOut' ) + { + if ( !class'GameInfo'.static.UseLowGore() ) + { + BileExplosionLoc = self.Location; + BileExplosionLoc.z += (CollisionHeight - (CollisionHeight * 0.5)); + + if (bDecapitated) + { + GibBileExplosion = Spawn(BileExplosionHeadless,self,, BileExplosionLoc ); + } + else + { + GibBileExplosion = Spawn(BileExplosion,self,, BileExplosionLoc ); + } + bPlayBileSplash = true; + } + else + { + BileExplosionLoc = self.Location; + BileExplosionLoc.z += (CollisionHeight - (CollisionHeight * 0.5)); + + GibBileExplosion = Spawn(class 'LowGoreBileExplosion',self,, BileExplosionLoc ); + bPlayBileSplash = true; + } + } +} +function BileBomb() +{ + BloatJet = spawn(class'BileJet', self,,Location,Rotator(-PhysicsVolume.Gravity)); +} +function PlayDyingAnimation(class DamageType, vector HitLoc) +{ +// local bool AttachSucess; + super.PlayDyingAnimation(DamageType, HitLoc); + // Don't blow up with bleed out + if( bDecapitated && DamageType == class'DamTypeBleedOut' ) + { + return; + } + if ( !class'GameInfo'.static.UseLowGore() ) + { + HideBone(SpineBone2); + } + if(Role == ROLE_Authority) + { + BileBomb(); +// if(BloatJet!=none) +// { +// if(Gored < 5) +// AttachSucess=AttachToBone(BloatJet,FireRootBone); +// // else +// // AttachSucess=AttachToBone(BloatJet,SpineBone1); +// +// if(!AttachSucess) +// { +// log("DEAD Bloaty Bile didn't like the Boning :o"); +// BloatJet.SetBase(self); +// } +// BloatJet.SetRelativeRotation(rot(0,-4096,0)); +// } + } +} +simulated function ProcessHitFX() +{ + local Coords boneCoords; + local class HitEffects[4]; + local int i,j; + local float GibPerterbation; + if( (Level.NetMode == NM_DedicatedServer) || bSkeletized || (Mesh == SkeletonMesh)) + { + SimHitFxTicker = HitFxTicker; + return; + } + for ( SimHitFxTicker = SimHitFxTicker; SimHitFxTicker != HitFxTicker; SimHitFxTicker = (SimHitFxTicker + 1) % ArrayCount(HitFX) ) + { + j++; + if ( j > 30 ) + { + SimHitFxTicker = HitFxTicker; + return; + } + + if( (HitFX[SimHitFxTicker].damtype == none) || (Level.bDropDetail && (Level.TimeSeconds - LastRenderTime > 3) && !IsHumanControlled()) ) + continue; + + //log("Processing effects for damtype "$HitFX[SimHitFxTicker].damtype); + + if( HitFX[SimHitFxTicker].bone == 'obliterate' && !class'GameInfo'.static.UseLowGore()) + { + SpawnGibs( HitFX[SimHitFxTicker].rotDir, 1); + bGibbed = true; + // Wait a tick on a listen server so the obliteration can replicate before the pawn is destroyed + if( Level.NetMode == NM_ListenServer ) + { + bDestroyNextTick = true; + TimeSetDestroyNextTickTime = Level.TimeSeconds; + } + else + { + Destroy(); + } + return; + } + + boneCoords = GetBoneCoords( HitFX[SimHitFxTicker].bone ); + + if ( !Level.bDropDetail && !class'GameInfo'.static.NoBlood() && !bSkeletized && !class'GameInfo'.static.UseLowGore() ) + { + //AttachEmitterEffect( BleedingEmitterClass, HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); + + HitFX[SimHitFxTicker].damtype.static.GetHitEffects( HitEffects, Health ); + + if( !PhysicsVolume.bWaterVolume ) // don't attach effects under water + { + for( i = 0; i < ArrayCount(HitEffects); i++ ) + { + if( HitEffects[i] == none ) + continue; + + AttachEffect( HitEffects[i], HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); + } + } + } + + if ( class'GameInfo'.static.UseLowGore() ) + { + HitFX[SimHitFxTicker].bSever = false; + + switch( HitFX[SimHitFxTicker].bone ) + { + case 'head': + if( !bHeadGibbed ) + { + if ( HitFX[SimHitFxTicker].damtype == class'DamTypeDecapitation' ) + { + DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false); + } + else if( HitFX[SimHitFxTicker].damtype == class'DamTypeProjectileDecap' ) + { + DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false, true); + } + else if( HitFX[SimHitFxTicker].damtype == class'DamTypeMeleeDecapitation' ) + { + DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, true); + } + + bHeadGibbed=true; + } + break; + } + + return; + } + + if( HitFX[SimHitFxTicker].bSever ) + { + GibPerterbation = HitFX[SimHitFxTicker].damtype.default.GibPerterbation; + + switch( HitFX[SimHitFxTicker].bone ) + { + case 'obliterate': + break; + + case LeftThighBone: + if( !bLeftLegGibbed ) + { + SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + bLeftLegGibbed=true; + } + break; + + case RightThighBone: + if( !bRightLegGibbed ) + { + SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + bRightLegGibbed=true; + } + break; + + case LeftFArmBone: + if( !bLeftArmGibbed ) + { + SpawnSeveredGiblet( DetachedArmClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ;; + bLeftArmGibbed=true; + } + break; + + case RightFArmBone: + if( !bRightArmGibbed ) + { + SpawnSeveredGiblet( DetachedArmClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + bRightArmGibbed=true; + } + break; + + case 'head': + if( !bHeadGibbed ) + { + if ( HitFX[SimHitFxTicker].damtype == class'DamTypeDecapitation' ) + { + DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false); + } + else if( HitFX[SimHitFxTicker].damtype == class'DamTypeProjectileDecap' ) + { + DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false, true); + } + else if( HitFX[SimHitFxTicker].damtype == class'DamTypeMeleeDecapitation' ) + { + DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, true); + } + + bHeadGibbed=true; + } + break; + } + + // Don't do this right now until we get the effects sorted - Ramm + if( HitFX[SimHitFXTicker].bone != 'Spine' && HitFX[SimHitFXTicker].bone != FireRootBone && + HitFX[SimHitFXTicker].bone != LeftFArmBone && HitFX[SimHitFXTicker].bone != RightFArmBone && + HitFX[SimHitFXTicker].bone != 'head' && Health <=0 ) + HideBone(HitFX[SimHitFxTicker].bone); + } + } +} +simulated function HideBone(name boneName) +{ + local int BoneScaleSlot; + local coords boneCoords; + local bool bValidBoneToHide; + + if( boneName == LeftThighBone ) + { + boneScaleSlot = 0; + bValidBoneToHide = true; + if( SeveredLeftLeg == none ) + { + SeveredLeftLeg = Spawn(SeveredLegAttachClass,self); + SeveredLeftLeg.SetDrawScale(SeveredLegAttachScale); + boneCoords = GetBoneCoords( 'lleg' ); + AttachEmitterEffect( LimbSpurtEmitterClass, 'lleg', boneCoords.Origin, rot(0,0,0) ); + AttachToBone(SeveredLeftLeg, 'lleg'); + } + } + else if ( boneName == RightThighBone ) + { + boneScaleSlot = 1; + bValidBoneToHide = true; + if( SeveredRightLeg == none ) + { + SeveredRightLeg = Spawn(SeveredLegAttachClass,self); + SeveredRightLeg.SetDrawScale(SeveredLegAttachScale); + boneCoords = GetBoneCoords( 'rleg' ); + AttachEmitterEffect( LimbSpurtEmitterClass, 'rleg', boneCoords.Origin, rot(0,0,0) ); + AttachToBone(SeveredRightLeg, 'rleg'); + } + } + else if( boneName == RightFArmBone ) + { + boneScaleSlot = 2; + bValidBoneToHide = true; + if( SeveredRightArm == none ) + { + SeveredRightArm = Spawn(SeveredArmAttachClass,self); + SeveredRightArm.SetDrawScale(SeveredArmAttachScale); + boneCoords = GetBoneCoords( 'rarm' ); + AttachEmitterEffect( LimbSpurtEmitterClass, 'rarm', boneCoords.Origin, rot(0,0,0) ); + AttachToBone(SeveredRightArm, 'rarm'); + } + } + else if ( boneName == LeftFArmBone ) + { + boneScaleSlot = 3; + bValidBoneToHide = true; + if( SeveredLeftArm == none ) + { + SeveredLeftArm = Spawn(SeveredArmAttachClass,self); + SeveredLeftArm.SetDrawScale(SeveredArmAttachScale); + boneCoords = GetBoneCoords( 'larm' ); + AttachEmitterEffect( LimbSpurtEmitterClass, 'larm', boneCoords.Origin, rot(0,0,0) ); + AttachToBone(SeveredLeftArm, 'larm'); + } + } + else if ( boneName == HeadBone ) + { + // Only scale the bone down once + if( SeveredHead == none ) + { + bValidBoneToHide = true; + boneScaleSlot = 4; + SeveredHead = Spawn(SeveredHeadAttachClass,self); + SeveredHead.SetDrawScale(SeveredHeadAttachScale); + boneCoords = GetBoneCoords( 'neck' ); + AttachEmitterEffect( NeckSpurtEmitterClass, 'neck', boneCoords.Origin, rot(0,0,0) ); + AttachToBone(SeveredHead, 'neck'); + } + else + { + return; + } + } + else if ( boneName == 'spine' ) + { + bValidBoneToHide = true; + boneScaleSlot = 5; + } + else if ( boneName == SpineBone2 ) + { + bValidBoneToHide = true; + boneScaleSlot = 6; + } + // Only hide the bone if it is one of the arms, legs, or head, don't hide other misc bones + if( bValidBoneToHide ) + { + SetBoneScale(BoneScaleSlot, 0.0, BoneName); + } +} + +State Dying +{ + function tick(float deltaTime) + { + if (BloatJet != none) + { + BloatJet.SetLocation(location); + BloatJet.SetRotation(GetBoneRotation(FireRootBone)); + } + super.tick(deltaTime); + } +} +function RemoveHead() +{ + bCanDistanceAttackDoors = False; + Super.RemoveHead(); +} +function ModDamage(out int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI, optional float lockonTime){ + if(damageType == class 'DamTypeVomit' || damageType == class 'DamTypeBlowerThrower') + Damage = 0; + else + Super.ModDamage(Damage, instigatedBy, hitlocation, momentum, damageType, headshotLevel, KFPRI); +} +static simulated function PreCacheStaticMeshes(LevelInfo myLevel) +{//should be derived and used. + Super.PreCacheStaticMeshes(myLevel); + myLevel.AddPrecacheStaticMesh(StaticMesh'kf_gore_trip_sm.limbs.bloat_head'); +} +static simulated function PreCacheMaterials(LevelInfo myLevel) +{ + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.bloat_cmb'); + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.bloat_env_cmb'); + myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.bloat_diffuse'); +} +defaultproperties +{ + BileExplosion=Class'KFMod.BileExplosion' + BileExplosionHeadless=Class'KFMod.BileExplosionHeadless' + stunLoopStart=0.100000 + stunLoopEnd=0.600000 + idleInsertFrame=0.950000 + EventClasses(0)="NicePack.NiceZombieBloat" + MoanVoice=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_Talk' + MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_HitPlayer' + JumpSound=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_Jump' + DetachedArmClass=Class'KFChar.SeveredArmBloat' + DetachedLegClass=Class'KFChar.SeveredLegBloat' + DetachedHeadClass=Class'KFChar.SeveredHeadBloat' + HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_Pain' + DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_Death' + ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_Challenge' + ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_Challenge' + ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_Challenge' + ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_Challenge' + AmbientSound=Sound'KF_BaseBloat.Bloat_Idle1Loop' + Mesh=SkeletalMesh'KF_Freaks_Trip.Bloat_Freak' + Skins(0)=Combiner'KF_Specimens_Trip_T.bloat_cmb' +} diff --git a/sources/Zeds/Nice/NiceZombieBloatBase.uc b/sources/Zeds/Nice/NiceZombieBloatBase.uc index dcc7c5f..500f880 100644 --- a/sources/Zeds/Nice/NiceZombieBloatBase.uc +++ b/sources/Zeds/Nice/NiceZombieBloatBase.uc @@ -1,15 +1,70 @@ -// Zombie Monster for KF Invasion gametype -class NiceZombieBloatBase extends NiceMonster - abstract; -#exec OBJ LOAD FILE=KF_EnemiesFinalSnd.uax -var BileJet BloatJet; -var bool bPlayBileSplash; -var bool bMovingPukeAttack; -var float RunAttackTimeout; -//------------------------------------------------------------------------------- -// NOTE: All Code resides in the child class(this class was only created to -// eliminate hitching caused by loading default properties during play) -//------------------------------------------------------------------------------- -defaultproperties -{ StunThreshold=4.000000 fuelRatio=0.250000 clientHeadshotScale=1.500000 MeleeAnims(0)="BloatChop2" MeleeAnims(1)="BloatChop2" MeleeAnims(2)="BloatChop2" BleedOutDuration=6.000000 ZapThreshold=0.500000 ZappedDamageMod=1.500000 bHarpoonToBodyStuns=False ZombieFlag=1 MeleeDamage=14 damageForce=70000 bFatAss=True KFRagdollName="Bloat_Trip" PuntAnim="BloatPunt" Intelligence=BRAINS_Stupid bCanDistanceAttackDoors=True bUseExtendedCollision=True ColOffset=(Z=60.000000) ColRadius=27.000000 ColHeight=22.000000 SeveredArmAttachScale=1.100000 SeveredLegAttachScale=1.300000 SeveredHeadAttachScale=1.700000 PlayerCountHealthScale=0.250000 OnlineHeadshotOffset=(X=5.000000,Z=70.000000) OnlineHeadshotScale=1.500000 AmmunitionClass=Class'KFMod.BZombieAmmo' ScoringValue=17 IdleHeavyAnim="BloatIdle" IdleRifleAnim="BloatIdle" MeleeRange=30.000000 GroundSpeed=75.000000 WaterSpeed=102.000000 HealthMax=525.000000 Health=525 HeadHeight=2.500000 HeadScale=1.500000 AmbientSoundScaling=8.000000 MenuName="Nice Bloat" MovementAnims(0)="WalkBloat" MovementAnims(1)="WalkBloat" WalkAnims(0)="WalkBloat" WalkAnims(1)="WalkBloat" WalkAnims(2)="WalkBloat" WalkAnims(3)="WalkBloat" IdleCrouchAnim="BloatIdle" IdleWeaponAnim="BloatIdle" IdleRestAnim="BloatIdle" DrawScale=1.075000 PrePivot=(Z=5.000000) SoundVolume=200 Mass=400.000000 RotationRate=(Yaw=45000,Roll=0) -} +// Zombie Monster for KF Invasion gametype +class NiceZombieBloatBase extends NiceMonster + abstract; +#exec OBJ LOAD FILE=KF_EnemiesFinalSnd.uax +var BileJet BloatJet; +var bool bPlayBileSplash; +var bool bMovingPukeAttack; +var float RunAttackTimeout; +//------------------------------------------------------------------------------- +// NOTE: All Code resides in the child class(this class was only created to +// eliminate hitching caused by loading default properties during play) +//------------------------------------------------------------------------------- +defaultproperties +{ + StunThreshold=4.000000 + fuelRatio=0.250000 + clientHeadshotScale=1.500000 + MeleeAnims(0)="BloatChop2" + MeleeAnims(1)="BloatChop2" + MeleeAnims(2)="BloatChop2" + BleedOutDuration=6.000000 + ZapThreshold=0.500000 + ZappedDamageMod=1.500000 + bHarpoonToBodyStuns=False + ZombieFlag=1 + MeleeDamage=14 + damageForce=70000 + bFatAss=True + KFRagdollName="Bloat_Trip" + PuntAnim="BloatPunt" + Intelligence=BRAINS_Stupid + bCanDistanceAttackDoors=True + bUseExtendedCollision=True + ColOffset=(Z=60.000000) + ColRadius=27.000000 + ColHeight=22.000000 + SeveredArmAttachScale=1.100000 + SeveredLegAttachScale=1.300000 + SeveredHeadAttachScale=1.700000 + PlayerCountHealthScale=0.250000 + OnlineHeadshotOffset=(X=5.000000,Z=70.000000) + OnlineHeadshotScale=1.500000 + AmmunitionClass=Class'KFMod.BZombieAmmo' + ScoringValue=17 + IdleHeavyAnim="BloatIdle" + IdleRifleAnim="BloatIdle" + MeleeRange=30.000000 + GroundSpeed=75.000000 + WaterSpeed=102.000000 + HealthMax=525.000000 + Health=525 + HeadHeight=2.500000 + HeadScale=1.500000 + AmbientSoundScaling=8.000000 + MenuName="Nice Bloat" + MovementAnims(0)="WalkBloat" + MovementAnims(1)="WalkBloat" + WalkAnims(0)="WalkBloat" + WalkAnims(1)="WalkBloat" + WalkAnims(2)="WalkBloat" + WalkAnims(3)="WalkBloat" + IdleCrouchAnim="BloatIdle" + IdleWeaponAnim="BloatIdle" + IdleRestAnim="BloatIdle" + DrawScale=1.075000 + PrePivot=(Z=5.000000) + SoundVolume=200 + Mass=400.000000 + RotationRate=(Yaw=45000,Roll=0) +} diff --git a/sources/Zeds/Nice/NiceZombieBoss.uc b/sources/Zeds/Nice/NiceZombieBoss.uc index 8f510a5..f57f390 100644 --- a/sources/Zeds/Nice/NiceZombieBoss.uc +++ b/sources/Zeds/Nice/NiceZombieBoss.uc @@ -1,871 +1,1817 @@ -// Zombie Monster for KF Invasion gametype -class NiceZombieBoss extends NiceZombieBossBase; -#exec OBJ LOAD FILE=KFPatch2.utx -#exec OBJ LOAD FILE=KF_Specimens_Trip_T.utx -//---------------------------------------------------------------------------- -// NOTE: Most Variables are declared in the base class to eliminate hitching -//---------------------------------------------------------------------------- -var NiceBossHPNeedle CurrentNeedle; -// Last time we checked if a player was melee exploiting us -var float LastMeleeExploitCheckTime; -// Used to track what type of melee exploiters you have -var int NumLumberJacks; -var int NumNinjas; -// Make the Boss's ambient scale higher, since there is only 1, doesn't matter if he's relevant almost all the time -simulated function CalcAmbientRelevancyScale() -{ // Make the zed only relevant by thier ambient sound out to a range of 100 meters CustomAmbientRelevancyScale = 5000/(100 * SoundRadius); -} -function vector ComputeTrajectoryByTime( vector StartPosition, vector EndPosition, float fTimeEnd ) -{ - local vector NewVelocity; - NewVelocity = Super.ComputeTrajectoryByTime( StartPosition, EndPosition, fTimeEnd ); - if( PhysicsVolume.IsA( 'KFPhysicsVolume' ) && StartPosition.Z < EndPosition.Z ) - { if( PhysicsVolume.Gravity.Z < class'PhysicsVolume'.default.Gravity.Z ) { // Just checking mass to be extra-cautious. if( Mass > 900 ) { // Extra velocity boost to counter oversized mass weighing the boss down. NewVelocity.Z += 90; } } - } - return NewVelocity; -} -function ZombieMoan() -{ - if( !bShotAnim ) // Do not moan while taunting Super.ZombieMoan(); -} -// Speech notifies called from the anims -function PatriarchKnockDown() -{ - PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_KnockedDown', SLOT_Misc, 2.0,true,500.0); -} -function PatriarchEntrance() -{ - PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Entrance', SLOT_Misc, 2.0,true,500.0); -} -function PatriarchVictory() -{ - PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Victory', SLOT_Misc, 2.0,true,500.0); -} -function PatriarchMGPreFire() -{ - PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_WarnGun', SLOT_Misc, 2.0,true,1000.0); -} -function PatriarchMisslePreFire() -{ - PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_WarnRocket', SLOT_Misc, 2.0,true,1000.0); -} -// Taunt to use when doing the melee exploit radial attack -function PatriarchRadialTaunt() -{ - if( NumNinjas > 0 && NumNinjas > NumLumberJacks ) - { PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_TauntNinja', SLOT_Misc, 2.0,true,500.0); - } - else if( NumLumberJacks > 0 && NumLumberJacks > NumNinjas ) - { PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_TauntLumberJack', SLOT_Misc, 2.0,true,500.0); - } - else - { PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_TauntRadial', SLOT_Misc, 2.0,true,500.0); - } -} -// Don't do this for the Patriarch -// No need to overload these when inheriting from NiceMonster -/*simulated function SetBurningBehavior(){} -simulated function UnSetBurningBehavior(){}*/ -function bool CanGetOutOfWay(){ - return false; -} -simulated function Tick(float DeltaTime) -{ - local KFHumanPawn HP; - Super.Tick(DeltaTime); - // Process the pipe bomb time damage scale, reducing the scale over time so - // it goes back up to 100% damage over a few seconds - if( Role == ROLE_Authority ) - { PipeBombDamageScale -= DeltaTime * 0.33; - if( PipeBombDamageScale < 0 ) { PipeBombDamageScale = 0; } - } - if( Level.NetMode==NM_DedicatedServer ) Return; // Servers aren't intrested in this info. - bSpecialCalcView = bIsBossView; - if( bZapped ) - { // Make sure we check if we need to be cloaked as soon as the zap wears off LastCheckTimes = Level.TimeSeconds; - } - else if( bCloaked && Level.TimeSeconds>LastCheckTimes ) - { LastCheckTimes = Level.TimeSeconds+0.8; ForEach VisibleCollidingActors(Class'KFHumanPawn',HP,1000,Location) { if( HP.Health <= 0 || !HP.ShowStalkers() ) continue; - // If he's a commando, we've been spotted. if( !bSpotted ) { bSpotted = True; CloakBoss(); } Return; } // if we're uberbrite, turn down the light if( bSpotted ) { bSpotted = False; bUnlit = false; CloakBoss(); } - } -} -simulated function CloakBoss() -{ - local Controller C; - local int Index; - // No cloaking if zapped - if( bZapped ) - { return; - } - if( bSpotted ) - { Visibility = 120; if( Level.NetMode==NM_DedicatedServer ) Return; Skins[0] = Finalblend'KFX.StalkerGlow'; Skins[1] = Finalblend'KFX.StalkerGlow'; bUnlit = true; return; - } - Visibility = 1; - bCloaked = true; - if( Level.NetMode!=NM_Client ) - { For( C=Level.ControllerList; C!=none; C=C.NextController ) { if( C.bIsPlayer && C.Enemy==Self ) C.Enemy = none; // Make bots lose sight with me. } - } - if( Level.NetMode==NM_DedicatedServer ) Return; - Skins[0] = Shader'KF_Specimens_Trip_T.patriarch_invisible_gun'; - Skins[1] = Shader'KF_Specimens_Trip_T.patriarch_invisible'; - // Invisible - no shadow - if(PlayerShadow != none) PlayerShadow.bShadowActive = false; - // Remove/disallow projectors on invisible people - Projectors.Remove(0, Projectors.Length); - bAcceptsProjectors = false; - SetOverlayMaterial(FinalBlend'KF_Specimens_Trip_T.patriarch_fizzle_FB', 1.0, true); - // Randomly send out a message about Patriarch going invisible(10% chance) - if ( FRand() < 0.10 ) - { // Pick a random Player to say the message Index = Rand(Level.Game.NumPlayers); - for ( C = Level.ControllerList; C != none; C = C.NextController ) { if ( PlayerController(C) != none ) { if ( Index == 0 ) { PlayerController(C).Speech('AUTO', 8, ""); break; } - Index--; } } - } -} -simulated function UnCloakBoss() -{ - if( bZapped ) - { return; - } - Visibility = default.Visibility; - bCloaked = false; - bSpotted = False; - bUnlit = False; - if( Level.NetMode==NM_DedicatedServer ) Return; - Skins = Default.Skins; - if (PlayerShadow != none) PlayerShadow.bShadowActive = true; - bAcceptsProjectors = true; - SetOverlayMaterial( none, 0.0, true ); -} -// Set the zed to the zapped behavior -simulated function SetZappedBehavior() -{ - super.SetZappedBehavior(); - // Handle setting the zed to uncloaked so the zapped overlay works properly - if( Level.Netmode != NM_DedicatedServer ) - { bUnlit = false; Skins = Default.Skins; - if (PlayerShadow != none) PlayerShadow.bShadowActive = true; - bAcceptsProjectors = true; SetOverlayMaterial(Material'KFZED_FX_T.Energy.ZED_overlay_Hit_Shdr', 999, true); - } -} -// Turn off the zapped behavior -simulated function UnSetZappedBehavior() -{ - super.UnSetZappedBehavior(); - // Handle getting the zed back cloaked if need be - if( Level.Netmode != NM_DedicatedServer ) - { LastCheckTimes = Level.TimeSeconds; SetOverlayMaterial(none, 0.0f, true); - } -} -// Overridden because we need to handle the overlays differently for zombies that can cloak -function SetZapped(float ZapAmount, Pawn Instigator) -{ - LastZapTime = Level.TimeSeconds; - if( bZapped ) - { TotalZap = ZapThreshold; RemainingZap = ZapDuration; - } - else - { TotalZap += ZapAmount; - if( TotalZap >= ZapThreshold ) { RemainingZap = ZapDuration; bZapped = true; } - } - ZappedBy = Instigator; -} -//----------------------------------------------------------------------------- -// PostBeginPlay -//----------------------------------------------------------------------------- -simulated function PostBeginPlay() -{ - super.PostBeginPlay(); - if( Role < ROLE_Authority ) - { return; - } - // Difficulty Scaling - if (Level.Game != none) - { if(Level.Game.GameDifficulty >= 5.0) // Hell on Earth & Suicidal MGDamage = default.MGDamage * 1.3; else MGDamage = default.MGDamage * 1.0; - } - HealingLevels[0] = Health/1.25; // Around 5600 HP - HealingLevels[1] = Health/2.f; // Around 3500 HP - HealingLevels[2] = Health/3.2; // Around 2187 HP -// log("Health = "$Health); -// log("HealingLevels[0] = "$HealingLevels[0]); -// log("HealingLevels[1] = "$HealingLevels[1]); -// log("HealingLevels[2] = "$HealingLevels[2]); - HealingAmount = Health/4; // 1750 HP -// log("HealingAmount = "$HealingAmount); -} -function bool MakeGrandEntry() -{ - bShotAnim = true; - Acceleration = vect(0,0,0); - SetAnimAction('Entrance'); - HandleWaitForAnim('Entrance'); - GotoState('MakingEntrance'); - return True; -} -// State of playing the initial entrance anim -state MakingEntrance -{ - Ignores RangedAttack; - function Tick( float Delta ) - { Acceleration = vect(0,0,0); - global.Tick(Delta); - } -Begin: - Sleep(GetAnimDuration('Entrance')); - GotoState('InitialSneak'); -} -// State of doing a radial damaging attack that we do when people are trying to melee exploit -state RadialAttack -{ - Ignores RangedAttack; - function bool ShouldChargeFromDamage() - { return false; - } - function Tick( float Delta ) - { Acceleration = vect(0,0,0); - //DrawDebugSphere( Location, 150, 12, 0, 255, 0); - global.Tick(Delta); - } - function ClawDamageTarget() - { local vector PushDir; local float UsedMeleeDamage; local bool bDamagedSomeone, bDamagedThisHit; local KFHumanPawn P; local Actor OldTarget; local float RadialDamageBase; - MeleeRange = 150; - if(Controller!=none && Controller.Target!=none) PushDir = (damageForce * Normal(Controller.Target.Location - Location)); else PushDir = damageForce * vector(Rotation); - OldTarget = Controller.Target; - // Damage all players within a radius foreach DynamicActors(class'KFHumanPawn', P) { if ( VSize(P.Location - Location) < MeleeRange) { Controller.Target = P; - // This attack cuts through shields, so crank up the damage if they have a lot of shields if( P.ShieldStrength >= 50 ) { RadialDamageBase = 240; } else { RadialDamageBase = 120; } - // Randomize the damage a bit so everyone gets really hurt, but only some poeple die UsedMeleeDamage = (RadialDamageBase - (RadialDamageBase * 0.55)) + (RadialDamageBase * (FRand() * 0.45)); //log("UsedMeleeDamage = "$UsedMeleeDamage); - bDamagedThisHit = MeleeDamageTarget(UsedMeleeDamage, damageForce * Normal(P.Location - Location)); if( !bDamagedSomeone && bDamagedThisHit ) { bDamagedSomeone = true; } MeleeRange = 150; } } - Controller.Target = OldTarget; - MeleeRange = Default.MeleeRange; - if ( bDamagedSomeone ) { // Maybe cause zedtime when the patriarch does his radial attack KFGameType(Level.Game).DramaticEvent(0.3); PlaySound(MeleeAttackHitSound, SLOT_Interact, 2.0); } - } - function EndState() - { NumLumberJacks = 0; NumNinjas = 0; - } -Begin: - // Don't let the zed move and play the radial attack - bShotAnim = true; - Acceleration = vect(0,0,0); - SetAnimAction('RadialAttack'); - KFMonsterController(Controller).bUseFreezeHack = True; - HandleWaitForAnim('RadialAttack'); - Sleep(GetAnimDuration('RadialAttack')); - // TODO: this sleep is here to allow for playing the taunt sound. Take it out when the animation is extended with the taunt - Ramm - //Sleep(2.5); - GotoState(''); -} -simulated function Destroyed() -{ - if( mTracer!=none ) mTracer.Destroy(); - if( mMuzzleFlash!=none ) mMuzzleFlash.Destroy(); - Super.Destroyed(); -} -simulated Function PostNetBeginPlay() -{ - EnableChannelNotify ( 1,1); - AnimBlendParams(1, 1.0, 0.0,, SpineBone1); - super.PostNetBeginPlay(); - TraceHitPos = vect(0,0,0); - bNetNotify = True; -} -function bool IsStunPossible(){ - return false; -} -function bool CheckStun(int stunScore, Pawn instigatedBy, Vector hitLocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI){ - return false; -} -function bool CheckMiniFlinch( int flinchScore, Pawn instigatedBy, Vector hitLocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI){ - return false; -} -function bool OnlyEnemyAround( Pawn Other ) -{ - local Controller C; - For( C=Level.ControllerList; C!=none; C=C.NextController ) - { if( C.bIsPlayer && C.Pawn!=none && C.Pawn!=Other && ((VSize(C.Pawn.Location-Location)<1500 && FastTrace(C.Pawn.Location,Location)) || (VSize(C.Pawn.Location-Other.Location)<1000 && FastTrace(C.Pawn.Location,Other.Location))) ) Return False; - } - Return True; -} -function bool IsCloseEnuf( Actor A ) -{ - local vector V; - if( A==none ) Return False; - V = A.Location-Location; - if( Abs(V.Z)>(CollisionHeight+A.CollisionHeight) ) Return False; - V.Z = 0; - Return (VSize(V)<(CollisionRadius+A.CollisionRadius+25)); -} -function RangedAttack(Actor A) -{ - local float D; - local bool bOnlyE; - local bool bDesireChainGun; - // Randomly make him want to chaingun more - if( Controller.LineOfSightTo(A) && FRand() < 0.15 && LastChainGunTime1500 && Pawn(A)!=none && FRand() < 0.5 ) { SetAnimAction('MeleeImpale'); } else { SetAnimAction('MeleeClaw'); //PlaySound(sound'Claw2s', SLOT_none); KFTODO: Replace this } - } - else if( Level.TimeSeconds - LastSneakedTime > 20.0 ) - { if( FRand() < 0.3 ) { // Wait another 20 to try this again LastSneakedTime = Level.TimeSeconds;//+FRand()*120; Return; } SetAnimAction('transition'); GoToState('SneakAround'); - } - else if( bChargingPlayer && (bOnlyE || D<200) ) Return; - else if( !bDesireChainGun && !bChargingPlayer && (D<300 || (D<700 && bOnlyE)) && (Level.TimeSeconds - LastChargeTime > (5.0 + 5.0 * FRand())) ) // Don't charge again for a few seconds - { SetAnimAction('transition'); GoToState('Charging'); - } - else if( LastMissileTime 500 ) - { if( !Controller.LineOfSightTo(A) || FRand() > 0.75 ) { LastMissileTime = Level.TimeSeconds+FRand() * 5; Return; } - LastMissileTime = Level.TimeSeconds + 10 + FRand() * 15; - bShotAnim = true; Acceleration = vect(0,0,0); SetAnimAction('PreFireMissile'); - HandleWaitForAnim('PreFireMissile'); - GoToState('FireMissile'); - } - else if ( !bWaitForAnim && !bShotAnim && LastChainGunTime 0.85 ) { LastChainGunTime = Level.TimeSeconds+FRand()*4; Return; } - LastChainGunTime = Level.TimeSeconds + 5 + FRand() * 10; - bShotAnim = true; Acceleration = vect(0,0,0); SetAnimAction('PreFireMG'); - HandleWaitForAnim('PreFireMG'); MGFireCounter = Rand(60) + 35; - GoToState('FireChaingun'); - } -} -event Bump(actor Other) -{ - Super(Monster).Bump(Other); - if( Other==none ) return; - if( Other.IsA('NetKActor') && Physics != PHYS_Falling && !bShotAnim && Abs(Other.Location.Z-Location.Z)<(CollisionHeight+Other.CollisionHeight) ) - { // Kill the annoying deco brat. Controller.Target = Other; Controller.Focus = Other; bShotAnim = true; Acceleration = (Other.Location-Location); SetAnimAction('MeleeClaw'); //PlaySound(sound'Claw2s', SLOT_none); KFTODO: Replace this HandleWaitForAnim('MeleeClaw'); - } -} -simulated function AddTraceHitFX( vector HitPos ) -{ - local vector Start,SpawnVel,SpawnDir; - local float hitDist; - Start = GetBoneCoords('tip').Origin; - if( mTracer==none ) mTracer = Spawn(Class'KFMod.KFNewTracer',,,Start); - else mTracer.SetLocation(Start); - if( mMuzzleFlash==none ) - { // KFTODO: Replace this mMuzzleFlash = Spawn(Class'MuzzleFlash3rdMG'); AttachToBone(mMuzzleFlash, 'tip'); - } - else mMuzzleFlash.SpawnParticle(1); - hitDist = VSize(HitPos - Start) - 50.f; - if( hitDist>10 ) - { SpawnDir = Normal(HitPos - Start); SpawnVel = SpawnDir * 10000.f; 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 / 10000.f; mTracer.Emitters[0].LifetimeRange.Max = mTracer.Emitters[0].LifetimeRange.Min; mTracer.SpawnParticle(1); - } - Instigator = Self; - if( HitPos != vect(0,0,0) ) - { Spawn(class'ROBulletHitEffect',,, HitPos, Rotator(Normal(HitPos - Start))); - } -} -simulated function AnimEnd( int Channel ) -{ - local name Sequence; - local float Frame, Rate; - if( Level.NetMode==NM_Client && bMinigunning ) - { GetAnimParams( Channel, Sequence, Frame, Rate ); - if( Sequence != 'PreFireMG' && Sequence != 'FireMG' ) { Super.AnimEnd(Channel); return; } - PlayAnim('FireMG'); bWaitForAnim = true; bShotAnim = true; IdleTime = Level.TimeSeconds; - } - else Super.AnimEnd(Channel); -} -state FireChaingun -{ - function RangedAttack(Actor A) - { Controller.Target = A; Controller.Focus = A; - } - // Chaingun mode handles this itself - function bool ShouldChargeFromDamage() - { return false; - } - function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, optional int HitIndex) - { local float EnemyDistSq, DamagerDistSq; - global.TakeDamage(Damage,instigatedBy,hitlocation,vect(0,0,0),damageType); - // if someone close up is shooting us, just charge them if( InstigatedBy != none ) { DamagerDistSq = VSizeSquared(Location - InstigatedBy.Location); - if( (ChargeDamage > 200 && DamagerDistSq < (500 * 500)) || DamagerDistSq < (100 * 100) ) { SetAnimAction('transition'); //log("Frak this shizz, Charging!!!!"); GoToState('Charging'); return; } } - if( Controller.Enemy != none && InstigatedBy != none && InstigatedBy != Controller.Enemy ) { EnemyDistSq = VSizeSquared(Location - Controller.Enemy.Location); DamagerDistSq = VSizeSquared(Location - InstigatedBy.Location); } - if( InstigatedBy != none && (DamagerDistSq < EnemyDistSq || Controller.Enemy == none) ) { MonsterController(Controller).ChangeEnemy(InstigatedBy,Controller.CanSee(InstigatedBy)); Controller.Target = InstigatedBy; Controller.Focus = InstigatedBy; - if( DamagerDistSq < (500 * 500) ) { SetAnimAction('transition'); GoToState('Charging'); } } - } - function EndState() - { TraceHitPos = vect(0,0,0); bMinigunning = False; - AmbientSound = default.AmbientSound; SoundVolume=default.SoundVolume; SoundRadius=default.SoundRadius; MGFireCounter=0; - LastChainGunTime = Level.TimeSeconds + 5 + (FRand()*10); - } - function BeginState() - { bFireAtWill = False; Acceleration = vect(0,0,0); MGLostSightTimeout = 0.0; bMinigunning = True; - } - function AnimEnd( int Channel ) - { if( MGFireCounter <= 0 ) { bShotAnim = true; Acceleration = vect(0,0,0); SetAnimAction('FireEndMG'); HandleWaitForAnim('FireEndMG'); GoToState(''); } else { if ( Controller.Enemy != none ) { if ( Controller.LineOfSightTo(Controller.Enemy) && FastTrace(GetBoneCoords('tip').Origin,Controller.Enemy.Location)) { MGLostSightTimeout = 0.0; Controller.Focus = Controller.Enemy; Controller.FocalPoint = Controller.Enemy.Location; } else { MGLostSightTimeout = Level.TimeSeconds + (0.25 + FRand() * 0.35); Controller.Focus = none; } - Controller.Target = Controller.Enemy; } else { MGLostSightTimeout = Level.TimeSeconds + (0.25 + FRand() * 0.35); Controller.Focus = none; } - if( !bFireAtWill ) { MGFireDuration = Level.TimeSeconds + (0.75 + FRand() * 0.5); } else if ( FRand() < 0.03 && Controller.Enemy != none && PlayerController(Controller.Enemy.Controller) != none ) { // Randomly send out a message about Patriarch shooting chain gun(3% chance) PlayerController(Controller.Enemy.Controller).Speech('AUTO', 9, ""); } - bFireAtWill = True; bShotAnim = true; Acceleration = vect(0,0,0); - SetAnimAction('FireMG'); bWaitForAnim = true; } - } - function FireMGShot() - { local vector Start,End,HL,HN,Dir; local rotator R; local Actor A; - MGFireCounter--; - if( AmbientSound != MiniGunFireSound ) { SoundVolume=255; SoundRadius=400; AmbientSound = MiniGunFireSound; } - Start = GetBoneCoords('tip').Origin; if( Controller.Focus!=none ) R = rotator(Controller.Focus.Location-Start); else R = rotator(Controller.FocalPoint-Start); if( NeedToTurnFor(R) ) R = Rotation; // KFTODO: Maybe scale this accuracy by his skill or the game difficulty Dir = Normal(vector(R)+VRand()*0.06); //*0.04 End = Start+Dir*10000; - // Have to turn of hit point collision so trace doesn't hit the Human Pawn's bullet whiz cylinder bBlockHitPointTraces = false; A = Trace(HL,HN,End,Start,True); bBlockHitPointTraces = true; - if( A==none ) Return; TraceHitPos = HL; if( Level.NetMode!=NM_DedicatedServer ) AddTraceHitFX(HL); - if( A!=Level ) { A.TakeDamage(MGDamage+Rand(3),Self,HL,Dir*500,Class'DamageType'); } - } - function bool NeedToTurnFor( rotator targ ) - { local int YawErr; - targ.Yaw = DesiredRotation.Yaw & 65535; YawErr = (targ.Yaw - (Rotation.Yaw & 65535)) & 65535; return !((YawErr < 2000) || (YawErr > 64535)); - } -Begin: - While( True ) - { Acceleration = vect(0,0,0); - if( MGLostSightTimeout > 0 && Level.TimeSeconds > MGLostSightTimeout ) { bShotAnim = true; Acceleration = vect(0,0,0); SetAnimAction('FireEndMG'); HandleWaitForAnim('FireEndMG'); GoToState(''); } - if( MGFireCounter <= 0 ) { bShotAnim = true; Acceleration = vect(0,0,0); SetAnimAction('FireEndMG'); HandleWaitForAnim('FireEndMG'); GoToState(''); } - // Give some randomness to the patriarch's firing if( Level.TimeSeconds > MGFireDuration ) { if( AmbientSound != MiniGunSpinSound ) { SoundVolume=185; SoundRadius=200; AmbientSound = MiniGunSpinSound; } Sleep(0.5 + FRand() * 0.75); MGFireDuration = Level.TimeSeconds + (0.75 + FRand() * 0.5); } else { if( bFireAtWill ) FireMGShot(); Sleep(0.05); } - } -} -state FireMissile -{ -Ignores RangedAttack; - function bool ShouldChargeFromDamage() - { return false; - } - function BeginState() - { Acceleration = vect(0,0,0); - } - function AnimEnd( int Channel ) - { local vector Start; local Rotator R; - Start = GetBoneCoords('tip').Origin; - if ( !SavedFireProperties.bInitialized ) { SavedFireProperties.AmmoClass = MyAmmo.Class; SavedFireProperties.ProjectileClass = MyAmmo.ProjectileClass; SavedFireProperties.WarnTargetPct = 0.15; SavedFireProperties.MaxRange = 10000; SavedFireProperties.bTossed = False; SavedFireProperties.bTrySplash = False; SavedFireProperties.bLeadTarget = True; SavedFireProperties.bInstantHit = True; SavedFireProperties.bInitialized = true; } - R = AdjustAim(SavedFireProperties,Start,100); PlaySound(RocketFireSound,SLOT_Interact,2.0,,TransientSoundRadius,,false); Spawn(Class'NiceBossLAWProj',,,Start,R); - bShotAnim = true; Acceleration = vect(0,0,0); SetAnimAction('FireEndMissile'); HandleWaitForAnim('FireEndMissile'); - // Randomly send out a message about Patriarch shooting a rocket(5% chance) if ( FRand() < 0.05 && Controller.Enemy != none && PlayerController(Controller.Enemy.Controller) != none ) { PlayerController(Controller.Enemy.Controller).Speech('AUTO', 10, ""); } - GoToState(''); - } -Begin: - while ( true ) - { Acceleration = vect(0,0,0); Sleep(0.1); - } -} -function bool MeleeDamageTarget(int hitdamage, vector pushdir) -{ - if( Controller.Target!=none && Controller.Target.IsA('NetKActor') ) pushdir = Normal(Controller.Target.Location-Location)*100000; // Fly bitch! - // Used to set MeleeRange = Default.MeleeRange; in Balance Round 1, fixed in Balance Round 2 - return Super.MeleeDamageTarget(hitdamage, pushdir); -} -state Charging -{ - // Don't override speed in this state - function bool CanSpeedAdjust() - { return false; - } - function bool ShouldChargeFromDamage() - { return false; - } - function BeginState() - { bChargingPlayer = True; if( Level.NetMode!=NM_DedicatedServer ) PostNetReceive(); - // How many charge attacks we can do randomly 1-3 NumChargeAttacks = Rand(2) + 1; - } - function EndState() - { SetGroundSpeed(GetOriginalGroundSpeed()); bChargingPlayer = False; ChargeDamage = 0; if( Level.NetMode!=NM_DedicatedServer ) PostNetReceive(); - LastChargeTime = Level.TimeSeconds; - } - function Tick( float Delta ) - { - if( NumChargeAttacks <= 0 ) { GoToState(''); } - // Keep the flesh pound moving toward its target when attacking if( Role == ROLE_Authority && bShotAnim) { if( bChargingPlayer ) { bChargingPlayer = false; if( Level.NetMode!=NM_DedicatedServer ) PostNetReceive(); } SetGroundSpeed(OriginalGroundSpeed * 1.25); if( LookTarget!=none ) { Acceleration = AccelRate * Normal(LookTarget.Location - Location); } } else { if( !bChargingPlayer ) { bChargingPlayer = true; if( Level.NetMode!=NM_DedicatedServer ) PostNetReceive(); } - // Zapping slows him down, but doesn't stop him if( bZapped ) { SetGroundSpeed(OriginalGroundSpeed * 1.5); } else { SetGroundSpeed(OriginalGroundSpeed * 2.5); } } - Global.Tick(Delta); - } - function bool MeleeDamageTarget(int hitdamage, vector pushdir) - { local bool RetVal; - NumChargeAttacks--; - RetVal = Global.MeleeDamageTarget(hitdamage, pushdir*1.5); if( RetVal ) GoToState(''); return RetVal; - } - function RangedAttack(Actor A) - { if( VSize(A.Location-Location)>700 && Level.TimeSeconds - LastForceChargeTime > 3.0 ) GoToState(''); Global.RangedAttack(A); - } -Begin: - Sleep(6); - GoToState(''); -} -function BeginHealing() -{ - MonsterController(Controller).WhatToDoNext(55); -} - -state Healing // Healing -{ - function bool ShouldChargeFromDamage() - { return false; - } -Begin: - Sleep(GetAnimDuration('Heal')); - GoToState(''); -} -state KnockDown // Knocked -{ - function bool ShouldChargeFromDamage() - { return false; - } -Begin: - if( Health > 0 ) - { Sleep(GetAnimDuration('KnockDown')); CloakBoss(); PlaySound(sound'KF_EnemiesFinalSnd.Patriarch.Kev_SaveMe', SLOT_Misc, 2.0,,500.0); if( KFGameType(Level.Game).FinalSquadNum == SyringeCount ) { KFGameType(Level.Game).AddBossBuddySquad(); } GotoState('Escaping'); - } - else - { GotoState(''); - } -} -State Escaping extends Charging // Got hurt and running away... -{ - function BeginHealing() - { bShotAnim = true; Acceleration = vect(0,0,0); SetAnimAction('Heal'); HandleWaitForAnim('Heal'); - GoToState('Healing'); - } - function RangedAttack(Actor A) - { if ( bShotAnim ) return; else if ( IsCloseEnuf(A) ) { if( bCloaked ) UnCloakBoss(); bShotAnim = true; Acceleration = vect(0,0,0); Acceleration = (A.Location-Location); SetAnimAction('MeleeClaw'); //PlaySound(sound'Claw2s', SLOT_none); Claw2s } - } - function bool MeleeDamageTarget(int hitdamage, vector pushdir) - { return Global.MeleeDamageTarget(hitdamage, pushdir*1.5); - } - function Tick( float Delta ) - { - // Keep the flesh pound moving toward its target when attacking if( Role == ROLE_Authority && bShotAnim) { if( bChargingPlayer ) { bChargingPlayer = false; if( Level.NetMode!=NM_DedicatedServer ) PostNetReceive(); } SetGroundSpeed(GetOriginalGroundSpeed()); } else { if( !bChargingPlayer ) { bChargingPlayer = true; if( Level.NetMode!=NM_DedicatedServer ) PostNetReceive(); } - // Zapping slows him down, but doesn't stop him if( bZapped ) { SetGroundSpeed(OriginalGroundSpeed * 1.5); } else { SetGroundSpeed(OriginalGroundSpeed * 2.5); } } - Global.Tick(Delta); - } - function EndState() - { SetGroundSpeed(GetOriginalGroundSpeed()); bChargingPlayer = False; if( Level.NetMode!=NM_DedicatedServer ) PostNetReceive(); if( bCloaked ) UnCloakBoss(); - } -Begin: - While( true ) - { Sleep(0.5); if( !bCloaked && !bShotAnim ) CloakBoss(); if( !Controller.IsInState('SyrRetreat') && !Controller.IsInState('WaitForAnim')) Controller.GoToState('SyrRetreat'); - } -} -State SneakAround extends Escaping // Attempt to sneak around. -{ - function BeginHealing() - { MonsterController(Controller).WhatToDoNext(56); GoToState(''); - } - function bool MeleeDamageTarget(int hitdamage, vector pushdir) - { local bool RetVal; - RetVal = super.MeleeDamageTarget(hitdamage, pushdir); - GoToState(''); return RetVal; - } - function BeginState() - { super.BeginState(); SneakStartTime = Level.TimeSeconds; - } - function EndState() - { super.EndState(); LastSneakedTime = Level.TimeSeconds; - } - -Begin: - CloakBoss(); - While( true ) - { Sleep(0.5); - if( Level.TimeSeconds - SneakStartTime > 10.0 ) { GoToState(''); } - if( !bCloaked && !bShotAnim ) CloakBoss(); if( !Controller.IsInState('ZombieHunt') && !Controller.IsInState('WaitForAnim') ) { Controller.GoToState('ZombieHunt'); } - } -} -State InitialSneak extends SneakAround // Sneak attack the players straight off the bat. -{ -Begin: - CloakBoss(); - While( true ) - { Sleep(0.5); SneakCount++; - // Added sneakcount hack to try and fix the endless loop crash. Try and track down what was causing this later - Ramm if( SneakCount > 1000 || (Controller != none && NiceZombieBossController(Controller).bAlreadyFoundEnemy) ) { GoToState(''); } - if( !bCloaked && !bShotAnim ) CloakBoss(); if( !Controller.IsInState('InitialHunting') && !Controller.IsInState('WaitForAnim') ) { Controller.GoToState('InitialHunting'); } - } -} -simulated function DropNeedle() -{ - if( CurrentNeedle!=none ) - { DetachFromBone(CurrentNeedle); CurrentNeedle.SetLocation(GetBoneCoords('Rpalm_MedAttachment').Origin); CurrentNeedle.DroppedNow(); CurrentNeedle = none; - } -} -simulated function NotifySyringeA() -{ - //log("Heal Part 1"); - if( Level.NetMode!=NM_Client ) - { if( SyringeCount<3 ) SyringeCount++; if( Level.NetMode!=NM_DedicatedServer ) PostNetReceive(); - } - if( Level.NetMode!=NM_DedicatedServer ) - { DropNeedle(); CurrentNeedle = Spawn(Class'NiceBossHPNeedle'); AttachToBone(CurrentNeedle,'Rpalm_MedAttachment'); - } -} -function NotifySyringeB() -{ - //log("Heal Part 2"); - if( Level.NetMode != NM_Client ) - { if(bOnFire) Health += HealingAmount / 2; else Health += HealingAmount; RemoveFlamingEffects(); StopBurnFX(); bOnFire = false; bHealed = true; FlameFuel = InitFlameFuel; - } -} -simulated function NotifySyringeC() -{ - //log("Heal Part 3"); - if( Level.NetMode!=NM_DedicatedServer && CurrentNeedle!=none ) - { CurrentNeedle.Velocity = vect(-45,300,-90) >> Rotation; DropNeedle(); - } -} -simulated function PostNetReceive() -{ - if( bClientMiniGunning != bMinigunning ) - { bClientMiniGunning = bMinigunning; // Hack so Patriarch won't go out of MG Firing to play his idle anim online if( bMinigunning ) { IdleHeavyAnim='FireMG'; IdleRifleAnim='FireMG'; IdleCrouchAnim='FireMG'; IdleWeaponAnim='FireMG'; IdleRestAnim='FireMG'; } else { IdleHeavyAnim='BossIdle'; IdleRifleAnim='BossIdle'; IdleCrouchAnim='BossIdle'; IdleWeaponAnim='BossIdle'; IdleRestAnim='BossIdle'; } - } - if( bClientCharg!=bChargingPlayer ) - { bClientCharg = bChargingPlayer; if (bChargingPlayer) { MovementAnims[0] = ChargingAnim; MovementAnims[1] = ChargingAnim; MovementAnims[2] = ChargingAnim; MovementAnims[3] = ChargingAnim; } else if( !bChargingPlayer ) { MovementAnims[0] = default.MovementAnims[0]; MovementAnims[1] = default.MovementAnims[1]; MovementAnims[2] = default.MovementAnims[2]; MovementAnims[3] = default.MovementAnims[3]; } - } - else if( ClientSyrCount!=SyringeCount ) - { ClientSyrCount = SyringeCount; Switch( SyringeCount ) { Case 1: SetBoneScale(3,0,'Syrange1'); Break; Case 2: SetBoneScale(3,0,'Syrange1'); SetBoneScale(4,0,'Syrange2'); Break; Case 3: SetBoneScale(3,0,'Syrange1'); SetBoneScale(4,0,'Syrange2'); SetBoneScale(5,0,'Syrange3'); Break; Default: // WTF? reset...? SetBoneScale(3,1,'Syrange1'); SetBoneScale(4,1,'Syrange2'); SetBoneScale(5,1,'Syrange3'); Break; } - } - else if( TraceHitPos!=vect(0,0,0) ) - { AddTraceHitFX(TraceHitPos); TraceHitPos = vect(0,0,0); - } - else if( bClientCloaked!=bCloaked ) - { bClientCloaked = bCloaked; bCloaked = !bCloaked; if( bCloaked ) UnCloakBoss(); else CloakBoss(); bCloaked = bClientCloaked; - } -} -simulated function int DoAnimAction( name AnimName ) -{ - if( AnimName=='MeleeImpale' || AnimName=='MeleeClaw' || AnimName=='transition' /*|| AnimName=='FireMG'*/ ) - { AnimBlendParams(1, 1.0, 0.0,, SpineBone1); PlayAnim(AnimName,, 0.1, 1); Return 1; - } - else if( AnimName=='RadialAttack' ) - { // Get rid of blending, this is a full body anim AnimBlendParams(1, 0.0); PlayAnim(AnimName,,0.1); return 0; - } - Return Super.DoAnimAction(AnimName); -} - -simulated event SetAnimAction(name NewAction) -{ - local int meleeAnimIndex; - if( NewAction=='' ) Return; - if(NewAction == 'Claw') - { meleeAnimIndex = Rand(3); NewAction = meleeAnims[meleeAnimIndex]; - } - ExpectingChannel = DoAnimAction(NewAction); - if( Controller != none ) - { NiceZombieBossController(Controller).AnimWaitChannel = ExpectingChannel; - } - if( AnimNeedsWait(NewAction) ) - { bWaitForAnim = true; - } - else - { bWaitForAnim = false; - } - if( Level.NetMode!=NM_Client ) - { AnimAction = NewAction; bResetAnimAct = True; - ResetAnimActTime = Level.TimeSeconds+0.3; - } -} -// Hand sending the controller to the WaitForAnim state -simulated function HandleWaitForAnim( name NewAnim ) -{ - local float RageAnimDur; - Controller.GoToState('WaitForAnim'); - RageAnimDur = GetAnimDuration(NewAnim); - NiceZombieBossController(Controller).SetWaitForAnimTimout(RageAnimDur,NewAnim); -} -// The animation is full body and should set the bWaitForAnim flag -simulated function bool AnimNeedsWait(name TestAnim) -{ - if( /*TestAnim == 'MeleeImpale' || TestAnim =='MeleeClaw' || TestAnim =='transition' ||*/ TestAnim == 'FireMG' || TestAnim == 'PreFireMG' || TestAnim == 'PreFireMissile' || TestAnim == 'FireEndMG'|| TestAnim == 'FireEndMissile' || TestAnim == 'Heal' || TestAnim == 'KnockDown' || TestAnim == 'Entrance' || TestAnim == 'VictoryLaugh' || TestAnim == 'RadialAttack' ) - { return true; - } - return false; -} -simulated function HandleBumpGlass() -{ -} - -function bool FlipOver() -{ - Return False; -} -// Return true if we want to charge from taking too much damage -function bool ShouldChargeFromDamage() -{ - // If we don;t want to heal, charge whoever damaged us!!! - if( (SyringeCount==0 && Health (5.0 + 5.0 * FRand()) ) - { return true; - } - return false; -} -function TakeDamageClient(int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, float headshotLevel, float lockonTime){ - local float DamagerDistSq; - //local float UsedPipeBombDamScale; - local KFHumanPawn P; - local int NumPlayersSurrounding; - local bool bDidRadialAttack; - if( Level.TimeSeconds - LastMeleeExploitCheckTime > 1.0 && (class(damageType) != none) ) - { LastMeleeExploitCheckTime = Level.TimeSeconds; NumLumberJacks = 0; NumNinjas = 0; - foreach DynamicActors(class'KFHumanPawn', P) { // look for guys attacking us within 3 meters if ( VSize(P.Location - Location) < 150 ) { NumPlayersSurrounding++; - if( P != none && P.Weapon != none ) { if( Axe(P.Weapon) != none || Chainsaw(P.Weapon) != none ) { NumLumberJacks++; } else if( Katana(P.Weapon) != none ) { NumNinjas++; } } - if( !bDidRadialAttack && NumPlayersSurrounding >= 3 ) { bDidRadialAttack = true; GotoState('RadialAttack'); break; } } } - } - // Scale damage from the pipebomb down a bit if lots of pipe bomb damage happens - // at around the same times. Prevent players from putting all thier pipe bombs - // in one place and owning the patriarch in one blow. - /*if ( class(damageType) != none ) - { UsedPipeBombDamScale = FMax(0,(1.0 - PipeBombDamageScale)); - PipeBombDamageScale += 0.075; - if( PipeBombDamageScale > 1.0 ) { PipeBombDamageScale = 1.0; } - Damage *= UsedPipeBombDamScale; - }*/ - Super.TakeDamageClient(Damage,instigatedBy,hitlocation,Momentum,damageType,headshotLevel,lockonTime); - if( Level.TimeSeconds - LastDamageTime > 10 ) - { ChargeDamage = 0; - } - else - { LastDamageTime = Level.TimeSeconds; ChargeDamage += Damage; - } - if( ShouldChargeFromDamage() && ChargeDamage > 200 ) - { // If someone close up is shooting us, just charge them if( InstigatedBy != none ) { DamagerDistSq = VSizeSquared(Location - InstigatedBy.Location); - if( DamagerDistSq < (700 * 700) ) { SetAnimAction('transition'); ChargeDamage=0; LastForceChargeTime = Level.TimeSeconds; GoToState('Charging'); return; } } - } - if( Health<=0 || SyringeCount==3 || IsInState('Escaping') || IsInState('KnockDown') || IsInState('RadialAttack') || bDidRadialAttack/*|| bShotAnim*/ ) Return; - if( (SyringeCount==0 && Health> Rotation); - Return True; -} -// Overridden to do a cool slomo death view of the patriarch dying -function Died(Controller Killer, class damageType, vector HitLocation) -{ - local Controller C; - super.Died(Killer,damageType,HitLocation); - KFGameType(Level.Game).DoBossDeath(); - For( C=Level.ControllerList; C!=none; C=C.NextController ) - { if( PlayerController(C)!=none ) { PlayerController(C).SetViewTarget(Self); PlayerController(C).ClientSetViewTarget(Self); PlayerController(C).bBehindView = true; PlayerController(C).ClientSetBehindView(True); } - } -} -function ClawDamageTarget() -{ - local vector PushDir; - local name Anim; - local float frame,rate; - local float UsedMeleeDamage; - local bool bDamagedSomeone; - local KFHumanPawn P; - local Actor OldTarget; - if( MeleeDamage > 1 ) - { UsedMeleeDamage = (MeleeDamage - (MeleeDamage * 0.05)) + (MeleeDamage * (FRand() * 0.1)); - } - else - { UsedMeleeDamage = MeleeDamage; - } - GetAnimParams(1, Anim,frame,rate); - if( Anim == 'MeleeImpale' ) - { MeleeRange = ImpaleMeleeDamageRange; - } - else - { MeleeRange = ClawMeleeDamageRange; - } - if(Controller!=none && Controller.Target!=none) PushDir = (damageForce * Normal(Controller.Target.Location - Location)); - else PushDir = damageForce * vector(Rotation); -// Begin Balance Round 1(damages everyone in Round 2 and added seperate code path for MeleeImpale in Round 3) - if( Anim == 'MeleeImpale' ) - { bDamagedSomeone = MeleeDamageTarget(UsedMeleeDamage, PushDir); - } - else - { OldTarget = Controller.Target; - foreach DynamicActors(class'KFHumanPawn', P) { if ( (P.Location - Location) dot PushDir > 0.0 ) // Added dot Product check in Balance Round 3 { Controller.Target = P; bDamagedSomeone = bDamagedSomeone || MeleeDamageTarget(UsedMeleeDamage, damageForce * Normal(P.Location - Location)); // Always pushing players away added in Balance Round 3 } } - Controller.Target = OldTarget; - } - MeleeRange = Default.MeleeRange; -// End Balance Round 1, 2, and 3 - if ( bDamagedSomeone ) - { if( Anim == 'MeleeImpale' ) { PlaySound(MeleeImpaleHitSound, SLOT_Interact, 2.0); } else { PlaySound(MeleeAttackHitSound, SLOT_Interact, 2.0); } - } -} -simulated function ProcessHitFX() -{ - local Coords boneCoords; - local class HitEffects[4]; - local int i,j; - local float GibPerterbation; - if( (Level.NetMode == NM_DedicatedServer) || bSkeletized || (Mesh == SkeletonMesh)) - { SimHitFxTicker = HitFxTicker; return; - } - for ( SimHitFxTicker = SimHitFxTicker; SimHitFxTicker != HitFxTicker; SimHitFxTicker = (SimHitFxTicker + 1) % ArrayCount(HitFX) ) - { j++; if ( j > 30 ) { SimHitFxTicker = HitFxTicker; return; } - if( (HitFX[SimHitFxTicker].damtype == none) || (Level.bDropDetail && (Level.TimeSeconds - LastRenderTime > 3) && !IsHumanControlled()) ) continue; - //log("Processing effects for damtype "$HitFX[SimHitFxTicker].damtype); - if( HitFX[SimHitFxTicker].bone == 'obliterate' && !class'GameInfo'.static.UseLowGore()) { SpawnGibs( HitFX[SimHitFxTicker].rotDir, 1); bGibbed = true; // Wait a tick on a listen server so the obliteration can replicate before the pawn is destroyed if( Level.NetMode == NM_ListenServer ) { bDestroyNextTick = true; TimeSetDestroyNextTickTime = Level.TimeSeconds; } else { Destroy(); } return; } - boneCoords = GetBoneCoords( HitFX[SimHitFxTicker].bone ); - if ( !Level.bDropDetail && !class'GameInfo'.static.NoBlood() && !bSkeletized && !class'GameInfo'.static.UseLowGore() ) { //AttachEmitterEffect( BleedingEmitterClass, HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); - HitFX[SimHitFxTicker].damtype.static.GetHitEffects( HitEffects, Health ); - if( !PhysicsVolume.bWaterVolume ) // don't attach effects under water { for( i = 0; i < ArrayCount(HitEffects); i++ ) { if( HitEffects[i] == none ) continue; - AttachEffect( HitEffects[i], HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); } } } if ( class'GameInfo'.static.UseLowGore() ) HitFX[SimHitFxTicker].bSever = false; - if( HitFX[SimHitFxTicker].bSever ) { GibPerterbation = HitFX[SimHitFxTicker].damtype.default.GibPerterbation; - switch( HitFX[SimHitFxTicker].bone ) { case 'obliterate': break; - case LeftThighBone: if( !bLeftLegGibbed ) { SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; bLeftLegGibbed=true; } break; - case RightThighBone: if( !bRightLegGibbed ) { SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; bRightLegGibbed=true; } break; - case LeftFArmBone: if( !bLeftArmGibbed ) { SpawnSeveredGiblet( DetachedSpecialArmClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ;; bLeftArmGibbed=true; } break; - case RightFArmBone: if( !bRightArmGibbed ) { SpawnSeveredGiblet( DetachedArmClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; bRightArmGibbed=true; } break; - case 'head': if( !bHeadGibbed ) { if ( HitFX[SimHitFxTicker].damtype == class'DamTypeDecapitation' ) { DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false); } else if( HitFX[SimHitFxTicker].damtype == class'DamTypeProjectileDecap' ) { DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false, true); } else if( HitFX[SimHitFxTicker].damtype == class'DamTypeMeleeDecapitation' ) { DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, true); } - bHeadGibbed=true; } break; } - if( HitFX[SimHitFXTicker].bone != 'Spine' && HitFX[SimHitFXTicker].bone != FireRootBone && HitFX[SimHitFXTicker].bone != 'head' && Health <=0 ) HideBone(HitFX[SimHitFxTicker].bone); } - } -} -static simulated function PreCacheMaterials(LevelInfo myLevel) -{//should be derived and used. -/* - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.gatling_cmb'); - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.gatling_env_cmb'); - myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.gatling_D'); - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.PatGungoInvisible_cmb'); - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.patriarch_cmb'); - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.patriarch_env_cmb'); - myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.patriarch_D'); - myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.patriarch_invisible'); - myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.patriarch_invisible_gun'); - myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.patriarch_fizzle_FB'); - myLevel.AddPrecacheMaterial(Texture'kf_fx_trip_t.Gore.Patriarch_Gore_Limbs_Diff'); - myLevel.AddPrecacheMaterial(Texture'kf_fx_trip_t.Gore.Patriarch_Gore_Limbs_Spec'); - */ - } -defaultproperties -{ RocketFireSound=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_FireRocket' MiniGunFireSound=Sound'KF_BasePatriarch.Attack.Kev_MG_GunfireLoop' MiniGunSpinSound=Sound'KF_BasePatriarch.Attack.Kev_MG_TurbineFireLoop' MeleeImpaleHitSound=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_HitPlayer_Impale' MoanVoice=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Talk' MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_HitPlayer_Fist' JumpSound=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Jump' DetachedArmClass=Class'KFChar.SeveredArmPatriarch' DetachedLegClass=Class'KFChar.SeveredLegPatriarch' DetachedHeadClass=Class'KFChar.SeveredHeadPatriarch' DetachedSpecialArmClass=Class'KFChar.SeveredRocketArmPatriarch' HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Pain' DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Death' ControllerClass=Class'NicePack.NiceZombieBossController' AmbientSound=Sound'KF_BasePatriarch.Idle.Kev_IdleLoop' Mesh=SkeletalMesh'KF_Freaks_Trip.Patriarch_Freak' Skins(0)=Combiner'KF_Specimens_Trip_T.gatling_cmb' Skins(1)=Combiner'KF_Specimens_Trip_T.patriarch_cmb' -} +// Zombie Monster for KF Invasion gametype +class NiceZombieBoss extends NiceZombieBossBase; +#exec OBJ LOAD FILE=KFPatch2.utx +#exec OBJ LOAD FILE=KF_Specimens_Trip_T.utx +//---------------------------------------------------------------------------- +// NOTE: Most Variables are declared in the base class to eliminate hitching +//---------------------------------------------------------------------------- +var NiceBossHPNeedle CurrentNeedle; +// Last time we checked if a player was melee exploiting us +var float LastMeleeExploitCheckTime; +// Used to track what type of melee exploiters you have +var int NumLumberJacks; +var int NumNinjas; +// Make the Boss's ambient scale higher, since there is only 1, doesn't matter if he's relevant almost all the time +simulated function CalcAmbientRelevancyScale() +{ + // Make the zed only relevant by thier ambient sound out to a range of 100 meters + CustomAmbientRelevancyScale = 5000/(100 * SoundRadius); +} +function vector ComputeTrajectoryByTime( vector StartPosition, vector EndPosition, float fTimeEnd ) +{ + local vector NewVelocity; + NewVelocity = Super.ComputeTrajectoryByTime( StartPosition, EndPosition, fTimeEnd ); + if( PhysicsVolume.IsA( 'KFPhysicsVolume' ) && StartPosition.Z < EndPosition.Z ) + { + if( PhysicsVolume.Gravity.Z < class'PhysicsVolume'.default.Gravity.Z ) + { + // Just checking mass to be extra-cautious. + if( Mass > 900 ) + { + // Extra velocity boost to counter oversized mass weighing the boss down. + NewVelocity.Z += 90; + } + } + } + return NewVelocity; +} +function ZombieMoan() +{ + if( !bShotAnim ) // Do not moan while taunting + Super.ZombieMoan(); +} +// Speech notifies called from the anims +function PatriarchKnockDown() +{ + PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_KnockedDown', SLOT_Misc, 2.0,true,500.0); +} +function PatriarchEntrance() +{ + PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Entrance', SLOT_Misc, 2.0,true,500.0); +} +function PatriarchVictory() +{ + PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Victory', SLOT_Misc, 2.0,true,500.0); +} +function PatriarchMGPreFire() +{ + PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_WarnGun', SLOT_Misc, 2.0,true,1000.0); +} +function PatriarchMisslePreFire() +{ + PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_WarnRocket', SLOT_Misc, 2.0,true,1000.0); +} +// Taunt to use when doing the melee exploit radial attack +function PatriarchRadialTaunt() +{ + if( NumNinjas > 0 && NumNinjas > NumLumberJacks ) + { + PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_TauntNinja', SLOT_Misc, 2.0,true,500.0); + } + else if( NumLumberJacks > 0 && NumLumberJacks > NumNinjas ) + { + PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_TauntLumberJack', SLOT_Misc, 2.0,true,500.0); + } + else + { + PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_TauntRadial', SLOT_Misc, 2.0,true,500.0); + } +} +// Don't do this for the Patriarch +// No need to overload these when inheriting from NiceMonster +/*simulated function SetBurningBehavior(){} +simulated function UnSetBurningBehavior(){}*/ +function bool CanGetOutOfWay(){ + return false; +} +simulated function Tick(float DeltaTime) +{ + local KFHumanPawn HP; + Super.Tick(DeltaTime); + // Process the pipe bomb time damage scale, reducing the scale over time so + // it goes back up to 100% damage over a few seconds + if( Role == ROLE_Authority ) + { + PipeBombDamageScale -= DeltaTime * 0.33; + + if( PipeBombDamageScale < 0 ) + { + PipeBombDamageScale = 0; + } + } + if( Level.NetMode==NM_DedicatedServer ) + Return; // Servers aren't intrested in this info. + bSpecialCalcView = bIsBossView; + if( bZapped ) + { + // Make sure we check if we need to be cloaked as soon as the zap wears off + LastCheckTimes = Level.TimeSeconds; + } + else if( bCloaked && Level.TimeSeconds>LastCheckTimes ) + { + LastCheckTimes = Level.TimeSeconds+0.8; + ForEach VisibleCollidingActors(Class'KFHumanPawn',HP,1000,Location) + { + if( HP.Health <= 0 || !HP.ShowStalkers() ) + continue; + + // If he's a commando, we've been spotted. + if( !bSpotted ) + { + bSpotted = True; + CloakBoss(); + } + Return; + } + // if we're uberbrite, turn down the light + if( bSpotted ) + { + bSpotted = False; + bUnlit = false; + CloakBoss(); + } + } +} +simulated function CloakBoss() +{ + local Controller C; + local int Index; + // No cloaking if zapped + if( bZapped ) + { + return; + } + if( bSpotted ) + { + Visibility = 120; + if( Level.NetMode==NM_DedicatedServer ) + Return; + Skins[0] = Finalblend'KFX.StalkerGlow'; + Skins[1] = Finalblend'KFX.StalkerGlow'; + bUnlit = true; + return; + } + Visibility = 1; + bCloaked = true; + if( Level.NetMode!=NM_Client ) + { + For( C=Level.ControllerList; C!=none; C=C.NextController ) + { + if( C.bIsPlayer && C.Enemy==Self ) + C.Enemy = none; // Make bots lose sight with me. + } + } + if( Level.NetMode==NM_DedicatedServer ) + Return; + Skins[0] = Shader'KF_Specimens_Trip_T.patriarch_invisible_gun'; + Skins[1] = Shader'KF_Specimens_Trip_T.patriarch_invisible'; + // Invisible - no shadow + if(PlayerShadow != none) + PlayerShadow.bShadowActive = false; + // Remove/disallow projectors on invisible people + Projectors.Remove(0, Projectors.Length); + bAcceptsProjectors = false; + SetOverlayMaterial(FinalBlend'KF_Specimens_Trip_T.patriarch_fizzle_FB', 1.0, true); + // Randomly send out a message about Patriarch going invisible(10% chance) + if ( FRand() < 0.10 ) + { + // Pick a random Player to say the message + Index = Rand(Level.Game.NumPlayers); + + for ( C = Level.ControllerList; C != none; C = C.NextController ) + { + if ( PlayerController(C) != none ) + { + if ( Index == 0 ) + { + PlayerController(C).Speech('AUTO', 8, ""); + break; + } + + Index--; + } + } + } +} +simulated function UnCloakBoss() +{ + if( bZapped ) + { + return; + } + Visibility = default.Visibility; + bCloaked = false; + bSpotted = False; + bUnlit = False; + if( Level.NetMode==NM_DedicatedServer ) + Return; + Skins = Default.Skins; + if (PlayerShadow != none) + PlayerShadow.bShadowActive = true; + bAcceptsProjectors = true; + SetOverlayMaterial( none, 0.0, true ); +} +// Set the zed to the zapped behavior +simulated function SetZappedBehavior() +{ + super.SetZappedBehavior(); + // Handle setting the zed to uncloaked so the zapped overlay works properly + if( Level.Netmode != NM_DedicatedServer ) + { + bUnlit = false; + Skins = Default.Skins; + + if (PlayerShadow != none) + PlayerShadow.bShadowActive = true; + + bAcceptsProjectors = true; + SetOverlayMaterial(Material'KFZED_FX_T.Energy.ZED_overlay_Hit_Shdr', 999, true); + } +} +// Turn off the zapped behavior +simulated function UnSetZappedBehavior() +{ + super.UnSetZappedBehavior(); + // Handle getting the zed back cloaked if need be + if( Level.Netmode != NM_DedicatedServer ) + { + LastCheckTimes = Level.TimeSeconds; + SetOverlayMaterial(none, 0.0f, true); + } +} +// Overridden because we need to handle the overlays differently for zombies that can cloak +function SetZapped(float ZapAmount, Pawn Instigator) +{ + LastZapTime = Level.TimeSeconds; + if( bZapped ) + { + TotalZap = ZapThreshold; + RemainingZap = ZapDuration; + } + else + { + TotalZap += ZapAmount; + + if( TotalZap >= ZapThreshold ) + { + RemainingZap = ZapDuration; + bZapped = true; + } + } + ZappedBy = Instigator; +} +//----------------------------------------------------------------------------- +// PostBeginPlay +//----------------------------------------------------------------------------- +simulated function PostBeginPlay() +{ + super.PostBeginPlay(); + if( Role < ROLE_Authority ) + { + return; + } + // Difficulty Scaling + if (Level.Game != none) + { + if(Level.Game.GameDifficulty >= 5.0) // Hell on Earth & Suicidal + MGDamage = default.MGDamage * 1.3; + else + MGDamage = default.MGDamage * 1.0; + } + HealingLevels[0] = Health/1.25; // Around 5600 HP + HealingLevels[1] = Health/2.f; // Around 3500 HP + HealingLevels[2] = Health/3.2; // Around 2187 HP +// log("Health = "$Health); +// log("HealingLevels[0] = "$HealingLevels[0]); +// log("HealingLevels[1] = "$HealingLevels[1]); +// log("HealingLevels[2] = "$HealingLevels[2]); + HealingAmount = Health/4; // 1750 HP +// log("HealingAmount = "$HealingAmount); +} +function bool MakeGrandEntry() +{ + bShotAnim = true; + Acceleration = vect(0,0,0); + SetAnimAction('Entrance'); + HandleWaitForAnim('Entrance'); + GotoState('MakingEntrance'); + return True; +} +// State of playing the initial entrance anim +state MakingEntrance +{ + Ignores RangedAttack; + function Tick( float Delta ) + { + Acceleration = vect(0,0,0); + + global.Tick(Delta); + } +Begin: + Sleep(GetAnimDuration('Entrance')); + GotoState('InitialSneak'); +} +// State of doing a radial damaging attack that we do when people are trying to melee exploit +state RadialAttack +{ + Ignores RangedAttack; + function bool ShouldChargeFromDamage() + { + return false; + } + function Tick( float Delta ) + { + Acceleration = vect(0,0,0); + + //DrawDebugSphere( Location, 150, 12, 0, 255, 0); + + global.Tick(Delta); + } + function ClawDamageTarget() + { + local vector PushDir; + local float UsedMeleeDamage; + local bool bDamagedSomeone, bDamagedThisHit; + local KFHumanPawn P; + local Actor OldTarget; + local float RadialDamageBase; + + MeleeRange = 150; + + if(Controller!=none && Controller.Target!=none) + PushDir = (damageForce * Normal(Controller.Target.Location - Location)); + else + PushDir = damageForce * vector(Rotation); + + OldTarget = Controller.Target; + + // Damage all players within a radius + foreach DynamicActors(class'KFHumanPawn', P) + { + if ( VSize(P.Location - Location) < MeleeRange) + { + Controller.Target = P; + + // This attack cuts through shields, so crank up the damage if they have a lot of shields + if( P.ShieldStrength >= 50 ) + { + RadialDamageBase = 240; + } + else + { + RadialDamageBase = 120; + } + + // Randomize the damage a bit so everyone gets really hurt, but only some poeple die + UsedMeleeDamage = (RadialDamageBase - (RadialDamageBase * 0.55)) + (RadialDamageBase * (FRand() * 0.45)); + //log("UsedMeleeDamage = "$UsedMeleeDamage); + + bDamagedThisHit = MeleeDamageTarget(UsedMeleeDamage, damageForce * Normal(P.Location - Location)); + if( !bDamagedSomeone && bDamagedThisHit ) + { + bDamagedSomeone = true; + } + MeleeRange = 150; + } + } + + Controller.Target = OldTarget; + + MeleeRange = Default.MeleeRange; + + if ( bDamagedSomeone ) + { + // Maybe cause zedtime when the patriarch does his radial attack + KFGameType(Level.Game).DramaticEvent(0.3); + PlaySound(MeleeAttackHitSound, SLOT_Interact, 2.0); + } + } + function EndState() + { + NumLumberJacks = 0; + NumNinjas = 0; + } +Begin: + // Don't let the zed move and play the radial attack + bShotAnim = true; + Acceleration = vect(0,0,0); + SetAnimAction('RadialAttack'); + KFMonsterController(Controller).bUseFreezeHack = True; + HandleWaitForAnim('RadialAttack'); + Sleep(GetAnimDuration('RadialAttack')); + // TODO: this sleep is here to allow for playing the taunt sound. Take it out when the animation is extended with the taunt - Ramm + //Sleep(2.5); + GotoState(''); +} +simulated function Destroyed() +{ + if( mTracer!=none ) + mTracer.Destroy(); + if( mMuzzleFlash!=none ) + mMuzzleFlash.Destroy(); + Super.Destroyed(); +} +simulated Function PostNetBeginPlay() +{ + EnableChannelNotify ( 1,1); + AnimBlendParams(1, 1.0, 0.0,, SpineBone1); + super.PostNetBeginPlay(); + TraceHitPos = vect(0,0,0); + bNetNotify = True; +} +function bool IsStunPossible(){ + return false; +} +function bool CheckStun(int stunScore, + Pawn instigatedBy, + Vector hitLocation, + Vector momentum, + class damageType, + float headshotLevel, + KFPlayerReplicationInfo KFPRI){ + return false; +} +function bool CheckMiniFlinch( int flinchScore, + Pawn instigatedBy, + Vector hitLocation, + Vector momentum, + class damageType, + float headshotLevel, + KFPlayerReplicationInfo KFPRI){ + return false; +} +function bool OnlyEnemyAround( Pawn Other ) +{ + local Controller C; + For( C=Level.ControllerList; C!=none; C=C.NextController ) + { + if( C.bIsPlayer && C.Pawn!=none && C.Pawn!=Other && ((VSize(C.Pawn.Location-Location)<1500 && FastTrace(C.Pawn.Location,Location)) + || (VSize(C.Pawn.Location-Other.Location)<1000 && FastTrace(C.Pawn.Location,Other.Location))) ) + Return False; + } + Return True; +} +function bool IsCloseEnuf( Actor A ) +{ + local vector V; + if( A==none ) + Return False; + V = A.Location-Location; + if( Abs(V.Z)>(CollisionHeight+A.CollisionHeight) ) + Return False; + V.Z = 0; + Return (VSize(V)<(CollisionRadius+A.CollisionRadius+25)); +} +function RangedAttack(Actor A) +{ + local float D; + local bool bOnlyE; + local bool bDesireChainGun; + // Randomly make him want to chaingun more + if( Controller.LineOfSightTo(A) && FRand() < 0.15 && LastChainGunTime1500 && Pawn(A)!=none && FRand() < 0.5 ) + { + SetAnimAction('MeleeImpale'); + } + else + { + SetAnimAction('MeleeClaw'); + //PlaySound(sound'Claw2s', SLOT_none); KFTODO: Replace this + } + } + else if( Level.TimeSeconds - LastSneakedTime > 20.0 ) + { + if( FRand() < 0.3 ) + { + // Wait another 20 to try this again + LastSneakedTime = Level.TimeSeconds;//+FRand()*120; + Return; + } + SetAnimAction('transition'); + GoToState('SneakAround'); + } + else if( bChargingPlayer && (bOnlyE || D<200) ) + Return; + else if( !bDesireChainGun && !bChargingPlayer && (D<300 || (D<700 && bOnlyE)) && + (Level.TimeSeconds - LastChargeTime > (5.0 + 5.0 * FRand())) ) // Don't charge again for a few seconds + { + SetAnimAction('transition'); + GoToState('Charging'); + } + else if( LastMissileTime 500 ) + { + if( !Controller.LineOfSightTo(A) || FRand() > 0.75 ) + { + LastMissileTime = Level.TimeSeconds+FRand() * 5; + Return; + } + + LastMissileTime = Level.TimeSeconds + 10 + FRand() * 15; + + bShotAnim = true; + Acceleration = vect(0,0,0); + SetAnimAction('PreFireMissile'); + + HandleWaitForAnim('PreFireMissile'); + + GoToState('FireMissile'); + } + else if ( !bWaitForAnim && !bShotAnim && LastChainGunTime 0.85 ) + { + LastChainGunTime = Level.TimeSeconds+FRand()*4; + Return; + } + + LastChainGunTime = Level.TimeSeconds + 5 + FRand() * 10; + + bShotAnim = true; + Acceleration = vect(0,0,0); + SetAnimAction('PreFireMG'); + + HandleWaitForAnim('PreFireMG'); + MGFireCounter = Rand(60) + 35; + + GoToState('FireChaingun'); + } +} +event Bump(actor Other) +{ + Super(Monster).Bump(Other); + if( Other==none ) + return; + if( Other.IsA('NetKActor') && Physics != PHYS_Falling && !bShotAnim && Abs(Other.Location.Z-Location.Z)<(CollisionHeight+Other.CollisionHeight) ) + { // Kill the annoying deco brat. + Controller.Target = Other; + Controller.Focus = Other; + bShotAnim = true; + Acceleration = (Other.Location-Location); + SetAnimAction('MeleeClaw'); + //PlaySound(sound'Claw2s', SLOT_none); KFTODO: Replace this + HandleWaitForAnim('MeleeClaw'); + } +} +simulated function AddTraceHitFX( vector HitPos ) +{ + local vector Start,SpawnVel,SpawnDir; + local float hitDist; + Start = GetBoneCoords('tip').Origin; + if( mTracer==none ) + mTracer = Spawn(Class'KFMod.KFNewTracer',,,Start); + else mTracer.SetLocation(Start); + if( mMuzzleFlash==none ) + { + // KFTODO: Replace this + mMuzzleFlash = Spawn(Class'MuzzleFlash3rdMG'); + AttachToBone(mMuzzleFlash, 'tip'); + } + else mMuzzleFlash.SpawnParticle(1); + hitDist = VSize(HitPos - Start) - 50.f; + if( hitDist>10 ) + { + SpawnDir = Normal(HitPos - Start); + SpawnVel = SpawnDir * 10000.f; + 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 / 10000.f; + mTracer.Emitters[0].LifetimeRange.Max = mTracer.Emitters[0].LifetimeRange.Min; + mTracer.SpawnParticle(1); + } + Instigator = Self; + if( HitPos != vect(0,0,0) ) + { + Spawn(class'ROBulletHitEffect',,, HitPos, Rotator(Normal(HitPos - Start))); + } +} +simulated function AnimEnd( int Channel ) +{ + local name Sequence; + local float Frame, Rate; + if( Level.NetMode==NM_Client && bMinigunning ) + { + GetAnimParams( Channel, Sequence, Frame, Rate ); + + if( Sequence != 'PreFireMG' && Sequence != 'FireMG' ) + { + Super.AnimEnd(Channel); + return; + } + + PlayAnim('FireMG'); + bWaitForAnim = true; + bShotAnim = true; + IdleTime = Level.TimeSeconds; + } + else Super.AnimEnd(Channel); +} +state FireChaingun +{ + function RangedAttack(Actor A) + { + Controller.Target = A; + Controller.Focus = A; + } + // Chaingun mode handles this itself + function bool ShouldChargeFromDamage() + { + return false; + } + function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, optional int HitIndex) + { + local float EnemyDistSq, DamagerDistSq; + + global.TakeDamage(Damage,instigatedBy,hitlocation,vect(0,0,0),damageType); + + // if someone close up is shooting us, just charge them + if( InstigatedBy != none ) + { + DamagerDistSq = VSizeSquared(Location - InstigatedBy.Location); + + if( (ChargeDamage > 200 && DamagerDistSq < (500 * 500)) || DamagerDistSq < (100 * 100) ) + { + SetAnimAction('transition'); + //log("Frak this shizz, Charging!!!!"); + GoToState('Charging'); + return; + } + } + + if( Controller.Enemy != none && InstigatedBy != none && InstigatedBy != Controller.Enemy ) + { + EnemyDistSq = VSizeSquared(Location - Controller.Enemy.Location); + DamagerDistSq = VSizeSquared(Location - InstigatedBy.Location); + } + + if( InstigatedBy != none && (DamagerDistSq < EnemyDistSq || Controller.Enemy == none) ) + { + MonsterController(Controller).ChangeEnemy(InstigatedBy,Controller.CanSee(InstigatedBy)); + Controller.Target = InstigatedBy; + Controller.Focus = InstigatedBy; + + if( DamagerDistSq < (500 * 500) ) + { + SetAnimAction('transition'); + GoToState('Charging'); + } + } + } + function EndState() + { + TraceHitPos = vect(0,0,0); + bMinigunning = False; + + AmbientSound = default.AmbientSound; + SoundVolume=default.SoundVolume; + SoundRadius=default.SoundRadius; + MGFireCounter=0; + + LastChainGunTime = Level.TimeSeconds + 5 + (FRand()*10); + } + function BeginState() + { + bFireAtWill = False; + Acceleration = vect(0,0,0); + MGLostSightTimeout = 0.0; + bMinigunning = True; + } + function AnimEnd( int Channel ) + { + if( MGFireCounter <= 0 ) + { + bShotAnim = true; + Acceleration = vect(0,0,0); + SetAnimAction('FireEndMG'); + HandleWaitForAnim('FireEndMG'); + GoToState(''); + } + else + { + if ( Controller.Enemy != none ) + { + if ( Controller.LineOfSightTo(Controller.Enemy) && FastTrace(GetBoneCoords('tip').Origin,Controller.Enemy.Location)) + { + MGLostSightTimeout = 0.0; + Controller.Focus = Controller.Enemy; + Controller.FocalPoint = Controller.Enemy.Location; + } + else + { + MGLostSightTimeout = Level.TimeSeconds + (0.25 + FRand() * 0.35); + Controller.Focus = none; + } + + Controller.Target = Controller.Enemy; + } + else + { + MGLostSightTimeout = Level.TimeSeconds + (0.25 + FRand() * 0.35); + Controller.Focus = none; + } + + if( !bFireAtWill ) + { + MGFireDuration = Level.TimeSeconds + (0.75 + FRand() * 0.5); + } + else if ( FRand() < 0.03 && Controller.Enemy != none && PlayerController(Controller.Enemy.Controller) != none ) + { + // Randomly send out a message about Patriarch shooting chain gun(3% chance) + PlayerController(Controller.Enemy.Controller).Speech('AUTO', 9, ""); + } + + bFireAtWill = True; + bShotAnim = true; + Acceleration = vect(0,0,0); + + SetAnimAction('FireMG'); + bWaitForAnim = true; + } + } + function FireMGShot() + { + local vector Start,End,HL,HN,Dir; + local rotator R; + local Actor A; + + MGFireCounter--; + + if( AmbientSound != MiniGunFireSound ) + { + SoundVolume=255; + SoundRadius=400; + AmbientSound = MiniGunFireSound; + } + + Start = GetBoneCoords('tip').Origin; + if( Controller.Focus!=none ) + R = rotator(Controller.Focus.Location-Start); + else R = rotator(Controller.FocalPoint-Start); + if( NeedToTurnFor(R) ) + R = Rotation; + // KFTODO: Maybe scale this accuracy by his skill or the game difficulty + Dir = Normal(vector(R)+VRand()*0.06); //*0.04 + End = Start+Dir*10000; + + // Have to turn of hit point collision so trace doesn't hit the Human Pawn's bullet whiz cylinder + bBlockHitPointTraces = false; + A = Trace(HL,HN,End,Start,True); + bBlockHitPointTraces = true; + + if( A==none ) + Return; + TraceHitPos = HL; + if( Level.NetMode!=NM_DedicatedServer ) + AddTraceHitFX(HL); + + if( A!=Level ) + { + A.TakeDamage(MGDamage+Rand(3),Self,HL,Dir*500,Class'DamageType'); + } + } + function bool NeedToTurnFor( rotator targ ) + { + local int YawErr; + + targ.Yaw = DesiredRotation.Yaw & 65535; + YawErr = (targ.Yaw - (Rotation.Yaw & 65535)) & 65535; + return !((YawErr < 2000) || (YawErr > 64535)); + } +Begin: + While( True ) + { + Acceleration = vect(0,0,0); + + if( MGLostSightTimeout > 0 && Level.TimeSeconds > MGLostSightTimeout ) + { + bShotAnim = true; + Acceleration = vect(0,0,0); + SetAnimAction('FireEndMG'); + HandleWaitForAnim('FireEndMG'); + GoToState(''); + } + + if( MGFireCounter <= 0 ) + { + bShotAnim = true; + Acceleration = vect(0,0,0); + SetAnimAction('FireEndMG'); + HandleWaitForAnim('FireEndMG'); + GoToState(''); + } + + // Give some randomness to the patriarch's firing + if( Level.TimeSeconds > MGFireDuration ) + { + if( AmbientSound != MiniGunSpinSound ) + { + SoundVolume=185; + SoundRadius=200; + AmbientSound = MiniGunSpinSound; + } + Sleep(0.5 + FRand() * 0.75); + MGFireDuration = Level.TimeSeconds + (0.75 + FRand() * 0.5); + } + else + { + if( bFireAtWill ) + FireMGShot(); + Sleep(0.05); + } + } +} +state FireMissile +{ +Ignores RangedAttack; + function bool ShouldChargeFromDamage() + { + return false; + } + function BeginState() + { + Acceleration = vect(0,0,0); + } + function AnimEnd( int Channel ) + { + local vector Start; + local Rotator R; + + Start = GetBoneCoords('tip').Origin; + + if ( !SavedFireProperties.bInitialized ) + { + SavedFireProperties.AmmoClass = MyAmmo.Class; + SavedFireProperties.ProjectileClass = MyAmmo.ProjectileClass; + SavedFireProperties.WarnTargetPct = 0.15; + SavedFireProperties.MaxRange = 10000; + SavedFireProperties.bTossed = False; + SavedFireProperties.bTrySplash = False; + SavedFireProperties.bLeadTarget = True; + SavedFireProperties.bInstantHit = True; + SavedFireProperties.bInitialized = true; + } + + R = AdjustAim(SavedFireProperties,Start,100); + PlaySound(RocketFireSound,SLOT_Interact,2.0,,TransientSoundRadius,,false); + Spawn(Class'NiceBossLAWProj',,,Start,R); + + bShotAnim = true; + Acceleration = vect(0,0,0); + SetAnimAction('FireEndMissile'); + HandleWaitForAnim('FireEndMissile'); + + // Randomly send out a message about Patriarch shooting a rocket(5% chance) + if ( FRand() < 0.05 && Controller.Enemy != none && PlayerController(Controller.Enemy.Controller) != none ) + { + PlayerController(Controller.Enemy.Controller).Speech('AUTO', 10, ""); + } + + GoToState(''); + } +Begin: + while ( true ) + { + Acceleration = vect(0,0,0); + Sleep(0.1); + } +} +function bool MeleeDamageTarget(int hitdamage, vector pushdir) +{ + if( Controller.Target!=none && Controller.Target.IsA('NetKActor') ) + pushdir = Normal(Controller.Target.Location-Location)*100000; // Fly bitch! + // Used to set MeleeRange = Default.MeleeRange; in Balance Round 1, fixed in Balance Round 2 + return Super.MeleeDamageTarget(hitdamage, pushdir); +} +state Charging +{ + // Don't override speed in this state + function bool CanSpeedAdjust() + { + return false; + } + function bool ShouldChargeFromDamage() + { + return false; + } + function BeginState() + { + bChargingPlayer = True; + if( Level.NetMode!=NM_DedicatedServer ) + PostNetReceive(); + + // How many charge attacks we can do randomly 1-3 + NumChargeAttacks = Rand(2) + 1; + } + function EndState() + { + SetGroundSpeed(GetOriginalGroundSpeed()); + bChargingPlayer = False; + ChargeDamage = 0; + if( Level.NetMode!=NM_DedicatedServer ) + PostNetReceive(); + + LastChargeTime = Level.TimeSeconds; + } + function Tick( float Delta ) + { + + if( NumChargeAttacks <= 0 ) + { + GoToState(''); + } + + // Keep the flesh pound moving toward its target when attacking + if( Role == ROLE_Authority && bShotAnim) + { + if( bChargingPlayer ) + { + bChargingPlayer = false; + if( Level.NetMode!=NM_DedicatedServer ) + PostNetReceive(); + } + SetGroundSpeed(OriginalGroundSpeed * 1.25); + if( LookTarget!=none ) + { + Acceleration = AccelRate * Normal(LookTarget.Location - Location); + } + } + else + { + if( !bChargingPlayer ) + { + bChargingPlayer = true; + if( Level.NetMode!=NM_DedicatedServer ) + PostNetReceive(); + } + + // Zapping slows him down, but doesn't stop him + if( bZapped ) + { + SetGroundSpeed(OriginalGroundSpeed * 1.5); + } + else + { + SetGroundSpeed(OriginalGroundSpeed * 2.5); + } + } + + Global.Tick(Delta); + } + function bool MeleeDamageTarget(int hitdamage, vector pushdir) + { + local bool RetVal; + + NumChargeAttacks--; + + RetVal = Global.MeleeDamageTarget(hitdamage, pushdir*1.5); + if( RetVal ) + GoToState(''); + return RetVal; + } + function RangedAttack(Actor A) + { + if( VSize(A.Location-Location)>700 && Level.TimeSeconds - LastForceChargeTime > 3.0 ) + GoToState(''); + Global.RangedAttack(A); + } +Begin: + Sleep(6); + GoToState(''); +} +function BeginHealing() +{ + MonsterController(Controller).WhatToDoNext(55); +} + +state Healing // Healing +{ + function bool ShouldChargeFromDamage() + { + return false; + } +Begin: + Sleep(GetAnimDuration('Heal')); + GoToState(''); +} +state KnockDown // Knocked +{ + function bool ShouldChargeFromDamage() + { + return false; + } +Begin: + if( Health > 0 ) + { + Sleep(GetAnimDuration('KnockDown')); + CloakBoss(); + PlaySound(sound'KF_EnemiesFinalSnd.Patriarch.Kev_SaveMe', SLOT_Misc, 2.0,,500.0); + if( KFGameType(Level.Game).FinalSquadNum == SyringeCount ) + { + KFGameType(Level.Game).AddBossBuddySquad(); + } + GotoState('Escaping'); + } + else + { + GotoState(''); + } +} +State Escaping extends Charging // Got hurt and running away... +{ + function BeginHealing() + { + bShotAnim = true; + Acceleration = vect(0,0,0); + SetAnimAction('Heal'); + HandleWaitForAnim('Heal'); + + GoToState('Healing'); + } + function RangedAttack(Actor A) + { + if ( bShotAnim ) + return; + else if ( IsCloseEnuf(A) ) + { + if( bCloaked ) + UnCloakBoss(); + bShotAnim = true; + Acceleration = vect(0,0,0); + Acceleration = (A.Location-Location); + SetAnimAction('MeleeClaw'); + //PlaySound(sound'Claw2s', SLOT_none); Claw2s + } + } + function bool MeleeDamageTarget(int hitdamage, vector pushdir) + { + return Global.MeleeDamageTarget(hitdamage, pushdir*1.5); + } + function Tick( float Delta ) + { + + // Keep the flesh pound moving toward its target when attacking + if( Role == ROLE_Authority && bShotAnim) + { + if( bChargingPlayer ) + { + bChargingPlayer = false; + if( Level.NetMode!=NM_DedicatedServer ) + PostNetReceive(); + } + SetGroundSpeed(GetOriginalGroundSpeed()); + } + else + { + if( !bChargingPlayer ) + { + bChargingPlayer = true; + if( Level.NetMode!=NM_DedicatedServer ) + PostNetReceive(); + } + + // Zapping slows him down, but doesn't stop him + if( bZapped ) + { + SetGroundSpeed(OriginalGroundSpeed * 1.5); + } + else + { + SetGroundSpeed(OriginalGroundSpeed * 2.5); + } + } + + Global.Tick(Delta); + } + function EndState() + { + SetGroundSpeed(GetOriginalGroundSpeed()); + bChargingPlayer = False; + if( Level.NetMode!=NM_DedicatedServer ) + PostNetReceive(); + if( bCloaked ) + UnCloakBoss(); + } +Begin: + While( true ) + { + Sleep(0.5); + if( !bCloaked && !bShotAnim ) + CloakBoss(); + if( !Controller.IsInState('SyrRetreat') && !Controller.IsInState('WaitForAnim')) + Controller.GoToState('SyrRetreat'); + } +} +State SneakAround extends Escaping // Attempt to sneak around. +{ + function BeginHealing() + { + MonsterController(Controller).WhatToDoNext(56); + GoToState(''); + } + function bool MeleeDamageTarget(int hitdamage, vector pushdir) + { + local bool RetVal; + + RetVal = super.MeleeDamageTarget(hitdamage, pushdir); + + GoToState(''); + return RetVal; + } + function BeginState() + { + super.BeginState(); + SneakStartTime = Level.TimeSeconds; + } + function EndState() + { + super.EndState(); + LastSneakedTime = Level.TimeSeconds; + } + +Begin: + CloakBoss(); + While( true ) + { + Sleep(0.5); + + if( Level.TimeSeconds - SneakStartTime > 10.0 ) + { + GoToState(''); + } + + if( !bCloaked && !bShotAnim ) + CloakBoss(); + if( !Controller.IsInState('ZombieHunt') && !Controller.IsInState('WaitForAnim') ) + { + Controller.GoToState('ZombieHunt'); + } + } +} +State InitialSneak extends SneakAround // Sneak attack the players straight off the bat. +{ +Begin: + CloakBoss(); + While( true ) + { + Sleep(0.5); + SneakCount++; + + // Added sneakcount hack to try and fix the endless loop crash. Try and track down what was causing this later - Ramm + if( SneakCount > 1000 || (Controller != none && NiceZombieBossController(Controller).bAlreadyFoundEnemy) ) + { + GoToState(''); + } + + if( !bCloaked && !bShotAnim ) + CloakBoss(); + if( !Controller.IsInState('InitialHunting') && !Controller.IsInState('WaitForAnim') ) + { + Controller.GoToState('InitialHunting'); + } + } +} +simulated function DropNeedle() +{ + if( CurrentNeedle!=none ) + { + DetachFromBone(CurrentNeedle); + CurrentNeedle.SetLocation(GetBoneCoords('Rpalm_MedAttachment').Origin); + CurrentNeedle.DroppedNow(); + CurrentNeedle = none; + } +} +simulated function NotifySyringeA() +{ + //log("Heal Part 1"); + if( Level.NetMode!=NM_Client ) + { + if( SyringeCount<3 ) + SyringeCount++; + if( Level.NetMode!=NM_DedicatedServer ) + PostNetReceive(); + } + if( Level.NetMode!=NM_DedicatedServer ) + { + DropNeedle(); + CurrentNeedle = Spawn(Class'NiceBossHPNeedle'); + AttachToBone(CurrentNeedle,'Rpalm_MedAttachment'); + } +} +function NotifySyringeB() +{ + //log("Heal Part 2"); + if( Level.NetMode != NM_Client ) + { + if(bOnFire) + Health += HealingAmount / 2; + else + Health += HealingAmount; + RemoveFlamingEffects(); + StopBurnFX(); + bOnFire = false; + bHealed = true; + FlameFuel = InitFlameFuel; + } +} +simulated function NotifySyringeC() +{ + //log("Heal Part 3"); + if( Level.NetMode!=NM_DedicatedServer && CurrentNeedle!=none ) + { + CurrentNeedle.Velocity = vect(-45,300,-90) >> Rotation; + DropNeedle(); + } +} +simulated function PostNetReceive() +{ + if( bClientMiniGunning != bMinigunning ) + { + bClientMiniGunning = bMinigunning; + // Hack so Patriarch won't go out of MG Firing to play his idle anim online + if( bMinigunning ) + { + IdleHeavyAnim='FireMG'; + IdleRifleAnim='FireMG'; + IdleCrouchAnim='FireMG'; + IdleWeaponAnim='FireMG'; + IdleRestAnim='FireMG'; + } + else + { + IdleHeavyAnim='BossIdle'; + IdleRifleAnim='BossIdle'; + IdleCrouchAnim='BossIdle'; + IdleWeaponAnim='BossIdle'; + IdleRestAnim='BossIdle'; + } + } + if( bClientCharg!=bChargingPlayer ) + { + bClientCharg = bChargingPlayer; + if (bChargingPlayer) + { + MovementAnims[0] = ChargingAnim; + MovementAnims[1] = ChargingAnim; + MovementAnims[2] = ChargingAnim; + MovementAnims[3] = ChargingAnim; + } + else if( !bChargingPlayer ) + { + MovementAnims[0] = default.MovementAnims[0]; + MovementAnims[1] = default.MovementAnims[1]; + MovementAnims[2] = default.MovementAnims[2]; + MovementAnims[3] = default.MovementAnims[3]; + } + } + else if( ClientSyrCount!=SyringeCount ) + { + ClientSyrCount = SyringeCount; + Switch( SyringeCount ) + { + Case 1: + SetBoneScale(3,0,'Syrange1'); + Break; + Case 2: + SetBoneScale(3,0,'Syrange1'); + SetBoneScale(4,0,'Syrange2'); + Break; + Case 3: + SetBoneScale(3,0,'Syrange1'); + SetBoneScale(4,0,'Syrange2'); + SetBoneScale(5,0,'Syrange3'); + Break; + Default: // WTF? reset...? + SetBoneScale(3,1,'Syrange1'); + SetBoneScale(4,1,'Syrange2'); + SetBoneScale(5,1,'Syrange3'); + Break; + } + } + else if( TraceHitPos!=vect(0,0,0) ) + { + AddTraceHitFX(TraceHitPos); + TraceHitPos = vect(0,0,0); + } + else if( bClientCloaked!=bCloaked ) + { + bClientCloaked = bCloaked; + bCloaked = !bCloaked; + if( bCloaked ) + UnCloakBoss(); + else CloakBoss(); + bCloaked = bClientCloaked; + } +} +simulated function int DoAnimAction( name AnimName ) +{ + if( AnimName=='MeleeImpale' || AnimName=='MeleeClaw' || AnimName=='transition' /*|| AnimName=='FireMG'*/ ) + { + AnimBlendParams(1, 1.0, 0.0,, SpineBone1); + PlayAnim(AnimName,, 0.1, 1); + Return 1; + } + else if( AnimName=='RadialAttack' ) + { + // Get rid of blending, this is a full body anim + AnimBlendParams(1, 0.0); + PlayAnim(AnimName,,0.1); + return 0; + } + Return Super.DoAnimAction(AnimName); +} + +simulated event SetAnimAction(name NewAction) +{ + local int meleeAnimIndex; + if( NewAction=='' ) + Return; + if(NewAction == 'Claw') + { + meleeAnimIndex = Rand(3); + NewAction = meleeAnims[meleeAnimIndex]; + } + ExpectingChannel = DoAnimAction(NewAction); + if( Controller != none ) + { + NiceZombieBossController(Controller).AnimWaitChannel = ExpectingChannel; + } + if( AnimNeedsWait(NewAction) ) + { + bWaitForAnim = true; + } + else + { + bWaitForAnim = false; + } + if( Level.NetMode!=NM_Client ) + { + AnimAction = NewAction; + bResetAnimAct = True; + + ResetAnimActTime = Level.TimeSeconds+0.3; + } +} +// Hand sending the controller to the WaitForAnim state +simulated function HandleWaitForAnim( name NewAnim ) +{ + local float RageAnimDur; + Controller.GoToState('WaitForAnim'); + RageAnimDur = GetAnimDuration(NewAnim); + NiceZombieBossController(Controller).SetWaitForAnimTimout(RageAnimDur,NewAnim); +} +// The animation is full body and should set the bWaitForAnim flag +simulated function bool AnimNeedsWait(name TestAnim) +{ + if( /*TestAnim == 'MeleeImpale' || TestAnim =='MeleeClaw' || TestAnim =='transition' ||*/ TestAnim == 'FireMG' || + TestAnim == 'PreFireMG' || TestAnim == 'PreFireMissile' || TestAnim == 'FireEndMG'|| TestAnim == 'FireEndMissile' || + TestAnim == 'Heal' || TestAnim == 'KnockDown' || TestAnim == 'Entrance' || TestAnim == 'VictoryLaugh' || TestAnim == 'RadialAttack' ) + { + return true; + } + return false; +} +simulated function HandleBumpGlass() +{ +} + +function bool FlipOver() +{ + Return False; +} +// Return true if we want to charge from taking too much damage +function bool ShouldChargeFromDamage() +{ + // If we don;t want to heal, charge whoever damaged us!!! + if( (SyringeCount==0 && Health (5.0 + 5.0 * FRand()) ) + { + return true; + } + return false; +} +function TakeDamageClient(int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, float headshotLevel, float lockonTime){ + local float DamagerDistSq; + //local float UsedPipeBombDamScale; + local KFHumanPawn P; + local int NumPlayersSurrounding; + local bool bDidRadialAttack; + if( Level.TimeSeconds - LastMeleeExploitCheckTime > 1.0 && (class(damageType) != none) ) + { + LastMeleeExploitCheckTime = Level.TimeSeconds; + NumLumberJacks = 0; + NumNinjas = 0; + + foreach DynamicActors(class'KFHumanPawn', P) + { + // look for guys attacking us within 3 meters + if ( VSize(P.Location - Location) < 150 ) + { + NumPlayersSurrounding++; + + if( P != none && P.Weapon != none ) + { + if( Axe(P.Weapon) != none || Chainsaw(P.Weapon) != none ) + { + NumLumberJacks++; + } + else if( Katana(P.Weapon) != none ) + { + NumNinjas++; + } + } + + if( !bDidRadialAttack && NumPlayersSurrounding >= 3 ) + { + bDidRadialAttack = true; + GotoState('RadialAttack'); + break; + } + } + } + } + // Scale damage from the pipebomb down a bit if lots of pipe bomb damage happens + // at around the same times. Prevent players from putting all thier pipe bombs + // in one place and owning the patriarch in one blow. + /*if ( class(damageType) != none ) + { + UsedPipeBombDamScale = FMax(0,(1.0 - PipeBombDamageScale)); + + PipeBombDamageScale += 0.075; + + if( PipeBombDamageScale > 1.0 ) + { + PipeBombDamageScale = 1.0; + } + + Damage *= UsedPipeBombDamScale; + }*/ + Super.TakeDamageClient(Damage,instigatedBy,hitlocation,Momentum,damageType,headshotLevel,lockonTime); + if( Level.TimeSeconds - LastDamageTime > 10 ) + { + ChargeDamage = 0; + } + else + { + LastDamageTime = Level.TimeSeconds; + ChargeDamage += Damage; + } + if( ShouldChargeFromDamage() && ChargeDamage > 200 ) + { + // If someone close up is shooting us, just charge them + if( InstigatedBy != none ) + { + DamagerDistSq = VSizeSquared(Location - InstigatedBy.Location); + + if( DamagerDistSq < (700 * 700) ) + { + SetAnimAction('transition'); + ChargeDamage=0; + LastForceChargeTime = Level.TimeSeconds; + GoToState('Charging'); + return; + } + } + } + if( Health<=0 || SyringeCount==3 || IsInState('Escaping') || IsInState('KnockDown') || IsInState('RadialAttack') || bDidRadialAttack/*|| bShotAnim*/ ) + Return; + if( (SyringeCount==0 && Health> Rotation); + Return True; +} +// Overridden to do a cool slomo death view of the patriarch dying +function Died(Controller Killer, class damageType, vector HitLocation) +{ + local Controller C; + super.Died(Killer,damageType,HitLocation); + KFGameType(Level.Game).DoBossDeath(); + For( C=Level.ControllerList; C!=none; C=C.NextController ) + { + if( PlayerController(C)!=none ) + { + PlayerController(C).SetViewTarget(Self); + PlayerController(C).ClientSetViewTarget(Self); + PlayerController(C).bBehindView = true; + PlayerController(C).ClientSetBehindView(True); + } + } +} +function ClawDamageTarget() +{ + local vector PushDir; + local name Anim; + local float frame,rate; + local float UsedMeleeDamage; + local bool bDamagedSomeone; + local KFHumanPawn P; + local Actor OldTarget; + if( MeleeDamage > 1 ) + { + UsedMeleeDamage = (MeleeDamage - (MeleeDamage * 0.05)) + (MeleeDamage * (FRand() * 0.1)); + } + else + { + UsedMeleeDamage = MeleeDamage; + } + GetAnimParams(1, Anim,frame,rate); + if( Anim == 'MeleeImpale' ) + { + MeleeRange = ImpaleMeleeDamageRange; + } + else + { + MeleeRange = ClawMeleeDamageRange; + } + if(Controller!=none && Controller.Target!=none) + PushDir = (damageForce * Normal(Controller.Target.Location - Location)); + else + PushDir = damageForce * vector(Rotation); +// Begin Balance Round 1(damages everyone in Round 2 and added seperate code path for MeleeImpale in Round 3) + if( Anim == 'MeleeImpale' ) + { + bDamagedSomeone = MeleeDamageTarget(UsedMeleeDamage, PushDir); + } + else + { + OldTarget = Controller.Target; + + foreach DynamicActors(class'KFHumanPawn', P) + { + if ( (P.Location - Location) dot PushDir > 0.0 ) // Added dot Product check in Balance Round 3 + { + Controller.Target = P; + bDamagedSomeone = bDamagedSomeone || MeleeDamageTarget(UsedMeleeDamage, damageForce * Normal(P.Location - Location)); // Always pushing players away added in Balance Round 3 + } + } + + Controller.Target = OldTarget; + } + MeleeRange = Default.MeleeRange; +// End Balance Round 1, 2, and 3 + if ( bDamagedSomeone ) + { + if( Anim == 'MeleeImpale' ) + { + PlaySound(MeleeImpaleHitSound, SLOT_Interact, 2.0); + } + else + { + PlaySound(MeleeAttackHitSound, SLOT_Interact, 2.0); + } + } +} +simulated function ProcessHitFX() +{ + local Coords boneCoords; + local class HitEffects[4]; + local int i,j; + local float GibPerterbation; + if( (Level.NetMode == NM_DedicatedServer) || bSkeletized || (Mesh == SkeletonMesh)) + { + SimHitFxTicker = HitFxTicker; + return; + } + for ( SimHitFxTicker = SimHitFxTicker; SimHitFxTicker != HitFxTicker; SimHitFxTicker = (SimHitFxTicker + 1) % ArrayCount(HitFX) ) + { + j++; + if ( j > 30 ) + { + SimHitFxTicker = HitFxTicker; + return; + } + + if( (HitFX[SimHitFxTicker].damtype == none) || (Level.bDropDetail && (Level.TimeSeconds - LastRenderTime > 3) && !IsHumanControlled()) ) + continue; + + //log("Processing effects for damtype "$HitFX[SimHitFxTicker].damtype); + + if( HitFX[SimHitFxTicker].bone == 'obliterate' && !class'GameInfo'.static.UseLowGore()) + { + SpawnGibs( HitFX[SimHitFxTicker].rotDir, 1); + bGibbed = true; + // Wait a tick on a listen server so the obliteration can replicate before the pawn is destroyed + if( Level.NetMode == NM_ListenServer ) + { + bDestroyNextTick = true; + TimeSetDestroyNextTickTime = Level.TimeSeconds; + } + else + { + Destroy(); + } + return; + } + + boneCoords = GetBoneCoords( HitFX[SimHitFxTicker].bone ); + + if ( !Level.bDropDetail && !class'GameInfo'.static.NoBlood() && !bSkeletized && !class'GameInfo'.static.UseLowGore() ) + { + //AttachEmitterEffect( BleedingEmitterClass, HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); + + HitFX[SimHitFxTicker].damtype.static.GetHitEffects( HitEffects, Health ); + + if( !PhysicsVolume.bWaterVolume ) // don't attach effects under water + { + for( i = 0; i < ArrayCount(HitEffects); i++ ) + { + if( HitEffects[i] == none ) + continue; + + AttachEffect( HitEffects[i], HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); + } + } + } + if ( class'GameInfo'.static.UseLowGore() ) + HitFX[SimHitFxTicker].bSever = false; + + if( HitFX[SimHitFxTicker].bSever ) + { + GibPerterbation = HitFX[SimHitFxTicker].damtype.default.GibPerterbation; + + switch( HitFX[SimHitFxTicker].bone ) + { + case 'obliterate': + break; + + case LeftThighBone: + if( !bLeftLegGibbed ) + { + SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + bLeftLegGibbed=true; + } + break; + + case RightThighBone: + if( !bRightLegGibbed ) + { + SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + bRightLegGibbed=true; + } + break; + + case LeftFArmBone: + if( !bLeftArmGibbed ) + { + SpawnSeveredGiblet( DetachedSpecialArmClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ;; + bLeftArmGibbed=true; + } + break; + + case RightFArmBone: + if( !bRightArmGibbed ) + { + SpawnSeveredGiblet( DetachedArmClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + bRightArmGibbed=true; + } + break; + + case 'head': + if( !bHeadGibbed ) + { + if ( HitFX[SimHitFxTicker].damtype == class'DamTypeDecapitation' ) + { + DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false); + } + else if( HitFX[SimHitFxTicker].damtype == class'DamTypeProjectileDecap' ) + { + DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false, true); + } + else if( HitFX[SimHitFxTicker].damtype == class'DamTypeMeleeDecapitation' ) + { + DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, true); + } + + bHeadGibbed=true; + } + break; + } + + if( HitFX[SimHitFXTicker].bone != 'Spine' && HitFX[SimHitFXTicker].bone != FireRootBone && + HitFX[SimHitFXTicker].bone != 'head' && Health <=0 ) + HideBone(HitFX[SimHitFxTicker].bone); + } + } +} +static simulated function PreCacheMaterials(LevelInfo myLevel) +{//should be derived and used. +/* + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.gatling_cmb'); + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.gatling_env_cmb'); + myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.gatling_D'); + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.PatGungoInvisible_cmb'); + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.patriarch_cmb'); + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.patriarch_env_cmb'); + myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.patriarch_D'); + myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.patriarch_invisible'); + myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.patriarch_invisible_gun'); + myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.patriarch_fizzle_FB'); + myLevel.AddPrecacheMaterial(Texture'kf_fx_trip_t.Gore.Patriarch_Gore_Limbs_Diff'); + myLevel.AddPrecacheMaterial(Texture'kf_fx_trip_t.Gore.Patriarch_Gore_Limbs_Spec'); + */ + } +defaultproperties +{ + RocketFireSound=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_FireRocket' + MiniGunFireSound=Sound'KF_BasePatriarch.Attack.Kev_MG_GunfireLoop' + MiniGunSpinSound=Sound'KF_BasePatriarch.Attack.Kev_MG_TurbineFireLoop' + MeleeImpaleHitSound=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_HitPlayer_Impale' + MoanVoice=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Talk' + MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_HitPlayer_Fist' + JumpSound=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Jump' + DetachedArmClass=Class'KFChar.SeveredArmPatriarch' + DetachedLegClass=Class'KFChar.SeveredLegPatriarch' + DetachedHeadClass=Class'KFChar.SeveredHeadPatriarch' + DetachedSpecialArmClass=Class'KFChar.SeveredRocketArmPatriarch' + HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Pain' + DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Death' + ControllerClass=Class'NicePack.NiceZombieBossController' + AmbientSound=Sound'KF_BasePatriarch.Idle.Kev_IdleLoop' + Mesh=SkeletalMesh'KF_Freaks_Trip.Patriarch_Freak' + Skins(0)=Combiner'KF_Specimens_Trip_T.gatling_cmb' + Skins(1)=Combiner'KF_Specimens_Trip_T.patriarch_cmb' +} diff --git a/sources/Zeds/Nice/NiceZombieBossBase.uc b/sources/Zeds/Nice/NiceZombieBossBase.uc index 41ba2b8..aa6cade 100644 --- a/sources/Zeds/Nice/NiceZombieBossBase.uc +++ b/sources/Zeds/Nice/NiceZombieBossBase.uc @@ -1,45 +1,129 @@ -class NiceZombieBossBase extends NiceMonster - abstract; -#exec OBJ LOAD FILE=KFPatch2.utx -#exec OBJ LOAD FILE=KF_Specimens_Trip_T.utx -var bool bChargingPlayer,bClientCharg,bFireAtWill,bMinigunning,bIsBossView; -var float RageStartTime,LastChainGunTime,LastMissileTime,LastSneakedTime; -var bool bClientMiniGunning; -var name ChargingAnim; // How he runs when charging the player. -var byte SyringeCount,ClientSyrCount; -var int MGFireCounter; -var vector TraceHitPos; -var Emitter mTracer,mMuzzleFlash; -var bool bClientCloaked; -var float LastCheckTimes; -var int HealingLevels[3],HealingAmount; -var(Sounds) sound RocketFireSound; // The sound of the rocket being fired -var(Sounds) sound MiniGunFireSound; // The sound of the minigun being fired -var(Sounds) sound MiniGunSpinSound; // The sound of the minigun spinning -var(Sounds) sound MeleeImpaleHitSound;// The sound of melee impale attack hitting the player -var float MGFireDuration; // How long to fire for this burst -var float MGLostSightTimeout; // When to stop firing because we lost sight of the target -var() float MGDamage; // How much damage the MG will do -var() float ClawMeleeDamageRange;// How long his arms melee strike is -var() float ImpaleMeleeDamageRange;// How long his spike melee strike is -var float LastChargeTime; // Last time the patriarch charged -var float LastForceChargeTime;// Last time patriarch was forced to charge -var int NumChargeAttacks; // Number of attacks this charge -var float ChargeDamage; // How much damage he's taken since the last charge -var float LastDamageTime; // Last Time we took damage -// Sneaking -var float SneakStartTime; // When did we start sneaking -var int SneakCount; // Keep track of the loop that sends the boss to initial hunting state -// PipeBomb damage -var() float PipeBombDamageScale;// Scale the pipe bomb damage over time -replication -{ - reliable if( Role==ROLE_Authority ) bChargingPlayer,SyringeCount,TraceHitPos,bMinigunning,bIsBossView; -} -//------------------------------------------------------------------------------- -// NOTE: All Code resides in the child class(this class was only created to -// eliminate hitching caused by loading default properties during play) -//------------------------------------------------------------------------------- -defaultproperties -{ ChargingAnim="RunF" HealingLevels(0)=5600 HealingLevels(1)=3500 HealingLevels(2)=2187 HealingAmount=1750 MGDamage=6.000000 ClawMeleeDamageRange=85.000000 ImpaleMeleeDamageRange=45.000000 fuelRatio=0.400000 bFrugalFuelUsage=False clientHeadshotScale=1.200000 ZapThreshold=5.000000 ZappedDamageMod=1.250000 ZapResistanceScale=1.000000 bHarpoonToHeadStuns=False bHarpoonToBodyStuns=False ZombieFlag=3 MeleeDamage=75 damageForce=170000 bFatAss=True KFRagdollName="Patriarch_Trip" bMeleeStunImmune=True CrispUpThreshhold=1 bCanDistanceAttackDoors=True bUseExtendedCollision=True ColOffset=(Z=65.000000) ColRadius=27.000000 ColHeight=25.000000 SeveredArmAttachScale=1.100000 SeveredLegAttachScale=1.200000 SeveredHeadAttachScale=1.500000 PlayerCountHealthScale=0.750000 BurningWalkFAnims(0)="WalkF" BurningWalkFAnims(1)="WalkF" BurningWalkFAnims(2)="WalkF" BurningWalkAnims(0)="WalkF" BurningWalkAnims(1)="WalkF" BurningWalkAnims(2)="WalkF" OnlineHeadshotOffset=(X=28.000000,Z=75.000000) OnlineHeadshotScale=1.200000 HeadHealth=100000.000000 MotionDetectorThreat=10.000000 bOnlyDamagedByCrossbow=True bBoss=True ScoringValue=500 IdleHeavyAnim="BossIdle" IdleRifleAnim="BossIdle" RagDeathVel=80.000000 RagDeathUpKick=100.000000 MeleeRange=10.000000 GroundSpeed=120.000000 WaterSpeed=120.000000 HealthMax=8000.000000 Health=8000 HeadScale=1.300000 MenuName="Nice Patriarch" MovementAnims(0)="WalkF" MovementAnims(1)="WalkF" MovementAnims(2)="WalkF" MovementAnims(3)="WalkF" AirAnims(0)="JumpInAir" AirAnims(1)="JumpInAir" AirAnims(2)="JumpInAir" AirAnims(3)="JumpInAir" TakeoffAnims(0)="JumpTakeOff" TakeoffAnims(1)="JumpTakeOff" TakeoffAnims(2)="JumpTakeOff" TakeoffAnims(3)="JumpTakeOff" LandAnims(0)="JumpLanded" LandAnims(1)="JumpLanded" LandAnims(2)="JumpLanded" LandAnims(3)="JumpLanded" AirStillAnim="JumpInAir" TakeoffStillAnim="JumpTakeOff" IdleCrouchAnim="BossIdle" IdleWeaponAnim="BossIdle" IdleRestAnim="BossIdle" DrawScale=1.050000 PrePivot=(Z=3.000000) SoundVolume=75 bNetNotify=False Mass=1000.000000 RotationRate=(Yaw=36000,Roll=0) -} +class NiceZombieBossBase extends NiceMonster + abstract; +#exec OBJ LOAD FILE=KFPatch2.utx +#exec OBJ LOAD FILE=KF_Specimens_Trip_T.utx +var bool bChargingPlayer,bClientCharg,bFireAtWill,bMinigunning,bIsBossView; +var float RageStartTime,LastChainGunTime,LastMissileTime,LastSneakedTime; +var bool bClientMiniGunning; +var name ChargingAnim; // How he runs when charging the player. +var byte SyringeCount,ClientSyrCount; +var int MGFireCounter; +var vector TraceHitPos; +var Emitter mTracer,mMuzzleFlash; +var bool bClientCloaked; +var float LastCheckTimes; +var int HealingLevels[3],HealingAmount; +var(Sounds) sound RocketFireSound; // The sound of the rocket being fired +var(Sounds) sound MiniGunFireSound; // The sound of the minigun being fired +var(Sounds) sound MiniGunSpinSound; // The sound of the minigun spinning +var(Sounds) sound MeleeImpaleHitSound;// The sound of melee impale attack hitting the player +var float MGFireDuration; // How long to fire for this burst +var float MGLostSightTimeout; // When to stop firing because we lost sight of the target +var() float MGDamage; // How much damage the MG will do +var() float ClawMeleeDamageRange;// How long his arms melee strike is +var() float ImpaleMeleeDamageRange;// How long his spike melee strike is +var float LastChargeTime; // Last time the patriarch charged +var float LastForceChargeTime;// Last time patriarch was forced to charge +var int NumChargeAttacks; // Number of attacks this charge +var float ChargeDamage; // How much damage he's taken since the last charge +var float LastDamageTime; // Last Time we took damage +// Sneaking +var float SneakStartTime; // When did we start sneaking +var int SneakCount; // Keep track of the loop that sends the boss to initial hunting state +// PipeBomb damage +var() float PipeBombDamageScale;// Scale the pipe bomb damage over time +replication +{ + reliable if( Role==ROLE_Authority ) + bChargingPlayer,SyringeCount,TraceHitPos,bMinigunning,bIsBossView; +} +//------------------------------------------------------------------------------- +// NOTE: All Code resides in the child class(this class was only created to +// eliminate hitching caused by loading default properties during play) +//------------------------------------------------------------------------------- +defaultproperties +{ + ChargingAnim="RunF" + HealingLevels(0)=5600 + HealingLevels(1)=3500 + HealingLevels(2)=2187 + HealingAmount=1750 + MGDamage=6.000000 + ClawMeleeDamageRange=85.000000 + ImpaleMeleeDamageRange=45.000000 + fuelRatio=0.400000 + bFrugalFuelUsage=False + clientHeadshotScale=1.200000 + ZapThreshold=5.000000 + ZappedDamageMod=1.250000 + ZapResistanceScale=1.000000 + bHarpoonToHeadStuns=False + bHarpoonToBodyStuns=False + ZombieFlag=3 + MeleeDamage=75 + damageForce=170000 + bFatAss=True + KFRagdollName="Patriarch_Trip" + bMeleeStunImmune=True + CrispUpThreshhold=1 + bCanDistanceAttackDoors=True + bUseExtendedCollision=True + ColOffset=(Z=65.000000) + ColRadius=27.000000 + ColHeight=25.000000 + SeveredArmAttachScale=1.100000 + SeveredLegAttachScale=1.200000 + SeveredHeadAttachScale=1.500000 + PlayerCountHealthScale=0.750000 + BurningWalkFAnims(0)="WalkF" + BurningWalkFAnims(1)="WalkF" + BurningWalkFAnims(2)="WalkF" + BurningWalkAnims(0)="WalkF" + BurningWalkAnims(1)="WalkF" + BurningWalkAnims(2)="WalkF" + OnlineHeadshotOffset=(X=28.000000,Z=75.000000) + OnlineHeadshotScale=1.200000 + HeadHealth=100000.000000 + MotionDetectorThreat=10.000000 + bOnlyDamagedByCrossbow=True + bBoss=True + ScoringValue=500 + IdleHeavyAnim="BossIdle" + IdleRifleAnim="BossIdle" + RagDeathVel=80.000000 + RagDeathUpKick=100.000000 + MeleeRange=10.000000 + GroundSpeed=120.000000 + WaterSpeed=120.000000 + HealthMax=8000.000000 + Health=8000 + HeadScale=1.300000 + MenuName="Nice Patriarch" + MovementAnims(0)="WalkF" + MovementAnims(1)="WalkF" + MovementAnims(2)="WalkF" + MovementAnims(3)="WalkF" + AirAnims(0)="JumpInAir" + AirAnims(1)="JumpInAir" + AirAnims(2)="JumpInAir" + AirAnims(3)="JumpInAir" + TakeoffAnims(0)="JumpTakeOff" + TakeoffAnims(1)="JumpTakeOff" + TakeoffAnims(2)="JumpTakeOff" + TakeoffAnims(3)="JumpTakeOff" + LandAnims(0)="JumpLanded" + LandAnims(1)="JumpLanded" + LandAnims(2)="JumpLanded" + LandAnims(3)="JumpLanded" + AirStillAnim="JumpInAir" + TakeoffStillAnim="JumpTakeOff" + IdleCrouchAnim="BossIdle" + IdleWeaponAnim="BossIdle" + IdleRestAnim="BossIdle" + DrawScale=1.050000 + PrePivot=(Z=3.000000) + SoundVolume=75 + bNetNotify=False + Mass=1000.000000 + RotationRate=(Yaw=36000,Roll=0) +} diff --git a/sources/Zeds/Nice/NiceZombieBossController.uc b/sources/Zeds/Nice/NiceZombieBossController.uc index 714e764..9da98d7 100644 --- a/sources/Zeds/Nice/NiceZombieBossController.uc +++ b/sources/Zeds/Nice/NiceZombieBossController.uc @@ -1,190 +1,353 @@ -//----------------------------------------------------------- -// -//----------------------------------------------------------- -class NiceZombieBossController extends KFMonsterController; -var NavigationPoint HidingSpots; -var float WaitAnimTimeout; // How long until the Anim we are waiting for is completed; Hack so the server doesn't get stuck in idle when its doing the Rage anim -var int AnimWaitChannel; // The channel we are waiting to end in WaitForAnim -var name AnimWaitingFor; // The animation we are waiting to end in WaitForAnim, mostly used for debugging -var bool bAlreadyFoundEnemy; // The Boss has already found an enemy at least once -function bool CanKillMeYet() -{ - return false; -} -function TimedFireWeaponAtEnemy() -{ - if ( (Enemy == none) || FireWeaponAt(Enemy) ) SetCombatTimer(); - else SetTimer(0.01, True); -} -// Overridden to support a quick initial attack to get the boss to the players quickly -function FightEnemy(bool bCanCharge) -{ - if( KFM.bShotAnim ) - { GoToState('WaitForAnim'); Return; - } - if (KFM.MeleeRange != KFM.default.MeleeRange) KFM.MeleeRange = KFM.default.MeleeRange; - if ( Enemy == none || Enemy.Health <= 0 ) FindNewEnemy(); - if ( (Enemy == FailedHuntEnemy) && (Level.TimeSeconds == FailedHuntTime) ) - { - // if ( Enemy.Controller.bIsPlayer ) // FindNewEnemy(); - if ( Enemy == FailedHuntEnemy ) { GoalString = "FAILED HUNT - HANG OUT"; if ( EnemyVisible() ) bCanCharge = false; } - } - if ( !EnemyVisible() ) - { // Added sneakcount hack to try and fix the endless loop crash. Try and track down what was causing this later - Ramm if( bAlreadyFoundEnemy || NiceZombieBoss(Pawn).SneakCount > 2 ) { bAlreadyFoundEnemy = true; GoalString = "Hunt"; GotoState('ZombieHunt'); } else { // Added sneakcount hack to try and fix the endless loop crash. Try and track down what was causing this later - Ramm NiceZombieBoss(Pawn).SneakCount++; GoalString = "InitialHunt"; GotoState('InitialHunting'); } return; - } - // see enemy - decide whether to charge it or strafe around/stand and fire - Target = Enemy; - GoalString = "Charge"; - PathFindState = 2; - DoCharge(); -} - -// Get the boss to the players quickly after initial spawn -state InitialHunting extends Hunting -{ - event SeePlayer(Pawn SeenPlayer) - { super.SeePlayer(SeenPlayer); bAlreadyFoundEnemy = true; GoalString = "Hunt"; GotoState('ZombieHunt'); - } - function BeginState() - { local float ZDif; - // Added sneakcount hack to try and fix the endless loop crash. Try and track down what was causing this later - Ramm NiceZombieBoss(Pawn).SneakCount++; - if( Pawn.CollisionRadius>27 || Pawn.CollisionHeight>46 ) { ZDif = Pawn.CollisionHeight-44; Pawn.SetCollisionSize(24,44); Pawn.MoveSmooth(vect(0,0,-1)*ZDif); } - super.BeginState(); - } - function EndState() - { local float ZDif; - if( Pawn.CollisionRadius!=Pawn.Default.CollisionRadius || Pawn.CollisionHeight!=Pawn.Default.CollisionHeight ) { ZDif = Pawn.Default.CollisionRadius-44; Pawn.MoveSmooth(vect(0,0,1)*ZDif); Pawn.SetCollisionSize(Pawn.Default.CollisionRadius,Pawn.Default.CollisionHeight); } - super.EndState(); - } -} -state ZombieCharge -{ - function bool StrafeFromDamage(float Damage, class DamageType, bool bFindDest) - { return false; - } - // I suspect this function causes bloats to get confused - function bool TryStrafe(vector sideDir) - { return false; - } - function Timer() - { Disable('NotifyBump'); Target = Enemy; TimedFireWeaponAtEnemy(); - } -WaitForAnim: - if ( Monster(Pawn).bShotAnim ) - { Goto('Moving'); - } - if ( !FindBestPathToward(Enemy, false,true) ) GotoState('ZombieRestFormation'); -Moving: - MoveToward(Enemy); - WhatToDoNext(17); - if ( bSoaking ) SoakStop("STUCK IN CHARGING!"); -} -state RunSomewhere -{ -Ignores HearNoise,DamageAttitudeTo,Tick,EnemyChanged,Startle; - function BeginState() - { HidingSpots = none; Enemy = none; SetTimer(0.1,True); - } - event SeePlayer(Pawn SeenPlayer) - { SetEnemy(SeenPlayer); - } - function Timer() - { if( Enemy==none ) Return; Target = Enemy; KFM.RangedAttack(Target); - } -Begin: - if( Pawn.Physics==PHYS_Falling ) WaitForLanding(); - While( KFM.bShotAnim ) Sleep(0.25); - if( HidingSpots==none ) HidingSpots = FindRandomDest(); - if( HidingSpots==none ) NiceZombieBoss(Pawn).BeginHealing(); - if( ActorReachable(HidingSpots) ) - { MoveTarget = HidingSpots; HidingSpots = none; - } - else FindBestPathToward(HidingSpots,True,False); - if( MoveTarget==none ) NiceZombieBoss(Pawn).BeginHealing(); - if( Enemy!=none && VSize(Enemy.Location-Pawn.Location)<100 ) MoveToward(MoveTarget,Enemy,,False); - else MoveToward(MoveTarget,MoveTarget,,False); - if( HidingSpots==none || !PlayerSeesMe() ) NiceZombieBoss(Pawn).BeginHealing(); - GoTo'Begin'; -} -State SyrRetreat -{ -Ignores HearNoise,DamageAttitudeTo,Tick,EnemyChanged,Startle; - function BeginState() - { HidingSpots = none; Enemy = none; SetTimer(0.1,True); - } - event SeePlayer(Pawn SeenPlayer) - { SetEnemy(SeenPlayer); - } - function Timer() - { if( Enemy==none ) Return; Target = Enemy; KFM.RangedAttack(Target); - } - function FindHideSpot() - { local NavigationPoint N,BN; local float Dist,BDist,MDist; local vector EnemyDir; - if( Enemy==none ) { HidingSpots = FindRandomDest(); Return; } EnemyDir = Normal(Enemy.Location-Pawn.Location); For( N=Level.NavigationPointList; N!=none; N=N.NextNavigationPoint ) { MDist = VSize(N.Location-Pawn.Location); if( MDist<2500 && !FastTrace(N.Location,Enemy.Location) && FindPathToward(N)!=none ) { Dist = VSize(N.Location-Enemy.Location)/FMax(MDist/800.f,1.5); if( (EnemyDir Dot Normal(Enemy.Location-N.Location))<0.2 ) Dist/=10; if( BN==none || BDist 2 ) + { + bAlreadyFoundEnemy = true; + GoalString = "Hunt"; + GotoState('ZombieHunt'); + } + else + { + // Added sneakcount hack to try and fix the endless loop crash. Try and track down what was causing this later - Ramm + NiceZombieBoss(Pawn).SneakCount++; + GoalString = "InitialHunt"; + GotoState('InitialHunting'); + } + return; + } + // see enemy - decide whether to charge it or strafe around/stand and fire + Target = Enemy; + GoalString = "Charge"; + PathFindState = 2; + DoCharge(); +} + +// Get the boss to the players quickly after initial spawn +state InitialHunting extends Hunting +{ + event SeePlayer(Pawn SeenPlayer) + { + super.SeePlayer(SeenPlayer); + bAlreadyFoundEnemy = true; + GoalString = "Hunt"; + GotoState('ZombieHunt'); + } + function BeginState() + { + local float ZDif; + + // Added sneakcount hack to try and fix the endless loop crash. Try and track down what was causing this later - Ramm + NiceZombieBoss(Pawn).SneakCount++; + + if( Pawn.CollisionRadius>27 || Pawn.CollisionHeight>46 ) + { + ZDif = Pawn.CollisionHeight-44; + Pawn.SetCollisionSize(24,44); + Pawn.MoveSmooth(vect(0,0,-1)*ZDif); + } + + super.BeginState(); + } + function EndState() + { + local float ZDif; + + if( Pawn.CollisionRadius!=Pawn.Default.CollisionRadius || Pawn.CollisionHeight!=Pawn.Default.CollisionHeight ) + { + ZDif = Pawn.Default.CollisionRadius-44; + Pawn.MoveSmooth(vect(0,0,1)*ZDif); + Pawn.SetCollisionSize(Pawn.Default.CollisionRadius,Pawn.Default.CollisionHeight); + } + + super.EndState(); + } +} +state ZombieCharge +{ + function bool StrafeFromDamage(float Damage, class DamageType, bool bFindDest) + { + return false; + } + // I suspect this function causes bloats to get confused + function bool TryStrafe(vector sideDir) + { + return false; + } + function Timer() + { + Disable('NotifyBump'); + Target = Enemy; + TimedFireWeaponAtEnemy(); + } +WaitForAnim: + if ( Monster(Pawn).bShotAnim ) + { + Goto('Moving'); + } + if ( !FindBestPathToward(Enemy, false,true) ) + GotoState('ZombieRestFormation'); +Moving: + MoveToward(Enemy); + WhatToDoNext(17); + if ( bSoaking ) + SoakStop("STUCK IN CHARGING!"); +} +state RunSomewhere +{ +Ignores HearNoise,DamageAttitudeTo,Tick,EnemyChanged,Startle; + function BeginState() + { + HidingSpots = none; + Enemy = none; + SetTimer(0.1,True); + } + event SeePlayer(Pawn SeenPlayer) + { + SetEnemy(SeenPlayer); + } + function Timer() + { + if( Enemy==none ) + Return; + Target = Enemy; + KFM.RangedAttack(Target); + } +Begin: + if( Pawn.Physics==PHYS_Falling ) + WaitForLanding(); + While( KFM.bShotAnim ) + Sleep(0.25); + if( HidingSpots==none ) + HidingSpots = FindRandomDest(); + if( HidingSpots==none ) + NiceZombieBoss(Pawn).BeginHealing(); + if( ActorReachable(HidingSpots) ) + { + MoveTarget = HidingSpots; + HidingSpots = none; + } + else FindBestPathToward(HidingSpots,True,False); + if( MoveTarget==none ) + NiceZombieBoss(Pawn).BeginHealing(); + if( Enemy!=none && VSize(Enemy.Location-Pawn.Location)<100 ) + MoveToward(MoveTarget,Enemy,,False); + else MoveToward(MoveTarget,MoveTarget,,False); + if( HidingSpots==none || !PlayerSeesMe() ) + NiceZombieBoss(Pawn).BeginHealing(); + GoTo'Begin'; +} +State SyrRetreat +{ +Ignores HearNoise,DamageAttitudeTo,Tick,EnemyChanged,Startle; + function BeginState() + { + HidingSpots = none; + Enemy = none; + SetTimer(0.1,True); + } + event SeePlayer(Pawn SeenPlayer) + { + SetEnemy(SeenPlayer); + } + function Timer() + { + if( Enemy==none ) + Return; + Target = Enemy; + KFM.RangedAttack(Target); + } + function FindHideSpot() + { + local NavigationPoint N,BN; + local float Dist,BDist,MDist; + local vector EnemyDir; + + if( Enemy==none ) + { + HidingSpots = FindRandomDest(); + Return; + } + EnemyDir = Normal(Enemy.Location-Pawn.Location); + For( N=Level.NavigationPointList; N!=none; N=N.NextNavigationPoint ) + { + MDist = VSize(N.Location-Pawn.Location); + if( MDist<2500 && !FastTrace(N.Location,Enemy.Location) && FindPathToward(N)!=none ) + { + Dist = VSize(N.Location-Enemy.Location)/FMax(MDist/800.f,1.5); + if( (EnemyDir Dot Normal(Enemy.Location-N.Location))<0.2 ) + Dist/=10; + if( BN==none || BDist 0) { GroundSpeed = GetOriginalGroundSpeed(); if (bBurnified) GroundSpeed *= BurnGroundSpeedMul; } - if( Level.NetMode!=NM_DedicatedServer ) ClientChargingAnims(); - NetUpdateTime = Level.TimeSeconds - 1; - } - function Tick(float Delta) - { if (!bShotAnim) { RageSpeedTween = FClamp(RageSpeedTween + (Delta * 0.75), 0, 1.0); GroundSpeed = OriginalGroundSpeed + ((OriginalGroundSpeed * 0.75 / MaxRageCounter * (RageCounter + 1) * RageSpeedTween)); if (bBurnified) GroundSpeed *= BurnGroundSpeedMul; } - Global.Tick(Delta); - } - function bool MeleeDamageTarget(int HitDamage, vector PushDir) - { local bool DamDone, bWasEnemy; - bWasEnemy = (Controller.Target == Controller.Enemy); - DamDone = Super.MeleeDamageTarget(HitDamage * RageDamageMul, vect(0, 0, 0)); if(Controller == none) return true; - if (bWasEnemy && DamDone) { //ChangeTarget(); CalmDown(); } - return DamDone; - } - function CalmDown() - { RageCounter = FClamp(RageCounter - 1, 0, MaxRageCounter); if (RageCounter == 0) GotoState(''); - } - function ChangeTarget() - { local Controller C; local Pawn BestPawn; local float Dist, BestDist; for (C = Level.ControllerList; C != none; C = C.NextController) if (C.Pawn != none && KFHumanPawn(C.Pawn) != none) { Dist = VSize(C.Pawn.Location - Location); if (C.Pawn == Controller.Target) Dist += GroundSpeed * 4; if (BestPawn == none) { BestPawn = C.Pawn; BestDist = Dist; } else if (Dist < BestDist) { BestPawn = C.Pawn; BestDist = Dist; } } if (BestPawn != none && BestPawn != Controller.Enemy) MonsterController(Controller).ChangeEnemy(BestPawn, Controller.CanSee(BestPawn)); - } -} -// Override to prevent stunning -function bool FlipOver() -{ - return true; -} -// Shouldn't fight with our own -function bool SameSpeciesAs(Pawn P) -{ - return (NiceZombieBrute(P) != none); -} -// ------------------------------------------------------ -// Animation -------------------------------------------- -// ------------------------------------------------------ -// Overridden to handle playing upper body only attacks when moving -simulated event SetAnimAction(name NewAction) -{ - if (NewAction=='') return; - if (NewAction == 'Claw') - { NewAction = MeleeAnims[rand(2)]; - } - else if (NewAction == 'BlockClaw') - { NewAction = 'BruteBlockSlam'; - } - else if (NewAction == 'AoeClaw') - { NewAction = 'BruteRageAttack'; - } - ExpectingChannel = DoAnimAction(NewAction); - if (AnimNeedsWait(NewAction)) bWaitForAnim = true; - else bWaitForAnim = false; - if (Level.NetMode != NM_Client) - { AnimAction = NewAction; bResetAnimAct = True; ResetAnimActTime = Level.TimeSeconds+0.3; - } -} -simulated function int DoAnimAction( name AnimName ) -{ - if (AnimName=='BruteAttack1' || AnimName=='BruteAttack2' || AnimName=='ZombieFireGun' || AnimName == 'DoorBash') - { if (Role == ROLE_Authority) ServerLowerBlock(); AnimBlendParams(1, 1.0, 0.0,, FireRootBone); PlayAnim(AnimName,, 0.1, 1); return 1; - } - else if (AnimName == 'BruteRageAttack') - { if (Role == ROLE_Authority) ServerLowerBlock(); AnimBlendParams(1, 1.0, 0.0,, FireRootBone); PlayAnim(AnimName,, 0.1, 1); return 1; - } - else if (AnimName == 'BlockLoop') - { AnimBlendParams(1, 1.0, 0.0,, FireRootBone); LoopAnim(AnimName,, 0.25, 1); return 1; - } - else if (AnimName == 'BruteBlockSlam') - { AnimBlendParams(2, 1.0, 0.0,, FireRootBone); PlayAnim(AnimName,, 0.1, 2); return 2; - } - return Super.DoAnimAction(AnimName); -} -// The animation is full body and should set the bWaitForAnim flag -simulated function bool AnimNeedsWait(name TestAnim) -{ - if (TestAnim == 'DoorBash') return true; - return false; -} -simulated function AnimEnd(int Channel) -{ - local name Sequence; - local float Frame, Rate; - GetAnimParams(Channel, Sequence, Frame, Rate); - // Don't allow notification for a looping animation - if (Sequence == 'BlockLoop') return; - // Disable channel 2 when we're done with it - if (Channel == 2 && Sequence == 'BruteBlockSlam') - { AnimBlendParams(2, 0); bShotAnim = false; return; - } - Super.AnimEnd(Channel); -} -simulated function ClientChargingAnims() -{ - PostNetReceive(); -} -function PlayHit(float Damage, Pawn InstigatedBy, vector HitLocation, class damageType, vector Momentum, optional int HitIdx) -{ - local Actor A; - if (bBlockedHS) A = Spawn(class'NiceBlockHitEmitter', InstigatedBy,, HitLocation, rotator(Normal(HitLocation - Location))); - else Super.PlayHit(Damage, InstigatedBy, HitLocation, damageType, Momentum, HitIdx); -} -defaultproperties -{ BlockMeleeDmgMul=1.000000 HeadShotgunDmgMul=1.000000 HeadBulletDmgMul=1.000000 stunLoopStart=0.130000 stunLoopEnd=0.650000 idleInsertFrame=0.950000 DetachedArmClass=Class'ScrnZedPack.SeveredArmBrute' DetachedLegClass=Class'ScrnZedPack.SeveredLegBrute' DetachedHeadClass=Class'ScrnZedPack.SeveredHeadBrute' ControllerClass=Class'NicePack.NiceZombieBruteController' -} +class NiceZombieBrute extends NiceZombieBruteBase; +var float BlockMeleeDmgMul; //Multiplier for melee damage taken, when Brute is blocking (no matter where the hit was landed) +var float HeadShotgunDmgMul; //Multiplier for shotgun damage taken into UNBLOCKED head +var float HeadBulletDmgMul; //Multiplier for non-sniper bullet damage taken into UNBLOCKED head +simulated function PostNetBeginPlay() +{ + super.PostNetBeginPlay(); + EnableChannelNotify(1,1); + EnableChannelNotify(2,1); + AnimBlendParams(1, 1.0, 0.0,, SpineBone1); + StartCharging(); +} +function ServerRaiseBlock() +{ + bServerBlock = true; + SetAnimAction('BlockLoop'); +} +function ServerLowerBlock() +{ + local name Sequence; + local float Frame, Rate; + bServerBlock = false; + GetAnimParams(1, Sequence, Frame, Rate); + if (Sequence == 'BlockLoop') + AnimStopLooping(1); +} +simulated function PostNetReceive() +{ + local name Sequence; + local float Frame, Rate; + if(bClientCharge != bChargingPlayer) + { + bClientCharge = bChargingPlayer; + if (bChargingPlayer) + { + MovementAnims[0] = ChargingAnim; + MeleeAnims[0] = 'BruteRageAttack'; + MeleeAnims[1] = 'BruteRageAttack'; + MeleeAnims[2] = 'BruteRageAttack'; + } + else + { + MovementAnims[0] = default.MovementAnims[0]; + MeleeAnims[0] = default.MeleeAnims[0]; + MeleeAnims[1] = default.MeleeAnims[1]; + MeleeAnims[2] = default.MeleeAnims[2]; + } + } + if (bClientBlock != bServerBlock) + { + bClientBlock = bServerBlock; + if (bClientBlock) + SetAnimAction('BlockLoop'); + else + { + GetAnimParams(1, Sequence, Frame, Rate); + if (Sequence == 'BlockLoop') + AnimStopLooping(1); + } + } +} +simulated function Tick(float DeltaTime) +{ + super.Tick(DeltaTime); + if (Role == ROLE_Authority) + { + // Lock to target when attacking (except on beginner!) + if (bShotAnim && LookTarget != none) + Acceleration = AccelRate * Normal(LookTarget.Location - Location); + // Block according to rules + if (Role == ROLE_Authority && !bServerBlock && !bShotAnim) + if (Controller != none && Controller.Target != none) + ServerRaiseBlock(); + } +} +// Override to always move when attacking +function RangedAttack(Actor A){ + if (bShotAnim || Physics == PHYS_Swimming) + return; + else if (CanAttack(A)) + { + if (bChargingPlayer) + SetAnimAction('AoeClaw'); + else + { + if (Rand(BlockHitsLanded) < 1) + SetAnimAction('BlockClaw'); + else + SetAnimAction('Claw'); + } + bShotAnim = true; + return; + } +} +function bool IsHeadShot(vector Loc, vector Ray, float AdditionalScale) +{ + local float D; + local float AddScale; + local bool bIsBlocking; + bBlockedHS = false; + if (bServerBlock && !IsTweening(1)) + { + bIsBlocking = true; + AddScale = AdditionalScale + BlockAddScale; + } + else + AddScale = AdditionalScale + 1.0; + if (Super.IsHeadShot(Loc, Ray, AddScale)) + { + if (bIsBlocking) + { + D = vector(Rotation) dot Ray; + if (-D > 0.20) { + bBlockedHS = true; + return false; + } + else + return true; + } + else + return true; + } + else + return false; +} +function bool CheckMiniFlinch( int flinchScore, + Pawn instigatedBy, + Vector hitLocation, + Vector momentum, + class damageType, + float headshotLevel, + KFPlayerReplicationInfo KFPRI){ + return false; +} +function TakeDamageClient(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Momentum, class damageType, float headshotLevel, float lockonTime){ + local float D; + local bool bIsHeadshot; + local bool bIsBlocking; + bBlockedHS = false; + if(bServerBlock && !IsTweening(1)) + bIsBlocking = true; + if(headshotLevel > 0.0 && bIsBlocking){ + D = vector(Rotation) dot Normal(Momentum); + D *= -1; + if(D > 0.30) { + bBlockedHS = true; + headshotLevel = 0.0; + } + } + bIsHeadShot = (headshotLevel > 0.0); + // damage, which doen't make headshots, always does full damage to Brute -- PooSH + if (damageType != none && damageType.default.bCheckForHeadShots) { + if (!bIsHeadShot && bBlockedHS) + { + if(damageType != none || damageType.default.bIsProjectile) + PlaySound(class'MetalHitEmitter'.default.ImpactSounds[rand(3)],, 128); + else if(class(damageType) != none) + PlaySound(Sound'KF_KnifeSnd.Knife_HitMetal',, 128); + if(damageType.default.bDealBurningDamage && !damageType.default.bIsPowerWeapon) + Damage *= BlockFireDmgMul; // Fire damage isn't reduced as much, excluding TrenchGun + else + Damage *= BlockDmgMul; // Greatly reduce damage as we only hit the metal plating + } + else if(bServerBlock && class(damageType) != none) + Damage *= BlockMeleeDmgMul; // Give Brute higher melee damage resistance, but apply it only if Brute is blocking + else if(bIsHeadShot){ + if (damageType.default.bIsPowerWeapon) + Damage *= HeadShotgunDmgMul; // Give Brute's head resistance to stotguns + } + } + // Record damage over 2-second frames + if (LastDamagedTime < Level.TimeSeconds) + { + TwoSecondDamageTotal = 0; + LastDamagedTime = Level.TimeSeconds + 2; + } + TwoSecondDamageTotal += Damage; + // If criteria is met make him rage + if (!bDecapitated && !bChargingPlayer && TwoSecondDamageTotal > RageDamageThreshold) + StartCharging(); + Super(NiceMonster).TakeDamageClient(Damage, instigatedBy, hitLocation, momentum, damageType, headshotLevel, lockonTime); + if (bDecapitated) + Died(InstigatedBy.Controller, damageType, HitLocation); +} +function TakeFireDamage(int Damage, Pawn Instigator) +{ + Super.TakeFireDamage(Damage, Instigator); + // Adjust movement speed if not charging + if (!bChargingPlayer) + { + if (bBurnified) + GroundSpeed = GetOriginalGroundSpeed() * BurnGroundSpeedMul; + else + GroundSpeed = GetOriginalGroundSpeed(); + } +} +function ClawDamageTarget() +{ + local KFHumanPawn HumanTarget; + local float UsedMeleeDamage; + local Actor OldTarget; + local name Sequence; + local float Frame, Rate; + local bool bHitSomeone; + if (MeleeDamage > 1) + UsedMeleeDamage = (MeleeDamage - (MeleeDamage * 0.05)) + (MeleeDamage * (FRand() * 0.1)); + else + UsedMeleeDamage = MeleeDamage; + GetAnimParams(1, Sequence, Frame, Rate); + if (Controller != none && Controller.Target != none) + { + if (Sequence == 'BruteRageAttack') + { + OldTarget = Controller.Target; + foreach VisibleCollidingActors(class'KFHumanPawn', HumanTarget, MeleeRange + class'KFHumanPawn'.default.CollisionRadius) + { + bHitSomeone = ClawDamageSingleTarget(UsedMeleeDamage, HumanTarget); + } + Controller.Target = OldTarget; + if (bHitSomeone) + BlockHitsLanded++; + } + else if (Sequence != 'BruteAttack1' && Sequence != 'BruteAttack2' && Sequence != 'DoorBash') // Block attack + { + bHitSomeone = ClawDamageSingleTarget(UsedMeleeDamage, Controller.Target); + if (bHitSomeone) + BlockHitsLanded++; + } + else + bHitSomeone = ClawDamageSingleTarget(UsedMeleeDamage, Controller.Target); + if (bHitSomeone) + PlaySound(MeleeAttackHitSound, SLOT_Interact, 1.25); + } +} +function bool ClawDamageSingleTarget(float UsedMeleeDamage, Actor ThisTarget) +{ + local Pawn HumanTarget; + local KFPlayerController HumanTargetController; + local bool bHitSomeone; + local float EnemyAngle; + local vector PushForceVar; + EnemyAngle = Normal(ThisTarget.Location - Location) dot vector(Rotation); + if (EnemyAngle > 0) + { + Controller.Target = ThisTarget; + if (MeleeDamageTarget(UsedMeleeDamage, vect(0, 0, 0))) + { + HumanTarget = KFHumanPawn(ThisTarget); + if (HumanTarget != none) + { + EnemyAngle = (EnemyAngle * 0.5) + 0.5; // Players at sides get knocked back half as much + PushForceVar = (PushForce * Normal(HumanTarget.Location - Location) * EnemyAngle) + PushAdd; + if (!bChargingPlayer) + PushForceVar *= 0.85; + // (!) I'm sure the VeterancyName string is localized but I'm not sure of another way compatible with ServerPerks + if (KFPlayerReplicationInfo(HumanTarget.Controller.PlayerReplicationInfo).ClientVeteranSkill != none) + if (KFPlayerReplicationInfo(HumanTarget.Controller.PlayerReplicationInfo).ClientVeteranSkill + .default.VeterancyName == "Berserker") + PushForceVar *= 0.75; + if (!(HumanTarget.Physics == PHYS_WALKING || HumanTarget.Physics == PHYS_none)) + PushForceVar *= vect(1, 1, 0); // (!) Don't throw upwards if we are not on the ground - adjust for more flexibility + + HumanTarget.AddVelocity(PushForceVar); + + HumanTargetController = KFPlayerController(HumanTarget.Controller); + if (HumanTargetController != none) + HumanTargetController.ShakeView(ShakeViewRotMag, ShakeViewRotRate, ShakeViewRotTime, + ShakeViewOffsetMag, ShakeViewOffsetRate, ShakeViewOffsetTime); + bHitSomeone = true; + } + } + } + return bHitSomeone; +} +function StartCharging() +{ + // How many times should we hit before we cool down? + if (Level.Game.NumPlayers <= 3) + MaxRageCounter = 2; + else + MaxRageCounter = 3; + RageCounter = MaxRageCounter; + PlaySound(RageSound, SLOT_Talk, 255); + GotoState('RageCharging'); +} +state RageCharging +{ +Ignores StartCharging; + function bool CanGetOutOfWay() + { + return false; + } + function bool CanSpeedAdjust() + { + return false; + } + function BeginState() + { + bFrustrated = false; + bChargingPlayer = true; + RageSpeedTween = 0.0; + if (Level.NetMode != NM_DedicatedServer) + ClientChargingAnims(); + + NetUpdateTime = Level.TimeSeconds - 1; + } + function EndState() + { + bChargingPlayer = false; + + NiceZombieBruteController(Controller).RageFrustrationTimer = 0; + + if (Health > 0) + { + GroundSpeed = GetOriginalGroundSpeed(); + if (bBurnified) + GroundSpeed *= BurnGroundSpeedMul; + } + + if( Level.NetMode!=NM_DedicatedServer ) + ClientChargingAnims(); + + NetUpdateTime = Level.TimeSeconds - 1; + } + function Tick(float Delta) + { + if (!bShotAnim) + { + RageSpeedTween = FClamp(RageSpeedTween + (Delta * 0.75), 0, 1.0); + GroundSpeed = OriginalGroundSpeed + ((OriginalGroundSpeed * 0.75 / MaxRageCounter * (RageCounter + 1) * RageSpeedTween)); + if (bBurnified) + GroundSpeed *= BurnGroundSpeedMul; + } + + Global.Tick(Delta); + } + function bool MeleeDamageTarget(int HitDamage, vector PushDir) + { + local bool DamDone, bWasEnemy; + + bWasEnemy = (Controller.Target == Controller.Enemy); + + DamDone = Super.MeleeDamageTarget(HitDamage * RageDamageMul, vect(0, 0, 0)); + if(Controller == none) + return true; + + if (bWasEnemy && DamDone) + { + //ChangeTarget(); + CalmDown(); + } + + return DamDone; + } + function CalmDown() + { + RageCounter = FClamp(RageCounter - 1, 0, MaxRageCounter); + if (RageCounter == 0) + GotoState(''); + } + function ChangeTarget() + { + local Controller C; + local Pawn BestPawn; + local float Dist, BestDist; + for (C = Level.ControllerList; C != none; C = C.NextController) + if (C.Pawn != none && KFHumanPawn(C.Pawn) != none) + { + Dist = VSize(C.Pawn.Location - Location); + if (C.Pawn == Controller.Target) + Dist += GroundSpeed * 4; + if (BestPawn == none) + { + BestPawn = C.Pawn; + BestDist = Dist; + } + else if (Dist < BestDist) + { + BestPawn = C.Pawn; + BestDist = Dist; + } + } + if (BestPawn != none && BestPawn != Controller.Enemy) + MonsterController(Controller).ChangeEnemy(BestPawn, Controller.CanSee(BestPawn)); + } +} +// Override to prevent stunning +function bool FlipOver() +{ + return true; +} +// Shouldn't fight with our own +function bool SameSpeciesAs(Pawn P) +{ + return (NiceZombieBrute(P) != none); +} +// ------------------------------------------------------ +// Animation -------------------------------------------- +// ------------------------------------------------------ +// Overridden to handle playing upper body only attacks when moving +simulated event SetAnimAction(name NewAction) +{ + if (NewAction=='') + return; + if (NewAction == 'Claw') + { + NewAction = MeleeAnims[rand(2)]; + } + else if (NewAction == 'BlockClaw') + { + NewAction = 'BruteBlockSlam'; + } + else if (NewAction == 'AoeClaw') + { + NewAction = 'BruteRageAttack'; + } + ExpectingChannel = DoAnimAction(NewAction); + if (AnimNeedsWait(NewAction)) + bWaitForAnim = true; + else + bWaitForAnim = false; + if (Level.NetMode != NM_Client) + { + AnimAction = NewAction; + bResetAnimAct = True; + ResetAnimActTime = Level.TimeSeconds+0.3; + } +} +simulated function int DoAnimAction( name AnimName ) +{ + if (AnimName=='BruteAttack1' || AnimName=='BruteAttack2' || AnimName=='ZombieFireGun' || AnimName == 'DoorBash') + { + if (Role == ROLE_Authority) + ServerLowerBlock(); + AnimBlendParams(1, 1.0, 0.0,, FireRootBone); + PlayAnim(AnimName,, 0.1, 1); + return 1; + } + else if (AnimName == 'BruteRageAttack') + { + if (Role == ROLE_Authority) + ServerLowerBlock(); + AnimBlendParams(1, 1.0, 0.0,, FireRootBone); + PlayAnim(AnimName,, 0.1, 1); + return 1; + } + else if (AnimName == 'BlockLoop') + { + AnimBlendParams(1, 1.0, 0.0,, FireRootBone); + LoopAnim(AnimName,, 0.25, 1); + return 1; + } + else if (AnimName == 'BruteBlockSlam') + { + AnimBlendParams(2, 1.0, 0.0,, FireRootBone); + PlayAnim(AnimName,, 0.1, 2); + return 2; + } + return Super.DoAnimAction(AnimName); +} +// The animation is full body and should set the bWaitForAnim flag +simulated function bool AnimNeedsWait(name TestAnim) +{ + if (TestAnim == 'DoorBash') + return true; + return false; +} +simulated function AnimEnd(int Channel) +{ + local name Sequence; + local float Frame, Rate; + GetAnimParams(Channel, Sequence, Frame, Rate); + // Don't allow notification for a looping animation + if (Sequence == 'BlockLoop') + return; + // Disable channel 2 when we're done with it + if (Channel == 2 && Sequence == 'BruteBlockSlam') + { + AnimBlendParams(2, 0); + bShotAnim = false; + return; + } + Super.AnimEnd(Channel); +} +simulated function ClientChargingAnims() +{ + PostNetReceive(); +} +function PlayHit(float Damage, Pawn InstigatedBy, vector HitLocation, class damageType, vector Momentum, optional int HitIdx) +{ + local Actor A; + if (bBlockedHS) + A = Spawn(class'NiceBlockHitEmitter', InstigatedBy,, HitLocation, rotator(Normal(HitLocation - Location))); + else + Super.PlayHit(Damage, InstigatedBy, HitLocation, damageType, Momentum, HitIdx); +} +defaultproperties +{ + BlockMeleeDmgMul=1.000000 + HeadShotgunDmgMul=1.000000 + HeadBulletDmgMul=1.000000 + stunLoopStart=0.130000 + stunLoopEnd=0.650000 + idleInsertFrame=0.950000 + DetachedArmClass=Class'ScrnZedPack.SeveredArmBrute' + DetachedLegClass=Class'ScrnZedPack.SeveredLegBrute' + DetachedHeadClass=Class'ScrnZedPack.SeveredHeadBrute' + ControllerClass=Class'NicePack.NiceZombieBruteController' +} diff --git a/sources/Zeds/Nice/NiceZombieBruteBase.uc b/sources/Zeds/Nice/NiceZombieBruteBase.uc index 20c5b9f..d362370 100644 --- a/sources/Zeds/Nice/NiceZombieBruteBase.uc +++ b/sources/Zeds/Nice/NiceZombieBruteBase.uc @@ -1,47 +1,129 @@ -class NiceZombieBruteBase extends NiceMonster; -#exec load obj file=ScrnZedPack_T.utx -#exec load obj file=ScrnZedPack_S.uax -#exec load obj file=ScrnZedPack_A.ukx -#exec OBJ LOAD FILE=KFWeaponSound.uax -var bool bChargingPlayer; -var bool bClientCharge; -var bool bFrustrated; -var int MaxRageCounter; // Maximum amount of players we can hit before calming down -var int RageCounter; // Decreases each time we successfully hit a player -var float RageSpeedTween; -var int TwoSecondDamageTotal; -var float LastDamagedTime; -var int RageDamageThreshold; -var int BlockHitsLanded; // Hits made while blocking or raging -var name ChargingAnim; -var Sound RageSound; -// View shaking for players -var() vector ShakeViewRotMag; -var() vector ShakeViewRotRate; -var() float ShakeViewRotTime; -var() vector ShakeViewOffsetMag; -var() vector ShakeViewOffsetRate; -var() float ShakeViewOffsetTime; -var float PushForce; -var vector PushAdd; // Used to add additional height to push -var float RageDamageMul; // Multiplier for hit damage when raging -var float RageBumpDamage; // Damage done when we hit other specimens while raging -var float BlockAddScale; // Additional head scale when blocking -var bool bBlockedHS; -var bool bBlocking; -var bool bServerBlock; -var bool bClientBlock; -var float BlockDmgMul; // Multiplier for damage taken from blocked shots -var float BlockFireDmgMul; -var float BurnGroundSpeedMul; // Multiplier for ground speed when burning -replication -{ - reliable if(Role == ROLE_Authority) bChargingPlayer, bServerBlock; -} -//-------------------------------------------------------------------------- -// NOTE: All Code resides in the child class(this class was only created to -// eliminate hitching caused by loading default properties during play) -//-------------------------------------------------------------------------- -defaultproperties -{ RageDamageThreshold=50 ChargingAnim="BruteRun" RageSound=SoundGroup'ScrnZedPack_S.Brute.BruteRage' ShakeViewRotMag=(X=500.000000,Y=500.000000,Z=600.000000) ShakeViewRotRate=(X=12500.000000,Y=12500.000000,Z=12500.000000) ShakeViewRotTime=6.000000 ShakeViewOffsetMag=(X=5.000000,Y=10.000000,Z=5.000000) ShakeViewOffsetRate=(X=300.000000,Y=300.000000,Z=300.000000) ShakeViewOffsetTime=3.500000 PushForce=860.000000 PushAdd=(Z=150.000000) RageDamageMul=1.100000 RageBumpDamage=4.000000 BlockAddScale=2.500000 BlockDmgMul=0.100000 BlockFireDmgMul=1.000000 BurnGroundSpeedMul=0.700000 StunThreshold=4.000000 flameFuel=0.500000 clientHeadshotScale=1.300000 MeleeAnims(0)="BruteAttack1" MeleeAnims(1)="BruteAttack2" MeleeAnims(2)="BruteBlockSlam" MoanVoice=SoundGroup'ScrnZedPack_S.Brute.BruteTalk' BleedOutDuration=7.000000 ZombieFlag=3 MeleeDamage=20 damageForce=25000 bFatAss=True KFRagdollName="FleshPound_Trip" MeleeAttackHitSound=SoundGroup'ScrnZedPack_S.Brute.BruteHitPlayer' JumpSound=SoundGroup'ScrnZedPack_S.Brute.BruteJump' SpinDamConst=20.000000 SpinDamRand=20.000000 bMeleeStunImmune=True bUseExtendedCollision=True ColOffset=(Z=52.000000) ColRadius=35.000000 ColHeight=25.000000 SeveredArmAttachScale=1.300000 SeveredLegAttachScale=1.200000 SeveredHeadAttachScale=1.500000 PlayerCountHealthScale=0.250000 OnlineHeadshotOffset=(X=22.000000,Z=68.000000) OnlineHeadshotScale=1.300000 HeadHealth=180.000000 PlayerNumHeadHealthScale=0.200000 MotionDetectorThreat=5.000000 HitSound(0)=SoundGroup'ScrnZedPack_S.Brute.BrutePain' DeathSound(0)=SoundGroup'ScrnZedPack_S.Brute.BruteDeath' ChallengeSound(0)=SoundGroup'ScrnZedPack_S.Brute.BruteChallenge' ChallengeSound(1)=SoundGroup'ScrnZedPack_S.Brute.BruteChallenge' ChallengeSound(2)=SoundGroup'ScrnZedPack_S.Brute.BruteChallenge' ChallengeSound(3)=SoundGroup'ScrnZedPack_S.Brute.BruteChallenge' ScoringValue=60 IdleHeavyAnim="BruteIdle" IdleRifleAnim="BruteIdle" RagDeathUpKick=100.000000 MeleeRange=85.000000 GroundSpeed=140.000000 WaterSpeed=120.000000 HealthMax=1000.000000 Health=1000 HeadHeight=2.500000 HeadScale=1.300000 MenuName="Brute" MovementAnims(0)="BruteWalkC" MovementAnims(1)="BruteWalkC" WalkAnims(0)="BruteWalkC" WalkAnims(1)="BruteWalkC" WalkAnims(2)="RunL" WalkAnims(3)="RunR" IdleCrouchAnim="BruteIdle" IdleWeaponAnim="BruteIdle" IdleRestAnim="BruteIdle" AmbientSound=SoundGroup'ScrnZedPack_S.Brute.BruteIdle1Shot' Mesh=SkeletalMesh'ScrnZedPack_A.BruteMesh' PrePivot=(Z=0.000000) Skins(0)=Combiner'ScrnZedPack_T.Brute.Brute_Final' Mass=600.000000 RotationRate=(Yaw=45000,Roll=0) -} +class NiceZombieBruteBase extends NiceMonster; +#exec load obj file=ScrnZedPack_T.utx +#exec load obj file=ScrnZedPack_S.uax +#exec load obj file=ScrnZedPack_A.ukx +#exec OBJ LOAD FILE=KFWeaponSound.uax +var bool bChargingPlayer; +var bool bClientCharge; +var bool bFrustrated; +var int MaxRageCounter; // Maximum amount of players we can hit before calming down +var int RageCounter; // Decreases each time we successfully hit a player +var float RageSpeedTween; +var int TwoSecondDamageTotal; +var float LastDamagedTime; +var int RageDamageThreshold; +var int BlockHitsLanded; // Hits made while blocking or raging +var name ChargingAnim; +var Sound RageSound; +// View shaking for players +var() vector ShakeViewRotMag; +var() vector ShakeViewRotRate; +var() float ShakeViewRotTime; +var() vector ShakeViewOffsetMag; +var() vector ShakeViewOffsetRate; +var() float ShakeViewOffsetTime; +var float PushForce; +var vector PushAdd; // Used to add additional height to push +var float RageDamageMul; // Multiplier for hit damage when raging +var float RageBumpDamage; // Damage done when we hit other specimens while raging +var float BlockAddScale; // Additional head scale when blocking +var bool bBlockedHS; +var bool bBlocking; +var bool bServerBlock; +var bool bClientBlock; +var float BlockDmgMul; // Multiplier for damage taken from blocked shots +var float BlockFireDmgMul; +var float BurnGroundSpeedMul; // Multiplier for ground speed when burning +replication +{ + reliable if(Role == ROLE_Authority) + bChargingPlayer, bServerBlock; +} +//-------------------------------------------------------------------------- +// NOTE: All Code resides in the child class(this class was only created to +// eliminate hitching caused by loading default properties during play) +//-------------------------------------------------------------------------- +defaultproperties +{ + RageDamageThreshold=50 + ChargingAnim="BruteRun" + RageSound=SoundGroup'ScrnZedPack_S.Brute.BruteRage' + ShakeViewRotMag=(X=500.000000,Y=500.000000,Z=600.000000) + ShakeViewRotRate=(X=12500.000000,Y=12500.000000,Z=12500.000000) + ShakeViewRotTime=6.000000 + ShakeViewOffsetMag=(X=5.000000,Y=10.000000,Z=5.000000) + ShakeViewOffsetRate=(X=300.000000,Y=300.000000,Z=300.000000) + ShakeViewOffsetTime=3.500000 + PushForce=860.000000 + PushAdd=(Z=150.000000) + RageDamageMul=1.100000 + RageBumpDamage=4.000000 + BlockAddScale=2.500000 + BlockDmgMul=0.100000 + BlockFireDmgMul=1.000000 + BurnGroundSpeedMul=0.700000 + StunThreshold=4.000000 + flameFuel=0.500000 + clientHeadshotScale=1.300000 + MeleeAnims(0)="BruteAttack1" + MeleeAnims(1)="BruteAttack2" + MeleeAnims(2)="BruteBlockSlam" + MoanVoice=SoundGroup'ScrnZedPack_S.Brute.BruteTalk' + BleedOutDuration=7.000000 + ZombieFlag=3 + MeleeDamage=20 + damageForce=25000 + bFatAss=True + KFRagdollName="FleshPound_Trip" + MeleeAttackHitSound=SoundGroup'ScrnZedPack_S.Brute.BruteHitPlayer' + JumpSound=SoundGroup'ScrnZedPack_S.Brute.BruteJump' + SpinDamConst=20.000000 + SpinDamRand=20.000000 + bMeleeStunImmune=True + bUseExtendedCollision=True + ColOffset=(Z=52.000000) + ColRadius=35.000000 + ColHeight=25.000000 + SeveredArmAttachScale=1.300000 + SeveredLegAttachScale=1.200000 + SeveredHeadAttachScale=1.500000 + PlayerCountHealthScale=0.250000 + OnlineHeadshotOffset=(X=22.000000,Z=68.000000) + OnlineHeadshotScale=1.300000 + HeadHealth=180.000000 + PlayerNumHeadHealthScale=0.200000 + MotionDetectorThreat=5.000000 + HitSound(0)=SoundGroup'ScrnZedPack_S.Brute.BrutePain' + DeathSound(0)=SoundGroup'ScrnZedPack_S.Brute.BruteDeath' + ChallengeSound(0)=SoundGroup'ScrnZedPack_S.Brute.BruteChallenge' + ChallengeSound(1)=SoundGroup'ScrnZedPack_S.Brute.BruteChallenge' + ChallengeSound(2)=SoundGroup'ScrnZedPack_S.Brute.BruteChallenge' + ChallengeSound(3)=SoundGroup'ScrnZedPack_S.Brute.BruteChallenge' + ScoringValue=60 + IdleHeavyAnim="BruteIdle" + IdleRifleAnim="BruteIdle" + RagDeathUpKick=100.000000 + MeleeRange=85.000000 + GroundSpeed=140.000000 + WaterSpeed=120.000000 + HealthMax=1000.000000 + Health=1000 + HeadHeight=2.500000 + HeadScale=1.300000 + MenuName="Brute" + MovementAnims(0)="BruteWalkC" + MovementAnims(1)="BruteWalkC" + WalkAnims(0)="BruteWalkC" + WalkAnims(1)="BruteWalkC" + WalkAnims(2)="RunL" + WalkAnims(3)="RunR" + IdleCrouchAnim="BruteIdle" + IdleWeaponAnim="BruteIdle" + IdleRestAnim="BruteIdle" + AmbientSound=SoundGroup'ScrnZedPack_S.Brute.BruteIdle1Shot' + Mesh=SkeletalMesh'ScrnZedPack_A.BruteMesh' + PrePivot=(Z=0.000000) + Skins(0)=Combiner'ScrnZedPack_T.Brute.Brute_Final' + Mass=600.000000 + RotationRate=(Yaw=45000,Roll=0) +} diff --git a/sources/Zeds/Nice/NiceZombieBruteController.uc b/sources/Zeds/Nice/NiceZombieBruteController.uc index 26d5163..c8fa8b5 100644 --- a/sources/Zeds/Nice/NiceZombieBruteController.uc +++ b/sources/Zeds/Nice/NiceZombieBruteController.uc @@ -1,29 +1,39 @@ -class NiceZombieBruteController extends NiceMonsterController; -var float RageAnimTimeout; // How long until the RageAnim is completed; Hack so the server doesn't get stuck in idle when its doing the Rage anim -var bool bDoneSpottedCheck; -var float RageFrustrationTimer; // Tracks how long we have been walking toward a visible enemy -var float RageFrustrationThreshhold; // Base value for how long the FP should walk torward an enemy without reaching them before getting frustrated and raging -function TimedFireWeaponAtEnemy() -{ - if ( (Enemy == none) || FireWeaponAt(Enemy) ) SetCombatTimer(); - else SetTimer(0.01, True); -} -state ZombieCharge -{ - function bool StrafeFromDamage(float Damage, class DamageType, bool bFindDest) - { return false; - } - function bool TryStrafe(vector sideDir) - { return false; - } - function Timer() - { Disable('NotifyBump'); Target = Enemy; TimedFireWeaponAtEnemy(); - } - function BeginState() - { super.BeginState(); - RageFrustrationThreshhold = default.RageFrustrationThreshhold + (Frand() * 5); - } -} -defaultproperties -{ RageFrustrationThreshhold=10.000000 -} +class NiceZombieBruteController extends NiceMonsterController; +var float RageAnimTimeout; // How long until the RageAnim is completed; Hack so the server doesn't get stuck in idle when its doing the Rage anim +var bool bDoneSpottedCheck; +var float RageFrustrationTimer; // Tracks how long we have been walking toward a visible enemy +var float RageFrustrationThreshhold; // Base value for how long the FP should walk torward an enemy without reaching them before getting frustrated and raging +function TimedFireWeaponAtEnemy() +{ + if ( (Enemy == none) || FireWeaponAt(Enemy) ) + SetCombatTimer(); + else + SetTimer(0.01, True); +} +state ZombieCharge +{ + function bool StrafeFromDamage(float Damage, class DamageType, bool bFindDest) + { + return false; + } + function bool TryStrafe(vector sideDir) + { + return false; + } + function Timer() + { + Disable('NotifyBump'); + Target = Enemy; + TimedFireWeaponAtEnemy(); + } + function BeginState() + { + super.BeginState(); + + RageFrustrationThreshhold = default.RageFrustrationThreshhold + (Frand() * 5); + } +} +defaultproperties +{ + RageFrustrationThreshhold=10.000000 +} diff --git a/sources/Zeds/Nice/NiceZombieClot.uc b/sources/Zeds/Nice/NiceZombieClot.uc index 369c69f..0e73657 100644 --- a/sources/Zeds/Nice/NiceZombieClot.uc +++ b/sources/Zeds/Nice/NiceZombieClot.uc @@ -1,126 +1,205 @@ -// Zombie Monster for KF Invasion gametype -class NiceZombieClot extends NiceZombieClotBase; -#exec OBJ LOAD FILE=KF_Freaks_Trip.ukx -#exec OBJ LOAD FILE=KF_Specimens_Trip_T.utx -#exec OBJ LOAD FILE=MeanZedSkins.utx -function ClawDamageTarget() -{ - local vector PushDir; - local KFPawn KFP; - local float UsedMeleeDamage; - - if( MeleeDamage > 1 ) - { UsedMeleeDamage = (MeleeDamage - (MeleeDamage * 0.05)) + (MeleeDamage * (FRand() * 0.1)); - } - else - { UsedMeleeDamage = MeleeDamage; - } - // If zombie has latched onto us... - if ( MeleeDamageTarget( UsedMeleeDamage, PushDir)) - { KFP = KFPawn(Controller.Target); - PlaySound(MeleeAttackHitSound, SLOT_Interact, 2.0); - if( !bDecapitated && KFP != none ) { if( KFPlayerReplicationInfo(KFP.PlayerReplicationInfo) == none || KFP.GetVeteran().static.CanBeGrabbed(KFPlayerReplicationInfo(KFP.PlayerReplicationInfo), self)) { if( DisabledPawn != none ) { DisabledPawn.bMovementDisabled = false; } - KFP.DisableMovement(GrappleDuration); DisabledPawn = KFP; } } - } -} -function RangedAttack(Actor A) -{ - if ( bShotAnim || Physics == PHYS_Swimming) return; - else if ( CanAttack(A) ) - { bShotAnim = true; SetAnimAction('Claw'); return; - } -} -simulated event SetAnimAction(name NewAction) -{ - local int meleeAnimIndex; - if( NewAction=='' ) Return; - if(NewAction == 'Claw') - { meleeAnimIndex = Rand(3); NewAction = meleeAnims[meleeAnimIndex]; - } - ExpectingChannel = DoAnimAction(NewAction); - if( AnimNeedsWait(NewAction) ) - { bWaitForAnim = true; - } - if( Level.NetMode!=NM_Client ) - { AnimAction = NewAction; bResetAnimAct = True; ResetAnimActTime = Level.TimeSeconds+0.3; - } -} -simulated function bool AnimNeedsWait(name TestAnim) -{ - if( TestAnim == 'KnockDown' || TestAnim == 'DoorBash' ) - { return true; - } - return false; -} -simulated function int DoAnimAction( name AnimName ) -{ - if( AnimName=='ClotGrapple' || AnimName=='ClotGrappleTwo' || AnimName=='ClotGrappleThree' ) - { AnimBlendParams(1, 1.0, 0.1,, FireRootBone); PlayAnim(AnimName,, 0.1, 1); - // Randomly send out a message about Clot grabbing you(10% chance) if ( FRand() < 0.10 && LookTarget != none && KFPlayerController(LookTarget.Controller) != none && VSizeSquared(Location - LookTarget.Location) < 2500 /* (MeleeRange + 20)^2 */ && Level.TimeSeconds - KFPlayerController(LookTarget.Controller).LastClotGrabMessageTime > ClotGrabMessageDelay && KFPlayerController(LookTarget.Controller).SelectedVeterancy != class'KFVetBerserker' ) { PlayerController(LookTarget.Controller).Speech('AUTO', 11, ""); KFPlayerController(LookTarget.Controller).LastClotGrabMessageTime = Level.TimeSeconds; } - bGrappling = true; GrappleEndTime = Level.TimeSeconds + GrappleDuration; - return 1; - } - return super.DoAnimAction( AnimName ); -} -simulated function Tick(float DeltaTime) -{ - super.Tick(DeltaTime); - if( bShotAnim && Role == ROLE_Authority ) - { if( LookTarget!=none ) { Acceleration = AccelRate * Normal(LookTarget.Location - Location); } - } - if( Role == ROLE_Authority && bGrappling ) - { if( Level.TimeSeconds > GrappleEndTime ) { bGrappling = false; } - } - // if we move out of melee range, stop doing the grapple animation - if( bGrappling && LookTarget != none ) - { if( VSize(LookTarget.Location - Location) > MeleeRange + CollisionRadius + LookTarget.CollisionRadius ) { bGrappling = false; AnimEnd(1); } - } -} -function RemoveHead() -{ - Super.RemoveHead(); - MeleeAnims[0] = 'Claw'; - MeleeAnims[1] = 'Claw'; - MeleeAnims[2] = 'Claw2'; - MeleeDamage *= 2; - MeleeRange *= 2; - if( DisabledPawn != none ) - { DisabledPawn.bMovementDisabled = false; DisabledPawn = none; - } -} -function Died(Controller Killer, class damageType, vector HitLocation) -{ - if( DisabledPawn != none ) - { DisabledPawn.bMovementDisabled = false; DisabledPawn = none; - } - super.Died(Killer, damageType, HitLocation); -} -simulated function Destroyed() -{ - super.Destroyed(); - if( DisabledPawn != none ) - { DisabledPawn.bMovementDisabled = false; DisabledPawn = none; - } -} -static simulated function PreCacheStaticMeshes(LevelInfo myLevel) -{//should be derived and used. - Super.PreCacheStaticMeshes(myLevel); -/* - myLevel.AddPrecacheStaticMesh(StaticMesh'kf_gore_trip_sm.clot.clothead_piece_1'); - myLevel.AddPrecacheStaticMesh(StaticMesh'kf_gore_trip_sm.clot.clothead_piece_2'); - myLevel.AddPrecacheStaticMesh(StaticMesh'kf_gore_trip_sm.clot.clothead_piece_3'); - myLevel.AddPrecacheStaticMesh(StaticMesh'kf_gore_trip_sm.clot.clothead_piece_4'); - myLevel.AddPrecacheStaticMesh(StaticMesh'kf_gore_trip_sm.clot.clothead_piece_5'); - myLevel.AddPrecacheStaticMesh(StaticMesh'kf_gore_trip_sm.clot.clothead_piece_6'); -*/ -} -static simulated function PreCacheMaterials(LevelInfo myLevel) -{//should be derived and used. - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.clot_cmb'); - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.clot_env_cmb'); - myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.clot_diffuse'); - myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.clot_spec'); -} -defaultproperties -{ idleInsertFrame=0.468000 EventClasses(0)="NicePack.NiceZombieClot" MoanVoice=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Talk' MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_HitPlayer' JumpSound=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Jump' DetachedArmClass=Class'KFChar.SeveredArmClot' DetachedLegClass=Class'KFChar.SeveredLegClot' DetachedHeadClass=Class'KFChar.SeveredHeadClot' HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Pain' DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Death' ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Challenge' ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Challenge' ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Challenge' ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Challenge' AmbientSound=Sound'KF_BaseClot.Clot_Idle1Loop' Mesh=SkeletalMesh'KF_Freaks_Trip.CLOT_Freak' Skins(0)=Combiner'KF_Specimens_Trip_T.clot_cmb' -} +// Zombie Monster for KF Invasion gametype +class NiceZombieClot extends NiceZombieClotBase; +#exec OBJ LOAD FILE=KF_Freaks_Trip.ukx +#exec OBJ LOAD FILE=KF_Specimens_Trip_T.utx +#exec OBJ LOAD FILE=MeanZedSkins.utx +function ClawDamageTarget() +{ + local vector PushDir; + local KFPawn KFP; + local float UsedMeleeDamage; + + if( MeleeDamage > 1 ) + { + UsedMeleeDamage = (MeleeDamage - (MeleeDamage * 0.05)) + (MeleeDamage * (FRand() * 0.1)); + } + else + { + UsedMeleeDamage = MeleeDamage; + } + // If zombie has latched onto us... + if ( MeleeDamageTarget( UsedMeleeDamage, PushDir)) + { + KFP = KFPawn(Controller.Target); + + PlaySound(MeleeAttackHitSound, SLOT_Interact, 2.0); + + if( !bDecapitated && KFP != none ) + { + if( KFPlayerReplicationInfo(KFP.PlayerReplicationInfo) == none || + KFP.GetVeteran().static.CanBeGrabbed(KFPlayerReplicationInfo(KFP.PlayerReplicationInfo), self)) + { + if( DisabledPawn != none ) + { + DisabledPawn.bMovementDisabled = false; + } + + KFP.DisableMovement(GrappleDuration); + DisabledPawn = KFP; + } + } + } +} +function RangedAttack(Actor A) +{ + if ( bShotAnim || Physics == PHYS_Swimming) + return; + else if ( CanAttack(A) ) + { + bShotAnim = true; + SetAnimAction('Claw'); + return; + } +} +simulated event SetAnimAction(name NewAction) +{ + local int meleeAnimIndex; + if( NewAction=='' ) + Return; + if(NewAction == 'Claw') + { + meleeAnimIndex = Rand(3); + NewAction = meleeAnims[meleeAnimIndex]; + } + ExpectingChannel = DoAnimAction(NewAction); + if( AnimNeedsWait(NewAction) ) + { + bWaitForAnim = true; + } + if( Level.NetMode!=NM_Client ) + { + AnimAction = NewAction; + bResetAnimAct = True; + ResetAnimActTime = Level.TimeSeconds+0.3; + } +} +simulated function bool AnimNeedsWait(name TestAnim) +{ + if( TestAnim == 'KnockDown' || TestAnim == 'DoorBash' ) + { + return true; + } + return false; +} +simulated function int DoAnimAction( name AnimName ) +{ + if( AnimName=='ClotGrapple' || AnimName=='ClotGrappleTwo' || AnimName=='ClotGrappleThree' ) + { + AnimBlendParams(1, 1.0, 0.1,, FireRootBone); + PlayAnim(AnimName,, 0.1, 1); + + // Randomly send out a message about Clot grabbing you(10% chance) + if ( FRand() < 0.10 && LookTarget != none && KFPlayerController(LookTarget.Controller) != none && + VSizeSquared(Location - LookTarget.Location) < 2500 /* (MeleeRange + 20)^2 */ && + Level.TimeSeconds - KFPlayerController(LookTarget.Controller).LastClotGrabMessageTime > ClotGrabMessageDelay && + KFPlayerController(LookTarget.Controller).SelectedVeterancy != class'KFVetBerserker' ) + { + PlayerController(LookTarget.Controller).Speech('AUTO', 11, ""); + KFPlayerController(LookTarget.Controller).LastClotGrabMessageTime = Level.TimeSeconds; + } + + bGrappling = true; + GrappleEndTime = Level.TimeSeconds + GrappleDuration; + + return 1; + } + return super.DoAnimAction( AnimName ); +} +simulated function Tick(float DeltaTime) +{ + super.Tick(DeltaTime); + if( bShotAnim && Role == ROLE_Authority ) + { + if( LookTarget!=none ) + { + Acceleration = AccelRate * Normal(LookTarget.Location - Location); + } + } + if( Role == ROLE_Authority && bGrappling ) + { + if( Level.TimeSeconds > GrappleEndTime ) + { + bGrappling = false; + } + } + // if we move out of melee range, stop doing the grapple animation + if( bGrappling && LookTarget != none ) + { + if( VSize(LookTarget.Location - Location) > MeleeRange + CollisionRadius + LookTarget.CollisionRadius ) + { + bGrappling = false; + AnimEnd(1); + } + } +} +function RemoveHead() +{ + Super.RemoveHead(); + MeleeAnims[0] = 'Claw'; + MeleeAnims[1] = 'Claw'; + MeleeAnims[2] = 'Claw2'; + MeleeDamage *= 2; + MeleeRange *= 2; + if( DisabledPawn != none ) + { + DisabledPawn.bMovementDisabled = false; + DisabledPawn = none; + } +} +function Died(Controller Killer, class damageType, vector HitLocation) +{ + if( DisabledPawn != none ) + { + DisabledPawn.bMovementDisabled = false; + DisabledPawn = none; + } + super.Died(Killer, damageType, HitLocation); +} +simulated function Destroyed() +{ + super.Destroyed(); + if( DisabledPawn != none ) + { + DisabledPawn.bMovementDisabled = false; + DisabledPawn = none; + } +} +static simulated function PreCacheStaticMeshes(LevelInfo myLevel) +{//should be derived and used. + Super.PreCacheStaticMeshes(myLevel); +/* + myLevel.AddPrecacheStaticMesh(StaticMesh'kf_gore_trip_sm.clot.clothead_piece_1'); + myLevel.AddPrecacheStaticMesh(StaticMesh'kf_gore_trip_sm.clot.clothead_piece_2'); + myLevel.AddPrecacheStaticMesh(StaticMesh'kf_gore_trip_sm.clot.clothead_piece_3'); + myLevel.AddPrecacheStaticMesh(StaticMesh'kf_gore_trip_sm.clot.clothead_piece_4'); + myLevel.AddPrecacheStaticMesh(StaticMesh'kf_gore_trip_sm.clot.clothead_piece_5'); + myLevel.AddPrecacheStaticMesh(StaticMesh'kf_gore_trip_sm.clot.clothead_piece_6'); +*/ +} +static simulated function PreCacheMaterials(LevelInfo myLevel) +{//should be derived and used. + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.clot_cmb'); + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.clot_env_cmb'); + myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.clot_diffuse'); + myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.clot_spec'); +} +defaultproperties +{ + idleInsertFrame=0.468000 + EventClasses(0)="NicePack.NiceZombieClot" + MoanVoice=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Talk' + MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_HitPlayer' + JumpSound=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Jump' + DetachedArmClass=Class'KFChar.SeveredArmClot' + DetachedLegClass=Class'KFChar.SeveredLegClot' + DetachedHeadClass=Class'KFChar.SeveredHeadClot' + HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Pain' + DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Death' + ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Challenge' + ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Challenge' + ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Challenge' + ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Challenge' + AmbientSound=Sound'KF_BaseClot.Clot_Idle1Loop' + Mesh=SkeletalMesh'KF_Freaks_Trip.CLOT_Freak' + Skins(0)=Combiner'KF_Specimens_Trip_T.clot_cmb' +} diff --git a/sources/Zeds/Nice/NiceZombieClotBase.uc b/sources/Zeds/Nice/NiceZombieClotBase.uc index 29da9fb..1b2b0ee 100644 --- a/sources/Zeds/Nice/NiceZombieClotBase.uc +++ b/sources/Zeds/Nice/NiceZombieClotBase.uc @@ -1,27 +1,72 @@ -// Zombie Monster for KF Invasion gametype -class NiceZombieClotBase extends NiceMonster - abstract; -#exec OBJ LOAD FILE=KF_Freaks_Trip.ukx -#exec OBJ LOAD FILE=KF_Specimens_Trip_T.utx -var KFPawn DisabledPawn; // The pawn that has been disabled by this zombie's grapple -var bool bGrappling; // This zombie is grappling someone -var float GrappleEndTime; // When the current grapple should be over -var() float GrappleDuration; // How long a grapple by this zombie should last -var float ClotGrabMessageDelay; // Amount of time between a player saying "I've been grabbed" message -replication -{ - reliable if(bNetDirty && Role == ROLE_Authority) bGrappling; -} -function BreakGrapple() -{ - if( DisabledPawn != none ) - { DisabledPawn.bMovementDisabled = false; DisabledPawn = none; - } -} -//------------------------------------------------------------------------------- -// NOTE: All Code resides in the child class(this class was only created to -// eliminate hitching caused by loading default properties during play) -//------------------------------------------------------------------------------- -defaultproperties -{ GrappleDuration=1.500000 ClotGrabMessageDelay=12.000000 fuelRatio=0.900000 clientHeadshotScale=1.500000 MeleeAnims(0)="ClotGrapple" MeleeAnims(1)="ClotGrappleTwo" MeleeAnims(2)="ClotGrappleThree" bCannibal=True MeleeDamage=6 damageForce=5000 KFRagdollName="Clot_Trip" CrispUpThreshhold=9 PuntAnim="ClotPunt" AdditionalWalkAnims(0)="ClotWalk2" Intelligence=BRAINS_Mammal bUseExtendedCollision=True ColOffset=(Z=48.000000) ColRadius=25.000000 ColHeight=5.000000 ExtCollAttachBoneName="Collision_Attach" SeveredArmAttachScale=0.800000 SeveredLegAttachScale=0.800000 SeveredHeadAttachScale=0.800000 OnlineHeadshotOffset=(X=20.000000,Z=37.000000) OnlineHeadshotScale=1.300000 MotionDetectorThreat=0.340000 ScoringValue=7 MeleeRange=20.000000 GroundSpeed=105.000000 WaterSpeed=105.000000 JumpZ=340.000000 HealthMax=130.000000 Health=130 MenuName="Nice Clot" MovementAnims(0)="ClotWalk" WalkAnims(0)="ClotWalk" WalkAnims(1)="ClotWalk" WalkAnims(2)="ClotWalk" WalkAnims(3)="ClotWalk" DrawScale=1.100000 PrePivot=(Z=5.000000) RotationRate=(Yaw=45000,Roll=0) -} +// Zombie Monster for KF Invasion gametype +class NiceZombieClotBase extends NiceMonster + abstract; +#exec OBJ LOAD FILE=KF_Freaks_Trip.ukx +#exec OBJ LOAD FILE=KF_Specimens_Trip_T.utx +var KFPawn DisabledPawn; // The pawn that has been disabled by this zombie's grapple +var bool bGrappling; // This zombie is grappling someone +var float GrappleEndTime; // When the current grapple should be over +var() float GrappleDuration; // How long a grapple by this zombie should last +var float ClotGrabMessageDelay; // Amount of time between a player saying "I've been grabbed" message +replication +{ + reliable if(bNetDirty && Role == ROLE_Authority) + bGrappling; +} +function BreakGrapple() +{ + if( DisabledPawn != none ) + { + DisabledPawn.bMovementDisabled = false; + DisabledPawn = none; + } +} +//------------------------------------------------------------------------------- +// NOTE: All Code resides in the child class(this class was only created to +// eliminate hitching caused by loading default properties during play) +//------------------------------------------------------------------------------- +defaultproperties +{ + GrappleDuration=1.500000 + ClotGrabMessageDelay=12.000000 + fuelRatio=0.900000 + clientHeadshotScale=1.500000 + MeleeAnims(0)="ClotGrapple" + MeleeAnims(1)="ClotGrappleTwo" + MeleeAnims(2)="ClotGrappleThree" + bCannibal=True + MeleeDamage=6 + damageForce=5000 + KFRagdollName="Clot_Trip" + CrispUpThreshhold=9 + PuntAnim="ClotPunt" + AdditionalWalkAnims(0)="ClotWalk2" + Intelligence=BRAINS_Mammal + bUseExtendedCollision=True + ColOffset=(Z=48.000000) + ColRadius=25.000000 + ColHeight=5.000000 + ExtCollAttachBoneName="Collision_Attach" + SeveredArmAttachScale=0.800000 + SeveredLegAttachScale=0.800000 + SeveredHeadAttachScale=0.800000 + OnlineHeadshotOffset=(X=20.000000,Z=37.000000) + OnlineHeadshotScale=1.300000 + MotionDetectorThreat=0.340000 + ScoringValue=7 + MeleeRange=20.000000 + GroundSpeed=105.000000 + WaterSpeed=105.000000 + JumpZ=340.000000 + HealthMax=130.000000 + Health=130 + MenuName="Nice Clot" + MovementAnims(0)="ClotWalk" + WalkAnims(0)="ClotWalk" + WalkAnims(1)="ClotWalk" + WalkAnims(2)="ClotWalk" + WalkAnims(3)="ClotWalk" + DrawScale=1.100000 + PrePivot=(Z=5.000000) + RotationRate=(Yaw=45000,Roll=0) +} diff --git a/sources/Zeds/Nice/NiceZombieCrawler.uc b/sources/Zeds/Nice/NiceZombieCrawler.uc index c37f0c3..1a14b2e 100644 --- a/sources/Zeds/Nice/NiceZombieCrawler.uc +++ b/sources/Zeds/Nice/NiceZombieCrawler.uc @@ -1,90 +1,143 @@ -// Zombie Monster for KF Invasion gametype -class NiceZombieCrawler extends NiceZombieCrawlerBase; -//---------------------------------------------------------------------------- -// NOTE: All Variables are declared in the base class to eliminate hitching -//---------------------------------------------------------------------------- -function bool DoPounce() -{ - if (bZapped || bIsCrouched || bWantsToCrouch || (Physics != PHYS_Walking) || VSize(Location - Controller.Target.Location) > (MeleeRange * 5)) return false; - Velocity = Normal(Controller.Target.Location-Location)*PounceSpeed; - Velocity.Z = JumpZ; - SetPhysics(PHYS_Falling); - ZombieSpringAnim(); - bPouncing=true; - return true; -} -function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Momentum, class DamType, optional int HitIndex) -{ - local int OldHeadHealth; - OldHeadHealth = HeadHealth; - Super(NiceMonster).TakeDamage(Damage, instigatedBy, hitLocation, momentum, DamType); - // If crawler's head was damaged, but not yet removed -- I say kill the goddamn thing - if(HeadHealth < OldHeadHealth && HeadHealth > 0) RemoveHead(); -} -simulated function ZombieSpringAnim() -{ - SetAnimAction('ZombieSpring'); -} -event Landed(vector HitNormal) -{ - bPouncing=false; - super.Landed(HitNormal); -} -event Bump(actor Other) -{ - // TODO: is there a better way - if(bPouncing && KFHumanPawn(Other)!=none ) - { KFHumanPawn(Other).TakeDamage(((MeleeDamage - (MeleeDamage * 0.05)) + (MeleeDamage * (FRand() * 0.1))), self ,self.Location,self.velocity, class 'NicePack.NiceZedMeleeDamageType'); if (KFHumanPawn(Other).Health <=0) { //TODO - move this to humanpawn.takedamage? Also see KFMonster.MeleeDamageTarget KFHumanPawn(Other).SpawnGibs(self.rotation, 1); } //After impact, there'll be no momentum for further bumps bPouncing=false; - } -} -// Blend his attacks so he can hit you in mid air. -simulated function int DoAnimAction( name AnimName ) -{ - if( AnimName=='InAir_Attack1' || AnimName=='InAir_Attack2' ) - { AnimBlendParams(1, 1.0, 0.0,, FireRootBone); PlayAnim(AnimName,, 0.0, 1); return 1; - } - if( AnimName=='HitF' ) - { AnimBlendParams(1, 1.0, 0.0,, NeckBone); PlayAnim(AnimName,, 0.0, 1); return 1; - } - if( AnimName=='ZombieSpring' ) - { PlayAnim(AnimName,,0.02); return 0; - } - return Super.DoAnimAction(AnimName); -} -simulated event SetAnimAction(name NewAction) -{ - local int meleeAnimIndex; - if( NewAction=='' ) Return; - if(NewAction == 'Claw') - { meleeAnimIndex = Rand(2); if( Physics == PHYS_Falling ) { NewAction = MeleeAirAnims[meleeAnimIndex]; } else { NewAction = meleeAnims[meleeAnimIndex]; } - } - ExpectingChannel = DoAnimAction(NewAction); - if( AnimNeedsWait(NewAction) ) - { bWaitForAnim = true; - } - if( Level.NetMode!=NM_Client ) - { AnimAction = NewAction; bResetAnimAct = True; ResetAnimActTime = Level.TimeSeconds+0.3; - } -} -// The animation is full body and should set the bWaitForAnim flag -simulated function bool AnimNeedsWait(name TestAnim) -{ - if( TestAnim == 'ZombieSpring' || TestAnim == 'DoorBash' ) - { return true; - } - return false; -} -function bool FlipOver() -{ - return true; -} - -static simulated function PreCacheMaterials(LevelInfo myLevel) -{//should be derived and used. - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.crawler_cmb'); - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.crawler_env_cmb'); - myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.crawler_diff'); -} -defaultproperties -{ stunLoopStart=0.110000 stunLoopEnd=0.570000 idleInsertFrame=0.900000 EventClasses(0)="NicePack.NiceZombieCrawler" MoanVoice=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_Talk' MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_HitPlayer' JumpSound=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_Jump' DetachedArmClass=Class'KFChar.SeveredArmCrawler' DetachedLegClass=Class'KFChar.SeveredLegCrawler' DetachedHeadClass=Class'KFChar.SeveredHeadCrawler' HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_Pain' DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_Death' ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_Acquire' ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_Acquire' ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_Acquire' ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_Acquire' ControllerClass=Class'NicePack.NiceZombieCrawlerController' AmbientSound=Sound'KF_BaseCrawler.Crawler_Idle' Mesh=SkeletalMesh'KF_Freaks_Trip.Crawler_Freak' Skins(0)=Combiner'KF_Specimens_Trip_T.crawler_cmb' -} +// Zombie Monster for KF Invasion gametype +class NiceZombieCrawler extends NiceZombieCrawlerBase; +//---------------------------------------------------------------------------- +// NOTE: All Variables are declared in the base class to eliminate hitching +//---------------------------------------------------------------------------- +function bool DoPounce() +{ + if (bZapped || bIsCrouched || bWantsToCrouch || (Physics != PHYS_Walking) || VSize(Location - Controller.Target.Location) > (MeleeRange * 5)) + return false; + Velocity = Normal(Controller.Target.Location-Location)*PounceSpeed; + Velocity.Z = JumpZ; + SetPhysics(PHYS_Falling); + ZombieSpringAnim(); + bPouncing=true; + return true; +} +function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Momentum, class DamType, optional int HitIndex) +{ + local int OldHeadHealth; + OldHeadHealth = HeadHealth; + Super(NiceMonster).TakeDamage(Damage, instigatedBy, hitLocation, momentum, DamType); + // If crawler's head was damaged, but not yet removed -- I say kill the goddamn thing + if(HeadHealth < OldHeadHealth && HeadHealth > 0) + RemoveHead(); +} +simulated function ZombieSpringAnim() +{ + SetAnimAction('ZombieSpring'); +} +event Landed(vector HitNormal) +{ + bPouncing=false; + super.Landed(HitNormal); +} +event Bump(actor Other) +{ + // TODO: is there a better way + if(bPouncing && KFHumanPawn(Other)!=none ) + { + KFHumanPawn(Other).TakeDamage(((MeleeDamage - (MeleeDamage * 0.05)) + (MeleeDamage * (FRand() * 0.1))), self ,self.Location,self.velocity, class 'NicePack.NiceZedMeleeDamageType'); + if (KFHumanPawn(Other).Health <=0) + { + //TODO - move this to humanpawn.takedamage? Also see KFMonster.MeleeDamageTarget + KFHumanPawn(Other).SpawnGibs(self.rotation, 1); + } + //After impact, there'll be no momentum for further bumps + bPouncing=false; + } +} +// Blend his attacks so he can hit you in mid air. +simulated function int DoAnimAction( name AnimName ) +{ + if( AnimName=='InAir_Attack1' || AnimName=='InAir_Attack2' ) + { + AnimBlendParams(1, 1.0, 0.0,, FireRootBone); + PlayAnim(AnimName,, 0.0, 1); + return 1; + } + if( AnimName=='HitF' ) + { + AnimBlendParams(1, 1.0, 0.0,, NeckBone); + PlayAnim(AnimName,, 0.0, 1); + return 1; + } + if( AnimName=='ZombieSpring' ) + { + PlayAnim(AnimName,,0.02); + return 0; + } + return Super.DoAnimAction(AnimName); +} +simulated event SetAnimAction(name NewAction) +{ + local int meleeAnimIndex; + if( NewAction=='' ) + Return; + if(NewAction == 'Claw') + { + meleeAnimIndex = Rand(2); + if( Physics == PHYS_Falling ) + { + NewAction = MeleeAirAnims[meleeAnimIndex]; + } + else + { + NewAction = meleeAnims[meleeAnimIndex]; + } + } + ExpectingChannel = DoAnimAction(NewAction); + if( AnimNeedsWait(NewAction) ) + { + bWaitForAnim = true; + } + if( Level.NetMode!=NM_Client ) + { + AnimAction = NewAction; + bResetAnimAct = True; + ResetAnimActTime = Level.TimeSeconds+0.3; + } +} +// The animation is full body and should set the bWaitForAnim flag +simulated function bool AnimNeedsWait(name TestAnim) +{ + if( TestAnim == 'ZombieSpring' || TestAnim == 'DoorBash' ) + { + return true; + } + return false; +} +function bool FlipOver() +{ + return true; +} + +static simulated function PreCacheMaterials(LevelInfo myLevel) +{//should be derived and used. + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.crawler_cmb'); + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.crawler_env_cmb'); + myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.crawler_diff'); +} +defaultproperties +{ + stunLoopStart=0.110000 + stunLoopEnd=0.570000 + idleInsertFrame=0.900000 + EventClasses(0)="NicePack.NiceZombieCrawler" + MoanVoice=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_Talk' + MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_HitPlayer' + JumpSound=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_Jump' + DetachedArmClass=Class'KFChar.SeveredArmCrawler' + DetachedLegClass=Class'KFChar.SeveredLegCrawler' + DetachedHeadClass=Class'KFChar.SeveredHeadCrawler' + HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_Pain' + DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_Death' + ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_Acquire' + ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_Acquire' + ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_Acquire' + ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd.Crawler.Crawler_Acquire' + ControllerClass=Class'NicePack.NiceZombieCrawlerController' + AmbientSound=Sound'KF_BaseCrawler.Crawler_Idle' + Mesh=SkeletalMesh'KF_Freaks_Trip.Crawler_Freak' + Skins(0)=Combiner'KF_Specimens_Trip_T.crawler_cmb' +} diff --git a/sources/Zeds/Nice/NiceZombieCrawlerBase.uc b/sources/Zeds/Nice/NiceZombieCrawlerBase.uc index b3b7d8f..12511f8 100644 --- a/sources/Zeds/Nice/NiceZombieCrawlerBase.uc +++ b/sources/Zeds/Nice/NiceZombieCrawlerBase.uc @@ -1,77 +1,176 @@ -// Zombie Monster for KF Invasion gametype -class NiceZombieCrawlerBase extends NiceMonster - abstract; -#exec OBJ LOAD FILE= -var() float PounceSpeed; -var bool bPouncing; -var(Anims) name MeleeAirAnims[3]; // Attack anims for when flying through the air -//------------------------------------------------------------------------------- -// NOTE: All Code resides in the child class(this class was only created to -// eliminate hitching caused by loading default properties during play) -//------------------------------------------------------------------------------- -function bool DoPounce() -{ - if ( bZapped || bIsCrouched || bWantsToCrouch || (Physics != PHYS_Walking) || VSize(Location - Controller.Target.Location) > (MeleeRange * 5) ) return false; - Velocity = Normal(Controller.Target.Location-Location)*PounceSpeed; - Velocity.Z = JumpZ; - SetPhysics(PHYS_Falling); - ZombieSpringAnim(); - bPouncing=true; - return true; -} -simulated function ZombieSpringAnim() -{ - SetAnimAction('ZombieSpring'); -} -event Landed(vector HitNormal) -{ - bPouncing=false; - super.Landed(HitNormal); -} -event Bump(actor Other) -{ - // TODO: is there a better way - if(bPouncing && KFHumanPawn(Other)!=none ) - { KFHumanPawn(Other).TakeDamage(((MeleeDamage - (MeleeDamage * 0.05)) + (MeleeDamage * (FRand() * 0.1))), self ,self.Location,self.velocity, class 'NicePack.NiceZedMeleeDamageType'); if (KFHumanPawn(Other).Health <=0) { //TODO - move this to humanpawn.takedamage? Also see KFMonster.MeleeDamageTarget KFHumanPawn(Other).SpawnGibs(self.rotation, 1); } //After impact, there'll be no momentum for further bumps bPouncing=false; - } -} -// Blend his attacks so he can hit you in mid air. -simulated function int DoAnimAction( name AnimName ) -{ - if( AnimName=='InAir_Attack1' || AnimName=='InAir_Attack2' ) - { AnimBlendParams(1, 1.0, 0.0,, FireRootBone); PlayAnim(AnimName,, 0.0, 1); return 1; - } - if( AnimName=='HitF' ) - { AnimBlendParams(1, 1.0, 0.0,, NeckBone); PlayAnim(AnimName,, 0.0, 1); return 1; - } - if( AnimName=='ZombieSpring' ) - { PlayAnim(AnimName,,0.02); return 0; - } - return Super.DoAnimAction(AnimName); -} -simulated event SetAnimAction(name NewAction) -{ - local int meleeAnimIndex; - if( NewAction=='' ) Return; - if(NewAction == 'Claw') - { meleeAnimIndex = Rand(2); if( Physics == PHYS_Falling ) { NewAction = MeleeAirAnims[meleeAnimIndex]; } else { NewAction = meleeAnims[meleeAnimIndex]; } - } - ExpectingChannel = DoAnimAction(NewAction); - if( AnimNeedsWait(NewAction) ) - { bWaitForAnim = true; - } - if( Level.NetMode!=NM_Client ) - { AnimAction = NewAction; bResetAnimAct = True; ResetAnimActTime = Level.TimeSeconds+0.3; - } -} -// The animation is full body and should set the bWaitForAnim flag -simulated function bool AnimNeedsWait(name TestAnim) -{ - if( TestAnim == 'ZombieSpring' || TestAnim == 'DoorBash' ) - { return true; - } - return false; -} -defaultproperties -{ PounceSpeed=330.000000 MeleeAirAnims(0)="InAir_Attack1" MeleeAirAnims(1)="InAir_Attack2" StunThreshold=2.000000 fuelRatio=0.800000 bWeakHead=True clientHeadshotScale=1.350000 MeleeAnims(0)="ZombieLeapAttack" MeleeAnims(1)="ZombieLeapAttack2" HitAnims(1)="HitF" HitAnims(2)="HitF" KFHitFront="HitF" KFHitBack="HitF" KFHitLeft="HitF" KFHitRight="HitF" bStunImmune=True bCannibal=True ZombieFlag=2 MeleeDamage=6 damageForce=5000 KFRagdollName="Crawler_Trip" CrispUpThreshhold=10 Intelligence=BRAINS_Mammal SeveredArmAttachScale=0.800000 SeveredLegAttachScale=0.850000 SeveredHeadAttachScale=1.100000 OnlineHeadshotOffset=(X=28.000000,Z=7.000000) OnlineHeadshotScale=1.200000 MotionDetectorThreat=0.340000 ScoringValue=10 IdleHeavyAnim="ZombieLeapIdle" IdleRifleAnim="ZombieLeapIdle" bCrawler=True GroundSpeed=140.000000 WaterSpeed=130.000000 JumpZ=350.000000 HealthMax=70.000000 Health=70 HeadHeight=2.500000 HeadScale=1.050000 MenuName="Nice Crawler" bDoTorsoTwist=False MovementAnims(0)="ZombieScuttle" MovementAnims(1)="ZombieScuttleB" MovementAnims(2)="ZombieScuttleL" MovementAnims(3)="ZombieScuttleR" WalkAnims(0)="ZombieScuttle" WalkAnims(1)="ZombieScuttleB" WalkAnims(2)="ZombieScuttleL" WalkAnims(3)="ZombieScuttleR" AirAnims(0)="ZombieSpring" AirAnims(1)="ZombieSpring" AirAnims(2)="ZombieSpring" AirAnims(3)="ZombieSpring" TakeoffAnims(0)="ZombieSpring" TakeoffAnims(1)="ZombieSpring" TakeoffAnims(2)="ZombieSpring" TakeoffAnims(3)="ZombieSpring" AirStillAnim="ZombieSpring" TakeoffStillAnim="ZombieLeapIdle" IdleCrouchAnim="ZombieLeapIdle" IdleWeaponAnim="ZombieLeapIdle" IdleRestAnim="ZombieLeapIdle" bOrientOnSlope=True DrawScale=1.100000 PrePivot=(Z=0.000000) CollisionHeight=25.000000 -} +// Zombie Monster for KF Invasion gametype +class NiceZombieCrawlerBase extends NiceMonster + abstract; +#exec OBJ LOAD FILE= +var() float PounceSpeed; +var bool bPouncing; +var(Anims) name MeleeAirAnims[3]; // Attack anims for when flying through the air +//------------------------------------------------------------------------------- +// NOTE: All Code resides in the child class(this class was only created to +// eliminate hitching caused by loading default properties during play) +//------------------------------------------------------------------------------- +function bool DoPounce() +{ + if ( bZapped || bIsCrouched || bWantsToCrouch || (Physics != PHYS_Walking) || VSize(Location - Controller.Target.Location) > (MeleeRange * 5) ) + return false; + Velocity = Normal(Controller.Target.Location-Location)*PounceSpeed; + Velocity.Z = JumpZ; + SetPhysics(PHYS_Falling); + ZombieSpringAnim(); + bPouncing=true; + return true; +} +simulated function ZombieSpringAnim() +{ + SetAnimAction('ZombieSpring'); +} +event Landed(vector HitNormal) +{ + bPouncing=false; + super.Landed(HitNormal); +} +event Bump(actor Other) +{ + // TODO: is there a better way + if(bPouncing && KFHumanPawn(Other)!=none ) + { + KFHumanPawn(Other).TakeDamage(((MeleeDamage - (MeleeDamage * 0.05)) + (MeleeDamage * (FRand() * 0.1))), self ,self.Location,self.velocity, class 'NicePack.NiceZedMeleeDamageType'); + if (KFHumanPawn(Other).Health <=0) + { + //TODO - move this to humanpawn.takedamage? Also see KFMonster.MeleeDamageTarget + KFHumanPawn(Other).SpawnGibs(self.rotation, 1); + } + //After impact, there'll be no momentum for further bumps + bPouncing=false; + } +} +// Blend his attacks so he can hit you in mid air. +simulated function int DoAnimAction( name AnimName ) +{ + if( AnimName=='InAir_Attack1' || AnimName=='InAir_Attack2' ) + { + AnimBlendParams(1, 1.0, 0.0,, FireRootBone); + PlayAnim(AnimName,, 0.0, 1); + return 1; + } + if( AnimName=='HitF' ) + { + AnimBlendParams(1, 1.0, 0.0,, NeckBone); + PlayAnim(AnimName,, 0.0, 1); + return 1; + } + if( AnimName=='ZombieSpring' ) + { + PlayAnim(AnimName,,0.02); + return 0; + } + return Super.DoAnimAction(AnimName); +} +simulated event SetAnimAction(name NewAction) +{ + local int meleeAnimIndex; + if( NewAction=='' ) + Return; + if(NewAction == 'Claw') + { + meleeAnimIndex = Rand(2); + if( Physics == PHYS_Falling ) + { + NewAction = MeleeAirAnims[meleeAnimIndex]; + } + else + { + NewAction = meleeAnims[meleeAnimIndex]; + } + } + ExpectingChannel = DoAnimAction(NewAction); + if( AnimNeedsWait(NewAction) ) + { + bWaitForAnim = true; + } + if( Level.NetMode!=NM_Client ) + { + AnimAction = NewAction; + bResetAnimAct = True; + ResetAnimActTime = Level.TimeSeconds+0.3; + } +} +// The animation is full body and should set the bWaitForAnim flag +simulated function bool AnimNeedsWait(name TestAnim) +{ + if( TestAnim == 'ZombieSpring' || TestAnim == 'DoorBash' ) + { + return true; + } + return false; +} +defaultproperties +{ + PounceSpeed=330.000000 + MeleeAirAnims(0)="InAir_Attack1" + MeleeAirAnims(1)="InAir_Attack2" + StunThreshold=2.000000 + fuelRatio=0.800000 + bWeakHead=True + clientHeadshotScale=1.350000 + MeleeAnims(0)="ZombieLeapAttack" + MeleeAnims(1)="ZombieLeapAttack2" + HitAnims(1)="HitF" + HitAnims(2)="HitF" + KFHitFront="HitF" + KFHitBack="HitF" + KFHitLeft="HitF" + KFHitRight="HitF" + bStunImmune=True + bCannibal=True + ZombieFlag=2 + MeleeDamage=6 + damageForce=5000 + KFRagdollName="Crawler_Trip" + CrispUpThreshhold=10 + Intelligence=BRAINS_Mammal + SeveredArmAttachScale=0.800000 + SeveredLegAttachScale=0.850000 + SeveredHeadAttachScale=1.100000 + OnlineHeadshotOffset=(X=28.000000,Z=7.000000) + OnlineHeadshotScale=1.200000 + MotionDetectorThreat=0.340000 + ScoringValue=10 + IdleHeavyAnim="ZombieLeapIdle" + IdleRifleAnim="ZombieLeapIdle" + bCrawler=True + GroundSpeed=140.000000 + WaterSpeed=130.000000 + JumpZ=350.000000 + HealthMax=70.000000 + Health=70 + HeadHeight=2.500000 + HeadScale=1.050000 + MenuName="Nice Crawler" + bDoTorsoTwist=False + MovementAnims(0)="ZombieScuttle" + MovementAnims(1)="ZombieScuttleB" + MovementAnims(2)="ZombieScuttleL" + MovementAnims(3)="ZombieScuttleR" + WalkAnims(0)="ZombieScuttle" + WalkAnims(1)="ZombieScuttleB" + WalkAnims(2)="ZombieScuttleL" + WalkAnims(3)="ZombieScuttleR" + AirAnims(0)="ZombieSpring" + AirAnims(1)="ZombieSpring" + AirAnims(2)="ZombieSpring" + AirAnims(3)="ZombieSpring" + TakeoffAnims(0)="ZombieSpring" + TakeoffAnims(1)="ZombieSpring" + TakeoffAnims(2)="ZombieSpring" + TakeoffAnims(3)="ZombieSpring" + AirStillAnim="ZombieSpring" + TakeoffStillAnim="ZombieLeapIdle" + IdleCrouchAnim="ZombieLeapIdle" + IdleWeaponAnim="ZombieLeapIdle" + IdleRestAnim="ZombieLeapIdle" + bOrientOnSlope=True + DrawScale=1.100000 + PrePivot=(Z=0.000000) + CollisionHeight=25.000000 +} diff --git a/sources/Zeds/Nice/NiceZombieCrawlerController.uc b/sources/Zeds/Nice/NiceZombieCrawlerController.uc index f55ecb3..ba5eb7e 100644 --- a/sources/Zeds/Nice/NiceZombieCrawlerController.uc +++ b/sources/Zeds/Nice/NiceZombieCrawlerController.uc @@ -1,59 +1,94 @@ -class NiceZombieCrawlerController extends NiceMonsterController; -var float LastPounceTime; -var bool bDoneSpottedCheck; -state ZombieHunt -{ - event SeePlayer(Pawn SeenPlayer) - { if ( !bDoneSpottedCheck && PlayerController(SeenPlayer.Controller) != none ) { // 25% chance of first player to see this Crawler saying something if ( !KFGameType(Level.Game).bDidSpottedCrawlerMessage && FRand() < 0.25 ) { PlayerController(SeenPlayer.Controller).Speech('AUTO', 18, ""); KFGameType(Level.Game).bDidSpottedCrawlerMessage = true; } - bDoneSpottedCheck = true; } - super.SeePlayer(SeenPlayer); - } -} -function bool IsInPounceDist(actor PTarget) -{ - local vector DistVec; - local float time; - local float HeightMoved; - local float EndHeight; - //work out time needed to reach target - DistVec = pawn.location - PTarget.location; - DistVec.Z=0; - time = vsize(DistVec)/NiceZombieCrawler(pawn).PounceSpeed; - // vertical change in that time - //assumes downward grav only - HeightMoved = Pawn.JumpZ*time + 0.5*pawn.PhysicsVolume.Gravity.z*time*time; - EndHeight = pawn.Location.z +HeightMoved; - //log(Vsize(Pawn.Location - PTarget.Location)); - - if((abs(EndHeight - PTarget.Location.Z) < Pawn.CollisionHeight + PTarget.CollisionHeight) && - VSize(pawn.Location - PTarget.Location) < KFMonster(pawn).MeleeRange * 5) - return true; - else - return false; -} -function bool FireWeaponAt(Actor A) -{ - local vector aFacing,aToB; - local float RelativeDir; - if ( A == none ) A = Enemy; - if ( (A == none) || (Focus != A) ) return false; - if(CanAttack(A)) - { Target = A; Monster(Pawn).RangedAttack(Target); - } - else - { //TODO - base off land time rather than launch time? if((LastPounceTime + (4.5 - (FRand() * 3.0))) < Level.TimeSeconds ) { aFacing=Normal(Vector(Pawn.Rotation)); // Get the vector from A to B aToB=A.Location-Pawn.Location; - RelativeDir = aFacing dot aToB; if ( RelativeDir > 0.85 ) { //Facing enemy if(IsInPounceDist(A) ) { if(NiceZombieCrawler(Pawn).DoPounce()==true ) LastPounceTime = Level.TimeSeconds; } } } - } - return false; -} -function bool NotifyLanded(vector HitNormal) -{ - if( NiceZombieCrawler(pawn).bPouncing ) - { // restart pathfinding from landing location GotoState('hunting'); return false; - } - else - return super.NotifyLanded(HitNormal); -} -defaultproperties -{ -} +class NiceZombieCrawlerController extends NiceMonsterController; +var float LastPounceTime; +var bool bDoneSpottedCheck; +state ZombieHunt +{ + event SeePlayer(Pawn SeenPlayer) + { + if ( !bDoneSpottedCheck && PlayerController(SeenPlayer.Controller) != none ) + { + // 25% chance of first player to see this Crawler saying something + if ( !KFGameType(Level.Game).bDidSpottedCrawlerMessage && FRand() < 0.25 ) + { + PlayerController(SeenPlayer.Controller).Speech('AUTO', 18, ""); + KFGameType(Level.Game).bDidSpottedCrawlerMessage = true; + } + + bDoneSpottedCheck = true; + } + + super.SeePlayer(SeenPlayer); + } +} +function bool IsInPounceDist(actor PTarget) +{ + local vector DistVec; + local float time; + local float HeightMoved; + local float EndHeight; + //work out time needed to reach target + DistVec = pawn.location - PTarget.location; + DistVec.Z=0; + time = vsize(DistVec)/NiceZombieCrawler(pawn).PounceSpeed; + // vertical change in that time + //assumes downward grav only + HeightMoved = Pawn.JumpZ*time + 0.5*pawn.PhysicsVolume.Gravity.z*time*time; + EndHeight = pawn.Location.z +HeightMoved; + //log(Vsize(Pawn.Location - PTarget.Location)); + + if((abs(EndHeight - PTarget.Location.Z) < Pawn.CollisionHeight + PTarget.CollisionHeight) && + VSize(pawn.Location - PTarget.Location) < KFMonster(pawn).MeleeRange * 5) + return true; + else + return false; +} +function bool FireWeaponAt(Actor A) +{ + local vector aFacing,aToB; + local float RelativeDir; + if ( A == none ) + A = Enemy; + if ( (A == none) || (Focus != A) ) + return false; + if(CanAttack(A)) + { + Target = A; + Monster(Pawn).RangedAttack(Target); + } + else + { + //TODO - base off land time rather than launch time? + if((LastPounceTime + (4.5 - (FRand() * 3.0))) < Level.TimeSeconds ) + { + aFacing=Normal(Vector(Pawn.Rotation)); + // Get the vector from A to B + aToB=A.Location-Pawn.Location; + + RelativeDir = aFacing dot aToB; + if ( RelativeDir > 0.85 ) + { + //Facing enemy + if(IsInPounceDist(A) ) + { + if(NiceZombieCrawler(Pawn).DoPounce()==true ) + LastPounceTime = Level.TimeSeconds; + } + } + } + } + return false; +} +function bool NotifyLanded(vector HitNormal) +{ + if( NiceZombieCrawler(pawn).bPouncing ) + { + // restart pathfinding from landing location + GotoState('hunting'); + return false; + } + else + return super.NotifyLanded(HitNormal); +} +defaultproperties +{ +} diff --git a/sources/Zeds/Nice/NiceZombieFleshpoundBase.uc b/sources/Zeds/Nice/NiceZombieFleshpoundBase.uc index 1b7ff47..2c7d16e 100644 --- a/sources/Zeds/Nice/NiceZombieFleshpoundBase.uc +++ b/sources/Zeds/Nice/NiceZombieFleshpoundBase.uc @@ -1,29 +1,97 @@ -// Zombie Monster for KF Invasion gametype -class NiceZombieFleshpoundBase extends NiceMonster - abstract; -var () float BlockDamageReduction; -var bool bChargingPlayer,bClientCharge; -var int TwoSecondDamageTotal; -var float LastDamagedTime,RageEndTime; -var() vector RotMag; // how far to rot view -var() vector RotRate; // how fast to rot view -var() float RotTime; // how much time to rot the instigator's view -var() vector OffsetMag; // max view offset vertically -var() vector OffsetRate; // how fast to offset view vertically -var() float OffsetTime; // how much time to offset view -var name ChargingAnim; // How he runs when charging the player. -//var ONSHeadlightCorona DeviceGlow; //KFTODO: Don't think this is needed, its not reffed anywhere -var() int RageDamageThreshold; // configurable. -var NiceAvoidMarkerFP AvoidArea; // Make the other AI fear this AI -var bool bFrustrated; // The fleshpound is tired of being kited and is pissed and ready to attack -replication -{ - reliable if(Role == ROLE_Authority) bChargingPlayer, bFrustrated; -} -//------------------------------------------------------------------------------- -// NOTE: All Code resides in the child class(this class was only created to -// eliminate hitching caused by loading default properties during play) -//------------------------------------------------------------------------------- -defaultproperties -{ BlockDamageReduction=0.400000 RotMag=(X=500.000000,Y=500.000000,Z=600.000000) RotRate=(X=12500.000000,Y=12500.000000,Z=12500.000000) RotTime=6.000000 OffsetMag=(X=5.000000,Y=10.000000,Z=5.000000) OffsetRate=(X=300.000000,Y=300.000000,Z=300.000000) OffsetTime=3.500000 ChargingAnim="PoundRun" RageDamageThreshold=360 StunThreshold=4.000000 fuelRatio=0.150000 MeleeAnims(0)="PoundAttack1" MeleeAnims(1)="PoundAttack2" MeleeAnims(2)="PoundAttack3" StunsRemaining=1 BleedOutDuration=7.000000 ZapThreshold=1.750000 ZappedDamageMod=1.250000 bHarpoonToBodyStuns=False ZombieFlag=3 MeleeDamage=35 damageForce=15000 bFatAss=True KFRagdollName="FleshPound_Trip" SpinDamConst=20.000000 SpinDamRand=20.000000 bMeleeStunImmune=True Intelligence=BRAINS_Mammal bUseExtendedCollision=True ColOffset=(Z=52.000000) ColRadius=36.000000 ColHeight=35.000000 SeveredArmAttachScale=1.300000 SeveredLegAttachScale=1.200000 SeveredHeadAttachScale=1.500000 PlayerCountHealthScale=0.250000 OnlineHeadshotOffset=(X=22.000000,Z=68.000000) OnlineHeadshotScale=1.300000 HeadHealth=700.000000 PlayerNumHeadHealthScale=0.300000 MotionDetectorThreat=5.000000 bBoss=True ScoringValue=200 IdleHeavyAnim="PoundIdle" IdleRifleAnim="PoundIdle" RagDeathUpKick=100.000000 MeleeRange=55.000000 GroundSpeed=130.000000 WaterSpeed=120.000000 HealthMax=1650.000000 Health=1650 HeadHeight=2.500000 HeadScale=1.300000 MenuName="Nice Flesh Pound" MovementAnims(0)="PoundWalk" MovementAnims(1)="WalkB" WalkAnims(0)="PoundWalk" WalkAnims(1)="WalkB" WalkAnims(2)="RunL" WalkAnims(3)="RunR" IdleCrouchAnim="PoundIdle" IdleWeaponAnim="PoundIdle" IdleRestAnim="PoundIdle" PrePivot=(Z=0.000000) Skins(1)=Shader'KFCharacters.FPAmberBloomShader' Mass=600.000000 RotationRate=(Yaw=45000,Roll=0) -} +// Zombie Monster for KF Invasion gametype +class NiceZombieFleshpoundBase extends NiceMonster + abstract; +var () float BlockDamageReduction; +var bool bChargingPlayer,bClientCharge; +var int TwoSecondDamageTotal; +var float LastDamagedTime,RageEndTime; +var() vector RotMag; // how far to rot view +var() vector RotRate; // how fast to rot view +var() float RotTime; // how much time to rot the instigator's view +var() vector OffsetMag; // max view offset vertically +var() vector OffsetRate; // how fast to offset view vertically +var() float OffsetTime; // how much time to offset view +var name ChargingAnim; // How he runs when charging the player. +//var ONSHeadlightCorona DeviceGlow; //KFTODO: Don't think this is needed, its not reffed anywhere +var() int RageDamageThreshold; // configurable. +var NiceAvoidMarkerFP AvoidArea; // Make the other AI fear this AI +var bool bFrustrated; // The fleshpound is tired of being kited and is pissed and ready to attack +replication +{ + reliable if(Role == ROLE_Authority) + bChargingPlayer, bFrustrated; +} +//------------------------------------------------------------------------------- +// NOTE: All Code resides in the child class(this class was only created to +// eliminate hitching caused by loading default properties during play) +//------------------------------------------------------------------------------- +defaultproperties +{ + BlockDamageReduction=0.400000 + RotMag=(X=500.000000,Y=500.000000,Z=600.000000) + RotRate=(X=12500.000000,Y=12500.000000,Z=12500.000000) + RotTime=6.000000 + OffsetMag=(X=5.000000,Y=10.000000,Z=5.000000) + OffsetRate=(X=300.000000,Y=300.000000,Z=300.000000) + OffsetTime=3.500000 + ChargingAnim="PoundRun" + RageDamageThreshold=360 + StunThreshold=4.000000 + fuelRatio=0.150000 + MeleeAnims(0)="PoundAttack1" + MeleeAnims(1)="PoundAttack2" + MeleeAnims(2)="PoundAttack3" + StunsRemaining=1 + BleedOutDuration=7.000000 + ZapThreshold=1.750000 + ZappedDamageMod=1.250000 + bHarpoonToBodyStuns=False + ZombieFlag=3 + MeleeDamage=35 + damageForce=15000 + bFatAss=True + KFRagdollName="FleshPound_Trip" + SpinDamConst=20.000000 + SpinDamRand=20.000000 + bMeleeStunImmune=True + Intelligence=BRAINS_Mammal + bUseExtendedCollision=True + ColOffset=(Z=52.000000) + ColRadius=36.000000 + ColHeight=35.000000 + SeveredArmAttachScale=1.300000 + SeveredLegAttachScale=1.200000 + SeveredHeadAttachScale=1.500000 + PlayerCountHealthScale=0.250000 + OnlineHeadshotOffset=(X=22.000000,Z=68.000000) + OnlineHeadshotScale=1.300000 + HeadHealth=700.000000 + PlayerNumHeadHealthScale=0.300000 + MotionDetectorThreat=5.000000 + bBoss=True + ScoringValue=200 + IdleHeavyAnim="PoundIdle" + IdleRifleAnim="PoundIdle" + RagDeathUpKick=100.000000 + MeleeRange=55.000000 + GroundSpeed=130.000000 + WaterSpeed=120.000000 + HealthMax=1650.000000 + Health=1650 + HeadHeight=2.500000 + HeadScale=1.300000 + MenuName="Nice Flesh Pound" + MovementAnims(0)="PoundWalk" + MovementAnims(1)="WalkB" + WalkAnims(0)="PoundWalk" + WalkAnims(1)="WalkB" + WalkAnims(2)="RunL" + WalkAnims(3)="RunR" + IdleCrouchAnim="PoundIdle" + IdleWeaponAnim="PoundIdle" + IdleRestAnim="PoundIdle" + PrePivot=(Z=0.000000) + Skins(1)=Shader'KFCharacters.FPAmberBloomShader' + Mass=600.000000 + RotationRate=(Yaw=45000,Roll=0) +} diff --git a/sources/Zeds/Nice/NiceZombieFleshpoundController.uc b/sources/Zeds/Nice/NiceZombieFleshpoundController.uc index 7ca2007..1037808 100644 --- a/sources/Zeds/Nice/NiceZombieFleshpoundController.uc +++ b/sources/Zeds/Nice/NiceZombieFleshpoundController.uc @@ -1,116 +1,197 @@ -class NiceZombieFleshpoundController extends NiceMonsterController; -var float RageAnimTimeout; // How long until the RageAnim is completed; Hack so the server doesn't get stuck in idle when its doing the Rage anim -var bool bDoneSpottedCheck; -var float RageFrustrationTimer; // Tracks how long we have been walking toward a visible enemy -var float RageFrustrationThreshhold; // Base value for how long the FP should walk torward an enemy without reaching them before getting frustrated and raging -simulated function PostBeginPlay(){ - super.PostBeginPlay(); - RageFrustrationTimer = 0; -} -function Tick(float Delta){ - local bool bSeesPlayers; - local Controller PC; - local KFHumanPawn Human; - local NiceZombieFleshPound ZFP; - super.Tick(Delta); - bSeesPlayers = false; - for(PC = Level.ControllerList;PC != none;PC = PC.NextController){ Human = KFHumanPawn(PC.Pawn); if(Human != none && Human.Health > 0 && !Human.bPendingDelete && CanSee(Human)){ bSeesPlayers = true; break; } - } - if(bSeesPlayers){ if(RageFrustrationTimer < RageFrustrationThreshhold){ RageFrustrationTimer += Delta; if(RageFrustrationTimer >= RageFrustrationThreshhold){ ZFP = NiceZombieFleshPound(Pawn); if(ZFP != none && !ZFP.bChargingPlayer){ ZFP.StartChargingFP(Pawn(focus)); ZFP.bFrustrated = true; } } } - } - else RageFrustrationTimer = 0; -} -// Never do that, you too cool -function GetOutOfTheWayOfShot(vector ShotDirection, vector ShotOrigin){} -state ZombieHunt -{ - event SeePlayer(Pawn SeenPlayer) - { if ( !bDoneSpottedCheck && PlayerController(SeenPlayer.Controller) != none ) { // 25% chance of first player to see this Fleshpound saying something if ( !KFGameType(Level.Game).bDidSpottedFleshpoundMessage && FRand() < 0.25 ) { PlayerController(SeenPlayer.Controller).Speech('AUTO', 12, ""); KFGameType(Level.Game).bDidSpottedFleshpoundMessage = true; } - bDoneSpottedCheck = true; } - super.SeePlayer(SeenPlayer); - } -} -function TimedFireWeaponAtEnemy() -{ - if ( (Enemy == none) || FireWeaponAt(Enemy) ) SetCombatTimer(); - else SetTimer(0.01, True); -} -state SpinAttack -{ -ignores EnemyNotVisible; - // Don't do this in this state - function GetOutOfTheWayOfShot(vector ShotDirection, vector ShotOrigin){} - function DoSpinDamage() - { local Actor A; - //log("FLESHPOUND DOSPINDAMAGE!"); foreach CollidingActors(class'actor', A, (NiceZombieFleshpound(pawn).MeleeRange * 1.5)+pawn.CollisionRadius, pawn.Location) NiceZombieFleshpound(pawn).SpinDamage(A); - } -Begin: -WaitForAnim: - While( KFM.bShotAnim ) - { Sleep(0.1); DoSpinDamage(); - } - WhatToDoNext(152); - if ( bSoaking ) SoakStop("STUCK IN SPINATTACK!!!"); -} -state ZombieCharge -{ - function bool StrafeFromDamage(float Damage, class DamageType, bool bFindDest) - { return false; - } - // I suspect this function causes bloats to get confused - function bool TryStrafe(vector sideDir) - { return false; - } - function Timer() - { Disable('NotifyBump'); Target = Enemy; TimedFireWeaponAtEnemy(); - } -WaitForAnim: - if ( Monster(Pawn).bShotAnim ) - { Goto('Moving'); - } - if ( !FindBestPathToward(Enemy, false,true) ) GotoState('ZombieRestFormation'); -Moving: - MoveToward(Enemy); - WhatToDoNext(17); - if ( bSoaking ) SoakStop("STUCK IN CHARGING!"); -} -// Used to set a timeout for the WaitForAnim state. This is a bit of a hack fix -// for the FleshPound getting stuck in its idle anim on a dedicated server when it -// is supposed to be raging. For some reason, on a dedicated server only, it -// never gets an animend call for the PoundRage anim, instead the anim gets -// interrupted by the PoundIdle anim. If we figure that bug out, we can -// probably take this out in the future. But for now the fix works - Ramm -function SetPoundRageTimout(float NewRageTimeOut) -{ - RageAnimTimeout = NewRageTimeOut; -} -state WaitForAnim -{ -Ignores SeePlayer,HearNoise,Timer,EnemyNotVisible,NotifyBump; - // Don't do this in this state - function GetOutOfTheWayOfShot(vector ShotDirection, vector ShotOrigin){} - function BeginState() - { bUseFreezeHack = False; - } - // The rage anim has ended, clear the flags and let the AI do its thing - function RageTimeout() - { if( bUseFreezeHack ) { if( Pawn!=none ) { Pawn.AccelRate = Pawn.Default.AccelRate; Pawn.GroundSpeed = Pawn.Default.GroundSpeed; } bUseFreezeHack = False; AnimEnd(0); } - } - function Tick( float Delta ) - { Global.Tick(Delta); - if( RageAnimTimeout > 0 ) { RageAnimTimeout -= Delta; - if( RageAnimTimeout <= 0 ) { RageAnimTimeout = 0; RageTimeout(); } } - if( bUseFreezeHack ) { MoveTarget = none; MoveTimer = -1; Pawn.Acceleration = vect(0,0,0); Pawn.GroundSpeed = 1; Pawn.AccelRate = 0; } - } - function EndState() - { if( Pawn!=none ) { Pawn.AccelRate = Pawn.Default.AccelRate; Pawn.GroundSpeed = Pawn.Default.GroundSpeed; } bUseFreezeHack = False; - } -Begin: - While( KFM.bShotAnim ) - { Sleep(0.15); - } - WhatToDoNext(99); -} -defaultproperties -{ RageFrustrationThreshhold=10.000000 -} +class NiceZombieFleshpoundController extends NiceMonsterController; +var float RageAnimTimeout; // How long until the RageAnim is completed; Hack so the server doesn't get stuck in idle when its doing the Rage anim +var bool bDoneSpottedCheck; +var float RageFrustrationTimer; // Tracks how long we have been walking toward a visible enemy +var float RageFrustrationThreshhold; // Base value for how long the FP should walk torward an enemy without reaching them before getting frustrated and raging +simulated function PostBeginPlay(){ + super.PostBeginPlay(); + RageFrustrationTimer = 0; +} +function Tick(float Delta){ + local bool bSeesPlayers; + local Controller PC; + local KFHumanPawn Human; + local NiceZombieFleshPound ZFP; + super.Tick(Delta); + bSeesPlayers = false; + for(PC = Level.ControllerList;PC != none;PC = PC.NextController){ + Human = KFHumanPawn(PC.Pawn); + if(Human != none && Human.Health > 0 && !Human.bPendingDelete && CanSee(Human)){ + bSeesPlayers = true; + break; + } + } + if(bSeesPlayers){ + if(RageFrustrationTimer < RageFrustrationThreshhold){ + RageFrustrationTimer += Delta; + if(RageFrustrationTimer >= RageFrustrationThreshhold){ + ZFP = NiceZombieFleshPound(Pawn); + if(ZFP != none && !ZFP.bChargingPlayer){ + ZFP.StartChargingFP(Pawn(focus)); + ZFP.bFrustrated = true; + } + } + } + } + else + RageFrustrationTimer = 0; +} +// Never do that, you too cool +function GetOutOfTheWayOfShot(vector ShotDirection, vector ShotOrigin){} +state ZombieHunt +{ + event SeePlayer(Pawn SeenPlayer) + { + if ( !bDoneSpottedCheck && PlayerController(SeenPlayer.Controller) != none ) + { + // 25% chance of first player to see this Fleshpound saying something + if ( !KFGameType(Level.Game).bDidSpottedFleshpoundMessage && FRand() < 0.25 ) + { + PlayerController(SeenPlayer.Controller).Speech('AUTO', 12, ""); + KFGameType(Level.Game).bDidSpottedFleshpoundMessage = true; + } + + bDoneSpottedCheck = true; + } + + super.SeePlayer(SeenPlayer); + } +} +function TimedFireWeaponAtEnemy() +{ + if ( (Enemy == none) || FireWeaponAt(Enemy) ) + SetCombatTimer(); + else + SetTimer(0.01, True); +} +state SpinAttack +{ +ignores EnemyNotVisible; + // Don't do this in this state + function GetOutOfTheWayOfShot(vector ShotDirection, vector ShotOrigin){} + function DoSpinDamage() + { + local Actor A; + + //log("FLESHPOUND DOSPINDAMAGE!"); + foreach CollidingActors(class'actor', A, (NiceZombieFleshpound(pawn).MeleeRange * 1.5)+pawn.CollisionRadius, pawn.Location) + NiceZombieFleshpound(pawn).SpinDamage(A); + } +Begin: +WaitForAnim: + While( KFM.bShotAnim ) + { + Sleep(0.1); + DoSpinDamage(); + } + WhatToDoNext(152); + if ( bSoaking ) + SoakStop("STUCK IN SPINATTACK!!!"); +} +state ZombieCharge +{ + function bool StrafeFromDamage(float Damage, class DamageType, bool bFindDest) + { + return false; + } + // I suspect this function causes bloats to get confused + function bool TryStrafe(vector sideDir) + { + return false; + } + function Timer() + { + Disable('NotifyBump'); + Target = Enemy; + TimedFireWeaponAtEnemy(); + } +WaitForAnim: + if ( Monster(Pawn).bShotAnim ) + { + Goto('Moving'); + } + if ( !FindBestPathToward(Enemy, false,true) ) + GotoState('ZombieRestFormation'); +Moving: + MoveToward(Enemy); + WhatToDoNext(17); + if ( bSoaking ) + SoakStop("STUCK IN CHARGING!"); +} +// Used to set a timeout for the WaitForAnim state. This is a bit of a hack fix +// for the FleshPound getting stuck in its idle anim on a dedicated server when it +// is supposed to be raging. For some reason, on a dedicated server only, it +// never gets an animend call for the PoundRage anim, instead the anim gets +// interrupted by the PoundIdle anim. If we figure that bug out, we can +// probably take this out in the future. But for now the fix works - Ramm +function SetPoundRageTimout(float NewRageTimeOut) +{ + RageAnimTimeout = NewRageTimeOut; +} +state WaitForAnim +{ +Ignores SeePlayer,HearNoise,Timer,EnemyNotVisible,NotifyBump; + // Don't do this in this state + function GetOutOfTheWayOfShot(vector ShotDirection, vector ShotOrigin){} + function BeginState() + { + bUseFreezeHack = False; + } + // The rage anim has ended, clear the flags and let the AI do its thing + function RageTimeout() + { + if( bUseFreezeHack ) + { + if( Pawn!=none ) + { + Pawn.AccelRate = Pawn.Default.AccelRate; + Pawn.GroundSpeed = Pawn.Default.GroundSpeed; + } + bUseFreezeHack = False; + AnimEnd(0); + } + } + function Tick( float Delta ) + { + Global.Tick(Delta); + + if( RageAnimTimeout > 0 ) + { + RageAnimTimeout -= Delta; + + if( RageAnimTimeout <= 0 ) + { + RageAnimTimeout = 0; + RageTimeout(); + } + } + + if( bUseFreezeHack ) + { + MoveTarget = none; + MoveTimer = -1; + Pawn.Acceleration = vect(0,0,0); + Pawn.GroundSpeed = 1; + Pawn.AccelRate = 0; + } + } + function EndState() + { + if( Pawn!=none ) + { + Pawn.AccelRate = Pawn.Default.AccelRate; + Pawn.GroundSpeed = Pawn.Default.GroundSpeed; + } + bUseFreezeHack = False; + } +Begin: + While( KFM.bShotAnim ) + { + Sleep(0.15); + } + WhatToDoNext(99); +} +defaultproperties +{ + RageFrustrationThreshhold=10.000000 +} diff --git a/sources/Zeds/Nice/NiceZombieGhost.uc b/sources/Zeds/Nice/NiceZombieGhost.uc index 32acae1..fc37b8d 100644 --- a/sources/Zeds/Nice/NiceZombieGhost.uc +++ b/sources/Zeds/Nice/NiceZombieGhost.uc @@ -1,139 +1,242 @@ -// Completely invisible Stalker -// (c) PooSH, 2014 -// used 'ClawAndMove' code from Scary Ghost's SuperStaler -// Ported to 'NiceMonster' parent class -class NiceZombieGhost extends NiceZombieStalker; -// max distance squared for player to see cloacked Stalkers. -// Beyond that distance Stalkers will appear completely invisible. -var float CloakDistanceSqr; -// Unclock distance squared for Commandos -var float UncloakDistanceSqr; -var const Material CloakMat; -var const Material InvisibleMat; -var const Material UncloakMat, UncloakFBMat; -var const Material GlowFX; -static simulated function PreCacheMaterials(LevelInfo myLevel) -{ - myLevel.AddPrecacheMaterial(default.CloakMat); - myLevel.AddPrecacheMaterial(default.InvisibleMat); - myLevel.AddPrecacheMaterial(default.UncloakMat); - myLevel.AddPrecacheMaterial(default.UncloakFBMat); - myLevel.AddPrecacheMaterial(default.GlowFX); - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.stalker_env_cmb'); - myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.stalker_diff'); - myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.stalker_spec'); - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.StalkerCloakOpacity_cmb'); - myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.StalkerCloakEnv_rot'); - myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.stalker_opacity_osc'); - myLevel.AddPrecacheMaterial(Material'KFCharacters.StalkerSkin'); -} - - -simulated function PostNetBeginPlay() -{ - super.PostNetBeginPlay(); - if ( LocalKFHumanPawn != none ) { CloakDistanceSqr = fmax(CloakDistanceSqr, 3.0 * UncloakDistanceSqr * LocalKFHumanPawn.GetStalkerViewDistanceMulti()); UncloakDistanceSqr *= LocalKFHumanPawn.GetStalkerViewDistanceMulti(); - } -} - -function RenderOverlays(Canvas Canvas) -{ - Canvas.SetDrawColor(0, 92, 255, 255); - super.RenderOverlays(Canvas); -} -// makes Stalker invisible or glowing (for commando) -simulated function CloakStalker() -{ - // No cloaking if zapped - if( bZapped ) - { return; - } - if ( bSpotted ) { if( Level.NetMode == NM_DedicatedServer ) return; - Skins[0] = GlowFX; Skins[1] = GlowFX; bUnlit = true; - } - else if ( !bDecapitated && !bCrispified ) // No head, no cloak, honey. updated : Being charred means no cloak either :D - { Visibility = 1; bCloaked = true; - if( Level.NetMode == NM_DedicatedServer ) Return; - Skins[0] = InvisibleMat; Skins[1] = InvisibleMat; bUnlit = false; - // Invisible - no shadow if(PlayerShadow != none) PlayerShadow.bShadowActive = false; if(RealTimeShadow != none) RealTimeShadow.Destroy(); - // Remove/disallow projectors on invisible people Projectors.Remove(0, Projectors.Length); bAcceptsProjectors = false; SetOverlayMaterial(Material'KFX.FBDecloakShader', 0.25, true); - } -} -simulated function UnCloakStalker() -{ - if( bZapped ) - { return; - } - if( !bCrispified ) - { LastUncloakTime = Level.TimeSeconds; - Visibility = default.Visibility; bCloaked = false; bUnlit = false; - // 25% chance of our Enemy saying something about us being invisible if( Level.NetMode!=NM_Client && !KFGameType(Level.Game).bDidStalkerInvisibleMessage && FRand()<0.25 && Controller.Enemy!=none && PlayerController(Controller.Enemy.Controller)!=none ) { PlayerController(Controller.Enemy.Controller).Speech('AUTO', 17, ""); KFGameType(Level.Game).bDidStalkerInvisibleMessage = true; } if( Level.NetMode == NM_DedicatedServer ) Return; - if ( Skins[0] != UncloakMat ) { Skins[1] = FinalBlend'KF_Specimens_Trip_T.stalker_fb'; Skins[0] = UncloakMat; - if (PlayerShadow != none) PlayerShadow.bShadowActive = true; - bAcceptsProjectors = true; - SetOverlayMaterial(Material'KFX.FBDecloakShader', 0.25, true); } - } -} -function RemoveHead() -{ - Super(NiceMonster).RemoveHead(); - if (!bCrispified) - { Skins[1] = UncloakFBMat; Skins[0] = UncloakMat; - } -} -simulated function PlayDying(class DamageType, vector HitLoc) -{ - Super(NiceMonster).PlayDying(DamageType,HitLoc); - if(bUnlit) bUnlit=!bUnlit; - LocalKFHumanPawn = none; - if (!bCrispified) - { Skins[1] = UncloakFBMat; Skins[0] = UncloakMat; - } -} - -simulated function Tick(float DeltaTime) -{ - local float DistanceSqr; - Super(NiceMonster).Tick(DeltaTime); - // Keep the stalker moving toward its target when attacking - if( Role == ROLE_Authority && bShotAnim && !bWaitForAnim && !bZapped ) { if( LookTarget!=none ) { Acceleration = AccelRate * Normal(LookTarget.Location - Location); } - } - if( Level.NetMode==NM_DedicatedServer ) Return; // Servers aren't intrested in this info. - if( bZapped ) { // Make sure we check if we need to be cloaked as soon as the zap wears off NextCheckTime = Level.TimeSeconds; - } - else if( Level.TimeSeconds > NextCheckTime && Health > 0 ) - { NextCheckTime = Level.TimeSeconds + 0.5; - bSpotted = false; if ( LocalKFHumanPawn != none ) { DistanceSqr = VSizeSquared(Location - LocalKFHumanPawn.Location); if( LocalKFHumanPawn.Health > 0 && LocalKFHumanPawn.ShowStalkers() && DistanceSqr < UncloakDistanceSqr ) { bSpotted = True; if ( Skins[0] != GlowFX ) { Skins[0] = GlowFX; Skins[1] = GlowFX; bUnlit = true; } } else if ( DistanceSqr < CloakDistanceSqr ) { if ( bCloaked && Skins[0] != CloakMat ) { Skins[0] = CloakMat; Skins[1] = CloakMat; bUnlit = false; } } else if ( Skins[0] != InvisibleMat ) { CloakStalker(); } } - } -} - -function RangedAttack(Actor A) -{ - if ( !bShotAnim && Physics != PHYS_Swimming && CanAttack(A) ) { bShotAnim = true; SetAnimAction('ClawAndMove'); - } -} -// copied from ZombieSuperStalker (c) Scary Ghost -simulated event SetAnimAction(name NewAction) -{ - if( NewAction=='' ) Return; - ExpectingChannel = AttackAndMoveDoAnimAction(NewAction); - bWaitForAnim= false; - if( Level.NetMode!=NM_Client ) { AnimAction = NewAction; bResetAnimAct = True; ResetAnimActTime = Level.TimeSeconds+0.3; - } -} -// copied from ZombieSuperStalker (c) Scary Ghost -simulated function int AttackAndMoveDoAnimAction( name AnimName ) -{ - local int meleeAnimIndex; - local float duration; - if( AnimName == 'ClawAndMove' ) { meleeAnimIndex = Rand(3); AnimName = meleeAnims[meleeAnimIndex]; - duration= GetAnimDuration(AnimName, 1.0); - } - if( AnimName=='StalkerSpinAttack' || AnimName=='StalkerAttack1' || AnimName=='JumpAttack') { AnimBlendParams(1, 1.0, 0.0,, FireRootBone); PlayAnim(AnimName,, 0.1, 1); - return 1; - } - return super.DoAnimAction( AnimName ); -} -defaultproperties -{ CloakDistanceSqr=62500.000000 UncloakDistanceSqr=360000.000000 CloakMat=Shader'KF_Specimens_Trip_T.stalker_invisible' InvisibleMat=Shader'KF_Specimens_Trip_T.patriarch_invisible' UncloakMat=Shader'KF_Specimens_Trip_T.stalker_invisible' UncloakFBMat=Shader'KF_Specimens_Trip_T.stalker_invisible' MenuName="Ghost" Skins(0)=Shader'KF_Specimens_Trip_T.patriarch_invisible' Skins(1)=Shader'KF_Specimens_Trip_T.patriarch_invisible' -} +// Completely invisible Stalker +// (c) PooSH, 2014 +// used 'ClawAndMove' code from Scary Ghost's SuperStaler +// Ported to 'NiceMonster' parent class +class NiceZombieGhost extends NiceZombieStalker; +// max distance squared for player to see cloacked Stalkers. +// Beyond that distance Stalkers will appear completely invisible. +var float CloakDistanceSqr; +// Unclock distance squared for Commandos +var float UncloakDistanceSqr; +var const Material CloakMat; +var const Material InvisibleMat; +var const Material UncloakMat, UncloakFBMat; +var const Material GlowFX; +static simulated function PreCacheMaterials(LevelInfo myLevel) +{ + myLevel.AddPrecacheMaterial(default.CloakMat); + myLevel.AddPrecacheMaterial(default.InvisibleMat); + myLevel.AddPrecacheMaterial(default.UncloakMat); + myLevel.AddPrecacheMaterial(default.UncloakFBMat); + myLevel.AddPrecacheMaterial(default.GlowFX); + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.stalker_env_cmb'); + myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.stalker_diff'); + myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.stalker_spec'); + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.StalkerCloakOpacity_cmb'); + myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.StalkerCloakEnv_rot'); + myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.stalker_opacity_osc'); + myLevel.AddPrecacheMaterial(Material'KFCharacters.StalkerSkin'); +} + + +simulated function PostNetBeginPlay() +{ + super.PostNetBeginPlay(); + if ( LocalKFHumanPawn != none ) { + CloakDistanceSqr = fmax(CloakDistanceSqr, 3.0 * UncloakDistanceSqr * LocalKFHumanPawn.GetStalkerViewDistanceMulti()); + UncloakDistanceSqr *= LocalKFHumanPawn.GetStalkerViewDistanceMulti(); + } +} + +function RenderOverlays(Canvas Canvas) +{ + Canvas.SetDrawColor(0, 92, 255, 255); + super.RenderOverlays(Canvas); +} +// makes Stalker invisible or glowing (for commando) +simulated function CloakStalker() +{ + // No cloaking if zapped + if( bZapped ) + { + return; + } + if ( bSpotted ) { + if( Level.NetMode == NM_DedicatedServer ) + return; + + Skins[0] = GlowFX; + Skins[1] = GlowFX; + bUnlit = true; + } + else if ( !bDecapitated && !bCrispified ) // No head, no cloak, honey. updated : Being charred means no cloak either :D + { + Visibility = 1; + bCloaked = true; + + if( Level.NetMode == NM_DedicatedServer ) + Return; + + Skins[0] = InvisibleMat; + Skins[1] = InvisibleMat; + bUnlit = false; + + // Invisible - no shadow + if(PlayerShadow != none) + PlayerShadow.bShadowActive = false; + if(RealTimeShadow != none) + RealTimeShadow.Destroy(); + + // Remove/disallow projectors on invisible people + Projectors.Remove(0, Projectors.Length); + bAcceptsProjectors = false; + SetOverlayMaterial(Material'KFX.FBDecloakShader', 0.25, true); + } +} +simulated function UnCloakStalker() +{ + if( bZapped ) + { + return; + } + if( !bCrispified ) + { + LastUncloakTime = Level.TimeSeconds; + + Visibility = default.Visibility; + bCloaked = false; + bUnlit = false; + + // 25% chance of our Enemy saying something about us being invisible + if( Level.NetMode!=NM_Client && !KFGameType(Level.Game).bDidStalkerInvisibleMessage && FRand()<0.25 && Controller.Enemy!=none && + PlayerController(Controller.Enemy.Controller)!=none ) + { + PlayerController(Controller.Enemy.Controller).Speech('AUTO', 17, ""); + KFGameType(Level.Game).bDidStalkerInvisibleMessage = true; + } + if( Level.NetMode == NM_DedicatedServer ) + Return; + + if ( Skins[0] != UncloakMat ) + { + Skins[1] = FinalBlend'KF_Specimens_Trip_T.stalker_fb'; + Skins[0] = UncloakMat; + + if (PlayerShadow != none) + PlayerShadow.bShadowActive = true; + + bAcceptsProjectors = true; + + SetOverlayMaterial(Material'KFX.FBDecloakShader', 0.25, true); + } + } +} +function RemoveHead() +{ + Super(NiceMonster).RemoveHead(); + if (!bCrispified) + { + Skins[1] = UncloakFBMat; + Skins[0] = UncloakMat; + } +} +simulated function PlayDying(class DamageType, vector HitLoc) +{ + Super(NiceMonster).PlayDying(DamageType,HitLoc); + if(bUnlit) + bUnlit=!bUnlit; + LocalKFHumanPawn = none; + if (!bCrispified) + { + Skins[1] = UncloakFBMat; + Skins[0] = UncloakMat; + } +} + +simulated function Tick(float DeltaTime) +{ + local float DistanceSqr; + Super(NiceMonster).Tick(DeltaTime); + // Keep the stalker moving toward its target when attacking + if( Role == ROLE_Authority && bShotAnim && !bWaitForAnim && !bZapped ) { + if( LookTarget!=none ) { + Acceleration = AccelRate * Normal(LookTarget.Location - Location); + } + } + if( Level.NetMode==NM_DedicatedServer ) + Return; // Servers aren't intrested in this info. + if( bZapped ) { + // Make sure we check if we need to be cloaked as soon as the zap wears off + NextCheckTime = Level.TimeSeconds; + } + else if( Level.TimeSeconds > NextCheckTime && Health > 0 ) + { + NextCheckTime = Level.TimeSeconds + 0.5; + + bSpotted = false; + if ( LocalKFHumanPawn != none ) { + DistanceSqr = VSizeSquared(Location - LocalKFHumanPawn.Location); + if( LocalKFHumanPawn.Health > 0 && LocalKFHumanPawn.ShowStalkers() + && DistanceSqr < UncloakDistanceSqr ) + { + bSpotted = True; + if ( Skins[0] != GlowFX ) { + Skins[0] = GlowFX; + Skins[1] = GlowFX; + bUnlit = true; } + } + else if ( DistanceSqr < CloakDistanceSqr ) { + if ( bCloaked && Skins[0] != CloakMat ) { + Skins[0] = CloakMat; + Skins[1] = CloakMat; + bUnlit = false; + } + } + else if ( Skins[0] != InvisibleMat ) { + CloakStalker(); + } + } + } +} + +function RangedAttack(Actor A) +{ + if ( !bShotAnim && Physics != PHYS_Swimming && CanAttack(A) ) { + bShotAnim = true; + SetAnimAction('ClawAndMove'); + } +} +// copied from ZombieSuperStalker (c) Scary Ghost +simulated event SetAnimAction(name NewAction) +{ + if( NewAction=='' ) + Return; + ExpectingChannel = AttackAndMoveDoAnimAction(NewAction); + bWaitForAnim= false; + if( Level.NetMode!=NM_Client ) { + AnimAction = NewAction; + bResetAnimAct = True; + ResetAnimActTime = Level.TimeSeconds+0.3; + } +} +// copied from ZombieSuperStalker (c) Scary Ghost +simulated function int AttackAndMoveDoAnimAction( name AnimName ) +{ + local int meleeAnimIndex; + local float duration; + if( AnimName == 'ClawAndMove' ) { + meleeAnimIndex = Rand(3); + AnimName = meleeAnims[meleeAnimIndex]; + + duration= GetAnimDuration(AnimName, 1.0); + } + if( AnimName=='StalkerSpinAttack' || AnimName=='StalkerAttack1' || AnimName=='JumpAttack') { + AnimBlendParams(1, 1.0, 0.0,, FireRootBone); + PlayAnim(AnimName,, 0.1, 1); + + return 1; + } + return super.DoAnimAction( AnimName ); +} +defaultproperties +{ + CloakDistanceSqr=62500.000000 + UncloakDistanceSqr=360000.000000 + CloakMat=Shader'KF_Specimens_Trip_T.stalker_invisible' + InvisibleMat=Shader'KF_Specimens_Trip_T.patriarch_invisible' + UncloakMat=Shader'KF_Specimens_Trip_T.stalker_invisible' + UncloakFBMat=Shader'KF_Specimens_Trip_T.stalker_invisible' + MenuName="Ghost" + Skins(0)=Shader'KF_Specimens_Trip_T.patriarch_invisible' + Skins(1)=Shader'KF_Specimens_Trip_T.patriarch_invisible' +} diff --git a/sources/Zeds/Nice/NiceZombieGoreFastBase.uc b/sources/Zeds/Nice/NiceZombieGoreFastBase.uc index 3b91bfb..08e1443 100644 --- a/sources/Zeds/Nice/NiceZombieGoreFastBase.uc +++ b/sources/Zeds/Nice/NiceZombieGoreFastBase.uc @@ -1,18 +1,63 @@ -// Zombie Monster for KF Invasion gametype -// He's speedy, and swings with a Single enlongated arm, affording him slightly more range -class NiceZombieGoreFastBase extends NiceMonster - abstract; -#exec OBJ LOAD FILE= -var bool bRunning; -var float RunAttackTimeout; -replication -{ - reliable if(Role == ROLE_Authority) bRunning; -} -//------------------------------------------------------------------------------- -// NOTE: All Code resides in the child class(this class was only created to -// eliminate hitching caused by loading default properties during play) -//------------------------------------------------------------------------------- -defaultproperties -{ fuelRatio=0.650000 clientHeadshotScale=1.600000 MeleeAnims(0)="GoreAttack1" MeleeAnims(1)="GoreAttack2" MeleeAnims(2)="GoreAttack1" bCannibal=True MeleeDamage=15 damageForce=5000 KFRagdollName="GoreFast_Trip" CrispUpThreshhold=8 bUseExtendedCollision=True ColOffset=(Z=52.000000) ColRadius=25.000000 ColHeight=10.000000 ExtCollAttachBoneName="Collision_Attach" SeveredArmAttachScale=0.900000 SeveredLegAttachScale=0.900000 PlayerCountHealthScale=0.150000 OnlineHeadshotOffset=(X=5.000000,Z=53.000000) OnlineHeadshotScale=1.500000 MotionDetectorThreat=0.500000 ScoringValue=12 IdleHeavyAnim="GoreIdle" IdleRifleAnim="GoreIdle" MeleeRange=30.000000 GroundSpeed=120.000000 WaterSpeed=140.000000 HealthMax=250.000000 Health=250 HeadHeight=2.500000 HeadScale=1.500000 MenuName="Nice Gorefast" MovementAnims(0)="GoreWalk" WalkAnims(0)="GoreWalk" WalkAnims(1)="GoreWalk" WalkAnims(2)="GoreWalk" WalkAnims(3)="GoreWalk" IdleCrouchAnim="GoreIdle" IdleWeaponAnim="GoreIdle" IdleRestAnim="GoreIdle" DrawScale=1.200000 PrePivot=(Z=10.000000) Mass=350.000000 RotationRate=(Yaw=45000,Roll=0) -} +// Zombie Monster for KF Invasion gametype +// He's speedy, and swings with a Single enlongated arm, affording him slightly more range +class NiceZombieGoreFastBase extends NiceMonster + abstract; +#exec OBJ LOAD FILE= +var bool bRunning; +var float RunAttackTimeout; +replication +{ + reliable if(Role == ROLE_Authority) + bRunning; +} +//------------------------------------------------------------------------------- +// NOTE: All Code resides in the child class(this class was only created to +// eliminate hitching caused by loading default properties during play) +//------------------------------------------------------------------------------- +defaultproperties +{ + fuelRatio=0.650000 + clientHeadshotScale=1.600000 + MeleeAnims(0)="GoreAttack1" + MeleeAnims(1)="GoreAttack2" + MeleeAnims(2)="GoreAttack1" + bCannibal=True + MeleeDamage=15 + damageForce=5000 + KFRagdollName="GoreFast_Trip" + CrispUpThreshhold=8 + bUseExtendedCollision=True + ColOffset=(Z=52.000000) + ColRadius=25.000000 + ColHeight=10.000000 + ExtCollAttachBoneName="Collision_Attach" + SeveredArmAttachScale=0.900000 + SeveredLegAttachScale=0.900000 + PlayerCountHealthScale=0.150000 + OnlineHeadshotOffset=(X=5.000000,Z=53.000000) + OnlineHeadshotScale=1.500000 + MotionDetectorThreat=0.500000 + ScoringValue=12 + IdleHeavyAnim="GoreIdle" + IdleRifleAnim="GoreIdle" + MeleeRange=30.000000 + GroundSpeed=120.000000 + WaterSpeed=140.000000 + HealthMax=250.000000 + Health=250 + HeadHeight=2.500000 + HeadScale=1.500000 + MenuName="Nice Gorefast" + MovementAnims(0)="GoreWalk" + WalkAnims(0)="GoreWalk" + WalkAnims(1)="GoreWalk" + WalkAnims(2)="GoreWalk" + WalkAnims(3)="GoreWalk" + IdleCrouchAnim="GoreIdle" + IdleWeaponAnim="GoreIdle" + IdleRestAnim="GoreIdle" + DrawScale=1.200000 + PrePivot=(Z=10.000000) + Mass=350.000000 + RotationRate=(Yaw=45000,Roll=0) +} diff --git a/sources/Zeds/Nice/NiceZombieGorefast.uc b/sources/Zeds/Nice/NiceZombieGorefast.uc index 08d79a3..e889db8 100644 --- a/sources/Zeds/Nice/NiceZombieGorefast.uc +++ b/sources/Zeds/Nice/NiceZombieGorefast.uc @@ -1,153 +1,307 @@ -// Zombie Monster for KF Invasion gametype -// GOREFAST. -// He's speedy, and swings with a Single enlongated arm, affording him slightly more range -class NiceZombieGoreFast extends NiceZombieGoreFastBase; -#exec OBJ LOAD FILE= -//---------------------------------------------------------------------------- -// NOTE: All Variables are declared in the base class to eliminate hitching -//---------------------------------------------------------------------------- -simulated function PostNetReceive(){ - if(bRunning) MovementAnims[0] = 'ZombieRun'; - else MovementAnims[0] = default.MovementAnims[0]; -} -// This zed has been taken control of. Boost its health and speed -function SetMindControlled(bool bNewMindControlled) -{ - if( bNewMindControlled ) - { NumZCDHits++; - // if we hit him a couple of times, make him rage! if( NumZCDHits > 1 ) { if( !IsInState('RunningToMarker') ) { GotoState('RunningToMarker'); } else { NumZCDHits = 1; if( IsInState('RunningToMarker') ) { GotoState(''); } } } else { if( IsInState('RunningToMarker') ) { GotoState(''); } } - if( bNewMindControlled != bZedUnderControl ) { SetGroundSpeed(OriginalGroundSpeed * 1.25); Health *= 1.25; HealthMax *= 1.25; } - } - else - { NumZCDHits=0; - } - bZedUnderControl = bNewMindControlled; -} -// Handle the zed being commanded to move to a new location -function GivenNewMarker() -{ - if( bRunning && NumZCDHits > 1 ) - { GotoState('RunningToMarker'); - } - else - { GotoState(''); - } -} -function RangedAttack(Actor A){ - super.RangedAttack(A); - if(!bShotAnim && !bDecapitated && VSize(A.Location - Location) <= 700) GoToState('RunningState'); -} -simulated function Tick(float DeltaTime){ - super.Tick(DeltaTime); - if(IsInState('RunningState')) SetGroundSpeed(GetOriginalGroundSpeed() * 1.875); - else SetGroundSpeed(GetOriginalGroundSpeed()); -} -state RunningState{ - // Set the zed to the zapped behavior - simulated function SetZappedBehavior(){ Global.SetZappedBehavior(); GoToState(''); - } - // Don't override speed in this state - function bool CanSpeedAdjust(){ return false; - } - simulated function BeginState(){ if(bZapped) GoToState(''); else{ SetGroundSpeed(OriginalGroundSpeed * 1.875); bRunning = true; if(Level.NetMode != NM_DedicatedServer) PostNetReceive(); - NetUpdateTime = Level.TimeSeconds - 1; } - } - function EndState(){ SetGroundSpeed(GetOriginalGroundSpeed()); bRunning = false; if(Level.NetMode != NM_DedicatedServer) PostNetReceive(); - RunAttackTimeout=0; - NetUpdateTime = Level.TimeSeconds - 1; - } - function RemoveHead(){ GoToState(''); Global.RemoveHead(); - } - function RangedAttack(Actor A){ - if(bShotAnim || Physics == PHYS_Swimming) return; else if (CanAttack(A)){ bShotAnim = true; - // Randomly do a moving attack so the player can't kite the zed if(FRand() < 0.4){ SetAnimAction('ClawAndMove'); RunAttackTimeout = GetAnimDuration('GoreAttack1', 1.0); } else{ SetAnimAction('Claw'); Controller.bPreparingMove = true; Acceleration = vect(0,0,0); // Once we attack stop running GoToState(''); } return; } - } - simulated function Tick(float DeltaTime){ // Keep moving toward the target until the timer runs out (anim finishes) if(RunAttackTimeout > 0){ RunAttackTimeout -= DeltaTime; - if(RunAttackTimeout <= 0 && !bZedUnderControl){ RunAttackTimeout = 0; GoToState(''); } } - // Keep the gorefast moving toward its target when attacking if(Role == ROLE_Authority && bShotAnim && !bWaitForAnim){ if(LookTarget != none) Acceleration = AccelRate * Normal(LookTarget.Location - Location); } global.Tick(DeltaTime); - } -Begin: - GoTo('CheckCharge'); -CheckCharge: - if( Controller!=none && Controller.Target!=none && VSize(Controller.Target.Location-Location)<700 ) - { Sleep(0.5+ FRand() * 0.5); //log("Still charging"); GoTo('CheckCharge'); - } - else - { //log("Done charging"); GoToState(''); - } -} -// State where the zed is charging to a marked location. -state RunningToMarker extends RunningState -{ - simulated function Tick(float DeltaTime) - { // Keep moving toward the target until the timer runs out (anim finishes) if( RunAttackTimeout > 0 ) { RunAttackTimeout -= DeltaTime; - if( RunAttackTimeout <= 0 && !bZedUnderControl ) { RunAttackTimeout = 0; GoToState(''); } } - // Keep the gorefast moving toward its target when attacking if( Role == ROLE_Authority && bShotAnim && !bWaitForAnim ) { if( LookTarget!=none ) { Acceleration = AccelRate * Normal(LookTarget.Location - Location); } } - global.Tick(DeltaTime); - } - -Begin: - GoTo('CheckCharge'); -CheckCharge: - if( bZedUnderControl || (Controller!=none && Controller.Target!=none && VSize(Controller.Target.Location-Location)<700) ) - { Sleep(0.5+ FRand() * 0.5); GoTo('CheckCharge'); - } - else - { GoToState(''); - } -} -// Overridden to handle playing upper body only attacks when moving -simulated event SetAnimAction(name NewAction) -{ - local int meleeAnimIndex; - local bool bWantsToAttackAndMove; - if( NewAction=='' ) Return; - bWantsToAttackAndMove = NewAction == 'ClawAndMove'; - if( NewAction == 'Claw' ) - { meleeAnimIndex = Rand(3); NewAction = meleeAnims[meleeAnimIndex]; - } - if( bWantsToAttackAndMove ) - { ExpectingChannel = AttackAndMoveDoAnimAction(NewAction); - } - else - { ExpectingChannel = DoAnimAction(NewAction); - } - if( !bWantsToAttackAndMove && AnimNeedsWait(NewAction) ) - { bWaitForAnim = true; - } - else - { bWaitForAnim = false; - } - if( Level.NetMode!=NM_Client ) - { AnimAction = NewAction; bResetAnimAct = True; ResetAnimActTime = Level.TimeSeconds+0.3; - } -} -// Handle playing the anim action on the upper body only if we're attacking and moving -simulated function int AttackAndMoveDoAnimAction( name AnimName ) -{ - local int meleeAnimIndex; - if( AnimName == 'ClawAndMove' ) - { meleeAnimIndex = Rand(3); AnimName = meleeAnims[meleeAnimIndex]; - } - if( AnimName=='GoreAttack1' || AnimName=='GoreAttack2' ) - { AnimBlendParams(1, 1.0, 0.0,, FireRootBone); PlayAnim(AnimName,, 0.1, 1); - return 1; - } - return super.DoAnimAction( AnimName ); -} -simulated function HideBone(name boneName) -{ - // Gorefast does not have a left arm and does not need it to be hidden - if (boneName != LeftFArmBone) - { super.HideBone(boneName); - } -} -static simulated function PreCacheMaterials(LevelInfo myLevel) -{//should be derived and used. - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.gorefast_cmb'); - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.gorefast_env_cmb'); - myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.gorefast_diff'); -} -defaultproperties -{ stunLoopStart=0.287500 stunLoopEnd=0.637500 idleInsertFrame=0.750000 EventClasses(0)="NicePack.NiceZombieGorefast" MoanVoice=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Talk' MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_HitPlayer' JumpSound=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Jump' DetachedArmClass=Class'KFChar.SeveredArmGorefast' DetachedLegClass=Class'KFChar.SeveredLegGorefast' DetachedHeadClass=Class'KFChar.SeveredHeadGorefast' bLeftArmGibbed=True HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Pain' DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Death' ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Challenge' ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Challenge' ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Challenge' ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Challenge' ControllerClass=Class'NicePack.NiceZombieGorefastController' AmbientSound=Sound'KF_BaseGorefast.Gorefast_Idle' Mesh=SkeletalMesh'KF_Freaks_Trip.GoreFast_Freak' Skins(0)=Combiner'KF_Specimens_Trip_T.gorefast_cmb' -} +// Zombie Monster for KF Invasion gametype +// GOREFAST. +// He's speedy, and swings with a Single enlongated arm, affording him slightly more range +class NiceZombieGoreFast extends NiceZombieGoreFastBase; +#exec OBJ LOAD FILE= +//---------------------------------------------------------------------------- +// NOTE: All Variables are declared in the base class to eliminate hitching +//---------------------------------------------------------------------------- +simulated function PostNetReceive(){ + if(bRunning) + MovementAnims[0] = 'ZombieRun'; + else + MovementAnims[0] = default.MovementAnims[0]; +} +// This zed has been taken control of. Boost its health and speed +function SetMindControlled(bool bNewMindControlled) +{ + if( bNewMindControlled ) + { + NumZCDHits++; + + // if we hit him a couple of times, make him rage! + if( NumZCDHits > 1 ) + { + if( !IsInState('RunningToMarker') ) + { + GotoState('RunningToMarker'); + } + else + { + NumZCDHits = 1; + if( IsInState('RunningToMarker') ) + { + GotoState(''); + } + } + } + else + { + if( IsInState('RunningToMarker') ) + { + GotoState(''); + } + } + + if( bNewMindControlled != bZedUnderControl ) + { + SetGroundSpeed(OriginalGroundSpeed * 1.25); + Health *= 1.25; + HealthMax *= 1.25; + } + } + else + { + NumZCDHits=0; + } + bZedUnderControl = bNewMindControlled; +} +// Handle the zed being commanded to move to a new location +function GivenNewMarker() +{ + if( bRunning && NumZCDHits > 1 ) + { + GotoState('RunningToMarker'); + } + else + { + GotoState(''); + } +} +function RangedAttack(Actor A){ + super.RangedAttack(A); + if(!bShotAnim && !bDecapitated && VSize(A.Location - Location) <= 700) + GoToState('RunningState'); +} +simulated function Tick(float DeltaTime){ + super.Tick(DeltaTime); + if(IsInState('RunningState')) + SetGroundSpeed(GetOriginalGroundSpeed() * 1.875); + else + SetGroundSpeed(GetOriginalGroundSpeed()); +} +state RunningState{ + // Set the zed to the zapped behavior + simulated function SetZappedBehavior(){ + Global.SetZappedBehavior(); + GoToState(''); + } + // Don't override speed in this state + function bool CanSpeedAdjust(){ + return false; + } + simulated function BeginState(){ + if(bZapped) + GoToState(''); + else{ + SetGroundSpeed(OriginalGroundSpeed * 1.875); + bRunning = true; + if(Level.NetMode != NM_DedicatedServer) + PostNetReceive(); + + NetUpdateTime = Level.TimeSeconds - 1; + } + } + function EndState(){ + SetGroundSpeed(GetOriginalGroundSpeed()); + bRunning = false; + if(Level.NetMode != NM_DedicatedServer) + PostNetReceive(); + + RunAttackTimeout=0; + + NetUpdateTime = Level.TimeSeconds - 1; + } + function RemoveHead(){ + GoToState(''); + Global.RemoveHead(); + } + function RangedAttack(Actor A){ + + if(bShotAnim || Physics == PHYS_Swimming) + return; + else if (CanAttack(A)){ + bShotAnim = true; + + // Randomly do a moving attack so the player can't kite the zed + if(FRand() < 0.4){ + SetAnimAction('ClawAndMove'); + RunAttackTimeout = GetAnimDuration('GoreAttack1', 1.0); + } + else{ + SetAnimAction('Claw'); + Controller.bPreparingMove = true; + Acceleration = vect(0,0,0); + // Once we attack stop running + GoToState(''); + } + return; + } + } + simulated function Tick(float DeltaTime){ + // Keep moving toward the target until the timer runs out (anim finishes) + if(RunAttackTimeout > 0){ + RunAttackTimeout -= DeltaTime; + + if(RunAttackTimeout <= 0 && !bZedUnderControl){ + RunAttackTimeout = 0; + GoToState(''); + } + } + + // Keep the gorefast moving toward its target when attacking + if(Role == ROLE_Authority && bShotAnim && !bWaitForAnim){ + if(LookTarget != none) + Acceleration = AccelRate * Normal(LookTarget.Location - Location); + } + global.Tick(DeltaTime); + } +Begin: + GoTo('CheckCharge'); +CheckCharge: + if( Controller!=none && Controller.Target!=none && VSize(Controller.Target.Location-Location)<700 ) + { + Sleep(0.5+ FRand() * 0.5); + //log("Still charging"); + GoTo('CheckCharge'); + } + else + { + //log("Done charging"); + GoToState(''); + } +} +// State where the zed is charging to a marked location. +state RunningToMarker extends RunningState +{ + simulated function Tick(float DeltaTime) + { + // Keep moving toward the target until the timer runs out (anim finishes) + if( RunAttackTimeout > 0 ) + { + RunAttackTimeout -= DeltaTime; + + if( RunAttackTimeout <= 0 && !bZedUnderControl ) + { + RunAttackTimeout = 0; + GoToState(''); + } + } + + // Keep the gorefast moving toward its target when attacking + if( Role == ROLE_Authority && bShotAnim && !bWaitForAnim ) + { + if( LookTarget!=none ) + { + Acceleration = AccelRate * Normal(LookTarget.Location - Location); + } + } + + global.Tick(DeltaTime); + } + +Begin: + GoTo('CheckCharge'); +CheckCharge: + if( bZedUnderControl || (Controller!=none && Controller.Target!=none && VSize(Controller.Target.Location-Location)<700) ) + { + Sleep(0.5+ FRand() * 0.5); + GoTo('CheckCharge'); + } + else + { + GoToState(''); + } +} +// Overridden to handle playing upper body only attacks when moving +simulated event SetAnimAction(name NewAction) +{ + local int meleeAnimIndex; + local bool bWantsToAttackAndMove; + if( NewAction=='' ) + Return; + bWantsToAttackAndMove = NewAction == 'ClawAndMove'; + if( NewAction == 'Claw' ) + { + meleeAnimIndex = Rand(3); + NewAction = meleeAnims[meleeAnimIndex]; + } + if( bWantsToAttackAndMove ) + { + ExpectingChannel = AttackAndMoveDoAnimAction(NewAction); + } + else + { + ExpectingChannel = DoAnimAction(NewAction); + } + if( !bWantsToAttackAndMove && AnimNeedsWait(NewAction) ) + { + bWaitForAnim = true; + } + else + { + bWaitForAnim = false; + } + if( Level.NetMode!=NM_Client ) + { + AnimAction = NewAction; + bResetAnimAct = True; + ResetAnimActTime = Level.TimeSeconds+0.3; + } +} +// Handle playing the anim action on the upper body only if we're attacking and moving +simulated function int AttackAndMoveDoAnimAction( name AnimName ) +{ + local int meleeAnimIndex; + if( AnimName == 'ClawAndMove' ) + { + meleeAnimIndex = Rand(3); + AnimName = meleeAnims[meleeAnimIndex]; + } + if( AnimName=='GoreAttack1' || AnimName=='GoreAttack2' ) + { + AnimBlendParams(1, 1.0, 0.0,, FireRootBone); + PlayAnim(AnimName,, 0.1, 1); + + return 1; + } + return super.DoAnimAction( AnimName ); +} +simulated function HideBone(name boneName) +{ + // Gorefast does not have a left arm and does not need it to be hidden + if (boneName != LeftFArmBone) + { + super.HideBone(boneName); + } +} +static simulated function PreCacheMaterials(LevelInfo myLevel) +{//should be derived and used. + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.gorefast_cmb'); + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.gorefast_env_cmb'); + myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.gorefast_diff'); +} +defaultproperties +{ + stunLoopStart=0.287500 + stunLoopEnd=0.637500 + idleInsertFrame=0.750000 + EventClasses(0)="NicePack.NiceZombieGorefast" + MoanVoice=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Talk' + MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_HitPlayer' + JumpSound=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Jump' + DetachedArmClass=Class'KFChar.SeveredArmGorefast' + DetachedLegClass=Class'KFChar.SeveredLegGorefast' + DetachedHeadClass=Class'KFChar.SeveredHeadGorefast' + bLeftArmGibbed=True + HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Pain' + DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Death' + ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Challenge' + ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Challenge' + ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Challenge' + ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Challenge' + ControllerClass=Class'NicePack.NiceZombieGorefastController' + AmbientSound=Sound'KF_BaseGorefast.Gorefast_Idle' + Mesh=SkeletalMesh'KF_Freaks_Trip.GoreFast_Freak' + Skins(0)=Combiner'KF_Specimens_Trip_T.gorefast_cmb' +} diff --git a/sources/Zeds/Nice/NiceZombieGorefastController.uc b/sources/Zeds/Nice/NiceZombieGorefastController.uc index 9cc10af..79281a1 100644 --- a/sources/Zeds/Nice/NiceZombieGorefastController.uc +++ b/sources/Zeds/Nice/NiceZombieGorefastController.uc @@ -1,10 +1,20 @@ -// Custom code to make the Gorefast act abit more interesting. -class NiceZombieGorefastController extends NiceMonsterController; -var bool bDoneSpottedCheck; -state ZombieHunt{ - event SeePlayer(Pawn SeenPlayer){ if(!bDoneSpottedCheck && PlayerController(SeenPlayer.Controller) != none){ // 25% chance of first player to see this Gorefast saying something if(!KFGameType(Level.Game).bDidSpottedGorefastMessage && FRand() < 0.25){ PlayerController(SeenPlayer.Controller).Speech('AUTO', 13, ""); KFGameType(Level.Game).bDidSpottedGorefastMessage = true; } bDoneSpottedCheck = true; } global.SeePlayer(SeenPlayer); - } -} -defaultproperties -{ StrafingAbility=0.500000 -} +// Custom code to make the Gorefast act abit more interesting. +class NiceZombieGorefastController extends NiceMonsterController; +var bool bDoneSpottedCheck; +state ZombieHunt{ + event SeePlayer(Pawn SeenPlayer){ + if(!bDoneSpottedCheck && PlayerController(SeenPlayer.Controller) != none){ + // 25% chance of first player to see this Gorefast saying something + if(!KFGameType(Level.Game).bDidSpottedGorefastMessage && FRand() < 0.25){ + PlayerController(SeenPlayer.Controller).Speech('AUTO', 13, ""); + KFGameType(Level.Game).bDidSpottedGorefastMessage = true; + } + bDoneSpottedCheck = true; + } + global.SeePlayer(SeenPlayer); + } +} +defaultproperties +{ + StrafingAbility=0.500000 +} diff --git a/sources/Zeds/Nice/NiceZombieHuskBase.uc b/sources/Zeds/Nice/NiceZombieHuskBase.uc index da766cb..7c93117 100644 --- a/sources/Zeds/Nice/NiceZombieHuskBase.uc +++ b/sources/Zeds/Nice/NiceZombieHuskBase.uc @@ -1,21 +1,80 @@ -//============================================================================= -// ZombieHusk -//============================================================================= -// Husk burned up fire projectile launching zed pawn class -//============================================================================= -// Killing Floor Source -// Copyright (C) 2009 Tripwire Interactive LLC -// - John "Ramm-Jaeger" Gibson -//============================================================================= -class NiceZombieHuskBase extends NiceMonster - abstract; -var float NextFireProjectileTime; // Track when we will fire again -var() float ProjectileFireInterval; // How often to fire the fire projectile -var() float BurnDamageScale; // How much to reduce fire damage for the Husk -//------------------------------------------------------------------------------- -// NOTE: All Code resides in the child class(this class was only created to -// eliminate hitching caused by loading default properties during play) -//------------------------------------------------------------------------------- -defaultproperties -{ ProjectileFireInterval=5.500000 BurnDamageScale=0.250000 bFireImmune=True bCanBurn=False fuelRatio=0.000000 clientHeadshotScale=1.100000 MeleeAnims(0)="Strike" MeleeAnims(1)="Strike" MeleeAnims(2)="Strike" BleedOutDuration=6.000000 ZapThreshold=0.750000 bHarpoonToBodyStuns=False ZombieFlag=1 MeleeDamage=15 damageForce=70000 bFatAss=True KFRagdollName="Burns_Trip" Intelligence=BRAINS_Mammal bCanDistanceAttackDoors=True bUseExtendedCollision=True ColOffset=(Z=36.000000) ColRadius=30.000000 ColHeight=33.000000 SeveredArmAttachScale=0.900000 SeveredLegAttachScale=0.900000 SeveredHeadAttachScale=0.900000 PlayerCountHealthScale=0.100000 OnlineHeadshotOffset=(X=20.000000,Z=55.000000) HeadHealth=200.000000 PlayerNumHeadHealthScale=0.050000 AmmunitionClass=Class'KFMod.BZombieAmmo' ScoringValue=17 IdleHeavyAnim="Idle" IdleRifleAnim="Idle" MeleeRange=30.000000 GroundSpeed=115.000000 WaterSpeed=102.000000 HealthMax=600.000000 Health=600 HeadHeight=1.000000 HeadScale=1.350000 AmbientSoundScaling=8.000000 MenuName="Nice Husk" MovementAnims(0)="WalkF" MovementAnims(1)="WalkB" MovementAnims(2)="WalkL" MovementAnims(3)="WalkR" WalkAnims(1)="WalkB" WalkAnims(2)="WalkL" WalkAnims(3)="WalkR" IdleCrouchAnim="Idle" IdleWeaponAnim="Idle" IdleRestAnim="Idle" DrawScale=1.400000 PrePivot=(Z=22.000000) Skins(1)=Shader'KF_Specimens_Trip_T_Two.burns.burns_shdr' SoundVolume=200 Mass=400.000000 RotationRate=(Yaw=45000,Roll=0) -} +//============================================================================= +// ZombieHusk +//============================================================================= +// Husk burned up fire projectile launching zed pawn class +//============================================================================= +// Killing Floor Source +// Copyright (C) 2009 Tripwire Interactive LLC +// - John "Ramm-Jaeger" Gibson +//============================================================================= +class NiceZombieHuskBase extends NiceMonster + abstract; +var float NextFireProjectileTime; // Track when we will fire again +var() float ProjectileFireInterval; // How often to fire the fire projectile +var() float BurnDamageScale; // How much to reduce fire damage for the Husk +//------------------------------------------------------------------------------- +// NOTE: All Code resides in the child class(this class was only created to +// eliminate hitching caused by loading default properties during play) +//------------------------------------------------------------------------------- +defaultproperties +{ + ProjectileFireInterval=5.500000 + BurnDamageScale=0.250000 + bFireImmune=True + bCanBurn=False + fuelRatio=0.000000 + clientHeadshotScale=1.100000 + MeleeAnims(0)="Strike" + MeleeAnims(1)="Strike" + MeleeAnims(2)="Strike" + BleedOutDuration=6.000000 + ZapThreshold=0.750000 + bHarpoonToBodyStuns=False + ZombieFlag=1 + MeleeDamage=15 + damageForce=70000 + bFatAss=True + KFRagdollName="Burns_Trip" + Intelligence=BRAINS_Mammal + bCanDistanceAttackDoors=True + bUseExtendedCollision=True + ColOffset=(Z=36.000000) + ColRadius=30.000000 + ColHeight=33.000000 + SeveredArmAttachScale=0.900000 + SeveredLegAttachScale=0.900000 + SeveredHeadAttachScale=0.900000 + PlayerCountHealthScale=0.100000 + OnlineHeadshotOffset=(X=20.000000,Z=55.000000) + HeadHealth=200.000000 + PlayerNumHeadHealthScale=0.050000 + AmmunitionClass=Class'KFMod.BZombieAmmo' + ScoringValue=17 + IdleHeavyAnim="Idle" + IdleRifleAnim="Idle" + MeleeRange=30.000000 + GroundSpeed=115.000000 + WaterSpeed=102.000000 + HealthMax=600.000000 + Health=600 + HeadHeight=1.000000 + HeadScale=1.350000 + AmbientSoundScaling=8.000000 + MenuName="Nice Husk" + MovementAnims(0)="WalkF" + MovementAnims(1)="WalkB" + MovementAnims(2)="WalkL" + MovementAnims(3)="WalkR" + WalkAnims(1)="WalkB" + WalkAnims(2)="WalkL" + WalkAnims(3)="WalkR" + IdleCrouchAnim="Idle" + IdleWeaponAnim="Idle" + IdleRestAnim="Idle" + DrawScale=1.400000 + PrePivot=(Z=22.000000) + Skins(1)=Shader'KF_Specimens_Trip_T_Two.burns.burns_shdr' + SoundVolume=200 + Mass=400.000000 + RotationRate=(Yaw=45000,Roll=0) +} diff --git a/sources/Zeds/Nice/NiceZombieHuskController.uc b/sources/Zeds/Nice/NiceZombieHuskController.uc index afd39f8..3421d35 100644 --- a/sources/Zeds/Nice/NiceZombieHuskController.uc +++ b/sources/Zeds/Nice/NiceZombieHuskController.uc @@ -1,97 +1,225 @@ -//============================================================================= -// HuskZombieController -//============================================================================= -// Controller class for the husk zombie -//============================================================================= -// Killing Floor Source -// Copyright (C) 2009 Tripwire Interactive LLC -// - John "Ramm-Jaeger" Gibson -//============================================================================= -class NiceZombieHuskController extends NiceMonsterController; -// Overridden to create a delay between when the husk fires his projectiles -function bool FireWeaponAt(Actor A) -{ - if ( A == none ) A = Enemy; - if ( (A == none) || (Focus != A) ) return false; - Target = A; - if( (VSize(A.Location - Pawn.Location) >= NiceZombieHusk(Pawn).MeleeRange + Pawn.CollisionRadius + Target.CollisionRadius) && NiceZombieHusk(Pawn).NextFireProjectileTime - Level.TimeSeconds > 0 ) - { return false; - } - Monster(Pawn).RangedAttack(Target); - return false; -} -/* -AdjustAim() -Returns a rotation which is the direction the bot should aim - after introducing the appropriate aiming error -Overridden to cause the zed to fire at the feet more often - Ramm -*/ -function rotator AdjustAim(FireProperties FiredAmmunition, vector projStart, int aimerror) -{ - local rotator FireRotation, TargetLook; - local float FireDist, TargetDist, ProjSpeed; - local actor HitActor; - local vector FireSpot, FireDir, TargetVel, HitLocation, HitNormal; - local int realYaw; - local bool bDefendMelee, bClean, bLeadTargetNow; - local bool bWantsToAimAtFeet; - if ( FiredAmmunition.ProjectileClass != none ) projspeed = FiredAmmunition.ProjectileClass.default.speed; - // make sure bot has a valid target - if ( Target == none ) - { Target = Enemy; if ( Target == none ) return Rotation; - } - FireSpot = Target.Location; - TargetDist = VSize(Target.Location - Pawn.Location); - // perfect aim at stationary objects - if ( Pawn(Target) == none ) - { if ( !FiredAmmunition.bTossed ) return rotator(Target.Location - projstart); else { FireDir = AdjustToss(projspeed,ProjStart,Target.Location,true); SetRotation(Rotator(FireDir)); return Rotation; } - } - bLeadTargetNow = FiredAmmunition.bLeadTarget && bLeadTarget; - bDefendMelee = ( (Target == Enemy) && DefendMelee(TargetDist) ); - aimerror = AdjustAimError(aimerror,TargetDist,bDefendMelee,FiredAmmunition.bInstantHit, bLeadTargetNow); - // lead target with non instant hit projectiles - if ( bLeadTargetNow ) - { TargetVel = Target.Velocity; // hack guess at projecting falling velocity of target if ( Target.Physics == PHYS_Falling ) { if ( Target.PhysicsVolume.Gravity.Z <= Target.PhysicsVolume.Default.Gravity.Z ) TargetVel.Z = FMin(TargetVel.Z + FMax(-400, Target.PhysicsVolume.Gravity.Z * FMin(1,TargetDist/projSpeed)),0); else TargetVel.Z = FMin(0, TargetVel.Z); } // more or less lead target (with some random variation) FireSpot += FMin(1, 0.7 + 0.6 * FRand()) * TargetVel * TargetDist/projSpeed; FireSpot.Z = FMin(Target.Location.Z, FireSpot.Z); - if ( (Target.Physics != PHYS_Falling) && (FRand() < 0.55) && (VSize(FireSpot - ProjStart) > 1000) ) { // don't always lead far away targets, especially if they are moving sideways with respect to the bot TargetLook = Target.Rotation; if ( Target.Physics == PHYS_Walking ) TargetLook.Pitch = 0; bClean = ( ((Vector(TargetLook) Dot Normal(Target.Velocity)) >= 0.71) && FastTrace(FireSpot, ProjStart) ); } else // make sure that bot isn't leading into a wall bClean = FastTrace(FireSpot, ProjStart); if ( !bClean) { // reduce amount of leading if ( FRand() < 0.3 ) FireSpot = Target.Location; else FireSpot = 0.5 * (FireSpot + Target.Location); } - } - bClean = false; //so will fail first check unless shooting at feet - // Randomly determine if we should try and splash damage with the fire projectile - if( FiredAmmunition.bTrySplash ) - { if( Skill < 2.0 ) { if(FRand() > 0.85) { bWantsToAimAtFeet = true; } } else if( Skill < 3.0 ) { if(FRand() > 0.5) { bWantsToAimAtFeet = true; } } else if( Skill >= 3.0 ) { if(FRand() > 0.25) { bWantsToAimAtFeet = true; } } - } - if ( FiredAmmunition.bTrySplash && (Pawn(Target) != none) && (((Target.Physics == PHYS_Falling) && (Pawn.Location.Z + 80 >= Target.Location.Z)) || ((Pawn.Location.Z + 19 >= Target.Location.Z) && (bDefendMelee || bWantsToAimAtFeet))) ) - { HitActor = Trace(HitLocation, HitNormal, FireSpot - vect(0,0,1) * (Target.CollisionHeight + 10), FireSpot, false); - bClean = (HitActor == none); if ( !bClean ) { FireSpot = HitLocation + vect(0,0,3); bClean = FastTrace(FireSpot, ProjStart); } else bClean = ( (Target.Physics == PHYS_Falling) && FastTrace(FireSpot, ProjStart) ); - } - if ( !bClean ) - { //try middle FireSpot.Z = Target.Location.Z; bClean = FastTrace(FireSpot, ProjStart); - } - if ( FiredAmmunition.bTossed && !bClean && bEnemyInfoValid ) - { FireSpot = LastSeenPos; HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); if ( HitActor != none ) { bCanFire = false; FireSpot += 2 * Target.CollisionHeight * HitNormal; } bClean = true; - } - if( !bClean ) - { // try head FireSpot.Z = Target.Location.Z + 0.9 * Target.CollisionHeight; bClean = FastTrace(FireSpot, ProjStart); - } - if ( !bClean && (Target == Enemy) && bEnemyInfoValid ) - { FireSpot = LastSeenPos; if ( Pawn.Location.Z >= LastSeenPos.Z ) FireSpot.Z -= 0.4 * Enemy.CollisionHeight; HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); if ( HitActor != none ) { FireSpot = LastSeenPos + 2 * Enemy.CollisionHeight * HitNormal; if ( Monster(Pawn).SplashDamage() && (Skill >= 4) ) { HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); if ( HitActor != none ) FireSpot += 2 * Enemy.CollisionHeight * HitNormal; } bCanFire = false; } - } - // adjust for toss distance - if ( FiredAmmunition.bTossed ) FireDir = AdjustToss(projspeed,ProjStart,FireSpot,true); - else FireDir = FireSpot - ProjStart; - FireRotation = Rotator(FireDir); - realYaw = FireRotation.Yaw; - InstantWarnTarget(Target,FiredAmmunition,vector(FireRotation)); - FireRotation.Yaw = SetFireYaw(FireRotation.Yaw + aimerror); - FireDir = vector(FireRotation); - // avoid shooting into wall - FireDist = FMin(VSize(FireSpot-ProjStart), 400); - FireSpot = ProjStart + FireDist * FireDir; - HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); - if ( HitActor != none ) - { if ( HitNormal.Z < 0.7 ) { FireRotation.Yaw = SetFireYaw(realYaw - aimerror); FireDir = vector(FireRotation); FireSpot = ProjStart + FireDist * FireDir; HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); } if ( HitActor != none ) { FireSpot += HitNormal * 2 * Target.CollisionHeight; if ( Skill >= 4 ) { HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); if ( HitActor != none ) FireSpot += Target.CollisionHeight * HitNormal; } FireDir = Normal(FireSpot - ProjStart); FireRotation = rotator(FireDir); } - } - SetRotation(FireRotation); - return FireRotation; -} -defaultproperties -{ -} +//============================================================================= +// HuskZombieController +//============================================================================= +// Controller class for the husk zombie +//============================================================================= +// Killing Floor Source +// Copyright (C) 2009 Tripwire Interactive LLC +// - John "Ramm-Jaeger" Gibson +//============================================================================= +class NiceZombieHuskController extends NiceMonsterController; +// Overridden to create a delay between when the husk fires his projectiles +function bool FireWeaponAt(Actor A) +{ + if ( A == none ) + A = Enemy; + if ( (A == none) || (Focus != A) ) + return false; + Target = A; + if( (VSize(A.Location - Pawn.Location) >= NiceZombieHusk(Pawn).MeleeRange + Pawn.CollisionRadius + Target.CollisionRadius) && + NiceZombieHusk(Pawn).NextFireProjectileTime - Level.TimeSeconds > 0 ) + { + return false; + } + Monster(Pawn).RangedAttack(Target); + return false; +} +/* +AdjustAim() +Returns a rotation which is the direction the bot should aim - after introducing the appropriate aiming error +Overridden to cause the zed to fire at the feet more often - Ramm +*/ +function rotator AdjustAim(FireProperties FiredAmmunition, vector projStart, int aimerror) +{ + local rotator FireRotation, TargetLook; + local float FireDist, TargetDist, ProjSpeed; + local actor HitActor; + local vector FireSpot, FireDir, TargetVel, HitLocation, HitNormal; + local int realYaw; + local bool bDefendMelee, bClean, bLeadTargetNow; + local bool bWantsToAimAtFeet; + if ( FiredAmmunition.ProjectileClass != none ) + projspeed = FiredAmmunition.ProjectileClass.default.speed; + // make sure bot has a valid target + if ( Target == none ) + { + Target = Enemy; + if ( Target == none ) + return Rotation; + } + FireSpot = Target.Location; + TargetDist = VSize(Target.Location - Pawn.Location); + // perfect aim at stationary objects + if ( Pawn(Target) == none ) + { + if ( !FiredAmmunition.bTossed ) + return rotator(Target.Location - projstart); + else + { + FireDir = AdjustToss(projspeed,ProjStart,Target.Location,true); + SetRotation(Rotator(FireDir)); + return Rotation; + } + } + bLeadTargetNow = FiredAmmunition.bLeadTarget && bLeadTarget; + bDefendMelee = ( (Target == Enemy) && DefendMelee(TargetDist) ); + aimerror = AdjustAimError(aimerror,TargetDist,bDefendMelee,FiredAmmunition.bInstantHit, bLeadTargetNow); + // lead target with non instant hit projectiles + if ( bLeadTargetNow ) + { + TargetVel = Target.Velocity; + // hack guess at projecting falling velocity of target + if ( Target.Physics == PHYS_Falling ) + { + if ( Target.PhysicsVolume.Gravity.Z <= Target.PhysicsVolume.Default.Gravity.Z ) + TargetVel.Z = FMin(TargetVel.Z + FMax(-400, Target.PhysicsVolume.Gravity.Z * FMin(1,TargetDist/projSpeed)),0); + else + TargetVel.Z = FMin(0, TargetVel.Z); + } + // more or less lead target (with some random variation) + FireSpot += FMin(1, 0.7 + 0.6 * FRand()) * TargetVel * TargetDist/projSpeed; + FireSpot.Z = FMin(Target.Location.Z, FireSpot.Z); + + if ( (Target.Physics != PHYS_Falling) && (FRand() < 0.55) && (VSize(FireSpot - ProjStart) > 1000) ) + { + // don't always lead far away targets, especially if they are moving sideways with respect to the bot + TargetLook = Target.Rotation; + if ( Target.Physics == PHYS_Walking ) + TargetLook.Pitch = 0; + bClean = ( ((Vector(TargetLook) Dot Normal(Target.Velocity)) >= 0.71) && FastTrace(FireSpot, ProjStart) ); + } + else // make sure that bot isn't leading into a wall + bClean = FastTrace(FireSpot, ProjStart); + if ( !bClean) + { + // reduce amount of leading + if ( FRand() < 0.3 ) + FireSpot = Target.Location; + else + FireSpot = 0.5 * (FireSpot + Target.Location); + } + } + bClean = false; //so will fail first check unless shooting at feet + // Randomly determine if we should try and splash damage with the fire projectile + if( FiredAmmunition.bTrySplash ) + { + if( Skill < 2.0 ) + { + if(FRand() > 0.85) + { + bWantsToAimAtFeet = true; + } + } + else if( Skill < 3.0 ) + { + if(FRand() > 0.5) + { + bWantsToAimAtFeet = true; + } + } + else if( Skill >= 3.0 ) + { + if(FRand() > 0.25) + { + bWantsToAimAtFeet = true; + } + } + } + if ( FiredAmmunition.bTrySplash && (Pawn(Target) != none) && (((Target.Physics == PHYS_Falling) + && (Pawn.Location.Z + 80 >= Target.Location.Z)) || ((Pawn.Location.Z + 19 >= Target.Location.Z) + && (bDefendMelee || bWantsToAimAtFeet))) ) + { + HitActor = Trace(HitLocation, HitNormal, FireSpot - vect(0,0,1) * (Target.CollisionHeight + 10), FireSpot, false); + + bClean = (HitActor == none); + if ( !bClean ) + { + FireSpot = HitLocation + vect(0,0,3); + bClean = FastTrace(FireSpot, ProjStart); + } + else + bClean = ( (Target.Physics == PHYS_Falling) && FastTrace(FireSpot, ProjStart) ); + } + if ( !bClean ) + { + //try middle + FireSpot.Z = Target.Location.Z; + bClean = FastTrace(FireSpot, ProjStart); + } + if ( FiredAmmunition.bTossed && !bClean && bEnemyInfoValid ) + { + FireSpot = LastSeenPos; + HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); + if ( HitActor != none ) + { + bCanFire = false; + FireSpot += 2 * Target.CollisionHeight * HitNormal; + } + bClean = true; + } + if( !bClean ) + { + // try head + FireSpot.Z = Target.Location.Z + 0.9 * Target.CollisionHeight; + bClean = FastTrace(FireSpot, ProjStart); + } + if ( !bClean && (Target == Enemy) && bEnemyInfoValid ) + { + FireSpot = LastSeenPos; + if ( Pawn.Location.Z >= LastSeenPos.Z ) + FireSpot.Z -= 0.4 * Enemy.CollisionHeight; + HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); + if ( HitActor != none ) + { + FireSpot = LastSeenPos + 2 * Enemy.CollisionHeight * HitNormal; + if ( Monster(Pawn).SplashDamage() && (Skill >= 4) ) + { + HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); + if ( HitActor != none ) + FireSpot += 2 * Enemy.CollisionHeight * HitNormal; + } + bCanFire = false; + } + } + // adjust for toss distance + if ( FiredAmmunition.bTossed ) + FireDir = AdjustToss(projspeed,ProjStart,FireSpot,true); + else + FireDir = FireSpot - ProjStart; + FireRotation = Rotator(FireDir); + realYaw = FireRotation.Yaw; + InstantWarnTarget(Target,FiredAmmunition,vector(FireRotation)); + FireRotation.Yaw = SetFireYaw(FireRotation.Yaw + aimerror); + FireDir = vector(FireRotation); + // avoid shooting into wall + FireDist = FMin(VSize(FireSpot-ProjStart), 400); + FireSpot = ProjStart + FireDist * FireDir; + HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); + if ( HitActor != none ) + { + if ( HitNormal.Z < 0.7 ) + { + FireRotation.Yaw = SetFireYaw(realYaw - aimerror); + FireDir = vector(FireRotation); + FireSpot = ProjStart + FireDist * FireDir; + HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); + } + if ( HitActor != none ) + { + FireSpot += HitNormal * 2 * Target.CollisionHeight; + if ( Skill >= 4 ) + { + HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false); + if ( HitActor != none ) + FireSpot += Target.CollisionHeight * HitNormal; + } + FireDir = Normal(FireSpot - ProjStart); + FireRotation = rotator(FireDir); + } + } + SetRotation(FireRotation); + return FireRotation; +} +defaultproperties +{ +} diff --git a/sources/Zeds/Nice/NiceZombieJason.uc b/sources/Zeds/Nice/NiceZombieJason.uc index 1fdcbcc..a25275b 100644 --- a/sources/Zeds/Nice/NiceZombieJason.uc +++ b/sources/Zeds/Nice/NiceZombieJason.uc @@ -1,83 +1,180 @@ -class NiceZombieJason extends NiceZombieScrake; -#exec load obj file=ScrnZedPack_T.utx -#exec load obj file=ScrnZedPack_S.uax -#exec load obj file=ScrnZedPack_A.ukx -var int OriginalMeleeDamage; // default melee damage, adjusted by game's difficulty -var bool bWasRaged; // set to true, if Jason is raged or was raged before -var float RageHealthPct; -var float RegenDelay; -var float RegenRate; // Speed of regeneration, in percents of max health -var float RegenAcc; -var float RegenAccHead; -simulated function PostBeginPlay(){ - super.PostBeginPlay(); - OriginalMeleeDamage = MeleeDamage; -} -function bool IsStunPossible(){ - return false; -} -function bool CheckMiniFlinch(int flinchScore, Pawn instigatedBy, Vector hitLocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI){ - return super.CheckMiniFlinch(flinchScore * 1.5, instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); -} -simulated function Tick(float DeltaTime){ - super.Tick(DeltaTime); - if(Role < ROLE_Authority) return; - if(lastTookDamageTime + RegenDelay < Level.TimeSeconds && Health > 0){ RegenAcc += DeltaTime * RegenRate * HealthMax * 0.01; RegenAccHead += DeltaTime * RegenRate * HeadHealthMax * 0.01; if(RegenAcc > 1){ Health += RegenAcc; if(Health > HealthMax) Health = HealthMax; RegenAcc = 0.0; } if(RegenAccHead > 1){ HeadHealth += RegenAccHead; if(HeadHealth > HeadHealthMax) HeadHealth = HeadHealthMax; RegenAccHead = 0.0; } - } - else{ RegenAcc = 0.0; RegenAccHead = 0.0; - } -} -// Machete has no Exhaust ;) -simulated function SpawnExhaustEmitter(){} -simulated function UpdateExhaustEmitter(){} -function bool CanGetOutOfWay() -{ - return !bIsStunned; // can't dodge husk fireballs while stunned -} -simulated function Unstun(){ - bCharging = true; - MovementAnims[0] = 'ChargeF'; - super.Unstun(); -} -function TakeDamageClient(int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, float headshotLevel, float lockonTime){ - Super.TakeDamageClient(Damage, instigatedBy, hitLocation, momentum, damageType, headshotLevel, lockonTime); - if(bIsStunned && Health > 0 && (headshotLevel <= 0.0) && Level.TimeSeconds > LastStunTime + 0.1) Unstun(); -} -function TakeFireDamage(int Damage, Pawn Instigator){ - Super.TakeFireDamage(Damage, Instigator); - if(bIsStunned && Health > 0 && Damage > 150 && Level.TimeSeconds > LastStunTime + 0.1) Unstun(); -} -function RangedAttack(Actor A) -{ - if ( bShotAnim || Physics == PHYS_Swimming) return; - else if ( CanAttack(A) ) - { bShotAnim = true; SetAnimAction(MeleeAnims[Rand(2)]); if(NiceMonster(A) == none) GoToState('SawingLoop'); - } - if( !bShotAnim && !bDecapitated ) { if(bConfusedState) return; if ( bWasRaged || float(Health)/HealthMax < 0.5 || (float(Health)/HealthMax < RageHealthPct) ) GoToState('RunningState'); - } -} -State SawingLoop -{ - function RangedAttack(Actor A) - { if ( bShotAnim ) return; else if ( CanAttack(A) ) { Acceleration = vect(0,0,0); bShotAnim = true; MeleeDamage = OriginalMeleeDamage * 0.6; SetAnimAction('SawImpaleLoop'); if( AmbientSound != SawAttackLoopSound ) { AmbientSound=SawAttackLoopSound; } } else GoToState(''); - } -} -simulated function float GetOriginalGroundSpeed() -{ - local float result; - result = OriginalGroundSpeed; - if ( bWasRaged || bCharging ) result *= 3.5; - else if( bZedUnderControl ) result *= 1.25; return result; -} -state RunningState -{ - function BeginState() - { local NiceHumanPawn rageTarget; bWasRaged = true; if(bWasCalm){ bWasCalm = false; rageTarget = NiceHumanPawn(Controller.focus); if( rageTarget != none && KFGameType(Level.Game) != none && class'NiceVeterancyTypes'.static.HasSkill(NicePlayerController(rageTarget.Controller), class'NiceSkillCommandoPerfectExecution') ){ KFGameType(Level.Game).DramaticEvent(1.0); } } if( bZapped ) GoToState(''); else { bCharging = true; SetGroundSpeed(GetOriginalGroundSpeed()); if( Level.NetMode!=NM_DedicatedServer ) PostNetReceive(); NetUpdateTime = Level.TimeSeconds - 1; } - } - function EndState() - { bCharging = False; if( !bZapped ) SetGroundSpeed(GetOriginalGroundSpeed()); if( Level.NetMode!=NM_DedicatedServer ) PostNetReceive(); - } -} -defaultproperties -{ RageHealthPct=0.750000 RegenDelay=5.000000 RegenRate=4.000000 SawAttackLoopSound=Sound'KF_BaseGorefast.Attack.Gorefast_AttackSwish3' ChainSawOffSound=None StunThreshold=1.000000 MoanVoice=None StunsRemaining=5 BleedOutDuration=7.000000 MeleeDamage=25 MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_HitPlayer' JumpSound=None HeadHealth=800.000000 HitSound(0)=None DeathSound(0)=None ChallengeSound(0)=None ChallengeSound(1)=None ChallengeSound(2)=None ChallengeSound(3)=None ScoringValue=300 MenuName="Jason" AmbientSound=Sound'ScrnZedPack_S.Jason.Jason_Sound' Mesh=SkeletalMesh'ScrnZedPack_A.JasonMesh' Skins(0)=Shader'ScrnZedPack_T.Jason.Jason__FB' Skins(1)=Texture'ScrnZedPack_T.Jason.JVMaskB' Skins(2)=Combiner'ScrnZedPack_T.Jason.Machete_cmb' -} +class NiceZombieJason extends NiceZombieScrake; +#exec load obj file=ScrnZedPack_T.utx +#exec load obj file=ScrnZedPack_S.uax +#exec load obj file=ScrnZedPack_A.ukx +var int OriginalMeleeDamage; // default melee damage, adjusted by game's difficulty +var bool bWasRaged; // set to true, if Jason is raged or was raged before +var float RageHealthPct; +var float RegenDelay; +var float RegenRate; // Speed of regeneration, in percents of max health +var float RegenAcc; +var float RegenAccHead; +simulated function PostBeginPlay(){ + super.PostBeginPlay(); + OriginalMeleeDamage = MeleeDamage; +} +function bool IsStunPossible(){ + return false; +} +function bool CheckMiniFlinch(int flinchScore, Pawn instigatedBy, Vector hitLocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI){ + return super.CheckMiniFlinch(flinchScore * 1.5, instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); +} +simulated function Tick(float DeltaTime){ + super.Tick(DeltaTime); + if(Role < ROLE_Authority) + return; + if(lastTookDamageTime + RegenDelay < Level.TimeSeconds && Health > 0){ + RegenAcc += DeltaTime * RegenRate * HealthMax * 0.01; + RegenAccHead += DeltaTime * RegenRate * HeadHealthMax * 0.01; + if(RegenAcc > 1){ + Health += RegenAcc; + if(Health > HealthMax) + Health = HealthMax; + RegenAcc = 0.0; + } + if(RegenAccHead > 1){ + HeadHealth += RegenAccHead; + if(HeadHealth > HeadHealthMax) + HeadHealth = HeadHealthMax; + RegenAccHead = 0.0; + } + } + else{ + RegenAcc = 0.0; + RegenAccHead = 0.0; + } +} +// Machete has no Exhaust ;) +simulated function SpawnExhaustEmitter(){} +simulated function UpdateExhaustEmitter(){} +function bool CanGetOutOfWay() +{ + return !bIsStunned; // can't dodge husk fireballs while stunned +} +simulated function Unstun(){ + bCharging = true; + MovementAnims[0] = 'ChargeF'; + super.Unstun(); +} +function TakeDamageClient(int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, float headshotLevel, float lockonTime){ + Super.TakeDamageClient(Damage, instigatedBy, hitLocation, momentum, damageType, headshotLevel, lockonTime); + if(bIsStunned && Health > 0 && (headshotLevel <= 0.0) && Level.TimeSeconds > LastStunTime + 0.1) + Unstun(); +} +function TakeFireDamage(int Damage, Pawn Instigator){ + Super.TakeFireDamage(Damage, Instigator); + if(bIsStunned && Health > 0 && Damage > 150 && Level.TimeSeconds > LastStunTime + 0.1) + Unstun(); +} +function RangedAttack(Actor A) +{ + if ( bShotAnim || Physics == PHYS_Swimming) + return; + else if ( CanAttack(A) ) + { + bShotAnim = true; + SetAnimAction(MeleeAnims[Rand(2)]); + if(NiceMonster(A) == none) + GoToState('SawingLoop'); + } + if( !bShotAnim && !bDecapitated ) { + if(bConfusedState) + return; + if ( bWasRaged || float(Health)/HealthMax < 0.5 + || (float(Health)/HealthMax < RageHealthPct) ) + GoToState('RunningState'); + } +} +State SawingLoop +{ + function RangedAttack(Actor A) + { + if ( bShotAnim ) + return; + else if ( CanAttack(A) ) + { + Acceleration = vect(0,0,0); + bShotAnim = true; + MeleeDamage = OriginalMeleeDamage * 0.6; + SetAnimAction('SawImpaleLoop'); + if( AmbientSound != SawAttackLoopSound ) + { + AmbientSound=SawAttackLoopSound; + } + } + else GoToState(''); + } +} +simulated function float GetOriginalGroundSpeed() +{ + local float result; + result = OriginalGroundSpeed; + if ( bWasRaged || bCharging ) + result *= 3.5; + else if( bZedUnderControl ) + result *= 1.25; + return result; +} +state RunningState +{ + function BeginState() + { + local NiceHumanPawn rageTarget; + bWasRaged = true; + if(bWasCalm){ + bWasCalm = false; + rageTarget = NiceHumanPawn(Controller.focus); + if( rageTarget != none && KFGameType(Level.Game) != none + && class'NiceVeterancyTypes'.static.HasSkill(NicePlayerController(rageTarget.Controller), + class'NiceSkillCommandoPerfectExecution') ){ + KFGameType(Level.Game).DramaticEvent(1.0); + } + } + if( bZapped ) + GoToState(''); + else { + bCharging = true; + SetGroundSpeed(GetOriginalGroundSpeed()); + if( Level.NetMode!=NM_DedicatedServer ) + PostNetReceive(); + NetUpdateTime = Level.TimeSeconds - 1; + } + } + function EndState() + { + bCharging = False; + if( !bZapped ) + SetGroundSpeed(GetOriginalGroundSpeed()); + if( Level.NetMode!=NM_DedicatedServer ) + PostNetReceive(); + } +} +defaultproperties +{ + RageHealthPct=0.750000 + RegenDelay=5.000000 + RegenRate=4.000000 + SawAttackLoopSound=Sound'KF_BaseGorefast.Attack.Gorefast_AttackSwish3' + ChainSawOffSound=None + StunThreshold=1.000000 + MoanVoice=None + StunsRemaining=5 + BleedOutDuration=7.000000 + MeleeDamage=25 + MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_HitPlayer' + JumpSound=None + HeadHealth=800.000000 + HitSound(0)=None + DeathSound(0)=None + ChallengeSound(0)=None + ChallengeSound(1)=None + ChallengeSound(2)=None + ChallengeSound(3)=None + ScoringValue=300 + MenuName="Jason" + AmbientSound=Sound'ScrnZedPack_S.Jason.Jason_Sound' + Mesh=SkeletalMesh'ScrnZedPack_A.JasonMesh' + Skins(0)=Shader'ScrnZedPack_T.Jason.Jason__FB' + Skins(1)=Texture'ScrnZedPack_T.Jason.JVMaskB' + Skins(2)=Combiner'ScrnZedPack_T.Jason.Machete_cmb' +} diff --git a/sources/Zeds/Nice/NiceZombieScrake.uc b/sources/Zeds/Nice/NiceZombieScrake.uc index 55e5abf..ca10666 100644 --- a/sources/Zeds/Nice/NiceZombieScrake.uc +++ b/sources/Zeds/Nice/NiceZombieScrake.uc @@ -1,297 +1,657 @@ -// Chainsaw Zombie Monster for KF Invasion gametype -// He's not quite as speedy as the other Zombies, But his attacks are TRULY damaging. -class NiceZombieScrake extends NiceZombieScrakeBase; -var bool bConfusedState; -var bool bWasCalm; -//---------------------------------------------------------------------------- -// NOTE: All Variables are declared in the base class to eliminate hitching -//---------------------------------------------------------------------------- -simulated function PostNetBeginPlay() -{ - EnableChannelNotify ( 1,1); - AnimBlendParams(1, 1.0, 0.0,, SpineBone1); - super.PostNetBeginPlay(); -} -simulated function PostBeginPlay() -{ - super.PostBeginPlay(); - bWasCalm = true; - SpawnExhaustEmitter(); -} -// Make the scrakes's ambient scale higher, since there are just a few, and thier chainsaw need to be heard from a distance -simulated function CalcAmbientRelevancyScale() -{ - // Make the zed only relevant by their ambient sound out to a range of 30 meters - CustomAmbientRelevancyScale = 1500 / (100 * SoundRadius); -} -simulated function PostNetReceive() -{ - if (bCharging) MovementAnims[0]='ChargeF'; - else if( !(bCrispified && bBurnified) ) MovementAnims[0]=default.MovementAnims[0]; -} -// Deprecated -function bool FlipOverWithIntsigator(Pawn InstigatedBy){ - local bool bFlippedOver; - bFlippedOver = super.FlipOverWithIntsigator(InstigatedBy); - if(bFlippedOver){ // do not rotate while stunned Controller.Focus = none; Controller.FocalPoint = Location + 512*vector(Rotation); - } - return bFlippedOver; -} -function bool CanGetOutOfWay() -{ - return false; -} -function float GetIceCrustScale(){ - //return 25000 / (default.health * default.health); - return 0.01; -} -// This zed has been taken control of. Boost its health and speed -function SetMindControlled(bool bNewMindControlled) -{ - if( bNewMindControlled ) - { NumZCDHits++; - // if we hit him a couple of times, make him rage! if( NumZCDHits > 1 ) { if( !IsInState('RunningToMarker') ) { GotoState('RunningToMarker'); } else { NumZCDHits = 1; if( IsInState('RunningToMarker') ) { GotoState(''); } } } else { if( IsInState('RunningToMarker') ) { GotoState(''); } } - if( bNewMindControlled != bZedUnderControl ) { SetGroundSpeed(OriginalGroundSpeed * 1.25); Health *= 1.25; HealthMax *= 1.25; } - } - else - { NumZCDHits=0; - } - bZedUnderControl = bNewMindControlled; -} -// Handle the zed being commanded to move to a new location -function GivenNewMarker() -{ - if( bCharging && NumZCDHits > 1 ) - { GotoState('RunningToMarker'); - } - else - { GotoState(''); - } -} -simulated function SpawnExhaustEmitter() -{ - if ( Level.NetMode != NM_DedicatedServer ) - { if ( ExhaustEffectClass != none ) { ExhaustEffect = Spawn(ExhaustEffectClass, self); - if ( ExhaustEffect != none ) { AttachToBone(ExhaustEffect, 'Chainsaw_lod1'); ExhaustEffect.SetRelativeLocation(vect(0, -20, 0)); } } - } -} -simulated function UpdateExhaustEmitter() -{ - local byte Throttle; - if ( Level.NetMode != NM_DedicatedServer ) - { if ( ExhaustEffect != none ) { if ( bShotAnim ) { Throttle = 3; } else { Throttle = 0; } } else { if ( !bNoExhaustRespawn ) { SpawnExhaustEmitter(); } } - } -} -simulated function Tick(float DeltaTime) -{ - super.Tick(DeltaTime); - UpdateExhaustEmitter(); -} -function RangedAttack(Actor A) -{ - if ( bShotAnim || Physics == PHYS_Swimming) return; - else if ( CanAttack(A) ) - { bShotAnim = true; SetAnimAction(MeleeAnims[Rand(2)]); //PlaySound(sound'Claw2s', SLOT_none); KFTODO: Replace this if(NiceMonster(A) == none) GoToState('SawingLoop'); - } - if( !bShotAnim && !bDecapitated ) - { if(bConfusedState) return; if ( float(Health)/HealthMax < 0.75) GoToState('RunningState'); - } -} -state RunningState -{ - // Set the zed to the zapped behavior - simulated function SetZappedBehavior() - { Global.SetZappedBehavior(); GoToState(''); - } - // Don't override speed in this state - function bool CanSpeedAdjust() - { return false; - } - simulated function float GetOriginalGroundSpeed() { return 3.5 * OriginalGroundSpeed; - } - function BeginState(){ local NiceHumanPawn rageTarget, rageCause; - if(Health <= 0) return; - if(bWasCalm){ bWasCalm = false; rageTarget = NiceHumanPawn(Controller.focus); rageCause = NiceHumanPawn(LastDamagedBy); if( rageTarget != none && KFGameType(Level.Game) != none && class'NiceVeterancyTypes'.static.HasSkill(NicePlayerController(rageTarget.Controller), class'NiceSkillCommandoPerfectExecution') ){ KFGameType(Level.Game).DramaticEvent(1.0); } else if( rageCause != none && KFGameType(Level.Game) != none && class'NiceVeterancyTypes'.static.HasSkill(NicePlayerController(rageCause.Controller), class'NiceSkillCommandoPerfectExecution') ){ KFGameType(Level.Game).DramaticEvent(1.0); } } if(bZapped) GoToState(''); else{ SetGroundSpeed(OriginalGroundSpeed * 3.5); bCharging = true; if( Level.NetMode!=NM_DedicatedServer ) PostNetReceive(); - NetUpdateTime = Level.TimeSeconds - 1; } - } - function EndState() - { if( !bZapped ) { SetGroundSpeed(GetOriginalGroundSpeed()); } bCharging = False; if( Level.NetMode!=NM_DedicatedServer ) PostNetReceive(); - } - function RemoveHead() - { GoToState(''); Global.RemoveHead(); - } - function RangedAttack(Actor A) - { if ( bShotAnim || Physics == PHYS_Swimming) return; else if ( CanAttack(A) ) { bShotAnim = true; SetAnimAction(MeleeAnims[Rand(2)]); if(NiceMonster(A) == none) GoToState('SawingLoop'); } - } -} -// State where the zed is charging to a marked location. -// Not sure if we need this since its just like RageCharging, -// but keeping it here for now in case we need to implement some -// custom behavior for this state -state RunningToMarker extends RunningState -{ -} - -State SawingLoop -{ - // Don't override speed in this state - function bool CanSpeedAdjust() - { return false; - } - simulated function float GetOriginalGroundSpeed() { return OriginalGroundSpeed * AttackChargeRate; - } - function bool CanGetOutOfWay() - { return false; - } - function BeginState() - { bConfusedState = false; - // Randomly have the scrake charge during an attack so it will be less predictable if(Health/HealthMax < 0.5 || FRand() <= 0.95) { SetGroundSpeed(OriginalGroundSpeed * AttackChargeRate); bCharging = true; if( Level.NetMode!=NM_DedicatedServer ) PostNetReceive(); - NetUpdateTime = Level.TimeSeconds - 1; } - } - function RangedAttack(Actor A) - { if ( bShotAnim ) return; else if ( CanAttack(A) ) { Acceleration = vect(0,0,0); bShotAnim = true; MeleeDamage = default.MeleeDamage*0.6; SetAnimAction('SawImpaleLoop'); if( AmbientSound != SawAttackLoopSound ) { AmbientSound=SawAttackLoopSound; } } else GoToState(''); - } - function AnimEnd( int Channel ) - { Super.AnimEnd(Channel); if( Controller!=none && Controller.Enemy!=none ) RangedAttack(Controller.Enemy); // Keep on attacking if possible. - } - function Tick( float Delta ) - { // Keep the scrake moving toward its target when attacking if( Role == ROLE_Authority && bShotAnim && !bWaitForAnim ) { if( LookTarget!=none ) { Acceleration = AccelRate * Normal(LookTarget.Location - Location); } } - global.Tick(Delta); - } - function EndState() - { AmbientSound=default.AmbientSound; MeleeDamage = Max( DifficultyDamageModifer() * default.MeleeDamage, 1 ); - SetGroundSpeed(GetOriginalGroundSpeed()); bCharging = False; if(Level.NetMode != NM_DedicatedServer) PostNetReceive(); - } -} -function ModDamage(out int Damage, Pawn instigatedBy, Vector hitLocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI, optional float lockonTime){ - super.ModDamage(Damage, instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); - if(damageType == class'ScrnZedPack.DamTypeEMP') Damage *= 0.01; -} -function TakeDamageClient(int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, float headshotLevel, float lockonTime){ - local bool bCanGetConfused; - local int OldHealth; - local PlayerController PC; - local KFSteamStatsAndAchievements Stats; - OldHealth = Health; - bCanGetConfused = false; - if(StunsRemaining != 0 && float(Health)/HealthMax >= 0.75) bCanGetConfused = true; - super.takeDamageClient(Damage, instigatedBy, hitLocation, momentum, damageType, headshotLevel, lockonTime); - if ( bCanGetConfused && !IsInState('SawingLoop') && (OldHealth - Health) <= (float(default.Health)/1.5) && float(Health)/HealthMax < 0.75 && (LastDamageAmount >= (0.5 * default.Health) || (VSize(LastDamagedBy.Location - Location) <= (MeleeRange * 2) && ClassIsChildOf(LastDamagedbyType,class 'DamTypeMelee') && KFPawn(LastDamagedBy) != none && LastDamageAmount > (0.10 * default.Health))) ) bConfusedState = true; - if(bConfusedState && Health > 0 && (headshotLevel <= 0.0) && damageType != none){ bConfusedState = false; GoToState('RunningState'); - } - if(!bConfusedState && !IsInState('SawingLoop') && !IsInState('RunningState') && float(Health) / HealthMax < 0.75) RangedAttack(InstigatedBy); - if(damageType == class'DamTypeDBShotgun'){ PC = PlayerController( InstigatedBy.Controller ); if(PC != none){ Stats = KFSteamStatsAndAchievements( PC.SteamStatsAndAchievements ); if( Stats != none ) Stats.CheckAndSetAchievementComplete( Stats.KFACHIEVEMENT_PushScrakeSPJ ); } - } -} -function TakeFireDamage(int Damage, Pawn Instigator) -{ - Super.TakeFireDamage(Damage, Instigator); - if(bConfusedState && Health > 0 && Damage > 150){ bConfusedState = false; GoToState('RunningState'); - } -} -function bool CheckMiniFlinch(int flinchScore, Pawn instigatedBy, Vector hitLocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI){ - // Scrakes are better at enduring pain, so we need a bit more to flinch them - if(StunsRemaining == 0 || flinchScore < 150) return false; - return super.CheckMiniFlinch(flinchScore, instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); -} -function DoStun(optional Pawn instigatedBy, optional Vector hitLocation, optional Vector momentum, optional class damageType, optional float headshotLevel, optional KFPlayerReplicationInfo KFPRI){ - super.DoStun(instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); - StunsRemaining = 0; -} -simulated function int DoAnimAction( name AnimName ) -{ - if( AnimName=='SawZombieAttack1' || AnimName=='SawZombieAttack2' ) - { AnimBlendParams(1, 1.0, 0.0,, FireRootBone); PlayAnim(AnimName,, 0.1, 1); Return 1; - } - Return Super.DoAnimAction(AnimName); -} -simulated event SetAnimAction(name NewAction) -{ - local int meleeAnimIndex; - if( NewAction=='' ) Return; - if(NewAction == 'Claw') - { meleeAnimIndex = Rand(3); NewAction = meleeAnims[meleeAnimIndex]; - } - ExpectingChannel = DoAnimAction(NewAction); - if( AnimNeedsWait(NewAction) ) - { bWaitForAnim = true; - } - if( Level.NetMode!=NM_Client ) - { AnimAction = NewAction; bResetAnimAct = True; ResetAnimActTime = Level.TimeSeconds+0.3; - } -} -// The animation is full body and should set the bWaitForAnim flag -simulated function bool AnimNeedsWait(name TestAnim) -{ - if( TestAnim == 'SawImpaleLoop' || TestAnim == 'DoorBash' || TestAnim == 'KnockDown' ) - { return true; - } - return false; -} -function PlayDyingSound() -{ - if( Level.NetMode!=NM_Client ) - { if ( bGibbed ) { // Do nothing for now PlaySound(GibGroupClass.static.GibSound(), SLOT_Pain,2.0,true,525); return; } - if( bDecapitated ) { - PlaySound(HeadlessDeathSound, SLOT_Pain,1.30,true,525); } else { PlaySound(DeathSound[0], SLOT_Pain,1.30,true,525); } - PlaySound(ChainSawOffSound, SLOT_Misc, 2.0,,525.0); - } -} -function Died(Controller Killer, class damageType, vector HitLocation) -{ - AmbientSound = none; - if ( ExhaustEffect != none ) - { ExhaustEffect.Destroy(); ExhaustEffect = none; bNoExhaustRespawn = true; - } - super.Died( Killer, damageType, HitLocation ); -} -simulated function ProcessHitFX() -{ - local Coords boneCoords; - local class HitEffects[4]; - local int i,j; - local float GibPerterbation; - if( (Level.NetMode == NM_DedicatedServer) || bSkeletized || (Mesh == SkeletonMesh)) - { SimHitFxTicker = HitFxTicker; return; - } - for ( SimHitFxTicker = SimHitFxTicker; SimHitFxTicker != HitFxTicker; SimHitFxTicker = (SimHitFxTicker + 1) % ArrayCount(HitFX) ) - { j++; if ( j > 30 ) { SimHitFxTicker = HitFxTicker; return; } - if( (HitFX[SimHitFxTicker].damtype == none) || (Level.bDropDetail && (Level.TimeSeconds - LastRenderTime > 3) && !IsHumanControlled()) ) continue; - //log("Processing effects for damtype "$HitFX[SimHitFxTicker].damtype); - if( HitFX[SimHitFxTicker].bone == 'obliterate' && !class'GameInfo'.static.UseLowGore()) { SpawnGibs( HitFX[SimHitFxTicker].rotDir, 1); bGibbed = true; // Wait a tick on a listen server so the obliteration can replicate before the pawn is destroyed if( Level.NetMode == NM_ListenServer ) { bDestroyNextTick = true; TimeSetDestroyNextTickTime = Level.TimeSeconds; } else { Destroy(); } return; } - boneCoords = GetBoneCoords( HitFX[SimHitFxTicker].bone ); - if ( !Level.bDropDetail && !class'GameInfo'.static.NoBlood() && !bSkeletized && !class'GameInfo'.static.UseLowGore() ) { //AttachEmitterEffect( BleedingEmitterClass, HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); - HitFX[SimHitFxTicker].damtype.static.GetHitEffects( HitEffects, Health ); - if( !PhysicsVolume.bWaterVolume ) // don't attach effects under water { for( i = 0; i < ArrayCount(HitEffects); i++ ) { if( HitEffects[i] == none ) continue; - AttachEffect( HitEffects[i], HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); } } } if ( class'GameInfo'.static.UseLowGore() ) HitFX[SimHitFxTicker].bSever = false; - if( HitFX[SimHitFxTicker].bSever ) { GibPerterbation = HitFX[SimHitFxTicker].damtype.default.GibPerterbation; - switch( HitFX[SimHitFxTicker].bone ) { case 'obliterate': break; - case LeftThighBone: if( !bLeftLegGibbed ) { SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; bLeftLegGibbed=true; } break; - case RightThighBone: if( !bRightLegGibbed ) { SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; bRightLegGibbed=true; } break; - case LeftFArmBone: if( !bLeftArmGibbed ) { SpawnSeveredGiblet( DetachedArmClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ;; bLeftArmGibbed=true; } break; - case RightFArmBone: if( !bRightArmGibbed ) { SpawnSeveredGiblet( DetachedSpecialArmClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; bRightArmGibbed=true; } break; - case 'head': if( !bHeadGibbed ) { if ( HitFX[SimHitFxTicker].damtype == class'DamTypeDecapitation' ) { DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false); } else if( HitFX[SimHitFxTicker].damtype == class'DamTypeProjectileDecap' ) { DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false, true); } else if( HitFX[SimHitFxTicker].damtype == class'DamTypeMeleeDecapitation' ) { DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, true); } - bHeadGibbed=true; } break; } - if( HitFX[SimHitFXTicker].bone != 'Spine' && HitFX[SimHitFXTicker].bone != FireRootBone && HitFX[SimHitFXTicker].bone != 'head' && Health <=0 ) HideBone(HitFX[SimHitFxTicker].bone); } - } -} -// Maybe spawn some chunks when the player gets obliterated -simulated function SpawnGibs(Rotator HitRotation, float ChunkPerterbation) -{ - if ( ExhaustEffect != none ) - { ExhaustEffect.Destroy(); ExhaustEffect = none; bNoExhaustRespawn = true; - } - super.SpawnGibs(HitRotation,ChunkPerterbation); -} -static simulated function PreCacheMaterials(LevelInfo myLevel) -{//should be derived and used. - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.scrake_env_cmb'); - myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.scrake_diff'); - myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.scrake_spec'); - myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.scrake_saw_panner'); - myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.scrake_FB'); - myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.Chainsaw_blade_diff'); -} -defaultproperties -{ SawAttackLoopSound=Sound'KF_BaseScrake.Chainsaw.Scrake_Chainsaw_Impale' ChainSawOffSound=SoundGroup'KF_ChainsawSnd.Chainsaw_Deselect' remainingStuns=1 stunLoopStart=0.240000 stunLoopEnd=0.820000 idleInsertFrame=0.900000 EventClasses(0)="NicePack.NiceZombieScrake" MoanVoice=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Talk' MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Chainsaw_HitPlayer' JumpSound=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Jump' DetachedArmClass=Class'KFChar.SeveredArmScrake' DetachedLegClass=Class'KFChar.SeveredLegScrake' DetachedHeadClass=Class'KFChar.SeveredHeadScrake' DetachedSpecialArmClass=Class'KFChar.SeveredArmScrakeSaw' HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Pain' DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Death' ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Challenge' ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Challenge' ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Challenge' ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Challenge' ControllerClass=Class'NicePack.NiceZombieScrakeController' AmbientSound=Sound'KF_BaseScrake.Chainsaw.Scrake_Chainsaw_Idle' Mesh=SkeletalMesh'KF_Freaks_Trip.Scrake_Freak' Skins(0)=Shader'KF_Specimens_Trip_T.scrake_FB' Skins(1)=TexPanner'KF_Specimens_Trip_T.scrake_saw_panner' -} +// Chainsaw Zombie Monster for KF Invasion gametype +// He's not quite as speedy as the other Zombies, But his attacks are TRULY damaging. +class NiceZombieScrake extends NiceZombieScrakeBase; +var bool bConfusedState; +var bool bWasCalm; +//---------------------------------------------------------------------------- +// NOTE: All Variables are declared in the base class to eliminate hitching +//---------------------------------------------------------------------------- +simulated function PostNetBeginPlay() +{ + EnableChannelNotify ( 1,1); + AnimBlendParams(1, 1.0, 0.0,, SpineBone1); + super.PostNetBeginPlay(); +} +simulated function PostBeginPlay() +{ + super.PostBeginPlay(); + bWasCalm = true; + SpawnExhaustEmitter(); +} +// Make the scrakes's ambient scale higher, since there are just a few, and thier chainsaw need to be heard from a distance +simulated function CalcAmbientRelevancyScale() +{ + // Make the zed only relevant by their ambient sound out to a range of 30 meters + CustomAmbientRelevancyScale = 1500 / (100 * SoundRadius); +} +simulated function PostNetReceive() +{ + if (bCharging) + MovementAnims[0]='ChargeF'; + else if( !(bCrispified && bBurnified) ) + MovementAnims[0]=default.MovementAnims[0]; +} +// Deprecated +function bool FlipOverWithIntsigator(Pawn InstigatedBy){ + local bool bFlippedOver; + bFlippedOver = super.FlipOverWithIntsigator(InstigatedBy); + if(bFlippedOver){ + // do not rotate while stunned + Controller.Focus = none; + Controller.FocalPoint = Location + 512*vector(Rotation); + } + return bFlippedOver; +} +function bool CanGetOutOfWay() +{ + return false; +} +function float GetIceCrustScale(){ + //return 25000 / (default.health * default.health); + return 0.01; +} +// This zed has been taken control of. Boost its health and speed +function SetMindControlled(bool bNewMindControlled) +{ + if( bNewMindControlled ) + { + NumZCDHits++; + + // if we hit him a couple of times, make him rage! + if( NumZCDHits > 1 ) + { + if( !IsInState('RunningToMarker') ) + { + GotoState('RunningToMarker'); + } + else + { + NumZCDHits = 1; + if( IsInState('RunningToMarker') ) + { + GotoState(''); + } + } + } + else + { + if( IsInState('RunningToMarker') ) + { + GotoState(''); + } + } + + if( bNewMindControlled != bZedUnderControl ) + { + SetGroundSpeed(OriginalGroundSpeed * 1.25); + Health *= 1.25; + HealthMax *= 1.25; + } + } + else + { + NumZCDHits=0; + } + bZedUnderControl = bNewMindControlled; +} +// Handle the zed being commanded to move to a new location +function GivenNewMarker() +{ + if( bCharging && NumZCDHits > 1 ) + { + GotoState('RunningToMarker'); + } + else + { + GotoState(''); + } +} +simulated function SpawnExhaustEmitter() +{ + if ( Level.NetMode != NM_DedicatedServer ) + { + if ( ExhaustEffectClass != none ) + { + ExhaustEffect = Spawn(ExhaustEffectClass, self); + + if ( ExhaustEffect != none ) + { + AttachToBone(ExhaustEffect, 'Chainsaw_lod1'); + ExhaustEffect.SetRelativeLocation(vect(0, -20, 0)); + } + } + } +} +simulated function UpdateExhaustEmitter() +{ + local byte Throttle; + if ( Level.NetMode != NM_DedicatedServer ) + { + if ( ExhaustEffect != none ) + { + if ( bShotAnim ) + { + Throttle = 3; + } + else + { + Throttle = 0; + } + } + else + { + if ( !bNoExhaustRespawn ) + { + SpawnExhaustEmitter(); + } + } + } +} +simulated function Tick(float DeltaTime) +{ + super.Tick(DeltaTime); + UpdateExhaustEmitter(); +} +function RangedAttack(Actor A) +{ + if ( bShotAnim || Physics == PHYS_Swimming) + return; + else if ( CanAttack(A) ) + { + bShotAnim = true; + SetAnimAction(MeleeAnims[Rand(2)]); + //PlaySound(sound'Claw2s', SLOT_none); KFTODO: Replace this + if(NiceMonster(A) == none) + GoToState('SawingLoop'); + } + if( !bShotAnim && !bDecapitated ) + { + if(bConfusedState) + return; + if ( float(Health)/HealthMax < 0.75) + GoToState('RunningState'); + } +} +state RunningState +{ + // Set the zed to the zapped behavior + simulated function SetZappedBehavior() + { + Global.SetZappedBehavior(); + GoToState(''); + } + // Don't override speed in this state + function bool CanSpeedAdjust() + { + return false; + } + simulated function float GetOriginalGroundSpeed() { + return 3.5 * OriginalGroundSpeed; + } + function BeginState(){ + local NiceHumanPawn rageTarget, rageCause; + + if(Health <= 0) + return; + + if(bWasCalm){ + bWasCalm = false; + rageTarget = NiceHumanPawn(Controller.focus); + rageCause = NiceHumanPawn(LastDamagedBy); + if( rageTarget != none && KFGameType(Level.Game) != none + && class'NiceVeterancyTypes'.static.HasSkill(NicePlayerController(rageTarget.Controller), + class'NiceSkillCommandoPerfectExecution') ){ + KFGameType(Level.Game).DramaticEvent(1.0); + } + else if( rageCause != none && KFGameType(Level.Game) != none + && class'NiceVeterancyTypes'.static.HasSkill(NicePlayerController(rageCause.Controller), + class'NiceSkillCommandoPerfectExecution') ){ + KFGameType(Level.Game).DramaticEvent(1.0); + } + } + if(bZapped) + GoToState(''); + else{ + SetGroundSpeed(OriginalGroundSpeed * 3.5); + bCharging = true; + if( Level.NetMode!=NM_DedicatedServer ) + PostNetReceive(); + + NetUpdateTime = Level.TimeSeconds - 1; + } + } + function EndState() + { + if( !bZapped ) + { + SetGroundSpeed(GetOriginalGroundSpeed()); + } + bCharging = False; + if( Level.NetMode!=NM_DedicatedServer ) + PostNetReceive(); + } + function RemoveHead() + { + GoToState(''); + Global.RemoveHead(); + } + function RangedAttack(Actor A) + { + if ( bShotAnim || Physics == PHYS_Swimming) + return; + else if ( CanAttack(A) ) + { + bShotAnim = true; + SetAnimAction(MeleeAnims[Rand(2)]); + if(NiceMonster(A) == none) + GoToState('SawingLoop'); + } + } +} +// State where the zed is charging to a marked location. +// Not sure if we need this since its just like RageCharging, +// but keeping it here for now in case we need to implement some +// custom behavior for this state +state RunningToMarker extends RunningState +{ +} + +State SawingLoop +{ + // Don't override speed in this state + function bool CanSpeedAdjust() + { + return false; + } + simulated function float GetOriginalGroundSpeed() { + return OriginalGroundSpeed * AttackChargeRate; + } + function bool CanGetOutOfWay() + { + return false; + } + function BeginState() + { + bConfusedState = false; + + // Randomly have the scrake charge during an attack so it will be less predictable + if(Health/HealthMax < 0.5 || FRand() <= 0.95) + { + SetGroundSpeed(OriginalGroundSpeed * AttackChargeRate); + bCharging = true; + if( Level.NetMode!=NM_DedicatedServer ) + PostNetReceive(); + + NetUpdateTime = Level.TimeSeconds - 1; + } + } + function RangedAttack(Actor A) + { + if ( bShotAnim ) + return; + else if ( CanAttack(A) ) + { + Acceleration = vect(0,0,0); + bShotAnim = true; + MeleeDamage = default.MeleeDamage*0.6; + SetAnimAction('SawImpaleLoop'); + if( AmbientSound != SawAttackLoopSound ) + { + AmbientSound=SawAttackLoopSound; + } + } + else GoToState(''); + } + function AnimEnd( int Channel ) + { + Super.AnimEnd(Channel); + if( Controller!=none && Controller.Enemy!=none ) + RangedAttack(Controller.Enemy); // Keep on attacking if possible. + } + function Tick( float Delta ) + { + // Keep the scrake moving toward its target when attacking + if( Role == ROLE_Authority && bShotAnim && !bWaitForAnim ) + { + if( LookTarget!=none ) + { + Acceleration = AccelRate * Normal(LookTarget.Location - Location); + } + } + + global.Tick(Delta); + } + function EndState() + { + AmbientSound=default.AmbientSound; + MeleeDamage = Max( DifficultyDamageModifer() * default.MeleeDamage, 1 ); + + SetGroundSpeed(GetOriginalGroundSpeed()); + bCharging = False; + if(Level.NetMode != NM_DedicatedServer) + PostNetReceive(); + } +} +function ModDamage(out int Damage, Pawn instigatedBy, Vector hitLocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI, optional float lockonTime){ + super.ModDamage(Damage, instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); + if(damageType == class'ScrnZedPack.DamTypeEMP') + Damage *= 0.01; +} +function TakeDamageClient(int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType, float headshotLevel, float lockonTime){ + local bool bCanGetConfused; + local int OldHealth; + local PlayerController PC; + local KFSteamStatsAndAchievements Stats; + OldHealth = Health; + bCanGetConfused = false; + if(StunsRemaining != 0 && float(Health)/HealthMax >= 0.75) + bCanGetConfused = true; + super.takeDamageClient(Damage, instigatedBy, hitLocation, momentum, damageType, headshotLevel, lockonTime); + if ( + bCanGetConfused && + !IsInState('SawingLoop') && + (OldHealth - Health) <= (float(default.Health)/1.5) && float(Health)/HealthMax < 0.75 && + (LastDamageAmount >= (0.5 * default.Health) || + (VSize(LastDamagedBy.Location - Location) <= (MeleeRange * 2) && ClassIsChildOf(LastDamagedbyType,class 'DamTypeMelee') && + KFPawn(LastDamagedBy) != none && LastDamageAmount > (0.10 * default.Health))) + ) + bConfusedState = true; + if(bConfusedState && Health > 0 && (headshotLevel <= 0.0) && damageType != none){ + bConfusedState = false; + GoToState('RunningState'); + } + if(!bConfusedState && !IsInState('SawingLoop') && !IsInState('RunningState') && float(Health) / HealthMax < 0.75) + RangedAttack(InstigatedBy); + if(damageType == class'DamTypeDBShotgun'){ + PC = PlayerController( InstigatedBy.Controller ); + if(PC != none){ + Stats = KFSteamStatsAndAchievements( PC.SteamStatsAndAchievements ); + if( Stats != none ) + Stats.CheckAndSetAchievementComplete( Stats.KFACHIEVEMENT_PushScrakeSPJ ); + } + } +} +function TakeFireDamage(int Damage, Pawn Instigator) +{ + Super.TakeFireDamage(Damage, Instigator); + if(bConfusedState && Health > 0 && Damage > 150){ + bConfusedState = false; + GoToState('RunningState'); + } +} +function bool CheckMiniFlinch(int flinchScore, Pawn instigatedBy, Vector hitLocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI){ + // Scrakes are better at enduring pain, so we need a bit more to flinch them + if(StunsRemaining == 0 || flinchScore < 150) + return false; + return super.CheckMiniFlinch(flinchScore, instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); +} +function DoStun(optional Pawn instigatedBy, optional Vector hitLocation, optional Vector momentum, optional class damageType, optional float headshotLevel, optional KFPlayerReplicationInfo KFPRI){ + super.DoStun(instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); + StunsRemaining = 0; +} +simulated function int DoAnimAction( name AnimName ) +{ + if( AnimName=='SawZombieAttack1' || AnimName=='SawZombieAttack2' ) + { + AnimBlendParams(1, 1.0, 0.0,, FireRootBone); + PlayAnim(AnimName,, 0.1, 1); + Return 1; + } + Return Super.DoAnimAction(AnimName); +} +simulated event SetAnimAction(name NewAction) +{ + local int meleeAnimIndex; + if( NewAction=='' ) + Return; + if(NewAction == 'Claw') + { + meleeAnimIndex = Rand(3); + NewAction = meleeAnims[meleeAnimIndex]; + } + ExpectingChannel = DoAnimAction(NewAction); + if( AnimNeedsWait(NewAction) ) + { + bWaitForAnim = true; + } + if( Level.NetMode!=NM_Client ) + { + AnimAction = NewAction; + bResetAnimAct = True; + ResetAnimActTime = Level.TimeSeconds+0.3; + } +} +// The animation is full body and should set the bWaitForAnim flag +simulated function bool AnimNeedsWait(name TestAnim) +{ + if( TestAnim == 'SawImpaleLoop' || TestAnim == 'DoorBash' || TestAnim == 'KnockDown' ) + { + return true; + } + return false; +} +function PlayDyingSound() +{ + if( Level.NetMode!=NM_Client ) + { + if ( bGibbed ) + { + // Do nothing for now + PlaySound(GibGroupClass.static.GibSound(), SLOT_Pain,2.0,true,525); + return; + } + + if( bDecapitated ) + { + + PlaySound(HeadlessDeathSound, SLOT_Pain,1.30,true,525); + } + else + { + PlaySound(DeathSound[0], SLOT_Pain,1.30,true,525); + } + + PlaySound(ChainSawOffSound, SLOT_Misc, 2.0,,525.0); + } +} +function Died(Controller Killer, class damageType, vector HitLocation) +{ + AmbientSound = none; + if ( ExhaustEffect != none ) + { + ExhaustEffect.Destroy(); + ExhaustEffect = none; + bNoExhaustRespawn = true; + } + super.Died( Killer, damageType, HitLocation ); +} +simulated function ProcessHitFX() +{ + local Coords boneCoords; + local class HitEffects[4]; + local int i,j; + local float GibPerterbation; + if( (Level.NetMode == NM_DedicatedServer) || bSkeletized || (Mesh == SkeletonMesh)) + { + SimHitFxTicker = HitFxTicker; + return; + } + for ( SimHitFxTicker = SimHitFxTicker; SimHitFxTicker != HitFxTicker; SimHitFxTicker = (SimHitFxTicker + 1) % ArrayCount(HitFX) ) + { + j++; + if ( j > 30 ) + { + SimHitFxTicker = HitFxTicker; + return; + } + + if( (HitFX[SimHitFxTicker].damtype == none) || (Level.bDropDetail && (Level.TimeSeconds - LastRenderTime > 3) && !IsHumanControlled()) ) + continue; + + //log("Processing effects for damtype "$HitFX[SimHitFxTicker].damtype); + + if( HitFX[SimHitFxTicker].bone == 'obliterate' && !class'GameInfo'.static.UseLowGore()) + { + SpawnGibs( HitFX[SimHitFxTicker].rotDir, 1); + bGibbed = true; + // Wait a tick on a listen server so the obliteration can replicate before the pawn is destroyed + if( Level.NetMode == NM_ListenServer ) + { + bDestroyNextTick = true; + TimeSetDestroyNextTickTime = Level.TimeSeconds; + } + else + { + Destroy(); + } + return; + } + + boneCoords = GetBoneCoords( HitFX[SimHitFxTicker].bone ); + + if ( !Level.bDropDetail && !class'GameInfo'.static.NoBlood() && !bSkeletized && !class'GameInfo'.static.UseLowGore() ) + { + //AttachEmitterEffect( BleedingEmitterClass, HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); + + HitFX[SimHitFxTicker].damtype.static.GetHitEffects( HitEffects, Health ); + + if( !PhysicsVolume.bWaterVolume ) // don't attach effects under water + { + for( i = 0; i < ArrayCount(HitEffects); i++ ) + { + if( HitEffects[i] == none ) + continue; + + AttachEffect( HitEffects[i], HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); + } + } + } + if ( class'GameInfo'.static.UseLowGore() ) + HitFX[SimHitFxTicker].bSever = false; + + if( HitFX[SimHitFxTicker].bSever ) + { + GibPerterbation = HitFX[SimHitFxTicker].damtype.default.GibPerterbation; + + switch( HitFX[SimHitFxTicker].bone ) + { + case 'obliterate': + break; + + case LeftThighBone: + if( !bLeftLegGibbed ) + { + SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + bLeftLegGibbed=true; + } + break; + + case RightThighBone: + if( !bRightLegGibbed ) + { + SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + bRightLegGibbed=true; + } + break; + + case LeftFArmBone: + if( !bLeftArmGibbed ) + { + SpawnSeveredGiblet( DetachedArmClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ;; + bLeftArmGibbed=true; + } + break; + + case RightFArmBone: + if( !bRightArmGibbed ) + { + SpawnSeveredGiblet( DetachedSpecialArmClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + bRightArmGibbed=true; + } + break; + + case 'head': + if( !bHeadGibbed ) + { + if ( HitFX[SimHitFxTicker].damtype == class'DamTypeDecapitation' ) + { + DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false); + } + else if( HitFX[SimHitFxTicker].damtype == class'DamTypeProjectileDecap' ) + { + DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false, true); + } + else if( HitFX[SimHitFxTicker].damtype == class'DamTypeMeleeDecapitation' ) + { + DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, true); + } + + bHeadGibbed=true; + } + break; + } + + if( HitFX[SimHitFXTicker].bone != 'Spine' && HitFX[SimHitFXTicker].bone != FireRootBone && + HitFX[SimHitFXTicker].bone != 'head' && Health <=0 ) + HideBone(HitFX[SimHitFxTicker].bone); + } + } +} +// Maybe spawn some chunks when the player gets obliterated +simulated function SpawnGibs(Rotator HitRotation, float ChunkPerterbation) +{ + if ( ExhaustEffect != none ) + { + ExhaustEffect.Destroy(); + ExhaustEffect = none; + bNoExhaustRespawn = true; + } + super.SpawnGibs(HitRotation,ChunkPerterbation); +} +static simulated function PreCacheMaterials(LevelInfo myLevel) +{//should be derived and used. + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.scrake_env_cmb'); + myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.scrake_diff'); + myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.scrake_spec'); + myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.scrake_saw_panner'); + myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.scrake_FB'); + myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.Chainsaw_blade_diff'); +} +defaultproperties +{ + SawAttackLoopSound=Sound'KF_BaseScrake.Chainsaw.Scrake_Chainsaw_Impale' + ChainSawOffSound=SoundGroup'KF_ChainsawSnd.Chainsaw_Deselect' + remainingStuns=1 + stunLoopStart=0.240000 + stunLoopEnd=0.820000 + idleInsertFrame=0.900000 + EventClasses(0)="NicePack.NiceZombieScrake" + MoanVoice=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Talk' + MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Chainsaw_HitPlayer' + JumpSound=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Jump' + DetachedArmClass=Class'KFChar.SeveredArmScrake' + DetachedLegClass=Class'KFChar.SeveredLegScrake' + DetachedHeadClass=Class'KFChar.SeveredHeadScrake' + DetachedSpecialArmClass=Class'KFChar.SeveredArmScrakeSaw' + HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Pain' + DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Death' + ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Challenge' + ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Challenge' + ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Challenge' + ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd.Scrake.Scrake_Challenge' + ControllerClass=Class'NicePack.NiceZombieScrakeController' + AmbientSound=Sound'KF_BaseScrake.Chainsaw.Scrake_Chainsaw_Idle' + Mesh=SkeletalMesh'KF_Freaks_Trip.Scrake_Freak' + Skins(0)=Shader'KF_Specimens_Trip_T.scrake_FB' + Skins(1)=TexPanner'KF_Specimens_Trip_T.scrake_saw_panner' +} diff --git a/sources/Zeds/Nice/NiceZombieScrakeBase.uc b/sources/Zeds/Nice/NiceZombieScrakeBase.uc index be8d105..75ec86a 100644 --- a/sources/Zeds/Nice/NiceZombieScrakeBase.uc +++ b/sources/Zeds/Nice/NiceZombieScrakeBase.uc @@ -1,24 +1,84 @@ -// Chainsaw Zombie Monster for KF Invasion gametype -// He's not quite as speedy as the other Zombies, But his attacks are TRULY damaging. -class NiceZombieScrakeBase extends NiceMonster - abstract; -#exec OBJ LOAD FILE= -var(Sounds) sound SawAttackLoopSound; // THe sound for the saw revved up, looping -var(Sounds) sound ChainSawOffSound; //The sound of this zombie dieing without a head -var bool bCharging; // Scrake charges when his health gets low -var() float AttackChargeRate; // Ratio to increase scrake movement speed when charging and attacking -// Exhaust effects -var() class ExhaustEffectClass; // Effect class for the exhaust emitter -var() VehicleExhaustEffect ExhaustEffect; -var bool bNoExhaustRespawn; -replication -{ - reliable if(Role == ROLE_Authority) bCharging; -} -//------------------------------------------------------------------------------- -// NOTE: All Code resides in the child class(this class was only created to -// eliminate hitching caused by loading default properties during play) -//------------------------------------------------------------------------------- -defaultproperties -{ AttackChargeRate=2.500000 ExhaustEffectClass=Class'KFMod.ChainsawExhaust' fuelRatio=0.400000 clientHeadshotScale=1.500000 MeleeAnims(0)="SawZombieAttack1" MeleeAnims(1)="SawZombieAttack2" StunsRemaining=1 BleedOutDuration=6.000000 ZapThreshold=1.250000 ZappedDamageMod=1.250000 bHarpoonToBodyStuns=False DamageToMonsterScale=8.000000 ZombieFlag=3 MeleeDamage=20 damageForce=-75000 bFatAss=True KFRagdollName="Scrake_Trip" bMeleeStunImmune=True Intelligence=BRAINS_Mammal bUseExtendedCollision=True ColOffset=(Z=55.000000) ColRadius=29.000000 ColHeight=18.000000 SeveredArmAttachScale=1.100000 SeveredLegAttachScale=1.100000 PlayerCountHealthScale=0.500000 PoundRageBumpDamScale=0.010000 OnlineHeadshotOffset=(X=22.000000,Y=5.000000,Z=58.000000) OnlineHeadshotScale=1.500000 HeadHealth=650.000000 PlayerNumHeadHealthScale=0.300000 MotionDetectorThreat=3.000000 ScoringValue=75 IdleHeavyAnim="SawZombieIdle" IdleRifleAnim="SawZombieIdle" MeleeRange=40.000000 GroundSpeed=85.000000 WaterSpeed=75.000000 HealthMax=1000.000000 Health=1000 HeadHeight=2.200000 MenuName="Nice Scrake" MovementAnims(0)="SawZombieWalk" MovementAnims(1)="SawZombieWalk" MovementAnims(2)="SawZombieWalk" MovementAnims(3)="SawZombieWalk" WalkAnims(0)="SawZombieWalk" WalkAnims(1)="SawZombieWalk" WalkAnims(2)="SawZombieWalk" WalkAnims(3)="SawZombieWalk" IdleCrouchAnim="SawZombieIdle" IdleWeaponAnim="SawZombieIdle" IdleRestAnim="SawZombieIdle" DrawScale=1.050000 PrePivot=(Z=3.000000) SoundVolume=175 SoundRadius=100.000000 Mass=500.000000 RotationRate=(Yaw=45000,Roll=0) -} +// Chainsaw Zombie Monster for KF Invasion gametype +// He's not quite as speedy as the other Zombies, But his attacks are TRULY damaging. +class NiceZombieScrakeBase extends NiceMonster + abstract; +#exec OBJ LOAD FILE= +var(Sounds) sound SawAttackLoopSound; // THe sound for the saw revved up, looping +var(Sounds) sound ChainSawOffSound; //The sound of this zombie dieing without a head +var bool bCharging; // Scrake charges when his health gets low +var() float AttackChargeRate; // Ratio to increase scrake movement speed when charging and attacking +// Exhaust effects +var() class ExhaustEffectClass; // Effect class for the exhaust emitter +var() VehicleExhaustEffect ExhaustEffect; +var bool bNoExhaustRespawn; +replication +{ + reliable if(Role == ROLE_Authority) + bCharging; +} +//------------------------------------------------------------------------------- +// NOTE: All Code resides in the child class(this class was only created to +// eliminate hitching caused by loading default properties during play) +//------------------------------------------------------------------------------- +defaultproperties +{ + AttackChargeRate=2.500000 + ExhaustEffectClass=Class'KFMod.ChainsawExhaust' + fuelRatio=0.400000 + clientHeadshotScale=1.500000 + MeleeAnims(0)="SawZombieAttack1" + MeleeAnims(1)="SawZombieAttack2" + StunsRemaining=1 + BleedOutDuration=6.000000 + ZapThreshold=1.250000 + ZappedDamageMod=1.250000 + bHarpoonToBodyStuns=False + DamageToMonsterScale=8.000000 + ZombieFlag=3 + MeleeDamage=20 + damageForce=-75000 + bFatAss=True + KFRagdollName="Scrake_Trip" + bMeleeStunImmune=True + Intelligence=BRAINS_Mammal + bUseExtendedCollision=True + ColOffset=(Z=55.000000) + ColRadius=29.000000 + ColHeight=18.000000 + SeveredArmAttachScale=1.100000 + SeveredLegAttachScale=1.100000 + PlayerCountHealthScale=0.500000 + PoundRageBumpDamScale=0.010000 + OnlineHeadshotOffset=(X=22.000000,Y=5.000000,Z=58.000000) + OnlineHeadshotScale=1.500000 + HeadHealth=650.000000 + PlayerNumHeadHealthScale=0.300000 + MotionDetectorThreat=3.000000 + ScoringValue=75 + IdleHeavyAnim="SawZombieIdle" + IdleRifleAnim="SawZombieIdle" + MeleeRange=40.000000 + GroundSpeed=85.000000 + WaterSpeed=75.000000 + HealthMax=1000.000000 + Health=1000 + HeadHeight=2.200000 + MenuName="Nice Scrake" + MovementAnims(0)="SawZombieWalk" + MovementAnims(1)="SawZombieWalk" + MovementAnims(2)="SawZombieWalk" + MovementAnims(3)="SawZombieWalk" + WalkAnims(0)="SawZombieWalk" + WalkAnims(1)="SawZombieWalk" + WalkAnims(2)="SawZombieWalk" + WalkAnims(3)="SawZombieWalk" + IdleCrouchAnim="SawZombieIdle" + IdleWeaponAnim="SawZombieIdle" + IdleRestAnim="SawZombieIdle" + DrawScale=1.050000 + PrePivot=(Z=3.000000) + SoundVolume=175 + SoundRadius=100.000000 + Mass=500.000000 + RotationRate=(Yaw=45000,Roll=0) +} diff --git a/sources/Zeds/Nice/NiceZombieScrakeController.uc b/sources/Zeds/Nice/NiceZombieScrakeController.uc index 4539b78..f893906 100644 --- a/sources/Zeds/Nice/NiceZombieScrakeController.uc +++ b/sources/Zeds/Nice/NiceZombieScrakeController.uc @@ -1,43 +1,63 @@ -class NiceZombieScrakeController extends NiceMonsterController; -// Custom Zombie Thinkerating -// By : Alex -var bool bDoneSpottedCheck; -// Never do that, you too cool -function GetOutOfTheWayOfShot(vector ShotDirection, vector ShotOrigin){} -state ZombieHunt -{ - event SeePlayer(Pawn SeenPlayer) - { if ( !bDoneSpottedCheck && PlayerController(SeenPlayer.Controller) != none ) { // 25% chance of first player to see this Scrake saying something if ( !KFGameType(Level.Game).bDidSpottedScrakeMessage && FRand() < 0.25 ) { PlayerController(SeenPlayer.Controller).Speech('AUTO', 14, ""); KFGameType(Level.Game).bDidSpottedScrakeMessage = true; } - bDoneSpottedCheck = true; } - super.SeePlayer(SeenPlayer); - } -} -function TimedFireWeaponAtEnemy() -{ - if ( (Enemy == none) || FireWeaponAt(Enemy) ) SetCombatTimer(); - else SetTimer(0.01, True); -} -state ZombieCharge -{ - // Don't do this in this state - function GetOutOfTheWayOfShot(vector ShotDirection, vector ShotOrigin){} - function bool StrafeFromDamage(float Damage, class DamageType, bool bFindDest) - { return false; - } - function bool TryStrafe(vector sideDir) - { return false; - } - function Timer() - { Disable('NotifyBump'); Target = Enemy; TimedFireWeaponAtEnemy(); - } -WaitForAnim: - While( Monster(Pawn).bShotAnim ) Sleep(0.25); - if ( !FindBestPathToward(Enemy, false,true) ) GotoState('ZombieRestFormation'); -Moving: - MoveToward(Enemy); - WhatToDoNext(17); - if ( bSoaking ) SoakStop("STUCK IN CHARGING!"); -} -defaultproperties -{ -} +class NiceZombieScrakeController extends NiceMonsterController; +// Custom Zombie Thinkerating +// By : Alex +var bool bDoneSpottedCheck; +// Never do that, you too cool +function GetOutOfTheWayOfShot(vector ShotDirection, vector ShotOrigin){} +state ZombieHunt +{ + event SeePlayer(Pawn SeenPlayer) + { + if ( !bDoneSpottedCheck && PlayerController(SeenPlayer.Controller) != none ) + { + // 25% chance of first player to see this Scrake saying something + if ( !KFGameType(Level.Game).bDidSpottedScrakeMessage && FRand() < 0.25 ) + { + PlayerController(SeenPlayer.Controller).Speech('AUTO', 14, ""); + KFGameType(Level.Game).bDidSpottedScrakeMessage = true; + } + + bDoneSpottedCheck = true; + } + + super.SeePlayer(SeenPlayer); + } +} +function TimedFireWeaponAtEnemy() +{ + if ( (Enemy == none) || FireWeaponAt(Enemy) ) + SetCombatTimer(); + else SetTimer(0.01, True); +} +state ZombieCharge +{ + // Don't do this in this state + function GetOutOfTheWayOfShot(vector ShotDirection, vector ShotOrigin){} + function bool StrafeFromDamage(float Damage, class DamageType, bool bFindDest) + { + return false; + } + function bool TryStrafe(vector sideDir) + { + return false; + } + function Timer() + { + Disable('NotifyBump'); + Target = Enemy; + TimedFireWeaponAtEnemy(); + } +WaitForAnim: + While( Monster(Pawn).bShotAnim ) + Sleep(0.25); + if ( !FindBestPathToward(Enemy, false,true) ) + GotoState('ZombieRestFormation'); +Moving: + MoveToward(Enemy); + WhatToDoNext(17); + if ( bSoaking ) + SoakStop("STUCK IN CHARGING!"); +} +defaultproperties +{ +} diff --git a/sources/Zeds/Nice/NiceZombieShiver.uc b/sources/Zeds/Nice/NiceZombieShiver.uc index 72a7c43..2a879b5 100644 --- a/sources/Zeds/Nice/NiceZombieShiver.uc +++ b/sources/Zeds/Nice/NiceZombieShiver.uc @@ -1,221 +1,450 @@ -// Different naming scheme 'cause kf-scrntestingrounds has a stupid restriction on what zeds can be used in it's spawns -class NiceZombieShiver extends NiceZombieShiverBase; -var float TeleportBlockTime; -var float HeadOffsetY; -var transient bool bRunning, bClientRunning; -replication -{ - reliable if ( Role == ROLE_Authority) bRunning; -} -simulated function PostNetReceive() -{ - super.PostNetReceive(); - if( bClientRunning != bRunning ) - { bClientRunning = bRunning; if( bRunning ) { MovementAnims[0] = RunAnim; } else { MovementAnims[0] = WalkAnim; } - } -} -simulated function PostBeginPlay() -{ - Super.PostBeginPlay(); - if (Level.NetMode != NM_DedicatedServer) - { MatAlphaSkin = ColorModifier(Level.ObjectPool.AllocateObject(class'ColorModifier')); if (MatAlphaSkin != none) { MatAlphaSkin.Color = class'Canvas'.static.MakeColor(255, 255, 255, 255); MatAlphaSkin.RenderTwoSided = false; MatAlphaSkin.AlphaBlend = true; MatAlphaSkin.Material = Skins[0]; Skins[0] = MatAlphaSkin; } - } -} -simulated function Destroyed() -{ - if (Level.NetMode != NM_DedicatedServer && MatAlphaSkin != none) - { Skins[0] = default.Skins[0]; Level.ObjectPool.FreeObject(MatAlphaSkin); - } - Super.Destroyed(); -} -// Overridden to add HeadOffsetY -function bool IsHeadShot(vector loc, vector ray, float AdditionalScale) -{ - local coords C; - local vector HeadLoc, B, M, diff; - local float t, DotMM, Distance; - local int look; - local bool bUseAltHeadShotLocation; - local bool bWasAnimating; - if (HeadBone == '') return False; - // If we are a dedicated server estimate what animation is most likely playing on the client - if (Level.NetMode == NM_DedicatedServer) - { if (Physics == PHYS_Falling) PlayAnim(AirAnims[0], 1.0, 0.0); else if (Physics == PHYS_Walking) { // Only play the idle anim if we're not already doing a different anim. // This prevents anims getting interrupted on the server and borking things up - Ramm - if( !IsAnimating(0) && !IsAnimating(1) ) { if (bIsCrouched) { PlayAnim(IdleCrouchAnim, 1.0, 0.0); } else { bUseAltHeadShotLocation=true; } } else { bWasAnimating = true; } - if ( bDoTorsoTwist ) { SmoothViewYaw = Rotation.Yaw; SmoothViewPitch = ViewPitch; - look = (256 * ViewPitch) & 65535; if (look > 32768) look -= 65536; - SetTwistLook(0, look); } } else if (Physics == PHYS_Swimming) PlayAnim(SwimAnims[0], 1.0, 0.0); - if( !bWasAnimating ) { SetAnimFrame(0.5); } - } - if( bUseAltHeadShotLocation ) - { HeadLoc = Location + (OnlineHeadshotOffset >> Rotation); AdditionalScale *= OnlineHeadshotScale; - } - else - { C = GetBoneCoords(HeadBone); - HeadLoc = C.Origin + (HeadHeight * HeadScale * AdditionalScale * C.XAxis) + HeadOffsetY * C.YAxis; - } - //ServerHeadLocation = HeadLoc; - // Express snipe trace line in terms of B + tM - B = loc; - M = ray * (2.0 * CollisionHeight + 2.0 * CollisionRadius); - // Find Point-Line Squared Distance - diff = HeadLoc - B; - t = M Dot diff; - if (t > 0) - { DotMM = M dot M; if (t < DotMM) { t = t / DotMM; diff = diff - (t * M); } else { t = 1; diff -= M; } - } - else t = 0; - Distance = Sqrt(diff Dot diff); - return (Distance < (HeadRadius * HeadScale * AdditionalScale)); -} -function bool FlipOver() -{ - if ( super.FlipOver() ) { TeleportBlockTime = Level.TimeSeconds + 3.0; // can't teleport during stun // do not rotate while stunned Controller.Focus = none; Controller.FocalPoint = Location + 512*vector(Rotation); - } - return false; -} -simulated function StopBurnFX() -{ - if (bBurnApplied) - { MatAlphaSkin.Material = Texture'PatchTex.Common.ZedBurnSkin'; Skins[0] = MatAlphaSkin; - } - Super.StopBurnFX(); -} -function RangedAttack(Actor A) -{ - if (bShotAnim || Physics == PHYS_Swimming) return; - else if (CanAttack(A)) - { bShotAnim = true; SetAnimAction('Claw'); return; - } -} -state Running -{ - function Tick(float Delta) - { Global.Tick(Delta); if (RunUntilTime < Level.TimeSeconds) GotoState(''); GroundSpeed = GetOriginalGroundSpeed(); - } - function BeginState() - { bRunning = true; RunUntilTime = Level.TimeSeconds + PeriodRunBase + FRand() * PeriodRunRan; MovementAnims[0] = RunAnim; - } - function EndState() - { bRunning = false; GroundSpeed = global.GetOriginalGroundSpeed(); RunCooldownEnd = Level.TimeSeconds + PeriodRunCoolBase + FRand() * PeriodRunCoolRan; MovementAnims[0] = WalkAnim; - } - function float GetOriginalGroundSpeed() - { return global.GetOriginalGroundSpeed() * 2.5; - } - function bool CanSpeedAdjust() - { return false; - } -} -/*function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Momentum, class DamType, optional int HitIndex) -{ - if (InstigatedBy == none || class(DamType) == none) Super(Monster).TakeDamage(Damage, instigatedBy, hitLocation, momentum, DamType); // skip none-reference error - else Super(KFMonster).TakeDamage(Damage, instigatedBy, hitLocation, momentum, DamType); -}*/ -// returns true also for KnockDown (stun) animation -- PooSH -simulated function bool AnimNeedsWait(name TestAnim) -{ - if( TestAnim == 'DoorBash' || TestAnim == 'KnockDown' ) - { return true; - } - return ExpectingChannel == 0; -} -simulated function float GetOriginalGroundSpeed() -{ - local float result; - result = OriginalGroundSpeed; - if( bZedUnderControl ) result *= 1.25; return result; -} -simulated function HandleAnimation(float Delta) -{ - // hehehe -} -simulated function Tick(float Delta) -{ - Super.Tick(Delta); - if (Health > 0 && !bBurnApplied) - { if (Level.NetMode != NM_DedicatedServer) HandleAnimation(Delta); // Handle targetting if (Level.NetMode != NM_Client && !bDecapitated) { if (Controller == none || Controller.Target == none || !Controller.LineOfSightTo(Controller.Target)) { if (bCanSeeTarget) bCanSeeTarget = false; } else { if (!bCanSeeTarget) { bCanSeeTarget = true; SeeTargetTime = Level.TimeSeconds; } else if (Level.TimeSeconds > SeeTargetTime + PeriodSeeTarget) { if (VSize(Controller.Target.Location - Location) < MaxTeleportDist) { if (VSize(Controller.Target.Location - Location) > MinTeleportDist || !Controller.ActorReachable(Controller.Target)) { if (CanTeleport()) StartTelePort(); } else { if (CanRun()) GotoState('Running'); } } } } } - } - // Handle client-side teleport variables - if (!bBurnApplied) - { if (Level.NetMode != NM_DedicatedServer && OldFadeStage != FadeStage) { OldFadeStage = FadeStage; if (FadeStage == 2) AlphaFader = 0; else AlphaFader = 255; } // Handle teleporting if (FadeStage == 1) // Fade out (pre-teleport) { AlphaFader = FMax(AlphaFader - Delta * 512, 0); - if (Level.NetMode != NM_Client && AlphaFader == 0) { SetCollision(true, true); FlashTeleport(); SetCollision(false, false); FadeStage = 2; } } else if (FadeStage == 2) // Fade in (post-teleport) { AlphaFader = FMin(AlphaFader + Delta * 512, 255); if (Level.NetMode != NM_Client && AlphaFader == 255) { FadeStage = 0; SetCollision(true, true); GotoState('Running'); } } - if (Level.NetMode != NM_DedicatedServer && ColorModifier(Skins[0]) != none) ColorModifier(Skins[0]).Color.A = AlphaFader; - } -} -//can't teleport if set on fire -function bool CanTeleport() -{ - return !bFlashTeleporting && !bOnFire && Physics == PHYS_Walking && Level.TimeSeconds > TeleportBlockTime && LastFlashTime + 7.5 < Level.TimeSeconds && !bIsStunned; -} -function bool CanRun() -{ - local float distanceToTargetSquared; - if(controller == none) return false; - if(controller.focus != none){ distanceToTargetSquared = VSize(controller.focus.location - location); if(distanceToTargetSquared > 900 * 2500) // (30 * 50)^2 / 30 meters return false; - } - return (!bFlashTeleporting && !IsInState('Running') && RunCooldownEnd < Level.TimeSeconds); -} -function StartTeleport() -{ - FadeStage = 1; - AlphaFader = 255; - SetCollision(false, false); - bFlashTeleporting = true; -} -function FlashTeleport() -{ - local Actor Target; - local vector OldLoc; - local vector NewLoc; - local vector HitLoc; - local vector HitNorm; - local rotator RotOld; - local rotator RotNew; - local float LandTargetDist; - local int iEndAngle; - local int iAttempts; - if (Controller == none || Controller.Target == none) return; - Target = Controller.Target; - RotOld = rotator(Target.Location - Location); - RotNew = RotOld; - OldLoc = Location; - for (iEndAngle = 0; iEndAngle < MaxTeleportAngles; iEndAngle++) - { RotNew = RotOld; RotNew.Yaw += iEndAngle * (65536 / MaxTelePortAngles); for (iAttempts = 0; iAttempts < MaxTeleportAttempts; iAttempts++) { LandTargetDist = Target.CollisionRadius + CollisionRadius + MinLandDist + (MaxLandDist - MinLandDist) * (iAttempts / (MaxTeleportAttempts - 1.0)); - NewLoc = Target.Location - vector(RotNew) * LandTargetDist; // Target.Location - Location NewLoc.Z = Target.Location.Z; - if (Trace(HitLoc, HitNorm, NewLoc + vect(0, 0, -500), NewLoc) != none) NewLoc.Z = HitLoc.Z + CollisionHeight; - // Try a new location if (SetLocation(NewLoc)) { SetPhysics(PHYS_Walking); if (Controller.PointReachable(Target.Location)) { Velocity = vect(0, 0, 0); Acceleration = vect(0, 0, 0); SetRotation(rotator(Target.Location - Location)); PlaySound(Sound'ScrnZedPack_S.Shiver.ShiverWarpGroup', SLOT_Interact, 4.0); Controller.GotoState(''); MonsterController(Controller).WhatToDoNext(0); goto Teleported; } } // Reset location SetLocation(OldLoc); } - } -Teleported: - bFlashTeleporting = false; - LastFlashTime = Level.TimeSeconds; -} -function Died(Controller Killer, class damageType, vector HitLocation) -{ - // (!) - Super.Died(Killer, damageType, HitLocation); -} -function RemoveHead() -{ - local class KFDamType; - KFDamType = class(LastDamagedByType); - if ( KFDamType != none && !KFDamType.default.bIsPowerWeapon && !KFDamType.default.bSniperWeapon && !KFDamType.default.bIsMeleeDamage && !KFDamType.default.bIsExplosive && !KFDamType.default.bDealBurningDamage && !ClassIsChildOf(KFDamType, class'DamTypeDualies') && !ClassIsChildOf(KFDamType, class'DamTypeMK23Pistol') && !ClassIsChildOf(KFDamType, class'DamTypeMagnum44Pistol') ) - { LastDamageAmount *= 3.5; //significantly raise decapitation bonus for Assault Rifles - //award shiver kill on decap for Commandos if ( KFPawn(LastDamagedBy)!=none && KFPlayerController(LastDamagedBy.Controller) != none && KFSteamStatsAndAchievements(KFPlayerController(LastDamagedBy.Controller).SteamStatsAndAchievements) != none ) { KFDamType.Static.AwardKill( KFSteamStatsAndAchievements(KFPlayerController(LastDamagedBy.Controller).SteamStatsAndAchievements), KFPlayerController(LastDamagedBy.Controller), self); } - } - if (IsInState('Running')) GotoState(''); - Super(NiceMonster).RemoveHead(); -} -function bool CheckMiniFlinch(int flinchScore, Pawn instigatedBy, Vector hitLocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI){ - if(IsInState('Running')) return false; - return super.CheckMiniFlinch(flinchScore, instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); -} -simulated function int DoAnimAction( name AnimName ) -{ - if (AnimName=='Claw' || AnimName=='Claw2' || AnimName=='Claw3') - { AnimBlendParams(1, 1.0, 0.1,, FireRootBone); PlayAnim(AnimName,, 0.1, 1); return 1; - } - return Super.DoAnimAction(AnimName); -} -defaultproperties -{ HeadOffsetY=-3.000000 idleInsertFrame=0.468000 PlayerCountHealthScale=0.200000 OnlineHeadshotOffset=(X=19.000000,Z=39.000000) ScoringValue=15 HealthMax=300.000000 Health=300 HeadRadius=8.000000 HeadHeight=3.000000 -} +// Different naming scheme 'cause kf-scrntestingrounds has a stupid restriction on what zeds can be used in it's spawns +class NiceZombieShiver extends NiceZombieShiverBase; +var float TeleportBlockTime; +var float HeadOffsetY; +var transient bool bRunning, bClientRunning; +replication +{ + reliable if ( Role == ROLE_Authority) + bRunning; +} +simulated function PostNetReceive() +{ + super.PostNetReceive(); + if( bClientRunning != bRunning ) + { + bClientRunning = bRunning; + if( bRunning ) { + MovementAnims[0] = RunAnim; + } + else { + MovementAnims[0] = WalkAnim; + } + } +} +simulated function PostBeginPlay() +{ + Super.PostBeginPlay(); + if (Level.NetMode != NM_DedicatedServer) + { + MatAlphaSkin = ColorModifier(Level.ObjectPool.AllocateObject(class'ColorModifier')); + if (MatAlphaSkin != none) + { + MatAlphaSkin.Color = class'Canvas'.static.MakeColor(255, 255, 255, 255); + MatAlphaSkin.RenderTwoSided = false; + MatAlphaSkin.AlphaBlend = true; + MatAlphaSkin.Material = Skins[0]; + Skins[0] = MatAlphaSkin; + } + } +} +simulated function Destroyed() +{ + if (Level.NetMode != NM_DedicatedServer && MatAlphaSkin != none) + { + Skins[0] = default.Skins[0]; + Level.ObjectPool.FreeObject(MatAlphaSkin); + } + Super.Destroyed(); +} +// Overridden to add HeadOffsetY +function bool IsHeadShot(vector loc, vector ray, float AdditionalScale) +{ + local coords C; + local vector HeadLoc, B, M, diff; + local float t, DotMM, Distance; + local int look; + local bool bUseAltHeadShotLocation; + local bool bWasAnimating; + if (HeadBone == '') + return False; + // If we are a dedicated server estimate what animation is most likely playing on the client + if (Level.NetMode == NM_DedicatedServer) + { + if (Physics == PHYS_Falling) + PlayAnim(AirAnims[0], 1.0, 0.0); + else if (Physics == PHYS_Walking) + { + // Only play the idle anim if we're not already doing a different anim. + // This prevents anims getting interrupted on the server and borking things up - Ramm + + if( !IsAnimating(0) && !IsAnimating(1) ) + { + if (bIsCrouched) + { + PlayAnim(IdleCrouchAnim, 1.0, 0.0); + } + else + { + bUseAltHeadShotLocation=true; + } + } + else + { + bWasAnimating = true; + } + + if ( bDoTorsoTwist ) + { + SmoothViewYaw = Rotation.Yaw; + SmoothViewPitch = ViewPitch; + + look = (256 * ViewPitch) & 65535; + if (look > 32768) + look -= 65536; + + SetTwistLook(0, look); + } + } + else if (Physics == PHYS_Swimming) + PlayAnim(SwimAnims[0], 1.0, 0.0); + + if( !bWasAnimating ) + { + SetAnimFrame(0.5); + } + } + if( bUseAltHeadShotLocation ) + { + HeadLoc = Location + (OnlineHeadshotOffset >> Rotation); + AdditionalScale *= OnlineHeadshotScale; + } + else + { + C = GetBoneCoords(HeadBone); + + HeadLoc = C.Origin + (HeadHeight * HeadScale * AdditionalScale * C.XAxis) + + HeadOffsetY * C.YAxis; + } + //ServerHeadLocation = HeadLoc; + // Express snipe trace line in terms of B + tM + B = loc; + M = ray * (2.0 * CollisionHeight + 2.0 * CollisionRadius); + // Find Point-Line Squared Distance + diff = HeadLoc - B; + t = M Dot diff; + if (t > 0) + { + DotMM = M dot M; + if (t < DotMM) + { + t = t / DotMM; + diff = diff - (t * M); + } + else + { + t = 1; + diff -= M; + } + } + else + t = 0; + Distance = Sqrt(diff Dot diff); + return (Distance < (HeadRadius * HeadScale * AdditionalScale)); +} +function bool FlipOver() +{ + if ( super.FlipOver() ) { + TeleportBlockTime = Level.TimeSeconds + 3.0; // can't teleport during stun + // do not rotate while stunned + Controller.Focus = none; + Controller.FocalPoint = Location + 512*vector(Rotation); + } + return false; +} +simulated function StopBurnFX() +{ + if (bBurnApplied) + { + MatAlphaSkin.Material = Texture'PatchTex.Common.ZedBurnSkin'; + Skins[0] = MatAlphaSkin; + } + Super.StopBurnFX(); +} +function RangedAttack(Actor A) +{ + if (bShotAnim || Physics == PHYS_Swimming) + return; + else if (CanAttack(A)) + { + bShotAnim = true; + SetAnimAction('Claw'); + return; + } +} +state Running +{ + function Tick(float Delta) + { + Global.Tick(Delta); + if (RunUntilTime < Level.TimeSeconds) + GotoState(''); + GroundSpeed = GetOriginalGroundSpeed(); + } + function BeginState() + { + bRunning = true; + RunUntilTime = Level.TimeSeconds + PeriodRunBase + FRand() * PeriodRunRan; + MovementAnims[0] = RunAnim; + } + function EndState() + { + bRunning = false; + GroundSpeed = global.GetOriginalGroundSpeed(); + RunCooldownEnd = Level.TimeSeconds + PeriodRunCoolBase + FRand() * PeriodRunCoolRan; + MovementAnims[0] = WalkAnim; + } + function float GetOriginalGroundSpeed() + { + return global.GetOriginalGroundSpeed() * 2.5; + } + function bool CanSpeedAdjust() + { + return false; + } +} +/*function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Momentum, class DamType, optional int HitIndex) +{ + if (InstigatedBy == none || class(DamType) == none) + Super(Monster).TakeDamage(Damage, instigatedBy, hitLocation, momentum, DamType); // skip none-reference error + else + Super(KFMonster).TakeDamage(Damage, instigatedBy, hitLocation, momentum, DamType); +}*/ +// returns true also for KnockDown (stun) animation -- PooSH +simulated function bool AnimNeedsWait(name TestAnim) +{ + if( TestAnim == 'DoorBash' || TestAnim == 'KnockDown' ) + { + return true; + } + return ExpectingChannel == 0; +} +simulated function float GetOriginalGroundSpeed() +{ + local float result; + result = OriginalGroundSpeed; + if( bZedUnderControl ) + result *= 1.25; + return result; +} +simulated function HandleAnimation(float Delta) +{ + // hehehe +} +simulated function Tick(float Delta) +{ + Super.Tick(Delta); + if (Health > 0 && !bBurnApplied) + { + if (Level.NetMode != NM_DedicatedServer) + HandleAnimation(Delta); + // Handle targetting + if (Level.NetMode != NM_Client && !bDecapitated) + { + if (Controller == none || Controller.Target == none || !Controller.LineOfSightTo(Controller.Target)) + { + if (bCanSeeTarget) bCanSeeTarget = false; + } + else + { + if (!bCanSeeTarget) + { + bCanSeeTarget = true; + SeeTargetTime = Level.TimeSeconds; + } + else if (Level.TimeSeconds > SeeTargetTime + PeriodSeeTarget) + { + if (VSize(Controller.Target.Location - Location) < MaxTeleportDist) + { + if (VSize(Controller.Target.Location - Location) > MinTeleportDist || !Controller.ActorReachable(Controller.Target)) + { + if (CanTeleport()) + StartTelePort(); + } + else + { + if (CanRun()) + GotoState('Running'); + } + } + } + } + } + } + // Handle client-side teleport variables + if (!bBurnApplied) + { + if (Level.NetMode != NM_DedicatedServer && OldFadeStage != FadeStage) + { + OldFadeStage = FadeStage; + if (FadeStage == 2) + AlphaFader = 0; + else + AlphaFader = 255; + } + // Handle teleporting + if (FadeStage == 1) // Fade out (pre-teleport) + { + AlphaFader = FMax(AlphaFader - Delta * 512, 0); + + if (Level.NetMode != NM_Client && AlphaFader == 0) + { + SetCollision(true, true); + FlashTeleport(); + SetCollision(false, false); + FadeStage = 2; + } + } + else if (FadeStage == 2) // Fade in (post-teleport) + { + AlphaFader = FMin(AlphaFader + Delta * 512, 255); + if (Level.NetMode != NM_Client && AlphaFader == 255) + { + FadeStage = 0; + SetCollision(true, true); + GotoState('Running'); + } + } + + if (Level.NetMode != NM_DedicatedServer && ColorModifier(Skins[0]) != none) + ColorModifier(Skins[0]).Color.A = AlphaFader; + } +} +//can't teleport if set on fire +function bool CanTeleport() +{ + return !bFlashTeleporting && !bOnFire && Physics == PHYS_Walking && Level.TimeSeconds > TeleportBlockTime + && LastFlashTime + 7.5 < Level.TimeSeconds && !bIsStunned; +} +function bool CanRun() +{ + local float distanceToTargetSquared; + if(controller == none) return false; + if(controller.focus != none){ + distanceToTargetSquared = VSize(controller.focus.location - location); + if(distanceToTargetSquared > 900 * 2500) // (30 * 50)^2 / 30 meters + return false; + } + return (!bFlashTeleporting && !IsInState('Running') && RunCooldownEnd < Level.TimeSeconds); +} +function StartTeleport() +{ + FadeStage = 1; + AlphaFader = 255; + SetCollision(false, false); + bFlashTeleporting = true; +} +function FlashTeleport() +{ + local Actor Target; + local vector OldLoc; + local vector NewLoc; + local vector HitLoc; + local vector HitNorm; + local rotator RotOld; + local rotator RotNew; + local float LandTargetDist; + local int iEndAngle; + local int iAttempts; + if (Controller == none || Controller.Target == none) + return; + Target = Controller.Target; + RotOld = rotator(Target.Location - Location); + RotNew = RotOld; + OldLoc = Location; + for (iEndAngle = 0; iEndAngle < MaxTeleportAngles; iEndAngle++) + { + RotNew = RotOld; + RotNew.Yaw += iEndAngle * (65536 / MaxTelePortAngles); + for (iAttempts = 0; iAttempts < MaxTeleportAttempts; iAttempts++) + { + LandTargetDist = Target.CollisionRadius + CollisionRadius + + MinLandDist + (MaxLandDist - MinLandDist) * (iAttempts / (MaxTeleportAttempts - 1.0)); + + NewLoc = Target.Location - vector(RotNew) * LandTargetDist; // Target.Location - Location + NewLoc.Z = Target.Location.Z; + + if (Trace(HitLoc, HitNorm, NewLoc + vect(0, 0, -500), NewLoc) != none) + NewLoc.Z = HitLoc.Z + CollisionHeight; + + // Try a new location + if (SetLocation(NewLoc)) + { + SetPhysics(PHYS_Walking); + if (Controller.PointReachable(Target.Location)) + { + Velocity = vect(0, 0, 0); + Acceleration = vect(0, 0, 0); + SetRotation(rotator(Target.Location - Location)); + PlaySound(Sound'ScrnZedPack_S.Shiver.ShiverWarpGroup', SLOT_Interact, 4.0); + Controller.GotoState(''); + MonsterController(Controller).WhatToDoNext(0); + goto Teleported; + } + } + // Reset location + SetLocation(OldLoc); + } + } +Teleported: + bFlashTeleporting = false; + LastFlashTime = Level.TimeSeconds; +} +function Died(Controller Killer, class damageType, vector HitLocation) +{ + // (!) + Super.Died(Killer, damageType, HitLocation); +} +function RemoveHead() +{ + local class KFDamType; + KFDamType = class(LastDamagedByType); + if ( KFDamType != none && !KFDamType.default.bIsPowerWeapon + && !KFDamType.default.bSniperWeapon && !KFDamType.default.bIsMeleeDamage + && !KFDamType.default.bIsExplosive && !KFDamType.default.bDealBurningDamage + && !ClassIsChildOf(KFDamType, class'DamTypeDualies') + && !ClassIsChildOf(KFDamType, class'DamTypeMK23Pistol') + && !ClassIsChildOf(KFDamType, class'DamTypeMagnum44Pistol') ) + { + LastDamageAmount *= 3.5; //significantly raise decapitation bonus for Assault Rifles + + //award shiver kill on decap for Commandos + if ( KFPawn(LastDamagedBy)!=none && KFPlayerController(LastDamagedBy.Controller) != none + && KFSteamStatsAndAchievements(KFPlayerController(LastDamagedBy.Controller).SteamStatsAndAchievements) != none ) + { + KFDamType.Static.AwardKill( + KFSteamStatsAndAchievements(KFPlayerController(LastDamagedBy.Controller).SteamStatsAndAchievements), + KFPlayerController(LastDamagedBy.Controller), self); + } + } + if (IsInState('Running')) + GotoState(''); + Super(NiceMonster).RemoveHead(); +} +function bool CheckMiniFlinch(int flinchScore, Pawn instigatedBy, Vector hitLocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI){ + if(IsInState('Running')) + return false; + return super.CheckMiniFlinch(flinchScore, instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); +} +simulated function int DoAnimAction( name AnimName ) +{ + if (AnimName=='Claw' || AnimName=='Claw2' || AnimName=='Claw3') + { + AnimBlendParams(1, 1.0, 0.1,, FireRootBone); + PlayAnim(AnimName,, 0.1, 1); + return 1; + } + return Super.DoAnimAction(AnimName); +} +defaultproperties +{ + HeadOffsetY=-3.000000 + idleInsertFrame=0.468000 + PlayerCountHealthScale=0.200000 + OnlineHeadshotOffset=(X=19.000000,Z=39.000000) + ScoringValue=15 + HealthMax=300.000000 + Health=300 + HeadRadius=8.000000 + HeadHeight=3.000000 +} diff --git a/sources/Zeds/Nice/NiceZombieShiverBase.uc b/sources/Zeds/Nice/NiceZombieShiverBase.uc index 8165665..812047e 100644 --- a/sources/Zeds/Nice/NiceZombieShiverBase.uc +++ b/sources/Zeds/Nice/NiceZombieShiverBase.uc @@ -1,39 +1,104 @@ -class NiceZombieShiverBase extends NiceMonster; -#exec load obj file=ScrnZedPack_T.utx -#exec load obj file=ScrnZedPack_S.uax -#exec load obj file=ScrnZedPack_A.ukx -var name WalkAnim, RunAnim; -// Head twitch -var rotator CurHeadRot, NextHeadRot, HeadRot; -var float NextHeadTime; -var float MaxHeadTime; -var float MaxTilt, MaxTurn; -// Targetting, charging -var bool bDelayedReaction; -var bool bCanSeeTarget; -var float SeeTargetTime; -var float RunUntilTime; -var float RunCooldownEnd; -var float PeriodSeeTarget; -var float PeriodRunBase; -var float PeriodRunRan; -var float PeriodRunCoolBase; -var float PeriodRunCoolRan; -// Teleporting -var byte FadeStage; -var byte OldFadeStage; -var float AlphaFader; -var bool bFlashTeleporting; -var float LastFlashTime; -var float MinTeleportDist, MaxTeleportDist; -var float MinLandDist, MaxLandDist; // How close we can teleport to the target (collision cylinders are taken into account) -var int MaxTeleportAttempts; // Attempts per angle -var int MaxTeleportAngles; -var ColorModifier MatAlphaSkin; -replication -{ - reliable if (Role == ROLE_Authority) FadeStage; -} -defaultproperties -{ WalkAnim="ClotWalk" RunAnim="Run" MaxHeadTime=0.100000 MaxTilt=10000.000000 MaxTurn=20000.000000 bDelayedReaction=True PeriodSeeTarget=2.000000 PeriodRunBase=4.000000 PeriodRunRan=4.000000 PeriodRunCoolBase=4.000000 PeriodRunCoolRan=3.000000 AlphaFader=255.000000 MinTeleportDist=550.000000 MaxTeleportDist=2000.000000 MinLandDist=150.000000 MaxLandDist=500.000000 MaxTeleportAttempts=3 MaxTeleportAngles=3 fuelRatio=0.800000 clientHeadshotScale=1.400000 MoanVoice=SoundGroup'ScrnZedPack_S.Shiver.ShiverTalkGroup' bCannibal=True MeleeDamage=8 damageForce=5000 KFRagdollName="Clot_Trip" JumpSound=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Jump' CrispUpThreshhold=9 PuntAnim="ClotPunt" Intelligence=BRAINS_Mammal bUseExtendedCollision=True ColOffset=(Z=48.000000) ColRadius=25.000000 ColHeight=5.000000 ExtCollAttachBoneName="Collision_Attach" SeveredArmAttachScale=0.800000 SeveredLegAttachScale=0.800000 SeveredHeadAttachScale=0.800000 DetachedArmClass=Class'ScrnZedPack.SeveredArmShiver' DetachedLegClass=Class'ScrnZedPack.SeveredLegShiver' DetachedHeadClass=Class'ScrnZedPack.SeveredHeadShiver' OnlineHeadshotOffset=(X=20.000000,Z=37.000000) OnlineHeadshotScale=1.300000 MotionDetectorThreat=0.340000 HitSound(0)=SoundGroup'ScrnZedPack_S.Shiver.ShiverPainGroup' DeathSound(0)=SoundGroup'ScrnZedPack_S.Shiver.ShiverDeathGroup' ChallengeSound(0)=SoundGroup'ScrnZedPack_S.Shiver.ShiverTalkGroup' ChallengeSound(1)=SoundGroup'ScrnZedPack_S.Shiver.ShiverTalkGroup' ChallengeSound(2)=SoundGroup'ScrnZedPack_S.Shiver.ShiverTalkGroup' ChallengeSound(3)=SoundGroup'ScrnZedPack_S.Shiver.ShiverTalkGroup' ScoringValue=7 GroundSpeed=100.000000 WaterSpeed=100.000000 AccelRate=1024.000000 JumpZ=340.000000 HealthMax=650.000000 Health=350 MenuName="Shiver" MovementAnims(0)="ClotWalk" AmbientSound=SoundGroup'ScrnZedPack_S.Shiver.ShiverIdleGroup' Mesh=SkeletalMesh'ScrnZedPack_A.ShiverMesh' DrawScale=1.100000 PrePivot=(Z=5.000000) Skins(0)=Combiner'ScrnZedPack_T.Shiver.CmbRemoveAlpha' RotationRate=(Yaw=45000,Roll=0) -} +class NiceZombieShiverBase extends NiceMonster; +#exec load obj file=ScrnZedPack_T.utx +#exec load obj file=ScrnZedPack_S.uax +#exec load obj file=ScrnZedPack_A.ukx +var name WalkAnim, RunAnim; +// Head twitch +var rotator CurHeadRot, NextHeadRot, HeadRot; +var float NextHeadTime; +var float MaxHeadTime; +var float MaxTilt, MaxTurn; +// Targetting, charging +var bool bDelayedReaction; +var bool bCanSeeTarget; +var float SeeTargetTime; +var float RunUntilTime; +var float RunCooldownEnd; +var float PeriodSeeTarget; +var float PeriodRunBase; +var float PeriodRunRan; +var float PeriodRunCoolBase; +var float PeriodRunCoolRan; +// Teleporting +var byte FadeStage; +var byte OldFadeStage; +var float AlphaFader; +var bool bFlashTeleporting; +var float LastFlashTime; +var float MinTeleportDist, MaxTeleportDist; +var float MinLandDist, MaxLandDist; // How close we can teleport to the target (collision cylinders are taken into account) +var int MaxTeleportAttempts; // Attempts per angle +var int MaxTeleportAngles; +var ColorModifier MatAlphaSkin; +replication +{ + reliable if (Role == ROLE_Authority) + FadeStage; +} +defaultproperties +{ + WalkAnim="ClotWalk" + RunAnim="Run" + MaxHeadTime=0.100000 + MaxTilt=10000.000000 + MaxTurn=20000.000000 + bDelayedReaction=True + PeriodSeeTarget=2.000000 + PeriodRunBase=4.000000 + PeriodRunRan=4.000000 + PeriodRunCoolBase=4.000000 + PeriodRunCoolRan=3.000000 + AlphaFader=255.000000 + MinTeleportDist=550.000000 + MaxTeleportDist=2000.000000 + MinLandDist=150.000000 + MaxLandDist=500.000000 + MaxTeleportAttempts=3 + MaxTeleportAngles=3 + fuelRatio=0.800000 + clientHeadshotScale=1.400000 + MoanVoice=SoundGroup'ScrnZedPack_S.Shiver.ShiverTalkGroup' + bCannibal=True + MeleeDamage=8 + damageForce=5000 + KFRagdollName="Clot_Trip" + JumpSound=SoundGroup'KF_EnemiesFinalSnd.clot.Clot_Jump' + CrispUpThreshhold=9 + PuntAnim="ClotPunt" + Intelligence=BRAINS_Mammal + bUseExtendedCollision=True + ColOffset=(Z=48.000000) + ColRadius=25.000000 + ColHeight=5.000000 + ExtCollAttachBoneName="Collision_Attach" + SeveredArmAttachScale=0.800000 + SeveredLegAttachScale=0.800000 + SeveredHeadAttachScale=0.800000 + DetachedArmClass=Class'ScrnZedPack.SeveredArmShiver' + DetachedLegClass=Class'ScrnZedPack.SeveredLegShiver' + DetachedHeadClass=Class'ScrnZedPack.SeveredHeadShiver' + OnlineHeadshotOffset=(X=20.000000,Z=37.000000) + OnlineHeadshotScale=1.300000 + MotionDetectorThreat=0.340000 + HitSound(0)=SoundGroup'ScrnZedPack_S.Shiver.ShiverPainGroup' + DeathSound(0)=SoundGroup'ScrnZedPack_S.Shiver.ShiverDeathGroup' + ChallengeSound(0)=SoundGroup'ScrnZedPack_S.Shiver.ShiverTalkGroup' + ChallengeSound(1)=SoundGroup'ScrnZedPack_S.Shiver.ShiverTalkGroup' + ChallengeSound(2)=SoundGroup'ScrnZedPack_S.Shiver.ShiverTalkGroup' + ChallengeSound(3)=SoundGroup'ScrnZedPack_S.Shiver.ShiverTalkGroup' + ScoringValue=7 + GroundSpeed=100.000000 + WaterSpeed=100.000000 + AccelRate=1024.000000 + JumpZ=340.000000 + HealthMax=650.000000 + Health=350 + MenuName="Shiver" + MovementAnims(0)="ClotWalk" + AmbientSound=SoundGroup'ScrnZedPack_S.Shiver.ShiverIdleGroup' + Mesh=SkeletalMesh'ScrnZedPack_A.ShiverMesh' + DrawScale=1.100000 + PrePivot=(Z=5.000000) + Skins(0)=Combiner'ScrnZedPack_T.Shiver.CmbRemoveAlpha' + RotationRate=(Yaw=45000,Roll=0) +} diff --git a/sources/Zeds/Nice/NiceZombieSick.uc b/sources/Zeds/Nice/NiceZombieSick.uc index 60a4ed7..0d41bf5 100644 --- a/sources/Zeds/Nice/NiceZombieSick.uc +++ b/sources/Zeds/Nice/NiceZombieSick.uc @@ -1,145 +1,244 @@ -// Zombie Monster for KF Invasion gametype -class NiceZombieSick extends NiceZombieSickBase; -#exec OBJ LOAD FILE=KF_EnemiesFinalSnd.uax -#exec OBJ LOAD FILE=NicePackT.utx -//---------------------------------------------------------------------------- -// NOTE: All Variables are declared in the base class to eliminate hitching -//---------------------------------------------------------------------------- -var name SpitAnimation; -var transient float NextVomitTime; -function bool FlipOver(){ - return true; -} -// don't interrupt the bloat while he is puking -simulated function bool HitCanInterruptAction(){ - if(bShotAnim) return false; - return true; -} - -function DoorAttack(Actor A) -{ - if ( bShotAnim || Physics == PHYS_Swimming) return; - else if ( A!=none ) - { bShotAnim = true; if( !bDecapitated && bDistanceAttackingDoor ) { SetAnimAction('ZombieBarf'); } else { SetAnimAction('DoorBash'); GotoState('DoorBashing'); } - } -} -function RangedAttack(Actor A) -{ - local int LastFireTime; - local float ChargeChance; - 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 || VSize(A.Location-Location) <= 250) && !bDecapitated ) - { bShotAnim = true; - // Decide what chance the bloat has of charging during a puke attack if( Level.Game.GameDifficulty < 2.0 ) { ChargeChance = 0.6; } else if( Level.Game.GameDifficulty < 4.0 ) { ChargeChance = 0.8; } else if( Level.Game.GameDifficulty < 5.0 ) { ChargeChance = 1.0; } else // Hardest difficulty { ChargeChance = 1.2; } - // Randomly do a moving attack so the player can't kite the zed if( FRand() < ChargeChance ) { SetAnimAction('ZombieBarfMoving'); RunAttackTimeout = GetAnimDuration('ZombieBarf', 0.5); bMovingPukeAttack=true; } else { SetAnimAction('ZombieBarf'); Controller.bPreparingMove = true; Acceleration = vect(0,0,0); } - // Randomly send out a message about Bloat Vomit burning(3% chance) if ( FRand() < 0.03 && KFHumanPawn(A) != none && PlayerController(KFHumanPawn(A).Controller) != none ) { PlayerController(KFHumanPawn(A).Controller).Speech('AUTO', 7, ""); } - } -} -// Overridden to handle playing upper body only attacks when moving -simulated event SetAnimAction(name NewAction) -{ - local int meleeAnimIndex; - local bool bWantsToAttackAndMove; - if( NewAction=='' ) Return; - bWantsToAttackAndMove = NewAction == 'ZombieBarfMoving'; - if( NewAction == 'Claw' ) - { meleeAnimIndex = Rand(3); NewAction = meleeAnims[meleeAnimIndex]; - } - if( bWantsToAttackAndMove ) - { ExpectingChannel = AttackAndMoveDoAnimAction(NewAction); - } - else - { ExpectingChannel = DoAnimAction(NewAction); - } - if( !bWantsToAttackAndMove && AnimNeedsWait(NewAction) ) - { bWaitForAnim = true; - } - else - { bWaitForAnim = false; - } - if( Level.NetMode!=NM_Client ) - { AnimAction = NewAction; bResetAnimAct = True; ResetAnimActTime = Level.TimeSeconds+0.2; - } -} -// Handle playing the anim action on the upper body only if we're attacking and moving -simulated function int AttackAndMoveDoAnimAction( name AnimName ) -{ - if( AnimName=='ZombieBarfMoving' ) - { AnimBlendParams(1, 1.0, 0.0,, FireRootBone); PlayAnim('ZombieBarf',, 0.1, 1); - return 1; - } - return super.DoAnimAction( AnimName ); -} -function PlayDyingSound() -{ - if( Level.NetMode!=NM_Client ) - { if ( bGibbed ) { PlaySound(sound'KF_EnemiesFinalSnd.Bloat_DeathPop', SLOT_Pain,2.0,true,525); return; } - if( bDecapitated ) { PlaySound(HeadlessDeathSound, SLOT_Pain,1.30,true,525); } else { PlaySound(sound'KF_EnemiesFinalSnd.Bloat_DeathPop', SLOT_Pain,2.0,true,525); } - } -} - -// Barf Time. -function SpawnTwoShots() -{ - local vector X,Y,Z, FireStart; - local rotator FireRotation; - 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 = Location+(vect(30,0,64) >> Rotation)*DrawScale; - if ( !SavedFireProperties.bInitialized ) - { SavedFireProperties.AmmoClass = Class'SkaarjAmmo'; SavedFireProperties.ProjectileClass = Class'NiceSickVomit'; SavedFireProperties.WarnTargetPct = 1; SavedFireProperties.MaxRange = 600; SavedFireProperties.bTossed = False; SavedFireProperties.bTrySplash = False; SavedFireProperties.bLeadTarget = True; SavedFireProperties.bInstantHit = True; SavedFireProperties.bInitialized = True; - } - // Turn off extra collision before spawning vomit, otherwise spawn fails - ToggleAuxCollision(false); - FireRotation = Controller.AdjustAim(SavedFireProperties,FireStart,600); - Spawn(Class'NiceSickVomit',,,FireStart,FireRotation); - FireStart-=(0.5*CollisionRadius*Y); - FireRotation.Yaw -= 1200; - spawn(Class'NiceSickVomit',,,FireStart, FireRotation); - FireStart+=(CollisionRadius*Y); - FireRotation.Yaw += 2400; - spawn(Class'NiceSickVomit',,,FireStart, FireRotation); - // Turn extra collision back on - ToggleAuxCollision(true); -} - - -function BileBomb() -{ - BloatJet = spawn(class'BileJet', self,,Location,Rotator(-PhysicsVolume.Gravity)); -} - -State Dying -{ - function tick(float deltaTime) - { - if (BloatJet != none) - { - BloatJet.SetLocation(location); - BloatJet.SetRotation(GetBoneRotation(FireRootBone)); - } - super.tick(deltaTime); - } -} -function RemoveHead() -{ - bCanDistanceAttackDoors = False; - Super.RemoveHead(); -} -static simulated function PreCacheMaterials(LevelInfo myLevel) -{//should be derived and used. - myLevel.AddPrecacheMaterial(Texture'NicePackT.MonsterSick.Sick_diffuse'); - myLevel.AddPrecacheMaterial(Combiner'NicePackT.MonsterSick.Sick_env'); - myLevel.AddPrecacheMaterial(Combiner'NicePackT.MonsterSick.Sick_cmb'); -} -defaultproperties -{ DetachedArmClass=Class'NicePack.NiceSeveredArmSick' DetachedLegClass=Class'NicePack.NiceSeveredLegSick' DetachedHeadClass=Class'NicePack.NiceSeveredHeadSick' ControllerClass=Class'NicePack.NiceSickZombieController' -} +// Zombie Monster for KF Invasion gametype +class NiceZombieSick extends NiceZombieSickBase; +#exec OBJ LOAD FILE=KF_EnemiesFinalSnd.uax +#exec OBJ LOAD FILE=NicePackT.utx +//---------------------------------------------------------------------------- +// NOTE: All Variables are declared in the base class to eliminate hitching +//---------------------------------------------------------------------------- +var name SpitAnimation; +var transient float NextVomitTime; +function bool FlipOver(){ + return true; +} +// don't interrupt the bloat while he is puking +simulated function bool HitCanInterruptAction(){ + if(bShotAnim) + return false; + return true; +} + +function DoorAttack(Actor A) +{ + if ( bShotAnim || Physics == PHYS_Swimming) + return; + else if ( A!=none ) + { + bShotAnim = true; + if( !bDecapitated && bDistanceAttackingDoor ) + { + SetAnimAction('ZombieBarf'); + } + else + { + SetAnimAction('DoorBash'); + GotoState('DoorBashing'); + } + } +} +function RangedAttack(Actor A) +{ + local int LastFireTime; + local float ChargeChance; + 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 || VSize(A.Location-Location) <= 250) && !bDecapitated ) + { + bShotAnim = true; + + // Decide what chance the bloat has of charging during a puke attack + if( Level.Game.GameDifficulty < 2.0 ) + { + ChargeChance = 0.6; + } + else if( Level.Game.GameDifficulty < 4.0 ) + { + ChargeChance = 0.8; + } + else if( Level.Game.GameDifficulty < 5.0 ) + { + ChargeChance = 1.0; + } + else // Hardest difficulty + { + ChargeChance = 1.2; + } + + // Randomly do a moving attack so the player can't kite the zed + if( FRand() < ChargeChance ) + { + SetAnimAction('ZombieBarfMoving'); + RunAttackTimeout = GetAnimDuration('ZombieBarf', 0.5); + bMovingPukeAttack=true; + } + else + { + SetAnimAction('ZombieBarf'); + Controller.bPreparingMove = true; + Acceleration = vect(0,0,0); + } + + // Randomly send out a message about Bloat Vomit burning(3% chance) + if ( FRand() < 0.03 && KFHumanPawn(A) != none && PlayerController(KFHumanPawn(A).Controller) != none ) + { + PlayerController(KFHumanPawn(A).Controller).Speech('AUTO', 7, ""); + } + } +} +// Overridden to handle playing upper body only attacks when moving +simulated event SetAnimAction(name NewAction) +{ + local int meleeAnimIndex; + local bool bWantsToAttackAndMove; + if( NewAction=='' ) + Return; + bWantsToAttackAndMove = NewAction == 'ZombieBarfMoving'; + if( NewAction == 'Claw' ) + { + meleeAnimIndex = Rand(3); + NewAction = meleeAnims[meleeAnimIndex]; + } + if( bWantsToAttackAndMove ) + { + ExpectingChannel = AttackAndMoveDoAnimAction(NewAction); + } + else + { + ExpectingChannel = DoAnimAction(NewAction); + } + if( !bWantsToAttackAndMove && AnimNeedsWait(NewAction) ) + { + bWaitForAnim = true; + } + else + { + bWaitForAnim = false; + } + if( Level.NetMode!=NM_Client ) + { + AnimAction = NewAction; + bResetAnimAct = True; + ResetAnimActTime = Level.TimeSeconds+0.2; + } +} +// Handle playing the anim action on the upper body only if we're attacking and moving +simulated function int AttackAndMoveDoAnimAction( name AnimName ) +{ + if( AnimName=='ZombieBarfMoving' ) + { + AnimBlendParams(1, 1.0, 0.0,, FireRootBone); + PlayAnim('ZombieBarf',, 0.1, 1); + + return 1; + } + return super.DoAnimAction( AnimName ); +} +function PlayDyingSound() +{ + if( Level.NetMode!=NM_Client ) + { + if ( bGibbed ) + { + PlaySound(sound'KF_EnemiesFinalSnd.Bloat_DeathPop', SLOT_Pain,2.0,true,525); + return; + } + + if( bDecapitated ) + { + PlaySound(HeadlessDeathSound, SLOT_Pain,1.30,true,525); + } + else + { + PlaySound(sound'KF_EnemiesFinalSnd.Bloat_DeathPop', SLOT_Pain,2.0,true,525); + } + } +} + +// Barf Time. +function SpawnTwoShots() +{ + local vector X,Y,Z, FireStart; + local rotator FireRotation; + 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 = Location+(vect(30,0,64) >> Rotation)*DrawScale; + if ( !SavedFireProperties.bInitialized ) + { + SavedFireProperties.AmmoClass = Class'SkaarjAmmo'; + SavedFireProperties.ProjectileClass = Class'NiceSickVomit'; + SavedFireProperties.WarnTargetPct = 1; + SavedFireProperties.MaxRange = 600; + SavedFireProperties.bTossed = False; + SavedFireProperties.bTrySplash = False; + SavedFireProperties.bLeadTarget = True; + SavedFireProperties.bInstantHit = True; + SavedFireProperties.bInitialized = True; + } + // Turn off extra collision before spawning vomit, otherwise spawn fails + ToggleAuxCollision(false); + FireRotation = Controller.AdjustAim(SavedFireProperties,FireStart,600); + Spawn(Class'NiceSickVomit',,,FireStart,FireRotation); + FireStart-=(0.5*CollisionRadius*Y); + FireRotation.Yaw -= 1200; + spawn(Class'NiceSickVomit',,,FireStart, FireRotation); + FireStart+=(CollisionRadius*Y); + FireRotation.Yaw += 2400; + spawn(Class'NiceSickVomit',,,FireStart, FireRotation); + // Turn extra collision back on + ToggleAuxCollision(true); +} + + +function BileBomb() +{ + BloatJet = spawn(class'BileJet', self,,Location,Rotator(-PhysicsVolume.Gravity)); +} + +State Dying +{ + function tick(float deltaTime) + { + if (BloatJet != none) + { + BloatJet.SetLocation(location); + BloatJet.SetRotation(GetBoneRotation(FireRootBone)); + } + super.tick(deltaTime); + } +} +function RemoveHead() +{ + bCanDistanceAttackDoors = False; + Super.RemoveHead(); +} +static simulated function PreCacheMaterials(LevelInfo myLevel) +{//should be derived and used. + myLevel.AddPrecacheMaterial(Texture'NicePackT.MonsterSick.Sick_diffuse'); + myLevel.AddPrecacheMaterial(Combiner'NicePackT.MonsterSick.Sick_env'); + myLevel.AddPrecacheMaterial(Combiner'NicePackT.MonsterSick.Sick_cmb'); +} +defaultproperties +{ + DetachedArmClass=Class'NicePack.NiceSeveredArmSick' + DetachedLegClass=Class'NicePack.NiceSeveredLegSick' + DetachedHeadClass=Class'NicePack.NiceSeveredHeadSick' + ControllerClass=Class'NicePack.NiceSickZombieController' +} diff --git a/sources/Zeds/Nice/NiceZombieSickBase.uc b/sources/Zeds/Nice/NiceZombieSickBase.uc index 6a0c462..f32f679 100644 --- a/sources/Zeds/Nice/NiceZombieSickBase.uc +++ b/sources/Zeds/Nice/NiceZombieSickBase.uc @@ -1,16 +1,100 @@ -// Zombie Monster for KF Invasion gametype -class NiceZombieSickBase extends NiceMonster; -var name WalkAnim, RunAnim; -#exec OBJ LOAD FILE=KF_EnemiesFinalSnd.uax -var BileJet BloatJet; -var bool bPlayBileSplash; -var bool bMovingPukeAttack; -var float RunAttackTimeout; -var() float AttackChargeRate; -//------------------------------------------------------------------------------- -// NOTE: All Code resides in the child class(this class was only created to -// eliminate hitching caused by loading default properties during play) -//------------------------------------------------------------------------------- -defaultproperties -{ AttackChargeRate=2.500000 StunThreshold=4.000000 fuelRatio=0.250000 bWeakHead=True clientHeadshotScale=1.500000 MeleeAnims(0)="Strike" MeleeAnims(1)="Strike" MeleeAnims(2)="Strike" MoanVoice=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Talk' BleedOutDuration=6.000000 ZombieFlag=3 MeleeDamage=14 damageForce=70000 bFatAss=True KFRagdollName="Clot_Trip" MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_HitPlayer' JumpSound=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Jump' PuntAnim="BloatPunt" Intelligence=BRAINS_Stupid bCanDistanceAttackDoors=True bUseExtendedCollision=True ColOffset=(Z=55.000000) ColRadius=29.000000 ColHeight=18.000000 SeveredArmAttachScale=1.400000 SeveredLegAttachScale=1.400000 SeveredHeadAttachScale=1.400000 PlayerCountHealthScale=0.250000 HeadlessWalkAnims(0)="WalkF" HeadlessWalkAnims(1)="WalkB" HeadlessWalkAnims(2)="WalkL" HeadlessWalkAnims(3)="WalkR" BurningWalkFAnims(0)="WalkF" BurningWalkFAnims(1)="WalkF" BurningWalkFAnims(2)="WalkF" BurningWalkAnims(0)="WalkB" BurningWalkAnims(1)="WalkL" BurningWalkAnims(2)="WalkR" PoundRageBumpDamScale=0.010000 OnlineHeadshotOffset=(X=22.000000,Y=5.000000,Z=58.000000) HeadHealth=50.000000 MotionDetectorThreat=3.000000 HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Pain' DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Death' ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Challenge' ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Challenge' ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Challenge' ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Challenge' AmmunitionClass=Class'KFMod.BZombieAmmo' ScoringValue=75 IdleHeavyAnim="Idle" IdleRifleAnim="Idle" RagdollLifeSpan=20.000000 RagDeathVel=150.000000 RagShootStrength=300.000000 RagSpinScale=12.500000 RagDeathUpKick=50.000000 MeleeRange=30.000000 GroundSpeed=175.000000 WaterSpeed=150.000000 HealthMax=925.000000 Health=925 HeadHeight=2.200000 HeadScale=1.610000 AmbientSoundScaling=8.000000 MenuName="Sick" MovementAnims(0)="WalkF" MovementAnims(1)="WalkB" MovementAnims(2)="WalkL" MovementAnims(3)="WalkR" WalkAnims(1)="WalkB" WalkAnims(2)="WalkL" WalkAnims(3)="WalkR" IdleCrouchAnim="Idle" IdleWeaponAnim="Idle" IdleRestAnim="Idle" AmbientSound=Sound'KF_BaseGorefast.Gorefast_Idle' Mesh=SkeletalMesh'NicePackA.MonsterSick.Sick' DrawScale=1.100000 PrePivot=(Z=5.000000) Skins(0)=Combiner'NicePackT.MonsterSick.Sick_cmb' SoundVolume=200 Mass=400.000000 RotationRate=(Yaw=45000,Roll=0) -} +// Zombie Monster for KF Invasion gametype +class NiceZombieSickBase extends NiceMonster; +var name WalkAnim, RunAnim; +#exec OBJ LOAD FILE=KF_EnemiesFinalSnd.uax +var BileJet BloatJet; +var bool bPlayBileSplash; +var bool bMovingPukeAttack; +var float RunAttackTimeout; +var() float AttackChargeRate; +//------------------------------------------------------------------------------- +// NOTE: All Code resides in the child class(this class was only created to +// eliminate hitching caused by loading default properties during play) +//------------------------------------------------------------------------------- +defaultproperties +{ + AttackChargeRate=2.500000 + StunThreshold=4.000000 + fuelRatio=0.250000 + bWeakHead=True + clientHeadshotScale=1.500000 + MeleeAnims(0)="Strike" + MeleeAnims(1)="Strike" + MeleeAnims(2)="Strike" + MoanVoice=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Talk' + BleedOutDuration=6.000000 + ZombieFlag=3 + MeleeDamage=14 + damageForce=70000 + bFatAss=True + KFRagdollName="Clot_Trip" + MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_HitPlayer' + JumpSound=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Jump' + PuntAnim="BloatPunt" + Intelligence=BRAINS_Stupid + bCanDistanceAttackDoors=True + bUseExtendedCollision=True + ColOffset=(Z=55.000000) + ColRadius=29.000000 + ColHeight=18.000000 + SeveredArmAttachScale=1.400000 + SeveredLegAttachScale=1.400000 + SeveredHeadAttachScale=1.400000 + PlayerCountHealthScale=0.250000 + HeadlessWalkAnims(0)="WalkF" + HeadlessWalkAnims(1)="WalkB" + HeadlessWalkAnims(2)="WalkL" + HeadlessWalkAnims(3)="WalkR" + BurningWalkFAnims(0)="WalkF" + BurningWalkFAnims(1)="WalkF" + BurningWalkFAnims(2)="WalkF" + BurningWalkAnims(0)="WalkB" + BurningWalkAnims(1)="WalkL" + BurningWalkAnims(2)="WalkR" + PoundRageBumpDamScale=0.010000 + OnlineHeadshotOffset=(X=22.000000,Y=5.000000,Z=58.000000) + HeadHealth=50.000000 + MotionDetectorThreat=3.000000 + HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Pain' + DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Death' + ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Challenge' + ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Challenge' + ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Challenge' + ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd.GoreFast.Gorefast_Challenge' + AmmunitionClass=Class'KFMod.BZombieAmmo' + ScoringValue=75 + IdleHeavyAnim="Idle" + IdleRifleAnim="Idle" + RagdollLifeSpan=20.000000 + RagDeathVel=150.000000 + RagShootStrength=300.000000 + RagSpinScale=12.500000 + RagDeathUpKick=50.000000 + MeleeRange=30.000000 + GroundSpeed=175.000000 + WaterSpeed=150.000000 + HealthMax=925.000000 + Health=925 + HeadHeight=2.200000 + HeadScale=1.610000 + AmbientSoundScaling=8.000000 + MenuName="Sick" + MovementAnims(0)="WalkF" + MovementAnims(1)="WalkB" + MovementAnims(2)="WalkL" + MovementAnims(3)="WalkR" + WalkAnims(1)="WalkB" + WalkAnims(2)="WalkL" + WalkAnims(3)="WalkR" + IdleCrouchAnim="Idle" + IdleWeaponAnim="Idle" + IdleRestAnim="Idle" + AmbientSound=Sound'KF_BaseGorefast.Gorefast_Idle' + Mesh=SkeletalMesh'NicePackA.MonsterSick.Sick' + DrawScale=1.100000 + PrePivot=(Z=5.000000) + Skins(0)=Combiner'NicePackT.MonsterSick.Sick_cmb' + SoundVolume=200 + Mass=400.000000 + RotationRate=(Yaw=45000,Roll=0) +} diff --git a/sources/Zeds/Nice/NiceZombieSiren.uc b/sources/Zeds/Nice/NiceZombieSiren.uc index 3fe4744..a0efd81 100644 --- a/sources/Zeds/Nice/NiceZombieSiren.uc +++ b/sources/Zeds/Nice/NiceZombieSiren.uc @@ -1,194 +1,455 @@ -// Zombie Monster for KF Invasion gametype -class NiceZombieSiren extends NiceZombieSirenBase; -var float screamLength; -var float screamStartTime; -var int currScreamTiming; -var int currentScreamID; -var array screamTimings; -simulated function PostBeginPlay() -{ - super.PostBeginPlay(); - screamLength = GetAnimDuration('Siren_Scream'); -} -simulated event SetAnimAction(name NewAction) -{ - local int meleeAnimIndex; - if( NewAction=='' ) Return; - if(NewAction == 'Claw') - { meleeAnimIndex = Rand(3); NewAction = meleeAnims[meleeAnimIndex]; - } - ExpectingChannel = DoAnimAction(NewAction); - if( AnimNeedsWait(NewAction) ) - { bWaitForAnim = true; - } - else - { bWaitForAnim = false; - } - if( Level.NetMode!=NM_Client ) - { AnimAction = NewAction; bResetAnimAct = True; ResetAnimActTime = Level.TimeSeconds+0.3; - } -} -simulated function bool AnimNeedsWait(name TestAnim) -{ - return false; -} -function bool FlipOver() -{ - return true; -} -function DoorAttack(Actor A) -{ - if ( bShotAnim || Physics == PHYS_Swimming || bDecapitated || A==none ) return; - bShotAnim = true; - SetAnimAction('Siren_Scream'); -} -function MakeNewScreamBall(){ - local int i; - local NicePack niceMut; - if(screamStartTime > 0){ niceMut = class'NicePack'.static.Myself(Level); if(niceMut != none){ for(i = 0;i < niceMut.playersList.Length;i ++) if(niceMut.playersList[i] != none && screamStartTime > 0) niceMut.playersList[i].SpawnSirenBall(self); } - } -} -function DiscardCurrentScreamBall(){ - local int i; - local NicePack niceMut; - if(screamStartTime > 0){ niceMut = class'NicePack'.static.Myself(Level); if(niceMut != none){ for(i = 0;i < niceMut.playersList.Length;i ++) if(niceMut.playersList[i] != none) niceMut.playersList[i].ClientRemoveSirenBall(currentScreamID); } screamStartTime = -1.0; currScreamTiming = -1; - } -} -function RangedAttack(Actor A) -{ - local int LastFireTime; - local float Dist; - if ( bShotAnim ) return; - Dist = VSize(A.Location - Location); - if ( Physics == PHYS_Swimming ) - { SetAnimAction('Claw'); bShotAnim = true; LastFireTime = Level.TimeSeconds; - } - else if(Dist < MeleeRange + CollisionRadius + A.CollisionRadius && A != Self) - { bShotAnim = true; LastFireTime = Level.TimeSeconds; SetAnimAction('Claw'); Controller.bPreparingMove = true; Acceleration = vect(0,0,0); - } - else if( Dist <= ScreamRadius && !bDecapitated && !bZapped ) - { bShotAnim=true; SetAnimAction('Siren_Scream'); if(screamStartTime > 0) DiscardCurrentScreamBall(); currScreamTiming = 0; screamStartTime = Level.TimeSeconds; // Only stop moving if we are close if( Dist < ScreamRadius * 0.25 ) { Controller.bPreparingMove = true; Acceleration = vect(0,0,0); } else { Acceleration = AccelRate * Normal(A.Location - Location); } - } -} -simulated function int DoAnimAction( name AnimName ) -{ - if( AnimName=='Siren_Scream' || AnimName=='Siren_Bite' || AnimName=='Siren_Bite2' ) - { AnimBlendParams(1, 1.0, 0.0,, SpineBone1); PlayAnim(AnimName,, 0.1, 1); return 1; - } - PlayAnim(AnimName,,0.1); - Return 0; -} -// Scream Time -simulated function SpawnTwoShots(){ - if(bZapped) return; - if(Health > 0 && HeadHealth > 0 && !bIsStunned) DoShakeEffect(); - if( Level.NetMode!=NM_Client ) - { // Deal Actual Damage. if(controller!=none && KFDoorMover(Controller.Target) != none) Controller.Target.TakeDamage(ScreamDamage*0.6,Self,Location,vect(0,0,0),ScreamDamageType); else HurtRadius(ScreamDamage ,ScreamRadius, ScreamDamageType, ScreamForce, Location); if(screamStartTime > 0) currScreamTiming ++; else Log("ERROR: unexpected siren scream happend!"); - } -} -// Shake nearby players screens -simulated function DoShakeEffect() -{ - local PlayerController PC; - local NicePlayerController nicePlayer; - local float Dist, scale, BlurScale; - //viewshake - if (Level.NetMode != NM_DedicatedServer) - { PC = Level.GetLocalPlayerController(); - nicePlayer = NicePlayerController(PC); if (PC != none && PC.ViewTarget != none) { Dist = VSize(Location - PC.ViewTarget.Location); if (Dist < ScreamRadius ) { scale = (ScreamRadius - Dist) / (ScreamRadius); scale *= ShakeEffectScalar; - if(nicePlayer != none) - scale *= nicePlayer.sirenScreamMod; - BlurScale = scale; - // Reduce blur if there is something between us and the siren if( !FastTrace(PC.ViewTarget.Location,Location) ) { scale *= 0.25; BlurScale = scale; } else { if(nicePlayer != none) - scale = Lerp(scale, MinShakeEffectScale * nicePlayer.sirenScreamMod, 1.0); - else - scale = Lerp(scale, MinShakeEffectScale, 1.0); } - PC.SetAmbientShake(Level.TimeSeconds + ShakeFadeTime, ShakeTime, OffsetMag * Scale, OffsetRate, RotMag * Scale, RotRate); - if( KFHumanPawn(PC.ViewTarget) != none ) { KFHumanPawn(PC.ViewTarget).AddBlur(ShakeTime, BlurScale * ScreamBlurScale); } - // 10% chance of player saying something about our scream if ( Level != none && Level.Game != none && !KFGameType(Level.Game).bDidSirenScreamMessage && FRand() < 0.10 ) { PC.Speech('AUTO', 16, ""); KFGameType(Level.Game).bDidSirenScreamMessage = true; } } } - } -} -simulated function HurtRadius(float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation) -{ - local actor Victims; - local float InitMomentum; - local float damageScale, dist; - local vector dir; - local float UsedDamageAmount; - local KFHumanPawn humanPawn; - local class niceVet; - if(bHurtEntry || Health <= 0 || HeadHealth <= 0 || bIsStunned) return; - bHurtEntry = true; - InitMomentum = Momentum; - if(screamStartTime > 0 && currScreamTiming == 0) MakeNewScreamBall(); - foreach VisibleCollidingActors(class 'Actor', Victims, DamageRadius, HitLocation){ Momentum = InitMomentum; // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag // Or Karma actors in this case. Self inflicted Death due to flying chairs is uncool for a zombie of your stature. if((Victims != self) && !Victims.IsA('FluidSurfaceInfo') && !Victims.IsA('KFMonster') && !Victims.IsA('ExtendedZCollision')){ dir = Victims.Location - HitLocation; dist = FMax(1,VSize(dir)); dir = dir/dist; damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); humanPawn = KFHumanPawn(Victims); if(humanPawn == none) // If it aint human, don't pull the vortex crap on it. Momentum = 0; else{ // Also don't do it if we're sharpshooter with a right skill niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(humanPawn.PlayerReplicationInfo); if(niceVet != none && !niceVet.static.CanBePulled(KFPlayerReplicationInfo(humanPawn.PlayerReplicationInfo))) Momentum = 0; } - if(Victims.IsA('KFGlassMover')) // Hack for shattering in interesting ways. UsedDamageAmount = 100000; // Siren always shatters glass else UsedDamageAmount = DamageAmount; - Victims.TakeDamage(damageScale * UsedDamageAmount,Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, (damageScale * Momentum * dir), DamageType); - if (Instigator != none && Vehicle(Victims) != none && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(UsedDamageAmount, DamageRadius, Instigator.Controller, DamageType, Momentum, HitLocation); } - } - bHurtEntry = false; -} -// When siren loses her head she's got nothin' Kill her. -function RemoveHead(){ - Super.RemoveHead(); -} -simulated function Tick( float Delta ) -{ - local float currScreamTime; - Super.Tick(Delta); - if( bAboutToDie && Level.TimeSeconds>DeathTimer ) - { if( Health>0 && Level.NetMode!=NM_Client ) KilledBy(LastDamagedBy); bAboutToDie = False; - } - if( Role == ROLE_Authority ) - { if( bShotAnim ) { SetGroundSpeed(GetOriginalGroundSpeed() * 0.65); - if( LookTarget!=none ) { Acceleration = AccelRate * Normal(LookTarget.Location - Location); } } else { SetGroundSpeed(GetOriginalGroundSpeed()); } - } - if(Role == ROLE_Authority && screamStartTime > 0){ currScreamTime = Level.TimeSeconds - screamStartTime; if(currScreamTiming >= screamTimings.Length || currScreamTime - 0.1 > screamTimings[currScreamTiming] * screamLength){ DiscardCurrentScreamBall(); } - } - if(bOnFire && !bShotAnim) RangedAttack(Self); -} -function PlayDyingSound() -{ - if( !bAboutToDie ) Super.PlayDyingSound(); -} -simulated function ProcessHitFX() -{ - local Coords boneCoords; - local class HitEffects[4]; - local int i,j; - local float GibPerterbation; - if( (Level.NetMode == NM_DedicatedServer) || bSkeletized || (Mesh == SkeletonMesh)) - { SimHitFxTicker = HitFxTicker; return; - } - for ( SimHitFxTicker = SimHitFxTicker; SimHitFxTicker != HitFxTicker; SimHitFxTicker = (SimHitFxTicker + 1) % ArrayCount(HitFX) ) - { j++; if ( j > 30 ) { SimHitFxTicker = HitFxTicker; return; } - if( (HitFX[SimHitFxTicker].damtype == none) || (Level.bDropDetail && (Level.TimeSeconds - LastRenderTime > 3) && !IsHumanControlled()) ) continue; - //log("Processing effects for damtype "$HitFX[SimHitFxTicker].damtype); - if( HitFX[SimHitFxTicker].bone == 'obliterate' && !class'GameInfo'.static.UseLowGore()) { SpawnGibs( HitFX[SimHitFxTicker].rotDir, 1); bGibbed = true; // Wait a tick on a listen server so the obliteration can replicate before the pawn is destroyed if( Level.NetMode == NM_ListenServer ) { bDestroyNextTick = true; TimeSetDestroyNextTickTime = Level.TimeSeconds; } else { Destroy(); } return; } - boneCoords = GetBoneCoords( HitFX[SimHitFxTicker].bone ); - if ( !Level.bDropDetail && !class'GameInfo'.static.NoBlood() && !bSkeletized && !class'GameInfo'.static.UseLowGore()) { //AttachEmitterEffect( BleedingEmitterClass, HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); - HitFX[SimHitFxTicker].damtype.static.GetHitEffects( HitEffects, Health ); - if( !PhysicsVolume.bWaterVolume ) // don't attach effects under water { for( i = 0; i < ArrayCount(HitEffects); i++ ) { if( HitEffects[i] == none ) continue; - AttachEffect( HitEffects[i], HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); } } } if ( class'GameInfo'.static.UseLowGore() ) HitFX[SimHitFxTicker].bSever = false; - if( HitFX[SimHitFxTicker].bSever ) { GibPerterbation = HitFX[SimHitFxTicker].damtype.default.GibPerterbation; - switch( HitFX[SimHitFxTicker].bone ) { case 'obliterate': break; - case LeftThighBone: if( !bLeftLegGibbed ) { SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; bLeftLegGibbed=true; } break; - case RightThighBone: if( !bRightLegGibbed ) { SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; bRightLegGibbed=true; } break; - case LeftFArmBone: break; - case RightFArmBone: break; - case 'head': if( !bHeadGibbed ) { if ( HitFX[SimHitFxTicker].damtype == class'DamTypeDecapitation' ) { DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false); } else if( HitFX[SimHitFxTicker].damtype == class'DamTypeProjectileDecap' ) { DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false, true); } else if( HitFX[SimHitFxTicker].damtype == class'DamTypeMeleeDecapitation' ) { DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, true); } - bHeadGibbed=true; } break; } - if( HitFX[SimHitFXTicker].bone != 'Spine' && HitFX[SimHitFXTicker].bone != FireRootBone && HitFX[SimHitFXTicker].bone != LeftFArmBone && HitFX[SimHitFXTicker].bone != RightFArmBone && HitFX[SimHitFXTicker].bone != 'head' && Health <=0 ) HideBone(HitFX[SimHitFxTicker].bone); } - } -} -static simulated function PreCacheMaterials(LevelInfo myLevel) -{//should be derived and used. - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.siren_cmb'); - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.siren_env_cmb'); - myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.siren_diffuse'); - myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.siren_hair'); - myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.siren_hair_fb'); -} -defaultproperties -{ screamTimings(0)=0.420000 screamTimings(1)=0.510000 screamTimings(2)=0.590000 screamTimings(3)=0.670000 screamTimings(4)=0.760000 screamTimings(5)=0.840000 stunLoopStart=0.200000 stunLoopEnd=0.820000 idleInsertFrame=0.920000 EventClasses(0)="NicePack.NiceZombieSiren" MoanVoice=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Talk' JumpSound=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Jump' DetachedLegClass=Class'KFChar.SeveredLegSiren' DetachedHeadClass=Class'KFChar.SeveredHeadSiren' HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Pain' DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Death' ControllerClass=Class'NicePack.NiceZombieSirenController' AmbientSound=Sound'KF_BaseSiren.Siren_IdleLoop' Mesh=SkeletalMesh'KF_Freaks_Trip.Siren_Freak' Skins(0)=FinalBlend'KF_Specimens_Trip_T.siren_hair_fb' Skins(1)=Combiner'KF_Specimens_Trip_T.siren_cmb' -} +// Zombie Monster for KF Invasion gametype +class NiceZombieSiren extends NiceZombieSirenBase; +var float screamLength; +var float screamStartTime; +var int currScreamTiming; +var int currentScreamID; +var array screamTimings; +simulated function PostBeginPlay() +{ + super.PostBeginPlay(); + screamLength = GetAnimDuration('Siren_Scream'); +} +simulated event SetAnimAction(name NewAction) +{ + local int meleeAnimIndex; + if( NewAction=='' ) + Return; + if(NewAction == 'Claw') + { + meleeAnimIndex = Rand(3); + NewAction = meleeAnims[meleeAnimIndex]; + } + ExpectingChannel = DoAnimAction(NewAction); + if( AnimNeedsWait(NewAction) ) + { + bWaitForAnim = true; + } + else + { + bWaitForAnim = false; + } + if( Level.NetMode!=NM_Client ) + { + AnimAction = NewAction; + bResetAnimAct = True; + ResetAnimActTime = Level.TimeSeconds+0.3; + } +} +simulated function bool AnimNeedsWait(name TestAnim) +{ + return false; +} +function bool FlipOver() +{ + return true; +} +function DoorAttack(Actor A) +{ + if ( bShotAnim || Physics == PHYS_Swimming || bDecapitated || A==none ) + return; + bShotAnim = true; + SetAnimAction('Siren_Scream'); +} +function MakeNewScreamBall(){ + local int i; + local NicePack niceMut; + if(screamStartTime > 0){ + niceMut = class'NicePack'.static.Myself(Level); + if(niceMut != none){ + for(i = 0;i < niceMut.playersList.Length;i ++) + if(niceMut.playersList[i] != none && screamStartTime > 0) + niceMut.playersList[i].SpawnSirenBall(self); + } + } +} +function DiscardCurrentScreamBall(){ + local int i; + local NicePack niceMut; + if(screamStartTime > 0){ + niceMut = class'NicePack'.static.Myself(Level); + if(niceMut != none){ + for(i = 0;i < niceMut.playersList.Length;i ++) + if(niceMut.playersList[i] != none) + niceMut.playersList[i].ClientRemoveSirenBall(currentScreamID); + } + screamStartTime = -1.0; + currScreamTiming = -1; + } +} +function RangedAttack(Actor A) +{ + local int LastFireTime; + local float Dist; + if ( bShotAnim ) + return; + Dist = VSize(A.Location - Location); + if ( Physics == PHYS_Swimming ) + { + SetAnimAction('Claw'); + bShotAnim = true; + LastFireTime = Level.TimeSeconds; + } + else if(Dist < MeleeRange + CollisionRadius + A.CollisionRadius && A != Self) + { + bShotAnim = true; + LastFireTime = Level.TimeSeconds; + SetAnimAction('Claw'); + Controller.bPreparingMove = true; + Acceleration = vect(0,0,0); + } + else if( Dist <= ScreamRadius && !bDecapitated && !bZapped ) + { + bShotAnim=true; + SetAnimAction('Siren_Scream'); + if(screamStartTime > 0) + DiscardCurrentScreamBall(); + currScreamTiming = 0; + screamStartTime = Level.TimeSeconds; + // Only stop moving if we are close + if( Dist < ScreamRadius * 0.25 ) + { + Controller.bPreparingMove = true; + Acceleration = vect(0,0,0); + } + else + { + Acceleration = AccelRate * Normal(A.Location - Location); + } + } +} +simulated function int DoAnimAction( name AnimName ) +{ + if( AnimName=='Siren_Scream' || AnimName=='Siren_Bite' || AnimName=='Siren_Bite2' ) + { + AnimBlendParams(1, 1.0, 0.0,, SpineBone1); + PlayAnim(AnimName,, 0.1, 1); + return 1; + } + PlayAnim(AnimName,,0.1); + Return 0; +} +// Scream Time +simulated function SpawnTwoShots(){ + if(bZapped) + return; + if(Health > 0 && HeadHealth > 0 && !bIsStunned) + DoShakeEffect(); + if( Level.NetMode!=NM_Client ) + { + // Deal Actual Damage. + if(controller!=none && KFDoorMover(Controller.Target) != none) + Controller.Target.TakeDamage(ScreamDamage*0.6,Self,Location,vect(0,0,0),ScreamDamageType); + else HurtRadius(ScreamDamage ,ScreamRadius, ScreamDamageType, ScreamForce, Location); + if(screamStartTime > 0) + currScreamTiming ++; + else + Log("ERROR: unexpected siren scream happend!"); + } +} +// Shake nearby players screens +simulated function DoShakeEffect() +{ + local PlayerController PC; + local NicePlayerController nicePlayer; + local float Dist, scale, BlurScale; + //viewshake + if (Level.NetMode != NM_DedicatedServer) + { + PC = Level.GetLocalPlayerController(); + nicePlayer = NicePlayerController(PC); + if (PC != none && PC.ViewTarget != none) + { + Dist = VSize(Location - PC.ViewTarget.Location); + if (Dist < ScreamRadius ) + { + scale = (ScreamRadius - Dist) / (ScreamRadius); + scale *= ShakeEffectScalar; + if(nicePlayer != none) + scale *= nicePlayer.sirenScreamMod; + + BlurScale = scale; + + // Reduce blur if there is something between us and the siren + if( !FastTrace(PC.ViewTarget.Location,Location) ) + { + scale *= 0.25; + BlurScale = scale; + } + else + { + if(nicePlayer != none) + scale = Lerp(scale, MinShakeEffectScale * nicePlayer.sirenScreamMod, 1.0); + else + scale = Lerp(scale, MinShakeEffectScale, 1.0); + } + + PC.SetAmbientShake(Level.TimeSeconds + ShakeFadeTime, ShakeTime, OffsetMag * Scale, OffsetRate, RotMag * Scale, RotRate); + + if( KFHumanPawn(PC.ViewTarget) != none ) + { + KFHumanPawn(PC.ViewTarget).AddBlur(ShakeTime, BlurScale * ScreamBlurScale); + } + + // 10% chance of player saying something about our scream + if ( Level != none && Level.Game != none && !KFGameType(Level.Game).bDidSirenScreamMessage && FRand() < 0.10 ) + { + PC.Speech('AUTO', 16, ""); + KFGameType(Level.Game).bDidSirenScreamMessage = true; + } + } + } + } +} +simulated function HurtRadius(float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation) +{ + local actor Victims; + local float InitMomentum; + local float damageScale, dist; + local vector dir; + local float UsedDamageAmount; + local KFHumanPawn humanPawn; + local class niceVet; + if(bHurtEntry || Health <= 0 || HeadHealth <= 0 || bIsStunned) + return; + bHurtEntry = true; + InitMomentum = Momentum; + if(screamStartTime > 0 && currScreamTiming == 0) + MakeNewScreamBall(); + foreach VisibleCollidingActors(class 'Actor', Victims, DamageRadius, HitLocation){ + Momentum = InitMomentum; + // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag + // Or Karma actors in this case. Self inflicted Death due to flying chairs is uncool for a zombie of your stature. + if((Victims != self) && !Victims.IsA('FluidSurfaceInfo') && !Victims.IsA('KFMonster') && !Victims.IsA('ExtendedZCollision')){ + dir = Victims.Location - HitLocation; + dist = FMax(1,VSize(dir)); + dir = dir/dist; + damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); + humanPawn = KFHumanPawn(Victims); + if(humanPawn == none) // If it aint human, don't pull the vortex crap on it. + Momentum = 0; + else{ // Also don't do it if we're sharpshooter with a right skill + niceVet = class'NiceVeterancyTypes'.static.GetVeterancy(humanPawn.PlayerReplicationInfo); + if(niceVet != none && !niceVet.static.CanBePulled(KFPlayerReplicationInfo(humanPawn.PlayerReplicationInfo))) + Momentum = 0; + } + + if(Victims.IsA('KFGlassMover')) // Hack for shattering in interesting ways. + UsedDamageAmount = 100000; // Siren always shatters glass + else + UsedDamageAmount = DamageAmount; + + Victims.TakeDamage(damageScale * UsedDamageAmount,Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, (damageScale * Momentum * dir), DamageType); + + if (Instigator != none && Vehicle(Victims) != none && Vehicle(Victims).Health > 0) + Vehicle(Victims).DriverRadiusDamage(UsedDamageAmount, DamageRadius, Instigator.Controller, DamageType, Momentum, HitLocation); + } + } + bHurtEntry = false; +} +// When siren loses her head she's got nothin' Kill her. +function RemoveHead(){ + Super.RemoveHead(); +} +simulated function Tick( float Delta ) +{ + local float currScreamTime; + Super.Tick(Delta); + if( bAboutToDie && Level.TimeSeconds>DeathTimer ) + { + if( Health>0 && Level.NetMode!=NM_Client ) + KilledBy(LastDamagedBy); + bAboutToDie = False; + } + if( Role == ROLE_Authority ) + { + if( bShotAnim ) + { + SetGroundSpeed(GetOriginalGroundSpeed() * 0.65); + + if( LookTarget!=none ) + { + Acceleration = AccelRate * Normal(LookTarget.Location - Location); + } + } + else + { + SetGroundSpeed(GetOriginalGroundSpeed()); + } + } + if(Role == ROLE_Authority && screamStartTime > 0){ + currScreamTime = Level.TimeSeconds - screamStartTime; + if(currScreamTiming >= screamTimings.Length || + currScreamTime - 0.1 > screamTimings[currScreamTiming] * screamLength){ + DiscardCurrentScreamBall(); + } + } + if(bOnFire && !bShotAnim) + RangedAttack(Self); +} +function PlayDyingSound() +{ + if( !bAboutToDie ) + Super.PlayDyingSound(); +} +simulated function ProcessHitFX() +{ + local Coords boneCoords; + local class HitEffects[4]; + local int i,j; + local float GibPerterbation; + if( (Level.NetMode == NM_DedicatedServer) || bSkeletized || (Mesh == SkeletonMesh)) + { + SimHitFxTicker = HitFxTicker; + return; + } + for ( SimHitFxTicker = SimHitFxTicker; SimHitFxTicker != HitFxTicker; SimHitFxTicker = (SimHitFxTicker + 1) % ArrayCount(HitFX) ) + { + j++; + if ( j > 30 ) + { + SimHitFxTicker = HitFxTicker; + return; + } + + if( (HitFX[SimHitFxTicker].damtype == none) || (Level.bDropDetail && (Level.TimeSeconds - LastRenderTime > 3) && !IsHumanControlled()) ) + continue; + + //log("Processing effects for damtype "$HitFX[SimHitFxTicker].damtype); + + if( HitFX[SimHitFxTicker].bone == 'obliterate' && !class'GameInfo'.static.UseLowGore()) + { + SpawnGibs( HitFX[SimHitFxTicker].rotDir, 1); + bGibbed = true; + // Wait a tick on a listen server so the obliteration can replicate before the pawn is destroyed + if( Level.NetMode == NM_ListenServer ) + { + bDestroyNextTick = true; + TimeSetDestroyNextTickTime = Level.TimeSeconds; + } + else + { + Destroy(); + } + return; + } + + boneCoords = GetBoneCoords( HitFX[SimHitFxTicker].bone ); + + if ( !Level.bDropDetail && !class'GameInfo'.static.NoBlood() && !bSkeletized && !class'GameInfo'.static.UseLowGore()) + { + //AttachEmitterEffect( BleedingEmitterClass, HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); + + HitFX[SimHitFxTicker].damtype.static.GetHitEffects( HitEffects, Health ); + + if( !PhysicsVolume.bWaterVolume ) // don't attach effects under water + { + for( i = 0; i < ArrayCount(HitEffects); i++ ) + { + if( HitEffects[i] == none ) + continue; + + AttachEffect( HitEffects[i], HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); + } + } + } + if ( class'GameInfo'.static.UseLowGore() ) + HitFX[SimHitFxTicker].bSever = false; + + if( HitFX[SimHitFxTicker].bSever ) + { + GibPerterbation = HitFX[SimHitFxTicker].damtype.default.GibPerterbation; + + switch( HitFX[SimHitFxTicker].bone ) + { + case 'obliterate': + break; + + case LeftThighBone: + if( !bLeftLegGibbed ) + { + SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + bLeftLegGibbed=true; + } + break; + + case RightThighBone: + if( !bRightLegGibbed ) + { + SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) ); + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ; + bRightLegGibbed=true; + } + break; + + case LeftFArmBone: + break; + + case RightFArmBone: + break; + + case 'head': + if( !bHeadGibbed ) + { + if ( HitFX[SimHitFxTicker].damtype == class'DamTypeDecapitation' ) + { + DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false); + } + else if( HitFX[SimHitFxTicker].damtype == class'DamTypeProjectileDecap' ) + { + DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false, true); + } + else if( HitFX[SimHitFxTicker].damtype == class'DamTypeMeleeDecapitation' ) + { + DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, true); + } + + bHeadGibbed=true; + } + break; + } + + if( HitFX[SimHitFXTicker].bone != 'Spine' && HitFX[SimHitFXTicker].bone != FireRootBone && + HitFX[SimHitFXTicker].bone != LeftFArmBone && HitFX[SimHitFXTicker].bone != RightFArmBone && + HitFX[SimHitFXTicker].bone != 'head' && Health <=0 ) + HideBone(HitFX[SimHitFxTicker].bone); + } + } +} +static simulated function PreCacheMaterials(LevelInfo myLevel) +{//should be derived and used. + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.siren_cmb'); + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.siren_env_cmb'); + myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.siren_diffuse'); + myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.siren_hair'); + myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.siren_hair_fb'); +} +defaultproperties +{ + screamTimings(0)=0.420000 + screamTimings(1)=0.510000 + screamTimings(2)=0.590000 + screamTimings(3)=0.670000 + screamTimings(4)=0.760000 + screamTimings(5)=0.840000 + stunLoopStart=0.200000 + stunLoopEnd=0.820000 + idleInsertFrame=0.920000 + EventClasses(0)="NicePack.NiceZombieSiren" + MoanVoice=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Talk' + JumpSound=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Jump' + DetachedLegClass=Class'KFChar.SeveredLegSiren' + DetachedHeadClass=Class'KFChar.SeveredHeadSiren' + HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Pain' + DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Death' + ControllerClass=Class'NicePack.NiceZombieSirenController' + AmbientSound=Sound'KF_BaseSiren.Siren_IdleLoop' + Mesh=SkeletalMesh'KF_Freaks_Trip.Siren_Freak' + Skins(0)=FinalBlend'KF_Specimens_Trip_T.siren_hair_fb' + Skins(1)=Combiner'KF_Specimens_Trip_T.siren_cmb' +} diff --git a/sources/Zeds/Nice/NiceZombieSirenBase.uc b/sources/Zeds/Nice/NiceZombieSirenBase.uc index 79bd9e8..c5bcc1b 100644 --- a/sources/Zeds/Nice/NiceZombieSirenBase.uc +++ b/sources/Zeds/Nice/NiceZombieSirenBase.uc @@ -1,24 +1,97 @@ -// Zombie Monster for KF Invasion gametype -class NiceZombieSirenBase extends NiceMonster - abstract; -var () int ScreamRadius; // AOE for scream attack. -var () class ScreamDamageType; -var () int ScreamForce; -var(Shake) rotator RotMag; // how far to rot view -var(Shake) float RotRate; // how fast to rot view -var(Shake) vector OffsetMag; // max view offset vertically -var(Shake) float OffsetRate; // how fast to offset view vertically -var(Shake) float ShakeTime; // how long to shake for per scream -var(Shake) float ShakeFadeTime; // how long after starting to shake to start fading out -var(Shake) float ShakeEffectScalar; // Overall scale for shake/blur effect -var(Shake) float MinShakeEffectScale;// The minimum that the shake effect drops off over distance -var(Shake) float ScreamBlurScale; // How much motion blur to give from screams -var bool bAboutToDie; -var float DeathTimer; -//------------------------------------------------------------------------------- -// NOTE: All Code resides in the child class(this class was only created to -// eliminate hitching caused by loading default properties during play) -//------------------------------------------------------------------------------- -defaultproperties -{ ScreamRadius=700 ScreamDamageType=Class'KFMod.SirenScreamDamage' ScreamForce=-150000 RotMag=(Pitch=150,Yaw=150,Roll=150) RotRate=500.000000 OffsetMag=(Y=5.000000,Z=1.000000) OffsetRate=500.000000 ShakeTime=2.000000 ShakeFadeTime=0.250000 ShakeEffectScalar=1.000000 MinShakeEffectScale=0.600000 ScreamBlurScale=0.850000 StunThreshold=3.000000 fuelRatio=0.650000 clientHeadshotScale=1.200000 niceZombieDamType=Class'NicePack.NiceZedSlashingDamageType' MeleeAnims(0)="Siren_Bite" MeleeAnims(1)="Siren_Bite2" MeleeAnims(2)="Siren_Bite" HitAnims(0)="HitReactionF" HitAnims(1)="HitReactionF" HitAnims(2)="HitReactionF" ZapThreshold=0.500000 ZappedDamageMod=1.500000 ZombieFlag=1 MeleeDamage=13 damageForce=5000 KFRagdollName="Siren_Trip" ScreamDamage=10 CrispUpThreshhold=7 bCanDistanceAttackDoors=True bUseExtendedCollision=True ColOffset=(Z=48.000000) ColRadius=25.000000 ColHeight=5.000000 ExtCollAttachBoneName="Collision_Attach" SeveredLegAttachScale=0.700000 PlayerCountHealthScale=0.100000 OnlineHeadshotOffset=(X=6.000000,Z=41.000000) OnlineHeadshotScale=1.200000 HeadHealth=200.000000 PlayerNumHeadHealthScale=0.050000 MotionDetectorThreat=2.000000 ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Challenge' ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Challenge' ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Challenge' ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Challenge' ScoringValue=25 SoundGroupClass=Class'KFMod.KFFemaleZombieSounds' IdleHeavyAnim="Siren_Idle" IdleRifleAnim="Siren_Idle" MeleeRange=45.000000 GroundSpeed=100.000000 WaterSpeed=80.000000 HealthMax=240.000000 Health=240 HeadHeight=1.000000 HeadScale=1.000000 MenuName="Nice Siren" MovementAnims(0)="Siren_Walk" MovementAnims(1)="Siren_Walk" MovementAnims(2)="Siren_Walk" MovementAnims(3)="Siren_Walk" WalkAnims(0)="Siren_Walk" WalkAnims(1)="Siren_Walk" WalkAnims(2)="Siren_Walk" WalkAnims(3)="Siren_Walk" IdleCrouchAnim="Siren_Idle" IdleWeaponAnim="Siren_Idle" IdleRestAnim="Siren_Idle" DrawScale=1.050000 PrePivot=(Z=3.000000) RotationRate=(Yaw=45000,Roll=0) -} +// Zombie Monster for KF Invasion gametype +class NiceZombieSirenBase extends NiceMonster + abstract; +var () int ScreamRadius; // AOE for scream attack. +var () class ScreamDamageType; +var () int ScreamForce; +var(Shake) rotator RotMag; // how far to rot view +var(Shake) float RotRate; // how fast to rot view +var(Shake) vector OffsetMag; // max view offset vertically +var(Shake) float OffsetRate; // how fast to offset view vertically +var(Shake) float ShakeTime; // how long to shake for per scream +var(Shake) float ShakeFadeTime; // how long after starting to shake to start fading out +var(Shake) float ShakeEffectScalar; // Overall scale for shake/blur effect +var(Shake) float MinShakeEffectScale;// The minimum that the shake effect drops off over distance +var(Shake) float ScreamBlurScale; // How much motion blur to give from screams +var bool bAboutToDie; +var float DeathTimer; +//------------------------------------------------------------------------------- +// NOTE: All Code resides in the child class(this class was only created to +// eliminate hitching caused by loading default properties during play) +//------------------------------------------------------------------------------- +defaultproperties +{ + ScreamRadius=700 + ScreamDamageType=Class'KFMod.SirenScreamDamage' + ScreamForce=-150000 + RotMag=(Pitch=150,Yaw=150,Roll=150) + RotRate=500.000000 + OffsetMag=(Y=5.000000,Z=1.000000) + OffsetRate=500.000000 + ShakeTime=2.000000 + ShakeFadeTime=0.250000 + ShakeEffectScalar=1.000000 + MinShakeEffectScale=0.600000 + ScreamBlurScale=0.850000 + StunThreshold=3.000000 + fuelRatio=0.650000 + clientHeadshotScale=1.200000 + niceZombieDamType=Class'NicePack.NiceZedSlashingDamageType' + MeleeAnims(0)="Siren_Bite" + MeleeAnims(1)="Siren_Bite2" + MeleeAnims(2)="Siren_Bite" + HitAnims(0)="HitReactionF" + HitAnims(1)="HitReactionF" + HitAnims(2)="HitReactionF" + ZapThreshold=0.500000 + ZappedDamageMod=1.500000 + ZombieFlag=1 + MeleeDamage=13 + damageForce=5000 + KFRagdollName="Siren_Trip" + ScreamDamage=10 + CrispUpThreshhold=7 + bCanDistanceAttackDoors=True + bUseExtendedCollision=True + ColOffset=(Z=48.000000) + ColRadius=25.000000 + ColHeight=5.000000 + ExtCollAttachBoneName="Collision_Attach" + SeveredLegAttachScale=0.700000 + PlayerCountHealthScale=0.100000 + OnlineHeadshotOffset=(X=6.000000,Z=41.000000) + OnlineHeadshotScale=1.200000 + HeadHealth=200.000000 + PlayerNumHeadHealthScale=0.050000 + MotionDetectorThreat=2.000000 + ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Challenge' + ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Challenge' + ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Challenge' + ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Challenge' + ScoringValue=25 + SoundGroupClass=Class'KFMod.KFFemaleZombieSounds' + IdleHeavyAnim="Siren_Idle" + IdleRifleAnim="Siren_Idle" + MeleeRange=45.000000 + GroundSpeed=100.000000 + WaterSpeed=80.000000 + HealthMax=240.000000 + Health=240 + HeadHeight=1.000000 + HeadScale=1.000000 + MenuName="Nice Siren" + MovementAnims(0)="Siren_Walk" + MovementAnims(1)="Siren_Walk" + MovementAnims(2)="Siren_Walk" + MovementAnims(3)="Siren_Walk" + WalkAnims(0)="Siren_Walk" + WalkAnims(1)="Siren_Walk" + WalkAnims(2)="Siren_Walk" + WalkAnims(3)="Siren_Walk" + IdleCrouchAnim="Siren_Idle" + IdleWeaponAnim="Siren_Idle" + IdleRestAnim="Siren_Idle" + DrawScale=1.050000 + PrePivot=(Z=3.000000) + RotationRate=(Yaw=45000,Roll=0) +} diff --git a/sources/Zeds/Nice/NiceZombieSirenController.uc b/sources/Zeds/Nice/NiceZombieSirenController.uc index d3a927b..7ab1487 100644 --- a/sources/Zeds/Nice/NiceZombieSirenController.uc +++ b/sources/Zeds/Nice/NiceZombieSirenController.uc @@ -1,13 +1,24 @@ -class NiceZombieSirenController extends NiceMonsterController; -var bool bDoneSpottedCheck; -state ZombieHunt -{ - event SeePlayer(Pawn SeenPlayer) - { if ( !bDoneSpottedCheck && PlayerController(SeenPlayer.Controller) != none ) { // 25% chance of first player to see this Siren saying something if ( !KFGameType(Level.Game).bDidSpottedSirenMessage && FRand() < 0.25 ) { PlayerController(SeenPlayer.Controller).Speech('AUTO', 15, ""); KFGameType(Level.Game).bDidSpottedSirenMessage = true; } - bDoneSpottedCheck = true; } - super.SeePlayer(SeenPlayer); - } -} -defaultproperties -{ -} +class NiceZombieSirenController extends NiceMonsterController; +var bool bDoneSpottedCheck; +state ZombieHunt +{ + event SeePlayer(Pawn SeenPlayer) + { + if ( !bDoneSpottedCheck && PlayerController(SeenPlayer.Controller) != none ) + { + // 25% chance of first player to see this Siren saying something + if ( !KFGameType(Level.Game).bDidSpottedSirenMessage && FRand() < 0.25 ) + { + PlayerController(SeenPlayer.Controller).Speech('AUTO', 15, ""); + KFGameType(Level.Game).bDidSpottedSirenMessage = true; + } + + bDoneSpottedCheck = true; + } + + super.SeePlayer(SeenPlayer); + } +} +defaultproperties +{ +} diff --git a/sources/Zeds/Nice/NiceZombieStalker.uc b/sources/Zeds/Nice/NiceZombieStalker.uc index f62da3e..0a75dde 100644 --- a/sources/Zeds/Nice/NiceZombieStalker.uc +++ b/sources/Zeds/Nice/NiceZombieStalker.uc @@ -1,147 +1,297 @@ -// Zombie Monster for KF Invasion gametype -class NiceZombieStalker extends NiceZombieStalkerBase; -#exec OBJ LOAD FILE=KFX.utx -#exec OBJ LOAD FILE=KF_BaseStalker.uax -//---------------------------------------------------------------------------- -// NOTE: All Variables are declared in the base class to eliminate hitching -//---------------------------------------------------------------------------- -simulated function PostBeginPlay() -{ - CloakStalker(); - super.PostBeginPlay(); -} -simulated function PostNetBeginPlay() -{ - local PlayerController PC; - super.PostNetBeginPlay(); - if( Level.NetMode!=NM_DedicatedServer ) - { PC = Level.GetLocalPlayerController(); if( PC != none && PC.Pawn != none ) { LocalKFHumanPawn = KFHumanPawn(PC.Pawn); } - } -} -simulated event SetAnimAction(name NewAction) -{ - if ( NewAction == 'Claw' || NewAction == MeleeAnims[0] || NewAction == MeleeAnims[1] || NewAction == MeleeAnims[2] ) - { UncloakStalker(); - } - super.SetAnimAction(NewAction); -} -simulated function Tick(float DeltaTime) -{ - Super.Tick(DeltaTime); - if( Level.NetMode==NM_DedicatedServer ) Return; // Servers aren't intrested in this info. - if( bZapped ) - { // Make sure we check if we need to be cloaked as soon as the zap wears off NextCheckTime = Level.TimeSeconds; - } - else if( Level.TimeSeconds > NextCheckTime && Health > 0 ) - { NextCheckTime = Level.TimeSeconds + 0.5; - if( LocalKFHumanPawn != none && LocalKFHumanPawn.Health > 0 && LocalKFHumanPawn.ShowStalkers() && VSizeSquared(Location - LocalKFHumanPawn.Location) < LocalKFHumanPawn.GetStalkerViewDistanceMulti() * 640000.0 ) // 640000 = 800 Units { bSpotted = True; } else { bSpotted = false; } - if ( !bSpotted && !bCloaked && Skins[0] != Combiner'KF_Specimens_Trip_T.stalker_cmb' ) { UncloakStalker(); } else if ( Level.TimeSeconds - LastUncloakTime > 1.2 ) { // if we're uberbrite, turn down the light if( bSpotted && Skins[0] != Finalblend'KFX.StalkerGlow' ) { bUnlit = false; CloakStalker(); } else if ( Skins[0] != Shader'KF_Specimens_Trip_T.stalker_invisible' ) { CloakStalker(); } } - } -} -// Cloak Functions ( called from animation notifies to save Gibby trouble ;) ) -simulated function CloakStalker() -{ - // No cloaking if zapped - if( bZapped ) - { return; - } - if ( bSpotted ) - { if( Level.NetMode == NM_DedicatedServer ) return; - Skins[0] = Finalblend'KFX.StalkerGlow'; Skins[1] = Finalblend'KFX.StalkerGlow'; bUnlit = true; return; - } - if ( !bDecapitated && !bCrispified ) // No head, no cloak, honey. updated : Being charred means no cloak either :D - { Visibility = 1; bCloaked = true; - if( Level.NetMode == NM_DedicatedServer ) Return; - Skins[0] = Shader'KF_Specimens_Trip_T.stalker_invisible'; Skins[1] = Shader'KF_Specimens_Trip_T.stalker_invisible'; - // Invisible - no shadow if(PlayerShadow != none) PlayerShadow.bShadowActive = false; if(RealTimeShadow != none) RealTimeShadow.Destroy(); - // Remove/disallow projectors on invisible people Projectors.Remove(0, Projectors.Length); bAcceptsProjectors = false; SetOverlayMaterial(Material'KFX.FBDecloakShader', 0.25, true); - } -} -simulated function UnCloakStalker() -{ - if( bZapped ) - { return; - } - if( !bCrispified ) - { LastUncloakTime = Level.TimeSeconds; - Visibility = default.Visibility; bCloaked = false; bUnlit = false; - // 25% chance of our Enemy saying something about us being invisible if( Level.NetMode!=NM_Client && !KFGameType(Level.Game).bDidStalkerInvisibleMessage && FRand()<0.25 && Controller.Enemy!=none && PlayerController(Controller.Enemy.Controller)!=none ) { PlayerController(Controller.Enemy.Controller).Speech('AUTO', 17, ""); KFGameType(Level.Game).bDidStalkerInvisibleMessage = true; } if( Level.NetMode == NM_DedicatedServer ) Return; - if ( Skins[0] != Combiner'KF_Specimens_Trip_T.stalker_cmb' ) { Skins[1] = FinalBlend'KF_Specimens_Trip_T.stalker_fb'; Skins[0] = Combiner'KF_Specimens_Trip_T.stalker_cmb'; - if (PlayerShadow != none) PlayerShadow.bShadowActive = true; - bAcceptsProjectors = true; - SetOverlayMaterial(Material'KFX.FBDecloakShader', 0.25, true); } - } -} -// Set the zed to the zapped behavior -simulated function SetZappedBehavior() -{ - super.SetZappedBehavior(); - bUnlit = false; - // Handle setting the zed to uncloaked so the zapped overlay works properly - if( Level.Netmode != NM_DedicatedServer ) - { Skins[1] = FinalBlend'KF_Specimens_Trip_T.stalker_fb'; Skins[0] = Combiner'KF_Specimens_Trip_T.stalker_cmb'; - if (PlayerShadow != none) PlayerShadow.bShadowActive = true; - bAcceptsProjectors = true; SetOverlayMaterial(Material'KFZED_FX_T.Energy.ZED_overlay_Hit_Shdr', 999, true); - } -} -// Turn off the zapped behavior -simulated function UnSetZappedBehavior() -{ - super.UnSetZappedBehavior(); - // Handle getting the zed back cloaked if need be - if( Level.Netmode != NM_DedicatedServer ) - { NextCheckTime = Level.TimeSeconds; SetOverlayMaterial(none, 0.0f, true); - } -} -// Overridden because we need to handle the overlays differently for zombies that can cloak -function SetZapped(float ZapAmount, Pawn Instigator) -{ - LastZapTime = Level.TimeSeconds; - if( bZapped ) - { TotalZap = ZapThreshold; RemainingZap = ZapDuration; - } - else - { TotalZap += ZapAmount; - if( TotalZap >= ZapThreshold ) { RemainingZap = ZapDuration; bZapped = true; } - } - ZappedBy = Instigator; -} -function RemoveHead() -{ - Super.RemoveHead(); - if (!bCrispified) - { Skins[1] = FinalBlend'KF_Specimens_Trip_T.stalker_fb'; Skins[0] = Combiner'KF_Specimens_Trip_T.stalker_cmb'; - } -} -simulated function PlayDying(class DamageType, vector HitLoc) -{ - Super.PlayDying(DamageType,HitLoc); - if(bUnlit) bUnlit=!bUnlit; - LocalKFHumanPawn = none; - if (!bCrispified) - { Skins[1] = FinalBlend'KF_Specimens_Trip_T.stalker_fb'; Skins[0] = Combiner'KF_Specimens_Trip_T.stalker_cmb'; - } -} -// Give her the ability to spring. -function bool DoJump( bool bUpdating ) -{ - if ( !bIsCrouched && !bWantsToCrouch && ((Physics == PHYS_Walking) || (Physics == PHYS_Ladder) || (Physics == PHYS_Spider)) ) - { if ( Role == ROLE_Authority ) { if (Level.Game != none) MakeNoise(1.0); if ( bCountJumps && (Inventory != none) ) Inventory.OwnerEvent('Jumped'); } if ( Physics == PHYS_Spider ) Velocity = JumpZ * Floor; else if ( Physics == PHYS_Ladder ) Velocity.Z = 0; else if ( bIsWalking ) { Velocity.Z = Default.JumpZ; Velocity.X = (Default.JumpZ * 0.6); } else { Velocity.Z = JumpZ; Velocity.X = (JumpZ * 0.6); } if ( (Base != none) && !Base.bWorldGeometry ) { Velocity.Z += Base.Velocity.Z; Velocity.X += Base.Velocity.X; } SetPhysics(PHYS_Falling); return true; - } - return false; -} -static simulated function PreCacheMaterials(LevelInfo myLevel) -{//should be derived and used. - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.stalker_cmb'); - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.stalker_env_cmb'); - myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.stalker_diff'); - myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.stalker_spec'); - myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.stalker_invisible'); - myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.StalkerCloakOpacity_cmb'); - myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.StalkerCloakEnv_rot'); - myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.stalker_opacity_osc'); - myLevel.AddPrecacheMaterial(Material'KFCharacters.StalkerSkin'); -} -defaultproperties -{ stunLoopStart=0.250000 stunLoopEnd=0.890000 idleInsertFrame=0.950000 EventClasses(0)="NicePack.NiceZombieStalker" MoanVoice=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_Talk' MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_HitPlayer' JumpSound=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_Jump' DetachedArmClass=Class'KFChar.SeveredArmStalker' DetachedLegClass=Class'KFChar.SeveredLegStalker' DetachedHeadClass=Class'KFChar.SeveredHeadStalker' HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_Pain' DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_Death' ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_Challenge' ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_Challenge' ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_Challenge' ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_Challenge' AmbientSound=Sound'KF_BaseStalker.Stalker_IdleLoop' Mesh=SkeletalMesh'KF_Freaks_Trip.Stalker_Freak' Skins(0)=Shader'KF_Specimens_Trip_T.stalker_invisible' Skins(1)=Shader'KF_Specimens_Trip_T.stalker_invisible' -} +// Zombie Monster for KF Invasion gametype +class NiceZombieStalker extends NiceZombieStalkerBase; +#exec OBJ LOAD FILE=KFX.utx +#exec OBJ LOAD FILE=KF_BaseStalker.uax +//---------------------------------------------------------------------------- +// NOTE: All Variables are declared in the base class to eliminate hitching +//---------------------------------------------------------------------------- +simulated function PostBeginPlay() +{ + CloakStalker(); + super.PostBeginPlay(); +} +simulated function PostNetBeginPlay() +{ + local PlayerController PC; + super.PostNetBeginPlay(); + if( Level.NetMode!=NM_DedicatedServer ) + { + PC = Level.GetLocalPlayerController(); + if( PC != none && PC.Pawn != none ) + { + LocalKFHumanPawn = KFHumanPawn(PC.Pawn); + } + } +} +simulated event SetAnimAction(name NewAction) +{ + if ( NewAction == 'Claw' || NewAction == MeleeAnims[0] || NewAction == MeleeAnims[1] || NewAction == MeleeAnims[2] ) + { + UncloakStalker(); + } + super.SetAnimAction(NewAction); +} +simulated function Tick(float DeltaTime) +{ + Super.Tick(DeltaTime); + if( Level.NetMode==NM_DedicatedServer ) + Return; // Servers aren't intrested in this info. + if( bZapped ) + { + // Make sure we check if we need to be cloaked as soon as the zap wears off + NextCheckTime = Level.TimeSeconds; + } + else if( Level.TimeSeconds > NextCheckTime && Health > 0 ) + { + NextCheckTime = Level.TimeSeconds + 0.5; + + if( LocalKFHumanPawn != none && LocalKFHumanPawn.Health > 0 && LocalKFHumanPawn.ShowStalkers() && + VSizeSquared(Location - LocalKFHumanPawn.Location) < LocalKFHumanPawn.GetStalkerViewDistanceMulti() * 640000.0 ) // 640000 = 800 Units + { + bSpotted = True; + } + else + { + bSpotted = false; + } + + if ( !bSpotted && !bCloaked && Skins[0] != Combiner'KF_Specimens_Trip_T.stalker_cmb' ) + { + UncloakStalker(); + } + else if ( Level.TimeSeconds - LastUncloakTime > 1.2 ) + { + // if we're uberbrite, turn down the light + if( bSpotted && Skins[0] != Finalblend'KFX.StalkerGlow' ) + { + bUnlit = false; + CloakStalker(); + } + else if ( Skins[0] != Shader'KF_Specimens_Trip_T.stalker_invisible' ) + { + CloakStalker(); + } + } + } +} +// Cloak Functions ( called from animation notifies to save Gibby trouble ;) ) +simulated function CloakStalker() +{ + // No cloaking if zapped + if( bZapped ) + { + return; + } + if ( bSpotted ) + { + if( Level.NetMode == NM_DedicatedServer ) + return; + + Skins[0] = Finalblend'KFX.StalkerGlow'; + Skins[1] = Finalblend'KFX.StalkerGlow'; + bUnlit = true; + return; + } + if ( !bDecapitated && !bCrispified ) // No head, no cloak, honey. updated : Being charred means no cloak either :D + { + Visibility = 1; + bCloaked = true; + + if( Level.NetMode == NM_DedicatedServer ) + Return; + + Skins[0] = Shader'KF_Specimens_Trip_T.stalker_invisible'; + Skins[1] = Shader'KF_Specimens_Trip_T.stalker_invisible'; + + // Invisible - no shadow + if(PlayerShadow != none) + PlayerShadow.bShadowActive = false; + if(RealTimeShadow != none) + RealTimeShadow.Destroy(); + + // Remove/disallow projectors on invisible people + Projectors.Remove(0, Projectors.Length); + bAcceptsProjectors = false; + SetOverlayMaterial(Material'KFX.FBDecloakShader', 0.25, true); + } +} +simulated function UnCloakStalker() +{ + if( bZapped ) + { + return; + } + if( !bCrispified ) + { + LastUncloakTime = Level.TimeSeconds; + + Visibility = default.Visibility; + bCloaked = false; + bUnlit = false; + + // 25% chance of our Enemy saying something about us being invisible + if( Level.NetMode!=NM_Client && !KFGameType(Level.Game).bDidStalkerInvisibleMessage && FRand()<0.25 && Controller.Enemy!=none && + PlayerController(Controller.Enemy.Controller)!=none ) + { + PlayerController(Controller.Enemy.Controller).Speech('AUTO', 17, ""); + KFGameType(Level.Game).bDidStalkerInvisibleMessage = true; + } + if( Level.NetMode == NM_DedicatedServer ) + Return; + + if ( Skins[0] != Combiner'KF_Specimens_Trip_T.stalker_cmb' ) + { + Skins[1] = FinalBlend'KF_Specimens_Trip_T.stalker_fb'; + Skins[0] = Combiner'KF_Specimens_Trip_T.stalker_cmb'; + + if (PlayerShadow != none) + PlayerShadow.bShadowActive = true; + + bAcceptsProjectors = true; + + SetOverlayMaterial(Material'KFX.FBDecloakShader', 0.25, true); + } + } +} +// Set the zed to the zapped behavior +simulated function SetZappedBehavior() +{ + super.SetZappedBehavior(); + bUnlit = false; + // Handle setting the zed to uncloaked so the zapped overlay works properly + if( Level.Netmode != NM_DedicatedServer ) + { + Skins[1] = FinalBlend'KF_Specimens_Trip_T.stalker_fb'; + Skins[0] = Combiner'KF_Specimens_Trip_T.stalker_cmb'; + + if (PlayerShadow != none) + PlayerShadow.bShadowActive = true; + + bAcceptsProjectors = true; + SetOverlayMaterial(Material'KFZED_FX_T.Energy.ZED_overlay_Hit_Shdr', 999, true); + } +} +// Turn off the zapped behavior +simulated function UnSetZappedBehavior() +{ + super.UnSetZappedBehavior(); + // Handle getting the zed back cloaked if need be + if( Level.Netmode != NM_DedicatedServer ) + { + NextCheckTime = Level.TimeSeconds; + SetOverlayMaterial(none, 0.0f, true); + } +} +// Overridden because we need to handle the overlays differently for zombies that can cloak +function SetZapped(float ZapAmount, Pawn Instigator) +{ + LastZapTime = Level.TimeSeconds; + if( bZapped ) + { + TotalZap = ZapThreshold; + RemainingZap = ZapDuration; + } + else + { + TotalZap += ZapAmount; + + if( TotalZap >= ZapThreshold ) + { + RemainingZap = ZapDuration; + bZapped = true; + } + } + ZappedBy = Instigator; +} +function RemoveHead() +{ + Super.RemoveHead(); + if (!bCrispified) + { + Skins[1] = FinalBlend'KF_Specimens_Trip_T.stalker_fb'; + Skins[0] = Combiner'KF_Specimens_Trip_T.stalker_cmb'; + } +} +simulated function PlayDying(class DamageType, vector HitLoc) +{ + Super.PlayDying(DamageType,HitLoc); + if(bUnlit) + bUnlit=!bUnlit; + LocalKFHumanPawn = none; + if (!bCrispified) + { + Skins[1] = FinalBlend'KF_Specimens_Trip_T.stalker_fb'; + Skins[0] = Combiner'KF_Specimens_Trip_T.stalker_cmb'; + } +} +// Give her the ability to spring. +function bool DoJump( bool bUpdating ) +{ + if ( !bIsCrouched && !bWantsToCrouch && ((Physics == PHYS_Walking) || (Physics == PHYS_Ladder) || (Physics == PHYS_Spider)) ) + { + if ( Role == ROLE_Authority ) + { + if (Level.Game != none) + MakeNoise(1.0); + if ( bCountJumps && (Inventory != none) ) + Inventory.OwnerEvent('Jumped'); + } + if ( Physics == PHYS_Spider ) + Velocity = JumpZ * Floor; + else if ( Physics == PHYS_Ladder ) + Velocity.Z = 0; + else if ( bIsWalking ) + { + Velocity.Z = Default.JumpZ; + Velocity.X = (Default.JumpZ * 0.6); + } + else + { + Velocity.Z = JumpZ; + Velocity.X = (JumpZ * 0.6); + } + if ( (Base != none) && !Base.bWorldGeometry ) + { + Velocity.Z += Base.Velocity.Z; + Velocity.X += Base.Velocity.X; + } + SetPhysics(PHYS_Falling); + return true; + } + return false; +} +static simulated function PreCacheMaterials(LevelInfo myLevel) +{//should be derived and used. + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.stalker_cmb'); + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.stalker_env_cmb'); + myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.stalker_diff'); + myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_T.stalker_spec'); + myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.stalker_invisible'); + myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_T.StalkerCloakOpacity_cmb'); + myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.StalkerCloakEnv_rot'); + myLevel.AddPrecacheMaterial(Material'KF_Specimens_Trip_T.stalker_opacity_osc'); + myLevel.AddPrecacheMaterial(Material'KFCharacters.StalkerSkin'); +} +defaultproperties +{ + stunLoopStart=0.250000 + stunLoopEnd=0.890000 + idleInsertFrame=0.950000 + EventClasses(0)="NicePack.NiceZombieStalker" + MoanVoice=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_Talk' + MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_HitPlayer' + JumpSound=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_Jump' + DetachedArmClass=Class'KFChar.SeveredArmStalker' + DetachedLegClass=Class'KFChar.SeveredLegStalker' + DetachedHeadClass=Class'KFChar.SeveredHeadStalker' + HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_Pain' + DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_Death' + ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_Challenge' + ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_Challenge' + ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_Challenge' + ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd.Stalker.Stalker_Challenge' + AmbientSound=Sound'KF_BaseStalker.Stalker_IdleLoop' + Mesh=SkeletalMesh'KF_Freaks_Trip.Stalker_Freak' + Skins(0)=Shader'KF_Specimens_Trip_T.stalker_invisible' + Skins(1)=Shader'KF_Specimens_Trip_T.stalker_invisible' +} diff --git a/sources/Zeds/Nice/NiceZombieStalkerBase.uc b/sources/Zeds/Nice/NiceZombieStalkerBase.uc index 3396bcf..473d954 100644 --- a/sources/Zeds/Nice/NiceZombieStalkerBase.uc +++ b/sources/Zeds/Nice/NiceZombieStalkerBase.uc @@ -1,16 +1,57 @@ -// Zombie Monster for KF Invasion gametype -class NiceZombieStalkerBase extends NiceMonster - abstract; -#exec OBJ LOAD FILE= -#exec OBJ LOAD FILE=KFX.utx -#exec OBJ LOAD FILE=KF_BaseStalker.uax -var float NextCheckTime; -var KFHumanPawn LocalKFHumanPawn; -var float LastUncloakTime; -//------------------------------------------------------------------------------- -// NOTE: All Code resides in the child class(this class was only created to -// eliminate hitching caused by loading default properties during play) -//------------------------------------------------------------------------------- -defaultproperties -{ fuelRatio=0.850000 clientHeadshotScale=1.200000 niceZombieDamType=Class'NicePack.NiceZedSlashingDamageType' MeleeAnims(0)="StalkerSpinAttack" MeleeAnims(1)="StalkerAttack1" MeleeAnims(2)="JumpAttack" MeleeDamage=9 damageForce=5000 KFRagdollName="Stalker_Trip" CrispUpThreshhold=10 PuntAnim="ClotPunt" SeveredArmAttachScale=0.800000 SeveredLegAttachScale=0.700000 OnlineHeadshotOffset=(X=18.000000,Z=33.000000) OnlineHeadshotScale=1.200000 MotionDetectorThreat=0.250000 ScoringValue=15 SoundGroupClass=Class'KFMod.KFFemaleZombieSounds' IdleHeavyAnim="StalkerIdle" IdleRifleAnim="StalkerIdle" MeleeRange=30.000000 GroundSpeed=200.000000 WaterSpeed=180.000000 JumpZ=350.000000 Health=100 HeadHeight=2.500000 MenuName="Nice Stalker" MovementAnims(0)="ZombieRun" MovementAnims(1)="ZombieRun" MovementAnims(2)="ZombieRun" MovementAnims(3)="ZombieRun" WalkAnims(0)="ZombieRun" WalkAnims(1)="ZombieRun" WalkAnims(2)="ZombieRun" WalkAnims(3)="ZombieRun" IdleCrouchAnim="StalkerIdle" IdleWeaponAnim="StalkerIdle" IdleRestAnim="StalkerIdle" DrawScale=1.100000 PrePivot=(Z=5.000000) RotationRate=(Yaw=45000,Roll=0) -} +// Zombie Monster for KF Invasion gametype +class NiceZombieStalkerBase extends NiceMonster + abstract; +#exec OBJ LOAD FILE= +#exec OBJ LOAD FILE=KFX.utx +#exec OBJ LOAD FILE=KF_BaseStalker.uax +var float NextCheckTime; +var KFHumanPawn LocalKFHumanPawn; +var float LastUncloakTime; +//------------------------------------------------------------------------------- +// NOTE: All Code resides in the child class(this class was only created to +// eliminate hitching caused by loading default properties during play) +//------------------------------------------------------------------------------- +defaultproperties +{ + fuelRatio=0.850000 + clientHeadshotScale=1.200000 + niceZombieDamType=Class'NicePack.NiceZedSlashingDamageType' + MeleeAnims(0)="StalkerSpinAttack" + MeleeAnims(1)="StalkerAttack1" + MeleeAnims(2)="JumpAttack" + MeleeDamage=9 + damageForce=5000 + KFRagdollName="Stalker_Trip" + CrispUpThreshhold=10 + PuntAnim="ClotPunt" + SeveredArmAttachScale=0.800000 + SeveredLegAttachScale=0.700000 + OnlineHeadshotOffset=(X=18.000000,Z=33.000000) + OnlineHeadshotScale=1.200000 + MotionDetectorThreat=0.250000 + ScoringValue=15 + SoundGroupClass=Class'KFMod.KFFemaleZombieSounds' + IdleHeavyAnim="StalkerIdle" + IdleRifleAnim="StalkerIdle" + MeleeRange=30.000000 + GroundSpeed=200.000000 + WaterSpeed=180.000000 + JumpZ=350.000000 + Health=100 + HeadHeight=2.500000 + MenuName="Nice Stalker" + MovementAnims(0)="ZombieRun" + MovementAnims(1)="ZombieRun" + MovementAnims(2)="ZombieRun" + MovementAnims(3)="ZombieRun" + WalkAnims(0)="ZombieRun" + WalkAnims(1)="ZombieRun" + WalkAnims(2)="ZombieRun" + WalkAnims(3)="ZombieRun" + IdleCrouchAnim="StalkerIdle" + IdleWeaponAnim="StalkerIdle" + IdleRestAnim="StalkerIdle" + DrawScale=1.100000 + PrePivot=(Z=5.000000) + RotationRate=(Yaw=45000,Roll=0) +} diff --git a/sources/Zeds/Nice/NiceZombieTeslaHusk.uc b/sources/Zeds/Nice/NiceZombieTeslaHusk.uc index 7fd4a6d..b6745cb 100644 --- a/sources/Zeds/Nice/NiceZombieTeslaHusk.uc +++ b/sources/Zeds/Nice/NiceZombieTeslaHusk.uc @@ -1,327 +1,741 @@ -class NiceZombieTeslaHusk extends NiceZombieHusk; -#exec OBJ LOAD FILE=KF_EnemiesFinalSnd_CIRCUS.uax -#exec OBJ LOAD FILE=ScrnZedPack_A.ukx -#exec OBJ LOAD FILE=ScrnZedPack_T.utx -#exec OBJ LOAD FILE=ScrnZedPack_SM.usx - -var class BeamClass; -var TeslaBeam PrimaryBeam; -var float MaxPrimaryBeamRange; // how far Husk can shoot with his tesla gun? -var float MaxChildBeamRange; // max distance from primary target for a chain reaction -var float ChainedBeamRangeExtension; // if pawn is already chained, chain max range is multiplied by this value -// used for optimization -var private float MaxPrimaryBeamRangeSquared, MaxChildBeamRangeSquared; -var float Energy; -var float EnergyMax; -var float EnergyRestoreRate; -var() float DischargeDamage; // beam damage per second -var() float ChainDamageMult; // how much damage drops on the next chain -var() class MyDamageType; -var() byte MaxChainLevel; -var() int MaxChainActors; -var ZedBeamSparks DecapitationSparks; -var bool bChainThoughZED; // chain tesla beam though a zed, which is between target and the husk, to extend firing range -var transient float NextChainZedSearchTime; -var transient float ChainRebuildTimer; // how many seconds between rebuilding chained actors -var float DischargeRate; // time between damaging chained pawns. Do not set it too low due to rounding precission of DischargeDamage -var transient float LastDischargeTime; -// Tesla Husks are able to heal each other. -var() float HealRate; // Percent of HealthMax to heal per second -var() float HealEnergyDrain; // amount of energy required to heal 1% -var transient float NextHealAttemptTime, LastHealTime; - -struct SActorDamages -{ - var Actor Victim; - var int Damage; -}; -var protected array DischargedActors; -simulated function PostBeginPlay() -{ - // Difficulty Scaling - if(Level.Game != none && !bDiffAdjusted) - { if(Level.Game.GameDifficulty >= 5.0){ DischargeDamage *= 1.75; EnergyMax *= 1.75; EnergyRestoreRate *= 1.75; MaxPrimaryBeamRange *= 1.75; MaxChildBeamRange *= 1.75; } else{ DischargeDamage *= 1.0; EnergyMax *= 1.0; EnergyRestoreRate *= 1.0; MaxPrimaryBeamRange *= 1.0; MaxChildBeamRange *= 1.0; } - } - Energy = EnergyMax; - MaxPrimaryBeamRangeSquared = MaxPrimaryBeamRange * MaxPrimaryBeamRange; - MaxChildBeamRangeSquared = MaxChildBeamRange * MaxChildBeamRange; - NextHealAttemptTime = Level.TimeSeconds + 5.0; - super.PostBeginPlay(); - BurnDamageScale = 1.0; // no fire damage resistance -} -simulated function HideBone(name boneName) -{ - local int BoneScaleSlot; - local bool bValidBoneToHide; - if( boneName == LeftThighBone ) - { boneScaleSlot = 0; bValidBoneToHide = true; - } - else if ( boneName == RightThighBone ) - { boneScaleSlot = 1; bValidBoneToHide = true; - } - else if( boneName == RightFArmBone ) - { boneScaleSlot = 2; bValidBoneToHide = true; - } - else if ( boneName == LeftFArmBone ) - { boneScaleSlot = 3; bValidBoneToHide = true; - } - else if ( boneName == HeadBone ) - { // Only scale the bone down once if( SeveredHead == none ) { bValidBoneToHide = true; boneScaleSlot = 4; } else { return; } - } - else if ( boneName == 'spine' ) - { bValidBoneToHide = true; boneScaleSlot = 5; - } - // Only hide the bone if it is one of the arms, legs, or head, don't hide other misc bones - if( bValidBoneToHide ) - { SetBoneScale(BoneScaleSlot, 0.0, BoneName); - } -} -function TeslaBeam SpawnTeslaBeam() -{ - local TeslaBeam beam; - beam = spawn(BeamClass, self); - if ( beam != none ) { beam.Instigator = self; - } - return beam; -} - -function TeslaBeam SpawnPrimaryBeam() -{ - if ( PrimaryBeam == none ) { PrimaryBeam = SpawnTeslaBeam(); PrimaryBeam.StartActor = self; PrimaryBeam.StartBoneName = 'Barrel'; - } - return PrimaryBeam; -} -function FreePrimaryBeam() -{ - if ( PrimaryBeam != none ) { //PrimaryBeam.DestroyChildBeams(); PrimaryBeam.EndActor = none; PrimaryBeam.EffectEndTime = Level.TimeSeconds - 1; PrimaryBeam.Instigator = none; // mark to delete PrimaryBeam = none; }} -function RangedAttack(Actor A) -{ - local float Dist; - local NiceMonster M; - if ( bShotAnim || bDecapitated ) return; - Dist = VSize(A.Location - Location); - if ( Physics == PHYS_Swimming ) - { SetAnimAction('Claw'); bShotAnim = true; - } - else if ( Energy < 100 && Dist < MeleeRange + CollisionRadius + A.CollisionRadius ) // do melee hits only when low on energy - { bShotAnim = true; SetAnimAction('Claw'); //PlaySound(sound'Claw2s', SLOT_Interact); KFTODO: Replace this Controller.bPreparingMove = true; Acceleration = vect(0,0,0); - } - else if ( Energy > 50 && Dist < MaxPrimaryBeamRange*(0.7 + 0.3*frand()) ) - { bShotAnim = true; - SetAnimAction('ShootBurns'); Controller.bPreparingMove = true; Acceleration = vect(0,0,0); - NextFireProjectileTime = Level.TimeSeconds + ProjectileFireInterval + (FRand() * 2.0); - } - else if ( bChainThoughZED && Energy > 100 && Controller.Enemy == A && KFPawn(A) != none && NextChainZedSearchTime < Level.TimeSeconds && Dist < MaxPrimaryBeamRange + MaxChildBeamRange ) - { NextChainZedSearchTime = Level.TimeSeconds + 3.0; foreach VisibleCollidingActors(class'NiceMonster', M, MaxPrimaryBeamRange*0.9) { if ( !M.bDeleteMe && M.Health > 0 && NiceZombieTeslaHusk(M) == none && VSizeSquared(M.Location - A.Location) < MaxChildBeamRangeSquared*0.9 && M.FastTrace(A.Location, M.Location) ) { Controller.Target = M; RangedAttack(M); return; } } - } -} - -function SpawnTwoShots() -{ - SpawnPrimaryBeam(); - if ( PrimaryBeam == none ) { log("Unable to spawn Primary Beam!", 'TeslaHusk'); return; - } - PrimaryBeam.EndActor = Controller.Target; - if( Controller!=none && KFDoorMover(Controller.Target)!=none ) - { PrimaryBeam.EffectEndTime = Level.TimeSeconds + 1.0; Controller.Target.TakeDamage(22,Self,Location,vect(0,0,0), MyDamageType); return; - } - PrimaryBeam.EffectEndTime = Level.TimeSeconds + 2.5; - GotoState('Shooting'); -} -simulated function Tick( float Delta ) -{ - if ( Role < ROLE_Authority ) { if ( bDecapitated && Health > 0 && DecapitationSparks == none ) { SpawnDecapitationEffects(); } - } - Super(NiceMonster).Tick(Delta); - if ( Role == ROLE_Authority ) { if ( Energy < EnergyMax ) Energy += EnergyRestoreRate * Delta; if ( Energy > 150 && NextHealAttemptTime < Level.TimeSeconds ) { NextHealAttemptTime = Level.TimeSeconds + 3.0; TryHealing(); } - } -} -function TryHealing() -{ - local Controller C; - local NiceMonsterController MyMC; - local NiceZombieTeslaHusk BestPatient; local bool bAnyHusks; - MyMC = NiceMonsterController(Controller); - if ( MyMC == none ) return; // just in case - if ( MyMC.Enemy != none && VSizeSquared(MyMC.Enemy.Location - Location) < MaxPrimaryBeamRangeSquared ) return; // no healing when need to fight for ( C=Level.ControllerList; C!=none; C=C.NextController ) { if ( NiceZombieTeslaHusk(C.Pawn) != none && C.Pawn != self && C.Pawn.Health > 0 ) { bAnyHusks = true; if ( (BestPatient == none || BestPatient.Health > C.Pawn.Health) && VSizeSquared(C.Pawn.Location - Location) < MaxPrimaryBeamRangeSquared ) BestPatient = NiceZombieTeslaHusk(C.Pawn); } - } - if ( !bAnyHusks ) NextHealAttemptTime = Level.TimeSeconds + 10.0; // no other husks on the map - so no need to do searching so often - else if ( BestPatient != none ) { if ( BestPatient.Health < BestPatient.HealthMax * 0.90 ) { MyMC.Target = BestPatient; MyMC.ChangeEnemy(BestPatient, MyMC.CanSee(BestPatient)); MyMC.GotoState('RangedAttack'); LastHealTime = Level.TimeSeconds + 3.0; // do not heal until beam is spawned GotoState('Healing'); } else NextHealAttemptTime = Level.TimeSeconds + 1.0; // if there are other Tesla Husks nearby, then check their health each second - } - else NextHealAttemptTime = Level.TimeSeconds + 3.0; // there are other Tesla Husks on the map, but not too close -} -function Died(Controller Killer, class damageType, vector HitLocation) -{ - if ( PrimaryBeam != none ) PrimaryBeam.Instigator = none; - if ( DecapitationSparks != none ) DecapitationSparks.Destroy(); - AmbientSound = none; super.Died(Killer, damageType, HitLocation); -} -simulated event PlayDying(class DamageType, vector HitLoc) -{ - super.PlayDying(DamageType, HitLoc); - if ( DecapitationSparks != none ) DecapitationSparks.Destroy(); AmbientSound = none; -} -// instead of roaming around, activate self-destruct -function RemoveHead() -{ - Intelligence = BRAINS_Retarded; // Headless dumbasses! - bDecapitated = true; - DECAP = true; - DecapTime = Level.TimeSeconds; - bShotAnim = true; - SetAnimAction('KnockDown'); - Acceleration = vect(0, 0, 0); - Velocity.X = 0; - Velocity.Y = 0; - Controller.GoToState('WaitForAnim'); - NiceMonsterController(Controller).bUseFreezeHack = True; - SetGroundSpeed(0); - AirSpeed = 0; - WaterSpeed = 0; - // No more raspy breathin'...cuz he has no throat or mouth :S - AmbientSound = MiscSound; - // super.TakeDamage(LastDamageAmount) isn't called yet, so set self-destruct sequence only if - // zed can survive the hit - if( Health > LastDamageAmount && Energy > 50 ) { SpawnDecapitationEffects(); BleedOutTime = Level.TimeSeconds + BleedOutDuration; GotoState('SelfDestruct'); - } - - PlaySound(DecapitationSound, SLOT_Misc,1.30,true,525); -} -simulated function Destroyed() -{ - if ( PrimaryBeam != none ) PrimaryBeam.Destroy(); if ( DecapitationSparks != none ) DecapitationSparks.Destroy(); super.Destroyed(); -} -simulated function SpawnDecapitationEffects() -{ - if (Level.NetMode == NM_DedicatedServer) return; DecapitationSparks = spawn(class'ZedBeamSparks', self,, GetBoneCoords(HeadBone).Origin, Rotation); -} -simulated function int DoAnimAction( name AnimName ) -{ - // faked animation with forces to play the end of shoot animation (where Huks is putting his gun down) - if ( AnimName == 'ShootBurnsEnd' ) { PlayAnim('ShootBurns'); SetAnimFrame(120, 0, 1); return 0; - } - return super.DoAnimAction(AnimName); -} -function float RangedAttackTime() -{ - return 5.0; -} -// Overridden so that anims don't get interrupted on the server if one is already playing -function bool IsHeadShot(vector loc, vector ray, float AdditionalScale) -{ - local coords C; - local vector HeadLoc, B, M, diff; - local float t, DotMM, Distance; - local int look; - local bool bUseAltHeadShotLocation; - local bool bWasAnimating; - if (HeadBone == '') return False; - // If we are a dedicated server estimate what animation is most likely playing on the client - if (Level.NetMode == NM_DedicatedServer) - { if (Physics == PHYS_Falling) PlayAnim(AirAnims[0], 1.0, 0.0); else if (Physics == PHYS_Walking) { // Only play the idle anim if we're not already doing a different anim. // This prevents anims getting interrupted on the server and borking things up - Ramm - if( !IsAnimating(0) && !IsAnimating(1) ) { if (bIsCrouched) { PlayAnim(IdleCrouchAnim, 1.0, 0.0); } else { bUseAltHeadShotLocation=true; } } else { bWasAnimating = true; } - if ( bDoTorsoTwist ) { SmoothViewYaw = Rotation.Yaw; SmoothViewPitch = ViewPitch; - look = (256 * ViewPitch) & 65535; if (look > 32768) look -= 65536; - SetTwistLook(0, look); } } else if (Physics == PHYS_Swimming) PlayAnim(SwimAnims[0], 1.0, 0.0); - if( !bWasAnimating ) { SetAnimFrame(0.5); } - } - if( bUseAltHeadShotLocation ) - { HeadLoc = Location + (OnlineHeadshotOffset >> Rotation); AdditionalScale *= OnlineHeadshotScale; - } - else - { C = GetBoneCoords(HeadBone); - HeadLoc = C.Origin + (HeadHeight * HeadScale * AdditionalScale * C.XAxis) -5.0*C.XAxis - 2.0*C.YAxis; - } - //ServerHeadLocation = HeadLoc; - // Express snipe trace line in terms of B + tM - B = loc; - M = ray * (2.0 * CollisionHeight + 2.0 * CollisionRadius); - // Find Point-Line Squared Distance - diff = HeadLoc - B; - t = M Dot diff; - if (t > 0) - { DotMM = M dot M; if (t < DotMM) { t = t / DotMM; diff = diff - (t * M); } else { t = 1; diff -= M; } - } - else t = 0; - Distance = Sqrt(diff Dot diff); - return (Distance < (HeadRadius * HeadScale * AdditionalScale)); -} -state Healing -{ - ignores TryHealing; - function BeginState() - { //log("Entering Healing State @ " $ Level.TimeSeconds, 'TeslaHusk'); LastHealTime = Level.TimeSeconds + 3.0; // do not heal until beam is spawned - } - function EndState() - { local name SeqName; local float AnimFrame, AnimRate; - //log("Exiting Healing State @ " $ Level.TimeSeconds, 'TeslaHusk'); NextHealAttemptTime = Level.TimeSeconds + 5.0; FreePrimaryBeam(); - // end shooting animation GetAnimParams(0, SeqName, AnimFrame, AnimRate); if ( SeqName == 'ShootBurns' && AnimFrame < 120 ) SetAnimAction('ShootBurnsEnd'); // faked anim Controller.Enemy = none; NiceMonsterController(Controller).FindNewEnemy(); - } - function SpawnTwoShots() - { SpawnPrimaryBeam(); if ( Controller != none ) PrimaryBeam.EndActor = Controller.Target; PrimaryBeam.EffectEndTime = Level.TimeSeconds + 2.5; LastHealTime = Level.TimeSeconds; // start healing - } - function bool FlipOver() - { if ( global.FlipOver() ) { GotoState(''); return true; } return false; - } - function DoStun(optional Pawn instigatedBy, optional Vector hitLocation, optional Vector momentum, optional class damageType, optional float headshotLevel, optional KFPlayerReplicationInfo KFPRI){ super.DoStun(instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); GotoState(''); - } - function Tick(float DeltaTime) - { local NiceZombieTeslaHusk Patient; local int HealthToAdd; super.Tick(DeltaTime); if ( Level.TimeSeconds >= LastHealTime+0.25 ) { if ( PrimaryBeam == none || Energy <= 0 || Level.TimeSeconds > PrimaryBeam.EffectEndTime ) { GotoState(''); return; } - NextHealAttemptTime = Level.TimeSeconds + 0.25; Patient = NiceZombieTeslaHusk(PrimaryBeam.EndActor); if ( Patient == none || Patient.Health <= 0 || Patient.Health >= Patient.HealthMax ) GotoState(''); else { HealthToAdd = min(Patient.HealthMax*HealRate*(Level.TimeSeconds-LastHealTime), Patient.HealthMax - Patient.Health); if ( HealthToAdd*HealEnergyDrain > Energy ) HealthToAdd = Energy / HealEnergyDrain; Patient.Health += HealthToAdd; Energy -= HealthToAdd*HealEnergyDrain; LastHealTime = Level.TimeSeconds; } } - }} - -// todo: make custom controller, moving states there -state Shooting -{ - ignores TryHealing; - function BeginState() - { //log("Entering Shooting State @ " $ Level.TimeSeconds, 'TeslaHusk'); if ( PrimaryBeam == none ) { SpawnPrimaryBeam(); PrimaryBeam.EndActor = Controller.Target; } - PrimaryBeam.EffectEndTime = Level.TimeSeconds + 2.5; BuildChain(); LastDischargeTime = Level.TimeSeconds; Discharge(DischargeRate); - } - function EndState() - { local name SeqName; local float AnimFrame, AnimRate; //log("Exiting Shooting State @ " $ Level.TimeSeconds, 'TeslaHusk'); - FreePrimaryBeam(); // end shooting animation GetAnimParams(0, SeqName, AnimFrame, AnimRate); if ( SeqName == 'ShootBurns' && AnimFrame < 120 ) SetAnimAction('ShootBurnsEnd'); // faked anim - } - function BuildChain() - { local int ChainsRemaining; ChainRebuildTimer = default.ChainRebuildTimer; ChainsRemaining = MaxChainActors; SpawnChildBeams(PrimaryBeam, 1, ChainsRemaining); } - function SpawnChildBeams(TeslaBeam MasterBeam, byte level, out int ChainsRemaining) - { local Pawn P; local TeslaBeam ChildBeam; local int i; if ( MasterBeam == none || level > MaxChainLevel || ChainsRemaining <= 0 ) return; for ( i=0; i 0; ++i ) { SpawnChildBeams(MasterBeam.ChildBeams[i], level+1, ChainsRemaining); } - } - function ChainDamage(TeslaBeam Beam, float Damage, byte ChainLevel) - { local int i; local float DmgMult; if ( Beam == none || Beam.EndActor == none || Energy < 0 || Controller == none) return; Damage = clamp(Damage, 1, Energy); // look if actor already received a damage during this discharge for ( i=0; i= Damage ) return; // Victim already received enough damage else { Damage -= DischargedActors[i].Damage; DischargedActors[i].Damage += Damage; break; } } } if ( i == DischargedActors.length ) { // new victim DischargedActors.insert(i, 1); DischargedActors[i].Victim = Beam.EndActor; DischargedActors[i].Damage = Damage; } // deal higher damage to monsters, but do not drain energy quicker DmgMult = 1.0; if ( NiceMonster(Beam.EndActor) != none ) { if ( ZombieFleshpound(Beam.EndActor) != none ) DmgMult = 20.0; else DmgMult = 3.0; } // if pawn is already chained, then damage him until he gets out of the primary range Beam.SetBeamLocation(); // ensure that StartEffect and EndEffect are set if ( VSizeSquared(Beam.EndEffect - Beam.StartEffect) <= MaxPrimaryBeamRangeSquared * ChainedBeamRangeExtension && FastTrace(Beam.EndEffect, Beam.StartEffect) ) { Beam.EndActor.TakeDamage(Damage*DmgMult, self, Beam.EndActor.Location, Beam.SetBeamRotation(), MyDamageType); if(Controller == none) return; Energy -= Damage; Damage *= ChainDamageMult; ChainLevel++; if ( Damage > 0 && ChainLevel <= MaxChainLevel) { for ( i=0; i 0; ++i ) ChainDamage(Beam.ChildBeams[i], Damage, ChainLevel); } } else { Beam.Instigator = none; // delete beam } - } - function Discharge(float DeltaTime) - { LastDischargeTime = Level.TimeSeconds; DischargedActors.length = 0; ChainDamage(PrimaryBeam, DischargeDamage*DeltaTime, 0); if (Energy <= 0) GotoState(''); // out of energy - stop shooting - } - function bool FlipOver() - { if ( global.FlipOver() ) { GotoState(''); return true; } return false; - } - function DoStun(optional Pawn instigatedBy, optional Vector hitLocation, optional Vector momentum, optional class damageType, optional float headshotLevel, optional KFPlayerReplicationInfo KFPRI){ super.DoStun(instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); GotoState(''); - } - function Tick(float DeltaTime) - { super.Tick(DeltaTime); - //log("Shooting.Tick @ " $ Level.TimeSeconds $ ":" @"Energy="$Energy @"PrimaryBeam="$PrimaryBeam, 'TeslaHusk'); ChainRebuildTimer -= DeltaTime; if ( Energy <= 0 || PrimaryBeam == none || PrimaryBeam.EndActor == none || Level.TimeSeconds > PrimaryBeam.EffectEndTime ) { GotoState(''); } else if ( LastDischargeTime + DischargeRate <= Level.TimeSeconds ) { if ( ChainRebuildTimer <= 0 ) BuildChain(); Discharge(Level.TimeSeconds - LastDischargeTime); // damage chained actors } } -} -state SelfDestruct -{ - ignores PlayDirectionalHit, RangedAttack, MeleeDamageTarget; - function BeginState() - { local NiceTeslaEMPNade MyNade; MyNade = spawn(class'NiceTeslaEMPNade', self,, Location); if ( MyNade != none ) { AttachToBone(MyNade, RootBone); MyNade.SetTimer(3.0, false); MyNade.bTimerSet = true; MyNade.Damage = max(20, Energy * 0.45); } else { // wtf? Died(LastDamagedBy.Controller,class'DamTypeBleedOut',Location); } - } - function bool CheckMiniFlinch(int flinchScore, Pawn instigatedBy, Vector hitLocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI){ return false; - } - function bool IsStunPossible(){ return false; - } - function bool CheckStun(int stunScore, Pawn instigatedBy, Vector hitLocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI){ return false; - } - function bool CanGetOutOfWay(){ return false; - } -} -static simulated function PreCacheMaterials(LevelInfo myLevel) -{ - myLevel.AddPrecacheMaterial(Shader'ScrnZedPack_T.TeslaHusk.TeslaHusk_SHADER'); - myLevel.AddPrecacheMaterial(FinalBlend'KFZED_FX_T.Energy.ZED_FX_Beam_FB'); -} -defaultproperties -{ BeamClass=Class'ScrnZedPack.TeslaBeam' MaxPrimaryBeamRange=300.000000 MaxChildBeamRange=150.000000 ChainedBeamRangeExtension=1.200000 Energy=200.000000 EnergyMax=200.000000 EnergyRestoreRate=20.000000 DischargeDamage=20.000000 ChainDamageMult=0.700000 MyDamageType=Class'ScrnZedPack.DamTypeTesla' MaxChainLevel=5 MaxChainActors=20 DischargeRate=0.250000 HealRate=0.250000 HealEnergyDrain=0.200000 ProjectileFireInterval=5.000000 BurnDamageScale=1.000000 mind=0.000000 bFireImmune=False MoanVoice=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Talk' BleedOutDuration=5.000000 MiscSound=Sound'KF_FY_ZEDV2SND.foley.WEP_ZEDV2_Projectile_Loop' DecapitationSound=Sound'KF_FY_ZEDV2SND.Fire.WEP_ZEDV2_Secondary_Explode' MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Bloat.Bloat_HitPlayer' JumpSound=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Jump' ColHeight=30.000000 ProjectileBloodSplatClass=None DetachedArmClass=Class'ScrnZedPack.SeveredArmTeslaHusk' DetachedLegClass=Class'ScrnZedPack.SeveredLegTeslaHusk' DetachedHeadClass=Class'ScrnZedPack.SeveredHeadTeslaHusk' DetachedSpecialArmClass=Class'ScrnZedPack.SeveredGunTeslaHusk' OnlineHeadshotOffset=(X=22.000000,Z=50.000000) HitSound(0)=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Pain' DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Death' ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Challenge' ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Challenge' ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Challenge' ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Challenge' ScoringValue=25 GroundSpeed=100.000000 WaterSpeed=80.000000 HealthMax=800.000000 Health=800 HeadHeight=-7.500000 MenuName="Tesla Husk" AmbientSound=Sound'KF_BaseHusk_CIRCUS.Husk_IdleLoop' Mesh=SkeletalMesh'ScrnZedPack_A.TeslaHuskMesh' Skins(0)=Shader'ScrnZedPack_T.TeslaHusk.TeslaHusk_SHADER' -} +class NiceZombieTeslaHusk extends NiceZombieHusk; +#exec OBJ LOAD FILE=KF_EnemiesFinalSnd_CIRCUS.uax +#exec OBJ LOAD FILE=ScrnZedPack_A.ukx +#exec OBJ LOAD FILE=ScrnZedPack_T.utx +#exec OBJ LOAD FILE=ScrnZedPack_SM.usx + +var class BeamClass; +var TeslaBeam PrimaryBeam; +var float MaxPrimaryBeamRange; // how far Husk can shoot with his tesla gun? +var float MaxChildBeamRange; // max distance from primary target for a chain reaction +var float ChainedBeamRangeExtension; // if pawn is already chained, chain max range is multiplied by this value +// used for optimization +var private float MaxPrimaryBeamRangeSquared, MaxChildBeamRangeSquared; +var float Energy; +var float EnergyMax; +var float EnergyRestoreRate; +var() float DischargeDamage; // beam damage per second +var() float ChainDamageMult; // how much damage drops on the next chain +var() class MyDamageType; +var() byte MaxChainLevel; +var() int MaxChainActors; +var ZedBeamSparks DecapitationSparks; +var bool bChainThoughZED; // chain tesla beam though a zed, which is between target and the husk, to extend firing range +var transient float NextChainZedSearchTime; +var transient float ChainRebuildTimer; // how many seconds between rebuilding chained actors +var float DischargeRate; // time between damaging chained pawns. Do not set it too low due to rounding precission of DischargeDamage +var transient float LastDischargeTime; +// Tesla Husks are able to heal each other. +var() float HealRate; // Percent of HealthMax to heal per second +var() float HealEnergyDrain; // amount of energy required to heal 1% +var transient float NextHealAttemptTime, LastHealTime; + +struct SActorDamages +{ + var Actor Victim; + var int Damage; +}; +var protected array DischargedActors; +simulated function PostBeginPlay() +{ + // Difficulty Scaling + if(Level.Game != none && !bDiffAdjusted) + { + if(Level.Game.GameDifficulty >= 5.0){ + DischargeDamage *= 1.75; + EnergyMax *= 1.75; + EnergyRestoreRate *= 1.75; + MaxPrimaryBeamRange *= 1.75; + MaxChildBeamRange *= 1.75; + } + else{ + DischargeDamage *= 1.0; + EnergyMax *= 1.0; + EnergyRestoreRate *= 1.0; + MaxPrimaryBeamRange *= 1.0; + MaxChildBeamRange *= 1.0; + } + } + Energy = EnergyMax; + MaxPrimaryBeamRangeSquared = MaxPrimaryBeamRange * MaxPrimaryBeamRange; + MaxChildBeamRangeSquared = MaxChildBeamRange * MaxChildBeamRange; + NextHealAttemptTime = Level.TimeSeconds + 5.0; + super.PostBeginPlay(); + BurnDamageScale = 1.0; // no fire damage resistance +} +simulated function HideBone(name boneName) +{ + local int BoneScaleSlot; + local bool bValidBoneToHide; + if( boneName == LeftThighBone ) + { + boneScaleSlot = 0; + bValidBoneToHide = true; + } + else if ( boneName == RightThighBone ) + { + boneScaleSlot = 1; + bValidBoneToHide = true; + } + else if( boneName == RightFArmBone ) + { + boneScaleSlot = 2; + bValidBoneToHide = true; + } + else if ( boneName == LeftFArmBone ) + { + boneScaleSlot = 3; + bValidBoneToHide = true; + } + else if ( boneName == HeadBone ) + { + // Only scale the bone down once + if( SeveredHead == none ) + { + bValidBoneToHide = true; + boneScaleSlot = 4; + } + else + { + return; + } + } + else if ( boneName == 'spine' ) + { + bValidBoneToHide = true; + boneScaleSlot = 5; + } + // Only hide the bone if it is one of the arms, legs, or head, don't hide other misc bones + if( bValidBoneToHide ) + { + SetBoneScale(BoneScaleSlot, 0.0, BoneName); + } +} +function TeslaBeam SpawnTeslaBeam() +{ + local TeslaBeam beam; + beam = spawn(BeamClass, self); + if ( beam != none ) { + beam.Instigator = self; + } + return beam; +} + +function TeslaBeam SpawnPrimaryBeam() +{ + if ( PrimaryBeam == none ) { + PrimaryBeam = SpawnTeslaBeam(); + PrimaryBeam.StartActor = self; + PrimaryBeam.StartBoneName = 'Barrel'; + } + return PrimaryBeam; +} +function FreePrimaryBeam() +{ + if ( PrimaryBeam != none ) { + //PrimaryBeam.DestroyChildBeams(); + PrimaryBeam.EndActor = none; + PrimaryBeam.EffectEndTime = Level.TimeSeconds - 1; + PrimaryBeam.Instigator = none; // mark to delete + PrimaryBeam = none; }} +function RangedAttack(Actor A) +{ + local float Dist; + local NiceMonster M; + if ( bShotAnim || bDecapitated ) + return; + Dist = VSize(A.Location - Location); + if ( Physics == PHYS_Swimming ) + { + SetAnimAction('Claw'); + bShotAnim = true; + } + else if ( Energy < 100 && Dist < MeleeRange + CollisionRadius + A.CollisionRadius ) // do melee hits only when low on energy + { + bShotAnim = true; + SetAnimAction('Claw'); + //PlaySound(sound'Claw2s', SLOT_Interact); KFTODO: Replace this + Controller.bPreparingMove = true; + Acceleration = vect(0,0,0); + } + else if ( Energy > 50 && Dist < MaxPrimaryBeamRange*(0.7 + 0.3*frand()) ) + { + bShotAnim = true; + + SetAnimAction('ShootBurns'); + Controller.bPreparingMove = true; + Acceleration = vect(0,0,0); + + NextFireProjectileTime = Level.TimeSeconds + ProjectileFireInterval + (FRand() * 2.0); + } + else if ( bChainThoughZED && Energy > 100 && Controller.Enemy == A && KFPawn(A) != none + && NextChainZedSearchTime < Level.TimeSeconds + && Dist < MaxPrimaryBeamRange + MaxChildBeamRange ) + { + NextChainZedSearchTime = Level.TimeSeconds + 3.0; + foreach VisibleCollidingActors(class'NiceMonster', M, MaxPrimaryBeamRange*0.9) { + if ( !M.bDeleteMe && M.Health > 0 && NiceZombieTeslaHusk(M) == none + && VSizeSquared(M.Location - A.Location) < MaxChildBeamRangeSquared*0.9 + && M.FastTrace(A.Location, M.Location) ) + { + Controller.Target = M; + RangedAttack(M); + return; + } + } + } +} + +function SpawnTwoShots() +{ + SpawnPrimaryBeam(); + if ( PrimaryBeam == none ) { + log("Unable to spawn Primary Beam!", 'TeslaHusk'); + return; + } + PrimaryBeam.EndActor = Controller.Target; + if( Controller!=none && KFDoorMover(Controller.Target)!=none ) + { + PrimaryBeam.EffectEndTime = Level.TimeSeconds + 1.0; + Controller.Target.TakeDamage(22,Self,Location,vect(0,0,0), MyDamageType); + return; + } + PrimaryBeam.EffectEndTime = Level.TimeSeconds + 2.5; + GotoState('Shooting'); +} +simulated function Tick( float Delta ) +{ + if ( Role < ROLE_Authority ) { + if ( bDecapitated && Health > 0 && DecapitationSparks == none ) { + SpawnDecapitationEffects(); + } + } + Super(NiceMonster).Tick(Delta); + if ( Role == ROLE_Authority ) { + if ( Energy < EnergyMax ) + Energy += EnergyRestoreRate * Delta; + if ( Energy > 150 && NextHealAttemptTime < Level.TimeSeconds ) { + NextHealAttemptTime = Level.TimeSeconds + 3.0; + TryHealing(); + } + } +} +function TryHealing() +{ + local Controller C; + local NiceMonsterController MyMC; + local NiceZombieTeslaHusk BestPatient; local bool bAnyHusks; + MyMC = NiceMonsterController(Controller); + if ( MyMC == none ) + return; // just in case + if ( MyMC.Enemy != none && VSizeSquared(MyMC.Enemy.Location - Location) < MaxPrimaryBeamRangeSquared ) + return; // no healing when need to fight + for ( C=Level.ControllerList; C!=none; C=C.NextController ) { + if ( NiceZombieTeslaHusk(C.Pawn) != none && C.Pawn != self && C.Pawn.Health > 0 ) { + bAnyHusks = true; + if ( (BestPatient == none || BestPatient.Health > C.Pawn.Health) + && VSizeSquared(C.Pawn.Location - Location) < MaxPrimaryBeamRangeSquared ) + BestPatient = NiceZombieTeslaHusk(C.Pawn); + } + } + if ( !bAnyHusks ) + NextHealAttemptTime = Level.TimeSeconds + 10.0; // no other husks on the map - so no need to do searching so often + else if ( BestPatient != none ) { + if ( BestPatient.Health < BestPatient.HealthMax * 0.90 ) { + MyMC.Target = BestPatient; + MyMC.ChangeEnemy(BestPatient, MyMC.CanSee(BestPatient)); + MyMC.GotoState('RangedAttack'); + LastHealTime = Level.TimeSeconds + 3.0; // do not heal until beam is spawned + GotoState('Healing'); } + else + NextHealAttemptTime = Level.TimeSeconds + 1.0; // if there are other Tesla Husks nearby, then check their health each second + } + else + NextHealAttemptTime = Level.TimeSeconds + 3.0; // there are other Tesla Husks on the map, but not too close +} +function Died(Controller Killer, class damageType, vector HitLocation) +{ + if ( PrimaryBeam != none ) + PrimaryBeam.Instigator = none; + if ( DecapitationSparks != none ) + DecapitationSparks.Destroy(); + AmbientSound = none; + super.Died(Killer, damageType, HitLocation); +} +simulated event PlayDying(class DamageType, vector HitLoc) +{ + super.PlayDying(DamageType, HitLoc); + if ( DecapitationSparks != none ) + DecapitationSparks.Destroy(); AmbientSound = none; +} +// instead of roaming around, activate self-destruct +function RemoveHead() +{ + Intelligence = BRAINS_Retarded; // Headless dumbasses! + bDecapitated = true; + DECAP = true; + DecapTime = Level.TimeSeconds; + bShotAnim = true; + SetAnimAction('KnockDown'); + Acceleration = vect(0, 0, 0); + Velocity.X = 0; + Velocity.Y = 0; + Controller.GoToState('WaitForAnim'); + NiceMonsterController(Controller).bUseFreezeHack = True; + SetGroundSpeed(0); + AirSpeed = 0; + WaterSpeed = 0; + // No more raspy breathin'...cuz he has no throat or mouth :S + AmbientSound = MiscSound; + // super.TakeDamage(LastDamageAmount) isn't called yet, so set self-destruct sequence only if + // zed can survive the hit + if( Health > LastDamageAmount && Energy > 50 ) { + SpawnDecapitationEffects(); + BleedOutTime = Level.TimeSeconds + BleedOutDuration; + GotoState('SelfDestruct'); + } + + PlaySound(DecapitationSound, SLOT_Misc,1.30,true,525); +} +simulated function Destroyed() +{ + if ( PrimaryBeam != none ) + PrimaryBeam.Destroy(); + if ( DecapitationSparks != none ) + DecapitationSparks.Destroy(); + super.Destroyed(); +} +simulated function SpawnDecapitationEffects() +{ + if (Level.NetMode == NM_DedicatedServer) + return; + DecapitationSparks = spawn(class'ZedBeamSparks', self,, GetBoneCoords(HeadBone).Origin, Rotation); +} +simulated function int DoAnimAction( name AnimName ) +{ + // faked animation with forces to play the end of shoot animation (where Huks is putting his gun down) + if ( AnimName == 'ShootBurnsEnd' ) { + PlayAnim('ShootBurns'); + SetAnimFrame(120, 0, 1); + return 0; + } + return super.DoAnimAction(AnimName); +} +function float RangedAttackTime() +{ + return 5.0; +} +// Overridden so that anims don't get interrupted on the server if one is already playing +function bool IsHeadShot(vector loc, vector ray, float AdditionalScale) +{ + local coords C; + local vector HeadLoc, B, M, diff; + local float t, DotMM, Distance; + local int look; + local bool bUseAltHeadShotLocation; + local bool bWasAnimating; + if (HeadBone == '') + return False; + // If we are a dedicated server estimate what animation is most likely playing on the client + if (Level.NetMode == NM_DedicatedServer) + { + if (Physics == PHYS_Falling) + PlayAnim(AirAnims[0], 1.0, 0.0); + else if (Physics == PHYS_Walking) + { + // Only play the idle anim if we're not already doing a different anim. + // This prevents anims getting interrupted on the server and borking things up - Ramm + + if( !IsAnimating(0) && !IsAnimating(1) ) + { + if (bIsCrouched) + { + PlayAnim(IdleCrouchAnim, 1.0, 0.0); + } + else + { + bUseAltHeadShotLocation=true; + } + } + else + { + bWasAnimating = true; + } + + if ( bDoTorsoTwist ) + { + SmoothViewYaw = Rotation.Yaw; + SmoothViewPitch = ViewPitch; + + look = (256 * ViewPitch) & 65535; + if (look > 32768) + look -= 65536; + + SetTwistLook(0, look); + } + } + else if (Physics == PHYS_Swimming) + PlayAnim(SwimAnims[0], 1.0, 0.0); + + if( !bWasAnimating ) + { + SetAnimFrame(0.5); + } + } + if( bUseAltHeadShotLocation ) + { + HeadLoc = Location + (OnlineHeadshotOffset >> Rotation); + AdditionalScale *= OnlineHeadshotScale; + } + else + { + C = GetBoneCoords(HeadBone); + + HeadLoc = C.Origin + (HeadHeight * HeadScale * AdditionalScale * C.XAxis) -5.0*C.XAxis - 2.0*C.YAxis; + } + //ServerHeadLocation = HeadLoc; + // Express snipe trace line in terms of B + tM + B = loc; + M = ray * (2.0 * CollisionHeight + 2.0 * CollisionRadius); + // Find Point-Line Squared Distance + diff = HeadLoc - B; + t = M Dot diff; + if (t > 0) + { + DotMM = M dot M; + if (t < DotMM) + { + t = t / DotMM; + diff = diff - (t * M); + } + else + { + t = 1; + diff -= M; + } + } + else + t = 0; + Distance = Sqrt(diff Dot diff); + return (Distance < (HeadRadius * HeadScale * AdditionalScale)); +} +state Healing +{ + ignores TryHealing; + function BeginState() + { + //log("Entering Healing State @ " $ Level.TimeSeconds, 'TeslaHusk'); + LastHealTime = Level.TimeSeconds + 3.0; // do not heal until beam is spawned + } + function EndState() + { + local name SeqName; + local float AnimFrame, AnimRate; + + //log("Exiting Healing State @ " $ Level.TimeSeconds, 'TeslaHusk'); + NextHealAttemptTime = Level.TimeSeconds + 5.0; + FreePrimaryBeam(); + + // end shooting animation + GetAnimParams(0, SeqName, AnimFrame, AnimRate); + if ( SeqName == 'ShootBurns' && AnimFrame < 120 ) + SetAnimAction('ShootBurnsEnd'); // faked anim + Controller.Enemy = none; + NiceMonsterController(Controller).FindNewEnemy(); + } + function SpawnTwoShots() + { + SpawnPrimaryBeam(); + if ( Controller != none ) + PrimaryBeam.EndActor = Controller.Target; + PrimaryBeam.EffectEndTime = Level.TimeSeconds + 2.5; + LastHealTime = Level.TimeSeconds; // start healing + } + function bool FlipOver() + { + if ( global.FlipOver() ) { + GotoState(''); + return true; + } + return false; + } + function DoStun(optional Pawn instigatedBy, optional Vector hitLocation, optional Vector momentum, optional class damageType, optional float headshotLevel, optional KFPlayerReplicationInfo KFPRI){ + super.DoStun(instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); + GotoState(''); + } + function Tick(float DeltaTime) + { + local NiceZombieTeslaHusk Patient; + local int HealthToAdd; + super.Tick(DeltaTime); + if ( Level.TimeSeconds >= LastHealTime+0.25 ) { + if ( PrimaryBeam == none || Energy <= 0 || Level.TimeSeconds > PrimaryBeam.EffectEndTime ) { + GotoState(''); + return; + } + + NextHealAttemptTime = Level.TimeSeconds + 0.25; + Patient = NiceZombieTeslaHusk(PrimaryBeam.EndActor); + if ( Patient == none || Patient.Health <= 0 || Patient.Health >= Patient.HealthMax ) + GotoState(''); + else { + HealthToAdd = min(Patient.HealthMax*HealRate*(Level.TimeSeconds-LastHealTime), Patient.HealthMax - Patient.Health); + if ( HealthToAdd*HealEnergyDrain > Energy ) + HealthToAdd = Energy / HealEnergyDrain; + Patient.Health += HealthToAdd; + Energy -= HealthToAdd*HealEnergyDrain; + LastHealTime = Level.TimeSeconds; + } + } + }} + +// todo: make custom controller, moving states there +state Shooting +{ + ignores TryHealing; + function BeginState() + { + //log("Entering Shooting State @ " $ Level.TimeSeconds, 'TeslaHusk'); + if ( PrimaryBeam == none ) { + SpawnPrimaryBeam(); + PrimaryBeam.EndActor = Controller.Target; + } + + PrimaryBeam.EffectEndTime = Level.TimeSeconds + 2.5; + BuildChain(); + LastDischargeTime = Level.TimeSeconds; + Discharge(DischargeRate); + } + function EndState() + { + local name SeqName; + local float AnimFrame, AnimRate; + //log("Exiting Shooting State @ " $ Level.TimeSeconds, 'TeslaHusk'); + + FreePrimaryBeam(); + // end shooting animation + GetAnimParams(0, SeqName, AnimFrame, AnimRate); + if ( SeqName == 'ShootBurns' && AnimFrame < 120 ) + SetAnimAction('ShootBurnsEnd'); // faked anim + } + function BuildChain() + { + local int ChainsRemaining; + ChainRebuildTimer = default.ChainRebuildTimer; + ChainsRemaining = MaxChainActors; + SpawnChildBeams(PrimaryBeam, 1, ChainsRemaining); } + function SpawnChildBeams(TeslaBeam MasterBeam, byte level, out int ChainsRemaining) + { + local Pawn P; + local TeslaBeam ChildBeam; + local int i; + if ( MasterBeam == none || level > MaxChainLevel || ChainsRemaining <= 0 ) + return; + for ( i=0; i 0; ++i ) { + SpawnChildBeams(MasterBeam.ChildBeams[i], level+1, ChainsRemaining); + } + } + function ChainDamage(TeslaBeam Beam, float Damage, byte ChainLevel) + { + local int i; + local float DmgMult; + if ( Beam == none || Beam.EndActor == none || Energy < 0 || Controller == none) + return; + Damage = clamp(Damage, 1, Energy); + // look if actor already received a damage during this discharge + for ( i=0; i= Damage ) + return; // Victim already received enough damage + else { + Damage -= DischargedActors[i].Damage; + DischargedActors[i].Damage += Damage; + break; + } + } + } + if ( i == DischargedActors.length ) { + // new victim + DischargedActors.insert(i, 1); + DischargedActors[i].Victim = Beam.EndActor; + DischargedActors[i].Damage = Damage; + } + // deal higher damage to monsters, but do not drain energy quicker + DmgMult = 1.0; + if ( NiceMonster(Beam.EndActor) != none ) { + if ( ZombieFleshpound(Beam.EndActor) != none ) + DmgMult = 20.0; + else + DmgMult = 3.0; + } + // if pawn is already chained, then damage him until he gets out of the primary range + Beam.SetBeamLocation(); // ensure that StartEffect and EndEffect are set + if ( VSizeSquared(Beam.EndEffect - Beam.StartEffect) <= MaxPrimaryBeamRangeSquared * ChainedBeamRangeExtension + && FastTrace(Beam.EndEffect, Beam.StartEffect) ) + { + Beam.EndActor.TakeDamage(Damage*DmgMult, self, Beam.EndActor.Location, Beam.SetBeamRotation(), MyDamageType); + if(Controller == none) + return; + Energy -= Damage; + Damage *= ChainDamageMult; + ChainLevel++; + if ( Damage > 0 && ChainLevel <= MaxChainLevel) { + for ( i=0; i 0; ++i ) + ChainDamage(Beam.ChildBeams[i], Damage, ChainLevel); + } + } + else { + Beam.Instigator = none; // delete beam + } + } + function Discharge(float DeltaTime) + { + LastDischargeTime = Level.TimeSeconds; + DischargedActors.length = 0; + ChainDamage(PrimaryBeam, DischargeDamage*DeltaTime, 0); + if (Energy <= 0) + GotoState(''); // out of energy - stop shooting + } + function bool FlipOver() + { + if ( global.FlipOver() ) { + GotoState(''); + return true; + } + return false; + } + function DoStun(optional Pawn instigatedBy, optional Vector hitLocation, optional Vector momentum, optional class damageType, optional float headshotLevel, optional KFPlayerReplicationInfo KFPRI){ + super.DoStun(instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); + GotoState(''); + } + function Tick(float DeltaTime) + { + super.Tick(DeltaTime); + + //log("Shooting.Tick @ " $ Level.TimeSeconds $ ":" @"Energy="$Energy @"PrimaryBeam="$PrimaryBeam, 'TeslaHusk'); + ChainRebuildTimer -= DeltaTime; + if ( Energy <= 0 || PrimaryBeam == none || PrimaryBeam.EndActor == none || Level.TimeSeconds > PrimaryBeam.EffectEndTime ) { + GotoState(''); + } + else if ( LastDischargeTime + DischargeRate <= Level.TimeSeconds ) { + if ( ChainRebuildTimer <= 0 ) + BuildChain(); + Discharge(Level.TimeSeconds - LastDischargeTime); // damage chained actors + } + } +} +state SelfDestruct +{ + ignores PlayDirectionalHit, RangedAttack, MeleeDamageTarget; + function BeginState() + { + local NiceTeslaEMPNade MyNade; + MyNade = spawn(class'NiceTeslaEMPNade', self,, Location); + if ( MyNade != none ) { + AttachToBone(MyNade, RootBone); + MyNade.SetTimer(3.0, false); + MyNade.bTimerSet = true; + MyNade.Damage = max(20, Energy * 0.45); + } + else { + // wtf? + Died(LastDamagedBy.Controller,class'DamTypeBleedOut',Location); + } + } + function bool CheckMiniFlinch(int flinchScore, Pawn instigatedBy, Vector hitLocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI){ + return false; + } + function bool IsStunPossible(){ + return false; + } + function bool CheckStun(int stunScore, Pawn instigatedBy, Vector hitLocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI){ + return false; + } + function bool CanGetOutOfWay(){ + return false; + } +} +static simulated function PreCacheMaterials(LevelInfo myLevel) +{ + myLevel.AddPrecacheMaterial(Shader'ScrnZedPack_T.TeslaHusk.TeslaHusk_SHADER'); + myLevel.AddPrecacheMaterial(FinalBlend'KFZED_FX_T.Energy.ZED_FX_Beam_FB'); +} +defaultproperties +{ + BeamClass=Class'ScrnZedPack.TeslaBeam' + MaxPrimaryBeamRange=300.000000 + MaxChildBeamRange=150.000000 + ChainedBeamRangeExtension=1.200000 + Energy=200.000000 + EnergyMax=200.000000 + EnergyRestoreRate=20.000000 + DischargeDamage=20.000000 + ChainDamageMult=0.700000 + MyDamageType=Class'ScrnZedPack.DamTypeTesla' + MaxChainLevel=5 + MaxChainActors=20 + DischargeRate=0.250000 + HealRate=0.250000 + HealEnergyDrain=0.200000 + ProjectileFireInterval=5.000000 + BurnDamageScale=1.000000 + mind=0.000000 + bFireImmune=False + MoanVoice=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Talk' + BleedOutDuration=5.000000 + MiscSound=Sound'KF_FY_ZEDV2SND.foley.WEP_ZEDV2_Projectile_Loop' + DecapitationSound=Sound'KF_FY_ZEDV2SND.Fire.WEP_ZEDV2_Secondary_Explode' + MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Bloat.Bloat_HitPlayer' + JumpSound=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Jump' + ColHeight=30.000000 + ProjectileBloodSplatClass=None + DetachedArmClass=Class'ScrnZedPack.SeveredArmTeslaHusk' + DetachedLegClass=Class'ScrnZedPack.SeveredLegTeslaHusk' + DetachedHeadClass=Class'ScrnZedPack.SeveredHeadTeslaHusk' + DetachedSpecialArmClass=Class'ScrnZedPack.SeveredGunTeslaHusk' + OnlineHeadshotOffset=(X=22.000000,Z=50.000000) + HitSound(0)=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Pain' + DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Death' + ChallengeSound(0)=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Challenge' + ChallengeSound(1)=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Challenge' + ChallengeSound(2)=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Challenge' + ChallengeSound(3)=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Challenge' + ScoringValue=25 + GroundSpeed=100.000000 + WaterSpeed=80.000000 + HealthMax=800.000000 + Health=800 + HeadHeight=-7.500000 + MenuName="Tesla Husk" + AmbientSound=Sound'KF_BaseHusk_CIRCUS.Husk_IdleLoop' + Mesh=SkeletalMesh'ScrnZedPack_A.TeslaHuskMesh' + Skins(0)=Shader'ScrnZedPack_T.TeslaHusk.TeslaHusk_SHADER' +} diff --git a/sources/Zeds/NiceAvoidMarker.uc b/sources/Zeds/NiceAvoidMarker.uc index 701dfe6..ea0ab8e 100644 --- a/sources/Zeds/NiceAvoidMarker.uc +++ b/sources/Zeds/NiceAvoidMarker.uc @@ -1,10 +1,11 @@ -class NiceAvoidMarker extends AvoidMarker; -function bool RelevantTo(Pawn P){ - local NiceZombieFleshpound niceFP; - niceFP = NiceZombieFleshpound(P); - if(niceFP != none && niceFP.IsInState('RageCharging')) return false; - return super.RelevantTo(P); -} -defaultproperties -{ -} +class NiceAvoidMarker extends AvoidMarker; +function bool RelevantTo(Pawn P){ + local NiceZombieFleshpound niceFP; + niceFP = NiceZombieFleshpound(P); + if(niceFP != none && niceFP.IsInState('RageCharging')) + return false; + return super.RelevantTo(P); +} +defaultproperties +{ +} diff --git a/sources/Zeds/NiceAvoidMarkerExplosive.uc b/sources/Zeds/NiceAvoidMarkerExplosive.uc index 49cb274..83a80aa 100644 --- a/sources/Zeds/NiceAvoidMarkerExplosive.uc +++ b/sources/Zeds/NiceAvoidMarkerExplosive.uc @@ -1,10 +1,11 @@ -class NiceAvoidMarkerExplosive extends NiceAvoidMarker; -function bool RelevantTo(Pawn P){ - local NiceMonster niceZed; - niceZed = NiceMonster(P); - if(niceZed != none && niceZed.default.Health >= 1000 && NiceZombieFleshpound(P) == none) return false; - return super.RelevantTo(P); -} -defaultproperties -{ -} +class NiceAvoidMarkerExplosive extends NiceAvoidMarker; +function bool RelevantTo(Pawn P){ + local NiceMonster niceZed; + niceZed = NiceMonster(P); + if(niceZed != none && niceZed.default.Health >= 1000 && NiceZombieFleshpound(P) == none) + return false; + return super.RelevantTo(P); +} +defaultproperties +{ +} diff --git a/sources/Zeds/NiceAvoidMarkerFP.uc b/sources/Zeds/NiceAvoidMarkerFP.uc index b5ee85b..9a9e459 100644 --- a/sources/Zeds/NiceAvoidMarkerFP.uc +++ b/sources/Zeds/NiceAvoidMarkerFP.uc @@ -1,29 +1,38 @@ -class NiceAvoidMarkerFP extends NiceAvoidMarker; -var NiceZombieFleshpound niceFP; -state BigMeanAndScary -{ -Begin: - StartleBots(); - Sleep(1.0); - GoTo('Begin'); -} -function InitFor(NiceMonster V){ - if(V != none){ niceFP = NiceZombieFleshpound(V); SetCollisionSize(niceFP.CollisionRadius * 3, niceFP.CollisionHeight + CollisionHeight); SetBase(niceFP); GoToState('BigMeanAndScary'); - } -} -function Touch( actor Other ){ - if((Pawn(Other) != none) && KFMonsterController(Pawn(Other).Controller) != none && RelevantTo(Pawn(Other))) KFMonsterController(Pawn(Other).Controller).AvoidThisMonster(niceFP); -} -function bool RelevantTo(Pawn P){ - local NiceMonster niceZed; - niceZed = NiceMonster(P); - if(niceZed != none && niceZed.default.Health >= 1500) return false; - return (niceFP != none && VSizeSquared(niceFP.Velocity) >= 75 && Super.RelevantTo(P) && niceFP.Velocity dot (P.Location - niceFP.Location) > 0 ); -} -function StartleBots(){ - local KFMonster P; - if(niceFP != none) ForEach CollidingActors(class'KFMonster', P, CollisionRadius) if(RelevantTo(P)) KFMonsterController(P.Controller).AvoidThisMonster(niceFP); -} -defaultproperties -{ -} +class NiceAvoidMarkerFP extends NiceAvoidMarker; +var NiceZombieFleshpound niceFP; +state BigMeanAndScary +{ +Begin: + StartleBots(); + Sleep(1.0); + GoTo('Begin'); +} +function InitFor(NiceMonster V){ + if(V != none){ + niceFP = NiceZombieFleshpound(V); + SetCollisionSize(niceFP.CollisionRadius * 3, niceFP.CollisionHeight + CollisionHeight); + SetBase(niceFP); + GoToState('BigMeanAndScary'); + } +} +function Touch( actor Other ){ + if((Pawn(Other) != none) && KFMonsterController(Pawn(Other).Controller) != none && RelevantTo(Pawn(Other))) + KFMonsterController(Pawn(Other).Controller).AvoidThisMonster(niceFP); +} +function bool RelevantTo(Pawn P){ + local NiceMonster niceZed; + niceZed = NiceMonster(P); + if(niceZed != none && niceZed.default.Health >= 1500) + return false; + return (niceFP != none && VSizeSquared(niceFP.Velocity) >= 75 && Super.RelevantTo(P) && niceFP.Velocity dot (P.Location - niceFP.Location) > 0 ); +} +function StartleBots(){ + local KFMonster P; + if(niceFP != none) + ForEach CollidingActors(class'KFMonster', P, CollisionRadius) + if(RelevantTo(P)) + KFMonsterController(P.Controller).AvoidThisMonster(niceFP); +} +defaultproperties +{ +} diff --git a/sources/Zeds/NiceAvoidMarkerFlame.uc b/sources/Zeds/NiceAvoidMarkerFlame.uc index d0ef40a..b979b00 100644 --- a/sources/Zeds/NiceAvoidMarkerFlame.uc +++ b/sources/Zeds/NiceAvoidMarkerFlame.uc @@ -1,10 +1,11 @@ -class NiceAvoidMarkerFlame extends NiceAvoidMarker; -function bool RelevantTo(Pawn P){ - local NiceMonster niceZed; - niceZed = NiceMonster(P); - if(niceZed != none && niceZed.bFireImmune) return false; - return super.RelevantTo(P); -} -defaultproperties -{ -} +class NiceAvoidMarkerFlame extends NiceAvoidMarker; +function bool RelevantTo(Pawn P){ + local NiceMonster niceZed; + niceZed = NiceMonster(P); + if(niceZed != none && niceZed.bFireImmune) + return false; + return super.RelevantTo(P); +} +defaultproperties +{ +} diff --git a/sources/Zeds/NiceMonsterController.uc b/sources/Zeds/NiceMonsterController.uc index d01623f..594a5bd 100644 --- a/sources/Zeds/NiceMonsterController.uc +++ b/sources/Zeds/NiceMonsterController.uc @@ -1,225 +1,461 @@ -//============================================================================== -// NicePack / NiceMonsterController -//============================================================================== -// New base class for zeds that makes it easier to implement various changes -// and bug fixes. -// Functionality: -// - Removed threat assessment functionality in favor of vanilla's -// distance-based behavior -// - Doesn't support 'bNoAutoHuntEnemies' flag from 'KFMonster' -//============================================================================== -// 'Nice pack' source -// Do whatever the fuck you want with it -// Author: dkanus -// E-mail: dkanus@gmail.com -//============================================================================== -class NiceMonsterController extends KFMonsterController; -// Just reset threat assesment flag, since it's not used in NicePack -function PostBeginPlay(){ - super.PostBeginPlay(); - bUseThreatAssessment = true; -} -event bool NotifyBump(Actor other){ - local Pawn otherPawn; - Disable('NotifyBump'); - otherPawn = Pawn(other); - if(otherPawn == none || otherPawn.controller == none) return false; - if(enemy == otherPawn) return false; - if(SetEnemy(otherPawn)){ WhatToDoNext(4); return false; - } - if(enemy == otherPawn) return false; - if(!AdjustAround(otherPawn)) CancelCampFor(otherPawn.controller); - return false; -} -state Startled{ - ignores EnemyNotVisible,SeePlayer,HearNoise; - function Startle(Actor Feared){ goalString = "STARTLED!"; startleActor = feared; BeginState(); - } - function BeginState(){ if(startleActor == none){ GotoState(''); return; } pawn.acceleration = pawn.location - startleActor.location; pawn.acceleration.Z = 0; pawn.bIsWalking = false; pawn.bWantsToCrouch = false; if(pawn.acceleration == vect(0,0,0)) pawn.acceleration = VRand(); pawn.acceleration = pawn.accelRate * Normal(pawn.acceleration); - } -Begin: - if( NiceHumanPawn(StartleActor) == none || KFGameType(Level.Game) == none || KFGameType(Level.Game).bZEDTimeActive ){ Sleep(0.5); WhatToDoNext(11); - } - else{ Sleep(0.25); Goto('Begin'); - } -} -function bool IsMonsterDecapitated(){ - local NiceMonster niceZed; - niceZed = NiceMonster(self.pawn); - if(niceZed == none) return false; - return niceZed.bDecapitated || niceZed.HeadHealth <= 0; -} -function bool IsMonsterMad(){ - local NiceMonster niceZed; - niceZed = NiceMonster(self.pawn); - if(niceZed == none) return false; - return niceZed.madnessCountDown > 0.0; -} -function bool FindNewEnemy(){ - local bool bSeeBest; - local bool bDecapitated, bAttacksAnything; - local float bestScore, newScore; - local Pawn bestEnemy; - local Controller ctrlIter; - if(pawn == none) return false; - bDecapitated = IsMonsterDecapitated(); - bAttacksAnything = bDecapitated || IsMonsterMad(); - for(ctrlIter = Level.controllerList; ctrlIter != none; ctrlIter = ctrlIter.nextController){ if(ctrlIter == none || ctrlIter.pawn == none) continue; if(ctrlIter.pawn.health <= 0 || ctrlIter.pawn == self.pawn) continue; if(ctrlIter.bPendingDelete || ctrlIter.pawn.bPendingDelete) continue; // Shouldn't normally attack healthy zeds if( !bAttacksAnything && NiceMonster(ctrlIter.pawn) != none && ctrlIter.pawn.health > 15) continue; // Can only stand up to fleshpound if we're decapitated if(NiceZombieFleshpound(ctrlIter.pawn) != none && !bDecapitated) continue; - // NicePack doesn't use threat assesment, so just find closest target newScore = VSizeSquared(ctrlIter.pawn.Location - pawn.Location); if(bestEnemy == none || newScore < bestScore){ bestEnemy = ctrlIter.pawn; bestScore = newScore; bSeeBest = CanSee(bestEnemy); } - } - if(bestEnemy == enemy) return false; - if(bestEnemy != none){ ChangeEnemy(bestEnemy, bSeeBest); return true; - } - return false; -} -function UpdatePathFindState(){ - if(pathFindState == 0){ initialPathGoal = FindRandomDest(); pathFindState = 1; - } - if(pathFindState == 1){ if(initialPathGoal == none) pathFindState = 2; else if(ActorReachable(initialPathGoal)){ MoveTarget = initialPathGoal; pathFindState = 2; return; } else if(FindBestPathToward(initialPathGoal, true, true)) return; else pathFindState = 2; - } -} -function PickRandomDestination(){ - local bool bCloseToEnemy; - local bool bCanTrackEnemy; - local NiceMonster niceZed; - niceZed = NiceMonster(pawn); - if(niceZed == none) return; - if(enemy != none) bCloseToEnemy = VSizeSquared(niceZed.Location - enemy.Location) < 40000; - // Can we track our enemy? - if(enemy != none && niceZed.headHealth > 0 && FRand() < 0.5){ bCanTrackEnemy = MoveTarget == enemy; if(!ActorReachable(enemy)) bCanTrackEnemy = false; if(niceZed.default.health < 500 && !bCloseToEnemy) bCanTrackEnemy = false; - } - // Choose random location - if(bCanTrackEnemy) destination = enemy.location + VRand() * 50; - else destination = niceZed.location + VRand() * 200; -} -state ZombieHunt{ - function BeginState(){ local float zDif; - if(pawn.collisionRadius > 27 || pawn.collisionHeight > 46){ zDif = Pawn.collisionHeight - 44; Pawn.SetCollisionSize(24, 44); Pawn.MoveSmooth(vect(0,0,-1) * zDif); } - } - function EndState(){ local float zDif; local bool bCollisionSizeChanged; - bCollisionSizeChanged = pawn.collisionRadius != pawn.default.collisionRadius; bCollisionSizeChanged = bCollisionSizeChanged || pawn.collisionHeight != pawn.default.collisionHeight; - if(pawn != none && bCollisionSizeChanged){ zDif = pawn.Default.collisionRadius - 44; pawn.MoveSmooth(vect(0,0,1) * zDif); pawn.SetCollisionSize( pawn.Default.collisionRadius, pawn.Default.collisionHeight); } - } - function Timer(){ if(pawn.Velocity == vect(0,0,0)) GotoState('ZombieRestFormation', 'Moving'); SetCombatTimer(); StopFiring(); - } - function PickDestinationEnemyDied(){ - } - function PickDestination(){ // Change behaviour in case we're 'BRAINS_Retarded' if(KFM.intelligence == BRAINS_Retarded){ // Some of the TWI's code if(FindFreshBody()) return; if(enemy != none && !KFM.bCannibal && enemy.health <= 0){ enemy = none; WhatToDoNext(23); return; } UpdatePathFindState(); if(pawn.JumpZ > 0) pawn.bCanJump = true; // And just pick random location PickRandomDestination(); return; } else super.PickDestination(); - } -} -function NotifyTakeHit( Pawn InstigatedBy, Vector HitLocation, int damage, class damageType, Vector momentum){ - local KFMonster zed; - local bool bZedCanVomit; - if(class(damageType) == none || damage <= 0) return; - foreach VisibleCollidingActors(class'KFMonster', zed, 1000, pawn.location){ bZedCanVomit = zed.IsA('NiceZombieBloatBase'); bZedCanVomit = bZedCanVomit || zed.IsA('NiceZombieSickBase'); if(bZedCanVomit && zed != pawn && KFHumanPawn(instigatedBy) != none){ if(KFMonster(pawn) != none) SetEnemy(zed, true, KFMonster(pawn).HumanBileAggroChance); return; } - } - super.NotifyTakeHit(InstigatedBy,HitLocation, damage, damageType, momentum); -} -state ZombieCharge{ - function SeePlayer(Pawn seen){ if(KFM.intelligence == BRAINS_Human) SetEnemy(Seen); - } - function DamageAttitudeTo(Pawn other, float damage){ if(KFM.intelligence >= BRAINS_Mammal && other!=none && SetEnemy(other)) SetEnemy(other); - } - function HearNoise(float loudness, Actor noiseMaker){ if(KFM.intelligence != BRAINS_Human) return; if(noiseMaker == none && noiseMaker.Instigator == none) return; - if(FastTrace(noiseMaker.location, pawn.location)) SetEnemy(noiseMaker.Instigator); - } - function bool StrafeFromDamage( float damage, class damageType, bool bFindDest){ return false; - } - function bool TryStrafe(vector sideDir){ return false; - } -Begin: - if(pawn.physics == PHYS_Falling){ focus = enemy; destination = enemy.location; WaitForLanding(); - } - if(enemy == none) WhatToDoNext(16); -WaitForAnim: - while(KFM.bShotAnim) Sleep(0.35); - if(!FindBestPathToward(enemy, false, true)) GotoState('TacticalMove'); -Moving: - if(KFM.intelligence == BRAINS_Retarded){ if( KFMonster(pawn).HeadHealth > 0 && moveTarget == enemy && FRand() < 0.5 && ( KFMonster(pawn).default.Health >= 500 || VSize(pawn.location - moveTarget.location) < 200) ) MoveTo(moveTarget.location + VRand() * 50, none); else MoveTo(pawn.location + VRand() * 200, none); - } - else MoveToward(moveTarget, FaceActor(1),, ShouldStrafeTo(moveTarget)); - WhatToDoNext(17); - if (bSoaking) SoakStop("STUCK IN CHARGING!"); -} -state DoorBashing{ -ignores EnemyNotVisible,SeeMonster; - function Timer(){ Disable('NotifyBump'); - } - function AttackDoor(){ target = targetDoor; KFM.Acceleration = vect(0,0,0); KFM.DoorAttack(target); - } - function SeePlayer( Pawn Seen ){ if( KFM.intelligence == BRAINS_Human && ActorReachable(Seen) && SetEnemy(Seen)) WhatToDoNext(23); - } - function DamageAttitudeTo(Pawn Other, float Damage){ if( KFM.intelligence >= BRAINS_Mammal && Other != none && ActorReachable(Other) && SetEnemy(Other)) WhatToDoNext(32); - } - function HearNoise(float Loudness, Actor NoiseMaker){ if( KFM.intelligence == BRAINS_Human && NoiseMaker != none && NoiseMaker.Instigator != none && ActorReachable(NoiseMaker.Instigator) && SetEnemy(NoiseMaker.Instigator)) WhatToDoNext(32); - } - function Tick(float delta){ Global.Tick(delta); - // Don't move while we are bashing a door! moveTarget = none; moveTimer = -1; pawn.acceleration = vect(0,0,0); pawn.groundSpeed = 1; pawn.accelRate = 0; - } - function EndState(){ if(NiceMonster(pawn) != none){ pawn.accelRate = pawn.default.accelRate; pawn.groundSpeed = NiceMonster(pawn).GetOriginalGroundSpeed(); } - } -Begin: - WaitForLanding(); -KeepMoving: - while(KFM.bShotAnim) Sleep(0.25); - while( TargetDoor != none && !TargetDoor.bHidden && TargetDoor.bSealed && !TargetDoor.bZombiesIgnore){ AttackDoor(); while(KFM.bShotAnim) Sleep(0.25); Sleep(0.1); if( KFM.intelligence >= BRAINS_Mammal && Enemy!=none && ActorReachable(Enemy) ) WhatToDoNext(14); - } - WhatToDoNext(152); -Moving: - MoveToward(TargetDoor); - WhatToDoNext(17); - if(bSoaking) SoakStop("STUCK IN CHARGING!"); -} -state Freeze{ - Ignores SeePlayer,HearNoise,Timer,EnemyNotVisible,NotifyBump,Startle; - // Don't do this in this state - function GetOutOfTheWayOfShot(vector ShotDirection, vector ShotOrigin){} - function BeginState(){ bUseFreezeHack = false; - } - function Tick(float delta){ Global.Tick(delta); if(bUseFreezeHack){ moveTarget = none; moveTimer = -1; pawn.acceleration = vect(0,0,0); pawn.groundSpeed = 1; pawn.accelRate = 0; } - } - function EndState(){ if(pawn != none){ pawn.accelRate = pawn.default.AccelRate; pawn.groundSpeed = NiceMonster(pawn).GetOriginalGroundSpeed(); } bUseFreezeHack = false; if(enemy == none) FindNewEnemy(); if(choosingAttackLevel == 0) WhatToDoNext(99); - } -} -state WaitForAnim{ -Ignores SeePlayer,HearNoise,Timer,EnemyNotVisible,NotifyBump,Startle; - // Don't do this in this state - function GetOutOfTheWayOfShot(vector ShotDirection, vector ShotOrigin){} - event AnimEnd(int Channel){ pawn.AnimEnd(Channel); if ( !Monster(pawn).bShotAnim ) WhatToDoNext(99); - } - function BeginState(){ bUseFreezeHack = False; - } - function Tick( float Delta ){ Global.Tick(Delta); if( bUseFreezeHack ) { MoveTarget = none; MoveTimer = -1; pawn.acceleration = vect(0,0,0); pawn.groundSpeed = 1; pawn.accelRate = 0; } - } - function EndState(){ if(NiceMonster(pawn) != none){ pawn.accelRate = pawn.Default.AccelRate; pawn.groundSpeed = NiceMonster(pawn).GetOriginalGroundSpeed(); } bUseFreezeHack = False; - } -Begin: - while(KFM.bShotAnim){ Sleep(0.15); - } - WhatToDoNext(99); -} -function bool SetEnemy( pawn newEnemy, optional bool bHateMonster, optional float MonsterHateChanceOverride){ - local NiceMonster niceZed; - local bool bCanForceFight; - // Can we fight anything? - niceZed = NiceMonster(pawn); - if(niceZed != none) bCanForceFight = KFMonster(pawn).HeadHealth <= 0 || KFMonster(pawn).bDecapitated || newEnemy.Health <= 15; - if(newEnemy != none) bCanForceFight = bCanForceFight && newEnemy.Health > 0 && newEnemy != enemy; - else bCanForceFight = false; - // Do fight if we can - if(bCanForceFight){ ChangeEnemy(newEnemy, true); FightEnemy(false); return true; - } - // Otherwise - do the usual stupid stuff - return super.SetEnemy(newEnemy, bHateMonster, monsterHateChanceOverride); -} -simulated function AddKillAssistant(Controller PC, float damage){ - local bool bIsalreadyAssistant; - local int i; - if(PC == none) return; - for(i = 0;i < KillAssistants.length;i ++) if(PC == KillAssistants[i].PC){ bIsalreadyAssistant = true; KillAssistants[i].damage += damage; break; } - if(!bIsalreadyAssistant){ KillAssistants.Insert(0, 1); KillAssistants[0].PC = PC; KillAssistants[0].damage = damage; - } -} -defaultproperties -{ -} +//============================================================================== +// NicePack / NiceMonsterController +//============================================================================== +// New base class for zeds that makes it easier to implement various changes +// and bug fixes. +// Functionality: +// - Removed threat assessment functionality in favor of vanilla's +// distance-based behavior +// - Doesn't support 'bNoAutoHuntEnemies' flag from 'KFMonster' +//============================================================================== +// 'Nice pack' source +// Do whatever the fuck you want with it +// Author: dkanus +// E-mail: dkanus@gmail.com +//============================================================================== +class NiceMonsterController extends KFMonsterController; +// Just reset threat assesment flag, since it's not used in NicePack +function PostBeginPlay(){ + super.PostBeginPlay(); + bUseThreatAssessment = true; +} +event bool NotifyBump(Actor other){ + local Pawn otherPawn; + Disable('NotifyBump'); + otherPawn = Pawn(other); + if(otherPawn == none || otherPawn.controller == none) return false; + if(enemy == otherPawn) return false; + if(SetEnemy(otherPawn)){ + WhatToDoNext(4); + return false; + } + if(enemy == otherPawn) return false; + if(!AdjustAround(otherPawn)) + CancelCampFor(otherPawn.controller); + return false; +} +state Startled{ + ignores EnemyNotVisible,SeePlayer,HearNoise; + function Startle(Actor Feared){ + goalString = "STARTLED!"; + startleActor = feared; + BeginState(); + } + function BeginState(){ + if(startleActor == none){ + GotoState(''); + return; + } + pawn.acceleration = pawn.location - startleActor.location; + pawn.acceleration.Z = 0; + pawn.bIsWalking = false; + pawn.bWantsToCrouch = false; + if(pawn.acceleration == vect(0,0,0)) + pawn.acceleration = VRand(); + pawn.acceleration = pawn.accelRate * Normal(pawn.acceleration); + } +Begin: + if( NiceHumanPawn(StartleActor) == none + || KFGameType(Level.Game) == none + || KFGameType(Level.Game).bZEDTimeActive ){ + Sleep(0.5); + WhatToDoNext(11); + } + else{ + Sleep(0.25); + Goto('Begin'); + } +} +function bool IsMonsterDecapitated(){ + local NiceMonster niceZed; + niceZed = NiceMonster(self.pawn); + if(niceZed == none) return false; + return niceZed.bDecapitated || niceZed.HeadHealth <= 0; +} +function bool IsMonsterMad(){ + local NiceMonster niceZed; + niceZed = NiceMonster(self.pawn); + if(niceZed == none) return false; + return niceZed.madnessCountDown > 0.0; +} +function bool FindNewEnemy(){ + local bool bSeeBest; + local bool bDecapitated, bAttacksAnything; + local float bestScore, newScore; + local Pawn bestEnemy; + local Controller ctrlIter; + if(pawn == none) return false; + bDecapitated = IsMonsterDecapitated(); + bAttacksAnything = bDecapitated || IsMonsterMad(); + for(ctrlIter = Level.controllerList; + ctrlIter != none; + ctrlIter = ctrlIter.nextController){ + if(ctrlIter == none || ctrlIter.pawn == none) continue; + if(ctrlIter.pawn.health <= 0 || ctrlIter.pawn == self.pawn) continue; + if(ctrlIter.bPendingDelete || ctrlIter.pawn.bPendingDelete) continue; + // Shouldn't normally attack healthy zeds + if( !bAttacksAnything && NiceMonster(ctrlIter.pawn) != none + && ctrlIter.pawn.health > 15) continue; + // Can only stand up to fleshpound if we're decapitated + if(NiceZombieFleshpound(ctrlIter.pawn) != none && !bDecapitated) + continue; + + // NicePack doesn't use threat assesment, so just find closest target + newScore = VSizeSquared(ctrlIter.pawn.Location - pawn.Location); + if(bestEnemy == none || newScore < bestScore){ + bestEnemy = ctrlIter.pawn; + bestScore = newScore; + bSeeBest = CanSee(bestEnemy); + } + } + if(bestEnemy == enemy) return false; + if(bestEnemy != none){ + ChangeEnemy(bestEnemy, bSeeBest); + return true; + } + return false; +} +function UpdatePathFindState(){ + if(pathFindState == 0){ + initialPathGoal = FindRandomDest(); + pathFindState = 1; + } + if(pathFindState == 1){ + if(initialPathGoal == none) + pathFindState = 2; + else if(ActorReachable(initialPathGoal)){ + MoveTarget = initialPathGoal; + pathFindState = 2; + return; + } + else if(FindBestPathToward(initialPathGoal, true, true)) + return; + else + pathFindState = 2; + } +} +function PickRandomDestination(){ + local bool bCloseToEnemy; + local bool bCanTrackEnemy; + local NiceMonster niceZed; + niceZed = NiceMonster(pawn); + if(niceZed == none) return; + if(enemy != none) + bCloseToEnemy = VSizeSquared(niceZed.Location - enemy.Location) < 40000; + // Can we track our enemy? + if(enemy != none && niceZed.headHealth > 0 && FRand() < 0.5){ + bCanTrackEnemy = MoveTarget == enemy; + if(!ActorReachable(enemy)) + bCanTrackEnemy = false; + if(niceZed.default.health < 500 && !bCloseToEnemy) + bCanTrackEnemy = false; + } + // Choose random location + if(bCanTrackEnemy) + destination = enemy.location + VRand() * 50; + else + destination = niceZed.location + VRand() * 200; +} +state ZombieHunt{ + function BeginState(){ + local float zDif; + + if(pawn.collisionRadius > 27 || pawn.collisionHeight > 46){ + zDif = Pawn.collisionHeight - 44; + Pawn.SetCollisionSize(24, 44); + Pawn.MoveSmooth(vect(0,0,-1) * zDif); + } + } + function EndState(){ + local float zDif; + local bool bCollisionSizeChanged; + + bCollisionSizeChanged = + pawn.collisionRadius != pawn.default.collisionRadius; + bCollisionSizeChanged = bCollisionSizeChanged || + pawn.collisionHeight != pawn.default.collisionHeight; + + if(pawn != none && bCollisionSizeChanged){ + zDif = pawn.Default.collisionRadius - 44; + pawn.MoveSmooth(vect(0,0,1) * zDif); + pawn.SetCollisionSize( pawn.Default.collisionRadius, + pawn.Default.collisionHeight); + } + } + function Timer(){ + if(pawn.Velocity == vect(0,0,0)) + GotoState('ZombieRestFormation', 'Moving'); + SetCombatTimer(); + StopFiring(); + } + function PickDestinationEnemyDied(){ + } + function PickDestination(){ + // Change behaviour in case we're 'BRAINS_Retarded' + if(KFM.intelligence == BRAINS_Retarded){ + // Some of the TWI's code + if(FindFreshBody()) return; + if(enemy != none && !KFM.bCannibal && enemy.health <= 0){ + enemy = none; + WhatToDoNext(23); + return; + } + UpdatePathFindState(); + if(pawn.JumpZ > 0) + pawn.bCanJump = true; + // And just pick random location + PickRandomDestination(); + return; + } + else + super.PickDestination(); + } +} +function NotifyTakeHit( Pawn InstigatedBy, + Vector HitLocation, + int damage, + class damageType, + Vector momentum){ + local KFMonster zed; + local bool bZedCanVomit; + if(class(damageType) == none || damage <= 0) return; + foreach VisibleCollidingActors(class'KFMonster', zed, 1000, pawn.location){ + bZedCanVomit = zed.IsA('NiceZombieBloatBase'); + bZedCanVomit = bZedCanVomit || zed.IsA('NiceZombieSickBase'); + if(bZedCanVomit && zed != pawn && KFHumanPawn(instigatedBy) != none){ + if(KFMonster(pawn) != none) + SetEnemy(zed, true, KFMonster(pawn).HumanBileAggroChance); + return; + } + } + super.NotifyTakeHit(InstigatedBy,HitLocation, damage, damageType, momentum); +} +state ZombieCharge{ + function SeePlayer(Pawn seen){ + if(KFM.intelligence == BRAINS_Human) + SetEnemy(Seen); + } + function DamageAttitudeTo(Pawn other, float damage){ + if(KFM.intelligence >= BRAINS_Mammal && other!=none && SetEnemy(other)) + SetEnemy(other); + } + function HearNoise(float loudness, Actor noiseMaker){ + if(KFM.intelligence != BRAINS_Human) return; + if(noiseMaker == none && noiseMaker.Instigator == none) return; + + if(FastTrace(noiseMaker.location, pawn.location)) + SetEnemy(noiseMaker.Instigator); + } + function bool StrafeFromDamage( float damage, + class damageType, + bool bFindDest){ + return false; + } + function bool TryStrafe(vector sideDir){ + return false; + } +Begin: + if(pawn.physics == PHYS_Falling){ + focus = enemy; + destination = enemy.location; + WaitForLanding(); + } + if(enemy == none) + WhatToDoNext(16); +WaitForAnim: + while(KFM.bShotAnim) + Sleep(0.35); + if(!FindBestPathToward(enemy, false, true)) + GotoState('TacticalMove'); +Moving: + if(KFM.intelligence == BRAINS_Retarded){ + if( KFMonster(pawn).HeadHealth > 0 && moveTarget == enemy + && FRand() < 0.5 + && ( KFMonster(pawn).default.Health >= 500 + || VSize(pawn.location - moveTarget.location) < 200) + ) + MoveTo(moveTarget.location + VRand() * 50, none); + else + MoveTo(pawn.location + VRand() * 200, none); + } + else + MoveToward(moveTarget, FaceActor(1),, ShouldStrafeTo(moveTarget)); + WhatToDoNext(17); + if (bSoaking) + SoakStop("STUCK IN CHARGING!"); +} +state DoorBashing{ +ignores EnemyNotVisible,SeeMonster; + function Timer(){ + Disable('NotifyBump'); + } + function AttackDoor(){ + target = targetDoor; + KFM.Acceleration = vect(0,0,0); + KFM.DoorAttack(target); + } + function SeePlayer( Pawn Seen ){ + if( KFM.intelligence == BRAINS_Human + && ActorReachable(Seen) && SetEnemy(Seen)) + WhatToDoNext(23); + } + function DamageAttitudeTo(Pawn Other, float Damage){ + if( KFM.intelligence >= BRAINS_Mammal && Other != none + && ActorReachable(Other) && SetEnemy(Other)) + WhatToDoNext(32); + } + function HearNoise(float Loudness, Actor NoiseMaker){ + if( KFM.intelligence == BRAINS_Human && NoiseMaker != none + && NoiseMaker.Instigator != none + && ActorReachable(NoiseMaker.Instigator) + && SetEnemy(NoiseMaker.Instigator)) + WhatToDoNext(32); + } + function Tick(float delta){ + Global.Tick(delta); + + // Don't move while we are bashing a door! + moveTarget = none; + moveTimer = -1; + pawn.acceleration = vect(0,0,0); + pawn.groundSpeed = 1; + pawn.accelRate = 0; + } + function EndState(){ + if(NiceMonster(pawn) != none){ + pawn.accelRate = pawn.default.accelRate; + pawn.groundSpeed = NiceMonster(pawn).GetOriginalGroundSpeed(); + } + } +Begin: + WaitForLanding(); +KeepMoving: + while(KFM.bShotAnim) + Sleep(0.25); + while( TargetDoor != none && !TargetDoor.bHidden && TargetDoor.bSealed + && !TargetDoor.bZombiesIgnore){ + AttackDoor(); + while(KFM.bShotAnim) + Sleep(0.25); + Sleep(0.1); + if( KFM.intelligence >= BRAINS_Mammal && Enemy!=none + && ActorReachable(Enemy) ) + WhatToDoNext(14); + } + WhatToDoNext(152); +Moving: + MoveToward(TargetDoor); + WhatToDoNext(17); + if(bSoaking) + SoakStop("STUCK IN CHARGING!"); +} +state Freeze{ + Ignores SeePlayer,HearNoise,Timer,EnemyNotVisible,NotifyBump,Startle; + // Don't do this in this state + function GetOutOfTheWayOfShot(vector ShotDirection, vector ShotOrigin){} + function BeginState(){ + bUseFreezeHack = false; + } + function Tick(float delta){ + Global.Tick(delta); + if(bUseFreezeHack){ + moveTarget = none; + moveTimer = -1; + pawn.acceleration = vect(0,0,0); + pawn.groundSpeed = 1; + pawn.accelRate = 0; + } + } + function EndState(){ + if(pawn != none){ + pawn.accelRate = pawn.default.AccelRate; + pawn.groundSpeed = NiceMonster(pawn).GetOriginalGroundSpeed(); + } + bUseFreezeHack = false; + if(enemy == none) + FindNewEnemy(); + if(choosingAttackLevel == 0) + WhatToDoNext(99); + } +} +state WaitForAnim{ +Ignores SeePlayer,HearNoise,Timer,EnemyNotVisible,NotifyBump,Startle; + // Don't do this in this state + function GetOutOfTheWayOfShot(vector ShotDirection, vector ShotOrigin){} + event AnimEnd(int Channel){ + pawn.AnimEnd(Channel); + if ( !Monster(pawn).bShotAnim ) + WhatToDoNext(99); + } + function BeginState(){ + bUseFreezeHack = False; + } + function Tick( float Delta ){ + Global.Tick(Delta); + if( bUseFreezeHack ) + { + MoveTarget = none; + MoveTimer = -1; + pawn.acceleration = vect(0,0,0); + pawn.groundSpeed = 1; + pawn.accelRate = 0; + } + } + function EndState(){ + if(NiceMonster(pawn) != none){ + pawn.accelRate = pawn.Default.AccelRate; + pawn.groundSpeed = NiceMonster(pawn).GetOriginalGroundSpeed(); + } + bUseFreezeHack = False; + } +Begin: + while(KFM.bShotAnim){ + Sleep(0.15); + } + WhatToDoNext(99); +} +function bool SetEnemy( pawn newEnemy, + optional bool bHateMonster, + optional float MonsterHateChanceOverride){ + local NiceMonster niceZed; + local bool bCanForceFight; + // Can we fight anything? + niceZed = NiceMonster(pawn); + if(niceZed != none) + bCanForceFight = + KFMonster(pawn).HeadHealth <= 0 + || KFMonster(pawn).bDecapitated + || newEnemy.Health <= 15; + if(newEnemy != none) + bCanForceFight = bCanForceFight + && newEnemy.Health > 0 && newEnemy != enemy; + else + bCanForceFight = false; + // Do fight if we can + if(bCanForceFight){ + ChangeEnemy(newEnemy, true); + FightEnemy(false); + return true; + } + // Otherwise - do the usual stupid stuff + return super.SetEnemy(newEnemy, bHateMonster, monsterHateChanceOverride); +} +simulated function AddKillAssistant(Controller PC, float damage){ + local bool bIsalreadyAssistant; + local int i; + if(PC == none) return; + for(i = 0;i < KillAssistants.length;i ++) + if(PC == KillAssistants[i].PC){ + bIsalreadyAssistant = true; + KillAssistants[i].damage += damage; + break; + } + if(!bIsalreadyAssistant){ + KillAssistants.Insert(0, 1); + KillAssistants[0].PC = PC; + KillAssistants[0].damage = damage; + } +} +defaultproperties +{ +}